]> 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 c50d809acbd3d4c4bb6515bdedb9d4b07fc000f1..f15a0cee61a16c3cfb5630ae0c4163bdb95ab01e 100644 (file)
@@ -143,7 +143,7 @@ let rec find_matches metasenv context ugraph lift_amount term =
   function
     | [] -> None
     | candidate::tl ->
-        let pos, (proof, (ty, left, right, o), metas, args) = candidate in
+        let pos, (_, proof, (ty, left, right, o), metas, args) = candidate in
         let do_match c other eq_URI =
           let subst', metasenv', ugraph' =
             let t1 = Unix.gettimeofday () in
@@ -200,7 +200,7 @@ let rec find_all_matches ?(unif_fun=Inference.unification)
   function
     | [] -> []
     | candidate::tl ->
-        let pos, (proof, (ty, left, right, o), metas, args) = candidate in
+        let pos, (_, _, (ty, left, right, o), metas, args) = candidate in
         let do_match c other eq_URI =
           let subst', metasenv', ugraph' =
             let t1 = Unix.gettimeofday () in
@@ -277,7 +277,7 @@ let subsumption env table target =
         find_all_matches ~unif_fun:Inference.matching
           metasenv context ugraph 0 left leftc
   in
-  let ok what (_, subst, menv, ug, ((pos, (_, (_, l, r, o), _, _)), _)) =
+  let ok what (_, subst, menv, ug, ((pos, (_, _, (_, l, r, o), _, _)), _)) =
     try
       let other = if pos = Utils.Left then r else l in
       let subst', menv', ug' =
@@ -375,38 +375,101 @@ 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 rec demodulation newmeta env table target =
+
+let demod_counter = ref 1;;
+
+let rec demodulation newmeta env table sign target =
   let module C = Cic in
   let module S = CicSubstitution in
   let module M = CicMetaSubst in
   let module HL = HelmLibraryObjects in
   let metasenv, context, ugraph = env in
-  let proof, (eq_ty, left, right, order), metas, args = target 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
     
