equal
deleted
inserted
replaced
94 |
94 |
95 lemma updates_conv': "map_of (updates ks vs al) = (map_of al)(ks[\<mapsto>]vs)" |
95 lemma updates_conv': "map_of (updates ks vs al) = (map_of al)(ks[\<mapsto>]vs)" |
96 proof - |
96 proof - |
97 have "map_of \<circ> More_List.fold (prod_case update) (zip ks vs) = |
97 have "map_of \<circ> More_List.fold (prod_case update) (zip ks vs) = |
98 More_List.fold (\<lambda>(k, v) f. f(k \<mapsto> v)) (zip ks vs) \<circ> map_of" |
98 More_List.fold (\<lambda>(k, v) f. f(k \<mapsto> v)) (zip ks vs) \<circ> map_of" |
99 by (rule fold_apply) (auto simp add: fun_eq_iff update_conv') |
99 by (rule fold_commute) (auto simp add: fun_eq_iff update_conv') |
100 then show ?thesis by (auto simp add: updates_def fun_eq_iff map_upds_fold_map_upd foldl_fold split_def) |
100 then show ?thesis by (auto simp add: updates_def fun_eq_iff map_upds_fold_map_upd foldl_fold split_def) |
101 qed |
101 qed |
102 |
102 |
103 lemma updates_conv: "map_of (updates ks vs al) k = ((map_of al)(ks[\<mapsto>]vs)) k" |
103 lemma updates_conv: "map_of (updates ks vs al) k = ((map_of al)(ks[\<mapsto>]vs)) k" |
104 by (simp add: updates_conv') |
104 by (simp add: updates_conv') |
111 (\<lambda>(k, v) al. if k \<in> set al then al else al @ [k]) |
111 (\<lambda>(k, v) al. if k \<in> set al then al else al @ [k]) |
112 (zip ks vs) (map fst al))" |
112 (zip ks vs) (map fst al))" |
113 by (rule fold_invariant [of "zip ks vs" "\<lambda>_. True"]) (auto intro: assms) |
113 by (rule fold_invariant [of "zip ks vs" "\<lambda>_. True"]) (auto intro: assms) |
114 moreover have "map fst \<circ> More_List.fold (prod_case update) (zip ks vs) = |
114 moreover have "map fst \<circ> More_List.fold (prod_case update) (zip ks vs) = |
115 More_List.fold (\<lambda>(k, v) al. if k \<in> set al then al else al @ [k]) (zip ks vs) \<circ> map fst" |
115 More_List.fold (\<lambda>(k, v) al. if k \<in> set al then al else al @ [k]) (zip ks vs) \<circ> map fst" |
116 by (rule fold_apply) (simp add: update_keys split_def prod_case_beta comp_def) |
116 by (rule fold_commute) (simp add: update_keys split_def prod_case_beta comp_def) |
117 ultimately show ?thesis by (simp add: updates_def fun_eq_iff) |
117 ultimately show ?thesis by (simp add: updates_def fun_eq_iff) |
118 qed |
118 qed |
119 |
119 |
120 lemma updates_append1[simp]: "size ks < size vs \<Longrightarrow> |
120 lemma updates_append1[simp]: "size ks < size vs \<Longrightarrow> |
121 updates (ks@[k]) vs al = update k (vs!size ks) (updates ks vs al)" |
121 updates (ks@[k]) vs al = update k (vs!size ks) (updates ks vs al)" |
339 lemma clearjunk_updates: |
339 lemma clearjunk_updates: |
340 "clearjunk (updates ks vs al) = updates ks vs (clearjunk al)" |
340 "clearjunk (updates ks vs al) = updates ks vs (clearjunk al)" |
341 proof - |
341 proof - |
342 have "clearjunk \<circ> More_List.fold (prod_case update) (zip ks vs) = |
342 have "clearjunk \<circ> More_List.fold (prod_case update) (zip ks vs) = |
343 More_List.fold (prod_case update) (zip ks vs) \<circ> clearjunk" |
343 More_List.fold (prod_case update) (zip ks vs) \<circ> clearjunk" |
344 by (rule fold_apply) (simp add: clearjunk_update prod_case_beta o_def) |
344 by (rule fold_commute) (simp add: clearjunk_update prod_case_beta o_def) |
345 then show ?thesis by (simp add: updates_def fun_eq_iff) |
345 then show ?thesis by (simp add: updates_def fun_eq_iff) |
346 qed |
346 qed |
347 |
347 |
348 lemma clearjunk_delete: |
348 lemma clearjunk_delete: |
349 "clearjunk (delete x al) = delete x (clearjunk al)" |
349 "clearjunk (delete x al) = delete x (clearjunk al)" |
444 lemma merge_conv': |
444 lemma merge_conv': |
445 "map_of (merge xs ys) = map_of xs ++ map_of ys" |
445 "map_of (merge xs ys) = map_of xs ++ map_of ys" |
446 proof - |
446 proof - |
447 have "map_of \<circ> More_List.fold (prod_case update) (rev ys) = |
447 have "map_of \<circ> More_List.fold (prod_case update) (rev ys) = |
448 More_List.fold (\<lambda>(k, v) m. m(k \<mapsto> v)) (rev ys) \<circ> map_of" |
448 More_List.fold (\<lambda>(k, v) m. m(k \<mapsto> v)) (rev ys) \<circ> map_of" |
449 by (rule fold_apply) (simp add: update_conv' prod_case_beta split_def fun_eq_iff) |
449 by (rule fold_commute) (simp add: update_conv' prod_case_beta split_def fun_eq_iff) |
450 then show ?thesis |
450 then show ?thesis |
451 by (simp add: merge_def map_add_map_of_foldr foldr_fold_rev fun_eq_iff) |
451 by (simp add: merge_def map_add_map_of_foldr foldr_fold_rev fun_eq_iff) |
452 qed |
452 qed |
453 |
453 |
454 corollary merge_conv: |
454 corollary merge_conv: |