X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Focaml%2Ftactics%2FprimitiveTactics.ml;h=c411340ae829ee94159f7ac90e5d0e76c7882a71;hb=a7ab0ef67114c3152920f03ae1d7bfaaf1fae290;hp=2d741f1d1c317a72cfcf62d9b25be6f4cf88f496;hpb=2697b6b76d4a2449ac9ad6657128c0cc3d90ac65;p=helm.git diff --git a/helm/ocaml/tactics/primitiveTactics.ml b/helm/ocaml/tactics/primitiveTactics.ml index 2d741f1d1..c411340ae 100644 --- a/helm/ocaml/tactics/primitiveTactics.ml +++ b/helm/ocaml/tactics/primitiveTactics.ml @@ -72,7 +72,11 @@ let eta_expand metasenv context t arg = | C.Var (uri,exp_named_subst) -> let exp_named_subst' = aux_exp_named_subst n exp_named_subst in C.Var (uri,exp_named_subst') - | C.Meta _ + | C.Meta (i,l) -> + let l' = + List.map (function None -> None | Some t -> Some (aux n t)) l + in + C.Meta (i, l') | C.Sort _ | C.Implicit _ as t -> t | C.Cast (te,ty) -> C.Cast (aux n te, aux n ty) @@ -256,7 +260,7 @@ let new_fresh_meta,newmetasenvfragment,exp_named_subst',exp_named_subst_diff ;; -let apply_tac ~term (proof, goal) = +let apply_tac_verbose ~term (proof, goal) = (* Assumption: The term "term" must be closed in the current context *) let module T = CicTypeChecker in let module R = CicReduction in @@ -324,13 +328,27 @@ let apply_tac ~term (proof, goal) = Cic.Appl (term'::arguments) ) in - let newmetasenv'' = new_uninstantiatedmetas@old_uninstantiatedmetas in - let (newproof, newmetasenv''') = - let subst_in = CicMetaSubst.apply_subst ((metano,bo')::subst) in - subst_meta_and_metasenv_in_proof - proof metano subst_in newmetasenv'' - in - (newproof, List.map (function (i,_,_) -> i) new_uninstantiatedmetas) + let newmetasenv'' = new_uninstantiatedmetas@old_uninstantiatedmetas in + let subst_in = + (* if we just apply the subtitution, the type is irrelevant: + we may use Implicit, since it will be dropped *) + CicMetaSubst.apply_subst + ((metano,(context, bo', Cic.Implicit None))::subst) + in + let (newproof, newmetasenv''') = + subst_meta_and_metasenv_in_proof + proof metano subst_in newmetasenv'' + in + (subst_in,(newproof, List.map (function (i,_,_) -> i) new_uninstantiatedmetas)) + +let apply_tac ~term status = snd (apply_tac_verbose ~term status) + +let apply_tac_verbose ~term status = + try + apply_tac_verbose ~term status + (* TODO cacciare anche altre eccezioni? *) + with CicUnification.UnificationFailure _ as e -> + raise (Fail (Printexc.to_string e)) (* TODO per implementare i tatticali e' necessario che tutte le tattiche sollevino _solamente_ Fail *) @@ -501,7 +519,7 @@ let elim_tac ~term = C.Appl (eliminator_ref :: make_tl term (args_no - 1)) in let metasenv', term_to_refine' = - CicMkImplicit.expand_implicits metasenv context term_to_refine in + CicMkImplicit.expand_implicits metasenv [] context term_to_refine in let refined_term,_,metasenv'' = CicRefine.type_of_aux' metasenv' context term_to_refine' in