A modular library for CDCL(T) SMT solvers, with [wip] proof generation.
Find a file
Guillaume Bury 8076c06047 [bugfix] Eliminate duplicates in input clauses
When adding clauses that conatins duplicates, the checking
of some proof would fail because there would sometime be multiple
littrals to resolve over. This fixes that problem.
2017-02-15 13:04:54 +01:00
articles Documentation update 2016-12-01 15:35:15 +01:00
doc Updated version number 2017-01-25 17:51:15 +01:00
src [bugfix] Eliminate duplicates in input clauses 2017-02-15 13:04:54 +01:00
tests [bugfix] Eliminate duplicates in input clauses 2017-02-15 13:04:54 +01:00
.gitignore Documentation update 2016-12-01 15:35:15 +01:00
.header copyright header in .header; authors in opam file 2014-11-04 17:59:58 +01:00
.merlin [WIP] All is setup, remains to have real theories 2016-09-16 15:49:33 +02:00
.ocamlinit ocamlinit file 2017-01-26 15:02:38 +01:00
.ocp-indent Everything has now been properly indented with ocp-indent. 2014-10-31 16:40:59 +01:00
.travis.yml [travis] Only build the bin for tests 2016-11-17 00:19:40 +01:00
_tags [bugfix] Eliminate duplicates in input clauses 2017-02-15 13:04:54 +01:00
CHANGELOG.md Updated version number 2017-01-25 17:51:15 +01:00
LICENSE update of license 2014-10-29 13:42:53 +01:00
Makefile [opam] Install doc conditionally 2017-01-25 18:21:32 +01:00
META wip: make SMT great again 2016-08-16 17:20:48 +02:00
myocamlbuild.ml Documentation update 2016-12-01 15:35:15 +01:00
opam [opam] Install doc conditionally 2017-01-25 18:21:32 +01:00
README.md add tseitin-free example to the readme 2017-01-26 15:09:31 +01:00
TODO.md A bit of restructuring to have cleaner dependencies between fonctors 2015-07-21 19:20:40 +02:00
VERSION Updated version number 2017-01-25 17:51:15 +01:00

MSAT Build Status

MSAT is an OCaml library that features a modular SAT-solver and some extensions (including SMT).

It derives from Alt-Ergo Zero.

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

Documentation

See https://gbury.github.io/mSAT/

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 and ocamlbuild. The command is:

make install

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 Sat = Msat.Sat.Make()
module E = Msat.Sat.Expr (* expressions *)

(* We create here two distinct atoms *)
let a = E.fresh ()    (* A 'new_atom' is always distinct from any other atom *)
let b = E.make 1      (* Atoms can be created from integers *)

(* We can try and check the satisfiability of some clauses --
   here, the clause [a or b].
   Sat.assume adds a list of clauses to the solver. *)
let() = Sat.assume [[a; b]]
let res = Sat.solve ()        (* Should return (Sat.Sat _) *)

(* The Sat solver has an incremental mutable state, so we still have
   the clause [a or b] in our assumptions.
   We add [not a] and [not b] to the state. *)
let () = Sat.assume [[E.neg a]; [E.neg b]]
let res = Sat.solve ()        (* Should return (Sat.Unsat _) *)

Formulas API

Writing clauses by hand can be tedious and error-prone. The functor Msat.Tseitin.Make proposes a formula AST (parametrized by atoms) and a function to convert these formulas into clauses:

(* Module initialization *)
module Sat = Msat.Sat.Make()
module E = Msat.Sat.Expr (* expressions *)
module F = Msat.Tseitin.Make(E)

(* We create here two distinct atoms *)
let a = E.fresh ()    (* A 'new_atom' is always distinct from any other atom *)
let b = E.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 *)
let () = 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 *)
let () = Sat.assume (F.make_cnf s)
let _ = Sat.solve ()        (* Should return (Sat.Unsat _) *)