class type theory =Term level interface to all theory solvers. A newly created theory solver has the following initial properties:object
..end
Solver_api.theory.decision_level
= 0
not
Solver_api.theory.conflict_detected
Term_set.is_empty
Solver_api.theory.variables
method owns_constant : Term.term -> bool
owns_constant t
holds when the solver responsible for
reasoning about the constant t
.
Term.is_constant
t
method proxy : Term.term -> Term.term
method add_interface_variable : Term.term -> unit
add_interface_variable v
treats the variable v
and its
negation as an interface literal.
Term.is_variable
v
Term_set.mem v
Solver_api.theory.variables
method variables : Term.Term_set.t
method decision_level : int
decision_level >= 0
method inference_possible : bool
method get_literal_possible : bool
Solver_api.theory.get_literal
?method get_lemma_possible : bool
Solver_api.theory.get_lemma
?method conflict_detected : bool
method is_interface_literal : Term.term -> bool
l
an interface literal for the solver.
Term_literal.is_literal
l
is_interface_literal l =
Term_set.mem (
Term_literal.variable
l)
Solver_api.theory.variables
method is_true : Term.term -> bool
l
assigned true in the solver state?
Solver_api.theory.is_interface_literal
l
method infer : unit
not
Solver_api.theory.conflict_detected
Solver_api.theory.inference_possible
method set_literal : Term.term -> unit
set_literal l
attempts to make a variable assignment
inferred by an external agent.
Solver_api.theory.is_interface_literal
l
not
Solver_api.theory.conflict_detected
method get_literal : Term.term
Solver_api.theory.get_literal_possible
Solver_api.theory.is_true
get_literal
method get_lemma : Term.term list
Solver_api.theory.get_lemma_possible
List.for_all
Solver_api.theory.is_interface_literal
ls
method final_check : unit
method increment_level : unit
not
Solver_api.theory.conflict_detected
not
Solver_api.theory.inference_possible
not
Solver_api.theory.get_literal_possible
not
Solver_api.theory.conflict_detected
not
Solver_api.theory.inference_possible
not
Solver_api.theory.get_literal_possible
Solver_api.theory.decision_level
> 0
method backjump : int -> unit
For backjump level
:
0 <= level
level <
Solver_api.theory.decision_level
level =
Solver_api.theory.decision_level
(not
Solver_api.theory.conflict_detected
)
method restart : unit
not
Solver_api.theory.conflict_detected
Solver_api.theory.decision_level
= 0
not
Solver_api.theory.conflict_detected
method conflict_clause : Term.term list
Solver_api.theory.conflict_detected
List.for_all
(fun l ->
Solver_api.theory.is_true
(
Term_literal.negation
l))
conflict_clause
conflict_clause != []
method literal_explanation : Term.term -> Term.term list
Solver_api.theory.set_literal
.
let cls = literal_explanation l
List.for_all
Solver_api.theory.is_interface_literal
cls
List.mem l cls
List.for_all
(fun m ->
Solver_api.theory.is_true
(
Term_literal.negation
m)
||
Term.term_equal
l m)
cls