166 |
166 |
167 lemma in_gamma_update: |
167 lemma in_gamma_update: |
168 "\<lbrakk> s : \<gamma>\<^isub>f S; i : \<gamma> a \<rbrakk> \<Longrightarrow> s(x := i) : \<gamma>\<^isub>f(update S x a)" |
168 "\<lbrakk> s : \<gamma>\<^isub>f S; i : \<gamma> a \<rbrakk> \<Longrightarrow> s(x := i) : \<gamma>\<^isub>f(update S x a)" |
169 by(simp add: \<gamma>_st_def lookup_update) |
169 by(simp add: \<gamma>_st_def lookup_update) |
170 |
170 |
171 |
171 lemma step_preserves_le: |
172 lemma step_preserves_le2: |
172 "\<lbrakk> S \<subseteq> \<gamma>\<^isub>o S'; cs \<le> \<gamma>\<^isub>c ca \<rbrakk> \<Longrightarrow> step S cs \<le> \<gamma>\<^isub>c (step' S' ca)" |
173 "\<lbrakk> S \<subseteq> \<gamma>\<^isub>o S'; cs \<le> \<gamma>\<^isub>c ca; strip cs = c; strip ca = c \<rbrakk> |
173 proof(induction cs arbitrary: ca S S') |
174 \<Longrightarrow> step S cs \<le> \<gamma>\<^isub>c (step' S' ca)" |
174 case SKIP thus ?case by(auto simp:SKIP_le map_acom_SKIP) |
175 proof(induction c arbitrary: cs ca S S') |
|
176 case SKIP thus ?case |
|
177 by(auto simp:strip_eq_SKIP) |
|
178 next |
175 next |
179 case Assign thus ?case |
176 case Assign thus ?case |
180 by (fastforce simp: strip_eq_Assign intro: aval'_sound in_gamma_update |
177 by (fastforce simp: Assign_le map_acom_Assign intro: aval'_sound in_gamma_update |
181 split: option.splits del:subsetD) |
178 split: option.splits del:subsetD) |
182 next |
179 next |
183 case Semi thus ?case apply (auto simp: strip_eq_Semi) |
180 case Semi thus ?case apply (auto simp: Semi_le map_acom_Semi) |
184 by (metis le_post post_map_acom) |
181 by (metis le_post post_map_acom) |
185 next |
182 next |
186 case (If b c1 c2) |
183 case (If b cs1 cs2 P) |
187 then obtain cs1 cs2 ca1 ca2 P Pa where |
184 then obtain ca1 ca2 Pa where |
188 "cs= IF b THEN cs1 ELSE cs2 {P}" "ca= IF b THEN ca1 ELSE ca2 {Pa}" |
185 "ca= IF b THEN ca1 ELSE ca2 {Pa}" |
189 "P \<subseteq> \<gamma>\<^isub>o Pa" "cs1 \<le> \<gamma>\<^isub>c ca1" "cs2 \<le> \<gamma>\<^isub>c ca2" |
186 "P \<subseteq> \<gamma>\<^isub>o Pa" "cs1 \<le> \<gamma>\<^isub>c ca1" "cs2 \<le> \<gamma>\<^isub>c ca2" |
190 "strip cs1 = c1" "strip ca1 = c1" "strip cs2 = c2" "strip ca2 = c2" |
187 by (fastforce simp: If_le map_acom_If) |
191 by (fastforce simp: strip_eq_If) |
|
192 moreover have "post cs1 \<subseteq> \<gamma>\<^isub>o(post ca1 \<squnion> post ca2)" |
188 moreover have "post cs1 \<subseteq> \<gamma>\<^isub>o(post ca1 \<squnion> post ca2)" |
193 by (metis (no_types) `cs1 \<le> \<gamma>\<^isub>c ca1` join_ge1 le_post mono_gamma_o order_trans post_map_acom) |
189 by (metis (no_types) `cs1 \<le> \<gamma>\<^isub>c ca1` join_ge1 le_post mono_gamma_o order_trans post_map_acom) |
194 moreover have "post cs2 \<subseteq> \<gamma>\<^isub>o(post ca1 \<squnion> post ca2)" |
190 moreover have "post cs2 \<subseteq> \<gamma>\<^isub>o(post ca1 \<squnion> post ca2)" |
195 by (metis (no_types) `cs2 \<le> \<gamma>\<^isub>c ca2` join_ge2 le_post mono_gamma_o order_trans post_map_acom) |
191 by (metis (no_types) `cs2 \<le> \<gamma>\<^isub>c ca2` join_ge2 le_post mono_gamma_o order_trans post_map_acom) |
196 ultimately show ?case using `S \<subseteq> \<gamma>\<^isub>o S'` |
192 ultimately show ?case using `S \<subseteq> \<gamma>\<^isub>o S'` |
197 by (simp add: If.IH subset_iff bfilter_sound) |
193 by (simp add: If.IH subset_iff bfilter_sound) |
198 next |
194 next |
199 case (While b c1) |
195 case (While I b cs1 P) |
200 then obtain cs1 ca1 I P Ia Pa where |
196 then obtain ca1 Ia Pa where |
201 "cs = {I} WHILE b DO cs1 {P}" "ca = {Ia} WHILE b DO ca1 {Pa}" |
197 "ca = {Ia} WHILE b DO ca1 {Pa}" |
202 "I \<subseteq> \<gamma>\<^isub>o Ia" "P \<subseteq> \<gamma>\<^isub>o Pa" "cs1 \<le> \<gamma>\<^isub>c ca1" |
198 "I \<subseteq> \<gamma>\<^isub>o Ia" "P \<subseteq> \<gamma>\<^isub>o Pa" "cs1 \<le> \<gamma>\<^isub>c ca1" |
203 "strip cs1 = c1" "strip ca1 = c1" |
199 by (fastforce simp: map_acom_While While_le) |
204 by (fastforce simp: strip_eq_While) |
|
205 moreover have "S \<union> post cs1 \<subseteq> \<gamma>\<^isub>o (S' \<squnion> post ca1)" |
200 moreover have "S \<union> post cs1 \<subseteq> \<gamma>\<^isub>o (S' \<squnion> post ca1)" |
206 using `S \<subseteq> \<gamma>\<^isub>o S'` le_post[OF `cs1 \<le> \<gamma>\<^isub>c ca1`, simplified] |
201 using `S \<subseteq> \<gamma>\<^isub>o S'` le_post[OF `cs1 \<le> \<gamma>\<^isub>c ca1`, simplified] |
207 by (metis (no_types) join_ge1 join_ge2 le_sup_iff mono_gamma_o order_trans) |
202 by (metis (no_types) join_ge1 join_ge2 le_sup_iff mono_gamma_o order_trans) |
208 ultimately show ?case by (simp add: While.IH subset_iff bfilter_sound) |
203 ultimately show ?case by (simp add: While.IH subset_iff bfilter_sound) |
209 qed |
204 qed |
210 |
|
211 lemma step_preserves_le: |
|
212 "\<lbrakk> S \<subseteq> \<gamma>\<^isub>o S'; cs \<le> \<gamma>\<^isub>c ca; strip cs = c \<rbrakk> |
|
213 \<Longrightarrow> step S cs \<le> \<gamma>\<^isub>c(step' S' ca)" |
|
214 by (metis le_strip step_preserves_le2 strip_acom) |
|
215 |
205 |
216 lemma AI_sound: "AI c = Some c' \<Longrightarrow> CS UNIV c \<le> \<gamma>\<^isub>c c'" |
206 lemma AI_sound: "AI c = Some c' \<Longrightarrow> CS UNIV c \<le> \<gamma>\<^isub>c c'" |
217 proof(simp add: CS_def AI_def) |
207 proof(simp add: CS_def AI_def) |
218 assume 1: "lpfp\<^isub>c (step' \<top>) c = Some c'" |
208 assume 1: "lpfp\<^isub>c (step' \<top>) c = Some c'" |
219 have 2: "step' \<top> c' \<sqsubseteq> c'" by(rule lpfpc_pfp[OF 1]) |
209 have 2: "step' \<top> c' \<sqsubseteq> c'" by(rule lpfpc_pfp[OF 1]) |
220 have 3: "strip (\<gamma>\<^isub>c (step' \<top> c')) = c" |
210 have 3: "strip (\<gamma>\<^isub>c (step' \<top> c')) = c" |
221 by(simp add: strip_lpfpc[OF _ 1]) |
211 by(simp add: strip_lpfpc[OF _ 1]) |
222 have "lfp (step UNIV) c \<le> \<gamma>\<^isub>c (step' \<top> c')" |
212 have "lfp (step UNIV) c \<le> \<gamma>\<^isub>c (step' \<top> c')" |
223 proof(rule lfp_lowerbound[simplified,OF 3]) |
213 proof(rule lfp_lowerbound[simplified,OF 3]) |
224 show "step UNIV (\<gamma>\<^isub>c (step' \<top> c')) \<le> \<gamma>\<^isub>c (step' \<top> c')" |
214 show "step UNIV (\<gamma>\<^isub>c (step' \<top> c')) \<le> \<gamma>\<^isub>c (step' \<top> c')" |
225 proof(rule step_preserves_le[OF _ _ 3]) |
215 proof(rule step_preserves_le[OF _ _]) |
226 show "UNIV \<subseteq> \<gamma>\<^isub>o \<top>" by simp |
216 show "UNIV \<subseteq> \<gamma>\<^isub>o \<top>" by simp |
227 show "\<gamma>\<^isub>c (step' \<top> c') \<le> \<gamma>\<^isub>c c'" by(rule mono_gamma_c[OF 2]) |
217 show "\<gamma>\<^isub>c (step' \<top> c') \<le> \<gamma>\<^isub>c c'" by(rule mono_gamma_c[OF 2]) |
228 qed |
218 qed |
229 qed |
219 qed |
230 from this 2 show "lfp (step UNIV) c \<le> \<gamma>\<^isub>c c'" |
220 from this 2 show "lfp (step UNIV) c \<le> \<gamma>\<^isub>c c'" |