src/HOL/Imperative_HOL/Heap.thy
changeset 37718 3046ebbb43c0
parent 37716 24bb91462892
child 37719 271ecd4fb9f9
equal deleted inserted replaced
37717:ede4b8397e01 37718:3046ebbb43c0
    91 *}
    91 *}
    92 
    92 
    93 subsubsection {* Primitive operations *}
    93 subsubsection {* Primitive operations *}
    94 
    94 
    95 definition
    95 definition
    96   new_ref :: "heap \<Rightarrow> ('a\<Colon>heap) ref \<times> heap" where
       
    97   "new_ref h = (let l = lim h in (Ref l, h\<lparr>lim := l + 1\<rparr>))"
       
    98 
       
    99 definition
       
   100   new_array :: "heap \<Rightarrow> ('a\<Colon>heap) array \<times> heap" where
       
   101   "new_array h = (let l = lim h in (Array l, h\<lparr>lim := l + 1\<rparr>))"
       
   102 
       
   103 definition
       
   104   ref_present :: "'a\<Colon>heap ref \<Rightarrow> heap \<Rightarrow> bool" where
    96   ref_present :: "'a\<Colon>heap ref \<Rightarrow> heap \<Rightarrow> bool" where
   105   "ref_present r h \<longleftrightarrow> addr_of_ref r < lim h"
    97   "ref_present r h \<longleftrightarrow> addr_of_ref r < lim h"
   106 
    98 
   107 definition 
    99 definition 
   108   array_present :: "'a\<Colon>heap array \<Rightarrow> heap \<Rightarrow> bool" where
   100   array_present :: "'a\<Colon>heap array \<Rightarrow> heap \<Rightarrow> bool" where
   124 definition
   116 definition
   125   set_array :: "'a\<Colon>heap array \<Rightarrow> 'a list \<Rightarrow> heap \<Rightarrow> heap" where
   117   set_array :: "'a\<Colon>heap array \<Rightarrow> 'a list \<Rightarrow> heap \<Rightarrow> heap" where
   126   "set_array a x = 
   118   "set_array a x = 
   127   arrays_update (\<lambda>h. h(TYPEREP('a) := ((h(TYPEREP('a))) (addr_of_array a:=map to_nat x))))"
   119   arrays_update (\<lambda>h. h(TYPEREP('a) := ((h(TYPEREP('a))) (addr_of_array a:=map to_nat x))))"
   128 
   120 
   129 
   121 definition ref :: "'a \<Rightarrow> heap \<Rightarrow> 'a\<Colon>heap ref \<times> heap" where
   130 subsubsection {* Interface operations *}
   122   "ref x h = (let
   131 
   123      l = lim h;
   132 definition
   124      r = Ref l;
   133   ref :: "'a \<Rightarrow> heap \<Rightarrow> 'a\<Colon>heap ref \<times> heap" where
   125      h'' = set_ref r x (h\<lparr>lim := l + 1\<rparr>)
   134   "ref x h = (let (r, h') = new_ref h;
   126    in (r, h''))"
   135                    h''    = set_ref r x h'
   127 
   136          in (r, h''))"
   128 definition array :: "'a list \<Rightarrow> heap \<Rightarrow> 'a\<Colon>heap array \<times> heap" where
   137 
   129   "array xs h = (let
   138 definition
   130      l = lim h;
   139   array :: "'a list \<Rightarrow> heap \<Rightarrow> 'a\<Colon>heap array \<times> heap" where
   131      r = Array l;
   140   "array xs h = (let (r, h') = new_array h;
   132      h'' = set_array r xs (h\<lparr>lim := l + 1\<rparr>)
   141                       h'' = set_array r xs h'
   133    in (r, h''))"
   142         in (r, h''))"  
   134   
   143 
       
   144 definition
   135 definition
   145   upd :: "'a\<Colon>heap array \<Rightarrow> nat \<Rightarrow> 'a \<Rightarrow> heap \<Rightarrow> heap" where
   136   upd :: "'a\<Colon>heap array \<Rightarrow> nat \<Rightarrow> 'a \<Rightarrow> heap \<Rightarrow> heap" where
   146   "upd a i x h = set_array a ((get_array a h)[i:=x]) h"
   137   "upd a i x h = set_array a ((get_array a h)[i:=x]) h"
   147 
   138 
   148 definition
   139 definition
   174 
   165 
   175 lemma noteq_refs_irrefl: "r =!= r \<Longrightarrow> False"
   166 lemma noteq_refs_irrefl: "r =!= r \<Longrightarrow> False"
   176   unfolding noteq_refs_def by auto
   167   unfolding noteq_refs_def by auto
   177 
   168 
   178 lemma present_new_ref: "ref_present r h \<Longrightarrow> r =!= fst (ref v h)"
   169 lemma present_new_ref: "ref_present r h \<Longrightarrow> r =!= fst (ref v h)"
   179   by (simp add: ref_present_def new_ref_def ref_def Let_def noteq_refs_def)
   170   by (simp add: ref_present_def ref_def Let_def noteq_refs_def)
   180 
   171 
   181 lemma present_new_arr: "array_present a h \<Longrightarrow> a =!!= fst (array xs h)"
   172 lemma present_new_arr: "array_present a h \<Longrightarrow> a =!!= fst (array xs h)"
   182   by (simp add: array_present_def noteq_arrs_def new_array_def array_def Let_def)
   173   by (simp add: array_present_def noteq_arrs_def array_def Let_def)
   183 
   174 
   184 
   175 
   185 subsubsection {* Properties of heap containers *}
   176 subsubsection {* Properties of heap containers *}
   186 
   177 
   187 text {* Properties of imperative arrays *}
   178 text {* Properties of imperative arrays *}
   262   by (simp add: expand_fun_eq array_of_list_def array_def)*)
   253   by (simp add: expand_fun_eq array_of_list_def array_def)*)
   263 
   254 
   264 text {* Properties of imperative references *}
   255 text {* Properties of imperative references *}
   265 
   256 
   266 lemma next_ref_fresh [simp]:
   257 lemma next_ref_fresh [simp]:
   267   assumes "(r, h') = new_ref h"
   258   assumes "(r, h') = ref x h"
   268   shows "\<not> ref_present r h"
   259   shows "\<not> ref_present r h"
   269   using assms by (cases h) (auto simp add: new_ref_def ref_present_def Let_def)
   260   using assms by (cases h) (auto simp add: ref_def ref_present_def Let_def)
   270 
   261 
   271 lemma next_ref_present [simp]:
   262 lemma next_ref_present [simp]:
   272   assumes "(r, h') = new_ref h"
   263   assumes "(r, h') = ref x h"
   273   shows "ref_present r h'"
   264   shows "ref_present r h'"
   274   using assms by (cases h) (auto simp add: new_ref_def ref_present_def Let_def)
   265   using assms by (cases h) (auto simp add: ref_def set_ref_def ref_present_def Let_def)
   275 
   266 
   276 lemma ref_get_set_eq [simp]: "get_ref r (set_ref r x h) = x"
   267 lemma ref_get_set_eq [simp]: "get_ref r (set_ref r x h) = x"
   277   by (simp add: get_ref_def set_ref_def)
   268   by (simp add: get_ref_def set_ref_def)
   278 
   269 
   279 lemma ref_get_set_neq [simp]: "r =!= s \<Longrightarrow> get_ref r (set_ref s x h) = get_ref r h"
   270 lemma ref_get_set_neq [simp]: "r =!= s \<Longrightarrow> get_ref r (set_ref s x h) = get_ref r h"
   295 lemma ref_set_set_swap:
   286 lemma ref_set_set_swap:
   296   "r =!= r' \<Longrightarrow> set_ref r x (set_ref r' x' h) = set_ref r' x' (set_ref r x h)"
   287   "r =!= r' \<Longrightarrow> set_ref r x (set_ref r' x' h) = set_ref r' x' (set_ref r x h)"
   297   by (simp add: Let_def expand_fun_eq noteq_refs_def set_ref_def)
   288   by (simp add: Let_def expand_fun_eq noteq_refs_def set_ref_def)
   298 
   289 
   299 lemma ref_new_set: "fst (ref v (set_ref r v' h)) = fst (ref v h)"
   290 lemma ref_new_set: "fst (ref v (set_ref r v' h)) = fst (ref v h)"
   300   by (simp add: ref_def new_ref_def set_ref_def Let_def)
   291   by (simp add: ref_def set_ref_def Let_def)
   301 
   292 
   302 lemma ref_get_new [simp]:
   293 lemma ref_get_new [simp]:
   303   "get_ref (fst (ref v h)) (snd (ref v' h)) = v'"
   294   "get_ref (fst (ref v h)) (snd (ref v' h)) = v'"
   304   by (simp add: ref_def Let_def split_def)
   295   by (simp add: ref_def Let_def split_def)
   305 
   296 
   307   "set_ref (fst (ref v h)) new_v (snd (ref v h)) = snd (ref new_v h)"
   298   "set_ref (fst (ref v h)) new_v (snd (ref v h)) = snd (ref new_v h)"
   308   by (simp add: ref_def Let_def split_def)
   299   by (simp add: ref_def Let_def split_def)
   309 
   300 
   310 lemma ref_get_new_neq: "r =!= (fst (ref v h)) \<Longrightarrow> 
   301 lemma ref_get_new_neq: "r =!= (fst (ref v h)) \<Longrightarrow> 
   311   get_ref r (snd (ref v h)) = get_ref r h"
   302   get_ref r (snd (ref v h)) = get_ref r h"
   312   by (simp add: get_ref_def set_ref_def ref_def Let_def new_ref_def noteq_refs_def)
   303   by (simp add: get_ref_def set_ref_def ref_def Let_def noteq_refs_def)
   313 
   304 
   314 lemma lim_set_ref [simp]:
   305 lemma lim_set_ref [simp]:
   315   "lim (set_ref r v h) = lim h"
   306   "lim (set_ref r v h) = lim h"
   316   by (simp add: set_ref_def)
   307   by (simp add: set_ref_def)
   317 
   308 
   318 lemma ref_present_new_ref [simp]: 
   309 lemma ref_present_new_ref [simp]: 
   319   "ref_present r h \<Longrightarrow> ref_present r (snd (ref v h))"
   310   "ref_present r h \<Longrightarrow> ref_present r (snd (ref v h))"
   320   by (simp add: new_ref_def ref_present_def ref_def Let_def)
   311   by (simp add: ref_present_def ref_def Let_def)
   321 
   312 
   322 lemma ref_present_set_ref [simp]:
   313 lemma ref_present_set_ref [simp]:
   323   "ref_present r (set_ref r' v h) = ref_present r h"
   314   "ref_present r (set_ref r' v h) = ref_present r h"
   324   by (simp add: set_ref_def ref_present_def)
   315   by (simp add: set_ref_def ref_present_def)
   325 
   316 
   337 
   328 
   338 lemma get_ref_upd [simp]: "get_ref r (upd a i v h) = get_ref r h"
   329 lemma get_ref_upd [simp]: "get_ref r (upd a i v h) = get_ref r h"
   339   by (simp add: get_ref_def set_array_def upd_def)
   330   by (simp add: get_ref_def set_array_def upd_def)
   340 
   331 
   341 lemma new_ref_upd: "fst (ref v (upd a i v' h)) = fst (ref v h)"
   332 lemma new_ref_upd: "fst (ref v (upd a i v' h)) = fst (ref v h)"
   342   by (simp add: set_array_def get_array_def Let_def ref_new_set upd_def ref_def  new_ref_def)
   333   by (simp add: set_array_def get_array_def Let_def ref_new_set upd_def ref_def)
   343 
   334 
   344 text {*not actually true ???*}
   335 text {*not actually true ???*}
   345 lemma upd_set_ref_swap: "upd a i v (set_ref r v' h) = set_ref r v' (upd a i v h)"
   336 lemma upd_set_ref_swap: "upd a i v (set_ref r v' h) = set_ref r v' (upd a i v h)"
   346 apply (case_tac a)
   337 apply (case_tac a)
   347 apply (simp add: Let_def upd_def)
   338 apply (simp add: Let_def upd_def)
   348 apply auto
   339 apply auto
   349 oops
   340 oops
   350 
   341 
   351 lemma length_new_ref[simp]: 
   342 lemma length_new_ref[simp]: 
   352   "length a (snd (ref v h)) = length a h"
   343   "length a (snd (ref v h)) = length a h"
   353   by (simp add: get_array_def set_ref_def length_def new_ref_def ref_def Let_def)
   344   by (simp add: get_array_def set_ref_def length_def  ref_def Let_def)
   354 
   345 
   355 lemma get_array_new_ref [simp]: 
   346 lemma get_array_new_ref [simp]: 
   356   "get_array a (snd (ref v h)) = get_array a h"
   347   "get_array a (snd (ref v h)) = get_array a h"
   357   by (simp add: new_ref_def ref_def set_ref_def get_array_def Let_def)
   348   by (simp add: ref_def set_ref_def get_array_def Let_def)
   358 
   349 
   359 lemma ref_present_upd [simp]: 
   350 lemma ref_present_upd [simp]: 
   360   "ref_present r (upd a i v h) = ref_present r h"
   351   "ref_present r (upd a i v h) = ref_present r h"
   361   by (simp add: upd_def ref_present_def set_array_def get_array_def)
   352   by (simp add: upd_def ref_present_def set_array_def get_array_def)
   362 
   353 
   364   "array_present a (set_ref r v h) = array_present a h"
   355   "array_present a (set_ref r v h) = array_present a h"
   365   by (simp add: array_present_def set_ref_def)
   356   by (simp add: array_present_def set_ref_def)
   366 
   357 
   367 lemma array_present_new_ref [simp]:
   358 lemma array_present_new_ref [simp]:
   368   "array_present a h \<Longrightarrow> array_present a (snd (ref v h))"
   359   "array_present a h \<Longrightarrow> array_present a (snd (ref v h))"
   369   by (simp add: array_present_def new_ref_def ref_def Let_def)
   360   by (simp add: array_present_def ref_def Let_def)
   370 
   361 
   371 hide_const (open) empty upd length array ref
   362 hide_const (open) empty upd length array ref
   372 
   363 
   373 end
   364 end