mirror of
https://github.com/c-cube/sidekick.git
synced 2025-12-06 11:15:43 -05:00
feat(th-bool-static): check for new terms in the CC in final check
This commit is contained in:
parent
d0b9c76629
commit
0031c64ea9
2 changed files with 51 additions and 2 deletions
|
|
@ -186,6 +186,9 @@ module Form = struct
|
||||||
let id = ID.make name in
|
let id = ID.make name in
|
||||||
T.const self.tst @@ Fun.mk_undef_const id ty
|
T.const self.tst @@ Fun.mk_undef_const id ty
|
||||||
end
|
end
|
||||||
|
|
||||||
|
(* NOTE: no plugin produces new boolean formulas *)
|
||||||
|
let check_congruence_classes = false
|
||||||
end
|
end
|
||||||
|
|
||||||
module Subst = struct
|
module Subst = struct
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,12 @@ module type ARG = sig
|
||||||
val mk_bool : S.A.Term.state -> term bool_view -> term
|
val mk_bool : S.A.Term.state -> term bool_view -> term
|
||||||
(** Make a term from the given boolean view *)
|
(** Make a term from the given boolean view *)
|
||||||
|
|
||||||
|
val check_congruence_classes : bool
|
||||||
|
(** Configuration: add final-check handler to verify if new boolean formulas
|
||||||
|
are present in the congruence closure.
|
||||||
|
Only enable if some theories are susceptible to
|
||||||
|
create boolean formulas during the proof search. *)
|
||||||
|
|
||||||
module Gensym : sig
|
module Gensym : sig
|
||||||
type t
|
type t
|
||||||
|
|
||||||
|
|
@ -60,13 +66,12 @@ module Make(A : ARG) : S with module A = A = struct
|
||||||
tst: T.state;
|
tst: T.state;
|
||||||
simps: T.t T.Tbl.t; (* cache *)
|
simps: T.t T.Tbl.t; (* cache *)
|
||||||
cnf: Lit.t T.Tbl.t; (* tseitin CNF *)
|
cnf: Lit.t T.Tbl.t; (* tseitin CNF *)
|
||||||
cnf_ite: T.t T.Tbl.t; (* proxies for "ite" *)
|
|
||||||
gensym: A.Gensym.t;
|
gensym: A.Gensym.t;
|
||||||
}
|
}
|
||||||
|
|
||||||
let create tst : state =
|
let create tst : state =
|
||||||
{ tst; simps=T.Tbl.create 128;
|
{ tst; simps=T.Tbl.create 128;
|
||||||
cnf=T.Tbl.create 128; cnf_ite=T.Tbl.create 32;
|
cnf=T.Tbl.create 128;
|
||||||
gensym=A.Gensym.create tst;
|
gensym=A.Gensym.create tst;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -129,6 +134,16 @@ module Make(A : ARG) : S with module A = A = struct
|
||||||
(* TODO: polarity? *)
|
(* TODO: polarity? *)
|
||||||
let cnf (self:state) (_si:SI.t) ~mk_lit ~add_clause (t:T.t) : T.t option =
|
let cnf (self:state) (_si:SI.t) ~mk_lit ~add_clause (t:T.t) : T.t option =
|
||||||
let rec get_lit (t:T.t) : Lit.t =
|
let rec get_lit (t:T.t) : Lit.t =
|
||||||
|
match T.Tbl.find self.cnf t with
|
||||||
|
| lit -> lit (* cached *)
|
||||||
|
| exception Not_found ->
|
||||||
|
(* compute and cache *)
|
||||||
|
let lit = get_lit_uncached t in
|
||||||
|
if not (T.equal (Lit.term lit) (T.abs self.tst t |> fst)) then (
|
||||||
|
T.Tbl.add self.cnf t lit;
|
||||||
|
);
|
||||||
|
lit
|
||||||
|
and get_lit_uncached t : Lit.t =
|
||||||
match A.view_as_bool t with
|
match A.view_as_bool t with
|
||||||
| B_bool b -> mk_lit (T.bool self.tst b)
|
| B_bool b -> mk_lit (T.bool self.tst b)
|
||||||
| B_opaque_bool t -> mk_lit t
|
| B_opaque_bool t -> mk_lit t
|
||||||
|
|
@ -175,11 +190,42 @@ module Make(A : ARG) : S with module A = A = struct
|
||||||
let u = if Lit.sign lit then u else A.mk_bool self.tst (B_not u) in
|
let u = if Lit.sign lit then u else A.mk_bool self.tst (B_not u) in
|
||||||
if T.equal u t then None else Some u
|
if T.equal u t then None else Some u
|
||||||
|
|
||||||
|
(* check if new terms were added to the congruence closure, that can be turned
|
||||||
|
into clauses *)
|
||||||
|
let check_new_terms (self:state) si (acts:SI.actions) (_trail:_ Iter.t) : unit =
|
||||||
|
let cc_ = SI.cc si in
|
||||||
|
let all_terms =
|
||||||
|
let open SI in
|
||||||
|
CC.all_classes cc_
|
||||||
|
|> Iter.flat_map CC.N.iter_class
|
||||||
|
|> Iter.map CC.N.term
|
||||||
|
in
|
||||||
|
let cnf_of t =
|
||||||
|
cnf self si t
|
||||||
|
~mk_lit:(SI.mk_lit si acts) ~add_clause:(SI.add_clause_permanent si acts)
|
||||||
|
in
|
||||||
|
begin
|
||||||
|
all_terms
|
||||||
|
(fun t -> match cnf_of t with
|
||||||
|
| None -> ()
|
||||||
|
| Some u ->
|
||||||
|
Log.debugf 5
|
||||||
|
(fun k->k "(@[th-bool-static.final-check.cnf@ %a@ :yields %a@])"
|
||||||
|
T.pp t T.pp u);
|
||||||
|
SI.CC.merge_t cc_ t u (SI.CC.Expl.mk_list []);
|
||||||
|
());
|
||||||
|
end;
|
||||||
|
()
|
||||||
|
|
||||||
let create_and_setup si =
|
let create_and_setup si =
|
||||||
Log.debug 2 "(th-bool.setup)";
|
Log.debug 2 "(th-bool.setup)";
|
||||||
let st = create (SI.tst si) in
|
let st = create (SI.tst si) in
|
||||||
SI.add_simplifier si (simplify st);
|
SI.add_simplifier si (simplify st);
|
||||||
SI.add_preprocess si (cnf st);
|
SI.add_preprocess si (cnf st);
|
||||||
|
if A.check_congruence_classes then (
|
||||||
|
Log.debug 5 "(th-bool.add-final-check)";
|
||||||
|
SI.on_final_check si (check_new_terms st);
|
||||||
|
);
|
||||||
st
|
st
|
||||||
|
|
||||||
let theory =
|
let theory =
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue