Boolean satisfiability (SAT) is a widely used modeling framework for solving combinatorial problems. It is also a well-known decision problem in theoretical computer science, being the first problem to be shown to be NP-complete.  Since SAT is NP-complete, and unless P=NP, all SAT algorithms require worst-case exponential time. However, modern SAT algorithms are extremely effective at coping with large search spaces, by exploiting the problem's structure when it exists. [2–4] The performance improvements made to SAT solvers since the mid 1990s motivated their application to a wide range of practical applications, from cross-talk noise prediction in integrated circuits  to termination analysis in term-rewrite systems.  In some applications, the use of SAT provides remarkable performance improvements. Examples include model-checking of finite-state systems, [7–9] design debugging,  AI planning, [11,12] and haplotype inference in bioinformatics.  Additional successful examples of practical applications of SAT include termination analysis in term-rewrite systems,  knowledge-compilation,  software-model checking, [15,16] software testing,  package management in software distributions,  checking of pedigree consistency,  verification of pipelined processors, [20–21] symbolic-trajectory evaluation,  test-pattern generation in digital systems,  design debugging and diagnosis,  identification of functional dependencies in Boolean functions,  technology-mapping in logic synthesis,  circuit-delay computation,  and cross-talk-noise prediction.  However, this list is incomplete, as the number of applications of SAT has been on the rise in recent years. [18,19,24]
Besides practical applications, SAT has also influenced a number of related decision and optimization problems, which will be referred to as extensions of SAT. Most extensions of SAT either use the same algorithmic techniques as used in SAT, or use SAT as a core engine.