Implementation of a DPLL-based SAT solver in Ada. Main features:
- Conflict analysis and backjumping
- Two-watched literals scheme
- Built-in support for At-Most-One constraints
- Custom theories
The solver can solve arbitrary theories via a lazy approach. For that, the DPLL solver can be instantiated with a custom Theory package that has a very simple interface consisting in a single Check function and context type:
generic type User_Context; with function Check (Context : in out User_Context; Assignments : Model; Explanation : in out Formula) return Boolean; package Theory is end Theory;The Check function is invoked whenever the solver needs the theory to validate a model that satisfies the SAT formula. In case the model does not satisfy the theory, the function must return a new formula which contradicts the model via the Explanation out parameter. The provided contradiction is appended to the initial formula and the solver tries to find a new solution.
Note that Context is propagated from the initial call to Solve to each call to Check and its sole use is to simplify user-facing code, in particular to offer another way of accessing data required for solving the theory than having the Check subprogram be a nested subprogam of wherever your are invoking the solver.
The library can be built with gprbuild -P adasat.gpr -p -XBUILD_MODE=[dev|prof|prod].
To use in your projects, simply add with "adasat"; in your project's dependencies.
-
Make sure you have a Python3 available
-
Install the
e3-testsuitepackage. -
Put AdaSAT's root directory in your
GPR_PROJECT_PATH(so thatgprbuildcan findadasat.gpr) -
Finally, run
python3 testsuite/testsuite.py.