Predicate transformer semantics

This is an old revision of this page, as edited by Boulme (talk | contribs) at 06:48, 13 May 2010 (add section "applications"). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

Predicate transformer semantics is a reformulation of Floyd–Hoare logic introduced by Dijkstra in its seminal paper " Guarded commands, nondeterminacy and formal derivation of programs". It is a method for defining the semantics of an imperative programming language by assigning to each command in the language a corresponding predicate transformer. A predicate transformer is a total function mapping between two predicates on the state space of a program. Actually, in Guarded commands, Dijkstra uses only one kind of predicate transformers: the well-known weakest precondition (see below).

Examples of predicate transformers

Weakest precondition

The canonical predicate transformer of sequential imperative programming is the so-called "weakest precondition"  . Here S denotes a list of commands and R denotes a predicate on the space, called the "postcondition". The result of applying this function gives the "weakest pre-condition" on the initial state for S terminating with R satisfied on the final state. As an example, we give below to equivalent definition of the assignment statement (in these formulas,   is a copy of R with the value of x replaced by E):

  • version 1:   where y is a fresh variable.
  • version 2:  

The first version avoids a potential duplication of E in R, whereas the second version is simpler when there is at most a single occurrence of x in E. The first version reveals also a deep duality between weakest-precondition and strongest-postcondition (see below) through the duality between quantifier   (resp. connector  ) and   (resp.  ).

An example of a valid calculation of wp (using version 2) for assignments with integer valued variable x is:

 

This means that in order for the "post-condition" x > 10 to be true after the assignment, the "pre-condition" x > 15 must be true before the assignment. This is also the "weakest pre-condition", in that it is the "weakest" restriction on the value of x which makes x > 10 true after the assignment.

Weakest liberal precondition

An important variant of the weakest precondition is the weakest liberal precondition  , which yields the weakest condition under which S either does not terminate or establishes R. It therefore differs from wp in not guaranteeing termination.


Strongest postcondition

Given S a statement (or in other words, a list of commands) and R a precondition (a predicate on the initial state), then   is the strongest-postcondition: it implies any postcondition satisfied by the final state of the execution of S, for any initial state statisfying R. For example, on assignment we have:

  where   is fresh.

Above, the logical variable   represents the initial value of variable  . Hence,

 

Others

Leslie Lamport has suggested win and sin as predicate transformers for concurrent programming.

Applications

  • Unlike many other semantic formalisms, predicate transformer semantics was not designed as an investigation into foundations of computation. Rather, it is intended to provide programmers with a methodology to develop their programs as "correct by construction" in an "calculation style". This style was advocated by Dijkstra and others, and also developed further in a higher order logic setting by R.-J. Back in the Refinement Calculus. It has been mechanized in B-Method.
  • In the meta-theory of Hoare logic, weakest-preconditions are a key notion of the proof of relative completness.

Dijkstra also defined alternative (if) and repetitive (do) constructs as well as a composition operator (;) using wp. The alternative and repetitive constructs used guarded commands to influence execution. Because of the rules he imposed on the definition of wp, both constructs allow for non-deterministic execution if the guards in the commands are non disjoint.

See also

References