X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Focaml%2Fcic_transformations%2FcicAst.ml;h=ca48567863aa8d9c88ebf6eba9aa986db55c1fae;hb=fdd8107cc53f5e862004aa5fcd48593ee5634234;hp=f5aeb5d840d811704dfcae886cf75a76232d3b48;hpb=97790db29ad0dc3d31e61acc69894aa5e6109a9e;p=helm.git diff --git a/helm/ocaml/cic_transformations/cicAst.ml b/helm/ocaml/cic_transformations/cicAst.ml index f5aeb5d84..ca4856786 100644 --- a/helm/ocaml/cic_transformations/cicAst.ml +++ b/helm/ocaml/cic_transformations/cicAst.ml @@ -23,94 +23,72 @@ * http://helm.cs.unibo.it/ *) - (* when an 'ident option is None, the default is to apply the tactic - to the current goal *) +open Printf -type reduction_kind = [ `Reduce | `Simpl | `Whd ] +type location = Lexing.position * Lexing.position -type 'term pattern = - | Pattern of 'term +let pp_location (loc_begin, loc_end) = + let c_begin = loc_begin.Lexing.pos_cnum - loc_begin.Lexing.pos_bol in + let c_end = loc_end.Lexing.pos_cnum - loc_end.Lexing.pos_bol in + if loc_begin.Lexing.pos_lnum = -1 || loc_end.Lexing.pos_lnum = -1 then + sprintf "%d-%d" c_begin c_end + else + sprintf "(%d,%d)-(%d,%d)" loc_begin.Lexing.pos_lnum c_begin + loc_end.Lexing.pos_lnum c_end -type location = int * int +let floc_of_loc (loc_begin, loc_end) = + let floc_begin = + { Lexing.pos_fname = ""; Lexing.pos_lnum = -1; Lexing.pos_bol = -1; + Lexing.pos_cnum = loc_begin } + in + let floc_end = { floc_begin with Lexing.pos_cnum = loc_end } in + (floc_begin, floc_end) -type ('term, 'ident) tactic = - | LocatedTactic of location * ('term, 'ident) tactic +let loc_of_floc = function + | { Lexing.pos_cnum = loc_begin }, { Lexing.pos_cnum = loc_end } -> + (loc_begin, loc_end) - | Absurd - | Apply of 'term - | Assumption - | Change of 'term * 'term * 'ident option (* what, with what, where *) - | Change_pattern of 'term pattern * 'term * 'ident option - (* what, with what, where *) - | Contradiction - | Cut of 'term - | Decompose of 'ident * 'ident list (* which hypothesis, which principles *) - | Discriminate of 'ident - | Elim of 'term * 'term option (* what to elim, which principle to use *) - | ElimType of 'term - | Exact of 'term - | Exists - | Fold of reduction_kind * 'term - | Fourier - | Injection of 'ident - | Intros of int option - | Left - | LetIn of 'term * 'ident (* TODO clashes with term below *) - | Named_intros of 'ident list - | Reduce of reduction_kind * 'term pattern * 'ident option (* what, where *) - | Reflexivity - | Replace of 'term * 'term (* what, with what *) - | Replace_pattern of 'term pattern * 'term - | RewriteLeft of 'term * 'ident option - | RewriteRight of 'term * 'ident option - | Right - | Ring - | Split - | Symmetry - | Transitivity of 'term - -type 'tactic tactical = - | LocatedTactical of location * 'tactic tactical - - | Fail - | For of int * 'tactic tactical - | IdTac - | Repeat of 'tactic tactical - | Seq of 'tactic tactical list (* sequential composition *) - | Tactic of 'tactic - | Then of 'tactic tactical * 'tactic tactical list - | Tries of 'tactic tactical list - (* try a sequence of tacticals until one succeeds, fail otherwise *) - | Try of 'tactic tactical (* try a tactical and mask failures *) +let dummy_floc = floc_of_loc (-1, -1) type binder_kind = [ `Lambda | `Pi | `Exists | `Forall ] type induction_kind = [ `Inductive | `CoInductive ] type sort_kind = [ `Prop | `Set | `Type | `CProp ] type term_attribute = - [ `Loc of location (* source file location *) - | `IdRef of string (* ACic pointer *) + [ `Loc of location + | `IdRef of string ] type term = | AttributedTerm of term_attribute * term | Appl of term list - | Binder of binder_kind * capture_variable * term (* kind, name, body *) - | Case of term * string * term option * (case_pattern * term) list - (* what to match, inductive type, out type, list *) - | LetIn of capture_variable * term * term (* name, body, where *) + | Binder of binder_kind * capture_variable * term + | Case of term * string option * term option * (case_pattern * term) list + | LetIn of capture_variable * term * term | LetRec of induction_kind * (capture_variable * term * int) list * term - (* (name, body, decreasing argument) list, where *) - | Ident of string * subst list (* literal, substitutions *) + | Ident of string * subst list option | Implicit | Meta of int * meta_subst list - | Num of string * int (* literal, instance *) + | Num of string * int | Sort of sort_kind - | Symbol of string * int (* canonical name, instance *) + | Symbol of string * int + + | UserInput + | Uri of string * subst list option -and capture_variable = Cic.name * term option (* name, type *) +and capture_variable = Cic.name * term option and meta_subst = term option and subst = string * term and case_pattern = string * capture_variable list +let pack asts = + List.fold_right + (fun ast acc -> Binder (`Forall, (Cic.Anonymous, Some ast), acc)) + asts (Sort `Type) + +let rec unpack = function + | Binder (`Forall, (Cic.Anonymous, Some ast), Sort `Type) -> [ast] + | Binder (`Forall, (Cic.Anonymous, Some ast), tgt) -> ast :: unpack tgt + | _ -> assert false +