]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/software/components/ng_paramodulation/superposition.ml
Reorganized foUtils, added Clauses module to avoid duplicate code around are_invertib...
[helm.git] / helm / software / components / ng_paramodulation / superposition.ml
index 1a588043409a66b5f40b07014885accfe653b4a1..47119d4770e25beab157df62540aa120c0d1533e 100644 (file)
 
 (* $Id: index.mli 9822 2009-06-03 15:37:06Z tassi $ *)
 
-module Superposition (B : Terms.Blob) = 
+module Superposition (B : Orderings.Blob) = 
   struct
     module IDX = Index.Index(B)
-    module Unif = FoUnif.Founif(B)
+    module Unif = FoUnif.FoUnif(B)
     module Subst = FoSubst 
-    module Order = Orderings.Orderings(B)
+    module Order = B
     module Utils = FoUtils.Utils(B)
     module Pp = Pp.Pp(B)
+    module Clauses = Clauses.Clauses(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.clause
 
-    let debug s = prerr_endline s;;
+    let debug s = prerr_endline (Lazy.force s);;
     let debug _ = ();;
     let enable = true;;
 
@@ -81,7 +82,7 @@ module Superposition (B : Terms.Blob) =
       let rec aux bag pos ctx id = function
       | Terms.Leaf _ as t -> f bag t pos ctx id
       | Terms.Var _ as t -> bag,t,id
-      | Terms.Node l as t->
+      | Terms.Node (hd::l) as t->
           let bag,t,id1 = f bag t pos ctx id in
             if id = id1 then
               let bag, l, _, id = 
@@ -92,10 +93,11 @@ module Superposition (B : Terms.Blob) =
                      let bag,newt,id = aux bag newpos newctx id t in
                        if post = [] then bag, pre@[newt], [], id
                        else bag, pre @ [newt], List.tl post, id)
-                  (bag, [], List.tl l, id) l
+                  (bag, [hd], List.tl l, id) l
               in
                 bag, Terms.Node l, id
             else bag,t,id1
+      | _ -> assert false
       in
         aux bag pos ctx id t
     ;;
@@ -112,7 +114,7 @@ module Superposition (B : Terms.Blob) =
           | t -> Terms.Predicate t
         in
         let bag, uc = 
-          Terms.add_to_bag (0, literal, Terms.vars_of_term t, proof) bag
+          Terms.add_to_bag (0, [], [literal,true], Terms.vars_of_term t, proof) bag
         in
         Some (bag, uc)
       else
@@ -128,6 +130,7 @@ module Superposition (B : Terms.Blob) =
     let prof_demod_u = HExtlib.profile ~enable "demod.unify";;
     let prof_demod_r = HExtlib.profile ~enable "demod.retrieve_generalizations";;
     let prof_demod_o = HExtlib.profile ~enable "demod.compare_terms";;
+    let prof_demod_s = HExtlib.profile ~enable "demod.apply_subst";;
 
     let demod table varlist subterm =
       let cands = 
@@ -135,72 +138,49 @@ module Superposition (B : Terms.Blob) =
          (IDX.DT.retrieve_generalizations table) subterm 
       in
       list_first
