mirror of
https://github.com/c-cube/sidekick.git
synced 2025-12-08 12:15:48 -05:00
wip: theories
This commit is contained in:
parent
44259ec5fc
commit
fc80d8c6e9
3 changed files with 19 additions and 21 deletions
|
|
@ -38,9 +38,9 @@ module Make(A : ARG) : S with module A = A = struct
|
||||||
let merge x _ = x
|
let merge x _ = x
|
||||||
end
|
end
|
||||||
|
|
||||||
type t = {
|
let k = SI.Key.create (module Data)
|
||||||
k: data SI.Key.t;
|
|
||||||
}
|
type t = unit
|
||||||
|
|
||||||
let on_merge (solver:SI.t) n1 tc1 n2 tc2 e_n1_n2 : unit =
|
let on_merge (solver:SI.t) n1 tc1 n2 tc2 e_n1_n2 : unit =
|
||||||
Log.debugf 5
|
Log.debugf 5
|
||||||
|
|
@ -69,10 +69,9 @@ module Make(A : ARG) : S with module A = A = struct
|
||||||
| _ -> None
|
| _ -> None
|
||||||
|
|
||||||
let create_and_setup (solver:SI.t) : t =
|
let create_and_setup (solver:SI.t) : t =
|
||||||
let k = SI.Key.create solver (module Data) in
|
|
||||||
SI.on_cc_merge solver ~k on_merge;
|
SI.on_cc_merge solver ~k on_merge;
|
||||||
SI.on_cc_new_term solver ~k on_new_term;
|
SI.on_cc_new_term solver ~k on_new_term;
|
||||||
{k}
|
()
|
||||||
|
|
||||||
let theory = A.S.mk_theory ~name ~create_and_setup ()
|
let theory = A.S.mk_theory ~name ~create_and_setup ()
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -62,9 +62,11 @@ module Make(A : ARG) : S with module A = A = struct
|
||||||
m1 m2
|
m1 m2
|
||||||
in ()
|
in ()
|
||||||
|
|
||||||
|
let k = SI.Key.create (module Data)
|
||||||
|
|
||||||
module T_tbl = CCHashtbl.Make(T)
|
module T_tbl = CCHashtbl.Make(T)
|
||||||
|
|
||||||
type t = {
|
type t = {
|
||||||
k: Data.t SI.Key.t;
|
|
||||||
expanded: unit T_tbl.t; (* negative "distinct" that have been case-split on *)
|
expanded: unit T_tbl.t; (* negative "distinct" that have been case-split on *)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -79,7 +81,7 @@ module Make(A : ARG) : S with module A = A = struct
|
||||||
subs
|
subs
|
||||||
(fun sub ->
|
(fun sub ->
|
||||||
let n = SI.cc_add_term solver sub in
|
let n = SI.cc_add_term solver sub in
|
||||||
SI.cc_add_data solver n ~k:self.k (IM.singleton lit sub));
|
SI.cc_add_data solver n ~k (IM.singleton lit sub));
|
||||||
) else if not @@ T_tbl.mem self.expanded lit_t then (
|
) else if not @@ T_tbl.mem self.expanded lit_t then (
|
||||||
(* add clause [distinct t1…tn ∨ ∨_{i,j>i} t_i=j] *)
|
(* add clause [distinct t1…tn ∨ ∨_{i,j>i} t_i=j] *)
|
||||||
T_tbl.add self.expanded lit_t ();
|
T_tbl.add self.expanded lit_t ();
|
||||||
|
|
@ -104,8 +106,7 @@ module Make(A : ARG) : S with module A = A = struct
|
||||||
| Some subs -> process_lit st solver lit t subs)
|
| Some subs -> process_lit st solver lit t subs)
|
||||||
|
|
||||||
let create_and_setup (solver:SI.t) : t =
|
let create_and_setup (solver:SI.t) : t =
|
||||||
let k = SI.Key.create solver (module Data) in
|
let self = { expanded=T_tbl.create 8; } in
|
||||||
let self = { expanded=T_tbl.create 8; k; } in
|
|
||||||
SI.on_cc_merge solver ~k on_merge;
|
SI.on_cc_merge solver ~k on_merge;
|
||||||
SI.on_final_check solver (partial_check self);
|
SI.on_final_check solver (partial_check self);
|
||||||
self
|
self
|
||||||
|
|
|
||||||
|
|
@ -42,16 +42,16 @@ module Make(A : ARG)
|
||||||
let merge = A.T_set.union
|
let merge = A.T_set.union
|
||||||
end
|
end
|
||||||
|
|
||||||
type t = {
|
let k = Solver.Key.create (module Data)
|
||||||
k: Data.t Solver.Key.t;
|
|
||||||
}
|
|
||||||
|
|
||||||
let on_merge (self:t) (solver:Solver.t) n1 n2 e_n1_n2 : unit =
|
type t = unit
|
||||||
|
|
||||||
|
let on_merge (solver:Solver.t) n1 n2 e_n1_n2 : unit =
|
||||||
Log.debugf 5
|
Log.debugf 5
|
||||||
(fun k->k "(@[th-ite.on_merge@ :c1 %a@ :c2 %a@])" N.pp n1 N.pp n2);
|
(fun k->k "(@[th-ite.on_merge@ :c1 %a@ :c2 %a@])" N.pp n1 N.pp n2);
|
||||||
(* check if [n1] has some [ite] parents, and if [n2] is true/false *)
|
(* check if [n1] has some [ite] parents, and if [n2] is true/false *)
|
||||||
let check_ n1 n2 =
|
let check_ n1 n2 =
|
||||||
match Solver.cc_data solver ~k:self.k n1, A.view_as_ite (N.term n2) with
|
match Solver.cc_data solver ~k n1, A.view_as_ite (N.term n2) with
|
||||||
| Some set, T_bool n2_true ->
|
| Some set, T_bool n2_true ->
|
||||||
assert (not @@ A.T_set.is_empty set);
|
assert (not @@ A.T_set.is_empty set);
|
||||||
A.T_set.iter
|
A.T_set.iter
|
||||||
|
|
@ -77,21 +77,19 @@ module Make(A : ARG)
|
||||||
check_ n2 n1;
|
check_ n2 n1;
|
||||||
()
|
()
|
||||||
|
|
||||||
let on_new_term (self:t) (solver:Solver.t) _n (t:T.t) =
|
let on_new_term (solver:Solver.t) _n (t:T.t) =
|
||||||
match A.view_as_ite t with
|
match A.view_as_ite t with
|
||||||
| T_ite (a,_,_) ->
|
| T_ite (a,_,_) ->
|
||||||
(* add [t] to parents of [a] *)
|
(* add [t] to parents of [a] *)
|
||||||
let n_a = Solver.cc_find solver @@ Solver.cc_add_term solver a in
|
let n_a = Solver.cc_find solver @@ Solver.cc_add_term solver a in
|
||||||
Solver.cc_add_data solver n_a ~k:self.k (A.T_set.singleton t);
|
Solver.cc_add_data solver n_a ~k (A.T_set.singleton t);
|
||||||
None
|
None
|
||||||
| _ -> None
|
| _ -> None
|
||||||
|
|
||||||
let create_and_setup (solver:Solver.t) : t =
|
let create_and_setup (solver:Solver.t) : t =
|
||||||
let k = Solver.Key.create solver (module Data) in
|
Solver.on_cc_merge_all solver on_merge;
|
||||||
let self = {k} in
|
Solver.on_cc_new_term solver ~k on_new_term;
|
||||||
Solver.on_cc_merge_all solver (on_merge self);
|
()
|
||||||
Solver.on_cc_new_term solver ~k (on_new_term self);
|
|
||||||
self
|
|
||||||
|
|
||||||
let theory = A.S.mk_theory ~name:"ite" ~create_and_setup ()
|
let theory = A.S.mk_theory ~name:"ite" ~create_and_setup ()
|
||||||
end
|
end
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue