mirror of
https://github.com/c-cube/sidekick.git
synced 2025-12-11 05:28:34 -05:00
141 lines
5.9 KiB
TeX
141 lines
5.9 KiB
TeX
|
|
\documentclass{llncs}
|
|
|
|
\usepackage[T1]{fontenc}
|
|
\usepackage[margin=1.5in]{geometry}
|
|
\usepackage[usenames,dvipsnames,svgnames,table]{xcolor}
|
|
\usepackage{hyperref}
|
|
|
|
\def\aez{\textsf{Alt-Ergo~Zero}}
|
|
\def\altergo{\textsf{Alt-Ergo}}
|
|
\def\ens{\textsf{ENS Paris-Saclay}}
|
|
\def\inria{\textsf{Inria}}
|
|
\def\lsv{\textsf{LSV}}
|
|
\def\msat{\textsf{mSAT}}
|
|
|
|
\begin{document}
|
|
|
|
\title{\msat{}: An OCaml SAT Solver}
|
|
\author{Guillaume~Bury}
|
|
\institute{\inria{}/ \lsv{}/\ens{}, Cachan, France\\\email{guillaume.bury@inria.fr}}
|
|
|
|
\maketitle
|
|
|
|
\begin{abstract}
|
|
We present \msat{}, a modular SAT solving library written entirely in OCaml.
|
|
While there already exist OCaml bindings for SAT solvers written in C,
|
|
\msat{} provides more features, such as proof output, and the ability to
|
|
instantiate an SMT solver using a first-order theory given by the user,
|
|
while being reasonably efficient compared to the existing bindings.
|
|
\end{abstract}
|
|
|
|
\section*{Introduction}
|
|
|
|
Deciding the satisfiability of propositional logical formulae is an interesting
|
|
and recurring problem for which SAT solvers are now the standard solution.
|
|
However, there exist very few SAT solvers available in OCaml. There are
|
|
currently 4 opam\cite{opam} packages that provide an OCaml library for SAT
|
|
solving\footnote{There are a few additional packages for SMT solving, which we
|
|
do not include because of the added complexity providing a full SMT solver
|
|
compared to providing an interface for SAT solving.}, 3 of which are bindings to
|
|
one or more SAT solvers written in C (such as minisat\cite{minisat}). We will
|
|
present the fourth one, \msat{}, which is entirely written in OCaml.
|
|
|
|
\section*{Sat and SMT Solving}
|
|
|
|
Sat solvers work on propositional clauses, which are disjunctions of atomic
|
|
propositions. A set of propositional clauses is satisfiable iff there exist a
|
|
model for it, that is an assignment from the atomic propositions to booleans, such
|
|
that for every clause there exist an atomic proposition in the clause which is
|
|
assigned to $\top$. A SAT solver solves the satisfiability problems, meaning that for an
|
|
input problem given as a set of clauses, it returns either `sat' if the problem
|
|
is satisfiable, or `unsat' if it is not.
|
|
|
|
SMT\footnote{Acronym for Satisfiability Modulo Theories.} solvers are extensions
|
|
of SAT solvers to quantifier-free clauses built using first-order theories (like
|
|
linear arithmetic); clauses such as
|
|
$\neg (x + 1 > y) \lor \neg (y > z - 5) \lor (x > z - 10)$. In order to verify
|
|
the satisfiability of a set of first-order clauses, a SAT solver is combined
|
|
with a first-order theory: the basic idea is for the SAT solver to enumerate
|
|
all propositional models, and for each of them, ask the theory if it is
|
|
satisfiable\footnote{In practice, incomplete models are incrementally given to
|
|
the theory, and efficient backtracking is used in order to reach good
|
|
performances.}. If the theory returns `sat' for at least one propositional model,
|
|
the SMT solver returns `sat', in the other case, it returns `unsat'. That way,
|
|
the theory only has to deal with the satisfiability of a set of first-order
|
|
atomic propositions, while the SAT solver deals with the propositional structure
|
|
of the input problem.
|
|
|
|
\section*{\msat{}}
|
|
|
|
\msat{}\cite{msat} is a library entirely written in OCaml, which derives from
|
|
\aez{}\cite{aez}, itself derived from the SMT solver
|
|
\altergo{}\cite{altergo}\footnote{Apart from the initial fork of \aez{}, it is of
|
|
interest to note that the development of \msat{} is completely separate and independant
|
|
from that of \aez{} and \altergo{}}. While there exist full SMT solvers as well SAT solvers
|
|
available in OCaml, \msat{} is somewhere between the two: it doesn't provides builtin theories
|
|
like SMT solvers, but instead allows the user to provide her own implementation of
|
|
theories, something which is impossible to do using the bindings to SAT solvers written in C.
|
|
\msat{} is therefore the first OCaml library to allow to create custom SMT solvers.
|
|
|
|
Specifically, \msat{} provides functors to instantiate SMT solvers,
|
|
and by extension SAT solvers, since an SMT solver with an empty theory (that is, a
|
|
theory which always returns `sat') is a SAT solver. This closely follows the
|
|
theoretical foundation of SMT solvers, where any theory respecting adequate
|
|
invariants can be plugged into a SAT solver to make a SMT solver.
|
|
|
|
\msat{} supports most usual
|
|
features of SAT solvers, such as local assumptions, but more
|
|
importantly provides unique and original features like:
|
|
\begin{itemize}
|
|
\item the ability to instantiate one's own SMT solver
|
|
\item a detailed proof output for unsatisfiable problems, including printing
|
|
of coq proof scripts
|
|
\end{itemize}
|
|
|
|
|
|
\section*{Presentation}
|
|
|
|
The presentation will introduce the basics of SAT and SMT solving, and then
|
|
explain the interfaces exported by the library, focusing on three different
|
|
points:
|
|
|
|
\begin{itemize}
|
|
\item How to use the SAT solver exported by \msat{}
|
|
\item How to instantiate a custom SMT solver using \msat{}, explaining in
|
|
detail the various documented invariant expected to create a fully
|
|
operational SMT solver, and the design choices behind them.
|
|
This will be accompanied by an example of such instantiation.
|
|
\item The design of the proof output of \msat{}
|
|
\end{itemize}
|
|
|
|
Lastly, there will be a comparison between \msat{} and the other SAT solvers
|
|
in the OCaml ecosystem. This comparison will be about available features
|
|
as well as performance.
|
|
|
|
\bibliographystyle{unsrt}
|
|
\begin{thebibliography}{1}
|
|
|
|
\bibitem{msat}
|
|
\msat{}: a modular sat/smt solver with proof output.
|
|
\url{https://github.com/Gbury/mSAT}
|
|
|
|
\bibitem{opam}
|
|
Opam: a Package manager for ocaml.
|
|
\url{https://opam.ocaml.org}
|
|
|
|
\bibitem{minisat}
|
|
MiniSat is a minimalistic, open-source SAT solver.
|
|
\url{http://minisat.se/Main.html}
|
|
|
|
\bibitem{aez}
|
|
Alt-Ergo Zero is an OCaml library for an SMT solver.
|
|
\url{http://cubicle.lri.fr/alt-ergo-zero/}
|
|
|
|
\bibitem{altergo}
|
|
Alt-Ergo.
|
|
\url{http://alt-ergo.lri.fr/}
|
|
|
|
\end{thebibliography}
|
|
|
|
\end{document}
|