+ 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 =