Once I understand this, this will be a tutorial on building a simple SAT or SMT solver - with inspiration from Pete's class. I can revisit the article then. [The Assembly Language of Satisfiability](https://jix.one/the-assembly-language-of-satisfiability/): Are we bad at SAT solvers? Where are we? How do we bring their power to people? (To me, this problem is a subset of the "make programming accessible" problem, so it's not noteworthy.) # SAT solvers ## Cons - Require input problem to be a propositional logic formula in conjunctive normal form (CNF). This is not a natural way to express most problems that require SAT - Computing CNF formulas is often bad and hard so SAT solvers aren't really at the right "level" for use by the working programmer - Look up \`cardinality constraints CNF\` on google scholar - reveals lots of problems and tradeoffs that can be made ## Why SMT over SAT? - SMT solvers allow more freedom in the expression of input problems - support integers, fixed width floats, arrays and potentially other datatypes, as well as common operations on those types, without requiring a specific normal form! - API that allows for the manipulation of the input formula exposed by the solver, unlike strict ## How do they work? ### Bit blasting - Directly convert input formula into an equivalent Boolean formula in CNF - Limited to formulas where every data type has a finite set of values - Need a SAT solver as a backend, any improvement to SAT translates directly to an improvement to an SMT solver - so this is just additional tooling around a SAT solver to make it much easier to use. ### CDCL(T) - Definition: conflict driven cause learning - the algorithm employed by most modern SAT solvers.