When the solver finds a SAT result, it sends the whole model to the theory, because maybe it can do something interesting/costly to expand the proof search. After that there must be a check to see if the theory has effectively done something, in which case we should resume proof search, or if nothing has been done, in which case the solver should return that the problem is satisfiable. That check was incorrect before (checking number of assumptions, and if the queue is all caught up), because new learnt clauses (i.e tautologies, which are *not* assumptions) can be added that do not immediately causes propagation, so that the number of assumptions and the element queue is constant, but we should still resume the search. |
||
|---|---|---|
| backend | ||
| docs | ||
| sat | ||
| smt | ||
| solver | ||
| tests | ||
| util | ||
| .gitignore | ||
| .header | ||
| .merlin | ||
| .ocp-indent | ||
| _tags | ||
| LICENSE | ||
| main.ml | ||
| Makefile | ||
| META | ||
| msat.mlpack | ||
| msat.odocl | ||
| opam | ||
| README.md | ||
| TODO.md | ||
MSAT
MSAT is an OCaml library that features a modular SAT-solver and some extensions (including SMT). This is work in progress.
It derives from Alt-Ergo Zero.
COPYRIGHT
This program is distributed under the Apache Software License version
2.0. See the enclosed file LICENSE.
USAGE
Sat Solver
A ready-to-use SAT solver is available in the Sat module. It can be used as shown in the following code :
(* Module initialization *)
module F = Msat.Sat.Tseitin
module Sat = Msat.Sat.Make()
(* We create here two distinct atoms *)
let a = Sat.new_atom () (* A 'new_atom' is always distinct from any other atom *)
let b = Sat.make 1 (* Atoms can be created from integers *)
(* Let's create some formulas *)
let p = F.make_atom a
let q = F.make_atom b
let r = F.make_and [p; q]
let s = F.make_or [F.make_not p; F.make_not q]
(* We can try and check the satisfiability of the given formulas *)
Sat.assume (F.make_cnf r)
let _ = Sat.solve () (* Should return Sat.Sat *)
(* The Sat solver has an incremental mutable state, so we still have
* the formula 'r' in our assumptions *)
Sat.assume (F.make_cnf s)
let _ = Sat.solve () (* Should return Sat.Unsat *)
Generic SAT/SMT Solver
A modular implementation of the SMT algorithm can be found in the Msat.Solver module,
as a functor which takes two modules :
-
A representation of formulas (which implements the
Formula_intf.Ssignature) -
A theory (which implements the
Theory_intf.Ssignature) to check consistence of assertions.
INSTALLATION
Via opam
Once the package is on opam, just opam install msat.
For the development version, use:
opam pin add msat https://github.com/Gbury/mSAT.git
Manual installation
You will need ocamlfind. The command is:
make install