The authors present the predicate calculus and its use in defining and reasoning about predicate transformers. They use the predicate transformers weakest liberal precondition (wlp) and weakest precondition (wp), which will be familiar to readers of Dijkstra's previous work [1], to define the semantics of programming languages and to reason about programs written in those languages.
The first four chapters form a prelude to the material; they cover notation and conventions. Chapter 5 provides extensive coverage of the predicate calculus over Boolean structures. The fundamental operators introduced are equivalence, disjunction, and negation; even true and false are defined in terms of these operators. Chapter 6 extends the theory to functions on predicates, called predicate transformers. Chapter 7 uses the predicate transformers wlp and wp to define a noniterative subset of Dijkstra's guarded command language [1]. Chapter 8 extends the theory of predicate transformers to cover fixpoints, which are used in chapter 9 for the iterative statement. The book concludes with a discussion of operational considerations and of strongest postcondition, the converse of wl p.
I enjoyed the coverage of the predicate calculus. The style of the proofs is clear, and I recommend it for other books and papers on similar topics. The use of equivalence as the basis of the theory yields some unexpected results, and the “junctivity” theory in chapter 6 is interesting.
The book is unsuitable as a text because it lacks exercises other than a few proofs left to the reader. This lack is unfortunate, since all readers would benefit by working out some of the proofs for themselves. Another shortcoming is the lack of motivation and examples—while the theory presented is fun in itself, its usefulness is not at all clear. Familiarity with a previous work of Dijkstra's [1] would be helpful. The book includes no references.
This book is clear and easy to read. It is designed especially for “mathematically inclined computing scientists and mathematicians with methodological and formal interests.” An added plus is several sections of “remarks,” which readers of Dijkstra's works have come to look forward to even if they do not agree with everything that is said. I recommend this book highly.
Access critical reviews of Computing literature here