Hoare Logic
Big-Step Operational Semantics
Imperative program의 big-step operational semantics
- initial state에서
- 프로그램을 실행하면
- final state가 된다
따라서 big-step semantics에서 imperative program은 두 state와 command의 ternary relation이다.
Hoare Triple
Hoare triple {P} c {Q}
의 의미
- initial state에서 P가 성립하고 (precondition)
- c를 실행하고 어떤 final state에 도달했을 때
- final state에서 Q가 성립한다 (postcondition)
Formal definition: forall P c Q st st', st =[ c ]=> st' -> P st -> Q st'
Examples of Valid Hoare Triples
- {X = 3} X := X + 1 {X = 4}
- {True} X := 3 {X = 3}
Proof Rules
Skip
------------
{P} skip {Q}
Sequence
{Q} c2 {R}
{P} c1 {Q}
---------------
{P} c1 ; c2 {R}
premise의 순서가 반대인 이유는 보통 증명 과정이 postcondition에서 시작하기 때문.
Assignment
------------------------
{Q [X |-> a]} X := a {Q}
{Q [X |-> a]}
는 Q에서 모든 X를 a로 치환한 assertion을 말한다.
Consequence
각 condition은 다른 condition보다 logically stronger 혹은 weaker일 수 있다.
명제 논리에서 P -> Q가 참이면 P는 Q보다 stronger, Q는 P보다 weaker.
마찬가지로 어떤 assertion P가 어떤 assertion Q를 imply하면, 즉 forall st, P st -> Q st이면, P는 Q보다 stronger.
Q' -> Q
{P'} c {Q'}
P -> P'
-----------
{P} c {Q}
Conditionals
{P1} c1 {Q}
{P2} c2 {Q}
--------------------------------
{(b -> P1) /\ (~b -> P2)} if b then c1 else c2 end {Q}
혹은
{(b /\ P1) \/ (~b /\ P2)} if b then c1 else c2 end {Q}
Loop
{P /\ b} c {P}
------------------------------
{P} while b do c end {P /\ ~b}
이 때 P는 loop invariant이다.
Weakest Precondition
주어진 command와 postcondition에 대하여 가장 weak한 precondition (wp). 사실 위 skip, assignment, sequence, conditional에 대한 proof rule이 wp이다.
Loop에 대해서는 weakest precondition을 따지지 않는다.