]> matita.cs.unibo.it Git - helm.git/blobdiff - components/tactics/equalityTactics.ml
Huge commit:
[helm.git] / components / tactics / equalityTactics.ml
index 8760f36ef46f998bb61ca9a11e4c466308eb99d5..e81f54076bad55fb34b617bd006a3c319b8fcd36 100644 (file)
@@ -34,9 +34,11 @@ module PESR = ProofEngineStructuralRules
 module P    = PrimitiveTactics 
 module T    = Tacticals 
 module R    = CicReduction
+module S    = CicSubstitution
 module TC   = CicTypeChecker
 module LO   = LibraryObjects
 module DTI  = DoubleTypeInference
+module HEL  = HExtlib
 
 let rec rewrite_tac ~direction ~(pattern: ProofEngineTypes.lazy_pattern) equality =
  let _rewrite_tac ~direction ~pattern:(wanted,hyps_pat,concl_pat) equality status
@@ -52,7 +54,7 @@ let rec rewrite_tac ~direction ~(pattern: ProofEngineTypes.lazy_pattern) equalit
           (rewrite_tac ~direction
            ~pattern:(None,[he],None) equality)
           (rewrite_tac ~direction ~pattern:(None,tl,concl_pat)
-            (CicSubstitution.lift 1 equality))
+            (S.lift 1 equality))
         ) status
    | [_] as hyps_pat when concl_pat <> None ->
        PET.apply_tactic
@@ -60,7 +62,7 @@ let rec rewrite_tac ~direction ~(pattern: ProofEngineTypes.lazy_pattern) equalit
           (rewrite_tac ~direction
            ~pattern:(None,hyps_pat,None) equality)
           (rewrite_tac ~direction ~pattern:(None,[],concl_pat)
-            (CicSubstitution.lift 1 equality))
+            (S.lift 1 equality))
         ) status
    | _ ->
   let arg,dir2,tac,concl_pat,gty =
@@ -71,7 +73,7 @@ let rec rewrite_tac ~direction ~(pattern: ProofEngineTypes.lazy_pattern) equalit
        function
           [] -> assert false
         | Some (Cic.Name s,Cic.Decl ty)::_ when name = s ->
-           Cic.Rel n, CicSubstitution.lift n ty
+           Cic.Rel n, S.lift n ty
         | Some (Cic.Name s,Cic.Def _)::_ -> assert false (*CSC: not implemented yet! But does this make any sense?*)
         | _::tl -> find_hyp (n+1) tl
       in
@@ -103,7 +105,7 @@ let rec rewrite_tac ~direction ~(pattern: ProofEngineTypes.lazy_pattern) equalit
     CicTypeChecker.type_of_aux' metasenv context equality 
       CicUniv.empty_ugraph in 
   let (ty_eq,metasenv',arguments,fresh_meta) =
-   ProofEngineHelpers.saturate_term
+   TermUtil.saturate_term
     (ProofEngineHelpers.new_meta_of_proof proof) metasenv context ty_eq 0 in  
   let equality =
    if List.length arguments = 0 then
@@ -129,15 +131,15 @@ let rec rewrite_tac ~direction ~(pattern: ProofEngineTypes.lazy_pattern) equalit
   let fresh_name = 
     FreshNamesGenerator.mk_fresh_name 
     ~subst:[] metasenv' context C.Anonymous ~typ:ty in
-  let lifted_t1 = CicSubstitution.lift 1 t1x in
-  let lifted_gty = CicSubstitution.lift 1 gty in
+  let lifted_t1 = S.lift 1 t1x in
+  let lifted_gty = S.lift 1 gty in
   let lifted_conjecture =
     metano,(Some (fresh_name,Cic.Decl ty))::context,lifted_gty in
   let lifted_pattern =
     let lifted_concl_pat =
       match concl_pat with
       | None -> None
-      | Some term -> Some (CicSubstitution.lift 1 term) in
+      | Some term -> Some (S.lift 1 term) in
     Some (fun _ m u -> lifted_t1, m, u),[],lifted_concl_pat
   in
   let subst,metasenv',ugraph,_,selected_terms_with_context =
@@ -168,13 +170,13 @@ let rec rewrite_tac ~direction ~(pattern: ProofEngineTypes.lazy_pattern) equalit
   let metasenv',arg,newtyp =
    match arg with
       None ->
-       let gty' = CicSubstitution.subst t2 abstr_gty in
+       let gty' = S.subst t2 abstr_gty in
        let irl =
         CicMkImplicit.identity_relocation_list_for_metavariable context in
        let metasenv' = (fresh_meta,context,gty')::metasenv' in
         metasenv', C.Meta (fresh_meta,irl), Cic.Rel (-1) (* dummy term, never used *)
     | Some arg ->
-       let gty' = CicSubstitution.subst t1 abstr_gty in
+       let gty' = S.subst t1 abstr_gty in
         metasenv',arg,gty'
   in
   let exact_proof = 
@@ -278,9 +280,9 @@ let replace_tac ~(pattern: ProofEngineTypes.lazy_pattern) ~with_what =
    match whats with
       [] -> ProofEngineTypes.apply_tactic T.id_tac status
     | (what,lazy_pattern)::tl ->
-       let what = CicSubstitution.lift n what in
-       let with_what = CicSubstitution.lift n with_what in
-       let ty_of_with_what = CicSubstitution.lift n ty_of_with_what in
+       let what = S.lift n what in
+       let with_what = S.lift n with_what in
+       let ty_of_with_what = S.lift n ty_of_with_what in
        ProofEngineTypes.apply_tactic
          (T.thens
             ~start:(
@@ -374,6 +376,18 @@ let try_tactic ~tactic =
    in
    PET.mk_tactic try_tactic
 
+let rec lift_rewrite_tac ~context ~direction ~pattern equality =
+   let lift_rewrite_tac status =
+      let (proof, goal) = status in
+      let (_, metasenv, _, _) = proof in
+      let _, new_context, _ = CicUtil.lookup_meta goal metasenv in
+      let n = List.length new_context - List.length context in
+      let equality = if n > 0 then S.lift n equality else equality in
+      PET.apply_tactic (rewrite_tac ~direction ~pattern equality) status
+   in
+   PET.mk_tactic lift_rewrite_tac
+
+
 let msg0 = lazy "Subst: not found in context"
 let msg1 = lazy "Subst: not a simple equality"
 let msg2 = lazy "Subst: recursive equation" 
@@ -397,7 +411,8 @@ let subst_tac ~hyp =
         | _ -> raise (PET.Fail msg1)
       in    
       let rewrite pattern =
-         try_tactic ~tactic:(rewrite_tac ~direction ~pattern what)         
+         let tactic = lift_rewrite_tac ~context ~direction ~pattern what in
+        try_tactic ~tactic
       in
       let var = match PEH.get_name context i with
          | Some name -> name
@@ -409,7 +424,7 @@ let subst_tac ~hyp =
             Some (rewrite (None, [(s, hole)], None))
          | _                                 -> None
       in
-      let rew_hips = PEH.list_rev_map_filter (map hyp) context in
+      let rew_hips = HEL.list_rev_map_filter (map hyp) context in
       let rew_concl = rewrite (None, [], Some hole) in
       let clear = PESR.clear ~hyps:[hyp; var] in
       let tactics = List.rev_append (rew_concl :: rew_hips) [clear] in
@@ -427,7 +442,7 @@ let subst_tac =
       let (proof, goal) = status in
       let (_, metasenv, _, _) = proof in
       let _, context, _ = CicUtil.lookup_meta goal metasenv in
-      let tactics = PEH.list_rev_map_filter map context in
+      let tactics = HEL.list_rev_map_filter map context in
       PET.apply_tactic (T.seq ~tactics) status
    in
    PET.mk_tactic subst_tac