Added wp_while.
1 (* Title: HOL/IMP/VC.thy
6 acom: annotated commands
7 vc: verification-conditions
8 awp: weakest (liberal) precondition
17 | Awhile bexp assn acom
20 vc,awp :: acom => assn => assn
21 vcawp :: "acom => assn => assn * assn"
26 "awp (Aass x a) Q = (%s.Q(s[a s/x]))"
27 "awp (Asemi c d) Q = awp c (awp d Q)"
28 "awp (Aif b c d) Q = (%s. (b s-->awp c Q s) & (~b s-->awp d Q s))"
29 "awp (Awhile b I c) Q = I"
32 "vc Askip Q = (%s.True)"
33 "vc (Aass x a) Q = (%s.True)"
34 "vc (Asemi c d) Q = (%s. vc c (awp d Q) s & vc d Q s)"
35 "vc (Aif b c d) Q = (%s. vc c Q s & vc d Q s)"
36 "vc (Awhile b I c) Q = (%s. (I s & ~b s --> Q s) &
37 (I s & b s --> awp c I s) & vc c I s)"
41 "astrip (Aass x a) = (x:=a)"
42 "astrip (Asemi c d) = (astrip c;astrip d)"
43 "astrip (Aif b c d) = (IF b THEN astrip c ELSE astrip d)"
44 "astrip (Awhile b I c) = (WHILE b DO astrip c)"
46 (* simultaneous computation of vc and awp: *)
48 "vcawp Askip Q = (%s.True, Q)"
49 "vcawp (Aass x a) Q = (%s.True, %s.Q(s[a s/x]))"
50 "vcawp (Asemi c d) Q = (let (vcd,wpd) = vcawp d Q;
51 (vcc,wpc) = vcawp c wpd
52 in (%s. vcc s & vcd s, wpc))"
53 "vcawp (Aif b c d) Q = (let (vcd,wpd) = vcawp d Q;
55 in (%s. vcc s & vcd s,
56 %s.(b s --> wpc s) & (~b s --> wpd s)))"
57 "vcawp (Awhile b I c) Q = (let (vcc,wpc) = vcawp c I
58 in (%s. (I s & ~b s --> Q s) &
59 (I s & b s --> wpc s) & vcc s, I))"