]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/software/components/ng_paramodulation/superposition.ml
First compiling version
[helm.git] / helm / software / components / ng_paramodulation / superposition.ml
index f69de41f553929765cc3e0cd393211939e38b2e2..0dbac61c3be98ac41ab5f212727a5f8a3be946e2 100644 (file)
@@ -20,7 +20,7 @@ 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.clause
 
     let debug s = prerr_endline s;;
     let debug _ = ();;
@@ -81,7 +81,7 @@ module Superposition (B : Orderings.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 +92,11 @@ module Superposition (B : Orderings.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 +113,7 @@ module Superposition (B : Orderings.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
@@ -136,78 +137,49 @@ module Superposition (B : Orderings.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 = 
-                   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 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)
@@ -216,12 +188,14 @@ module Superposition (B : Orderings.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,_] ->
+      (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
@@ -238,7 +212,8 @@ module Superposition (B : Orderings.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 =
@@ -248,19 +223,12 @@ module Superposition (B : Orderings.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
@@ -273,8 +241,8 @@ module Superposition (B : Orderings.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
@@ -287,12 +255,12 @@ module Superposition (B : Orderings.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          
+      | _, [], [Terms.Equation (_,_,_,_),_], _, _ -> false
+      | _ -> assert false
     ;;
 
     let build_new_clause bag maxvar filter rule t subst id id2 pos dir =
@@ -318,7 +286,7 @@ module Superposition (B : Orderings.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
@@ -327,7 +295,7 @@ module Superposition (B : Orderings.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
@@ -343,23 +311,23 @@ module Superposition (B : Orderings.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 =
@@ -370,18 +338,19 @@ module Superposition (B : Orderings.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) ->
@@ -426,9 +395,9 @@ module Superposition (B : Orderings.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)
@@ -438,8 +407,8 @@ module Superposition (B : Orderings.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
     ;;
@@ -463,7 +432,7 @@ module Superposition (B : Orderings.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
@@ -481,7 +450,7 @@ module Superposition (B : Orderings.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 ->
@@ -489,7 +458,7 @@ module Superposition (B : Orderings.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))
@@ -502,7 +471,7 @@ module Superposition (B : Orderings.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 *
@@ -513,7 +482,7 @@ module Superposition (B : Orderings.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 ->
@@ -523,7 +492,7 @@ module Superposition (B : Orderings.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
@@ -565,7 +534,7 @@ module Superposition (B : Orderings.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)
@@ -586,12 +555,12 @@ module Superposition (B : Orderings.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) 
@@ -620,16 +589,15 @@ module Superposition (B : Orderings.Blob) =
     let superposition table varlist subterm pos context =
       let cands = IDX.DT.retrieve_unifiables table subterm in
       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
@@ -643,26 +611,27 @@ module Superposition (B : Orderings.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
@@ -680,8 +649,8 @@ module Superposition (B : Orderings.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
@@ -693,12 +662,12 @@ module Superposition (B : Orderings.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";
       (* We superpose active clauses with current *)
@@ -715,10 +684,10 @@ module Superposition (B : Orderings.Blob) =
         (* 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
+      let fresh_current, maxvar = Utils.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
@@ -728,8 +697,8 @@ module Superposition (B : Orderings.Blob) =
       in
         debug "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
@@ -744,7 +713,7 @@ module Superposition (B : Orderings.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