by Yu Feng
{ P } C { Q }
Example: { x = 1 } x := x + 1 { x = 2 }
———————————————
{ Q[x ↦ E] } x := E { Q }
{ y = 4 } x := 4 { y = x }
{ Q[x ↦ E] } x := E { Q }
{ y = 4 } x := 4 { y = x }{ P } C₁ { Q } { Q } C₂ { R }
────────────────────────────────
{ P } C₁; C₂ { R }Program:
x := 5; y := x + 2
Goal:
{ true } x := 5; y := x + 2 { y = 7 }
{ x+2 = 7 }
{ x = 5 }
─────────────────────────────────────────── [Assignment]
{ x = 5 } y := x + 2 { y = 7 }
{ 5 = 5 }
{ true }
─────────────────────────── [Assignment]
{ true } x := 5 { x = 5 }
───────────────────────────────────────────────────────────────────────────────────── [Sequence]
{ true } x := 5; y := x + 2 { y = 7 }
{ P ∧ b } C₁ { Q } { P ∧ ¬b } C₂ { Q }
------------------------------------
{ P } if b then C₁ else C₂ { Q }
{true} if x > 0 then y := x else y := −x {y ≥ 0} {x > 0} {x ≤ 0}
{x ≥ 0} {-x ≥ 0}
──────────────────────────── [Assignment] ────────────────────────────── [Assignment]
{x > 0} y := x {y ≥ 0} {x ≤ 0} y := −x {y ≥ 0}
──────────────────────────────────────────────────────────────────────────────────────── [Conditional]
{true} if x > 0 then y := x else y := −x {y ≥ 0}
——————————
{ P } skip { P }
{ z = 2 } y := x { y = x }P' ⇒ P { P } C { Q }
─────────────────────
{ P' } C { Q }{ P } C { Q } Q ⇒ Q'
─────────────────────
{ P } C { Q' } (always true)
{ x = x }
─────────────────────────────────── [Assignment Rule]
{ x = x } y := x { y = x }
─────────────────────────────────── [Strengthening Precondition]
{ z = 2 } y := x { y = x }
If ⊢ { P } C { Q }, then { P } C { Q } is true with respect to big-step semantics