SE 504
Proving the Correctness of a skip-program

The Hoare Triple law for the skip command says

{P} skip {Q}   ≡   [P Q]

Thus, to show {P} skip {Q}, it suffices to complete a proof of P Q.

Example: Prove { x > y } skip { x ≥ y ∨ z < y }.

Solution: Taking P to be x > y and Q to be x ≥ y ∨ z < y, it suffices (by the Hoare Triple law for skip) to complete a proof of P Q:

Assume P (i.e., x > y).
     Q

  =     < defn of Q >

     x ≥ y  ∨  z < y

  =     < defn of ≥  >

     (x > y ∨ x=y)  ∨  z < y

  =     < assumption P (i.e., x > y) >

     (true ∨ x=y)  ∨  z < y

  =     < symmetry of ∨ (Gries 3.24) >

     (x=y ∨ true)  ∨  z < y

  =     < zero of ∨ (Gries 3.29) >

     true  ∨  z < y

  =     < symmetry of ∨ (Gries 3.24) >

     z < y  ∨  true

  =     < zero of ∨ (Gries 3.29) >

     true

Our proof was given in quite gory detail. Usually, we can omit explicit mention of the use of (Gries 3.24), for example. Also, we could have appealed to the assumption x>y as a justification for replacing (the weaker) x≥y by true directly, without first rewriting the latter as x>y ∨ x=y and then using the assumption. A more concise proof would have been:

Assume P (i.e., x > y).
     Q

  =     < defn of Q >

     x ≥ y  ∨  z < y

  =     < x ≥ y follows from assumption P (i.e., x > y) >

     true ∨ z < y

  =     < zero of ∨ (Gries 3.29) >

     true 


Now suppose that we use the wp-approach instead of the Hoare Triple approach. The relationship between wp and Hoare Triples is

{P} S {Q}   ≡   [P wp.S.Q]

Hence, to prove {P} skip {Q} we show the equivalent [P wp.skip.Q]. The usual approach is to assume the antecedant and to show the consequent:

Assume P (i.e., x > y).
     wp.skip.Q

  =     < defn of Q >

     wp.skip.(x ≥ y  ∨  z < y)

  =     < wp skip rule, which says [wp.skip.Q  ≡  Q] >

     x ≥ y  ∨  z < y

  =     ... continue as in proof above

As we have arrived at the second line of the earlier proof, we simply continue as we did there.