src/HOL/IMP/Abs_Int0_fun.thy
changeset 46067 a03bf644cb27
parent 46066 e81411bfa7ef
child 46068 b9d4ec0f79ac
equal deleted inserted replaced
46066:e81411bfa7ef 46067:a03bf644cb27
   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'"