+ let mk_passive (bag,maxvar) = mk_clause bag maxvar;;
+ let mk_goal (bag,maxvar) = mk_clause bag maxvar;;
+
+ (* TODO : global age over facts and goals (without comparing weights) *)
+ let select ~use_age passives g_passives =
+ if is_passive_set_empty passives then begin
+ if (is_passive_set_empty g_passives) then
+ raise (Stop GaveUp) (* we say we are incomplete *)
+ else
+ let g_cl = pick_min_passive ~use_age:use_age g_passives in
+ (true,g_cl,passives,remove_passive_clause g_passives g_cl)
+ end
+ else let cl = pick_min_passive ~use_age:use_age passives in
+ if is_passive_set_empty g_passives then
+ (false,cl,remove_passive_clause passives cl,g_passives)
+ else
+ let g_cl = pick_min_passive ~use_age:use_age g_passives in
+ let (id1,_,_,_,_),(id2,_,_,_,_) = snd cl, snd g_cl in
+ let cmp = if use_age then id1 <= id2
+ else fst cl <= fst g_cl
+ in
+ if cmp then
+ (false,cl,remove_passive_clause passives cl,g_passives)
+ else
+ (true,g_cl,passives,remove_passive_clause g_passives g_cl)
+ ;;
+
+ let backward_infer_step bag maxvar actives passives
+ g_actives g_passives g_current iterno =
+ (* superposition left, simplifications on goals *)
+ debug (lazy "infer_left step...");
+ let bag, maxvar, new_goals =
+ Sup.infer_left bag maxvar g_current actives
+ in
+ debug (lazy "Performed infer_left step");
+ let bag = Terms.replace_in_bag (g_current,false,iterno) bag in
+ bag, maxvar, actives, passives, g_current::g_actives,
+ (add_passive_goals g_passives new_goals)
+ ;;
+
+ let forward_infer_step bag maxvar actives passives g_actives
+ g_passives current iterno =
+ (* forward step *)
+
+ (* e = select P *
+ * e' = demod A e *
+ * A' = demod [e'] A *
+ * A'' = A' + e' *
+ * e'' = fresh e' *
+ * new = supright e'' A'' *
+ * new'= demod A'' new *
+ * P' = P + new' *)
+ debug (lazy "Forward infer step...");
+ debug (lazy("Number of actives : " ^ (string_of_int (List.length (fst actives)))));
+ let bag, maxvar, actives, new_clauses =
+ Sup.infer_right bag maxvar current actives
+ in
+ debug (lazy "Demodulating goals with actives...");
+ (* keep goals demodulated w.r.t. actives and check if solved *)
+ let bag, g_actives =
+ List.fold_left
+ (fun (bag,acc) c ->
+ match
+ Sup.simplify_goal ~no_demod:false maxvar (snd actives) bag acc c
+ with
+ | None -> bag, acc
+ | Some (bag,c1) -> bag,if c==c1 then c::acc else c::c1::acc)
+ (bag,[]) g_actives
+ in
+ let ctable = IDX.index_clause IDX.DT.empty current in
+ let bag, maxvar, new_goals =
+ List.fold_left
+ (fun (bag,m,acc) g ->
+ let bag, m, ng = Sup.infer_left bag m g ([current],ctable) in
+ bag,m,ng@acc)
+ (bag,maxvar,[]) g_actives
+ in
+ let bag = Terms.replace_in_bag (current,false,iterno) bag in
+ bag, maxvar, actives,
+ add_passive_clauses passives new_clauses, g_actives,
+ add_passive_goals g_passives new_goals
+ ;;