Lecture 2: March 20, 2015 2.1 Introduction
Total Page:16
File Type:pdf, Size:1020Kb
Automatic Software Verification Spring Semester, 2015 Lecture 2: March 20, 2015 Lecturer: Prof. Mooly Sagiv Scribe: Kalev Alpernas and Elizabeth Firman 2.1 Introduction In this lecture we will go over the subject of Satisfiability of Propositional For- mulas. The Satisfiability Problem Given a boolean formula in propositional logic, we would like to determine whether the formula: • is valid i.e. do all possible assignments satisfy the formula. In case the formula is not valid, we sometimes would also like to find a counterexample - a non-satisfying assignment. • is satisfiable i.e. there exists an assignment which satisfies the formula. In case there exists a satisfying assignment, we sometimes would also like to find that assignment. As we saw in last week's lecture, we use the result of this problem to verify program. We write the problem, and the negation of the invariant we would like to check as propositional formulas, and check whether they are satisfiable. If there exists a satisfying assignment, then we have found a bug in the program. Otherwise, we have proved that the invariant holds. Our input formula has 2n possible assignments, which means that exhaus- tively checking all assignments is not a feasible approach. In this lecture we will see a few different approaches to solving this problem. Example 1. We consider for example the following propositional formula: ' = (a _ b) ^ (:a _:b _ c) In Figure 2.1 we can see a tree representing the truth state of '. The colour Green represents a satisfying assignment, and Red represents a non-satisfying assignment. We can see that ' is not valid, for example since the assignment a = F; b = F; c = T is not a satisfying assignment. We can also see that the formula is satisfiable, since the assignment a = F; b = T; c = T is satisfying. 2 Automatic Software Verification c Tel Aviv Univ. Figure 2.1: The truth value search tree for ' Problem Representation While the input for the SAT problem is a propositional formula, we will work with formulas in Conjunctive Normal Form or CNF. A CNF formula is a con- junction of clauses, where each clause is a disjunction of Literals. A literal is a boolean variable, or its negation. We choose to represent the problem in CNF, as it allows us to represent the formula in a compact, simple data structure, it is compositional, and in addition the fact that each clause in the formula needs to be satisfied, lends itself to algorithms which are easier to grasp intuitively. Any propositional formula can be converted to CNF, and the conversion is a straightforward process, utilizing basic logic equivalences - De-Morgan, double negation, and distributivity. This process may cause the formula to grow, so in order to avoid a size explosion of the formula we might be required to add additional variables to the formula. Example 2. We consider the following conversion of the formula ' = a _ (b ^ :(c _:d)) to CNF: ' = a _ (b ^ :(c _:d)) ≡ (a _ (b ^ :c ^ ::d)) ≡ (2.1) (a _ (b ^ :c ^ d)) ≡ (a _ b) ^ (a _:c) ^ (a _ d) Complexity Results In [1] Cook showed that the Boolean Satisfiability Problem is NP-Complete, even if we limit the clause size to at most 3 literals1. Two noteworthy exceptions are 2-SAT, and Horn Satisfiability. These two problems have polynomial algorithms (in [3] and [4] respectively). 1Known as the 3-SAT problem. 2.2. RESOLUTION 3 2-SAT is the Boolean satisfiability problem where each clause is limited to at most 2 literals. Horn Satisfiability is the Boolean satisfiability problem where each clause has at most one positive literal2. What is it Good For? From the perspective of complexity analysis, the boolean satisfiability problem is a very useful tool for showing complexity results of many problems in CS. In [2] Karp uses the complexity result of [1] to show that 21 other problems3 are also NP-Complete, by showing a reduction from the Boolean Satisfiability problem to each of these problems. Many similar results have been shown for further problems since. From the perspective of verification, SAT solvers have proved to be very useful tools in solving problems in SW and HW verification, as well as in other fields such as AI. This is because despite the problem being NP-Complete in the worst case, there are many algorithms which are capable of solving the Boolean Satisfiability problem in many useful cases. This lecture will show us a few such algorithms, which solve the SAT problem with exponential worst case complexity, but work well on many useful instances. 2.2 Resolution The first approach to solving the SAT problem that we will see in this lecture is the Clause Resolution method. Clause Resolution Resolution of a pair of clauses with one incompatible variable, is a process where given two clauses, in which there is exactly one variable that has incompatible truth values, i.e. the variable appears in one clause, and its negation appears in the other, we derive a new clause, called the resolvent, which is the disjunction of the original two clauses, without the incompatible variable. Example 3. In Figure 2.2 we can see the resolution method applied to the clauses (a _ b _:c _ f) and (g _:h _ c _ f). The incompatible variable is c, and we can see that the resulting clause is a disjunction of (a _ b _ f) and (g _:h _ f)(f appears in both original clauses, so it only appears once in the resolvent). The following deduction is the formal justification for single variable applying resolution: A =) B :A =) C B _ C 2Known as Horn clause. 3Known as Karp's 21 NP-Complete problems. 4 Automatic Software Verification c Tel Aviv Univ. Figure 2.2: An example of resolution on the variable c Note that every clause is equivalent to an implication formula where the rhs of the implication is a disjunction of literals. Claim 1. The resolvent and the original clauses are equisatisfiable, i.e. the original clauses are satisfiable iff the resolvent is satisfiable. Furthermore, the same assignment satisfies both. Proof Sketch: Assume that some model M satisfies the initial two clauses, and we are resolving the variable a. We assume w.l.o.g that a holds in M. Hence, at least one of the literals in the clause that contains :a has to hold in M. The same literal will appear in the resolvant. We get that if the original clauses were satisfiable, the resolvant will be satisfiable as well. From Claim 1 we get that applying resolution on two clauses in a CNF formula preserves the satisfiability of the formula. In a similar sense we get that resolution preserves the validity of a formula, since validity of a formula is equivalent to the satisfiability of it's negation, and satisfiability is preserved under resolution. Davis-Putnam Algorithm In [5] Davis and Putnam proposed an algorithm for solving the SAT problem. The algorithm is shown in Figure 2.3. If the algorithm reaches an empty clause as a resolvent, then there is no satisfying assignment for the original formula, and we can say that the formula is not satisfiable (let alone valid). If, however, the algorithm terminated without reaching an empty clause, then the formula is satisfiable, and there are no incompatible variables remain- ing in any two clauses. Finding a satisfying assignment at this point is straight- forward. Example 4. In Figure 2.4 we see the application of the resolution method on the formula ' = (a _ b _ c) ^ (b _:c _:f) ^ (:b _ e). In the first iteration the 2.2. RESOLUTION 5 for all Variables in formula do Resolve all clauses for variable if Reached empty clause then Report UNSAT else Discard resolved clauses end if end for Figure 2.3: The Davis-Putnam Algorithm Figure 2.4: An example of resolution of the formula ' = (a _ b _ c) ^ (b _:c _ :f) ^ (:b _ e) variable b is chosen, and two resolvents are produced. In the second iteration the variable c is chosen and a single resolvent is produced. The algorithm terminated without reaching an empty clause, which means that this formula is satisfiable. Example 5. In Figure 2.5 we see the application of the resolution method on the formula ' = (a _ b) ^ (a _:b) ^ (:a _ c) ^ (:a _:c). In the first iteration the variable b is chosen, one resolvent is produced and two other clauses are carried without change. In the second iteration the variable a is chosen and two resolvents are produced. In the third iteration the variable c is chosen, and the empty clause is produced. The algorithm terminated after reaching an empty clause, which means that this formula is not satisfiable. This algorithm may potentially produce an exponential amount of clauses, since in the worst case in every iteration every pair of clauses is resolved, result- ing in an exponential space complexity. Example 6. Consider the following formula: ' = (a _ b1) ^ (a _ b2) ^ ::: ^ (a _ bn) ^ (:a _ c1) ^ ::: ^ (:a _ cn) After resolving all clauses for a we get: 1 ' = (b1 _ c1) ^ ::: ^ (b1 _ cn) ^ ::: ^ (bn _ c1) ^ ::: ^ (bn _ cn) 6 Automatic Software Verification c Tel Aviv Univ. Figure 2.5: An example of resolution of the formula ' = (a _ b) ^ (a _:b) ^ (:a _ c) ^ (:a _:c) ' had 2n clauses, whereas in '1 has n2 clauses. After i iterations we would nj−1 have 2 2j , i.e.