]> matita.cs.unibo.it Git - helm.git/commitdiff
1. change_tac moved from PrimitiveTactics to ReductionTactics
authorClaudio Sacerdoti Coen <claudio.sacerdoticoen@unibo.it>
Fri, 1 Jul 2005 09:34:07 +0000 (09:34 +0000)
committerClaudio Sacerdoti Coen <claudio.sacerdoticoen@unibo.it>
Fri, 1 Jul 2005 09:34:07 +0000 (09:34 +0000)
2. fold_tac reimplemented using change_tac

helm/ocaml/tactics/.depend
helm/ocaml/tactics/discriminationTactics.ml
helm/ocaml/tactics/fourierR.ml
helm/ocaml/tactics/primitiveTactics.ml
helm/ocaml/tactics/primitiveTactics.mli
helm/ocaml/tactics/reductionTactics.ml
helm/ocaml/tactics/reductionTactics.mli
helm/ocaml/tactics/tactics.ml

index ed86295329613a2824f8f5bd8636ed570cb742da..b2ccf8e0cd1b6fdb0af721b13a7f397d25356c10 100644 (file)
@@ -15,7 +15,6 @@ ring.cmi: proofEngineTypes.cmi
 fourierR.cmi: proofEngineTypes.cmi 
 fwdSimplTactic.cmi: proofEngineTypes.cmi 
 statefulProofEngine.cmi: proofEngineTypes.cmi 
-tactics.cmi: proofEngineTypes.cmi 
 proofEngineTypes.cmo: proofEngineTypes.cmi 
 proofEngineTypes.cmx: proofEngineTypes.cmi 
 proofEngineReduction.cmo: proofEngineReduction.cmi 
@@ -33,9 +32,9 @@ proofEngineStructuralRules.cmo: proofEngineTypes.cmi \
 proofEngineStructuralRules.cmx: proofEngineTypes.cmx \
     proofEngineStructuralRules.cmi 
 primitiveTactics.cmo: tacticals.cmi reductionTactics.cmi proofEngineTypes.cmi \
-    proofEngineReduction.cmi proofEngineHelpers.cmi primitiveTactics.cmi 
+    proofEngineHelpers.cmi primitiveTactics.cmi 
 primitiveTactics.cmx: tacticals.cmx reductionTactics.cmx proofEngineTypes.cmx \
-    proofEngineReduction.cmx proofEngineHelpers.cmx primitiveTactics.cmi 
+    proofEngineHelpers.cmx primitiveTactics.cmi 
 hashtbl_equiv.cmo: hashtbl_equiv.cmi 
 hashtbl_equiv.cmx: hashtbl_equiv.cmi 
 metadataQuery.cmo: proofEngineTypes.cmi primitiveTactics.cmi \
@@ -67,15 +66,17 @@ negationTactics.cmo: variousTactics.cmi tacticals.cmi proofEngineTypes.cmi \
 negationTactics.cmx: variousTactics.cmx tacticals.cmx proofEngineTypes.cmx \
     primitiveTactics.cmx eliminationTactics.cmx negationTactics.cmi 
 equalityTactics.cmo: tacticals.cmi reductionTactics.cmi proofEngineTypes.cmi \
-    primitiveTactics.cmi introductionTactics.cmi equalityTactics.cmi 
+    proofEngineReduction.cmi proofEngineHelpers.cmi primitiveTactics.cmi \
+    introductionTactics.cmi equalityTactics.cmi 
 equalityTactics.cmx: tacticals.cmx reductionTactics.cmx proofEngineTypes.cmx \
-    primitiveTactics.cmx introductionTactics.cmx equalityTactics.cmi 
-discriminationTactics.cmo: tacticals.cmi proofEngineTypes.cmi \
-    primitiveTactics.cmi introductionTactics.cmi equalityTactics.cmi \
-    eliminationTactics.cmi discriminationTactics.cmi 
-discriminationTactics.cmx: tacticals.cmx proofEngineTypes.cmx \
-    primitiveTactics.cmx introductionTactics.cmx equalityTactics.cmx \
-    eliminationTactics.cmx discriminationTactics.cmi 
+    proofEngineReduction.cmx proofEngineHelpers.cmx primitiveTactics.cmx \
+    introductionTactics.cmx equalityTactics.cmi 
+discriminationTactics.cmo: tacticals.cmi reductionTactics.cmi \
+    proofEngineTypes.cmi primitiveTactics.cmi introductionTactics.cmi \
+    equalityTactics.cmi eliminationTactics.cmi discriminationTactics.cmi 
+discriminationTactics.cmx: tacticals.cmx reductionTactics.cmx \
+    proofEngineTypes.cmx primitiveTactics.cmx introductionTactics.cmx \
+    equalityTactics.cmx eliminationTactics.cmx discriminationTactics.cmi 
 ring.cmo: tacticals.cmi proofEngineTypes.cmi proofEngineStructuralRules.cmi \
     primitiveTactics.cmi equalityTactics.cmi eliminationTactics.cmi ring.cmi 
 ring.cmx: tacticals.cmx proofEngineTypes.cmx proofEngineStructuralRules.cmx \
index ffc6a9e8176889059623bdb1ae259e5227d5f255..901540b6f63685eb69c635ab15fe9a247e3b87b0 100644 (file)
@@ -163,7 +163,7 @@ and injection1_tac ~term ~i =
                              | _ -> raise (ProofEngineTypes.Fail "Injection: goal after cut is not correct")
                            in
                             ProofEngineTypes.apply_tactic 
-                            (P.change_tac
+                            (ReductionTactics.change_tac
                                ~pattern:(ProofEngineTypes.conclusion_pattern (Some new_t1'))
                                (C.Appl [
                                  C.Lambda (
@@ -301,7 +301,7 @@ let discriminate'_tac ~term =
                            ProofEngineTypes.apply_tactic
                             (T.then_
                              ~start:
-                              (P.change_tac 
+                              (ReductionTactics.change_tac 
                                ~pattern:(ProofEngineTypes.conclusion_pattern (Some gty'))
                                (C.Appl [
                                  C.Lambda (
index 3079b327b09ee47179f0468eb259074932810fd1..1c4e40ed3601fa3dbeab5d2cf910ebffca3f93d2 100644 (file)
@@ -1133,7 +1133,7 @@ let rec fourier (s_proof,s_goal)=
              let curi,metasenv,pbo,pty = proof in
              let metano,context,ty = CicUtil.lookup_meta goal metasenv in
              apply_tactic 
-              (PrimitiveTactics.change_tac
+              (ReductionTactics.change_tac
                 ~pattern:(ProofEngineTypes.conclusion_pattern (Some ty))
                 (Cic.Appl [ _not; ineq])) 
               status))
@@ -1179,7 +1179,7 @@ let rec fourier (s_proof,s_goal)=
                      |_ -> assert false)
                    in
                    let r = apply_tactic 
-                   (PrimitiveTactics.change_tac
+                   (ReductionTactics.change_tac
                       ~pattern:(ProofEngineTypes.conclusion_pattern (Some ty))
                       w1) status
                    in
index 8766a044a576ead6f30826bc899dcd28b1999b72..3fefc662a5bcb7915e83ffb70bb9df4ea44a3bfd 100644 (file)
@@ -589,92 +589,3 @@ let elim_intros_simpl_tac ~term =
        [ReductionTactics.simpl_tac
          ~pattern:(ProofEngineTypes.conclusion_pattern None)])
 ;;
-
-exception NotConvertible
-
-(* Note: this code is almost identical to ReductionTactics.reduction_tac and
-*  it could be unified by making the change function a callback *)
-(* CSC: with_what is parsed in the context of the goal, but it should replace
-        something that lives in a completely different context. Thus we
-        perform a delift + lift phase to move it in the right context. However,
-        in this way the tactic is less powerful than expected: with_what cannot
-        reference variables that are local to the term that is going to be
-        replaced. To fix this we should parse with_what in the context of the
-        term(s) to be replaced. *)
-let change_tac ~pattern with_what  =
- let change_tac ~pattern ~with_what (proof, goal) =
-  let curi,metasenv,pbo,pty = proof in
-  let (metano,context,ty) as conjecture = CicUtil.lookup_meta goal metasenv in
-  let context_len = List.length context in
-  let change context'_len where terms =
-   if terms = [] then where
-   else
-    let terms, terms' = 
-      List.split
-       (List.map
-        (fun (context_of_t, t) ->
-          let context_of_t_len = List.length context_of_t in
-          let with_what_in_context' =
-            if context_len > context'_len then
-             begin
-              let with_what,subst,metasenv' =
-               CicMetaSubst.delift_rels [] metasenv
-                (context_len - context'_len) with_what
-              in
-               assert (subst = []);
-               assert (metasenv = metasenv');
-               with_what
-             end
-            else
-             with_what in
-          let with_what_in_context_of_t =
-           if context_of_t_len > context'_len then
-            CicSubstitution.lift (context_of_t_len - context'_len)
-             with_what_in_context'
-           else
-            with_what in
-          let _,u =
-           CicTypeChecker.type_of_aux' metasenv context_of_t with_what
-            CicUniv.empty_ugraph in
-          let b,_ =
-           CicReduction.are_convertible ~metasenv context_of_t t with_what u in
-          if b then
-           t, with_what_in_context_of_t
-          else
-           raise NotConvertible) terms)
-    in
-     ProofEngineReduction.replace ~equality:(==) ~what:terms ~with_what:terms'
-      ~where:where in
-  let (selected_context,selected_ty) =
-   ProofEngineHelpers.select ~metasenv ~conjecture ~pattern in
-  let ty' = change context_len ty selected_ty in
-  let context' =
-   List.fold_right2
-    (fun entry selected_entry context' ->
-     let context'_len = List.length context' in
-     match entry,selected_entry with
-         None,None -> None::context'
-       | Some (name,Cic.Decl ty),Some (`Decl selected_ty) ->
-          let ty' = change context'_len ty selected_ty in
-           Some (name,Cic.Decl ty')::context'
-       | Some (name,Cic.Def (bo,ty)),Some (`Def (selected_bo,selected_ty)) ->
-          let bo' = change context'_len bo selected_bo in
-          let ty' =
-           match ty,selected_ty with
-              None,None -> None
-            | Some ty,Some selected_ty ->
-               Some (change context'_len ty selected_ty)
-            | _,_ -> assert false
-          in
-           Some (name,Cic.Def (bo',ty'))::context'
-       | _,_ -> assert false
-    ) context selected_context [] in
- let metasenv' = 
-   List.map (function 
-     | (n,_,_) when n = metano -> (metano,context',ty')
-     | _ as t -> t
-   ) metasenv
- in
-  (curi,metasenv',pbo,pty), [metano]
-  in
-    mk_tactic (change_tac ~pattern ~with_what)
index 70b18da568ed11990d262e39ebed6b2d1eb6a126..2e35f4250477bdb12eff077c3204d6206599c10d 100644 (file)
@@ -55,6 +55,3 @@ val elim_intros_simpl_tac:
   term: Cic.term -> ProofEngineTypes.tactic 
 val elim_intros_tac:
   term: Cic.term -> ProofEngineTypes.tactic 
-
-val change_tac:
-  pattern:ProofEngineTypes.pattern -> Cic.term -> ProofEngineTypes.tactic 
index 18db1a302dab0a3cbec4849e32202ca0bc137b27..d34678e52cf95e426c917df1205ec9dd27100b54 100644 (file)
 
 open ProofEngineTypes
 
-(* Note: this code is almost identical to PrimitiveTactics.change_tac and
+(* Note: this code is almost identical to change_tac and
 *  it could be unified by making the change function a callback *)
-let reduction_tac ~reduction ~pattern
- (proof,goal)
-=
+let reduction_tac ~reduction ~pattern (proof,goal) =
   let curi,metasenv,pbo,pty = proof in
   let (metano,context,ty) as conjecture = CicUtil.lookup_meta goal metasenv in
   let change where terms =
@@ -81,41 +79,106 @@ let whd_tac ~pattern =
  mk_tactic (reduction_tac ~reduction:CicReduction.whd ~pattern);;
 
 let normalize_tac ~pattern = 
- mk_tactic (reduction_tac ~reduction:CicReduction.normalize ~pattern );;
+ mk_tactic (reduction_tac ~reduction:CicReduction.normalize ~pattern);;
 
-let fold_tac ~reduction ~term ~pattern =
-(*
- let fold_tac ~reduction ~pattern:(hyp_patterns,goal_pattern) ~term (proof,goal)
- =
+exception NotConvertible
+
+(* Note: this code is almost identical to reduction_tac and
+*  it could be unified by making the change function a callback *)
+(* CSC: with_what is parsed in the context of the goal, but it should replace
+        something that lives in a completely different context. Thus we
+        perform a delift + lift phase to move it in the right context. However,
+        in this way the tactic is less powerful than expected: with_what cannot
+        reference variables that are local to the term that is going to be
+        replaced. To fix this we should parse with_what in the context of the
+        term(s) to be replaced. *)
+let change_tac ~pattern with_what  =
+ let change_tac ~pattern ~with_what (proof, goal) =
   let curi,metasenv,pbo,pty = proof in
-  let metano,context,ty = CicUtil.lookup_meta goal metasenv in
-   let term' = reduction context term in
-    let replace =
-     ProofEngineReduction.replace ~equality:(=) ~what:[term'] ~with_what:[term]
+  let (metano,context,ty) as conjecture = CicUtil.lookup_meta goal metasenv in
+  let context_len = List.length context in
+  let change context'_len where terms =
+   if terms = [] then where
+   else
+    let terms, terms' = 
+      List.split
+       (List.map
+        (fun (context_of_t, t) ->
+          let context_of_t_len = List.length context_of_t in
+          let with_what_in_context' =
+            if context_len > context'_len then
+             begin
+              let with_what,subst,metasenv' =
+               CicMetaSubst.delift_rels [] metasenv
+                (context_len - context'_len) with_what
+              in
+               assert (subst = []);
+               assert (metasenv = metasenv');
+               with_what
+             end
+            else
+             with_what in
+          let with_what_in_context_of_t =
+           if context_of_t_len > context'_len then
+            CicSubstitution.lift (context_of_t_len - context'_len)
+             with_what_in_context'
+           else
+            with_what in
+          let _,u =
+           CicTypeChecker.type_of_aux' metasenv context_of_t with_what
+            CicUniv.empty_ugraph in
+          let b,_ =
+           CicReduction.are_convertible ~metasenv context_of_t t with_what u in
+          if b then
+           t, with_what_in_context_of_t
+          else
+           raise NotConvertible) terms)
     in
-     let ty' = replace ty in
-     let metasenv' =
-      let context' =
-       if also_in_hypotheses then
-        List.map
-         (function
-             Some (n,Cic.Decl t) -> Some (n,Cic.Decl (replace t))
-           | Some (n,Cic.Def (t,None))  -> Some (n,Cic.Def ((replace t),None))
-           | None -> None
-           | Some (_,Cic.Def (_,Some _)) -> assert false
-         ) context
-       else
-        context
-      in
-       List.map
-        (function
-            (n,_,_) when n = metano -> (metano,context',ty')
-          | _ as t -> t
-        ) metasenv
-      
-     in
-      (curi,metasenv',pbo,pty), [metano]
+     ProofEngineReduction.replace ~equality:(==) ~what:terms ~with_what:terms'
+      ~where:where in
+  let (selected_context,selected_ty) =
+   ProofEngineHelpers.select ~metasenv ~conjecture ~pattern in
+  let ty' = change context_len ty selected_ty in
+  let context' =
+   List.fold_right2
+    (fun entry selected_entry context' ->
+     let context'_len = List.length context' in
+     match entry,selected_entry with
+         None,None -> None::context'
+       | Some (name,Cic.Decl ty),Some (`Decl selected_ty) ->
+          let ty' = change context'_len ty selected_ty in
+           Some (name,Cic.Decl ty')::context'
+       | Some (name,Cic.Def (bo,ty)),Some (`Def (selected_bo,selected_ty)) ->
+          let bo' = change context'_len bo selected_bo in
+          let ty' =
+           match ty,selected_ty with
+              None,None -> None
+            | Some ty,Some selected_ty ->
+               Some (change context'_len ty selected_ty)
+            | _,_ -> assert false
+          in
+           Some (name,Cic.Def (bo',ty'))::context'
+       | _,_ -> assert false
+    ) context selected_context [] in
+ let metasenv' = 
+   List.map (function 
+     | (n,_,_) when n = metano -> (metano,context',ty')
+     | _ as t -> t
+   ) metasenv
+ in
+  (curi,metasenv',pbo,pty), [metano]
+  in
+    mk_tactic (change_tac ~pattern ~with_what)
+
+let fold_tac ~reduction ~term ~pattern =
+ let fold_tac ~reduction ~term ~pattern:(wanted,hyps_pat,concl_pat) status =
+  assert (wanted = None); (* this should be checked syntactically *)
+  let proof,goal = status in
+  let _,metasenv,_,_ = proof in
+  let _,context,_ = CicUtil.lookup_meta goal metasenv in
+  let reduced_term = reduction context term in
+   apply_tactic
+    (change_tac ~pattern:(Some reduced_term,hyps_pat,concl_pat) term) status
  in
-  mk_tactic (fold_tac ~reduction ~pattern ~term)
-*) assert false
+  mk_tactic (fold_tac ~reduction ~term ~pattern)
 ;;
index 00d3e58900b2789f6ce895d826cffd57553cd00f..2b01561a566f70fc59b24b50470567790c6df5a3 100644 (file)
@@ -29,6 +29,9 @@ val reduce_tac: pattern:ProofEngineTypes.pattern -> ProofEngineTypes.tactic
 val whd_tac: pattern:ProofEngineTypes.pattern -> ProofEngineTypes.tactic
 val normalize_tac: pattern:ProofEngineTypes.pattern -> ProofEngineTypes.tactic
 
+val change_tac:
+  pattern:ProofEngineTypes.pattern -> Cic.term -> ProofEngineTypes.tactic 
+
 val fold_tac:
  reduction:(Cic.context -> Cic.term -> Cic.term) -> term:Cic.term ->
  pattern:ProofEngineTypes.pattern -> ProofEngineTypes.tactic
index 055c00528139b5defa52843582d2e7b1a8d5dbec..f6c166268896edb97fa1c6eaf0820742e99e5590 100644 (file)
@@ -27,7 +27,7 @@ let absurd = NegationTactics.absurd_tac
 let apply = PrimitiveTactics.apply_tac
 let assumption = VariousTactics.assumption_tac
 let auto = AutoTactic.auto_tac
-let change = PrimitiveTactics.change_tac
+let change = ReductionTactics.change_tac
 let clear = ProofEngineStructuralRules.clear
 let clearbody = ProofEngineStructuralRules.clearbody
 let compare = DiscriminationTactics.compare_tac