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 |