Module Solver.Solver_internal
Internal solver, available to theories.
module T = Tmodule P = Ptype ty= T.Ty.ttype term= T.Term.ttype term_state= T.Term.statetype ty_state= T.Ty.statetype proof= P.ttype tMain type for a solver
type solver= t
val tst : t -> term_stateval ty_st : t -> ty_stateval stats : t -> Sidekick_util.Stat.t
Actions for the theories
module Lit = Lit
type lit= Lit.t
Proof helpers
Congruence Closure
Simplifiers
module Simplify : sig ... endSimplify terms
type simplify_hook= Simplify.hook
val add_simplifier : t -> Simplify.hook -> unitAdd a simplifier hook for preprocessing.
val simplifier : t -> Simplify.tval simplify_t : t -> term -> (term * proof) optionSimplify input term, returns
Some (u, |- t=u)if some simplification occurred.
val simp_t : t -> term -> term * proofsimp_t si treturnsu, |- t=ueven if no simplification occurred (in which caset == usyntactically). (seesimplifier)
hooks for the theory
val push_decision : t -> actions -> lit -> unitAsk the SAT solver to decide the given literal in an extension of the current trail. This is useful for theory combination. If the SAT solver backtracks, this (potential) decision is removed and forgotten.
val propagate : t -> actions -> lit -> reason:(unit -> lit list * proof) -> unitPropagate a boolean using a unit clause.
expl => litmust be a theory lemma, that is, a T-tautology
val propagate_l : t -> actions -> lit -> lit list -> proof -> unitPropagate a boolean using a unit clause.
expl => litmust be a theory lemma, that is, a T-tautology
val add_clause_temp : t -> actions -> lit list -> proof -> unitAdd local clause to the SAT solver. This clause will be removed when the solver backtracks.
val add_clause_permanent : t -> actions -> lit list -> proof -> unitAdd toplevel clause to the SAT solver. This clause will not be backtracked.
val mk_lit : t -> actions -> ?sign:bool -> term -> litCreate a literal. This automatically preprocesses the term.
val preprocess_term : t -> add_clause:(Lit.t list -> proof -> unit) -> term -> term * proofPreprocess a term.
val add_lit : t -> actions -> lit -> unitAdd the given literal to the SAT solver, so it gets assigned a boolean value
val add_lit_t : t -> actions -> ?sign:bool -> term -> unitAdd the given (signed) bool term to the SAT solver, so it gets assigned a boolean value
val cc_raise_conflict_expl : t -> actions -> CC.Expl.t -> 'aRaise a conflict with the given congruence closure explanation. it must be a theory tautology that
expl ==> absurd. To be used in theories.
val cc_merge : t -> actions -> CC.N.t -> CC.N.t -> CC.Expl.t -> unitMerge these two nodes in the congruence closure, given this explanation. It must be a theory tautology that
expl ==> n1 = n2. To be used in theories.
val cc_merge_t : t -> actions -> term -> term -> CC.Expl.t -> unitMerge these two terms in the congruence closure, given this explanation. See
cc_merge
val cc_add_term : t -> term -> CC.N.tAdd/retrieve congruence closure node for this term. To be used in theories
val cc_mem_term : t -> term -> boolReturn
trueif the term is explicitly in the congruence closure. To be used in theories
val on_cc_pre_merge : t -> (CC.t -> actions -> CC.N.t -> CC.N.t -> CC.Expl.t -> unit) -> unitCallback for when two classes containing data for this key are merged (called before)
val on_cc_post_merge : t -> (CC.t -> actions -> CC.N.t -> CC.N.t -> unit) -> unitCallback for when two classes containing data for this key are merged (called after)
val on_cc_new_term : t -> (CC.t -> CC.N.t -> term -> unit) -> unitCallback to add data on terms when they are added to the congruence closure
val on_cc_is_subterm : t -> (CC.N.t -> term -> unit) -> unitCallback for when a term is a subterm of another term in the congruence closure
val on_cc_conflict : t -> (CC.t -> th:bool -> lit list -> unit) -> unitCallback called on every CC conflict
val on_cc_propagate : t -> (CC.t -> lit -> (unit -> lit list * proof) -> unit) -> unitCallback called on every CC propagation
val on_partial_check : t -> (t -> actions -> lit Iter.t -> unit) -> unitRegister callbacked to be called with the slice of literals newly added on the trail.
This is called very often and should be efficient. It doesn't have to be complete, only correct. It's given only the slice of the trail consisting in new literals.
Preprocessors
These preprocessors turn mixed, raw literals (possibly simplified) into literals suitable for reasoning. Typically some clauses are also added to the solver.
type preprocess_hook= t -> mk_lit:(term -> lit) -> add_clause:(lit list -> proof -> unit) -> term -> (term * proof) optionGiven a term, try to preprocess it. Return
Noneif it didn't change, orSome (u,p)ift=uandpis a proof oft=u. Can also add clauses to define new terms.Preprocessing might transform terms to make them more amenable to reasoning, e.g. by removing boolean formulas via Tseitin encoding, adding clauses that encode their meaning in the same move.
- parameter mk_lit
creates a new literal for a boolean term.
- parameter add_clause
pushes a new clause into the SAT solver.
val on_preprocess : t -> preprocess_hook -> unitAdd a hook that will be called when terms are preprocessed
Model production
type model_hook= recurse:(t -> CC.N.t -> term) -> t -> CC.N.t -> term optionA model-production hook. It takes the solver, a class, and returns a term for this class. For example, an arithmetic theory might detect that a class contains a numeric constant, and return this constant as a model value.
If no hook assigns a value to a class, a fake value is created for it.
val on_model_gen : t -> model_hook -> unitAdd a hook that will be called when a model is being produced