\myheading{List of SMT-solvers}

\leveldown{}

\begin{itemize}

\item Yices\footnote{\url{http://yices.csl.sri.com/}}, created by Bruno Dutertre et al.
Logics Yices 2.6.2 supports\footnote{Grep'ed from its test suite}:

ALL, BV, LIA, LRA, QF\_ABV, QF\_ALIA, QF\_ALIRA, QF\_AUFBV, QF\_AUFLIA, QF\_AUFLIRA, QF\_BV, QF\_IDL,
QF\_LIA, QF\_LIRA, QF\_LRA, QF\_NIA, QF\_NIRA, QF\_NRA, QF\_RDL, QF\_UF, QF\_UFBV, QF\_UFIDL,
QF\_UFLIA, QF\_UFLRA, QF\_UFNIA, QF\_UFNRA, UF.

\item Z3\footnote{\url{https://github.com/Z3Prover/z3}},
developed by Leonardo de Moura, Nikolaj Bjorner, Christoph M. Wintersteiger, Lev Nachmanson.
Has its own state-of-art SAT solver.

Many examples here uses Python 2.x API for Z3 (AKA Z3Py).
Installation instructions (Ubuntu):

\begin{lstlisting}
sudo apt-get install python3-pip
sudo pip3 install z3-solver
\end{lstlisting}

Or compile the latest on Ubuntu:

\begin{lstlisting}
git clone https://github.com/Z3Prover/z3.git
cd z3
git tag
git checkout z3-4.12.0	# or newer version
python3 scripts/mk_make.py --python
cd build
make -j8
sudo make install
\end{lstlisting}

Python modules goes to \verb|/usr/lib/python3.x/site-packages/z3|.
If you have trouble with this, you can install Python modules to your \verb|$HOME|:

\begin{lstlisting}
python3 scripts/mk_make.py --prefix=$HOME --python --pypkgdir=$HOME/.local/lib/python3.8/site-packages
\end{lstlisting}

(Unofficial) bindings:
Haskell\footnote{\url{http://hackage.haskell.org/package/z3}, \url{http://leventerkok.github.io/sbv/}},
Racket\footnote{\url{https://github.com/philnguyen/z3-rkt}, \url{https://github.com/sunshowers/z3.rkt}},
Rust\footnote{\url{https://github.com/prove-rs/z3.rs}}.

Fun story: \href{https://www.cs.utexas.edu/~bornholt/post/z3-iphone.html}{SMT Solving on an iPhone}.

The first version of solver was called 'Zapatho', the second 'Zap2', the third 'Z3'\footnote{
\url{https://github.com/Z3Prover/z3/issues/2321},
\url{https://stackoverflow.com/questions/49963012/what-is-the-meaning-of-the-name-of-the-z3-smt-solver}}
Go figure how the fourth and fifth versions would be called.

Logics Z3 4.8.x supports\footnote{Grep'ed from its test suite}:

ABV, ALL, AUFBV, AUFLIA, AUFNIRA, BV, HORN, LIA, NRA, QF\_AUFLIA, QF\_AUFLIRA, QF\_BV, QF\_BVFP, QF\_FD, QF\_FP,
QF\_FP, QF\_FPA, QF\_FPBV, QF\_IDL, QF\_LIA, QF\_LRA, QF\_NIA, QF\_NRA, QF\_NRA, QF\_RDL, QF\_S, QF\_UF, QF\_UFBV,
QF\_UFLIA, UFBV, UFLIA.

\item STP\footnote{\url{https://github.com/stp/stp}}, used in KLEE.

Logics STP 2.3.3 supports\footnote{Grep'ed from its test suite}:
QF\_ABV, QF\_AUFBV, QF\_BV.

\item CVC3/CVC4\footnote{\url{http://cvc4.stanford.edu/} AKA \textit{A Cooperating Validity Checker},
Also available online: \url{https://cvc4.github.io/app/},
See also: \url{http://cvc4.cs.stanford.edu/wiki/}.}.

Newest version is CVC5: \url{https://github.com/cvc5/cvc5}.

Logics CVC 1.9 supports\footnote{Grep'ed from its test suite}:

ABV, ALL, ALL\_SUPPORTED, ASLIA, AUFBV, AUFBVDTLIRA, AUFBVDTNIRA, AUFDTLIA, AUFLIA, AUFLIAFS, AUFLIRA, AUFNIA, AUFNIRA, BV,
FP, LIA, LIRA, LRA, NIA, NIRA, NIRAT, NRA, QF\_ABV, QF\_ALIA, QF\_ALL, QF\_ALL\_SUPPORTED, QF\_ANIA,
QF\_AUF, QF\_AUFBV, QF\_AUFBVLIA, QF\_AUFBVLRA, QF\_AUFLIA, QF\_AUFLIRA, QF\_AUFNIA, QF\_AUFNIRA, QF\_AUFNRA, QF\_AX,
QF\_BV, QF\_BVDTLIAFS, QF\_BVFP, QF\_BVFS, QF\_BVLIA, QF\_DT, QF\_DTLIA, QF\_FP, QF\_FPLRA, QF\_IDL, QF\_LIA, QF\_LIRA,
QF\_LIRAFS, QF\_LRA, QF\_NIA, QF\_NIRA, QF\_NRA, QF\_NRAT, QF\_RDL, QF\_S, QF\_SAT, QF\_SEP\_LIA, QF\_SLIA, QF\_UF, QF\_UFBV,
QF\_UFBVFS, QF\_UFC, QF\_UFDTLIA, QF\_UFIDL, QF\_UFLIA, QF\_UFLIAFS, QF\_UFLIRA, QF\_UFLIRAFS, QF\_UFLRA, QF\_UFLRAFS, QF\_UFNIA,
QF\_UFNIRA, QF\_UFNRA, QF\_UFNRAT, QF\_UFSLIA, SAT, SLIA, UF, UFBV, UFC, UFDT, UFDTLIA, UFDTLIRA, UFDTSLIA, UFFS, UFIDL,
UFLIA, UFLIRA, UFNIA, UFNIRA, UFNRAT.

\item Boolector\footnote{\url{http://fmv.jku.at/boolector/}}, developed by Aina Niemetz, Mathias Preiner and Armin Biere.
Known as the fastest bitvector solver.

Logics Boolector 3.2.1 supports:
BV, QF\_ABV, QF\_AUFBV, QF\_BV, QF\_UFBV.

\item Alt-Ergo\footnote{\url{https://alt-ergo.ocamlpro.com/}}, used in Frama-C.

\item MathSAT\footnote{\url{http://mathsat.fbk.eu/}}. Developed by Alberto Griggio, Alessandro Cimatti and Roberto Sebastiani.

Logics MathSAT 5.6.5 supports:

QF\_ABV, QF\_ALIA, QF\_AUFBV, QF\_AUFLIA, QF\_AX, QF\_BV, QF\_BVFP, QF\_FP, QF\_FPBV, QF\_LIA, QF\_LRA,
QF\_UF, QF\_UFBV, QF\_UFLIA, QF\_UFLRA.

\item veriT\footnote{\url{http://www.verit-solver.org/}}.
Developed by David Déharbe, Pascal Fontaine, Haniel Barbosa.
Lacks bitvectors.

\item toysolver\footnote{\url{https://github.com/msakai/toysolver}} by Masahiro Sakai, written in Haskell.

\item MK85\footnote{\url{https://smt.st/MK85/}}.
Created by the author, as a toy bit-blaster, supports only booleans and bitvectors.

\item dReal: ``An SMT Solver for Nonlinear Theories of the Reals''
\footnote{\url{http://dreal.cs.cmu.edu}, \url{https://github.com/dreal}}.

\end{itemize}

Something else:

\begin{itemize}

\item PySMT: unified Python interface to many SMT solvers
\footnote{\url{https://pysmt.readthedocs.io/en/latest/},
\url{https://github.com/pysmt/pysmt},
\url{http://smt2015.csl.sri.com/wp-content/uploads/2015/06/2015-Gario-Micheli-PySMT-a-Solver-Agnostic-Library-for-Fast-Prototyping-of-SMT-Based-Algorithms.pdf}
\url{http://fmv.jku.at/avm15/slides/gario.pdf}}.

\item JavaSMT -- Unified Java API for SMT solvers: \url{https://github.com/sosy-lab/java-smt}

\item jSMTLIB -- Another Java API for SMT solvers: \url{http://smtlib.github.io/jSMTLIB/}

\item SBV: SMT Based Verification in Haskell: \url{http://leventerkok.github.io/sbv/}

\end{itemize}

\myheading{Boolector}

Boolector can generate CNF file instead of handing it out to SAT solver:

\begin{lstlisting}
boolector --smt2 --dump-dimacs filename.smt > filename.cnf
\end{lstlisting}

Just keep in mind that if Boolector calls a SAT solver several times, all these CNFs would be dumped to stdout, like:

\begin{lstlisting}
c CNF dump 1 start
c Boolector version
p cnf 13325 36769
1 0
2 0

...

-13325 0
c CNF dump 1 end
c CNF dump 2 start
c Boolector version
p cnf 15421 40065
1 0
2 0

...

15421 0
c CNF dump 2 end
c CNF dump 3 start
c Boolector version
p cnf 15488 40267
1 0
2 0
...
\end{lstlisting}

This is useful: you can try other SAT solvers, proof checkers, etc...

\levelup{}