-    let pos, (proof', (ty, what, other, _), menv', args') = eq_found in
+    let pos, (_, proof', (ty, what, other, _), menv', args') = eq_found in
     let what, other = if pos = Utils.Left then what, other else other, what in
     let newterm, newproof =
       let bo = (* M. *)apply_subst subst (S.subst other t) in
-      let bo'' =
-        C.Appl ([C.MutInd (HL.Logic.eq_URI, 0, []);
-                 S.lift 1 eq_ty] @
-                 if is_left then [bo; S.lift 1 right] else [S.lift 1 left; bo])
+      let t' =
+        let name = C.Name ("x_Demod_" ^ (string_of_int !demod_counter)) in
+        incr demod_counter;
+        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 t' = C.Lambda (C.Anonymous, 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
@@ -420,21 +483,21 @@ let rec demodulation newmeta env table target =
 
     let res =
       let w = Utils.compute_equality_weight eq_ty left right in
-      (w, (eq_ty, left, right, ordering), newmetasenv, newargs)
+      (w, newproof, (eq_ty, left, right, ordering), newmetasenv, newargs)
     in
-    Inference.store_proof res newproof;
-    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 (p, (t, l, r, o), m, a) =
-    match o with
-    | Utils.Gt -> (p, (t, r, r, Utils.Eq), m, a)
-    | _ -> (p, (t, l, l, Utils.Eq), m, a)
-  in
+(*   let build_identity (w, p, (t, l, r, o), m, a) = *)
+(*     match o with *)
+(*     | Utils.Gt -> (w, p, (t, r, r, Utils.Eq), m, a) *)
+(*     | _ -> (w, p, (t, l, l, Utils.Eq), m, a) *)
+(*   in *)
   match res with
   | Some t ->
       let newmeta, newtarget = build_newtarget true t in
@@ -445,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
@@ -458,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
 ;;
@@ -563,38 +626,95 @@ let rec betaexpand_term metasenv context ugraph table lift_amount term =
 ;;
 
 
-let superposition_left (metasenv, context, ugraph) table target =
+let sup_l_counter = ref 1;;
+
+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
+    let pos, (_, proof', (ty, what, other, _), menv', args') = eq_found in
     let what, other = if pos = Utils.Left then what, other else other, what in
     let newgoal, newproof =
       let bo' = (* M. *)apply_subst s (S.subst other bo) in
-      let bo'' =
-        C.Appl (
-          [C.MutInd (HL.Logic.eq_URI, 0, []);
-           S.lift 1 eq_ty] @
-            if ordering = U.Gt then [bo'; S.lift 1 right]
-            else [S.lift 1 left; bo'])
+      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, S.lift 1 right else S.lift 1 left, bo in
+        (name, ty, S.lift 1 eq_ty, l, r)
       in
-      let t' = C.Lambda (C.Anonymous, 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']) *)
+(*       let bo'' = *)
+(*         C.Appl ( *)
+(*           [C.MutInd (HL.Logic.eq_URI, 0, []); *)
+(*            S.lift 1 eq_ty] @ *)
+(*             if ordering = U.Gt 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_SupL_" ^ (string_of_int !sup_l_counter)) in *)
+(*         incr sup_l_counter; *)
+(*         C.Lambda (name, ty, bo'') *)
+(*       in *)
+      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
@@ -605,19 +725,16 @@ let superposition_left (metasenv, context, ugraph) table target =
 
     let res =
       let w = Utils.compute_equality_weight eq_ty left right in
-      (w, (eq_ty, left, right, neworder), [], [])
+      (w, newproof, (eq_ty, left, right, neworder), [], [])
     in
-    Inference.store_proof res newproof;
     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
 ;;
 
 
+let sup_r_counter = ref 1;;
+
 let superposition_right newmeta (metasenv, context, ugraph) table target =
   let module C = Cic in
   let module S = CicSubstitution in
@@ -625,7 +742,7 @@ let superposition_right newmeta (metasenv, context, ugraph) table target =
   let module HL = HelmLibraryObjects in
   let module CR = CicReduction in
   let module U = Utils in
-  let eqproof, (eq_ty, left, right, ordering), newmetas, args = target in
+  let _, eqproof, (eq_ty, left, right, ordering), newmetas, args = target in
   let metasenv' = metasenv @ newmetas in
   let maxmeta = ref newmeta in
   let res1, res2 =
@@ -647,19 +764,30 @@ let superposition_right newmeta (metasenv, context, ugraph) table target =
 
     let time1 = Unix.gettimeofday () in
     
-    let pos, (proof', (ty, what, other, _), menv', args') = eq_found in
+    let pos, (_, proof', (ty, what, other, _), menv', args') = eq_found in
     let what, other = if pos = Utils.Left then what, other else other, what in
     let newgoal, newproof =
       let bo' = (* M. *)apply_subst s (S.subst other bo) in
-      let bo'' =
-        C.Appl (
-          [C.MutInd (HL.Logic.eq_URI, 0, []); S.lift 1 eq_ty] @
-            if ordering = U.Gt then [bo'; S.lift 1 right]
-            else [S.lift 1 left; bo'])
+      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, S.lift 1 right else S.lift 1 left, bo in
+        (name, ty, S.lift 1 eq_ty, l, r)
       in
-      let t' = C.Lambda (C.Anonymous, ty, bo'') in
+(*       let bo'' = *)
+(*         C.Appl ( *)
+(*           [C.MutInd (HL.Logic.eq_URI, 0, []); S.lift 1 eq_ty] @ *)
+(*             if ordering = U.Gt 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_SupR_" ^ (string_of_int !sup_r_counter)) in *)
+(*         incr sup_r_counter; *)
+(*         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']) *)
@@ -673,7 +801,7 @@ let superposition_right newmeta (metasenv, context, ugraph) table target =
       and newargs = args @ args' in
       let eq' =
         let w = Utils.compute_equality_weight eq_ty left right in
-        (w, (eq_ty, left, right, neworder), newmenv, newargs)
+        (w, newproof, (eq_ty, left, right, neworder), newmenv, newargs)
       and env = (metasenv, context, ugraph) in
       let newm, eq' = Inference.fix_metas !maxmeta eq' in
       newm, eq'
@@ -683,7 +811,6 @@ let superposition_right newmeta (metasenv, context, ugraph) table target =
     let time2 = Unix.gettimeofday () in
     build_newtarget_time := !build_newtarget_time +. (time2 -. time1);
 
-    Inference.store_proof newequality newproof;
     newequality
   in
 
@@ -695,7 +822,7 @@ let superposition_right newmeta (metasenv, context, ugraph) table target =
   let new1 = List.map (build_new U.Gt) res1
   and new2 = List.map (build_new U.Lt) res2 in
   let ok = function
-    | _, (_, left, right, _), _, _ ->
+    | _, _, (_, left, right, _), _, _ ->
         not (fst (CR.are_convertible context left right ugraph))
   in
   (!maxmeta,