-        (fun (dir, (id,lit,vl,_)) ->
-           match lit with
-           | Terms.Predicate _ -> assert false
-           | Terms.Equation (l,r,_,o) ->
-               let side, newside = if dir=Terms.Left2Right then l,r else r,l in
-               try 
-                 let subst =
-                   prof_demod_u.HExtlib.profile 
-                     (Unif.unification (varlist@vl) varlist subterm) side 
-                 in 
-                 let side = Subst.apply_subst subst side in
-                 let newside = Subst.apply_subst subst newside in
-                 if o = Terms.Incomparable then
-                   let o = 
-                     prof_demod_o.HExtlib.profile 
-                      (Order.compare_terms newside) side in
-                   (* Riazanov, pp. 45 (ii) *)
-                   if o = Terms.Lt then
-                     Some (newside, subst, id, dir)
-                   else 
-                     ((*prerr_endline ("Filtering: " ^ 
-                        Pp.pp_foterm side ^ " =(< || =)" ^ 
-                        Pp.pp_foterm newside ^ " coming from " ^ 
-                        Pp.pp_unit_clause uc );*)None)
-                 else
-                   Some (newside, subst, id, dir)
-               with FoUnif.UnificationFailure _ -> None)
-        (IDX.ClauseSet.elements cands)
+        (fun (dir, is_pos, pos, (id,nlit,plit,vl,_)) ->
+          match nlit,plit with
+           | [], [(lit,_)] ->
+              (match lit with
+              | Terms.Predicate _ -> assert false
+              | Terms.Equation (l,r,_,o) ->
+                  let side, newside = if dir=Terms.Left2Right then l,r else r,l in
+                  try 
+                    let subst =
+                      prof_demod_u.HExtlib.profile 
+                        (Unif.unification (* (varlist@vl) *) varlist subterm) side 
+                    in 
+                    let side = 
+                      prof_demod_s.HExtlib.profile 
+                        (Subst.apply_subst subst) side 
+                    in
+                    let newside = 
+                      prof_demod_s.HExtlib.profile 
+                        (Subst.apply_subst subst) newside 
+                    in
+                    if o = Terms.Incomparable || o = Terms.Invertible then
+                      let o = 
+                        prof_demod_o.HExtlib.profile 
+                         (Order.compare_terms newside) side in
+                      (* Riazanov, pp. 45 (ii) *)
+                      if o = Terms.Lt then
+                        Some (newside, subst, id, dir)
+                      else 
+                        ((*prerr_endline ("Filtering: " ^ 
+                           Pp.pp_foterm side ^ " =(< || =)" ^ 
+                           Pp.pp_foterm newside ^ " coming from " ^ 
+                           Pp.pp_clause uc );*)None)
+                    else
+                      Some (newside, subst, id, dir)
+                  with FoUnif.UnificationFailure _ -> None)
+          |  _ -> None)
+              (IDX.ClauseSet.elements cands)
     ;;
     let prof_demod = HExtlib.profile ~enable "demod";;
     let demod table varlist x =
       prof_demod.HExtlib.profile (demod table varlist) x
     ;;
 
-    let demodulate_once_old ~jump_to_right bag (id, literal, vl, pr) table =
-      match literal with
-      | Terms.Predicate t -> assert false
-      | Terms.Equation (l,r,ty,_) ->
-        let left_position = if jump_to_right then None else
-          first_position [2]
-            (fun x -> Terms.Node [ Terms.Leaf B.eqP; ty; x; r ]) l
-            (demod table vl)
-        in
-        match left_position with
-          | Some (newt, subst, id2, dir, pos) ->
-              begin
-                match build_clause bag (fun _ -> true) Terms.Demodulation 
-                  newt subst id id2 pos dir
-                with
-                  | None -> assert false
-                  | Some x -> Some (x,false)
-              end
-          | None ->
-              match first_position
-                [3] (fun x -> Terms.Node [ Terms.Leaf B.eqP; ty; l; x ]) r
-                (demod table vl)
-              with
-                | None -> None
-                | Some (newt, subst, id2, dir, pos) ->
-                    match build_clause bag (fun _ -> true)
-                      Terms.Demodulation newt subst id id2 pos dir
-                    with
-                        | None -> assert false
-                        | Some x -> Some (x,true)
-    ;;
-
     let parallel_demod table vl bag t pos ctx id =
       match demod table vl t with
         | None -> (bag,t,id)
@@ -209,12 +189,15 @@ module Superposition (B : Terms.Blob) =
               Terms.Demodulation (ctx newside) subst id id2 pos dir
             with
               | None -> assert false
-              | Some (bag,(id,_,_,_)) ->
+              | Some (bag,(id,_,_,_,_)) ->
                     (bag,newside,id)
     ;;
 
