X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Focaml%2Ftactics%2FequalityTactics.ml;h=5a091b7ad895cb196243c9d96c0394e8330fe1f3;hb=a7667815758ad8e3cf2a9921c0ccfb9bcb29bb54;hp=7eae7fb5c0ee402d0761dd39df7fe4050d7ad4ce;hpb=016e4c6fc449b50ac19e73eb952cfb2dc64f4398;p=helm.git diff --git a/helm/ocaml/tactics/equalityTactics.ml b/helm/ocaml/tactics/equalityTactics.ml index 7eae7fb5c..5a091b7ad 100644 --- a/helm/ocaml/tactics/equalityTactics.ml +++ b/helm/ocaml/tactics/equalityTactics.ml @@ -47,7 +47,7 @@ let rewrite_tac ~direction ~pattern equality = CicUniv.empty_ugraph in let (ty_eq,metasenv',arguments,fresh_meta) = ProofEngineHelpers.saturate_term - (ProofEngineHelpers.new_meta_of_proof proof) metasenv context ty_eq in + (ProofEngineHelpers.new_meta_of_proof proof) metasenv context ty_eq 0 in let equality = if List.length arguments = 0 then equality @@ -62,7 +62,7 @@ let rewrite_tac ~direction ~pattern equality = in let eq_ind = C.Const (ind_uri uri,[]) in if_right_to_left (eq_ind, ty, t2, t1) (eq_ind, ty, t1, t2) - | _ -> raise (PET.Fail "Rewrite: argument is not a proof of an equality") in + | _ -> raise (PET.Fail (lazy "Rewrite: argument is not a proof of an equality")) in (* now we always do as if direction was `LeftToRight *) let fresh_name = FreshNamesGenerator.mk_fresh_name @@ -71,7 +71,9 @@ let rewrite_tac ~direction ~pattern equality = let lifted_gty = CicSubstitution.lift 1 gty in let lifted_conjecture = metano,(Some (fresh_name,Cic.Decl ty))::context,lifted_gty in - let lifted_pattern = Some lifted_t1,[],CicSubstitution.lift 1 concl_pat in + let lifted_pattern = + Some (fun _ m u -> lifted_t1, m, u),[],CicSubstitution.lift 1 concl_pat + in let subst,metasenv',ugraph,_,selected_terms_with_context = ProofEngineHelpers.select ~metasenv:metasenv' ~ugraph ~conjecture:lifted_conjecture @@ -103,11 +105,9 @@ let rewrite_tac ~direction ~pattern equality = (PT.exact_tac ~term:exact_proof) ((curi,metasenv',pbo,pty),goal) in assert (List.length goals = 0) ; - let goals = List.map (fun (i,_,_) -> i) metasenv' in let goals = - List.filter - (fun i -> - not (List.exists (fun (j,_,_) -> i=j) metasenv)) goals + ProofEngineHelpers.compare_metasenvs ~oldmetasenv:metasenv + ~newmetasenv:metasenv' in (proof',goals) in @@ -128,25 +128,31 @@ let rewrite_simpl_tac ~direction ~pattern equality = ;; let replace_tac ~pattern ~with_what = -(* let replace_tac ~pattern:(wanted,hyps_pat,concl_pat) ~with_what status = let (proof, goal) = status in let module C = Cic in let module U = UriManager in let module P = PrimitiveTactics in let module T = Tacticals in - let _,metasenv,_,_ = proof in + let uri,metasenv,pbo,pty = proof in let (_,context,ty) as conjecture = CicUtil.lookup_meta goal metasenv in assert (hyps_pat = []); (*CSC: not implemented yet *) let context_len = List.length context in - let _,selected_terms_with_context = - ProofEngineHelpers.select ~metasenv ~conjecture ~pattern in + let subst,metasenv,u,_,selected_terms_with_context = + ProofEngineHelpers.select ~metasenv ~ugraph:CicUniv.empty_ugraph + ~conjecture ~pattern in + let metasenv = CicMetaSubst.apply_subst_metasenv subst metasenv in + let with_what, metasenv, u = with_what context metasenv u in + let with_what = CicMetaSubst.apply_subst subst with_what in + let pbo = CicMetaSubst.apply_subst subst pbo in + let pty = CicMetaSubst.apply_subst subst pty in + let status = (uri,metasenv,pbo,pty),goal in let ty_of_with_what,u = CicTypeChecker.type_of_aux' metasenv context with_what CicUniv.empty_ugraph in let whats = match selected_terms_with_context with - [] -> raise (ProofEngineTypes.Fail "Replace: no term selected") + [] -> raise (ProofEngineTypes.Fail (lazy "Replace: no term selected")) | l -> List.map (fun (context_of_t,t) -> @@ -167,7 +173,7 @@ let replace_tac ~pattern ~with_what = (*CSC: we could implement something stronger by completely changing the semantics of the tactic *) raise (ProofEngineTypes.Fail - "Replace: one of the selected terms is not closed") in + (lazy "Replace: one of the selected terms is not closed")) in let ty_of_t_in_context,u = (* TASSI: FIXME *) CicTypeChecker.type_of_aux' metasenv context t_in_context CicUniv.empty_ugraph in @@ -180,7 +186,7 @@ let replace_tac ~pattern ~with_what = else raise (ProofEngineTypes.Fail - "Replace: one of the selected terms and the term to be replaced with have not convertible types") + (lazy "Replace: one of the selected terms and the term to be replaced with have not convertible types")) ) l in let rec aux n whats status = match whats with @@ -225,7 +231,6 @@ let replace_tac ~pattern ~with_what = aux 0 whats status in ProofEngineTypes.mk_tactic (replace_tac ~pattern ~with_what) -*) assert false ;; @@ -250,7 +255,7 @@ let symmetry_tac = ~term: (C.Const (LibraryObjects.sym_eq_URI uri, []))) (proof,goal) - | _ -> raise (ProofEngineTypes.Fail "Symmetry failed") + | _ -> raise (ProofEngineTypes.Fail (lazy "Symmetry failed")) in ProofEngineTypes.mk_tactic symmetry_tac ;; @@ -275,7 +280,7 @@ let transitivity_tac ~term = [PrimitiveTactics.exact_tac ~term ; T.id_tac ; T.id_tac]) status - | _ -> raise (ProofEngineTypes.Fail "Transitivity failed") + | _ -> raise (ProofEngineTypes.Fail (lazy "Transitivity failed")) in ProofEngineTypes.mk_tactic (transitivity_tac ~term) ;;