]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/software/components/ng_paramodulation/superposition.ml
parameter sintax added to axiom statement
[helm.git] / helm / software / components / ng_paramodulation / superposition.ml
index 6ec6048de9147191b13cfd96b14b5e763df8c255..42cf063b64f08b3e352693d7a30bebff78025e95 100644 (file)
@@ -26,7 +26,7 @@ module Superposition (B : Orderings.Blob) =
       * B.t Terms.unit_clause
       * B.t Terms.substitution
 
-    (* let debug s = prerr_endline (Lazy.force s);; *)
+    let print s = prerr_endline (Lazy.force s);; 
     let debug _ = ();; 
     let enable = true;;
 
@@ -272,7 +272,12 @@ module Superposition (B : Orderings.Blob) =
     let rec demodulate bag (id, literal, vl, pr) table =
       debug (lazy ("demodulate " ^ (string_of_int id)));
        match literal with
-      | Terms.Predicate t -> assert false
+      | Terms.Predicate t -> (* assert false *)
+         let bag,_,id1 =
+           visit bag [] (fun x -> x) id t (ctx_demod table vl)
+         in          
+         let cl,_,_ = Terms.get_from_bag id1 bag in
+           bag,cl
       | Terms.Equation (l,r,ty,_) ->
           let bag,l,id1 = 
            visit bag [2]
@@ -328,17 +333,22 @@ module Superposition (B : Orderings.Blob) =
       | _, 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 build_new_clause_reloc 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
       match build_clause bag filter rule t subst id id2 pos dir with
-      | Some (bag, c) -> Some ((bag, maxvar), c)
-      | None -> None
+      | Some (bag, c) -> Some ((bag, maxvar), c), subst
+      | None -> None,subst
     ;;
+
+    let build_new_clause bag maxvar filter rule t subst id id2 pos dir =
+      fst (build_new_clause_reloc bag maxvar filter rule t 
+            subst id id2 pos dir)
+    ;;
+
     let prof_build_new_clause = HExtlib.profile ~enable "build_new_clause";;
     let build_new_clause bag maxvar filter rule t subst id id2 pos x =
       prof_build_new_clause.HExtlib.profile (build_new_clause bag maxvar filter
@@ -407,6 +417,7 @@ module Superposition (B : Orderings.Blob) =
       match acc with 
       | None -> None
       | Some(bag,maxvar,(id,lit,vl,p),subst) -> 
+          (* prerr_endline ("input subst = "^Pp.pp_substitution subst); *)
           let l = Subst.apply_subst subst l in 
           let r = Subst.apply_subst subst r in 
             try 
@@ -421,19 +432,24 @@ module Superposition (B : Orderings.Blob) =
             with FoUnif.UnificationFailure _ -> 
               match rewrite_eq ~unify l r ty vl table with
               | Some (id2, dir, subst1) ->
+                 (* prerr_endline ("subst1 = "^Pp.pp_substitution subst1);
+                    prerr_endline ("old subst = "^Pp.pp_substitution subst);*)
                   let newsubst = Subst.concat subst1 subst in
                   let id_t = 
                     FoSubst.apply_subst newsubst
                       (Terms.Node[Terms.Leaf B.eqP;ty;contextl r;contextr r]) 
                   in
                     (match 
-                      build_new_clause bag maxvar (fun _ -> true)
+                      build_new_clause_reloc bag maxvar (fun _ -> true)
                         Terms.Superposition id_t 
                         subst1 id id2 (pos@[2]) dir 
                     with
-                    | Some ((bag, maxvar), c) -> 
+                    | Some ((bag, maxvar), c), r ->
+                       (* prerr_endline ("r = "^Pp.pp_substitution r); *)
+                       let newsubst = Subst.flat 
+                         (Subst.concat r subst) in
                         Some(bag,maxvar,c,newsubst)
-                    | None -> assert false)
+                    | None, _ -> assert false)
               | None ->
                   match l,r with 
                   | Terms.Node (a::la), Terms.Node (b::lb) when 
@@ -455,6 +471,7 @@ module Superposition (B : Orderings.Blob) =
                       in acc
                   | _,_ -> None
     ;;
+
     let prof_deep_eq = HExtlib.profile ~enable "deep_eq";;
     let deep_eq ~unify l r ty pos contextl contextr table x =
       prof_deep_eq.HExtlib.profile (deep_eq ~unify l r ty pos contextl contextr table) x
@@ -619,6 +636,9 @@ module Superposition (B : Orderings.Blob) =
       let bag, clause = 
         if no_demod then bag, clause else demodulate bag clause table 
       in
+      let _ = debug (lazy ("demodulated goal  : " 
+                            ^ Pp.pp_unit_clause clause))
+      in
       if List.exists (are_alpha_eq clause) g_actives then None
       else match (is_identity_goal clause) with
        | Some subst -> raise (Success (bag,maxvar,clause,subst))