]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/software/components/ng_paramodulation/superposition.ml
Final subst returned by superposition and passed around.
[helm.git] / helm / software / components / ng_paramodulation / superposition.ml
index 585fbe2371caf146bb2377e072cc75b37039addb..6f1fb0f7f91a3e1395bf3dc71fa6a65cb39a3136 100644 (file)
@@ -20,7 +20,11 @@ module Superposition (B : Orderings.Blob) =
     module Utils = FoUtils.Utils(B)
     module Pp = Pp.Pp(B)
     
-    exception Success of B.t Terms.bag * int * B.t Terms.unit_clause
+    exception Success of 
+      B.t Terms.bag 
+      * int 
+      * B.t Terms.unit_clause
+      * B.t Terms.substitution
 
     (* let debug s = prerr_endline (Lazy.force s);; *)
     let debug _ = ();; 
@@ -311,15 +315,21 @@ module Superposition (B : Orderings.Blob) =
     ;;
 
     (* move away *)
-    let is_identity_clause ~unify = function
+    let is_identity_clause = function
       | _, Terms.Equation (_,_,_,Terms.Eq), _, _ -> true
-      | _, Terms.Equation (l,r,_,_), vl, proof when unify ->
-          (try ignore(Unif.unification (* vl *) [] l r); true
-          with FoUnif.UnificationFailure _ -> false)
       | _, Terms.Equation (_,_,_,_), _, _ -> false
       | _, Terms.Predicate _, _, _ -> assert false          
     ;;
 
+    let is_identity_goal = function
+      | _, Terms.Equation (_,_,_,Terms.Eq), _, _ -> Some []
+      | _, Terms.Equation (l,r,_,_), vl, proof ->
+          (try Some (Unif.unification (* vl *) [] l r)
+           with FoUnif.UnificationFailure _ -> None)
+      | _, Terms.Equation (_,_,_,_), _, _ -> None
+      | _, Terms.Predicate _, _, _ -> assert false          
+    ;;
+
     let build_new_clause bag maxvar filter rule t subst id id2 pos dir =
       let maxvar, _vl, subst = Utils.relocate maxvar (Terms.vars_of_term
       (Subst.apply_subst subst t)) subst in
@@ -475,10 +485,10 @@ module Superposition (B : Orderings.Blob) =
     (* demodulate and check for subsumption *)
     let simplify table maxvar bag clause =
       debug (lazy "simplify...");
-      if is_identity_clause ~unify:false clause then bag,None
+      if is_identity_clause clause then bag,None
       (* else if orphan_murder bag actives clause then bag,None *)
       else let bag, clause = demodulate bag clause table in
-      if is_identity_clause ~unify:false clause then bag,None
+      if is_identity_clause clause then bag,None
       else
         match is_subsumed ~unify:false bag maxvar clause table with
           | None -> bag, Some clause
@@ -608,9 +618,9 @@ module Superposition (B : Orderings.Blob) =
         if no_demod then bag, clause else demodulate bag clause table 
       in
       if List.exists (are_alpha_eq clause) g_actives then None
-      else if (is_identity_clause ~unify:true clause)
-      then raise (Success (bag, maxvar, clause))
-      else   
+      else match (is_identity_goal clause) with
+       | Some subst -> raise (Success (bag,maxvar,clause,subst))
+       | None ->
         let (id,lit,vl,_) = clause in 
         (* this optimization makes sense only if we demodulated, since in 
           that case the clause should have been turned into an identity *)
@@ -627,7 +637,7 @@ module Superposition (B : Orderings.Blob) =
          | None -> Some (bag,clause)
          | Some (bag,maxvar,cl,subst) -> 
              debug (lazy "Goal subsumed");
-             raise (Success (bag,maxvar,cl))
+             raise (Success (bag,maxvar,cl,subst))
 (*
         match is_subsumed ~unify:true bag maxvar clause table with
         | None -> Some (bag, clause)