Content deleted Content added
major changes: plan + strongest-postcondition |
add section "applications" |
||
Line 1:
'''Predicate transformer semantics''' is
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 "[[Algebraic_structures | algebraic]] style". This style was advocated by Dijkstra and others, and also developed further in a [[Higher-order_logic|higher order logic]] setting by [[Ralph-Johan Back|R.-J. Back]] in the [[Refinement Calculus]]. It has been mechanized in [[B-Method]]. ▼
== Examples of predicate transformers ==
Line 7 ⟶ 5:
=== Weakest precondition ===
The canonical ''predicate transformer'' of sequential imperative programming is the so-called "'''weakest precondition'''" <math>wp(S, R)</math>. 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.
* version 1: <math> wp(x := E, R)\ =\ \forall y, y = E \Rightarrow R[ y \leftarrow x]\ </math> where ''y'' is a fresh variable.
* version 2: <math> wp(x := E, R)\ =\ R[x \leftarrow E] </math> ▼
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 <math>\forall</math> (resp. connector <math>\Rightarrow</math>) and <math>\exists</math> (resp. <math>\wedge</math>).
▲:<math> wp(x := E, R)\ =\ R[x \leftarrow E] </math>
An example of a valid calculation of ''wp'' (using version 2) for assignments with integer valued
▲An example of a valid calculation of ''wp'' for assignments with integer valued variables ''x'' and ''y'' is:
:<math> wp(x := x - 5, x > 10)\ =\ (x - 5 > 10)\ =\ (x > 15) </math>
Line 26 ⟶ 24:
=== 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
<math>sp(S, R)</math> 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:
:<math> sp(x := E, R)\ =\ \exists y,
Hence,
:<math> sp(x := x - 5, x > 15)\ =\ \exists y, x = y
=== 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 "
* In the meta-theory of [[Hoare logic]], weakest-preconditions are a key notion of the proof of relative completness.
== Links with [[Guarded commands]] ==
|