# HG changeset patch # User haftmann # Date 1233579382 -3600 # Node ID e40b70d3890914a490d25c41f0068eb2fcebeeab # Parent 01cae7ad8576f78399d0fc4825ea7d6187a566a5 added Mapping.thy to Library diff -r 01cae7ad8576 -r e40b70d38909 src/HOL/IsaMakefile --- a/src/HOL/IsaMakefile Mon Feb 02 13:56:22 2009 +0100 +++ b/src/HOL/IsaMakefile Mon Feb 02 13:56:22 2009 +0100 @@ -331,7 +331,7 @@ Library/Binomial.thy Library/Eval_Witness.thy \ Library/Code_Index.thy Library/Code_Char.thy \ Library/Code_Char_chr.thy Library/Code_Integer.thy \ - Library/Numeral_Type.thy Library/Reflection.thy \ + Library/Mapping.thy Library/Numeral_Type.thy Library/Reflection.thy \ Library/Boolean_Algebra.thy Library/Countable.thy \ Library/RBT.thy Library/Univ_Poly.thy \ Library/Enum.thy Library/Float.thy $(SRC)/Tools/float.ML $(SRC)/HOL/Tools/float_arith.ML \ diff -r 01cae7ad8576 -r e40b70d38909 src/HOL/Library/Library.thy --- a/src/HOL/Library/Library.thy Mon Feb 02 13:56:22 2009 +0100 +++ b/src/HOL/Library/Library.thy Mon Feb 02 13:56:22 2009 +0100 @@ -24,6 +24,7 @@ FuncSet Infinite_Set ListVector + Mapping Multiset Nat_Infinity Nested_Environment diff -r 01cae7ad8576 -r e40b70d38909 src/HOL/Library/Mapping.thy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/HOL/Library/Mapping.thy Mon Feb 02 13:56:22 2009 +0100 @@ -0,0 +1,115 @@ +(* Title: HOL/Library/Mapping.thy + Author: Florian Haftmann, TU Muenchen +*) + +header {* An abstract view on maps for code generation. *} + +theory Mapping +imports Map +begin + +subsection {* Type definition and primitive operations *} + +datatype ('a, 'b) map = Map "'a \ 'b" + +definition empty :: "('a, 'b) map" where + "empty = Map (\_. None)" + +primrec lookup :: "('a, 'b) map \ 'a \ 'b" where + "lookup (Map f) = f" + +primrec update :: "'a \ 'b \ ('a, 'b) map \ ('a, 'b) map" where + "update k v (Map f) = Map (f (k \ v))" + +primrec delete :: "'a \ ('a, 'b) map \ ('a, 'b) map" where + "delete k (Map f) = Map (f (k := None))" + +primrec keys :: "('a, 'b) map \ 'a set" where + "keys (Map f) = dom f" + + +subsection {* Derived operations *} + +definition size :: "('a, 'b) map \ nat" where + "size m = (if finite (keys m) then card (keys m) else 0)" + +definition tabulate :: "'a list \ ('a \ 'b) \ ('a, 'b) map" where + "tabulate ks f = Map (map_of (map (\k. (k, f k)) ks))" + + +subsection {* Properties *} + +lemma lookup_inject: + "lookup m = lookup n \ m = n" + by (cases m, cases n) simp + +lemma lookup_empty [simp]: + "lookup empty = Map.empty" + by (simp add: empty_def) + +lemma lookup_update [simp]: + "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_tabulate: + "lookup (tabulate ks f) = (Some o f) |` set ks" + by (induct ks) (auto simp add: tabulate_def restrict_map_def expand_fun_eq) + +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)+ + +lemma delete_empty [simp]: + "delete k empty = empty" + by (simp add: empty_def) + +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 + +lemma keys_update [simp]: + "keys (update k v m) = insert k (keys m)" + by (cases m) 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 size_empty [simp]: + "size empty = 0" + by (simp add: size_def keys_empty) + +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) + +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) + +lemma size_tabulate: + "size (tabulate ks f) = length (remdups ks)" + by (simp add: size_def keys_tabulate distinct_card [of "remdups ks", symmetric]) + +end \ No newline at end of file