-    let demodulate_once ~jump_to_right bag (id, literal, vl, pr) table =
-      match literal with
+    let demodulate_once ~jump_to_right bag (id, nlit, plit, vl, pr) table =
+     match nlit,plit with
+     |[literal,_], []
+     |[],[literal,_] ->
+      (match literal with
       | Terms.Predicate t -> assert false
       | Terms.Equation (l,r,ty,_) ->
           let bag,l,id1 = if jump_to_right then (bag,l,id) else
@@ -231,7 +214,8 @@ module Superposition (B : Terms.Blob) =
             if id = id2 then None
             else
               let cl,_,_ = Terms.get_from_bag id2 bag in
-                Some ((bag,cl),jump_to_right)
+                Some ((bag,cl),jump_to_right))
+     | _ -> assert false;
     ;;
 
     let rec demodulate ~jump_to_right bag clause table =
@@ -241,19 +225,12 @@ module Superposition (B : Terms.Blob) =
           bag clause table
     ;;
 
-    let rec demodulate_old ~jump_to_right bag clause table =
-      match demodulate_once_old ~jump_to_right bag clause table with
-        | None -> bag, clause
-        | Some ((bag, clause),r) -> demodulate_old ~jump_to_right:r
-          bag clause table
-    ;;
-
     let are_alpha_eq cl1 cl2 =
-      let get_term (_,lit,_,_) =
-        match lit with
-          | Terms.Predicate _ -> assert false
-          | Terms.Equation (l,r,ty,_) ->
+      let get_term (_,nlit,plit,_,_) =
+        match nlit,plit with
+          | [], [Terms.Equation (l,r,ty,_),_] ->
               Terms.Node [Terms.Leaf B.eqP; ty; l ; r]
+          | _ -> assert false
       in
         try ignore(Unif.alpha_eq (get_term cl1) (get_term cl2)) ; true
         with FoUnif.UnificationFailure _ -> false
