9 theory Equivalence = OpSem + AxSem: |
9 theory Equivalence = OpSem + AxSem: |
10 |
10 |
11 subsection "Validity" |
11 subsection "Validity" |
12 |
12 |
13 constdefs |
13 constdefs |
14 valid :: "[assn,stmt,assn] => bool" ("|= {(1_)}/ (_)/ {(1_)}" [3,90,3] 60) |
14 valid :: "[assn,stmt, assn] => bool" ("|= {(1_)}/ (_)/ {(1_)}" [3,90,3] 60) |
15 "|= {P} c {Q} \<equiv> \<forall>s t. P s --> (\<exists>n. s -c-n-> t) --> Q t" |
15 "|= {P} c {Q} \<equiv> \<forall>s t. P s --> (\<exists>n. s -c -n-> t) --> Q t" |
16 |
16 |
17 nvalid :: "[nat, triple ] => bool" ("|=_: _" [61,61] 60) |
17 evalid :: "[assn,expr,vassn] => bool" ("|=e {(1_)}/ (_)/ {(1_)}" [3,90,3] 60) |
18 "|=n: t \<equiv> let (P,c,Q) = t in \<forall>s t. s -c-n-> t --> P s --> Q t" |
18 "|=e {P} e {Q} \<equiv> \<forall>s v t. P s --> (\<exists>n. s -e>v-n-> t) --> Q v t" |
19 |
19 |
20 nvalids :: "[nat, triple set] => bool" ("||=_: _" [61,61] 60) |
20 |
|
21 nvalid :: "[nat, triple ] => bool" ("|=_: _" [61,61] 60) |
|
22 "|=n: t \<equiv> let (P,c,Q) = t in \<forall>s t. s -c -n-> t --> P s --> Q t" |
|
23 |
|
24 envalid :: "[nat,etriple ] => bool" ("|=_:e _" [61,61] 60) |
|
25 "|=n:e t \<equiv> let (P,e,Q) = t in \<forall>s v t. s -e>v-n-> t --> P s --> Q v t" |
|
26 |
|
27 nvalids :: "[nat, triple set] => bool" ("||=_: _" [61,61] 60) |
21 "||=n: T \<equiv> \<forall>t\<in>T. |=n: t" |
28 "||=n: T \<equiv> \<forall>t\<in>T. |=n: t" |
22 |
29 |
23 cnvalids :: "[triple set,triple set] => bool" ("_ ||=/ _"[61,61] 60) |
30 cnvalids :: "[triple set,triple set] => bool" ("_ ||=/ _" [61,61] 60) |
24 "A ||= C \<equiv> \<forall>n. ||=n: A --> ||=n: C" |
31 "A ||= C \<equiv> \<forall>n. ||=n: A --> ||=n: C" |
|
32 |
|
33 cenvalid :: "[triple set,etriple ] => bool" ("_ ||=e/ _" [61,61] 60) |
|
34 "A ||=e t \<equiv> \<forall>n. ||=n: A --> |=n:e t" |
25 |
35 |
26 syntax (xsymbols) |
36 syntax (xsymbols) |
27 valid :: "[assn,stmt,assn] => bool" ("\<Turnstile> {(1_)}/ (_)/ {(1_)}" [3,90,3] 60) |
37 valid :: "[assn,stmt, assn] => bool" ( "\<Turnstile> {(1_)}/ (_)/ {(1_)}" [3,90,3] 60) |
28 nvalid :: "[nat, triple ] => bool" ("\<Turnstile>_: _" [61,61] 60) |
38 evalid :: "[assn,expr,vassn] => bool" ("\<Turnstile>e {(1_)}/ (_)/ {(1_)}" [3,90,3] 60) |
29 nvalids :: "[nat, triple set] => bool" ("|\<Turnstile>_: _" [61,61] 60) |
39 nvalid :: "[nat, triple ] => bool" ("\<Turnstile>_: _" [61,61] 60) |
|
40 envalid :: "[nat,etriple ] => bool" ("\<Turnstile>_:e _" [61,61] 60) |
|
41 nvalids :: "[nat, triple set] => bool" ("|\<Turnstile>_: _" [61,61] 60) |
30 cnvalids :: "[triple set,triple set] => bool" ("_ |\<Turnstile>/ _" [61,61] 60) |
42 cnvalids :: "[triple set,triple set] => bool" ("_ |\<Turnstile>/ _" [61,61] 60) |
31 |
43 cenvalid :: "[triple set,etriple ] => bool" ("_ |\<Turnstile>e/ _"[61,61] 60) |
32 syntax |
44 |
33 nvalid1::"[nat, assn,stmt,assn] => bool" ( "|=_:.{(1_)}/ (_)/ {(1_)}" |
45 |
34 [61,3,90,3] 60) |
46 lemma nvalid_def2: "\<Turnstile>n: (P,c,Q) \<equiv> \<forall>s t. s -c-n\<rightarrow> t \<longrightarrow> P s \<longrightarrow> Q t" |
35 cnvalid1::"[triple set, assn,stmt,assn] => bool" ("_ ||=.{(1_)}/ (_)/ {(1_)}" |
|
36 [61,3,90,3] 60) |
|
37 syntax (xsymbols) |
|
38 nvalid1::"[nat, assn,stmt,assn] => bool" ( "\<Turnstile>_:.{(1_)}/ (_)/ {(1_)}" |
|
39 [61,3,90,3] 60) |
|
40 cnvalid1::"[triple set, assn,stmt,assn] => bool" ( "_ |\<Turnstile>.{(1_)}/ (_)/ {(1_)}" |
|
41 [61,3,90,3] 60) |
|
42 translations |
|
43 " \<Turnstile>n:.{P} c {Q}" \<rightleftharpoons> " \<Turnstile>n: (P,c,Q)" |
|
44 "A |\<Turnstile>.{P} c {Q}" \<rightleftharpoons> "A |\<Turnstile> {(P,c,Q)}" |
|
45 |
|
46 lemma nvalid1_def2: "\<Turnstile>n:.{P} c {Q} \<equiv> \<forall>s t. s -c-n\<rightarrow> t \<longrightarrow> P s \<longrightarrow> Q t" |
|
47 by (simp add: nvalid_def Let_def) |
47 by (simp add: nvalid_def Let_def) |
48 |
48 |
49 lemma cnvalid1_def2: |
49 lemma valid_def2: "\<Turnstile> {P} c {Q} = (\<forall>n. \<Turnstile>n: (P,c,Q))" |
50 "A |\<Turnstile>.{P} c {Q} \<equiv> \<forall>n. |\<Turnstile>n: A \<longrightarrow> (\<forall>s t. s -c-n\<rightarrow> t \<longrightarrow> P s \<longrightarrow> Q t)" |
50 apply (simp add: valid_def nvalid_def2) |
51 by(simp add: nvalid1_def2 nvalids_def cnvalids_def) |
51 apply blast |
52 |
52 done |
53 lemma valid_def2: "\<Turnstile> {P} c {Q} = (\<forall>n. \<Turnstile>n:.{P} c {Q})" |
53 |
54 apply (simp add: valid_def nvalid1_def2) |
54 lemma envalid_def2: "\<Turnstile>n:e (P,e,Q) \<equiv> \<forall>s v t. s -e\<succ>v-n\<rightarrow> t \<longrightarrow> P s \<longrightarrow> Q v t" |
55 apply blast |
55 by (simp add: envalid_def Let_def) |
56 done |
56 |
|
57 lemma evalid_def2: "\<Turnstile>e {P} e {Q} = (\<forall>n. \<Turnstile>n:e (P,e,Q))" |
|
58 apply (simp add: evalid_def envalid_def2) |
|
59 apply blast |
|
60 done |
|
61 |
|
62 lemma cenvalid_def2: |
|
63 "A|\<Turnstile>e (P,e,Q) = (\<forall>n. |\<Turnstile>n: A \<longrightarrow> (\<forall>s v t. s -e\<succ>v-n\<rightarrow> t \<longrightarrow> P s \<longrightarrow> Q v t))" |
|
64 by(simp add: cenvalid_def envalid_def2) |
57 |
65 |
58 |
66 |
59 subsection "Soundness" |
67 subsection "Soundness" |
60 |
68 |
61 declare exec_elim_cases [elim!] |
69 declare exec_elim_cases [elim!] eval_elim_cases [elim!] |
62 |
70 |
63 lemma Impl_nvalid_0: "\<Turnstile>0:.{P} Impl C m {Q}" |
71 lemma Impl_nvalid_0: "\<Turnstile>0: (P,Impl C m,Q)" |
64 by (clarsimp simp add: nvalid1_def2) |
72 by (clarsimp simp add: nvalid_def2) |
65 |
73 |
66 lemma Impl_nvalid_Suc: "\<Turnstile>n:.{P} body C m {Q} \<Longrightarrow> \<Turnstile>Suc n:.{P} Impl C m {Q}" |
74 lemma Impl_nvalid_Suc: "\<Turnstile>n: (P,body C m,Q) \<Longrightarrow> \<Turnstile>Suc n: (P,Impl C m,Q)" |
67 by (clarsimp simp add: nvalid1_def2) |
75 by (clarsimp simp add: nvalid_def2) |
68 |
76 |
69 lemma nvalid_SucD: "\<And>t. \<Turnstile>Suc n:t \<Longrightarrow> \<Turnstile>n:t" |
77 lemma nvalid_SucD: "\<And>t. \<Turnstile>Suc n:t \<Longrightarrow> \<Turnstile>n:t" |
70 by (force simp add: split_paired_all nvalid1_def2 intro: exec_mono) |
78 by (force simp add: split_paired_all nvalid_def2 intro: exec_mono) |
71 |
79 |
72 lemma nvalids_SucD: "Ball A (nvalid (Suc n)) \<Longrightarrow> Ball A (nvalid n)" |
80 lemma nvalids_SucD: "Ball A (nvalid (Suc n)) \<Longrightarrow> Ball A (nvalid n)" |
73 by (fast intro: nvalid_SucD) |
81 by (fast intro: nvalid_SucD) |
74 |
82 |
75 lemma Loop_sound_lemma [rule_format (no_asm)]: |
83 lemma Loop_sound_lemma [rule_format (no_asm)]: |
76 "\<lbrakk>\<forall>s t. s -c-n\<rightarrow> t \<longrightarrow> P s \<and> s<e> \<noteq> Null \<longrightarrow> P t; s -c0-n0\<rightarrow> t\<rbrakk> \<Longrightarrow> |
84 "\<forall>s t. s -c-n\<rightarrow> t \<longrightarrow> P s \<and> s<x> \<noteq> Null \<longrightarrow> P t \<Longrightarrow> |
77 P s \<longrightarrow> c0 = While (e) c \<longrightarrow> n0 = n \<longrightarrow> P t \<and> t<e> = Null" |
85 (s -c0-n0\<rightarrow> t \<longrightarrow> P s \<longrightarrow> c0 = While (x) c \<longrightarrow> n0 = n \<longrightarrow> P t \<and> t<x> = Null)" |
78 apply (erule exec.induct) |
86 apply (rule_tac "P2.1"="%s e v n t. True" in exec_eval.induct [THEN conjunct1]) |
79 apply clarsimp+ |
87 apply clarsimp+ |
80 done |
88 done |
81 |
89 |
82 lemma Impl_sound_lemma: |
90 lemma Impl_sound_lemma: |
83 "\<lbrakk>\<forall>n. Ball (A \<union> B) (nvalid n) \<longrightarrow> Ball (\<Union>z. split (f z) ` ms) (nvalid n); |
91 "\<lbrakk>\<forall>n. Ball (A \<union> B) (nvalid n) \<longrightarrow> Ball (\<Union>z. split (f z) ` ms) (nvalid n); |
84 (C, m) \<in> ms; Ball A (nvalid na); Ball B (nvalid na)\<rbrakk> \<Longrightarrow> nvalid na (f z C m)" |
92 (C, m) \<in> ms; Ball A (nvalid na); Ball B (nvalid na)\<rbrakk> \<Longrightarrow> nvalid na (f z C m)" |
85 by blast |
93 by blast |
86 |
94 |
87 lemma hoare_sound_main: "A |\<turnstile> C \<Longrightarrow> A |\<Turnstile> C" |
95 lemma all_conjunct2: "\<forall>l. P' l \<and> P l \<Longrightarrow> \<forall>l. P l" |
88 apply (erule hoare.induct) |
96 by fast |
89 apply (simp_all only: cnvalid1_def2) |
97 |
90 apply clarsimp |
98 lemma all3_conjunct2: |
91 apply clarsimp |
99 "\<forall>a p l. (P' a p l \<and> P a p l) \<Longrightarrow> \<forall>a p l. P a p l" |
92 apply (clarsimp split add: split_if_asm) |
100 by fast |
93 apply (clarsimp,tactic "smp_tac 1 1",erule(2) Loop_sound_lemma,(rule HOL.refl)+) |
101 |
94 apply clarsimp |
102 lemma cnvalid1_eq: |
95 apply clarsimp |
103 "A |\<Turnstile> {(P,c,Q)} \<equiv> \<forall>n. |\<Turnstile>n: A \<longrightarrow> (\<forall>s t. s -c-n\<rightarrow> t \<longrightarrow> P s \<longrightarrow> Q t)" |
96 apply clarsimp |
104 by(simp add: cnvalids_def nvalids_def nvalid_def2) |
97 apply clarsimp |
105 |
|
106 lemma hoare_sound_main:"\<And>t. (A |\<turnstile> C \<longrightarrow> A |\<Turnstile> C) \<and> (A |\<turnstile>e t \<longrightarrow> A |\<Turnstile>e t)" |
|
107 apply (tactic "split_all_tac 1", rename_tac P e Q) |
|
108 apply (rule hoare_ehoare.induct) |
|
109 apply (tactic {* ALLGOALS (REPEAT o dresolve_tac [thm "all_conjunct2", thm "all3_conjunct2"]) *}) |
|
110 apply (tactic {* ALLGOALS (REPEAT o thin_tac "?x : hoare") *}) |
|
111 apply (tactic {* ALLGOALS (REPEAT o thin_tac "?x : ehoare") *}) |
|
112 apply (simp_all only: cnvalid1_eq cenvalid_def2) |
|
113 apply fast |
|
114 apply fast |
|
115 apply fast |
|
116 apply (clarify,tactic "smp_tac 1 1",erule(2) Loop_sound_lemma,(rule HOL.refl)+) |
|
117 apply fast |
|
118 apply fast |
|
119 apply fast |
|
120 apply fast |
|
121 apply fast |
|
122 apply fast |
98 apply (clarsimp del: Meth_elim_cases) (* Call *) |
123 apply (clarsimp del: Meth_elim_cases) (* Call *) |
|
124 apply (tactic "smp_tac 1 1", tactic "smp_tac 3 1", tactic "smp_tac 0 1") |
|
125 apply (tactic "smp_tac 2 1", tactic "smp_tac 3 1", tactic "smp_tac 0 1") |
|
126 apply (tactic "smp_tac 4 1", tactic "smp_tac 2 1", fast) |
99 apply (clarsimp del: Impl_elim_cases) (* Meth *) |
127 apply (clarsimp del: Impl_elim_cases) (* Meth *) |
100 defer |
128 defer |
101 apply blast (* Conseq *) |
129 prefer 4 apply blast (* Conseq *) |
|
130 prefer 4 apply blast (* eConseq *) |
102 apply (simp_all (no_asm_use) only: cnvalids_def nvalids_def) |
131 apply (simp_all (no_asm_use) only: cnvalids_def nvalids_def) |
103 apply blast |
132 apply blast |
104 apply blast |
133 apply blast |
105 apply blast |
134 apply blast |
106 (* Impl *) |
135 (* Impl *) |
107 apply (erule thin_rl) |
|
108 apply (rule allI) |
136 apply (rule allI) |
109 apply (induct_tac "n") |
137 apply (induct_tac "n") |
110 apply (clarify intro!: Impl_nvalid_0) |
138 apply (clarify intro!: Impl_nvalid_0) |
111 apply (clarify intro!: Impl_nvalid_Suc) |
139 apply (clarify intro!: Impl_nvalid_Suc) |
112 apply (drule nvalids_SucD) |
140 apply (drule nvalids_SucD) |
114 apply (drule (4) Impl_sound_lemma) |
142 apply (drule (4) Impl_sound_lemma) |
115 done |
143 done |
116 |
144 |
117 theorem hoare_sound: "{} \<turnstile> {P} c {Q} \<Longrightarrow> \<Turnstile> {P} c {Q}" |
145 theorem hoare_sound: "{} \<turnstile> {P} c {Q} \<Longrightarrow> \<Turnstile> {P} c {Q}" |
118 apply (simp only: valid_def2) |
146 apply (simp only: valid_def2) |
119 apply (drule hoare_sound_main) |
147 apply (drule hoare_sound_main [THEN conjunct1, rule_format]) |
120 apply (unfold cnvalids_def nvalids_def) |
148 apply (unfold cnvalids_def nvalids_def) |
121 apply fast |
149 apply fast |
122 done |
150 done |
123 |
151 |
|
152 theorem ehoare_sound: "{} \<turnstile>e {P} e {Q} \<Longrightarrow> \<Turnstile>e {P} e {Q}" |
|
153 apply (simp only: evalid_def2) |
|
154 apply (drule hoare_sound_main [THEN conjunct2, rule_format]) |
|
155 apply (unfold cenvalid_def nvalids_def) |
|
156 apply fast |
|
157 done |
|
158 |
124 |
159 |
125 subsection "(Relative) Completeness" |
160 subsection "(Relative) Completeness" |
126 |
161 |
127 constdefs MGT :: "stmt => state => triple" |
162 constdefs MGT :: "stmt => state => triple" |
128 "MGT c z \<equiv> (\<lambda> s. z = s, c, %t. \<exists>n. z -c-n-> t)" |
163 "MGT c z \<equiv> (\<lambda>s. z = s, c, \<lambda> t. \<exists>n. z -c- n-> t)" |
|
164 eMGT :: "expr => state => etriple" |
|
165 "eMGT e z \<equiv> (\<lambda>s. z = s, e, \<lambda>v t. \<exists>n. z -e>v-n-> t)" |
129 |
166 |
130 lemma MGF_implies_complete: |
167 lemma MGF_implies_complete: |
131 "\<forall>z. {} |\<turnstile> {MGT c z} \<Longrightarrow> \<Turnstile> {P} c {Q} \<Longrightarrow> {} \<turnstile> {P} c {Q}" |
168 "\<forall>z. {} |\<turnstile> { MGT c z} \<Longrightarrow> \<Turnstile> {P} c {Q} \<Longrightarrow> {} \<turnstile> {P} c {Q}" |
132 apply (simp only: valid_def2) |
169 apply (simp only: valid_def2) |
133 apply (unfold MGT_def) |
170 apply (unfold MGT_def) |
134 apply (erule hoare.Conseq) |
171 apply (erule hoare_ehoare.Conseq) |
135 apply (clarsimp simp add: nvalid1_def2) |
172 apply (clarsimp simp add: nvalid_def2) |
136 done |
173 done |
137 |
174 |
138 |
175 lemma eMGF_implies_complete: |
139 declare exec.intros[intro!] |
176 "\<forall>z. {} |\<turnstile>e eMGT e z \<Longrightarrow> \<Turnstile>e {P} e {Q} \<Longrightarrow> {} \<turnstile>e {P} e {Q}" |
|
177 apply (simp only: evalid_def2) |
|
178 apply (unfold eMGT_def) |
|
179 apply (erule hoare_ehoare.eConseq) |
|
180 apply (clarsimp simp add: envalid_def2) |
|
181 done |
|
182 |
|
183 declare exec_eval.intros[intro!] |
140 |
184 |
141 lemma MGF_Loop: "\<forall>z. A \<turnstile> {op = z} c {\<lambda>t. \<exists>n. z -c-n\<rightarrow> t} \<Longrightarrow> |
185 lemma MGF_Loop: "\<forall>z. A \<turnstile> {op = z} c {\<lambda>t. \<exists>n. z -c-n\<rightarrow> t} \<Longrightarrow> |
142 A \<turnstile> {op = z} While (e) c {\<lambda>t. \<exists>n. z -While (e) c-n\<rightarrow> t}" |
186 A \<turnstile> {op = z} While (e) c {\<lambda>t. \<exists>n. z -While (e) c-n\<rightarrow> t}" |
143 apply (rule_tac P' = "\<lambda>z s. (z,s) \<in> ({(s,t). \<exists>n. s<e> \<noteq> Null \<and> s -c-n\<rightarrow> t})^*" |
187 apply (rule_tac P' = "\<lambda>z s. (z,s) \<in> ({(s,t). \<exists>n. s<e> \<noteq> Null \<and> s -c-n\<rightarrow> t})^*" |
144 in hoare.Conseq) |
188 in hoare_ehoare.Conseq) |
145 apply (rule allI) |
189 apply (rule allI) |
146 apply (rule hoare.Loop) |
190 apply (rule hoare_ehoare.Loop) |
147 apply (erule hoare.Conseq) |
191 apply (erule hoare_ehoare.Conseq) |
148 apply clarsimp |
192 apply clarsimp |
149 apply (blast intro:rtrancl_into_rtrancl) |
193 apply (blast intro:rtrancl_into_rtrancl) |
150 apply (erule thin_rl) |
194 apply (erule thin_rl) |
151 apply clarsimp |
195 apply clarsimp |
152 apply (erule_tac x = z in allE) |
196 apply (erule_tac x = z in allE) |
153 apply clarsimp |
197 apply clarsimp |
154 apply (erule converse_rtrancl_induct) |
198 apply (erule converse_rtrancl_induct) |
155 apply blast |
199 apply blast |
156 apply clarsimp |
200 apply clarsimp |
157 apply (drule (1) exec_max2) |
201 apply (drule (1) exec_exec_max) |
158 apply (blast del: exec_elim_cases) |
202 apply (blast del: exec_elim_cases) |
159 done |
203 done |
160 |
204 |
161 lemma MGF_lemma[rule_format]: |
205 lemma MGF_lemma: "\<forall>C m z. A |\<turnstile> {MGT (Impl C m) z} \<Longrightarrow> |
162 "(\<forall>C m z. A |\<turnstile> {MGT (Impl C m) z}) \<longrightarrow> (\<forall>z. A |\<turnstile> {MGT c z})" |
206 (\<forall>z. A |\<turnstile> {MGT c z}) \<and> (\<forall>z. A |\<turnstile>e eMGT e z)" |
163 apply (simp add: MGT_def) |
207 apply (simp add: MGT_def eMGT_def) |
164 apply (induct_tac c) |
208 apply (rule stmt_expr.induct) |
165 apply (tactic "ALLGOALS Clarify_tac") |
209 apply (rule_tac [!] allI) |
166 |
210 |
167 apply (rule Conseq1 [OF hoare.Skip]) |
211 apply (rule Conseq1 [OF hoare_ehoare.Skip]) |
168 apply blast |
212 apply blast |
169 |
213 |
170 apply (rule hoare.Comp) |
214 apply (rule hoare_ehoare.Comp) |
171 apply (erule spec) |
215 apply (erule spec) |
172 apply (erule hoare.Conseq) |
216 apply (erule hoare_ehoare.Conseq) |
|
217 apply clarsimp |
|
218 apply (drule (1) exec_exec_max) |
|
219 apply blast |
|
220 |
|
221 apply (erule thin_rl) |
|
222 apply (rule hoare_ehoare.Cond) |
|
223 apply (erule spec) |
|
224 apply (rule allI) |
|
225 apply (simp) |
|
226 apply (rule conjI) |
|
227 apply (rule impI, erule hoare_ehoare.Conseq, clarsimp, drule (1) eval_exec_max, |
|
228 erule thin_rl, erule thin_rl, force)+ |
|
229 |
|
230 apply (erule MGF_Loop) |
|
231 |
|
232 apply (erule hoare_ehoare.eConseq [THEN hoare_ehoare.LAss]) |
|
233 apply fast |
|
234 |
|
235 apply (erule thin_rl) |
|
236 apply (rule_tac Q = "\<lambda>a s. \<exists>n. z -expr1\<succ>Addr a-n\<rightarrow> s" in hoare_ehoare.FAss) |
|
237 apply (drule spec) |
|
238 apply (erule eConseq2) |
|
239 apply fast |
|
240 apply (rule allI) |
|
241 apply (erule hoare_ehoare.eConseq) |
|
242 apply clarsimp |
|
243 apply (drule (1) eval_eval_max) |
|
244 apply blast |
|
245 |
|
246 apply (rule hoare_ehoare.Meth) |
|
247 apply (rule allI) |
|
248 apply (drule spec, drule spec, erule hoare_ehoare.Conseq) |
|
249 apply blast |
|
250 |
|
251 apply blast |
|
252 |
|
253 apply (rule eConseq1 [OF hoare_ehoare.NewC]) |
|
254 apply blast |
|
255 |
|
256 apply (erule hoare_ehoare.eConseq [THEN hoare_ehoare.Cast]) |
|
257 apply fast |
|
258 |
|
259 apply (rule eConseq1 [OF hoare_ehoare.LAcc]) |
|
260 apply blast |
|
261 |
|
262 apply (erule hoare_ehoare.eConseq [THEN hoare_ehoare.FAcc]) |
|
263 apply fast |
|
264 |
|
265 apply (rule_tac R = "\<lambda>a v s. \<exists>n1 n2 t. z -expr1\<succ>a-n1\<rightarrow> t \<and> t -expr2\<succ>v-n2\<rightarrow> s" in |
|
266 hoare_ehoare.Call) |
|
267 apply (erule spec) |
|
268 apply (rule allI) |
|
269 apply (erule hoare_ehoare.eConseq) |
|
270 apply clarsimp |
|
271 apply blast |
|
272 apply (rule allI)+ |
|
273 apply (rule hoare_ehoare.Meth) |
|
274 apply (rule allI) |
|
275 apply (drule spec, drule spec, erule hoare_ehoare.Conseq) |
173 apply (erule thin_rl, erule thin_rl) |
276 apply (erule thin_rl, erule thin_rl) |
174 apply clarsimp |
277 apply (clarsimp del: Impl_elim_cases) |
175 apply (drule (1) exec_max2) |
278 apply (drule (2) eval_eval_exec_max) |
176 apply blast |
279 apply (fast del: Impl_elim_cases) |
177 |
|
178 apply (rule hoare.Cond) |
|
179 apply (erule hoare.Conseq) |
|
180 apply (erule thin_rl, erule thin_rl) |
|
181 apply force |
|
182 apply (erule hoare.Conseq) |
|
183 apply (erule thin_rl, erule thin_rl) |
|
184 apply force |
|
185 |
|
186 apply (erule MGF_Loop) |
|
187 |
|
188 apply (rule Conseq1 [OF hoare.NewC]) |
|
189 apply blast |
|
190 |
|
191 apply (rule Conseq1 [OF hoare.Cast]) |
|
192 apply blast |
|
193 |
|
194 apply (rule Conseq1 [OF hoare.FAcc]) |
|
195 apply blast |
|
196 |
|
197 apply (rule Conseq1 [OF hoare.FAss]) |
|
198 apply blast |
|
199 |
|
200 apply (rule hoare.Call) |
|
201 apply (rule allI) |
|
202 apply (rule hoare.Meth) |
|
203 apply (rule allI) |
|
204 apply (drule spec, drule spec, erule hoare.Conseq) |
|
205 apply blast |
|
206 |
|
207 apply (rule hoare.Meth) |
|
208 apply (rule allI) |
|
209 apply (drule spec, drule spec, erule hoare.Conseq) |
|
210 apply blast |
|
211 |
|
212 apply blast |
|
213 done |
280 done |
214 |
281 |
215 lemma MGF_Impl: "{} |\<turnstile> {MGT (Impl C m) z}" |
282 lemma MGF_Impl: "{} |\<turnstile> {MGT (Impl C m) z}" |
216 apply (unfold MGT_def) |
283 apply (unfold MGT_def) |
217 apply (rule Impl1) |
284 apply (rule Impl1) |
218 apply (rule_tac [2] UNIV_I) |
285 apply (rule_tac [2] UNIV_I) |
219 apply clarsimp |
286 apply clarsimp |
220 apply (rule hoare.ConjI) |
287 apply (rule hoare_ehoare.ConjI) |
221 apply clarsimp |
288 apply clarsimp |
222 apply (rule ssubst [OF Impl_body_eq]) |
289 apply (rule ssubst [OF Impl_body_eq]) |
223 apply (fold MGT_def) |
290 apply (fold MGT_def) |
224 apply (rule MGF_lemma) |
291 apply (rule MGF_lemma [THEN conjunct1, rule_format]) |
225 apply (rule hoare.Asm) |
292 apply (rule hoare_ehoare.Asm) |
226 apply force |
293 apply force |
227 done |
294 done |
228 |
295 |
229 theorem hoare_relative_complete: "\<Turnstile> {P} c {Q} \<Longrightarrow> {} \<turnstile> {P} c {Q}" |
296 theorem hoare_relative_complete: "\<Turnstile> {P} c {Q} \<Longrightarrow> {} \<turnstile> {P} c {Q}" |
230 apply (rule MGF_implies_complete) |
297 apply (rule MGF_implies_complete) |
231 apply (erule_tac [2] asm_rl) |
298 apply (erule_tac [2] asm_rl) |
232 apply (rule allI) |
299 apply (rule allI) |
233 apply (rule MGF_lemma) |
300 apply (rule MGF_lemma [THEN conjunct1, rule_format]) |
234 apply (rule MGF_Impl) |
301 apply (rule MGF_Impl) |
235 done |
302 done |
236 |
303 |
|
304 theorem ehoare_relative_complete: "\<Turnstile>e {P} e {Q} \<Longrightarrow> {} \<turnstile>e {P} e {Q}" |
|
305 apply (rule eMGF_implies_complete) |
|
306 apply (erule_tac [2] asm_rl) |
|
307 apply (rule allI) |
|
308 apply (rule MGF_lemma [THEN conjunct2, rule_format]) |
|
309 apply (rule MGF_Impl) |
|
310 done |
|
311 |
237 end |
312 end |