Sidekick_smt_solver.SolverMain solver type, user facing.
This is the solver a user of sidekick can see, after instantiating everything. The user can add some theories, clauses, etc. and asks the solver to check satisfiability.
Theory implementors will mostly interact with SOLVER_INTERNAL.
module Check_res = Sidekick_abstract_solver.Check_resmodule Unknown = Sidekick_abstract_solver.Unknownval registry : t -> Registry.tA solver contains a registry so that theories can share data
type theory = Theory.tval mk_theory :
name:string ->
create_and_setup:(id:Theory_id.t -> Solver_internal.t -> 'th) ->
?push_level:('th -> unit) ->
?pop_levels:('th -> int -> unit) ->
unit ->
Theory.tHelper to create a theory.
val stats : t -> Sidekick_util.Stat.tval tst : t -> Sidekick_core.Term.storeval create :
(module Sigs.ARG) ->
?stat:Sidekick_util.Stat.t ->
?size:[ `Big | `Tiny | `Small ] ->
tracer:Tracer.t ->
theories:Theory.t list ->
Sidekick_core.Term.store ->
unit ->
tCreate a new solver.
It needs a term state and a type state to manipulate terms and types. All terms and types interacting with this solver will need to come from these exact states.
val create_default :
?stat:Sidekick_util.Stat.t ->
?size:[ `Big | `Tiny | `Small ] ->
tracer:Tracer.t ->
theories:Theory.t list ->
Sidekick_core.Term.store ->
unit ->
tCreate a new solver with the default CC view, and where all boolean subterms are mapped to boolean atoms.
Add a theory to the solver. This should be called before any call to solve or to add_clause and the likes (otherwise the theory will have a partial view of the problem).
mk_lit_t _ ~sign t returns lit', where lit' is preprocess(lit) and lit is an internal representation of ± t.
The proof of |- lit = lit' is directly added to the solver's proof.
val add_clause : t -> Sigs.lit array -> Sidekick_proof.Pterm.delayed -> unitadd_clause solver cs adds a boolean clause to the solver. Subsequent calls to solve will need to satisfy this clause.
val add_clause_l : t -> Sigs.lit list -> Sidekick_proof.Pterm.delayed -> unitAdd a clause to the solver, given as a list.
Helper that turns each term into an atom, before adding disjunction of the resulting atoms to the solver as a clause assertion
Helper that turns the term into an atom, before adding the result to the solver as a unit clause assertion
type value = Sidekick_core.Term.ttype sat_result = Check_res.sat_result = {get_value : Sidekick_core.Term.t -> value option;Value for this term
*)iter_classes : (Sidekick_core.Term.t Iter.t * value) Iter.t;All equivalence classes in the congruence closure
*)eval_lit : Sidekick_core.Lit.t -> bool option;Evaluate literal
*)iter_true_lits : Sidekick_core.Lit.t Iter.t;Iterate on literals that are true in the trail
*)}Satisfiable
type unsat_result = Check_res.unsat_result = {unsat_core : unit -> Sidekick_core.Lit.t Iter.t;Unsat core (subset of assumptions), or empty
*)unsat_proof : unit -> Sidekick_proof.Step.id option;Proof step for the empty clause
*)}Unsatisfiable
type res = Check_res.t = | Sat of sat_result| Unsat of unsat_result| Unknown of Unknown.tUnknown, obtained after a timeout, memory limit, etc.
*)Result of solving for the current set of clauses
val solve :
?on_exit:(unit -> unit) list ->
?on_progress:(unit -> unit) ->
?should_stop:(int -> bool) ->
assumptions:Sigs.lit list ->
t ->
ressolve s checks the satisfiability of the clauses added so far to s.
val as_asolver : t -> Sidekick_abstract_solver.Asolver.tComply to the abstract solver interface
Last result, if any. Some operations will erase this (e.g. assert_term).
Pushes an assumption onto the assumption stack. It will remain there until it's pop'd by pop_assumptions.
val pop_assumptions : t -> int -> unitpop_assumptions solver n removes n assumptions from the stack. It removes the assumptions that were the most recently added via push_assumptions. Note that check_sat_propagations_only can call this if it meets a conflict.
type propagation_result = | PR_sat| PR_conflict of {}| PR_unsat of {unsat_core : unit -> Sigs.lit Iter.t;}val check_sat_propagations_only :
assumptions:Sigs.lit list ->
t ->
propagation_resultcheck_sat_propagations_only solver uses assumptions (including the assumptions parameter, and atoms previously added via push_assumptions) and boolean+theory propagation to quickly assess satisfiability. It is not complete; calling solve is required to get an accurate result.
val pp_stats : t CCFormat.printerPrint some statistics. What it prints exactly is unspecified.