When I was reading FirstOrder Logic by Raymond M. Smullyan I was fascinated by the second chapter in which he describes a method for proving a propositional logic expression is a tautology. This method is called the Tableau Method. The Tableau Method is a rather straight forward way to prove a statement is always going to be true by demonstrating that asserting it is false will result in a contradiction. The propositional logic expression language Dr. Smullyan uses is rather simple. I present a modified version of it here. My version contains a not operator (!), a conjunction operator (&), a disjunction operator () and an implication operator (→).^{1} For example,
p & q
is true when both p and q are true;
p  q
is true when either p is true or q is true;
p → q
is true when p is false or p is true and q is also true; and finally,
!p
is true only when p is false. This should be very familiar to any programmer. A propositional logic expression is a tautology if it will always be true regardless of the value of its propositional variables. An example of a simple tautology is,
p  !p
which will be true if p is true or false. This statement is always true. This can be proven by simply demonstrating that asserting it is false results in a contradiction. For example, we assert a statement is false by prefixing it with a capital F or true with a capital T. For the above expression this would look like,
F p  !p
For this to be false both of the subexpressions would also have to be false. This would then look like
F p
F !p
For !p to be false p would have to be true, which looks like,
T p
Now we have a contradiction, according to propositional logic, p cannot be both true and false so p  !p must always be true. Using the Tableau Method this would look like,
(1) F p  !p
(2) F p (1)
(3) F !p (1)
(4) T p (3)
X
where the X indicates that the tableau ends in a contradiction (i.e. is closed) and the numbers to the left label the expressions and the numbers to the right indicate which expression the assertion is derived from. To produce a tableau you first assert the expression is false then use the following table to add assertions,
Expression of the form  Asserts 
T !p  F p 
F !p  T p 
T p & q  T p and T q 
F p & q  F p or F q 
T p  q  T p or T q 
F p  q  F p and F q 
T p → q  F p or T q 
F p → q  T p and F q 
When two expressions are asserted the table might branch. If the above table says "and" then both statement are asserted directly, but if it contains an "or" then both assertions must lead to a contradiction independently. For example, consider wanting to prove the transitive property of the implication operator, that is (p→q & q→r) → (p→r), this would start off with adding asserts until we are required to branch,
(1) F (p→q & q→r) → (p→r)
(2) T p→q & q→r (1)
(3) F p→r (1)
(4) T p→q (2)
(5) T q→r (2)
(6) T p (3)
(7) F r (3)
We now have to handle (4) and (5) with require us to branch the table. The first branch is the F p branch,
(8) F p (4)
X
This lead immediately to a contradiction because of (6) so this branch of the tableau is closed. We now need handle the T q branch,
(9) T q (4)
This doesn't lead to an immediate contradiction so we need to branch again for (5). The first branch for (5) looks like
(10) F q (5)
X
This again leads to an immediate contradiction, we already asserted that q must be true in (9). The second branch for (5) is the T r branch.
(11) T r (5)
X
This also lead to an immediate contradiction because of (7). Since all branches lead to a contradiction the original expression must always be true.
Putting this altogether we get,
(1) F (p→q & q→r) → (p→r) 


This is a simple and elegant way to demonstrate proof by contradiction. Of course I just had to write a program to tell me whether an arbitrary propositional logic expression is a tautology and automatically generate the tableau.
You can find the source project that is works with the just released Visual
Studio 2008 here. It requires VS 2008 because I am addicted to some of the new
C# features, especially the var
keyword.
^{1} Dr. Sumullyan uses different characters for his operators but his characters are not as commonly included in browser fonts and are not as easy to type on a standard keyboard (using > as a synonym of →) as the ones I use. << back