|    216   by (rule Heap_eqI) (simp add: change_def lookup_chain) |    216   by (rule Heap_eqI) (simp add: change_def lookup_chain) | 
|    217  |    217  | 
|    218  |    218  | 
|    219 text {* Non-interaction between imperative array and imperative references *} |    219 text {* Non-interaction between imperative array and imperative references *} | 
|    220  |    220  | 
|    221 lemma get_array_set [simp]: |    221 lemma array_get_set [simp]: | 
|    222   "get_array (set r v h) = get_array h" |    222   "Array.get (set r v h) = Array.get h" | 
|    223   by (simp add: get_array_def set_def expand_fun_eq) |    223   by (simp add: Array.get_def set_def expand_fun_eq) | 
|    224  |    224  | 
|    225 lemma get_update [simp]: |    225 lemma get_update [simp]: | 
|    226   "get (Array.update a i v h) r = get h r" |    226   "get (Array.update a i v h) r = get h r" | 
|    227   by (simp add: get_def Array.update_def Array.set_def) |    227   by (simp add: get_def Array.update_def Array.set_def) | 
|    228  |    228  | 
|    229 lemma alloc_update: |    229 lemma alloc_update: | 
|    230   "fst (alloc v (Array.update a i v' h)) = fst (alloc v h)" |    230   "fst (alloc v (Array.update a i v' h)) = fst (alloc v h)" | 
|    231   by (simp add: Array.update_def get_array_def Array.set_def alloc_def Let_def) |    231   by (simp add: Array.update_def Array.get_def Array.set_def alloc_def Let_def) | 
|    232  |    232  | 
|    233 lemma update_set_swap: |    233 lemma update_set_swap: | 
|    234   "Array.update a i v (set r v' h) = set r v' (Array.update a i v h)" |    234   "Array.update a i v (set r v' h) = set r v' (Array.update a i v h)" | 
|    235   by (simp add: Array.update_def get_array_def Array.set_def set_def) |    235   by (simp add: Array.update_def Array.get_def Array.set_def set_def) | 
|    236  |    236  | 
|    237 lemma length_alloc [simp]:  |    237 lemma length_alloc [simp]:  | 
|    238   "Array.length (snd (alloc v h)) a = Array.length h a" |    238   "Array.length (snd (alloc v h)) a = Array.length h a" | 
|    239   by (simp add: Array.length_def get_array_def alloc_def set_def Let_def) |    239   by (simp add: Array.length_def Array.get_def alloc_def set_def Let_def) | 
|    240  |    240  | 
|    241 lemma get_array_alloc [simp]:  |    241 lemma array_get_alloc [simp]:  | 
|    242   "get_array (snd (alloc v h)) = get_array h" |    242   "Array.get (snd (alloc v h)) = Array.get h" | 
|    243   by (simp add: get_array_def alloc_def set_def Let_def expand_fun_eq) |    243   by (simp add: Array.get_def alloc_def set_def Let_def expand_fun_eq) | 
|    244  |    244  | 
|    245 lemma present_update [simp]:  |    245 lemma present_update [simp]:  | 
|    246   "present (Array.update a i v h) = present h" |    246   "present (Array.update a i v h) = present h" | 
|    247   by (simp add: Array.update_def Array.set_def expand_fun_eq present_def) |    247   by (simp add: Array.update_def Array.set_def expand_fun_eq present_def) | 
|    248  |    248  |