mirror of
https://github.com/c-cube/sidekick.git
synced 2025-12-08 12:15:48 -05:00
feat: clause pools in SMT
This commit is contained in:
parent
85c00ecfa2
commit
387ab518c4
3 changed files with 33 additions and 9 deletions
|
|
@ -155,6 +155,15 @@ module type CC_PROOF = sig
|
||||||
of uninterpreted functions. *)
|
of uninterpreted functions. *)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
(** Opaque identifier for clause pools in the SAT solver *)
|
||||||
|
module Clause_pool_id : sig
|
||||||
|
type t = private int
|
||||||
|
val _unsafe_of_int : int -> t
|
||||||
|
end = struct
|
||||||
|
type t = int
|
||||||
|
let _unsafe_of_int x = x
|
||||||
|
end
|
||||||
|
|
||||||
(** Signature for SAT-solver proof emission, using DRUP.
|
(** Signature for SAT-solver proof emission, using DRUP.
|
||||||
|
|
||||||
We do not store the resolution steps, just the stream of clauses deduced.
|
We do not store the resolution steps, just the stream of clauses deduced.
|
||||||
|
|
@ -285,6 +294,7 @@ module type CC_ACTIONS = sig
|
||||||
module Lit : LIT with module T = T
|
module Lit : LIT with module T = T
|
||||||
|
|
||||||
type proof
|
type proof
|
||||||
|
type clause_pool_id = Clause_pool_id.t
|
||||||
type dproof = proof -> unit
|
type dproof = proof -> unit
|
||||||
module P : CC_PROOF with type lit = Lit.t and type t = proof
|
module P : CC_PROOF with type lit = Lit.t and type t = proof
|
||||||
|
|
||||||
|
|
@ -299,6 +309,9 @@ module type CC_ACTIONS = sig
|
||||||
exception).
|
exception).
|
||||||
@param pr the proof of [c] being a tautology *)
|
@param pr the proof of [c] being a tautology *)
|
||||||
|
|
||||||
|
val add_clause : ?pool:clause_pool_id -> t -> Lit.t list -> dproof -> unit
|
||||||
|
(** Learn a lemma *)
|
||||||
|
|
||||||
val propagate : t -> Lit.t -> reason:(unit -> Lit.t list * dproof) -> unit
|
val propagate : t -> Lit.t -> reason:(unit -> Lit.t list * dproof) -> unit
|
||||||
(** [propagate acts lit ~reason pr] declares that [reason() => lit]
|
(** [propagate acts lit ~reason pr] declares that [reason() => lit]
|
||||||
is a tautology.
|
is a tautology.
|
||||||
|
|
@ -645,7 +658,7 @@ module type SOLVER_INTERNAL = sig
|
||||||
type term = T.Term.t
|
type term = T.Term.t
|
||||||
type term_store = T.Term.store
|
type term_store = T.Term.store
|
||||||
type ty_store = T.Ty.store
|
type ty_store = T.Ty.store
|
||||||
type clause_pool
|
type clause_pool_id = Clause_pool_id.t
|
||||||
type proof
|
type proof
|
||||||
type dproof = proof -> unit
|
type dproof = proof -> unit
|
||||||
(** Delayed proof. This is used to build a proof step on demand. *)
|
(** Delayed proof. This is used to build a proof step on demand. *)
|
||||||
|
|
@ -803,6 +816,13 @@ module type SOLVER_INTERNAL = sig
|
||||||
(** Add local clause to the SAT solver. This clause will be
|
(** Add local clause to the SAT solver. This clause will be
|
||||||
removed when the solver backtracks. *)
|
removed when the solver backtracks. *)
|
||||||
|
|
||||||
|
val add_clause_in_pool :
|
||||||
|
pool:clause_pool_id ->
|
||||||
|
t -> theory_actions ->
|
||||||
|
lit list -> dproof -> unit
|
||||||
|
(** Add local clause to the SAT solver. This clause will be
|
||||||
|
removed when the solver backtracks. *)
|
||||||
|
|
||||||
val add_clause_permanent : t -> theory_actions -> lit list -> dproof -> unit
|
val add_clause_permanent : t -> theory_actions -> lit list -> dproof -> unit
|
||||||
(** Add toplevel clause to the SAT solver. This clause will
|
(** Add toplevel clause to the SAT solver. This clause will
|
||||||
not be backtracked. *)
|
not be backtracked. *)
|
||||||
|
|
|
||||||
|
|
@ -82,13 +82,7 @@ type ('lit, 'proof) reason =
|
||||||
type lbool = L_true | L_false | L_undefined
|
type lbool = L_true | L_false | L_undefined
|
||||||
(** Valuation of an atom *)
|
(** Valuation of an atom *)
|
||||||
|
|
||||||
module Clause_pool_id : sig
|
module Clause_pool_id = Sidekick_core.Clause_pool_id
|
||||||
type t = private int
|
|
||||||
val _unsafe_of_int : int -> t
|
|
||||||
end = struct
|
|
||||||
type t = int
|
|
||||||
let _unsafe_of_int x = x
|
|
||||||
end
|
|
||||||
|
|
||||||
(** Actions available to the Plugin
|
(** Actions available to the Plugin
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -63,10 +63,16 @@ module Make(A : ARG)
|
||||||
module Lit = Lit
|
module Lit = Lit
|
||||||
type nonrec proof = proof
|
type nonrec proof = proof
|
||||||
type dproof = proof -> unit
|
type dproof = proof -> unit
|
||||||
|
type clause_pool_id = Sidekick_core.Clause_pool_id.t
|
||||||
type t = sat_acts
|
type t = sat_acts
|
||||||
let[@inline] raise_conflict (a:t) lits (dp:dproof) =
|
let[@inline] raise_conflict (a:t) lits (dp:dproof) =
|
||||||
let (module A) = a in
|
let (module A) = a in
|
||||||
A.raise_conflict lits dp
|
A.raise_conflict lits dp
|
||||||
|
let add_clause ?pool (a:t) lits (dp:dproof) : unit =
|
||||||
|
let (module A) = a in
|
||||||
|
match pool with
|
||||||
|
| None -> A.add_clause ~keep:false lits dp
|
||||||
|
| Some pool -> A.add_clause_in_pool ~pool lits dp
|
||||||
let[@inline] propagate (a:t) lit ~reason =
|
let[@inline] propagate (a:t) lit ~reason =
|
||||||
let (module A) = a in
|
let (module A) = a in
|
||||||
let reason = Sidekick_sat.Consequence reason in
|
let reason = Sidekick_sat.Consequence reason in
|
||||||
|
|
@ -90,7 +96,7 @@ module Make(A : ARG)
|
||||||
type ty = Ty.t
|
type ty = Ty.t
|
||||||
type lit = Lit.t
|
type lit = Lit.t
|
||||||
type term_store = Term.store
|
type term_store = Term.store
|
||||||
type clause_pool
|
type clause_pool_id = Sidekick_core.Clause_pool_id.t
|
||||||
type ty_store = Ty.store
|
type ty_store = Ty.store
|
||||||
|
|
||||||
type th_states =
|
type th_states =
|
||||||
|
|
@ -402,6 +408,10 @@ module Make(A : ARG)
|
||||||
let c = preprocess_clause_ self acts c in
|
let c = preprocess_clause_ self acts c in
|
||||||
add_sat_clause_ self acts ~keep:false c proof
|
add_sat_clause_ self acts ~keep:false c proof
|
||||||
|
|
||||||
|
let[@inline] add_clause_in_pool ~pool self acts c (proof:dproof) : unit =
|
||||||
|
let c = preprocess_clause_ self acts c in
|
||||||
|
add_sat_clause_pool_ self acts ~pool c proof
|
||||||
|
|
||||||
let[@inline] add_clause_permanent self acts c (proof:dproof) : unit =
|
let[@inline] add_clause_permanent self acts c (proof:dproof) : unit =
|
||||||
let c = preprocess_clause_ self acts c in
|
let c = preprocess_clause_ self acts c in
|
||||||
add_sat_clause_ self acts ~keep:true c proof
|
add_sat_clause_ self acts ~keep:true c proof
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue