]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/ocaml/paramodulation/indexing.ml
now proofs have the correct type :-)
[helm.git] / helm / ocaml / paramodulation / indexing.ml
index bd9091e4c927dea2d8be0c9c27d1ee50ac979fa3..f15a0cee61a16c3cfb5630ae0c4163bdb95ab01e 100644 (file)
@@ -375,12 +375,22 @@ let rec demodulate_term metasenv context ugraph table lift_amount term =
 ;;
 
 
+let build_ens_for_sym_eq ty x y = 
+  [(UriManager.uri_of_string
+      "cic:/Coq/Init/Logic/Logic_lemmas/equality/A.var", ty);
+   (UriManager.uri_of_string
+      "cic:/Coq/Init/Logic/Logic_lemmas/equality/x.var", x);
+   (UriManager.uri_of_string
+      "cic:/Coq/Init/Logic/Logic_lemmas/equality/y.var", y)]
+;;
+
+
 let build_newtarget_time = ref 0.;;
 
 
 let demod_counter = ref 1;;
 
-let rec demodulation newmeta env table target =
+let rec demodulation newmeta env table sign target =
   let module C = Cic in
   let module S = CicSubstitution in
   let module M = CicMetaSubst in
@@ -388,6 +398,9 @@ let rec demodulation newmeta env table target =
   let metasenv, context, ugraph = env in
   let _, proof, (eq_ty, left, right, order), metas, args = target in
   let metasenv' = metasenv @ metas in
+
+  let maxmeta = ref newmeta in
+  
   let build_newtarget is_left (t, subst, menv, ug, (eq_found, eq_URI)) =
     let time1 = Unix.gettimeofday () in
     
@@ -398,29 +411,65 @@ let rec demodulation newmeta env table target =
       let t' =
         let name = C.Name ("x_Demod_" ^ (string_of_int !demod_counter)) in
         incr demod_counter;
-        let l, r = if is_left then bo, right else left, bo in
-        (name, ty, eq_ty, l, r)
+        let l, r =
+          if is_left then t, S.lift 1 right else S.lift 1 left, t in
+        (name, ty, S.lift 1 eq_ty, l, r)
       in
-(*       let bo'' = *)
-(*         C.Appl ([C.MutInd (HL.Logic.eq_URI, 0, []); *)
-(*                  S.lift 1 eq_ty] @ *)
-(*                  if is_left then [S.lift 1 bo; S.lift 1 right] *)
-(*                  else [S.lift 1 left; S.lift 1 bo]) *)
-(*       in *)
-(*       let t' = *)
-(*         let name = C.Name ("x_Demod_" ^ (string_of_int !demod_counter)) in *)
-(*         incr demod_counter; *)
-(*         C.Lambda (name, ty, bo'') *)
-(*       in *)
-      bo,
-      Inference.ProofBlock (subst, eq_URI, t', eq_found, target)
-(*       (\* M. *\)apply_subst subst (C.Appl [C.Const (eq_URI, []); ty; what; t'; *)
-(*                                    proof; other; proof']) *)
+      if sign = Utils.Positive then
+        (bo,
+         Inference.ProofBlock (subst, eq_URI, t', eq_found, proof))
+      else
+        let metaproof = 
+          incr maxmeta;
+          let irl =
+            CicMkImplicit.identity_relocation_list_for_metavariable context in
+          Printf.printf "\nADDING META: %d\n" !maxmeta;
+          print_newline ();
+          C.Meta (!maxmeta, irl)
+        in
+        let target' =
+          let eq_found =
+            let proof' =
+              let ens =
+                if pos = Utils.Left then
+                  build_ens_for_sym_eq ty what other
+                else
+                  build_ens_for_sym_eq ty other what
+              in
+              Inference.ProofSymBlock (ens, proof')
+            in
+            let what, other =
+              if pos = Utils.Left then what, other else other, what
+            in
+            pos, (0, proof', (ty, other, what, Utils.Incomparable),
+                  menv', args')
+          in
+          let target_proof =
+            let pb =
+              Inference.ProofBlock (subst, eq_URI, t', eq_found,
+                                    Inference.BasicProof metaproof)
+            in
+            match proof with
+            | Inference.BasicProof _ ->
+                print_endline "replacing a BasicProof";
+                pb
+            | Inference.ProofGoalBlock (_, parent_eq) ->
+                print_endline "replacing another ProofGoalBlock";
+                Inference.ProofGoalBlock (pb, parent_eq)
+            | _ -> assert false
+          in
+          (0, target_proof, (eq_ty, left, right, order), metas, args)
+        in
+        let refl =
+          C.Appl [C.MutConstruct (* reflexivity *)
+                    (HelmLibraryObjects.Logic.eq_URI, 0, 1, []);
+                  eq_ty; if is_left then right else left]          
+        in
+        (bo,
+         Inference.ProofGoalBlock (Inference.BasicProof refl, target'))
     in
     let left, right = if is_left then newterm, right else left, newterm in
-    let m =
-      (Inference.metas_of_term left) @ (Inference.metas_of_term right)
-    in
+    let m = (Inference.metas_of_term left) @ (Inference.metas_of_term right) in
     let newmetasenv = List.filter (fun (i, _, _) -> List.mem i m) metas
     and newargs =
       List.filter
@@ -436,12 +485,13 @@ let rec demodulation newmeta env table target =
       let w = Utils.compute_equality_weight eq_ty left right in
       (w, newproof, (eq_ty, left, right, ordering), newmetasenv, newargs)
     in
-    newmeta, res
+(*     if sign = Utils.Positive then ( *)
+(*       let newm, res = Inference.fix_metas !maxmeta res in *)
+(*       maxmeta := newm; *)
+(*       !maxmeta, res *)
+(*     ) else *)
+    !maxmeta(* newmeta *), res
   in
-(*   let build_newtarget = *)
-(*     let profile = CicUtil.profile "Indexing.demodulation.build_newtarget" in *)
-(*     (fun a b -> profile (build_newtarget a) b) *)
-(*   in *)
   let res = demodulate_term metasenv' context ugraph table 0 left in
 (*   let build_identity (w, p, (t, l, r, o), m, a) = *)
 (*     match o with *)
@@ -458,7 +508,7 @@ let rec demodulation newmeta env table target =
 (*         if subsumption env table newtarget then *)
 (*           newmeta, build_identity newtarget *)
 (*         else *)
-          demodulation newmeta env table newtarget
+        demodulation newmeta env table sign newtarget
   | None ->
       let res = demodulate_term metasenv' context ugraph table 0 right in
       match res with
@@ -471,7 +521,7 @@ let rec demodulation newmeta env table target =
 (*             if subsumption env table newtarget then *)
 (*               newmeta, build_identity newtarget *)
 (*             else *)
-              demodulation newmeta env table newtarget
+              demodulation newmeta env table sign newtarget
       | None ->
           newmeta, target
 ;;
@@ -578,19 +628,23 @@ let rec betaexpand_term metasenv context ugraph table lift_amount term =
 
 let sup_l_counter = ref 1;;
 
-let superposition_left (metasenv, context, ugraph) table target =
+let superposition_left newmeta (metasenv, context, ugraph) table target =
   let module C = Cic in
   let module S = CicSubstitution in
   let module M = CicMetaSubst in
   let module HL = HelmLibraryObjects in
   let module CR = CicReduction in
   let module U = Utils in
-  let _, proof, (eq_ty, left, right, ordering), _, _ = target in
+  let weight, proof, (eq_ty, left, right, ordering), _, _ = target in
   let expansions, _ =
     let term = if ordering = U.Gt then left else right in
     betaexpand_term metasenv context ugraph table 0 term
   in
+  let maxmeta = ref newmeta in
   let build_new (bo, s, m, ug, (eq_found, eq_URI)) =
+
+    print_endline "\nSUPERPOSITION LEFT\n";
+    
     let time1 = Unix.gettimeofday () in
     
     let pos, (_, proof', (ty, what, other, _), menv', args') = eq_found in
@@ -600,8 +654,9 @@ let superposition_left (metasenv, context, ugraph) table target =
       let t' =
         let name = C.Name ("x_SupL_" ^ (string_of_int !sup_l_counter)) in
         incr sup_l_counter;
-        let l, r = if ordering = U.Gt then bo', right else left, bo' in
-        (name, ty, eq_ty, l, r)
+        let l, r =
+          if ordering = U.Gt then bo, S.lift 1 right else S.lift 1 left, bo in
+        (name, ty, S.lift 1 eq_ty, l, r)
       in
 (*       let bo'' = *)
 (*         C.Appl ( *)
@@ -615,11 +670,51 @@ let superposition_left (metasenv, context, ugraph) table target =
 (*         incr sup_l_counter; *)
 (*         C.Lambda (name, ty, bo'') *)
 (*       in *)
-      bo',
-      Inference.ProofBlock (s, eq_URI, t', eq_found, target)
-(*       (\* M. *\)apply_subst s *)
-(*         (C.Appl [C.Const (eq_URI, []); ty; what; t'; *)
-(*                  proof; other; proof']) *)
+      incr maxmeta;
+      let metaproof =
+        let irl =
+          CicMkImplicit.identity_relocation_list_for_metavariable context in
+        C.Meta (!maxmeta, irl)
+      in
+      let target' =
+        let eq_found =
+          let proof' =
+            let ens =
+              if pos = Utils.Left then
+                build_ens_for_sym_eq ty what other
+              else
+                build_ens_for_sym_eq ty other what
+            in
+            Inference.ProofSymBlock (ens, proof')
+          in
+          let what, other =
+            if pos = Utils.Left then what, other else other, what
+          in
+          pos, (0, proof', (ty, other, what, Utils.Incomparable), menv', args')
+        in
+        let target_proof =
+          let pb =
+            Inference.ProofBlock (s, eq_URI, t', eq_found,
+                                  Inference.BasicProof metaproof)
+          in
+          match proof with
+          | Inference.BasicProof _ ->
+              print_endline "replacing a BasicProof";
+              pb
+          | Inference.ProofGoalBlock (_, parent_eq) ->
+              print_endline "replacing another ProofGoalBlock";
+              Inference.ProofGoalBlock (pb, parent_eq)
+          | _ -> assert false
+        in
+        (weight, target_proof, (eq_ty, left, right, ordering), [], [])
+      in
+      let refl =
+        C.Appl [C.MutConstruct (* reflexivity *)
+                  (HelmLibraryObjects.Logic.eq_URI, 0, 1, []);
+                eq_ty; if ordering = U.Gt then right else left]
+      in
+      (bo',
+       Inference.ProofGoalBlock (Inference.BasicProof refl, target'))
     in
     let left, right =
       if ordering = U.Gt then newgoal, right else left, newgoal in
@@ -634,11 +729,7 @@ let superposition_left (metasenv, context, ugraph) table target =
     in
     res
   in
-(*   let build_new = *)
-(*     let profile = CicUtil.profile "Inference.superposition_left.build_new" in *)
-(*     (fun e -> profile build_new e) *)
-(*   in *)
-  List.map build_new expansions
+  !maxmeta, List.map build_new expansions
 ;;
 
 
@@ -680,8 +771,9 @@ let superposition_right newmeta (metasenv, context, ugraph) table target =
       let t' =
         let name = C.Name ("x_SupR_" ^ (string_of_int !sup_r_counter)) in
         incr sup_r_counter;
-        let l, r = if ordering = U.Gt then bo', right else left, bo' in
-        (name, ty, eq_ty, l, r)
+        let l, r =
+          if ordering = U.Gt then bo, S.lift 1 right else S.lift 1 left, bo in
+        (name, ty, S.lift 1 eq_ty, l, r)
       in
 (*       let bo'' = *)
 (*         C.Appl ( *)
@@ -695,7 +787,7 @@ let superposition_right newmeta (metasenv, context, ugraph) table target =
 (*         C.Lambda (name, ty, bo'') *)
 (*       in *)
       bo',
-      Inference.ProofBlock (s, eq_URI, t', eq_found, target)
+      Inference.ProofBlock (s, eq_URI, t', eq_found, eqproof(* target *))
 (*       (\* M. *\)apply_subst s *)
 (*         (C.Appl [C.Const (eq_URI, []); ty; what; t'; *)
 (*                  eqproof; other; proof']) *)