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 _ = ();;
;;
(* 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
in
bag, maxvar, res
;;
-
let rewrite_eq ~unify l r ty vl table =
let retrieve = if unify then IDX.DT.retrieve_unifiables
(* 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
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
- if vl = [] then Some (bag,clause)
+ (* this optimization makes sense only if we demodulated, since in
+ that case the clause should have been turned into an identity *)
+ if (vl = [] && not(no_demod))
+ then Some (bag,clause)
else
let l,r,ty =
match lit with
table (Some(bag,maxvar,clause,Subst.id_subst)) with
| None -> Some (bag,clause)
| Some (bag,maxvar,cl,subst) ->
- prerr_endline "Goal subsumed";
- raise (Success (bag,maxvar,cl))
+ debug (lazy "Goal subsumed");
+ raise (Success (bag,maxvar,cl,subst))
(*
- else match is_subsumed ~unify:true bag maxvar clause table with
+ match is_subsumed ~unify:true bag maxvar clause table with
| None -> Some (bag, clause)
| Some ((bag,maxvar),c) ->
prerr_endline "Goal subsumed";
raise (Success (bag,maxvar,c))
-*)
+*)
;;
let prof_simplify_goal = HExtlib.profile ~enable "simplify_goal";;