1465
|
1 |
(* Title: HOL/IMP/VC.ML
|
1447
|
2 |
ID: $Id$
|
1465
|
3 |
Author: Tobias Nipkow
|
1447
|
4 |
Copyright 1996 TUM
|
|
5 |
|
|
6 |
Soundness and completeness of vc
|
|
7 |
*)
|
|
8 |
|
1973
|
9 |
AddIs hoare.intrs;
|
|
10 |
|
3842
|
11 |
val lemma = prove_goal HOL.thy "!s. P s --> P s" (K[Fast_tac 1]);
|
1447
|
12 |
|
5069
|
13 |
Goal "!Q. (!s. vc c Q s) --> |- {awp c Q} astrip c {Q}";
|
5183
|
14 |
by (induct_tac "c" 1);
|
2055
|
15 |
by (ALLGOALS Simp_tac);
|
|
16 |
by (Fast_tac 1);
|
|
17 |
by (Fast_tac 1);
|
|
18 |
by (Fast_tac 1);
|
1447
|
19 |
(* if *)
|
2055
|
20 |
by (Deepen_tac 4 1);
|
1447
|
21 |
(* while *)
|
2031
|
22 |
by (safe_tac HOL_cs);
|
1465
|
23 |
by (resolve_tac hoare.intrs 1);
|
2055
|
24 |
by (rtac lemma 1);
|
|
25 |
by (resolve_tac hoare.intrs 1);
|
|
26 |
by (resolve_tac hoare.intrs 1);
|
|
27 |
by (ALLGOALS(fast_tac HOL_cs));
|
1447
|
28 |
qed "vc_sound";
|
|
29 |
|
5069
|
30 |
Goal "!P Q. (!s. P s --> Q s) --> (!s. awp c P s --> awp c Q s)";
|
5183
|
31 |
by (induct_tac "c" 1);
|
2055
|
32 |
by (ALLGOALS Asm_simp_tac);
|
2031
|
33 |
by (EVERY1[rtac allI, rtac allI, rtac impI]);
|
|
34 |
by (EVERY1[etac allE, etac allE, etac mp]);
|
|
35 |
by (EVERY1[etac allE, etac allE, etac mp, atac]);
|
2810
|
36 |
qed_spec_mp "awp_mono";
|
1447
|
37 |
|
5069
|
38 |
Goal "!P Q. (!s. P s --> Q s) --> (!s. vc c P s --> vc c Q s)";
|
5183
|
39 |
by (induct_tac "c" 1);
|
2055
|
40 |
by (ALLGOALS Asm_simp_tac);
|
2031
|
41 |
by (safe_tac HOL_cs);
|
|
42 |
by (EVERY[etac allE 1,etac allE 1,etac impE 1,etac allE 2,etac mp 2,atac 2]);
|
2810
|
43 |
by (fast_tac (HOL_cs addEs [awp_mono]) 1);
|
1486
|
44 |
qed_spec_mp "vc_mono";
|
1447
|
45 |
|
5278
|
46 |
Goal "|- {P}c{Q} ==> \
|
5117
|
47 |
\ (? ac. astrip ac = c & (!s. vc ac Q s) & (!s. P s --> awp ac Q s))";
|
1743
|
48 |
by (etac hoare.induct 1);
|
2055
|
49 |
by (res_inst_tac [("x","Askip")] exI 1);
|
|
50 |
by (Simp_tac 1);
|
|
51 |
by (res_inst_tac [("x","Aass x a")] exI 1);
|
|
52 |
by (Simp_tac 1);
|
|
53 |
by (SELECT_GOAL(safe_tac HOL_cs)1);
|
|
54 |
by (res_inst_tac [("x","Asemi ac aca")] exI 1);
|
|
55 |
by (Asm_simp_tac 1);
|
2810
|
56 |
by (fast_tac (HOL_cs addSEs [awp_mono,vc_mono]) 1);
|
2055
|
57 |
by (SELECT_GOAL(safe_tac HOL_cs)1);
|
|
58 |
by (res_inst_tac [("x","Aif b ac aca")] exI 1);
|
|
59 |
by (Asm_simp_tac 1);
|
|
60 |
by (SELECT_GOAL(safe_tac HOL_cs)1);
|
5117
|
61 |
by (res_inst_tac [("x","Awhile b P ac")] exI 1);
|
2055
|
62 |
by (Asm_simp_tac 1);
|
1743
|
63 |
by (safe_tac HOL_cs);
|
2031
|
64 |
by (res_inst_tac [("x","ac")] exI 1);
|
|
65 |
by (Asm_simp_tac 1);
|
2810
|
66 |
by (fast_tac (HOL_cs addSEs [awp_mono,vc_mono]) 1);
|
1743
|
67 |
qed "vc_complete";
|
1451
|
68 |
|
5069
|
69 |
Goal "!Q. vcawp c Q = (vc c Q, awp c Q)";
|
5183
|
70 |
by (induct_tac "c" 1);
|
4089
|
71 |
by (ALLGOALS (asm_simp_tac (simpset() addsimps [Let_def])));
|
2810
|
72 |
qed "vcawp_vc_awp";
|