A modular library for CDCL(T) SMT solvers, with [wip] proof generation.
Find a file
Guillaume Bury 443a3b0731 [bugfix] Attempt at fixing enqueue bug
When we enqueue an atom at level 0, we expect it to stay unconditionally
true whatever happens. However, if it happens that the atom is alrady
true at a level strictly greater than 0 (but lower than base_level),
then enqueue_bool would simply do nothing. To fix this, there is a new
function enqueue_root which modifies in place the level and reason of
the propagated atom if it is already true.
Additionally, enqueue_bool now requires that the atom be undecided,
since if it not (i.e if it is propagated while already decided) it is
most likely a bug.
2016-11-09 00:24:41 +01:00
docs added minisat paper 2014-11-03 23:28:27 +01:00
src [bugfix] Attempt at fixing enqueue bug 2016-11-09 00:24:41 +01:00
tests check proofs in test_api 2016-07-28 11:10:31 +02:00
.gitignore update some files 2016-07-22 11:31:17 +02:00
.header copyright header in .header; authors in opam file 2014-11-04 17:59:58 +01:00
.merlin add some tests for the API 2016-07-27 18:54:56 +02:00
.ocp-indent Everything has now been properly indented with ocp-indent. 2014-10-31 16:40:59 +01:00
.travis.yml [travis] Ubuntu doesn't have 'time' by default... 2016-07-23 14:47:52 +02:00
_tags add an inlining parameter for non-flambda versions of OCaml 2016-07-29 23:02:23 +02:00
LICENSE update of license 2014-10-29 13:42:53 +01:00
Makefile add some tests for the API 2016-07-27 18:54:56 +02:00
META get rid of dependency on unix 2016-01-20 20:13:32 +01:00
opam Propagation reasons are now far more explicit 2016-04-15 12:09:23 +02:00
README.md Add travis build status to README 2016-07-23 14:07:40 +02:00
TODO.md A bit of restructuring to have cleaner dependencies between fonctors 2015-07-21 19:20:40 +02:00

MSAT Build Status

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.

This program is distributed under the Apache Software License version 2.0. See the enclosed file LICENSE.

USAGE

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.S signature)

  • A theory (which implements the Theory_intf.S signature) to check consistence of assertions.

  • A dummy empty module to ensure generativity of the solver (solver modules heavily relies on side effects to their internal state)

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 = Msat.Sat.Fsat.fresh ()    (* A 'new_atom' is always distinct from any other atom *)
    let b = Msat.Sat.Fsat.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 *)

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