@@ -266,8 +243,8 @@ module Superposition (B : Terms.Blob) =
 (*      in
         if are_alpha_eq c1 c2 then bag1,c1
         else begin
-          prerr_endline (Pp.pp_unit_clause c1);
-          prerr_endline (Pp.pp_unit_clause c2);
+          prerr_endline (Pp.pp_clause c1);
+          prerr_endline (Pp.pp_clause c2);
           prerr_endline "Bag :";
           prerr_endline (Pp.pp_bag bag1);
           assert false
@@ -280,12 +257,11 @@ module Superposition (B : Terms.Blob) =
 
     (* move away *)
     let is_identity_clause ~unify = function
-      | _, Terms.Equation (_,_,_,Terms.Eq), _, _ -> true
-      | _, Terms.Equation (l,r,_,_), vl, proof when unify ->
-          (try ignore(Unif.unification vl [] l r); true
+      | _, [], [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          
+      | _ -> false
     ;;
 
     let build_new_clause bag maxvar filter rule t subst id id2 pos dir =
@@ -311,7 +287,7 @@ module Superposition (B : Terms.Blob) =
        bag, maxvar, res
     ;;
 
-    
+    (* Tries to rewrite an equality to identity, using unit equalities in table *)    
     let rewrite_eq ~unify l r ty vl table =
       let retrieve = if unify then IDX.DT.retrieve_unifiables
       else IDX.DT.retrieve_generalizations in
@@ -320,7 +296,7 @@ module Superposition (B : Terms.Blob) =
       let f b c = 
         let id, dir, l, r, vl = 
           match c with
-            | (d, (id,Terms.Equation (l,r,ty,_),vl,_))-> id, d, l, r, vl
+            | (d,_,_, (id,[],[Terms.Equation (l,r,ty,_),_],vl,_))-> id, d, l, r, vl
             |_ -> assert false 
         in 
         let reverse = (dir = Terms.Left2Right) = b in
@@ -336,23 +312,23 @@ module Superposition (B : Terms.Blob) =
         | [] -> None
         | (id2,dir,c,vl1)::tl ->
             try
-              let subst = Unif.unification (vl@vl1) locked_vars c t in
+              let subst = Unif.unification (* (vl@vl1) *) locked_vars c t in
               Some (id2, dir, subst)
             with FoUnif.UnificationFailure _ -> aux tl
       in
         aux (cands1 @ cands2)
     ;;
 
-    let is_subsumed ~unify bag maxvar (id, lit, vl, _) table =
-      match lit with
-      | Terms.Predicate _ -> assert false
-      | Terms.Equation (l,r,ty,_) -> 
-          match rewrite_eq ~unify l r ty vl table with
+    let is_subsumed ~unify bag maxvar (id, nlit, plit, vl, _) table =
+      match nlit,plit with
+      | [],[Terms.Equation (l,r,ty,_) ,_]-> 
+          (match rewrite_eq ~unify l r ty vl table with
             | None -> None
             | Some (id2, dir, subst) ->
                 let id_t = Terms.Node [ Terms.Leaf B.eqP; ty; r; r ] in
                   build_new_clause bag maxvar (fun _ -> true)
-                  Terms.Superposition id_t subst id id2 [2] dir 
+                  Terms.Superposition id_t subst id id2 [2] dir)
+     | _ -> assert false
     ;;
     let prof_is_subsumed = HExtlib.profile ~enable "is_subsumed";;
     let is_subsumed ~unify bag maxvar c x =
@@ -363,18 +339,19 @@ module Superposition (B : Terms.Blob) =
     let rec deep_eq ~unify l r ty pos contextl contextr table acc =
       match acc with 
       | None -> None
-      | Some(bag,maxvar,(id,lit,vl,p),subst) -> 
+      | Some(bag,maxvar,(id,nlit,plit,vl,p),subst) -> 
           let l = Subst.apply_subst subst l in 
           let r = Subst.apply_subst subst r in 
             try 
-              let subst1 = Unif.unification vl [] l r in
+              let subst1 = Unif.unification (* vl *) [] l r in
               let lit = 
-                match lit with Terms.Predicate _ -> assert false
-                  | Terms.Equation (l,r,ty,o) -> 
+                match nlit,plit with
+                  | [],[Terms.Equation (l,r,ty,o),_] -> 
                      Terms.Equation (FoSubst.apply_subst subst1 l,
                        FoSubst.apply_subst subst1 r, ty, o)
+                  | _ -> assert false
               in
-                Some(bag,maxvar,(id,lit,vl,p),Subst.concat subst1 subst)
+                Some(bag,maxvar,(id,[],[lit,true],vl,p),Subst.concat subst1 subst)
             with FoUnif.UnificationFailure _ -> 
               match rewrite_eq ~unify l r ty vl table with
               | Some (id2, dir, subst1) ->
@@ -419,9 +396,9 @@ module Superposition (B : Terms.Blob) =
 
     let rec orphan_murder bag acc i =
       match Terms.get_from_bag i bag with
-        | (_,_,_,Terms.Exact _),discarded,_ -> (discarded,acc)
-        | (_,_,_,Terms.Step (_,i1,i2,_,_,_)),true,_ -> (true,acc)
-        | (_,_,_,Terms.Step (_,i1,i2,_,_,_)),false,_ ->
+        | (_,_,_,_,Terms.Exact _),discarded,_ -> (discarded,acc)
+        | (_,_,_,_,Terms.Step (_,i1,i2,_,_,_)),true,_ -> (true,acc)
+        | (_,_,_,_,Terms.Step (_,i1,i2,_,_,_)),false,_ ->
             if (List.mem i acc) then (false,acc)
             else match orphan_murder bag acc i1 with
               | (true,acc) -> (true,acc)
@@ -431,10 +408,10 @@ module Superposition (B : Terms.Blob) =
     ;;
 
     let orphan_murder bag actives cl =
-      let (id,_,_,_) = cl in
-      let actives = List.map (fun (i,_,_,_) -> i) actives in
+      let (id,_,_,_,_) = cl in
+      let actives = List.map (fun (i,_,_,_,_) -> i) actives in
       let (res,_) = orphan_murder bag actives id in
-        if res then debug "Orphan murdered"; res
+        if res then debug (lazy "Orphan murdered"); res
     ;;
     let prof_orphan_murder = HExtlib.profile ~enable "orphan_murder";;
     let orphan_murder bag actives x =
@@ -456,7 +433,7 @@ module Superposition (B : Terms.Blob) =
     let simplify table maxvar bag clause =
       match simplify table maxvar bag clause with
         | bag, None ->
-            let (id,_,_,_) = clause in
+            let (id,_,_,_,_) = clause in
             let (_,_,iter) = Terms.get_from_bag id bag in
             Terms.replace_in_bag (clause,true,iter) bag, None
         | bag, Some clause -> bag, Some clause
@@ -474,7 +451,7 @@ module Superposition (B : Terms.Blob) =
       match simplify atable maxvar bag new_clause with
         | bag,None -> bag,None (* new_clause has been discarded *)
         | bag,(Some clause) ->
-            let ctable = IDX.index_unit_clause IDX.DT.empty clause in
+            let ctable = IDX.index_clause IDX.DT.empty clause in
             let bag, alist, atable = 
               List.fold_left 
                 (fun (bag, alist, atable) c ->
@@ -482,7 +459,7 @@ module Superposition (B : Terms.Blob) =
                      |bag,None -> (bag,alist,atable)
                         (* an active clause as been discarded *)
                      |bag,Some c1 ->
-                        bag, c :: alist, IDX.index_unit_clause atable c)
+                        bag, c :: alist, IDX.index_clause atable c)
                 (bag,[],IDX.DT.empty) alist
             in
               bag, Some (clause, (alist,atable))
@@ -495,7 +472,7 @@ module Superposition (B : Terms.Blob) =
     let simplification_step ~new_cl cl (alist,atable) bag maxvar new_clause =
       let atable1 =
         if new_cl then atable else
-        IDX.index_unit_clause atable cl
+        IDX.index_clause atable cl
       in
         (* Simplification of new_clause with :      *
          * - actives and cl if new_clause is not cl *
@@ -506,7 +483,7 @@ module Superposition (B : Terms.Blob) =
           | bag,Some clause ->
               (* Simplification of each active clause with clause *
                * which is the simplified form of new_clause       *)
-              let ctable = IDX.index_unit_clause IDX.DT.empty clause in
+              let ctable = IDX.index_clause IDX.DT.empty clause in
               let bag, newa, alist, atable = 
                 List.fold_left 
                   (fun (bag, newa, alist, atable) c ->
@@ -516,7 +493,7 @@ module Superposition (B : Terms.Blob) =
                        |bag,Some c1 ->
                             if (c1 == c) then 
                               bag, newa, c :: alist,
-                            IDX.index_unit_clause atable c
+                            IDX.index_clause atable c
                             else
                               bag, c1 :: newa, alist, atable)                  
                   (bag,[],[],IDX.DT.empty) alist
@@ -558,7 +535,7 @@ module Superposition (B : Terms.Blob) =
                   | bag,(None, Some _) -> bag,None
                   | bag,(Some cl1, Some (clause, (alist,atable), newa)) ->
                       let alist,atable =
-                        (clause::alist, IDX.index_unit_clause atable clause)
+                        (clause::alist, IDX.index_clause atable clause)
                       in
                         keep_simplified_aux ~new_cl:(cl!=cl1) cl1 (alist,atable)
                           bag (newa@tl)
@@ -579,12 +556,12 @@ module Superposition (B : Terms.Blob) =
       if (is_identity_clause ~unify:true clause)
       then raise (Success (bag, maxvar, clause))
       else   
-        let (id,lit,vl,_) = clause in 
+        let (id,nlit,plit,vl,_) = clause in 
         if vl = [] then Some (bag,clause)
         else
          let l,r,ty = 
-           match lit with
-             | Terms.Equation(l,r,ty,_) -> l,r,ty
+           match nlit,plit with
+             | [],[Terms.Equation(l,r,ty,_),_] -> l,r,ty
              | _ -> assert false 
          in
          match deep_eq ~unify:true l r ty [] (fun x -> x) (fun x -> x) 
@@ -612,17 +589,17 @@ module Superposition (B : Terms.Blob) =
     (* this is OK for both the sup_left and sup_right inference steps *)
     let superposition table varlist subterm pos context =
       let cands = IDX.DT.retrieve_unifiables table subterm in
+      debug (lazy (string_of_int (IDX.ClauseSet.cardinal cands) ^ " candidates found"));
       HExtlib.filter_map
-        (fun (dir, (id,lit,vl,_ (*as uc*))) ->
-           match lit with
-           | Terms.Predicate _ -> assert false
-           | Terms.Equation (l,r,_,o) ->
-               let side, newside = if dir=Terms.Left2Right then l,r else r,l in
+        (fun (dir, _, _, (id,nlit,plit,vl,_ (*as uc*))) ->
+           match nlit,plit with
+           | [],[Terms.Equation (l,r,_,o),_] ->
+               (let side, newside = if dir=Terms.Left2Right then l,r else r,l in
                try 
                  let subst = 
-                   Unif.unification (varlist@vl) [] subterm side 
+                   Unif.unification (* (varlist@vl)*)  [] subterm side 
                  in 
-                 if o = Terms.Incomparable then
+                 if o = Terms.Incomparable || o = Terms.Invertible then
                    let side = Subst.apply_subst subst side in
                    let newside = Subst.apply_subst subst newside in
                    let o = Order.compare_terms side newside in
@@ -636,26 +613,27 @@ module Superposition (B : Terms.Blob) =
                  else
                    Some (context newside, subst, id, pos, dir)
                with FoUnif.UnificationFailure _ -> None)
+            | _ -> assert false)
         (IDX.ClauseSet.elements cands)
     ;;
 
     (* Superposes selected equation with equalities in table *)
-    let superposition_with_table bag maxvar (id,selected,vl,_) table =
-      match selected with 
-      | Terms.Predicate _ -> assert false
-      | Terms.Equation (l,r,ty,Terms.Lt) ->
+    let superposition_with_table bag maxvar (id,nlit,plit,vl,_) table =
+      match nlit,plit with 
+      | [],[Terms.Equation (l,r,ty,Terms.Lt),_] ->
           fold_build_new_clause bag maxvar id Terms.Superposition
             (fun _ -> true)
             (all_positions [3] 
               (fun x -> Terms.Node [ Terms.Leaf B.eqP; ty; l; x ])
               r (superposition table vl))
-      | Terms.Equation (l,r,ty,Terms.Gt) ->
+      | [],[Terms.Equation (l,r,ty,Terms.Invertible),_]
+      | [],[Terms.Equation (l,r,ty,Terms.Gt),_] ->
           fold_build_new_clause bag maxvar id Terms.Superposition
             (fun _ -> true)
             (all_positions [2] 
               (fun x -> Terms.Node [ Terms.Leaf B.eqP; ty; x; r ])
               l (superposition table vl))
-      | Terms.Equation (l,r,ty,Terms.Incomparable) ->
+      | [],[Terms.Equation (l,r,ty,Terms.Incomparable),_] ->
          let filtering avoid subst = (* Riazanov: p.33 condition (iv) *)
            let l = Subst.apply_subst subst l in
            let r = Subst.apply_subst subst r in
@@ -673,8 +651,8 @@ module Superposition (B : Terms.Blob) =
            fold_build_new_clause bag maxvar id Terms.Superposition
               (filtering Terms.Lt)
               (all_positions [2] 
-                (fun x -> Terms.Node [ Terms.Leaf B.eqP; ty; l; x ])
-                r (superposition table vl))
+                (fun x -> Terms.Node [ Terms.Leaf B.eqP; ty; x; r ])
+                l (superposition table vl))
          in
            bag, maxvar, r_terms @ l_terms
       | _ -> assert false
@@ -686,14 +664,14 @@ module Superposition (B : Terms.Blob) =
       (* We demodulate actives clause with current until all *
        * active clauses are reduced w.r.t each other         *)
       (* let bag, (alist,atable) = keep_simplified (alist,atable) bag [current] in *)
-      let ctable = IDX.index_unit_clause IDX.DT.empty current in
+      let ctable = IDX.index_clause IDX.DT.empty current in
       (* let bag, (alist, atable) = 
         let bag, alist = 
           HExtlib.filter_map_acc (simplify ctable) bag alist
         in
-        bag, (alist, List.fold_left IDX.index_unit_clause IDX.DT.empty alist)
+        bag, (alist, List.fold_left IDX.index_clause IDX.DT.empty alist)
       in*)
-        debug "Simplified active clauses with fact";
+        debug (lazy "Simplified active clauses with fact");
       (* We superpose active clauses with current *)
       let bag, maxvar, new_clauses =
         List.fold_left 
@@ -704,14 +682,14 @@ module Superposition (B : Terms.Blob) =
              bag, maxvar, newc @ acc)
           (bag, maxvar, []) alist
       in
-        debug "First superpositions";
+        debug (lazy "First superpositions");
         (* We add current to active clauses so that it can be *
          * superposed with itself                             *)
       let alist, atable = 
-        current :: alist, IDX.index_unit_clause atable current
+        current :: alist, IDX.index_clause atable current
       in
-        debug "Indexed";
-      let fresh_current, maxvar = Utils.fresh_unit_clause maxvar current in
+        debug (lazy "Indexed");
+      let fresh_current, maxvar = Clauses.fresh_clause maxvar current in
         (* We need to put fresh_current into the bag so that all *
          * variables clauses refer to are known.                 *)
       let bag, fresh_current = Terms.add_to_bag fresh_current bag in
@@ -719,14 +697,14 @@ module Superposition (B : Terms.Blob) =
       let bag, maxvar, additional_new_clauses =
         superposition_with_table bag maxvar fresh_current atable 
       in
-        debug "Another superposition";
+        debug (lazy "Another superposition");
       let new_clauses = new_clauses @ additional_new_clauses in
-        debug (Printf.sprintf "Demodulating %d clauses"
-                 (List.length new_clauses));
+        debug (lazy (Printf.sprintf "Demodulating %d clauses"
+                 (List.length new_clauses)));
       let bag, new_clauses = 
         HExtlib.filter_map_monad (simplify atable maxvar) bag new_clauses
       in
-        debug "Demodulated new clauses";
+        debug (lazy "Demodulated new clauses");
       bag, maxvar, (alist, atable), new_clauses
     ;;
 
@@ -737,12 +715,12 @@ module Superposition (B : Terms.Blob) =
 
     let infer_left bag maxvar goal (_alist, atable) =
         (* We superpose the goal with active clauses *)
-     if (match goal with (_,_,[],_) -> true | _ -> false) then bag, maxvar, []
+     if (match goal with (_,_,_,[],_) -> true | _ -> false) then bag, maxvar, []
      else
       let bag, maxvar, new_goals =        
         superposition_with_table bag maxvar goal atable 
       in
-        debug "Superposed goal with active clauses";
+        debug (lazy "Superposed goal with active clauses");
         (* We simplify the new goals with active clauses *)
       let bag, new_goals = 
         List.fold_left
@@ -752,7 +730,7 @@ module Superposition (B : Terms.Blob) =
               | Some (bag,g) -> bag,g::acc)
          (bag, []) new_goals
       in
-        debug "Simplified new goals with active clauses";
+        debug (lazy "Simplified new goals with active clauses");
       bag, maxvar, List.rev new_goals
     ;;