307 lemma in_gamma_update: |
307 lemma in_gamma_update: |
308 "\<lbrakk> s : \<gamma>\<^isub>f S; i : \<gamma> a \<rbrakk> \<Longrightarrow> s(x := i) : \<gamma>\<^isub>f(S(x := a))" |
308 "\<lbrakk> s : \<gamma>\<^isub>f S; i : \<gamma> a \<rbrakk> \<Longrightarrow> s(x := i) : \<gamma>\<^isub>f(S(x := a))" |
309 by(simp add: \<gamma>_fun_def) |
309 by(simp add: \<gamma>_fun_def) |
310 |
310 |
311 lemma step_preserves_le2: |
311 lemma step_preserves_le2: |
312 "\<lbrakk> S \<subseteq> \<gamma>\<^isub>o sa; cs \<le> \<gamma>\<^isub>c ca; strip cs = c; strip ca = c \<rbrakk> |
312 "\<lbrakk> S \<subseteq> \<gamma>\<^isub>o S'; cs \<le> \<gamma>\<^isub>c ca; strip cs = c; strip ca = c \<rbrakk> |
313 \<Longrightarrow> step S cs \<le> \<gamma>\<^isub>c (step' sa ca)" |
313 \<Longrightarrow> step S cs \<le> \<gamma>\<^isub>c (step' S' ca)" |
314 proof(induction c arbitrary: cs ca S sa) |
314 proof(induction c arbitrary: cs ca S S') |
315 case SKIP thus ?case |
315 case SKIP thus ?case |
316 by(auto simp:strip_eq_SKIP) |
316 by(auto simp:strip_eq_SKIP) |
317 next |
317 next |
318 case Assign thus ?case |
318 case Assign thus ?case |
319 by (fastforce simp: strip_eq_Assign intro: aval'_sound in_gamma_update |
319 by (fastforce simp: strip_eq_Assign intro: aval'_sound in_gamma_update |
330 by (fastforce simp: strip_eq_If) |
330 by (fastforce simp: strip_eq_If) |
331 moreover have "post cs1 \<subseteq> \<gamma>\<^isub>o(post ca1 \<squnion> post ca2)" |
331 moreover have "post cs1 \<subseteq> \<gamma>\<^isub>o(post ca1 \<squnion> post ca2)" |
332 by (metis (no_types) `cs1 \<le> \<gamma>\<^isub>c ca1` join_ge1 le_post mono_gamma_o order_trans post_map_acom) |
332 by (metis (no_types) `cs1 \<le> \<gamma>\<^isub>c ca1` join_ge1 le_post mono_gamma_o order_trans post_map_acom) |
333 moreover have "post cs2 \<subseteq> \<gamma>\<^isub>o(post ca1 \<squnion> post ca2)" |
333 moreover have "post cs2 \<subseteq> \<gamma>\<^isub>o(post ca1 \<squnion> post ca2)" |
334 by (metis (no_types) `cs2 \<le> \<gamma>\<^isub>c ca2` join_ge2 le_post mono_gamma_o order_trans post_map_acom) |
334 by (metis (no_types) `cs2 \<le> \<gamma>\<^isub>c ca2` join_ge2 le_post mono_gamma_o order_trans post_map_acom) |
335 ultimately show ?case using `S \<subseteq> \<gamma>\<^isub>o sa` by (simp add: If.IH subset_iff) |
335 ultimately show ?case using `S \<subseteq> \<gamma>\<^isub>o S'` by (simp add: If.IH subset_iff) |
336 next |
336 next |
337 case (While b c1) |
337 case (While b c1) |
338 then obtain cs1 ca1 I P Ia Pa where |
338 then obtain cs1 ca1 I P Ia Pa where |
339 "cs = {I} WHILE b DO cs1 {P}" "ca = {Ia} WHILE b DO ca1 {Pa}" |
339 "cs = {I} WHILE b DO cs1 {P}" "ca = {Ia} WHILE b DO ca1 {Pa}" |
340 "I \<subseteq> \<gamma>\<^isub>o Ia" "P \<subseteq> \<gamma>\<^isub>o Pa" "cs1 \<le> \<gamma>\<^isub>c ca1" |
340 "I \<subseteq> \<gamma>\<^isub>o Ia" "P \<subseteq> \<gamma>\<^isub>o Pa" "cs1 \<le> \<gamma>\<^isub>c ca1" |
341 "strip cs1 = c1" "strip ca1 = c1" |
341 "strip cs1 = c1" "strip ca1 = c1" |
342 by (fastforce simp: strip_eq_While) |
342 by (fastforce simp: strip_eq_While) |
343 moreover have "S \<union> post cs1 \<subseteq> \<gamma>\<^isub>o (sa \<squnion> post ca1)" |
343 moreover have "S \<union> post cs1 \<subseteq> \<gamma>\<^isub>o (S' \<squnion> post ca1)" |
344 using `S \<subseteq> \<gamma>\<^isub>o sa` le_post[OF `cs1 \<le> \<gamma>\<^isub>c ca1`, simplified] |
344 using `S \<subseteq> \<gamma>\<^isub>o S'` le_post[OF `cs1 \<le> \<gamma>\<^isub>c ca1`, simplified] |
345 by (metis (no_types) join_ge1 join_ge2 le_sup_iff mono_gamma_o order_trans) |
345 by (metis (no_types) join_ge1 join_ge2 le_sup_iff mono_gamma_o order_trans) |
346 ultimately show ?case by (simp add: While.IH subset_iff) |
346 ultimately show ?case by (simp add: While.IH subset_iff) |
347 qed |
347 qed |
348 |
348 |
349 lemma step_preserves_le: |
349 lemma step_preserves_le: |
350 "\<lbrakk> S \<subseteq> \<gamma>\<^isub>o sa; cs \<le> \<gamma>\<^isub>c ca; strip cs = c \<rbrakk> |
350 "\<lbrakk> S \<subseteq> \<gamma>\<^isub>o S'; cs \<le> \<gamma>\<^isub>c ca; strip cs = c \<rbrakk> |
351 \<Longrightarrow> step S cs \<le> \<gamma>\<^isub>c(step' sa ca)" |
351 \<Longrightarrow> step S cs \<le> \<gamma>\<^isub>c(step' S' ca)" |
352 by (metis le_strip step_preserves_le2 strip_acom) |
352 by (metis le_strip step_preserves_le2 strip_acom) |
353 |
353 |
354 lemma AI_sound: "AI c = Some c' \<Longrightarrow> CS UNIV c \<le> \<gamma>\<^isub>c c'" |
354 lemma AI_sound: "AI c = Some c' \<Longrightarrow> CS UNIV c \<le> \<gamma>\<^isub>c c'" |
355 proof(simp add: CS_def AI_def) |
355 proof(simp add: CS_def AI_def) |
356 assume 1: "lpfp\<^isub>c (step' \<top>) c = Some c'" |
356 assume 1: "lpfp\<^isub>c (step' \<top>) c = Some c'" |