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