From: Andrea Asperti Date: Mon, 30 May 2005 15:57:07 +0000 (+0000) Subject: added intros n X-Git-Tag: PRE_INDEX_1~104 X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=commitdiff_plain;h=b2ebb6109cdb9d2aabc28b32dbfa78288b67b1ac;p=helm.git added intros n --- diff --git a/helm/ocaml/tactics/primitiveTactics.ml b/helm/ocaml/tactics/primitiveTactics.ml index c6dc1bf4a..b0159afe5 100644 --- a/helm/ocaml/tactics/primitiveTactics.ml +++ b/helm/ocaml/tactics/primitiveTactics.ml @@ -37,29 +37,37 @@ exception WrongUriToVariable of string (* and [bo] = Lambda/LetIn [context].(Meta [newmeta]) *) (* So, lambda_abstract is the core of the implementation of *) (* the Intros tactic. *) -let lambda_abstract metasenv context newmeta ty mk_fresh_name = +(* howmany = -1 means Intros, howmany > 0 means Intros n *) +let lambda_abstract ?(howmany=(-1)) metasenv context newmeta ty mk_fresh_name = let module C = Cic in - let rec collect_context context = - function - C.Cast (te,_) -> collect_context context te - | C.Prod (n,s,t) -> - let n' = mk_fresh_name metasenv context n ~typ:s in - let (context',ty,bo) = - collect_context ((Some (n',(C.Decl s)))::context) t + let rec collect_context context howmany ty = + match howmany with + | 0 -> + let irl = + CicMkImplicit.identity_relocation_list_for_metavariable context in - (context',ty,C.Lambda(n',s,bo)) - | C.LetIn (n,s,t) -> - let (context',ty,bo) = - collect_context ((Some (n,(C.Def (s,None))))::context) t - in - (context',ty,C.LetIn(n,s,bo)) - | _ as t -> - let irl = - CicMkImplicit.identity_relocation_list_for_metavariable context - in - context, t, (C.Meta (newmeta,irl)) + context, ty, (C.Meta (newmeta,irl)) + | _ -> + match ty with + C.Cast (te,_) -> collect_context context howmany te + | C.Prod (n,s,t) -> + let n' = mk_fresh_name metasenv context n ~typ:s in + let (context',ty,bo) = + collect_context ((Some (n',(C.Decl s)))::context) (howmany - 1) t + in + (context',ty,C.Lambda(n',s,bo)) + | C.LetIn (n,s,t) -> + let (context',ty,bo) = + collect_context ((Some (n,(C.Def (s,None))))::context) (howmany - 1) t + in + (context',ty,C.LetIn(n,s,bo)) + | _ as t -> + let irl = + CicMkImplicit.identity_relocation_list_for_metavariable context + in + context, t, (C.Meta (newmeta,irl)) in - collect_context context ty + collect_context context howmany ty let eta_expand metasenv context t arg = let module T = CicTypeChecker in @@ -368,7 +376,7 @@ let apply_tac ~term = in mk_tactic (apply_tac ~term) -let intros_tac ?(mk_fresh_name_callback = FreshNamesGenerator.mk_fresh_name ~subst:[]) ()= +let intros_tac ?howmany ?(mk_fresh_name_callback = FreshNamesGenerator.mk_fresh_name ~subst:[]) ()= let intros_tac ?(mk_fresh_name_callback = (FreshNamesGenerator.mk_fresh_name ~subst:[])) () (proof, goal) @@ -379,7 +387,7 @@ let intros_tac ?(mk_fresh_name_callback = FreshNamesGenerator.mk_fresh_name ~sub let metano,context,ty = CicUtil.lookup_meta goal metasenv in let newmeta = new_meta_of_proof ~proof in let (context',ty',bo') = - lambda_abstract metasenv context newmeta ty mk_fresh_name_callback + lambda_abstract ?howmany metasenv context newmeta ty mk_fresh_name_callback in let (newproof, _) = subst_meta_in_proof proof metano bo' [newmeta,context',ty'] diff --git a/helm/ocaml/tactics/primitiveTactics.mli b/helm/ocaml/tactics/primitiveTactics.mli index e06e9cf58..0ab82af2a 100644 --- a/helm/ocaml/tactics/primitiveTactics.mli +++ b/helm/ocaml/tactics/primitiveTactics.mli @@ -39,6 +39,7 @@ val apply_tac: val exact_tac: term: Cic.term -> ProofEngineTypes.tactic val intros_tac: + ?howmany:int -> ?mk_fresh_name_callback:ProofEngineTypes.mk_fresh_name_type -> unit -> ProofEngineTypes.tactic val cut_tac: @@ -55,5 +56,8 @@ val elim_intros_simpl_tac: val elim_intros_tac: term: Cic.term -> ProofEngineTypes.tactic +val elim_intros_tac: + term: Cic.term -> ProofEngineTypes.tactic + val change_tac: what: Cic.term -> with_what: Cic.term -> ProofEngineTypes.tactic