# HG changeset patch # User haftmann # Date 1266396532 -3600 # Node ID 73cd6f78c86d896c974c6c90258f9b537204db46 # Parent 37872c68a38552612d4bd903c7ba84b0bda16be5 more close integration with theory Map diff -r 37872c68a385 -r 73cd6f78c86d src/HOL/Library/Mapping.thy --- a/src/HOL/Library/Mapping.thy Wed Feb 17 09:48:52 2010 +0100 +++ b/src/HOL/Library/Mapping.thy Wed Feb 17 09:48:52 2010 +0100 @@ -3,50 +3,58 @@ header {* An abstract view on maps for code generation. *} theory Mapping -imports Map Main +imports Main begin subsection {* Type definition and primitive operations *} -datatype ('a, 'b) map = Map "'a \ 'b" +datatype ('a, 'b) mapping = Mapping "'a \ 'b" -definition empty :: "('a, 'b) map" where - "empty = Map (\_. None)" - -primrec lookup :: "('a, 'b) map \ 'a \ 'b" where - "lookup (Map f) = f" +definition empty :: "('a, 'b) mapping" where + "empty = Mapping (\_. None)" -primrec update :: "'a \ 'b \ ('a, 'b) map \ ('a, 'b) map" where - "update k v (Map f) = Map (f (k \ v))" +primrec lookup :: "('a, 'b) mapping \ 'a \ 'b" where + "lookup (Mapping f) = f" -primrec delete :: "'a \ ('a, 'b) map \ ('a, 'b) map" where - "delete k (Map f) = Map (f (k := None))" +primrec update :: "'a \ 'b \ ('a, 'b) mapping \ ('a, 'b) mapping" where + "update k v (Mapping f) = Mapping (f (k \ v))" -primrec keys :: "('a, 'b) map \ 'a set" where - "keys (Map f) = dom f" +primrec delete :: "'a \ ('a, 'b) mapping \ ('a, 'b) mapping" where + "delete k (Mapping f) = Mapping (f (k := None))" subsection {* Derived operations *} -definition size :: "('a, 'b) map \ nat" where - "size m = (if finite (keys m) then card (keys m) else 0)" +definition keys :: "('a, 'b) mapping \ 'a set" where + "keys m = dom (lookup m)" -definition replace :: "'a \ 'b \ ('a, 'b) map \ ('a, 'b) map" where +definition is_empty :: "('a, 'b) mapping \ bool" where + "is_empty m \ dom (lookup m) = {}" + +definition size :: "('a, 'b) mapping \ nat" where + "size m = (if finite (dom (lookup m)) then card (dom (lookup m)) else 0)" + +definition replace :: "'a \ 'b \ ('a, 'b) mapping \ ('a, 'b) mapping" where "replace k v m = (if lookup m k = None then m else update k v m)" -definition tabulate :: "'a list \ ('a \ 'b) \ ('a, 'b) map" where - "tabulate ks f = Map (map_of (map (\k. (k, f k)) ks))" +definition tabulate :: "'a list \ ('a \ 'b) \ ('a, 'b) mapping" where + "tabulate ks f = Mapping (map_of (map (\k. (k, f k)) ks))" -definition bulkload :: "'a list \ (nat, 'a) map" where - "bulkload xs = Map (\k. if k < length xs then Some (xs ! k) else None)" +definition bulkload :: "'a list \ (nat, 'a) mapping" where + "bulkload xs = Mapping (\k. if k < length xs then Some (xs ! k) else None)" subsection {* Properties *} -lemma lookup_inject: +lemma lookup_inject [simp]: "lookup m = lookup n \ m = n" by (cases m, cases n) simp +lemma mapping_eqI: + assumes "lookup m = lookup n" + shows "m = n" + using assms by simp + lemma lookup_empty [simp]: "lookup empty = Map.empty" by (simp add: empty_def) @@ -55,98 +63,82 @@ "lookup (update k v m) = (lookup m) (k \ v)" by (cases m) simp -lemma lookup_delete: - "lookup (delete k m) k = None" - "k \ l \ lookup (delete k m) l = lookup m l" - by (cases m, simp)+ +lemma lookup_delete [simp]: + "lookup (delete k m) = (lookup m) (k := None)" + by (cases m) simp -lemma lookup_tabulate: +lemma lookup_tabulate [simp]: "lookup (tabulate ks f) = (Some o f) |` set ks" by (induct ks) (auto simp add: tabulate_def restrict_map_def expand_fun_eq) -lemma lookup_bulkload: +lemma lookup_bulkload [simp]: "lookup (bulkload xs) = (\k. if k < length xs then Some (xs ! k) else None)" - unfolding bulkload_def by simp + by (simp add: bulkload_def) lemma update_update: "update k v (update k w m) = update k v m" "k \ l \ update k v (update l w m) = update l w (update k v m)" - by (cases m, simp add: expand_fun_eq)+ + by (rule mapping_eqI, simp add: fun_upd_twist)+ -lemma replace_update: - "lookup m k = None \ replace k v m = m" - "lookup m k \ None \ replace k v m = update k v m" - by (auto simp add: replace_def) - -lemma delete_empty [simp]: - "delete k empty = empty" - by (simp add: empty_def) +lemma update_delete [simp]: + "update k v (delete k m) = update k v m" + by (rule mapping_eqI) simp lemma delete_update: "delete k (update k v m) = delete k m" "k \ l \ delete k (update l v m) = update l v (delete k m)" - by (cases m, simp add: expand_fun_eq)+ - -lemma update_delete [simp]: - "update k v (delete k m) = update k v m" - by (cases m) simp - -lemma keys_empty [simp]: - "keys empty = {}" - unfolding empty_def by simp + by (rule mapping_eqI, simp add: fun_upd_twist)+ -lemma keys_update [simp]: - "keys (update k v m) = insert k (keys m)" - by (cases m) simp +lemma delete_empty [simp]: + "delete k empty = empty" + by (rule mapping_eqI) simp -lemma keys_delete [simp]: - "keys (delete k m) = keys m - {k}" - by (cases m) simp - -lemma keys_tabulate [simp]: - "keys (tabulate ks f) = set ks" - by (auto simp add: tabulate_def dest: map_of_SomeD intro!: weak_map_of_SomeI) +lemma replace_update: + "k \ dom (lookup m) \ replace k v m = m" + "k \ dom (lookup m) \ replace k v m = update k v m" + by (rule mapping_eqI, auto simp add: replace_def fun_upd_twist)+ lemma size_empty [simp]: "size empty = 0" - by (simp add: size_def keys_empty) + by (simp add: size_def) lemma size_update: - "finite (keys m) \ size (update k v m) = - (if k \ keys m then size m else Suc (size m))" - by (simp add: size_def keys_update) - (auto simp only: card_insert card_Suc_Diff1) + "finite (dom (lookup m)) \ size (update k v m) = + (if k \ dom (lookup m) then size m else Suc (size m))" + by (auto simp add: size_def insert_dom) lemma size_delete: - "size (delete k m) = (if k \ keys m then size m - 1 else size m)" - by (simp add: size_def keys_delete) + "size (delete k m) = (if k \ dom (lookup m) then size m - 1 else size m)" + by (simp add: size_def) lemma size_tabulate: "size (tabulate ks f) = length (remdups ks)" - by (simp add: size_def keys_tabulate distinct_card [of "remdups ks", symmetric]) + by (simp add: size_def distinct_card [of "remdups ks", symmetric] comp_def) lemma bulkload_tabulate: "bulkload xs = tabulate [0..