28 by (resolve_tac hoare.intrs 1); |
28 by (resolve_tac hoare.intrs 1); |
29 by (ALLGOALS(fast_tac HOL_cs)); |
29 by (ALLGOALS(fast_tac HOL_cs)); |
30 qed "vc_sound"; |
30 qed "vc_sound"; |
31 |
31 |
32 Goal "!P Q. (!s. P s --> Q s) --> (!s. awp c P s --> awp c Q s)"; |
32 Goal "!P Q. (!s. P s --> Q s) --> (!s. awp c P s --> awp c Q s)"; |
33 by (acom.induct_tac "c" 1); |
33 by (induct_tac "c" 1); |
34 by (ALLGOALS Asm_simp_tac); |
34 by (ALLGOALS Asm_simp_tac); |
35 by (EVERY1[rtac allI, rtac allI, rtac impI]); |
35 by (EVERY1[rtac allI, rtac allI, rtac impI]); |
36 by (EVERY1[etac allE, etac allE, etac mp]); |
36 by (EVERY1[etac allE, etac allE, etac mp]); |
37 by (EVERY1[etac allE, etac allE, etac mp, atac]); |
37 by (EVERY1[etac allE, etac allE, etac mp, atac]); |
38 qed_spec_mp "awp_mono"; |
38 qed_spec_mp "awp_mono"; |
39 |
39 |
40 Goal "!P Q. (!s. P s --> Q s) --> (!s. vc c P s --> vc c Q s)"; |
40 Goal "!P Q. (!s. P s --> Q s) --> (!s. vc c P s --> vc c Q s)"; |
41 by (acom.induct_tac "c" 1); |
41 by (induct_tac "c" 1); |
42 by (ALLGOALS Asm_simp_tac); |
42 by (ALLGOALS Asm_simp_tac); |
43 by (safe_tac HOL_cs); |
43 by (safe_tac HOL_cs); |
44 by (EVERY[etac allE 1,etac allE 1,etac impE 1,etac allE 2,etac mp 2,atac 2]); |
44 by (EVERY[etac allE 1,etac allE 1,etac impE 1,etac allE 2,etac mp 2,atac 2]); |
45 by (fast_tac (HOL_cs addEs [awp_mono]) 1); |
45 by (fast_tac (HOL_cs addEs [awp_mono]) 1); |
46 qed_spec_mp "vc_mono"; |
46 qed_spec_mp "vc_mono"; |
68 by (Asm_simp_tac 1); |
68 by (Asm_simp_tac 1); |
69 by (fast_tac (HOL_cs addSEs [awp_mono,vc_mono]) 1); |
69 by (fast_tac (HOL_cs addSEs [awp_mono,vc_mono]) 1); |
70 qed "vc_complete"; |
70 qed "vc_complete"; |
71 |
71 |
72 Goal "!Q. vcawp c Q = (vc c Q, awp c Q)"; |
72 Goal "!Q. vcawp c Q = (vc c Q, awp c Q)"; |
73 by (acom.induct_tac "c" 1); |
73 by (induct_tac "c" 1); |
74 by (ALLGOALS (asm_simp_tac (simpset() addsimps [Let_def]))); |
74 by (ALLGOALS (asm_simp_tac (simpset() addsimps [Let_def]))); |
75 qed "vcawp_vc_awp"; |
75 qed "vcawp_vc_awp"; |