-
- (* 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 "Forward infer step...";
- let bag, maxvar, actives, passives, g_passives =
- let rec aux_simplify passives =
- match select passives with
- | None -> assert false
- | Some (current, passives) ->
- debug ("Selected fact : " ^ Pp.pp_unit_clause current);
- match Sup.keep_simplified current actives bag with
- (* match Sup.one_pass_simplification current actives bag with *)
- | None -> aux_simplify passives
- | Some x -> x,passives
- in
- let (current, bag, actives),passives = aux_simplify passives
- in
- debug ("Fact after simplification :"
- ^ Pp.pp_unit_clause current);
- let bag, maxvar, actives, new_clauses =
- Sup.infer_right bag maxvar current actives
- in
- debug "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 ->
- let bag, c = Sup.simplify_goal maxvar (snd actives) bag c in
- bag, c::acc)
- (bag,[]) g_actives
- in
- let ctable = IDX.index_unit_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 maxvar g
- ([current],ctable) in
- bag,m,ng@acc)
- (bag,maxvar,[]) g_actives
- in
- let new_clauses = List.fold_left add_passive_clause
- PassiveSet.empty new_clauses in
- let new_goals = List.fold_left add_passive_clause
- PassiveSet.empty new_goals in
- bag, maxvar, actives,
- PassiveSet.union new_clauses passives,
- PassiveSet.union new_goals g_passives
- in
- prerr_endline