bulwahn@44897: (* Title: HOL/Library/AList_Mapping.thy bulwahn@44897: Author: Florian Haftmann, TU Muenchen bulwahn@44897: *) bulwahn@44897: bulwahn@44897: header {* Implementation of mappings with Association Lists *} bulwahn@44897: bulwahn@44897: theory AList_Mapping bulwahn@44913: imports AList Mapping bulwahn@44897: begin bulwahn@44897: bulwahn@44897: definition Mapping :: "('a \ 'b) list \ ('a, 'b) mapping" where bulwahn@44897: "Mapping xs = Mapping.Mapping (map_of xs)" bulwahn@44897: bulwahn@44897: code_datatype Mapping bulwahn@44897: bulwahn@44897: lemma lookup_Mapping [simp, code]: bulwahn@44897: "Mapping.lookup (Mapping xs) = map_of xs" bulwahn@44897: by (simp add: Mapping_def) bulwahn@44897: bulwahn@44897: lemma keys_Mapping [simp, code]: bulwahn@44897: "Mapping.keys (Mapping xs) = set (map fst xs)" bulwahn@44897: by (simp add: keys_def dom_map_of_conv_image_fst) bulwahn@44897: bulwahn@44897: lemma empty_Mapping [code]: bulwahn@44897: "Mapping.empty = Mapping []" bulwahn@44897: by (rule mapping_eqI) simp bulwahn@44897: bulwahn@44897: lemma is_empty_Mapping [code]: bulwahn@44897: "Mapping.is_empty (Mapping xs) \ List.null xs" bulwahn@44897: by (cases xs) (simp_all add: is_empty_def null_def) bulwahn@44897: bulwahn@44897: lemma update_Mapping [code]: bulwahn@44897: "Mapping.update k v (Mapping xs) = Mapping (update k v xs)" bulwahn@44897: by (rule mapping_eqI) (simp add: update_conv') bulwahn@44897: bulwahn@44897: lemma delete_Mapping [code]: bulwahn@44897: "Mapping.delete k (Mapping xs) = Mapping (delete k xs)" bulwahn@44897: by (rule mapping_eqI) (simp add: delete_conv') bulwahn@44897: bulwahn@44897: lemma ordered_keys_Mapping [code]: bulwahn@44897: "Mapping.ordered_keys (Mapping xs) = sort (remdups (map fst xs))" bulwahn@44897: by (simp only: ordered_keys_def keys_Mapping sorted_list_of_set_sort_remdups) simp bulwahn@44897: bulwahn@44897: lemma size_Mapping [code]: bulwahn@44897: "Mapping.size (Mapping xs) = length (remdups (map fst xs))" bulwahn@44897: by (simp add: size_def length_remdups_card_conv dom_map_of_conv_image_fst) bulwahn@44897: bulwahn@44897: lemma tabulate_Mapping [code]: bulwahn@44897: "Mapping.tabulate ks f = Mapping (map (\k. (k, f k)) ks)" bulwahn@44897: by (rule mapping_eqI) (simp add: map_of_map_restrict) bulwahn@44897: bulwahn@44897: lemma bulkload_Mapping [code]: bulwahn@44897: "Mapping.bulkload vs = Mapping (map (\n. (n, vs ! n)) [0.. bulwahn@44897: (let ks = map fst xs; ls = map fst ys bulwahn@44897: in (\l\set ls. l \ set ks) \ (\k\set ks. k \ set ls \ map_of xs k = map_of ys k))" bulwahn@44897: proof - bulwahn@44897: have aux: "\a b xs. (a, b) \ set xs \ a \ fst ` set xs" bulwahn@44897: by (auto simp add: image_def intro!: bexI) bulwahn@44897: show ?thesis bulwahn@44897: by (auto intro!: map_of_eqI simp add: Let_def equal Mapping_def) bulwahn@44897: (auto dest!: map_of_eq_dom intro: aux) bulwahn@44897: qed bulwahn@44897: bulwahn@44897: lemma [code nbe]: bulwahn@44897: "HOL.equal (x :: ('a, 'b) mapping) x \ True" bulwahn@44897: by (fact equal_refl) bulwahn@44897: bulwahn@44913: end