Propositional logic allows for description and then solving of a significant class of constraint satisfaction problems, namely those that require that the domains of variables are finite. As such, propositional logic finds applications in describing problems stemming from computer science, computer engineering and combinatorial optimization. But logic goes beyond just providing descriptive means - it is supported by mechanisms for computation of answers. At present there is a class of software systems, SAT solvers, that allow (given enough of resources) for solving problems expressed in propositional logic. This book studies syntax, semantics, and algorithms for finding solutions of problems expressible in propositional logic. It is addressed to individuals who want to understand the principles on which SAT solvers are based and gain a deeper understanding of techniques used in logic-based solving.