From Simson Garfinkel
Jump to navigationJump to search

SAT Solvers

SAT Solvers are programs that can solve SAT (Satisfiability), an NP-complete program. SAT solvers typically take their input in the DIMACS format. That's hard to work with, so there are pre-processors that will convert a problem into DIMACS, give it to a SAT solver, and then convert the solution back to a specific problem domain. Such conversions are in P.

I've used the following SAT solvers successfully:

  • picosat - easy to get working, but not very fast. Has the advantage that it can produce a list of all possible solutions out-of-the-box.
  • glucose - like picosat, but fast. Does not have the ability to produce all possible solutions.
  • Z3 - Can process DIMACS files.

I was not able to get these to work:

  • minisat - just couldn't get it to compile.

I haven't used these:

  • veriT-SAT - Can read DIMACS formatted SAT files.

SMT Solvers

SMT solvers can work with higher level "theories" in math or logic. Because they can operate on logic directly, rather than converting everything into SAT, their models can be much more compact. More compact models may solve faster or slower, depending on the heuristics of the particular solver.

Most SMT solvers will take an input file in the SMT-LIB file format.

Getting started with SMT-LIB:

SMT-LIB standard (read this):

Yices is another solver worth looking at. I’ll be doing that shortly:

I have put together a git repo of some of my very simple z3 scripts:


Optimizers are special kinds of solvers that can optimize an objective function. Convex linear optimizers that can work with floating point numbers are relatively fast, as linear programming is in P, but requiring an integer solution makes finding some problems tricky and creates an NP-hard problem. [1]