exception Success of B.t Terms.bag * int * B.t Terms.unit_clause
- let debug s =
- () (* prerr_endline s *)
- ;;
+(* let debug s = prerr_endline s;;*)
+ let debug _ = ();;
let rec list_first f = function
| [] -> None
| _,_ -> None
;;
+ let rec orphan_murder bag acc i =
+ match Terms.M.find i bag with
+ | (_,_,_,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)
+ | (false,acc) ->
+ let (res,acc) = orphan_murder bag acc i2 in
+ if res then res,acc else res,i::acc
+;;
+
+ let orphan_murder bag cl =
+ let (id,_,_,_) = cl in
+ let (res,_) = orphan_murder bag [] id in
+ if res then debug "Orphan murdered"; res
+;;
+
(* demodulate and check for subsumption *)
let simplify table maxvar bag clause =
- let bag, clause = demodulate bag clause table in
+ if is_identity_clause ~unify:false clause then bag,None
+ (* else if orphan_murder bag clause then bag,None *)
+ else let bag, clause = demodulate bag clause table in
if is_identity_clause ~unify:false clause then bag,None
else
match is_subsumed ~unify:false bag maxvar clause table with
| Some _ -> bag, None
;;
+ let simplify table maxvar bag clause =
+ match simplify table maxvar bag clause with
+ | bag, None -> let (id,_,_,_) = clause in
+ Terms.M.add id (clause,true) bag, None
+ | bag, Some clause -> bag, Some clause
+;;
+
let one_pass_simplification new_clause (alist,atable) bag maxvar =
match simplify atable maxvar bag new_clause with
- | bag,None -> None (* new_clause has been discarded *)
+ | bag,None -> bag,None (* new_clause has been discarded *)
| bag,(Some clause) ->
let ctable = IDX.index_unit_clause IDX.DT.empty clause in
let bag, alist, atable =
List.fold_left
- (fun (bag, alist, atable as acc) c ->
+ (fun (bag, alist, atable) c ->
match simplify ctable maxvar bag c with
- |bag,None -> acc (* an active clause as been discarded *)
+ |bag,None -> (bag,alist,atable)
+ (* an active clause as been discarded *)
|bag,Some c1 ->
bag, c :: alist, IDX.index_unit_clause atable c)
(bag,[],IDX.DT.empty) alist
in
- Some (clause, bag, (alist,atable))
+ bag, Some (clause, (alist,atable))
;;
let simplification_step ~new_cl cl (alist,atable) bag maxvar new_clause =
* - actives and cl if new_clause is not cl *
* - only actives otherwise *)
match simplify atable1 maxvar bag new_clause with
- | bag,None -> (Some cl, None) (* new_clause has been discarded *)
+ | bag,None -> bag,(Some cl, None) (* new_clause has been discarded *)
| 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 bag, newa, alist, atable =
List.fold_left
- (fun (bag, newa, alist, atable as acc) c ->
+ (fun (bag, newa, alist, atable) c ->
match simplify ctable maxvar bag c with
- |bag,None -> acc (* an active clause as been discarded *)
+ |bag,None -> (bag, newa, alist, atable)
+ (* an active clause as been discarded *)
|bag,Some c1 ->
if (c1 == c) then
bag, newa, c :: alist,
(bag,[],[],IDX.DT.empty) alist
in
if new_cl then
- (Some cl, Some (clause, (alist,atable), newa, bag))
+ bag, (Some cl, Some (clause, (alist,atable), newa))
else
(* if new_clause is not cl, we simplify cl with clause *)
match simplify ctable maxvar bag cl with
| bag,None ->
(* cl has been discarded *)
- (None, Some (clause, (alist,atable), newa, bag))
+ bag,(None, Some (clause, (alist,atable), newa))
| bag,Some cl1 ->
- (Some cl1, Some (clause, (alist,atable), newa, bag))
+ bag,(Some cl1, Some (clause, (alist,atable), newa))
;;
let keep_simplified cl (alist,atable) bag maxvar =
let rec keep_simplified_aux ~new_cl cl (alist,atable) bag newc =
if new_cl then
match simplification_step ~new_cl cl (alist,atable) bag maxvar cl with
- | (None, _) -> assert false
- | (Some _, None) -> None
- | (Some _, Some (clause, (alist,atable), newa, bag)) ->
+ | _,(None, _) -> assert false
+ | bag,(Some _, None) -> bag,None
+ | bag,(Some _, Some (clause, (alist,atable), newa)) ->
keep_simplified_aux ~new_cl:(cl!=clause) clause (alist,atable)
bag (newa@newc)
else
match newc with
- | [] -> Some (cl, bag, (alist,atable))
+ | [] -> bag, Some (cl, (alist,atable))
| hd::tl ->
match simplification_step ~new_cl cl
(alist,atable) bag maxvar hd with
- | (None,None) -> assert false
- | (Some _,None) ->
+ | _,(None,None) -> assert false
+ | bag,(Some _,None) ->
keep_simplified_aux ~new_cl cl (alist,atable) bag tl
- | (None, Some _) -> None
- | (Some cl1, Some (clause, (alist,atable), newa, bag)) ->
+ | bag,(None, Some _) -> bag,None
+ | bag,(Some cl1, Some (clause, (alist,atable), newa)) ->
let alist,atable =
(clause::alist, IDX.index_unit_clause atable clause)
in