+
+ module AgeOrderedPassives =
+ struct
+ type t = B.t Terms.passive_clause
+ let compare = Utils.compare_passive_clauses_age
+ end
+
+ module WeightPassiveSet = Set.Make(WeightOrderedPassives)
+ module AgePassiveSet = Set.Make(AgeOrderedPassives)
+
+ type t = B.t
+ type input = B.input
+ type bag = B.t Terms.bag * int
+ type szsontology =
+ | Unsatisfiable of
+ (B.t Terms.bag * int * B.t Terms.substitution * int list) list
+ | GaveUp
+ | Error of string
+ | Timeout of int * B.t Terms.bag
+ exception Stop of szsontology
+ type state =
+ t Terms.bag
+ * int
+ * Index.Index(B).active_set
+ * (IDX.DT.t * WeightPassiveSet.t * AgePassiveSet.t)
+ * B.t Terms.unit_clause list
+ * (WeightPassiveSet.t * AgePassiveSet.t)
+
+ let empty_state =
+ Terms.empty_bag,
+ 0,
+ ([],IDX.DT.empty),
+ (IDX.DT.empty,WeightPassiveSet.empty,AgePassiveSet.empty),
+ [],
+ (WeightPassiveSet.empty,AgePassiveSet.empty)
+ ;;
+
+ let bag_of_state (bag,n,_,_,_,_) = bag,n
+ ;;
+
+ let replace_bag (_,_,a,b,c,d) (bag,n) = bag,n,a,b,c,d
+ ;;
+
+ let add_passive_clause ?(no_weight=false)
+ (passive_t,passives_w,passives_a) cl =
+ let pcl = if no_weight then (0,cl)
+ else Utils.mk_passive_clause cl in
+ IDX.index_unit_clause passive_t cl,
+ WeightPassiveSet.add pcl passives_w,
+ AgePassiveSet.add pcl passives_a
+ ;;
+
+ let add_passive_goal ?(no_weight=false) (passives_w,passives_a) g =
+ let g = if no_weight then (0,g)
+ else Utils.mk_passive_goal g in
+ WeightPassiveSet.add g passives_w, AgePassiveSet.add g passives_a
+ ;;
+
+ let remove_passive_clause (passive_t,passives_w,passives_a) cl =
+ let passive_t = IDX.remove_unit_clause passive_t (snd cl) in
+ let passives_w = WeightPassiveSet.remove cl passives_w in
+ let passives_a = AgePassiveSet.remove cl passives_a in
+ passive_t,passives_w,passives_a
+ ;;
+
+ let add_passive_clauses ?(no_weight=false) =
+ List.fold_left (add_passive_clause ~no_weight)
+ ;;
+
+ let add_passive_goals ?(no_weight=false)
+ (passives_w,passives_a) new_clauses =
+ let new_clauses_w,new_clauses_a =
+ List.fold_left (add_passive_goal ~no_weight)
+ (WeightPassiveSet.empty,AgePassiveSet.empty) new_clauses
+ in
+ (WeightPassiveSet.union new_clauses_w passives_w,
+ AgePassiveSet.union new_clauses_a passives_a)
+ ;;
+
+ let remove_passive_goal (passives_w,passives_a) cl =
+ let passives_w = WeightPassiveSet.remove cl passives_w in
+ let passives_a = AgePassiveSet.remove cl passives_a in
+ passives_w,passives_a
+ ;;
+
+ let is_passive_set_empty (_,passives_w,passives_a) =
+ if (WeightPassiveSet.is_empty passives_w) then begin
+ assert (AgePassiveSet.is_empty passives_a); true
+ end else begin
+ assert (not (AgePassiveSet.is_empty passives_a)); false
+ end
+ ;;
+
+ let is_passive_g_set_empty (passives_w,passives_a) =
+ if (WeightPassiveSet.is_empty passives_w) then begin
+ assert (AgePassiveSet.is_empty passives_a); true
+ end else begin
+ assert (not (AgePassiveSet.is_empty passives_a)); false
+ end
+ ;;
+
+ let passive_set_cardinal (_,passives_w,_)
+ = WeightPassiveSet.cardinal passives_w
+ ;;
+
+ let g_passive_set_cardinal (passives_w,_)
+ = WeightPassiveSet.cardinal passives_w
+ ;;
+
+ let passive_empty_set =
+ (IDX.DT.empty,WeightPassiveSet.empty,AgePassiveSet.empty)
+ ;;
+
+ let g_passive_empty_set =
+ (WeightPassiveSet.empty,AgePassiveSet.empty)
+ ;;
+
+ let pick_min_passive ~use_age (_,passives_w,passives_a) =
+ if use_age then AgePassiveSet.min_elt passives_a
+ else WeightPassiveSet.min_elt passives_w
+ ;;
+
+ let pick_min_g_passive ~use_age (passives_w,passives_a) =
+ if use_age then AgePassiveSet.min_elt passives_a
+ else WeightPassiveSet.min_elt passives_w
+ ;;
+
+ let mk_unit_clause bag maxvar (t,ty) =
+ let c, maxvar = Utils.mk_unit_clause maxvar (B.embed ty) (B.embed t) in
+ let bag, c = Terms.add_to_bag c bag in
+ (bag, maxvar), c
+ ;;
+
+ let mk_clause bag maxvar (t,ty) =
+ let (proof,ty) = B.saturate t ty in
+ let c, maxvar = Utils.mk_unit_clause maxvar ty proof in
+ let bag, c = Terms.add_to_bag c bag in
+ (bag, maxvar), c
+ ;;
+
+ let mk_passive (bag,maxvar) = mk_clause bag maxvar;;
+
+ let mk_goal (bag,maxvar) = mk_clause bag maxvar;;
+
+ let initialize_goal (bag,maxvar,actives,passives,_,_) t =
+ let (bag,maxvar), g = mk_unit_clause bag maxvar t in
+ let g_passives = g_passive_empty_set in
+ (* if the goal is not an equation we returns an empty
+ passive set *)
+ let g_passives =
+ if Terms.is_eq_clause g then add_passive_goal g_passives g
+ else g_passives
+ in
+ (bag,maxvar,actives,passives,[],g_passives)
+
+
+ (* 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_g_set_empty g_passives) then
+ raise (Stop GaveUp) (* we say we are incomplete *)
+ else
+ let g_cl = pick_min_g_passive ~use_age:use_age g_passives in
+ (true,g_cl,passives,remove_passive_goal g_passives g_cl)
+ end
+ else let cl = pick_min_passive ~use_age:use_age passives in
+ if is_passive_g_set_empty g_passives then
+ (false,cl,remove_passive_clause passives cl,g_passives)
+ else
+ let g_cl = pick_min_g_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_goal 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 pp_clauses actives passives =
+ let actives_l, _ = actives in
+ let passive_t,_,_ = passives in
+ let wset = IDX.elems passive_t in
+ ("Actives :" ^ (String.concat ";\n"
+ (List.map Pp.pp_unit_clause actives_l)))
+ ^
+ ("Passives:" ^(String.concat ";\n"
+ (List.map (fun (_,cl) -> Pp.pp_unit_clause cl)
+ (IDX.ClauseSet.elements wset))))
+ ;;
+
+ let forward_infer_step
+ ((bag,maxvar,actives,passives,g_actives,g_passives) as s)
+ current iterno =
+ (* forward step *)