sidekick/src/core/solver_intf.ml
2016-08-18 18:19:14 +02:00

77 lines
2.5 KiB
OCaml

(*
MSAT is free software, using the Apache license, see file LICENSE
Copyright 2016 Guillaume Bury
Copyright 2016 Simon Cruanes
*)
type ('term, 'form) sat_state = {
eval: 'form -> bool;
(** Returns the valuation of a formula in the current state
of the sat solver.
@raise UndecidedLit if the literal is not decided *)
eval_level: 'form -> bool * int;
(** Return the current assignement of the literals, as well as its
decision level. If the level is 0, then it is necessary for
the atom to have this value; otherwise it is due to choices
that can potentially be backtracked.
@raise UndecidedLit if the literal is not decided *)
model: unit -> ('term * 'term) list;
(** Returns the model found if the formula is satisfiable. *)
}
type ('clause, 'proof) unsat_state = {
unsat_conflict : unit -> 'clause;
(** Returns the unsat clause found at the toplevel *)
get_proof : unit -> 'proof;
(** returns a persistent proof of the empty clause from the Unsat result. *)
}
module type S = sig
(** {2 Internal modules}
These are the internal modules used, you should probably not use them
if you're not familiar with the internals of mSAT. *)
module St : Solver_types.S
module Proof : Res.S with module St = St
(** {2 Types} *)
type atom = St.formula
(** The type of atoms given by the module argument for formulas *)
type res =
| Sat of (St.term,St.formula) sat_state
| Unsat of (St.clause,Proof.proof) unsat_state
(** Result type for the solver *)
exception UndecidedLit
(** Exception raised by the evaluating functions when a literal
has not yet been assigned a value. *)
(** {2 Base operations} *)
val assume : ?tag:int -> atom list list -> unit
(** Add the list of clauses to the current set of assumptions.
Modifies the sat solver state in place. *)
val solve : ?assumptions:atom list -> unit -> res
(** Try and solves the current set of assumptions. *)
val unsat_core : Proof.proof -> St.clause list
(** Returns the unsat core of a given proof. *)
val true_at_level0 : atom -> bool
(** [true_at_level0 a] returns [true] if [a] was proved at level0, i.e.
it must hold in all models *)
val get_tag : St.clause -> int option
(** Recover tag from a clause, if any *)
val export_dimacs : Format.formatter -> unit -> unit
(** Prints the entire set of clauses in the input problem
(including hypothesis, lemmas and local assumptions),
in the dimacs format. *)
end