| author | paulson <lp15@cam.ac.uk> | 
| Sat, 23 Sep 2023 18:45:19 +0100 | |
| changeset 78685 | 07c35dec9dac | 
| parent 78117 | 7735645667f0 | 
| child 80777 | 623d46973cbe | 
| permissions | -rw-r--r-- | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1 | (* Title: HOL/Library/Finite_Map.thy | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 2 | Author: Lars Hupel, TU München | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 3 | *) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 4 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 5 | section \<open>Type of finite maps defined as a subtype of maps\<close> | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 6 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 7 | theory Finite_Map | 
| 68462 
8d1bf38c6fe6
simplify parametricity proofs
 Lars Hupel <lars.hupel@mytum.de> parents: 
68386diff
changeset | 8 | imports FSet AList Conditional_Parametricity | 
| 67780 
7655e6369c9f
more abbrevs -- this makes "(=" ambiguous and thus simplifies input of "(=)" (within the context of Main HOL);
 wenzelm parents: 
67485diff
changeset | 9 | abbrevs "(=" = "\<subseteq>\<^sub>f" | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 10 | begin | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 11 | |
| 69593 | 12 | subsection \<open>Auxiliary constants and lemmas over \<^type>\<open>map\<close>\<close> | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 13 | |
| 68462 
8d1bf38c6fe6
simplify parametricity proofs
 Lars Hupel <lars.hupel@mytum.de> parents: 
68386diff
changeset | 14 | parametric_constant map_add_transfer[transfer_rule]: map_add_def | 
| 
8d1bf38c6fe6
simplify parametricity proofs
 Lars Hupel <lars.hupel@mytum.de> parents: 
68386diff
changeset | 15 | parametric_constant map_of_transfer[transfer_rule]: map_of_def | 
| 
8d1bf38c6fe6
simplify parametricity proofs
 Lars Hupel <lars.hupel@mytum.de> parents: 
68386diff
changeset | 16 | |
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 17 | context includes lifting_syntax begin | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 18 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 19 | abbreviation rel_map :: "('b \<Rightarrow> 'c \<Rightarrow> bool) \<Rightarrow> ('a \<rightharpoonup> 'b) \<Rightarrow> ('a \<rightharpoonup> 'c) \<Rightarrow> bool" where
 | 
| 67399 | 20 | "rel_map f \<equiv> (=) ===> rel_option f" | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 21 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 22 | lemma ran_transfer[transfer_rule]: "(rel_map A ===> rel_set A) ran ran" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 23 | proof | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 24 | fix m n | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 25 | assume "rel_map A m n" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 26 | show "rel_set A (ran m) (ran n)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 27 | proof (rule rel_setI) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 28 | fix x | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 29 | assume "x \<in> ran m" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 30 | then obtain a where "m a = Some x" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 31 | unfolding ran_def by auto | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 32 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 33 | have "rel_option A (m a) (n a)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 34 | using \<open>rel_map A m n\<close> | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 35 | by (auto dest: rel_funD) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 36 | then obtain y where "n a = Some y" "A x y" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 37 | unfolding \<open>m a = _\<close> | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 38 | by cases auto | 
| 64180 | 39 | then show "\<exists>y \<in> ran n. A x y" | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 40 | unfolding ran_def by blast | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 41 | next | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 42 | fix y | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 43 | assume "y \<in> ran n" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 44 | then obtain a where "n a = Some y" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 45 | unfolding ran_def by auto | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 46 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 47 | have "rel_option A (m a) (n a)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 48 | using \<open>rel_map A m n\<close> | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 49 | by (auto dest: rel_funD) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 50 | then obtain x where "m a = Some x" "A x y" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 51 | unfolding \<open>n a = _\<close> | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 52 | by cases auto | 
| 64180 | 53 | then show "\<exists>x \<in> ran m. A x y" | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 54 | unfolding ran_def by blast | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 55 | qed | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 56 | qed | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 57 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 58 | lemma ran_alt_def: "ran m = (the \<circ> m) ` dom m" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 59 | unfolding ran_def dom_def by force | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 60 | |
| 68462 
8d1bf38c6fe6
simplify parametricity proofs
 Lars Hupel <lars.hupel@mytum.de> parents: 
68386diff
changeset | 61 | parametric_constant dom_transfer[transfer_rule]: dom_def | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 62 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 63 | definition map_upd :: "'a \<Rightarrow> 'b \<Rightarrow> ('a \<rightharpoonup> 'b) \<Rightarrow> ('a \<rightharpoonup> 'b)" where
 | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 64 | "map_upd k v m = m(k \<mapsto> v)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 65 | |
| 68462 
8d1bf38c6fe6
simplify parametricity proofs
 Lars Hupel <lars.hupel@mytum.de> parents: 
68386diff
changeset | 66 | parametric_constant map_upd_transfer[transfer_rule]: map_upd_def | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 67 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 68 | definition map_filter :: "('a \<Rightarrow> bool) \<Rightarrow> ('a \<rightharpoonup> 'b) \<Rightarrow> ('a \<rightharpoonup> 'b)" where
 | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 69 | "map_filter P m = (\<lambda>x. if P x then m x else None)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 70 | |
| 68462 
8d1bf38c6fe6
simplify parametricity proofs
 Lars Hupel <lars.hupel@mytum.de> parents: 
68386diff
changeset | 71 | parametric_constant map_filter_transfer[transfer_rule]: map_filter_def | 
| 
8d1bf38c6fe6
simplify parametricity proofs
 Lars Hupel <lars.hupel@mytum.de> parents: 
68386diff
changeset | 72 | |
| 68386 | 73 | lemma map_filter_map_of[simp]: "map_filter P (map_of m) = map_of [(k, _) \<leftarrow> m. P k]" | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 74 | proof | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 75 | fix x | 
| 68386 | 76 | show "map_filter P (map_of m) x = map_of [(k, _) \<leftarrow> m. P k] x" | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 77 | by (induct m) (auto simp: map_filter_def) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 78 | qed | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 79 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 80 | lemma map_filter_finite[intro]: | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 81 | assumes "finite (dom m)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 82 | shows "finite (dom (map_filter P m))" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 83 | proof - | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 84 | have "dom (map_filter P m) = Set.filter P (dom m)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 85 | unfolding map_filter_def Set.filter_def dom_def | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 86 | by auto | 
| 64180 | 87 | then show ?thesis | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 88 | using assms | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 89 | by (simp add: Set.filter_def) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 90 | qed | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 91 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 92 | definition map_drop :: "'a \<Rightarrow> ('a \<rightharpoonup> 'b) \<Rightarrow> ('a \<rightharpoonup> 'b)" where
 | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 93 | "map_drop a = map_filter (\<lambda>a'. a' \<noteq> a)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 94 | |
| 68462 
8d1bf38c6fe6
simplify parametricity proofs
 Lars Hupel <lars.hupel@mytum.de> parents: 
68386diff
changeset | 95 | parametric_constant map_drop_transfer[transfer_rule]: map_drop_def | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 96 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 97 | definition map_drop_set :: "'a set \<Rightarrow> ('a \<rightharpoonup> 'b) \<Rightarrow> ('a \<rightharpoonup> 'b)" where
 | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 98 | "map_drop_set A = map_filter (\<lambda>a. a \<notin> A)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 99 | |
| 68462 
8d1bf38c6fe6
simplify parametricity proofs
 Lars Hupel <lars.hupel@mytum.de> parents: 
68386diff
changeset | 100 | parametric_constant map_drop_set_transfer[transfer_rule]: map_drop_set_def | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 101 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 102 | definition map_restrict_set :: "'a set \<Rightarrow> ('a \<rightharpoonup> 'b) \<Rightarrow> ('a \<rightharpoonup> 'b)" where
 | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 103 | "map_restrict_set A = map_filter (\<lambda>a. a \<in> A)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 104 | |
| 68462 
8d1bf38c6fe6
simplify parametricity proofs
 Lars Hupel <lars.hupel@mytum.de> parents: 
68386diff
changeset | 105 | parametric_constant map_restrict_set_transfer[transfer_rule]: map_restrict_set_def | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 106 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 107 | definition map_pred :: "('a \<Rightarrow> 'b \<Rightarrow> bool) \<Rightarrow> ('a \<rightharpoonup> 'b) \<Rightarrow> bool" where
 | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 108 | "map_pred P m \<longleftrightarrow> (\<forall>x. case m x of None \<Rightarrow> True | Some y \<Rightarrow> P x y)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 109 | |
| 68462 
8d1bf38c6fe6
simplify parametricity proofs
 Lars Hupel <lars.hupel@mytum.de> parents: 
68386diff
changeset | 110 | parametric_constant map_pred_transfer[transfer_rule]: map_pred_def | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 111 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 112 | definition rel_map_on_set :: "'a set \<Rightarrow> ('b \<Rightarrow> 'c \<Rightarrow> bool) \<Rightarrow> ('a \<rightharpoonup> 'b) \<Rightarrow> ('a \<rightharpoonup> 'c) \<Rightarrow> bool" where
 | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 113 | "rel_map_on_set S P = eq_onp (\<lambda>x. x \<in> S) ===> rel_option P" | 
| 66267 | 114 | |
| 66282 | 115 | definition set_of_map :: "('a \<rightharpoonup> 'b) \<Rightarrow> ('a \<times> 'b) set" where
 | 
| 116 | "set_of_map m = {(k, v)|k v. m k = Some v}"
 | |
| 117 | ||
| 118 | lemma set_of_map_alt_def: "set_of_map m = (\<lambda>k. (k, the (m k))) ` dom m" | |
| 119 | unfolding set_of_map_def dom_def | |
| 120 | by auto | |
| 121 | ||
| 122 | lemma set_of_map_finite: "finite (dom m) \<Longrightarrow> finite (set_of_map m)" | |
| 123 | unfolding set_of_map_alt_def | |
| 124 | by auto | |
| 125 | ||
| 126 | lemma set_of_map_inj: "inj set_of_map" | |
| 127 | proof | |
| 128 | fix x y | |
| 129 | assume "set_of_map x = set_of_map y" | |
| 130 | hence "(x a = Some b) = (y a = Some b)" for a b | |
| 131 | unfolding set_of_map_def by auto | |
| 132 | hence "x k = y k" for k | |
| 133 | by (metis not_None_eq) | |
| 134 | thus "x = y" .. | |
| 135 | qed | |
| 136 | ||
| 68810 | 137 | lemma dom_comp: "dom (m \<circ>\<^sub>m n) \<subseteq> dom n" | 
| 138 | unfolding map_comp_def dom_def | |
| 139 | by (auto split: option.splits) | |
| 140 | ||
| 141 | lemma dom_comp_finite: "finite (dom n) \<Longrightarrow> finite (dom (map_comp m n))" | |
| 142 | by (metis finite_subset dom_comp) | |
| 143 | ||
| 144 | parametric_constant map_comp_transfer[transfer_rule]: map_comp_def | |
| 145 | ||
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 146 | end | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 147 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 148 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 149 | subsection \<open>Abstract characterisation\<close> | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 150 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 151 | typedef ('a, 'b) fmap = "{m. finite (dom m)} :: ('a \<rightharpoonup> 'b) set"
 | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 152 | morphisms fmlookup Abs_fmap | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 153 | proof | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 154 |   show "Map.empty \<in> {m. finite (dom m)}"
 | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 155 | by auto | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 156 | qed | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 157 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 158 | setup_lifting type_definition_fmap | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 159 | |
| 69142 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 160 | lemma dom_fmlookup_finite[intro, simp]: "finite (dom (fmlookup m))" | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 161 | using fmap.fmlookup by auto | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 162 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 163 | lemma fmap_ext: | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 164 | assumes "\<And>x. fmlookup m x = fmlookup n x" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 165 | shows "m = n" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 166 | using assms | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 167 | by transfer' auto | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 168 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 169 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 170 | subsection \<open>Operations\<close> | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 171 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 172 | context | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 173 | includes fset.lifting | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 174 | begin | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 175 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 176 | lift_definition fmran :: "('a, 'b) fmap \<Rightarrow> 'b fset"
 | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 177 | is ran | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 178 | parametric ran_transfer | 
| 68462 
8d1bf38c6fe6
simplify parametricity proofs
 Lars Hupel <lars.hupel@mytum.de> parents: 
68386diff
changeset | 179 | by (rule finite_ran) | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 180 | |
| 66268 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 181 | lemma fmlookup_ran_iff: "y |\<in>| fmran m \<longleftrightarrow> (\<exists>x. fmlookup m x = Some y)" | 
| 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 182 | by transfer' (auto simp: ran_def) | 
| 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 183 | |
| 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 184 | lemma fmranI: "fmlookup m x = Some y \<Longrightarrow> y |\<in>| fmran m" by (auto simp: fmlookup_ran_iff) | 
| 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 185 | |
| 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 186 | lemma fmranE[elim]: | 
| 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 187 | assumes "y |\<in>| fmran m" | 
| 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 188 | obtains x where "fmlookup m x = Some y" | 
| 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 189 | using assms by (auto simp: fmlookup_ran_iff) | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 190 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 191 | lift_definition fmdom :: "('a, 'b) fmap \<Rightarrow> 'a fset"
 | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 192 | is dom | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 193 | parametric dom_transfer | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 194 | . | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 195 | |
| 66268 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 196 | lemma fmlookup_dom_iff: "x |\<in>| fmdom m \<longleftrightarrow> (\<exists>a. fmlookup m x = Some a)" | 
| 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 197 | by transfer' auto | 
| 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 198 | |
| 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 199 | lemma fmdom_notI: "fmlookup m x = None \<Longrightarrow> x |\<notin>| fmdom m" by (simp add: fmlookup_dom_iff) | 
| 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 200 | lemma fmdomI: "fmlookup m x = Some y \<Longrightarrow> x |\<in>| fmdom m" by (simp add: fmlookup_dom_iff) | 
| 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 201 | lemma fmdom_notD[dest]: "x |\<notin>| fmdom m \<Longrightarrow> fmlookup m x = None" by (simp add: fmlookup_dom_iff) | 
| 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 202 | |
| 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 203 | lemma fmdomE[elim]: | 
| 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 204 | assumes "x |\<in>| fmdom m" | 
| 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 205 | obtains y where "fmlookup m x = Some y" | 
| 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 206 | using assms by (auto simp: fmlookup_dom_iff) | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 207 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 208 | lift_definition fmdom' :: "('a, 'b) fmap \<Rightarrow> 'a set"
 | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 209 | is dom | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 210 | parametric dom_transfer | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 211 | . | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 212 | |
| 66268 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 213 | lemma fmlookup_dom'_iff: "x \<in> fmdom' m \<longleftrightarrow> (\<exists>a. fmlookup m x = Some a)" | 
| 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 214 | by transfer' auto | 
| 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 215 | |
| 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 216 | lemma fmdom'_notI: "fmlookup m x = None \<Longrightarrow> x \<notin> fmdom' m" by (simp add: fmlookup_dom'_iff) | 
| 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 217 | lemma fmdom'I: "fmlookup m x = Some y \<Longrightarrow> x \<in> fmdom' m" by (simp add: fmlookup_dom'_iff) | 
| 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 218 | lemma fmdom'_notD[dest]: "x \<notin> fmdom' m \<Longrightarrow> fmlookup m x = None" by (simp add: fmlookup_dom'_iff) | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 219 | |
| 66268 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 220 | lemma fmdom'E[elim]: | 
| 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 221 | assumes "x \<in> fmdom' m" | 
| 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 222 | obtains x y where "fmlookup m x = Some y" | 
| 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 223 | using assms by (auto simp: fmlookup_dom'_iff) | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 224 | |
| 66268 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 225 | lemma fmdom'_alt_def: "fmdom' m = fset (fmdom m)" | 
| 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 226 | by transfer' force | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 227 | |
| 69142 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 228 | lemma finite_fmdom'[simp]: "finite (fmdom' m)" | 
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 229 | unfolding fmdom'_alt_def by simp | 
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 230 | |
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 231 | lemma dom_fmlookup[simp]: "dom (fmlookup m) = fmdom' m" | 
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 232 | by transfer' simp | 
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 233 | |
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 234 | lift_definition fmempty :: "('a, 'b) fmap"
 | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 235 | is Map.empty | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 236 | by simp | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 237 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 238 | lemma fmempty_lookup[simp]: "fmlookup fmempty x = None" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 239 | by transfer' simp | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 240 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 241 | lemma fmdom_empty[simp]: "fmdom fmempty = {||}" by transfer' simp
 | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 242 | lemma fmdom'_empty[simp]: "fmdom' fmempty = {}" by transfer' simp
 | 
| 66269 | 243 | lemma fmran_empty[simp]: "fmran fmempty = fempty" by transfer' (auto simp: ran_def map_filter_def) | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 244 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 245 | lift_definition fmupd :: "'a \<Rightarrow> 'b \<Rightarrow> ('a, 'b) fmap \<Rightarrow> ('a, 'b) fmap"
 | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 246 | is map_upd | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 247 | parametric map_upd_transfer | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 248 | unfolding map_upd_def[abs_def] | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 249 | by simp | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 250 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 251 | lemma fmupd_lookup[simp]: "fmlookup (fmupd a b m) a' = (if a = a' then Some b else fmlookup m a')" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 252 | by transfer' (auto simp: map_upd_def) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 253 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 254 | lemma fmdom_fmupd[simp]: "fmdom (fmupd a b m) = finsert a (fmdom m)" by transfer (simp add: map_upd_def) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 255 | lemma fmdom'_fmupd[simp]: "fmdom' (fmupd a b m) = insert a (fmdom' m)" by transfer (simp add: map_upd_def) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 256 | |
| 70277 
ac24aaf84a36
Finite_Map: move lemmas from LambdaAuth AFP entry
 Lars Hupel <lars.hupel@mytum.de> parents: 
69700diff
changeset | 257 | lemma fmupd_reorder_neq: | 
| 
ac24aaf84a36
Finite_Map: move lemmas from LambdaAuth AFP entry
 Lars Hupel <lars.hupel@mytum.de> parents: 
69700diff
changeset | 258 | assumes "a \<noteq> b" | 
| 
ac24aaf84a36
Finite_Map: move lemmas from LambdaAuth AFP entry
 Lars Hupel <lars.hupel@mytum.de> parents: 
69700diff
changeset | 259 | shows "fmupd a x (fmupd b y m) = fmupd b y (fmupd a x m)" | 
| 
ac24aaf84a36
Finite_Map: move lemmas from LambdaAuth AFP entry
 Lars Hupel <lars.hupel@mytum.de> parents: 
69700diff
changeset | 260 | using assms | 
| 
ac24aaf84a36
Finite_Map: move lemmas from LambdaAuth AFP entry
 Lars Hupel <lars.hupel@mytum.de> parents: 
69700diff
changeset | 261 | by transfer' (auto simp: map_upd_def) | 
| 
ac24aaf84a36
Finite_Map: move lemmas from LambdaAuth AFP entry
 Lars Hupel <lars.hupel@mytum.de> parents: 
69700diff
changeset | 262 | |
| 
ac24aaf84a36
Finite_Map: move lemmas from LambdaAuth AFP entry
 Lars Hupel <lars.hupel@mytum.de> parents: 
69700diff
changeset | 263 | lemma fmupd_idem[simp]: "fmupd a x (fmupd a y m) = fmupd a x m" | 
| 
ac24aaf84a36
Finite_Map: move lemmas from LambdaAuth AFP entry
 Lars Hupel <lars.hupel@mytum.de> parents: 
69700diff
changeset | 264 | by transfer' (auto simp: map_upd_def) | 
| 
ac24aaf84a36
Finite_Map: move lemmas from LambdaAuth AFP entry
 Lars Hupel <lars.hupel@mytum.de> parents: 
69700diff
changeset | 265 | |
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 266 | lift_definition fmfilter :: "('a \<Rightarrow> bool) \<Rightarrow> ('a, 'b) fmap \<Rightarrow> ('a, 'b) fmap"
 | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 267 | is map_filter | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 268 | parametric map_filter_transfer | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 269 | by auto | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 270 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 271 | lemma fmdom_filter[simp]: "fmdom (fmfilter P m) = ffilter P (fmdom m)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 272 | by transfer' (auto simp: map_filter_def Set.filter_def split: if_splits) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 273 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 274 | lemma fmdom'_filter[simp]: "fmdom' (fmfilter P m) = Set.filter P (fmdom' m)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 275 | by transfer' (auto simp: map_filter_def Set.filter_def split: if_splits) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 276 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 277 | lemma fmlookup_filter[simp]: "fmlookup (fmfilter P m) x = (if P x then fmlookup m x else None)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 278 | by transfer' (auto simp: map_filter_def) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 279 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 280 | lemma fmfilter_empty[simp]: "fmfilter P fmempty = fmempty" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 281 | by transfer' (auto simp: map_filter_def) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 282 | |
| 63900 | 283 | lemma fmfilter_true[simp]: | 
| 66268 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 284 | assumes "\<And>x y. fmlookup m x = Some y \<Longrightarrow> P x" | 
| 63900 | 285 | shows "fmfilter P m = m" | 
| 286 | proof (rule fmap_ext) | |
| 287 | fix x | |
| 288 | have "fmlookup m x = None" if "\<not> P x" | |
| 66268 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 289 | using that assms by fastforce | 
| 64180 | 290 | then show "fmlookup (fmfilter P m) x = fmlookup m x" | 
| 63900 | 291 | by simp | 
| 292 | qed | |
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 293 | |
| 66268 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 294 | lemma fmfilter_false[simp]: | 
| 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 295 | assumes "\<And>x y. fmlookup m x = Some y \<Longrightarrow> \<not> P x" | 
| 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 296 | shows "fmfilter P m = fmempty" | 
| 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 297 | using assms by transfer' (fastforce simp: map_filter_def) | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 298 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 299 | lemma fmfilter_comp[simp]: "fmfilter P (fmfilter Q m) = fmfilter (\<lambda>x. P x \<and> Q x) m" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 300 | by transfer' (auto simp: map_filter_def) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 301 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 302 | lemma fmfilter_comm: "fmfilter P (fmfilter Q m) = fmfilter Q (fmfilter P m)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 303 | unfolding fmfilter_comp by meson | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 304 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 305 | lemma fmfilter_cong[cong]: | 
| 66268 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 306 | assumes "\<And>x y. fmlookup m x = Some y \<Longrightarrow> P x = Q x" | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 307 | shows "fmfilter P m = fmfilter Q m" | 
| 63900 | 308 | proof (rule fmap_ext) | 
| 309 | fix x | |
| 310 | have "fmlookup m x = None" if "P x \<noteq> Q x" | |
| 66268 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 311 | using that assms by fastforce | 
| 64180 | 312 | then show "fmlookup (fmfilter P m) x = fmlookup (fmfilter Q m) x" | 
| 63900 | 313 | by auto | 
| 314 | qed | |
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 315 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 316 | lemma fmfilter_cong'[fundef_cong]: | 
| 67485 
89f5d876a656
repair malformed fundef_cong rule
 Lars Hupel <lars.hupel@mytum.de> parents: 
67399diff
changeset | 317 | assumes "m = n" "\<And>x. x \<in> fmdom' m \<Longrightarrow> P x = Q x" | 
| 
89f5d876a656
repair malformed fundef_cong rule
 Lars Hupel <lars.hupel@mytum.de> parents: 
67399diff
changeset | 318 | shows "fmfilter P m = fmfilter Q n" | 
| 
89f5d876a656
repair malformed fundef_cong rule
 Lars Hupel <lars.hupel@mytum.de> parents: 
67399diff
changeset | 319 | using assms(2) unfolding assms(1) | 
| 66268 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 320 | by (rule fmfilter_cong) (metis fmdom'I) | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 321 | |
| 63900 | 322 | lemma fmfilter_upd[simp]: | 
| 323 | "fmfilter P (fmupd x y m) = (if P x then fmupd x y (fmfilter P m) else fmfilter P m)" | |
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 324 | by transfer' (auto simp: map_upd_def map_filter_def) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 325 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 326 | lift_definition fmdrop :: "'a \<Rightarrow> ('a, 'b) fmap \<Rightarrow> ('a, 'b) fmap"
 | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 327 | is map_drop | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 328 | parametric map_drop_transfer | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 329 | unfolding map_drop_def by auto | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 330 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 331 | lemma fmdrop_lookup[simp]: "fmlookup (fmdrop a m) a = None" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 332 | by transfer' (auto simp: map_drop_def map_filter_def) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 333 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 334 | lift_definition fmdrop_set :: "'a set \<Rightarrow> ('a, 'b) fmap \<Rightarrow> ('a, 'b) fmap"
 | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 335 | is map_drop_set | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 336 | parametric map_drop_set_transfer | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 337 | unfolding map_drop_set_def by auto | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 338 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 339 | lift_definition fmdrop_fset :: "'a fset \<Rightarrow> ('a, 'b) fmap \<Rightarrow> ('a, 'b) fmap"
 | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 340 | is map_drop_set | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 341 | parametric map_drop_set_transfer | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 342 | unfolding map_drop_set_def by auto | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 343 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 344 | lift_definition fmrestrict_set :: "'a set \<Rightarrow> ('a, 'b) fmap \<Rightarrow> ('a, 'b) fmap"
 | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 345 | is map_restrict_set | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 346 | parametric map_restrict_set_transfer | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 347 | unfolding map_restrict_set_def by auto | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 348 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 349 | lift_definition fmrestrict_fset :: "'a fset \<Rightarrow> ('a, 'b) fmap \<Rightarrow> ('a, 'b) fmap"
 | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 350 | is map_restrict_set | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 351 | parametric map_restrict_set_transfer | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 352 | unfolding map_restrict_set_def by auto | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 353 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 354 | lemma fmfilter_alt_defs: | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 355 | "fmdrop a = fmfilter (\<lambda>a'. a' \<noteq> a)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 356 | "fmdrop_set A = fmfilter (\<lambda>a. a \<notin> A)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 357 | "fmdrop_fset B = fmfilter (\<lambda>a. a |\<notin>| B)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 358 | "fmrestrict_set A = fmfilter (\<lambda>a. a \<in> A)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 359 | "fmrestrict_fset B = fmfilter (\<lambda>a. a |\<in>| B)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 360 | by (transfer'; simp add: map_drop_def map_drop_set_def map_restrict_set_def)+ | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 361 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 362 | lemma fmdom_drop[simp]: "fmdom (fmdrop a m) = fmdom m - {|a|}" unfolding fmfilter_alt_defs by auto
 | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 363 | lemma fmdom'_drop[simp]: "fmdom' (fmdrop a m) = fmdom' m - {a}" unfolding fmfilter_alt_defs by auto
 | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 364 | lemma fmdom'_drop_set[simp]: "fmdom' (fmdrop_set A m) = fmdom' m - A" unfolding fmfilter_alt_defs by auto | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 365 | lemma fmdom_drop_fset[simp]: "fmdom (fmdrop_fset A m) = fmdom m - A" unfolding fmfilter_alt_defs by auto | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 366 | lemma fmdom'_restrict_set: "fmdom' (fmrestrict_set A m) \<subseteq> A" unfolding fmfilter_alt_defs by auto | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 367 | lemma fmdom_restrict_fset: "fmdom (fmrestrict_fset A m) |\<subseteq>| A" unfolding fmfilter_alt_defs by auto | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 368 | |
| 70277 
ac24aaf84a36
Finite_Map: move lemmas from LambdaAuth AFP entry
 Lars Hupel <lars.hupel@mytum.de> parents: 
69700diff
changeset | 369 | lemma fmdrop_fmupd: "fmdrop x (fmupd y z m) = (if x = y then fmdrop x m else fmupd y z (fmdrop x m))" | 
| 
ac24aaf84a36
Finite_Map: move lemmas from LambdaAuth AFP entry
 Lars Hupel <lars.hupel@mytum.de> parents: 
69700diff
changeset | 370 | by transfer' (auto simp: map_drop_def map_filter_def map_upd_def) | 
| 
ac24aaf84a36
Finite_Map: move lemmas from LambdaAuth AFP entry
 Lars Hupel <lars.hupel@mytum.de> parents: 
69700diff
changeset | 371 | |
| 
ac24aaf84a36
Finite_Map: move lemmas from LambdaAuth AFP entry
 Lars Hupel <lars.hupel@mytum.de> parents: 
69700diff
changeset | 372 | lemma fmdrop_idle: "x |\<notin>| fmdom B \<Longrightarrow> fmdrop x B = B" | 
| 
ac24aaf84a36
Finite_Map: move lemmas from LambdaAuth AFP entry
 Lars Hupel <lars.hupel@mytum.de> parents: 
69700diff
changeset | 373 | by transfer' (auto simp: map_drop_def map_filter_def) | 
| 
ac24aaf84a36
Finite_Map: move lemmas from LambdaAuth AFP entry
 Lars Hupel <lars.hupel@mytum.de> parents: 
69700diff
changeset | 374 | |
| 
ac24aaf84a36
Finite_Map: move lemmas from LambdaAuth AFP entry
 Lars Hupel <lars.hupel@mytum.de> parents: 
69700diff
changeset | 375 | lemma fmdrop_idle': "x \<notin> fmdom' B \<Longrightarrow> fmdrop x B = B" | 
| 
ac24aaf84a36
Finite_Map: move lemmas from LambdaAuth AFP entry
 Lars Hupel <lars.hupel@mytum.de> parents: 
69700diff
changeset | 376 | by transfer' (auto simp: map_drop_def map_filter_def) | 
| 
ac24aaf84a36
Finite_Map: move lemmas from LambdaAuth AFP entry
 Lars Hupel <lars.hupel@mytum.de> parents: 
69700diff
changeset | 377 | |
| 
ac24aaf84a36
Finite_Map: move lemmas from LambdaAuth AFP entry
 Lars Hupel <lars.hupel@mytum.de> parents: 
69700diff
changeset | 378 | lemma fmdrop_fmupd_same: "fmdrop x (fmupd x y m) = fmdrop x m" | 
| 
ac24aaf84a36
Finite_Map: move lemmas from LambdaAuth AFP entry
 Lars Hupel <lars.hupel@mytum.de> parents: 
69700diff
changeset | 379 | by transfer' (auto simp: map_drop_def map_filter_def map_upd_def) | 
| 
ac24aaf84a36
Finite_Map: move lemmas from LambdaAuth AFP entry
 Lars Hupel <lars.hupel@mytum.de> parents: 
69700diff
changeset | 380 | |
| 69142 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 381 | lemma fmdom'_restrict_set_precise: "fmdom' (fmrestrict_set A m) = fmdom' m \<inter> A" | 
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 382 | unfolding fmfilter_alt_defs by auto | 
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 383 | |
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 384 | lemma fmdom'_restrict_fset_precise: "fmdom (fmrestrict_fset A m) = fmdom m |\<inter>| A" | 
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 385 | unfolding fmfilter_alt_defs by auto | 
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 386 | |
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 387 | lemma fmdom'_drop_fset[simp]: "fmdom' (fmdrop_fset A m) = fmdom' m - fset A" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 388 | unfolding fmfilter_alt_defs by transfer' (auto simp: map_filter_def split: if_splits) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 389 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 390 | lemma fmdom'_restrict_fset: "fmdom' (fmrestrict_fset A m) \<subseteq> fset A" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 391 | unfolding fmfilter_alt_defs by transfer' (auto simp: map_filter_def) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 392 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 393 | lemma fmlookup_drop[simp]: | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 394 | "fmlookup (fmdrop a m) x = (if x \<noteq> a then fmlookup m x else None)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 395 | unfolding fmfilter_alt_defs by simp | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 396 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 397 | lemma fmlookup_drop_set[simp]: | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 398 | "fmlookup (fmdrop_set A m) x = (if x \<notin> A then fmlookup m x else None)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 399 | unfolding fmfilter_alt_defs by simp | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 400 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 401 | lemma fmlookup_drop_fset[simp]: | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 402 | "fmlookup (fmdrop_fset A m) x = (if x |\<notin>| A then fmlookup m x else None)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 403 | unfolding fmfilter_alt_defs by simp | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 404 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 405 | lemma fmlookup_restrict_set[simp]: | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 406 | "fmlookup (fmrestrict_set A m) x = (if x \<in> A then fmlookup m x else None)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 407 | unfolding fmfilter_alt_defs by simp | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 408 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 409 | lemma fmlookup_restrict_fset[simp]: | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 410 | "fmlookup (fmrestrict_fset A m) x = (if x |\<in>| A then fmlookup m x else None)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 411 | unfolding fmfilter_alt_defs by simp | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 412 | |
| 63900 | 413 | lemma fmrestrict_set_dom[simp]: "fmrestrict_set (fmdom' m) m = m" | 
| 68909 | 414 | by (rule fmap_ext) auto | 
| 63900 | 415 | |
| 416 | lemma fmrestrict_fset_dom[simp]: "fmrestrict_fset (fmdom m) m = m" | |
| 68909 | 417 | by (rule fmap_ext) auto | 
| 63900 | 418 | |
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 419 | lemma fmdrop_empty[simp]: "fmdrop a fmempty = fmempty" | 
| 68909 | 420 | unfolding fmfilter_alt_defs by simp | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 421 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 422 | lemma fmdrop_set_empty[simp]: "fmdrop_set A fmempty = fmempty" | 
| 68909 | 423 | unfolding fmfilter_alt_defs by simp | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 424 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 425 | lemma fmdrop_fset_empty[simp]: "fmdrop_fset A fmempty = fmempty" | 
| 68909 | 426 | unfolding fmfilter_alt_defs by simp | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 427 | |
| 70277 
ac24aaf84a36
Finite_Map: move lemmas from LambdaAuth AFP entry
 Lars Hupel <lars.hupel@mytum.de> parents: 
69700diff
changeset | 428 | lemma fmdrop_fset_fmdom[simp]: "fmdrop_fset (fmdom A) A = fmempty" | 
| 
ac24aaf84a36
Finite_Map: move lemmas from LambdaAuth AFP entry
 Lars Hupel <lars.hupel@mytum.de> parents: 
69700diff
changeset | 429 | by transfer' (auto simp: map_drop_set_def map_filter_def) | 
| 
ac24aaf84a36
Finite_Map: move lemmas from LambdaAuth AFP entry
 Lars Hupel <lars.hupel@mytum.de> parents: 
69700diff
changeset | 430 | |
| 
ac24aaf84a36
Finite_Map: move lemmas from LambdaAuth AFP entry
 Lars Hupel <lars.hupel@mytum.de> parents: 
69700diff
changeset | 431 | lemma fmdrop_set_fmdom[simp]: "fmdrop_set (fmdom' A) A = fmempty" | 
| 
ac24aaf84a36
Finite_Map: move lemmas from LambdaAuth AFP entry
 Lars Hupel <lars.hupel@mytum.de> parents: 
69700diff
changeset | 432 | by transfer' (auto simp: map_drop_set_def map_filter_def) | 
| 
ac24aaf84a36
Finite_Map: move lemmas from LambdaAuth AFP entry
 Lars Hupel <lars.hupel@mytum.de> parents: 
69700diff
changeset | 433 | |
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 434 | lemma fmrestrict_set_empty[simp]: "fmrestrict_set A fmempty = fmempty" | 
| 68909 | 435 | unfolding fmfilter_alt_defs by simp | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 436 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 437 | lemma fmrestrict_fset_empty[simp]: "fmrestrict_fset A fmempty = fmempty" | 
| 68909 | 438 | unfolding fmfilter_alt_defs by simp | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 439 | |
| 66269 | 440 | lemma fmdrop_set_null[simp]: "fmdrop_set {} m = m"
 | 
| 68909 | 441 | by (rule fmap_ext) auto | 
| 66269 | 442 | |
| 443 | lemma fmdrop_fset_null[simp]: "fmdrop_fset {||} m = m"
 | |
| 68909 | 444 | by (rule fmap_ext) auto | 
| 66269 | 445 | |
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 446 | lemma fmdrop_set_single[simp]: "fmdrop_set {a} m = fmdrop a m"
 | 
| 68909 | 447 | unfolding fmfilter_alt_defs by simp | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 448 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 449 | lemma fmdrop_fset_single[simp]: "fmdrop_fset {|a|} m = fmdrop a m"
 | 
| 68909 | 450 | unfolding fmfilter_alt_defs by simp | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 451 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 452 | lemma fmrestrict_set_null[simp]: "fmrestrict_set {} m = fmempty"
 | 
| 68909 | 453 | unfolding fmfilter_alt_defs by simp | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 454 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 455 | lemma fmrestrict_fset_null[simp]: "fmrestrict_fset {||} m = fmempty"
 | 
| 68909 | 456 | unfolding fmfilter_alt_defs by simp | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 457 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 458 | lemma fmdrop_comm: "fmdrop a (fmdrop b m) = fmdrop b (fmdrop a m)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 459 | unfolding fmfilter_alt_defs by (rule fmfilter_comm) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 460 | |
| 66269 | 461 | lemma fmdrop_set_insert[simp]: "fmdrop_set (insert x S) m = fmdrop x (fmdrop_set S m)" | 
| 462 | by (rule fmap_ext) auto | |
| 463 | ||
| 464 | lemma fmdrop_fset_insert[simp]: "fmdrop_fset (finsert x S) m = fmdrop x (fmdrop_fset S m)" | |
| 465 | by (rule fmap_ext) auto | |
| 466 | ||
| 69142 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 467 | lemma fmrestrict_set_twice[simp]: "fmrestrict_set S (fmrestrict_set T m) = fmrestrict_set (S \<inter> T) m" | 
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 468 | unfolding fmfilter_alt_defs by auto | 
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 469 | |
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 470 | lemma fmrestrict_fset_twice[simp]: "fmrestrict_fset S (fmrestrict_fset T m) = fmrestrict_fset (S |\<inter>| T) m" | 
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 471 | unfolding fmfilter_alt_defs by auto | 
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 472 | |
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 473 | lemma fmrestrict_set_drop[simp]: "fmrestrict_set S (fmdrop b m) = fmrestrict_set (S - {b}) m"
 | 
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 474 | unfolding fmfilter_alt_defs by auto | 
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 475 | |
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 476 | lemma fmrestrict_fset_drop[simp]: "fmrestrict_fset S (fmdrop b m) = fmrestrict_fset (S - {| b |}) m"
 | 
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 477 | unfolding fmfilter_alt_defs by auto | 
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 478 | |
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 479 | lemma fmdrop_fmrestrict_set[simp]: "fmdrop b (fmrestrict_set S m) = fmrestrict_set (S - {b}) m"
 | 
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 480 | by (rule fmap_ext) auto | 
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 481 | |
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 482 | lemma fmdrop_fmrestrict_fset[simp]: "fmdrop b (fmrestrict_fset S m) = fmrestrict_fset (S - {| b |}) m"
 | 
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 483 | by (rule fmap_ext) auto | 
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 484 | |
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 485 | lemma fmdrop_idem[simp]: "fmdrop a (fmdrop a m) = fmdrop a m" | 
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 486 | unfolding fmfilter_alt_defs by auto | 
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 487 | |
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 488 | lemma fmdrop_set_twice[simp]: "fmdrop_set S (fmdrop_set T m) = fmdrop_set (S \<union> T) m" | 
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 489 | unfolding fmfilter_alt_defs by auto | 
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 490 | |
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 491 | lemma fmdrop_fset_twice[simp]: "fmdrop_fset S (fmdrop_fset T m) = fmdrop_fset (S |\<union>| T) m" | 
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 492 | unfolding fmfilter_alt_defs by auto | 
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 493 | |
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 494 | lemma fmdrop_set_fmdrop[simp]: "fmdrop_set S (fmdrop b m) = fmdrop_set (insert b S) m" | 
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 495 | by (rule fmap_ext) auto | 
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 496 | |
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 497 | lemma fmdrop_fset_fmdrop[simp]: "fmdrop_fset S (fmdrop b m) = fmdrop_fset (finsert b S) m" | 
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 498 | by (rule fmap_ext) auto | 
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 499 | |
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 500 | lift_definition fmadd :: "('a, 'b) fmap \<Rightarrow> ('a, 'b) fmap \<Rightarrow> ('a, 'b) fmap" (infixl "++\<^sub>f" 100)
 | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 501 | is map_add | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 502 | parametric map_add_transfer | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 503 | by simp | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 504 | |
| 63900 | 505 | lemma fmlookup_add[simp]: | 
| 506 | "fmlookup (m ++\<^sub>f n) x = (if x |\<in>| fmdom n then fmlookup n x else fmlookup m x)" | |
| 507 | by transfer' (auto simp: map_add_def split: option.splits) | |
| 508 | ||
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 509 | lemma fmdom_add[simp]: "fmdom (m ++\<^sub>f n) = fmdom m |\<union>| fmdom n" by transfer' auto | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 510 | lemma fmdom'_add[simp]: "fmdom' (m ++\<^sub>f n) = fmdom' m \<union> fmdom' n" by transfer' auto | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 511 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 512 | lemma fmadd_drop_left_dom: "fmdrop_fset (fmdom n) m ++\<^sub>f n = m ++\<^sub>f n" | 
| 68909 | 513 | by (rule fmap_ext) auto | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 514 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 515 | lemma fmadd_restrict_right_dom: "fmrestrict_fset (fmdom n) (m ++\<^sub>f n) = n" | 
| 68909 | 516 | by (rule fmap_ext) auto | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 517 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 518 | lemma fmfilter_add_distrib[simp]: "fmfilter P (m ++\<^sub>f n) = fmfilter P m ++\<^sub>f fmfilter P n" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 519 | by transfer' (auto simp: map_filter_def map_add_def) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 520 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 521 | lemma fmdrop_add_distrib[simp]: "fmdrop a (m ++\<^sub>f n) = fmdrop a m ++\<^sub>f fmdrop a n" | 
| 68909 | 522 | unfolding fmfilter_alt_defs by simp | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 523 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 524 | lemma fmdrop_set_add_distrib[simp]: "fmdrop_set A (m ++\<^sub>f n) = fmdrop_set A m ++\<^sub>f fmdrop_set A n" | 
| 68909 | 525 | unfolding fmfilter_alt_defs by simp | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 526 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 527 | lemma fmdrop_fset_add_distrib[simp]: "fmdrop_fset A (m ++\<^sub>f n) = fmdrop_fset A m ++\<^sub>f fmdrop_fset A n" | 
| 68909 | 528 | unfolding fmfilter_alt_defs by simp | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 529 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 530 | lemma fmrestrict_set_add_distrib[simp]: | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 531 | "fmrestrict_set A (m ++\<^sub>f n) = fmrestrict_set A m ++\<^sub>f fmrestrict_set A n" | 
| 68909 | 532 | unfolding fmfilter_alt_defs by simp | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 533 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 534 | lemma fmrestrict_fset_add_distrib[simp]: | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 535 | "fmrestrict_fset A (m ++\<^sub>f n) = fmrestrict_fset A m ++\<^sub>f fmrestrict_fset A n" | 
| 68909 | 536 | unfolding fmfilter_alt_defs by simp | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 537 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 538 | lemma fmadd_empty[simp]: "fmempty ++\<^sub>f m = m" "m ++\<^sub>f fmempty = m" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 539 | by (transfer'; auto)+ | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 540 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 541 | lemma fmadd_idempotent[simp]: "m ++\<^sub>f m = m" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 542 | by transfer' (auto simp: map_add_def split: option.splits) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 543 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 544 | lemma fmadd_assoc[simp]: "m ++\<^sub>f (n ++\<^sub>f p) = m ++\<^sub>f n ++\<^sub>f p" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 545 | by transfer' simp | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 546 | |
| 66269 | 547 | lemma fmadd_fmupd[simp]: "m ++\<^sub>f fmupd a b n = fmupd a b (m ++\<^sub>f n)" | 
| 548 | by (rule fmap_ext) simp | |
| 549 | ||
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 550 | lift_definition fmpred :: "('a \<Rightarrow> 'b \<Rightarrow> bool) \<Rightarrow> ('a, 'b) fmap \<Rightarrow> bool"
 | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 551 | is map_pred | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 552 | parametric map_pred_transfer | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 553 | . | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 554 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 555 | lemma fmpredI[intro]: | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 556 | assumes "\<And>x y. fmlookup m x = Some y \<Longrightarrow> P x y" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 557 | shows "fmpred P m" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 558 | using assms | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 559 | by transfer' (auto simp: map_pred_def split: option.splits) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 560 | |
| 66267 | 561 | lemma fmpredD[dest]: "fmpred P m \<Longrightarrow> fmlookup m x = Some y \<Longrightarrow> P x y" | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 562 | by transfer' (auto simp: map_pred_def split: option.split_asm) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 563 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 564 | lemma fmpred_iff: "fmpred P m \<longleftrightarrow> (\<forall>x y. fmlookup m x = Some y \<longrightarrow> P x y)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 565 | by auto | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 566 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 567 | lemma fmpred_alt_def: "fmpred P m \<longleftrightarrow> fBall (fmdom m) (\<lambda>x. P x (the (fmlookup m x)))" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 568 | unfolding fmpred_iff | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 569 | apply auto | 
| 63900 | 570 | apply (rename_tac x y) | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 571 | apply (erule_tac x = x in fBallE) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 572 | apply simp | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 573 | by (simp add: fmlookup_dom_iff) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 574 | |
| 68757 
e7e3776385ba
Finite_Map: monotonicity
 Lars Hupel <lars.hupel@mytum.de> parents: 
68463diff
changeset | 575 | lemma fmpred_mono_strong: | 
| 
e7e3776385ba
Finite_Map: monotonicity
 Lars Hupel <lars.hupel@mytum.de> parents: 
68463diff
changeset | 576 | assumes "\<And>x y. fmlookup m x = Some y \<Longrightarrow> P x y \<Longrightarrow> Q x y" | 
| 
e7e3776385ba
Finite_Map: monotonicity
 Lars Hupel <lars.hupel@mytum.de> parents: 
68463diff
changeset | 577 | shows "fmpred P m \<Longrightarrow> fmpred Q m" | 
| 
e7e3776385ba
Finite_Map: monotonicity
 Lars Hupel <lars.hupel@mytum.de> parents: 
68463diff
changeset | 578 | using assms unfolding fmpred_iff by auto | 
| 
e7e3776385ba
Finite_Map: monotonicity
 Lars Hupel <lars.hupel@mytum.de> parents: 
68463diff
changeset | 579 | |
| 
e7e3776385ba
Finite_Map: monotonicity
 Lars Hupel <lars.hupel@mytum.de> parents: 
68463diff
changeset | 580 | lemma fmpred_mono[mono]: "P \<le> Q \<Longrightarrow> fmpred P \<le> fmpred Q" | 
| 
e7e3776385ba
Finite_Map: monotonicity
 Lars Hupel <lars.hupel@mytum.de> parents: 
68463diff
changeset | 581 | apply rule | 
| 
e7e3776385ba
Finite_Map: monotonicity
 Lars Hupel <lars.hupel@mytum.de> parents: 
68463diff
changeset | 582 | apply (rule fmpred_mono_strong[where P = P and Q = Q]) | 
| 
e7e3776385ba
Finite_Map: monotonicity
 Lars Hupel <lars.hupel@mytum.de> parents: 
68463diff
changeset | 583 | apply auto | 
| 
e7e3776385ba
Finite_Map: monotonicity
 Lars Hupel <lars.hupel@mytum.de> parents: 
68463diff
changeset | 584 | done | 
| 
e7e3776385ba
Finite_Map: monotonicity
 Lars Hupel <lars.hupel@mytum.de> parents: 
68463diff
changeset | 585 | |
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 586 | lemma fmpred_empty[intro!, simp]: "fmpred P fmempty" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 587 | by auto | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 588 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 589 | lemma fmpred_upd[intro]: "fmpred P m \<Longrightarrow> P x y \<Longrightarrow> fmpred P (fmupd x y m)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 590 | by transfer' (auto simp: map_pred_def map_upd_def) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 591 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 592 | lemma fmpred_updD[dest]: "fmpred P (fmupd x y m) \<Longrightarrow> P x y" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 593 | by auto | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 594 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 595 | lemma fmpred_add[intro]: "fmpred P m \<Longrightarrow> fmpred P n \<Longrightarrow> fmpred P (m ++\<^sub>f n)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 596 | by transfer' (auto simp: map_pred_def map_add_def split: option.splits) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 597 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 598 | lemma fmpred_filter[intro]: "fmpred P m \<Longrightarrow> fmpred P (fmfilter Q m)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 599 | by transfer' (auto simp: map_pred_def map_filter_def) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 600 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 601 | lemma fmpred_drop[intro]: "fmpred P m \<Longrightarrow> fmpred P (fmdrop a m)" | 
| 68909 | 602 | by (auto simp: fmfilter_alt_defs) | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 603 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 604 | lemma fmpred_drop_set[intro]: "fmpred P m \<Longrightarrow> fmpred P (fmdrop_set A m)" | 
| 68909 | 605 | by (auto simp: fmfilter_alt_defs) | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 606 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 607 | lemma fmpred_drop_fset[intro]: "fmpred P m \<Longrightarrow> fmpred P (fmdrop_fset A m)" | 
| 68909 | 608 | by (auto simp: fmfilter_alt_defs) | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 609 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 610 | lemma fmpred_restrict_set[intro]: "fmpred P m \<Longrightarrow> fmpred P (fmrestrict_set A m)" | 
| 68909 | 611 | by (auto simp: fmfilter_alt_defs) | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 612 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 613 | lemma fmpred_restrict_fset[intro]: "fmpred P m \<Longrightarrow> fmpred P (fmrestrict_fset A m)" | 
| 68909 | 614 | by (auto simp: fmfilter_alt_defs) | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 615 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 616 | lemma fmpred_cases[consumes 1]: | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 617 | assumes "fmpred P m" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 618 | obtains (none) "fmlookup m x = None" | (some) y where "fmlookup m x = Some y" "P x y" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 619 | using assms by auto | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 620 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 621 | lift_definition fmsubset :: "('a, 'b) fmap \<Rightarrow> ('a, 'b) fmap \<Rightarrow> bool" (infix "\<subseteq>\<^sub>f" 50)
 | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 622 | is map_le | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 623 | . | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 624 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 625 | lemma fmsubset_alt_def: "m \<subseteq>\<^sub>f n \<longleftrightarrow> fmpred (\<lambda>k v. fmlookup n k = Some v) m" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 626 | by transfer' (auto simp: map_pred_def map_le_def dom_def split: option.splits) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 627 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 628 | lemma fmsubset_pred: "fmpred P m \<Longrightarrow> n \<subseteq>\<^sub>f m \<Longrightarrow> fmpred P n" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 629 | unfolding fmsubset_alt_def fmpred_iff | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 630 | by auto | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 631 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 632 | lemma fmsubset_filter_mono: "m \<subseteq>\<^sub>f n \<Longrightarrow> fmfilter P m \<subseteq>\<^sub>f fmfilter P n" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 633 | unfolding fmsubset_alt_def fmpred_iff | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 634 | by auto | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 635 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 636 | lemma fmsubset_drop_mono: "m \<subseteq>\<^sub>f n \<Longrightarrow> fmdrop a m \<subseteq>\<^sub>f fmdrop a n" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 637 | unfolding fmfilter_alt_defs by (rule fmsubset_filter_mono) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 638 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 639 | lemma fmsubset_drop_set_mono: "m \<subseteq>\<^sub>f n \<Longrightarrow> fmdrop_set A m \<subseteq>\<^sub>f fmdrop_set A n" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 640 | unfolding fmfilter_alt_defs by (rule fmsubset_filter_mono) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 641 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 642 | lemma fmsubset_drop_fset_mono: "m \<subseteq>\<^sub>f n \<Longrightarrow> fmdrop_fset A m \<subseteq>\<^sub>f fmdrop_fset A n" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 643 | unfolding fmfilter_alt_defs by (rule fmsubset_filter_mono) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 644 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 645 | lemma fmsubset_restrict_set_mono: "m \<subseteq>\<^sub>f n \<Longrightarrow> fmrestrict_set A m \<subseteq>\<^sub>f fmrestrict_set A n" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 646 | unfolding fmfilter_alt_defs by (rule fmsubset_filter_mono) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 647 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 648 | lemma fmsubset_restrict_fset_mono: "m \<subseteq>\<^sub>f n \<Longrightarrow> fmrestrict_fset A m \<subseteq>\<^sub>f fmrestrict_fset A n" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 649 | unfolding fmfilter_alt_defs by (rule fmsubset_filter_mono) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 650 | |
| 69142 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 651 | lemma fmfilter_subset[simp]: "fmfilter P m \<subseteq>\<^sub>f m" | 
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 652 | unfolding fmsubset_alt_def fmpred_iff by auto | 
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 653 | |
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 654 | lemma fmsubset_drop[simp]: "fmdrop a m \<subseteq>\<^sub>f m" | 
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 655 | unfolding fmfilter_alt_defs by (rule fmfilter_subset) | 
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 656 | |
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 657 | lemma fmsubset_drop_set[simp]: "fmdrop_set S m \<subseteq>\<^sub>f m" | 
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 658 | unfolding fmfilter_alt_defs by (rule fmfilter_subset) | 
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 659 | |
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 660 | lemma fmsubset_drop_fset[simp]: "fmdrop_fset S m \<subseteq>\<^sub>f m" | 
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 661 | unfolding fmfilter_alt_defs by (rule fmfilter_subset) | 
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 662 | |
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 663 | lemma fmsubset_restrict_set[simp]: "fmrestrict_set S m \<subseteq>\<^sub>f m" | 
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 664 | unfolding fmfilter_alt_defs by (rule fmfilter_subset) | 
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 665 | |
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 666 | lemma fmsubset_restrict_fset[simp]: "fmrestrict_fset S m \<subseteq>\<^sub>f m" | 
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 667 | unfolding fmfilter_alt_defs by (rule fmfilter_subset) | 
| 
c5e3212455ed
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68909diff
changeset | 668 | |
| 66282 | 669 | lift_definition fset_of_fmap :: "('a, 'b) fmap \<Rightarrow> ('a \<times> 'b) fset" is set_of_map
 | 
| 670 | by (rule set_of_map_finite) | |
| 671 | ||
| 672 | lemma fset_of_fmap_inj[intro, simp]: "inj fset_of_fmap" | |
| 673 | apply rule | |
| 674 | apply transfer' | |
| 675 | using set_of_map_inj unfolding inj_def by auto | |
| 676 | ||
| 66398 | 677 | lemma fset_of_fmap_iff[simp]: "(a, b) |\<in>| fset_of_fmap m \<longleftrightarrow> fmlookup m a = Some b" | 
| 678 | by transfer' (auto simp: set_of_map_def) | |
| 679 | ||
| 680 | lemma fset_of_fmap_iff'[simp]: "(a, b) \<in> fset (fset_of_fmap m) \<longleftrightarrow> fmlookup m a = Some b" | |
| 681 | by transfer' (auto simp: set_of_map_def) | |
| 682 | ||
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 683 | lift_definition fmap_of_list :: "('a \<times> 'b) list \<Rightarrow> ('a, 'b) fmap"
 | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 684 | is map_of | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 685 | parametric map_of_transfer | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 686 | by (rule finite_dom_map_of) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 687 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 688 | lemma fmap_of_list_simps[simp]: | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 689 | "fmap_of_list [] = fmempty" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 690 | "fmap_of_list ((k, v) # kvs) = fmupd k v (fmap_of_list kvs)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 691 | by (transfer, simp add: map_upd_def)+ | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 692 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 693 | lemma fmap_of_list_app[simp]: "fmap_of_list (xs @ ys) = fmap_of_list ys ++\<^sub>f fmap_of_list xs" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 694 | by transfer' simp | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 695 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 696 | lemma fmupd_alt_def: "fmupd k v m = m ++\<^sub>f fmap_of_list [(k, v)]" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 697 | by transfer' (auto simp: map_upd_def) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 698 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 699 | lemma fmpred_of_list[intro]: | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 700 | assumes "\<And>k v. (k, v) \<in> set xs \<Longrightarrow> P k v" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 701 | shows "fmpred P (fmap_of_list xs)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 702 | using assms | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 703 | by (induction xs) (transfer'; auto simp: map_pred_def)+ | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 704 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 705 | lemma fmap_of_list_SomeD: "fmlookup (fmap_of_list xs) k = Some v \<Longrightarrow> (k, v) \<in> set xs" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 706 | by transfer' (auto dest: map_of_SomeD) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 707 | |
| 66269 | 708 | lemma fmdom_fmap_of_list[simp]: "fmdom (fmap_of_list xs) = fset_of_list (map fst xs)" | 
| 709 | apply transfer' | |
| 710 | apply (subst dom_map_of_conv_image_fst) | |
| 711 | apply auto | |
| 712 | done | |
| 713 | ||
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 714 | lift_definition fmrel_on_fset :: "'a fset \<Rightarrow> ('b \<Rightarrow> 'c \<Rightarrow> bool) \<Rightarrow> ('a, 'b) fmap \<Rightarrow> ('a, 'c) fmap \<Rightarrow> bool"
 | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 715 | is rel_map_on_set | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 716 | . | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 717 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 718 | lemma fmrel_on_fset_alt_def: "fmrel_on_fset S P m n \<longleftrightarrow> fBall S (\<lambda>x. rel_option P (fmlookup m x) (fmlookup n x))" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 719 | by transfer' (auto simp: rel_map_on_set_def eq_onp_def rel_fun_def) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 720 | |
| 64181 
4d1d2de432fa
renamed lemma to a more consistent name
 Lars Hupel <lars.hupel@mytum.de> parents: 
64180diff
changeset | 721 | lemma fmrel_on_fsetI[intro]: | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 722 | assumes "\<And>x. x |\<in>| S \<Longrightarrow> rel_option P (fmlookup m x) (fmlookup n x)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 723 | shows "fmrel_on_fset S P m n" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 724 | using assms | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 725 | unfolding fmrel_on_fset_alt_def by auto | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 726 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 727 | lemma fmrel_on_fset_mono[mono]: "R \<le> Q \<Longrightarrow> fmrel_on_fset S R \<le> fmrel_on_fset S Q" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 728 | unfolding fmrel_on_fset_alt_def[abs_def] | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 729 | apply (intro le_funI fBall_mono) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 730 | using option.rel_mono by auto | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 731 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 732 | lemma fmrel_on_fsetD: "x |\<in>| S \<Longrightarrow> fmrel_on_fset S P m n \<Longrightarrow> rel_option P (fmlookup m x) (fmlookup n x)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 733 | unfolding fmrel_on_fset_alt_def | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 734 | by auto | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 735 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 736 | lemma fmrel_on_fsubset: "fmrel_on_fset S R m n \<Longrightarrow> T |\<subseteq>| S \<Longrightarrow> fmrel_on_fset T R m n" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 737 | unfolding fmrel_on_fset_alt_def | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 738 | by auto | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 739 | |
| 66274 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 740 | lemma fmrel_on_fset_unionI: | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 741 | "fmrel_on_fset A R m n \<Longrightarrow> fmrel_on_fset B R m n \<Longrightarrow> fmrel_on_fset (A |\<union>| B) R m n" | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 742 | unfolding fmrel_on_fset_alt_def | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 743 | by auto | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 744 | |
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 745 | lemma fmrel_on_fset_updateI: | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 746 | assumes "fmrel_on_fset S P m n" "P v\<^sub>1 v\<^sub>2" | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 747 | shows "fmrel_on_fset (finsert k S) P (fmupd k v\<^sub>1 m) (fmupd k v\<^sub>2 n)" | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 748 | using assms | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 749 | unfolding fmrel_on_fset_alt_def | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 750 | by auto | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 751 | |
| 68810 | 752 | lift_definition fmimage :: "('a, 'b) fmap \<Rightarrow> 'a fset \<Rightarrow> 'b fset" is "\<lambda>m S. {b|a b. m a = Some b \<and> a \<in> S}"
 | 
| 753 | subgoal for m S | |
| 754 | apply (rule finite_subset[where B = "ran m"]) | |
| 755 | apply (auto simp: ran_def)[] | |
| 756 | by (rule finite_ran) | |
| 757 | done | |
| 758 | ||
| 759 | lemma fmimage_alt_def: "fmimage m S = fmran (fmrestrict_fset S m)" | |
| 760 | by transfer' (auto simp: ran_def map_restrict_set_def map_filter_def) | |
| 761 | ||
| 762 | lemma fmimage_empty[simp]: "fmimage m fempty = fempty" | |
| 763 | by transfer' auto | |
| 764 | ||
| 765 | lemma fmimage_subset_ran[simp]: "fmimage m S |\<subseteq>| fmran m" | |
| 766 | by transfer' (auto simp: ran_def) | |
| 767 | ||
| 768 | lemma fmimage_dom[simp]: "fmimage m (fmdom m) = fmran m" | |
| 769 | by transfer' (auto simp: ran_def) | |
| 770 | ||
| 771 | lemma fmimage_inter: "fmimage m (A |\<inter>| B) |\<subseteq>| fmimage m A |\<inter>| fmimage m B" | |
| 772 | by transfer' auto | |
| 773 | ||
| 774 | lemma fimage_inter_dom[simp]: | |
| 775 | "fmimage m (fmdom m |\<inter>| A) = fmimage m A" | |
| 776 | "fmimage m (A |\<inter>| fmdom m) = fmimage m A" | |
| 777 | by (transfer'; auto)+ | |
| 778 | ||
| 779 | lemma fmimage_union[simp]: "fmimage m (A |\<union>| B) = fmimage m A |\<union>| fmimage m B" | |
| 780 | by transfer' auto | |
| 781 | ||
| 782 | lemma fmimage_Union[simp]: "fmimage m (ffUnion A) = ffUnion (fmimage m |`| A)" | |
| 783 | by transfer' auto | |
| 784 | ||
| 785 | lemma fmimage_filter[simp]: "fmimage (fmfilter P m) A = fmimage m (ffilter P A)" | |
| 786 | by transfer' (auto simp: map_filter_def) | |
| 787 | ||
| 788 | lemma fmimage_drop[simp]: "fmimage (fmdrop a m) A = fmimage m (A - {|a|})"
 | |
| 789 | by transfer' (auto simp: map_filter_def map_drop_def) | |
| 790 | ||
| 791 | lemma fmimage_drop_fset[simp]: "fmimage (fmdrop_fset B m) A = fmimage m (A - B)" | |
| 792 | by transfer' (auto simp: map_filter_def map_drop_set_def) | |
| 793 | ||
| 794 | lemma fmimage_restrict_fset[simp]: "fmimage (fmrestrict_fset B m) A = fmimage m (A |\<inter>| B)" | |
| 795 | by transfer' (auto simp: map_filter_def map_restrict_set_def) | |
| 796 | ||
| 797 | lemma fmfilter_ran[simp]: "fmran (fmfilter P m) = fmimage m (ffilter P (fmdom m))" | |
| 798 | by transfer' (auto simp: ran_def map_filter_def) | |
| 799 | ||
| 800 | lemma fmran_drop[simp]: "fmran (fmdrop a m) = fmimage m (fmdom m - {|a|})"
 | |
| 801 | by transfer' (auto simp: ran_def map_drop_def map_filter_def) | |
| 802 | ||
| 803 | lemma fmran_drop_fset[simp]: "fmran (fmdrop_fset A m) = fmimage m (fmdom m - A)" | |
| 804 | by transfer' (auto simp: ran_def map_drop_set_def map_filter_def) | |
| 805 | ||
| 806 | lemma fmran_restrict_fset: "fmran (fmrestrict_fset A m) = fmimage m (fmdom m |\<inter>| A)" | |
| 807 | by transfer' (auto simp: ran_def map_restrict_set_def map_filter_def) | |
| 808 | ||
| 809 | lemma fmlookup_image_iff: "y |\<in>| fmimage m A \<longleftrightarrow> (\<exists>x. fmlookup m x = Some y \<and> x |\<in>| A)" | |
| 810 | by transfer' (auto simp: ran_def) | |
| 811 | ||
| 812 | lemma fmimageI: "fmlookup m x = Some y \<Longrightarrow> x |\<in>| A \<Longrightarrow> y |\<in>| fmimage m A" | |
| 813 | by (auto simp: fmlookup_image_iff) | |
| 814 | ||
| 815 | lemma fmimageE[elim]: | |
| 816 | assumes "y |\<in>| fmimage m A" | |
| 817 | obtains x where "fmlookup m x = Some y" "x |\<in>| A" | |
| 818 | using assms by (auto simp: fmlookup_image_iff) | |
| 819 | ||
| 820 | lift_definition fmcomp :: "('b, 'c) fmap \<Rightarrow> ('a, 'b) fmap \<Rightarrow> ('a, 'c) fmap" (infixl "\<circ>\<^sub>f" 55)
 | |
| 821 | is map_comp | |
| 822 | parametric map_comp_transfer | |
| 823 | by (rule dom_comp_finite) | |
| 824 | ||
| 825 | lemma fmlookup_comp[simp]: "fmlookup (m \<circ>\<^sub>f n) x = Option.bind (fmlookup n x) (fmlookup m)" | |
| 826 | by transfer' (auto simp: map_comp_def split: option.splits) | |
| 827 | ||
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 828 | end | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 829 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 830 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 831 | subsection \<open>BNF setup\<close> | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 832 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 833 | lift_bnf ('a, fmran': 'b) fmap [wits: Map.empty]
 | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 834 | for map: fmmap | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 835 | rel: fmrel | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 836 | by auto | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 837 | |
| 66269 | 838 | declare fmap.pred_mono[mono] | 
| 66268 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 839 | |
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 840 | |
| 66268 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 841 | lemma fmran'_alt_def: "fmran' m = fset (fmran m)" | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 842 | including fset.lifting | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 843 | by transfer' (auto simp: ran_def fun_eq_iff) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 844 | |
| 66268 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 845 | lemma fmlookup_ran'_iff: "y \<in> fmran' m \<longleftrightarrow> (\<exists>x. fmlookup m x = Some y)" | 
| 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 846 | by transfer' (auto simp: ran_def) | 
| 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 847 | |
| 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 848 | lemma fmran'I: "fmlookup m x = Some y \<Longrightarrow> y \<in> fmran' m" by (auto simp: fmlookup_ran'_iff) | 
| 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 849 | |
| 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 850 | lemma fmran'E[elim]: | 
| 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 851 | assumes "y \<in> fmran' m" | 
| 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 852 | obtains x where "fmlookup m x = Some y" | 
| 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 Lars Hupel <lars.hupel@mytum.de> parents: 
66267diff
changeset | 853 | using assms by (auto simp: fmlookup_ran'_iff) | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 854 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 855 | lemma fmrel_iff: "fmrel R m n \<longleftrightarrow> (\<forall>x. rel_option R (fmlookup m x) (fmlookup n x))" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 856 | by transfer' (auto simp: rel_fun_def) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 857 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 858 | lemma fmrelI[intro]: | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 859 | assumes "\<And>x. rel_option R (fmlookup m x) (fmlookup n x)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 860 | shows "fmrel R m n" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 861 | using assms | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 862 | by transfer' auto | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 863 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 864 | lemma fmrel_upd[intro]: "fmrel P m n \<Longrightarrow> P x y \<Longrightarrow> fmrel P (fmupd k x m) (fmupd k y n)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 865 | by transfer' (auto simp: map_upd_def rel_fun_def) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 866 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 867 | lemma fmrelD[dest]: "fmrel P m n \<Longrightarrow> rel_option P (fmlookup m x) (fmlookup n x)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 868 | by transfer' (auto simp: rel_fun_def) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 869 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 870 | lemma fmrel_addI[intro]: | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 871 | assumes "fmrel P m n" "fmrel P a b" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 872 | shows "fmrel P (m ++\<^sub>f a) (n ++\<^sub>f b)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 873 | using assms | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 874 | apply transfer' | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 875 | apply (auto simp: rel_fun_def map_add_def) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 876 | by (metis option.case_eq_if option.collapse option.rel_sel) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 877 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 878 | lemma fmrel_cases[consumes 1]: | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 879 | assumes "fmrel P m n" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 880 | obtains (none) "fmlookup m x = None" "fmlookup n x = None" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 881 | | (some) a b where "fmlookup m x = Some a" "fmlookup n x = Some b" "P a b" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 882 | proof - | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 883 | from assms have "rel_option P (fmlookup m x) (fmlookup n x)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 884 | by auto | 
| 64180 | 885 | then show thesis | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 886 | using none some | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 887 | by (cases rule: option.rel_cases) auto | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 888 | qed | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 889 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 890 | lemma fmrel_filter[intro]: "fmrel P m n \<Longrightarrow> fmrel P (fmfilter Q m) (fmfilter Q n)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 891 | unfolding fmrel_iff by auto | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 892 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 893 | lemma fmrel_drop[intro]: "fmrel P m n \<Longrightarrow> fmrel P (fmdrop a m) (fmdrop a n)" | 
| 68909 | 894 | unfolding fmfilter_alt_defs by blast | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 895 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 896 | lemma fmrel_drop_set[intro]: "fmrel P m n \<Longrightarrow> fmrel P (fmdrop_set A m) (fmdrop_set A n)" | 
| 68909 | 897 | unfolding fmfilter_alt_defs by blast | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 898 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 899 | lemma fmrel_drop_fset[intro]: "fmrel P m n \<Longrightarrow> fmrel P (fmdrop_fset A m) (fmdrop_fset A n)" | 
| 68909 | 900 | unfolding fmfilter_alt_defs by blast | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 901 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 902 | lemma fmrel_restrict_set[intro]: "fmrel P m n \<Longrightarrow> fmrel P (fmrestrict_set A m) (fmrestrict_set A n)" | 
| 68909 | 903 | unfolding fmfilter_alt_defs by blast | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 904 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 905 | lemma fmrel_restrict_fset[intro]: "fmrel P m n \<Longrightarrow> fmrel P (fmrestrict_fset A m) (fmrestrict_fset A n)" | 
| 68909 | 906 | unfolding fmfilter_alt_defs by blast | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 907 | |
| 66274 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 908 | lemma fmrel_on_fset_fmrel_restrict: | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 909 | "fmrel_on_fset S P m n \<longleftrightarrow> fmrel P (fmrestrict_fset S m) (fmrestrict_fset S n)" | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 910 | unfolding fmrel_on_fset_alt_def fmrel_iff | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 911 | by auto | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 912 | |
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 913 | lemma fmrel_on_fset_refl_strong: | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 914 | assumes "\<And>x y. x |\<in>| S \<Longrightarrow> fmlookup m x = Some y \<Longrightarrow> P y y" | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 915 | shows "fmrel_on_fset S P m m" | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 916 | unfolding fmrel_on_fset_fmrel_restrict fmrel_iff | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 917 | using assms | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 918 | by (simp add: option.rel_sel) | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 919 | |
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 920 | lemma fmrel_on_fset_addI: | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 921 | assumes "fmrel_on_fset S P m n" "fmrel_on_fset S P a b" | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 922 | shows "fmrel_on_fset S P (m ++\<^sub>f a) (n ++\<^sub>f b)" | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 923 | using assms | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 924 | unfolding fmrel_on_fset_fmrel_restrict | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 925 | by auto | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 926 | |
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 927 | lemma fmrel_fmdom_eq: | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 928 | assumes "fmrel P x y" | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 929 | shows "fmdom x = fmdom y" | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 930 | proof - | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 931 | have "a |\<in>| fmdom x \<longleftrightarrow> a |\<in>| fmdom y" for a | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 932 | proof - | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 933 | have "rel_option P (fmlookup x a) (fmlookup y a)" | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 934 | using assms by (simp add: fmrel_iff) | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 935 | thus ?thesis | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 936 | by cases (auto intro: fmdomI) | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 937 | qed | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 938 | thus ?thesis | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 939 | by auto | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 940 | qed | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 941 | |
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 942 | lemma fmrel_fmdom'_eq: "fmrel P x y \<Longrightarrow> fmdom' x = fmdom' y" | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 943 | unfolding fmdom'_alt_def | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 944 | by (metis fmrel_fmdom_eq) | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 945 | |
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 946 | lemma fmrel_rel_fmran: | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 947 | assumes "fmrel P x y" | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 948 | shows "rel_fset P (fmran x) (fmran y)" | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 949 | proof - | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 950 |   {
 | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 951 | fix b | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 952 | assume "b |\<in>| fmran x" | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 953 | then obtain a where "fmlookup x a = Some b" | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 954 | by auto | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 955 | moreover have "rel_option P (fmlookup x a) (fmlookup y a)" | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 956 | using assms by auto | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 957 | ultimately have "\<exists>b'. b' |\<in>| fmran y \<and> P b b'" | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 958 | by (metis option_rel_Some1 fmranI) | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 959 | } | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 960 | moreover | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 961 |   {
 | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 962 | fix b | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 963 | assume "b |\<in>| fmran y" | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 964 | then obtain a where "fmlookup y a = Some b" | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 965 | by auto | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 966 | moreover have "rel_option P (fmlookup x a) (fmlookup y a)" | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 967 | using assms by auto | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 968 | ultimately have "\<exists>b'. b' |\<in>| fmran x \<and> P b' b" | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 969 | by (metis option_rel_Some2 fmranI) | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 970 | } | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 971 | ultimately show ?thesis | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 972 | unfolding rel_fset_alt_def | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 973 | by auto | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 974 | qed | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 975 | |
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 976 | lemma fmrel_rel_fmran': "fmrel P x y \<Longrightarrow> rel_set P (fmran' x) (fmran' y)" | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 977 | unfolding fmran'_alt_def | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 978 | by (metis fmrel_rel_fmran rel_fset_fset) | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 979 | |
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 980 | lemma pred_fmap_fmpred[simp]: "pred_fmap P = fmpred (\<lambda>_. P)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 981 | unfolding fmap.pred_set fmran'_alt_def | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 982 | including fset.lifting | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 983 | apply transfer' | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 984 | apply (rule ext) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 985 | apply (auto simp: map_pred_def ran_def split: option.splits dest: ) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 986 | done | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 987 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 988 | lemma pred_fmap_id[simp]: "pred_fmap id (fmmap f m) \<longleftrightarrow> pred_fmap f m" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 989 | unfolding fmap.pred_set fmap.set_map | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 990 | by simp | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 991 | |
| 66274 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 992 | lemma pred_fmapD: "pred_fmap P m \<Longrightarrow> x |\<in>| fmran m \<Longrightarrow> P x" | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 993 | by auto | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 994 | |
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 995 | lemma fmlookup_map[simp]: "fmlookup (fmmap f m) x = map_option f (fmlookup m x)" | 
| 64180 | 996 | by transfer' auto | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 997 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 998 | lemma fmpred_map[simp]: "fmpred P (fmmap f m) \<longleftrightarrow> fmpred (\<lambda>k v. P k (f v)) m" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 999 | unfolding fmpred_iff pred_fmap_def fmap.set_map | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1000 | by auto | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1001 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1002 | lemma fmpred_id[simp]: "fmpred (\<lambda>_. id) (fmmap f m) \<longleftrightarrow> fmpred (\<lambda>_. f) m" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1003 | by simp | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1004 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1005 | lemma fmmap_add[simp]: "fmmap f (m ++\<^sub>f n) = fmmap f m ++\<^sub>f fmmap f n" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1006 | by transfer' (auto simp: map_add_def fun_eq_iff split: option.splits) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1007 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1008 | lemma fmmap_empty[simp]: "fmmap f fmempty = fmempty" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1009 | by transfer auto | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1010 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1011 | lemma fmdom_map[simp]: "fmdom (fmmap f m) = fmdom m" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1012 | including fset.lifting | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1013 | by transfer' simp | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1014 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1015 | lemma fmdom'_map[simp]: "fmdom' (fmmap f m) = fmdom' m" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1016 | by transfer' simp | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1017 | |
| 66269 | 1018 | lemma fmran_fmmap[simp]: "fmran (fmmap f m) = f |`| fmran m" | 
| 1019 | including fset.lifting | |
| 1020 | by transfer' (auto simp: ran_def) | |
| 1021 | ||
| 1022 | lemma fmran'_fmmap[simp]: "fmran' (fmmap f m) = f ` fmran' m" | |
| 1023 | by transfer' (auto simp: ran_def) | |
| 1024 | ||
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1025 | lemma fmfilter_fmmap[simp]: "fmfilter P (fmmap f m) = fmmap f (fmfilter P m)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1026 | by transfer' (auto simp: map_filter_def) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1027 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1028 | lemma fmdrop_fmmap[simp]: "fmdrop a (fmmap f m) = fmmap f (fmdrop a m)" unfolding fmfilter_alt_defs by simp | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1029 | lemma fmdrop_set_fmmap[simp]: "fmdrop_set A (fmmap f m) = fmmap f (fmdrop_set A m)" unfolding fmfilter_alt_defs by simp | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1030 | lemma fmdrop_fset_fmmap[simp]: "fmdrop_fset A (fmmap f m) = fmmap f (fmdrop_fset A m)" unfolding fmfilter_alt_defs by simp | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1031 | lemma fmrestrict_set_fmmap[simp]: "fmrestrict_set A (fmmap f m) = fmmap f (fmrestrict_set A m)" unfolding fmfilter_alt_defs by simp | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1032 | lemma fmrestrict_fset_fmmap[simp]: "fmrestrict_fset A (fmmap f m) = fmmap f (fmrestrict_fset A m)" unfolding fmfilter_alt_defs by simp | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1033 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1034 | lemma fmmap_subset[intro]: "m \<subseteq>\<^sub>f n \<Longrightarrow> fmmap f m \<subseteq>\<^sub>f fmmap f n" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1035 | by transfer' (auto simp: map_le_def) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1036 | |
| 66398 | 1037 | lemma fmmap_fset_of_fmap: "fset_of_fmap (fmmap f m) = (\<lambda>(k, v). (k, f v)) |`| fset_of_fmap m" | 
| 1038 | including fset.lifting | |
| 1039 | by transfer' (auto simp: set_of_map_def) | |
| 1040 | ||
| 70277 
ac24aaf84a36
Finite_Map: move lemmas from LambdaAuth AFP entry
 Lars Hupel <lars.hupel@mytum.de> parents: 
69700diff
changeset | 1041 | lemma fmmap_fmupd: "fmmap f (fmupd x y m) = fmupd x (f y) (fmmap f m)" | 
| 
ac24aaf84a36
Finite_Map: move lemmas from LambdaAuth AFP entry
 Lars Hupel <lars.hupel@mytum.de> parents: 
69700diff
changeset | 1042 | by transfer' (auto simp: fun_eq_iff map_upd_def) | 
| 66398 | 1043 | |
| 69593 | 1044 | subsection \<open>\<^const>\<open>size\<close> setup\<close> | 
| 66398 | 1045 | |
| 1046 | definition size_fmap :: "('a \<Rightarrow> nat) \<Rightarrow> ('b \<Rightarrow> nat) \<Rightarrow> ('a, 'b) fmap \<Rightarrow> nat" where
 | |
| 1047 | [simp]: "size_fmap f g m = size_fset (\<lambda>(a, b). f a + g b) (fset_of_fmap m)" | |
| 1048 | ||
| 1049 | instantiation fmap :: (type, type) size begin | |
| 1050 | ||
| 1051 | definition size_fmap where | |
| 1052 | size_fmap_overloaded_def: "size_fmap = Finite_Map.size_fmap (\<lambda>_. 0) (\<lambda>_. 0)" | |
| 1053 | ||
| 1054 | instance .. | |
| 1055 | ||
| 1056 | end | |
| 1057 | ||
| 1058 | lemma size_fmap_overloaded_simps[simp]: "size x = size (fset_of_fmap x)" | |
| 1059 | unfolding size_fmap_overloaded_def | |
| 1060 | by simp | |
| 1061 | ||
| 1062 | lemma fmap_size_o_map: "inj h \<Longrightarrow> size_fmap f g \<circ> fmmap h = size_fmap f (g \<circ> h)" | |
| 1063 | unfolding size_fmap_def | |
| 1064 | apply (auto simp: fun_eq_iff fmmap_fset_of_fmap) | |
| 1065 | apply (subst sum.reindex) | |
| 1066 | subgoal for m | |
| 1067 | using prod.inj_map[unfolded map_prod_def, of "\<lambda>x. x" h] | |
| 1068 | unfolding inj_on_def | |
| 1069 | by auto | |
| 1070 | subgoal | |
| 1071 | by (rule sum.cong) (auto split: prod.splits) | |
| 1072 | done | |
| 1073 | ||
| 1074 | setup \<open> | |
| 69593 | 1075 | BNF_LFP_Size.register_size_global \<^type_name>\<open>fmap\<close> \<^const_name>\<open>size_fmap\<close> | 
| 66398 | 1076 |   @{thm size_fmap_overloaded_def} @{thms size_fmap_def size_fmap_overloaded_simps}
 | 
| 1077 |   @{thms fmap_size_o_map}
 | |
| 1078 | \<close> | |
| 1079 | ||
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1080 | |
| 66269 | 1081 | subsection \<open>Additional operations\<close> | 
| 1082 | ||
| 1083 | lift_definition fmmap_keys :: "('a \<Rightarrow> 'b \<Rightarrow> 'c) \<Rightarrow> ('a, 'b) fmap \<Rightarrow> ('a, 'c) fmap" is
 | |
| 1084 | "\<lambda>f m a. map_option (f a) (m a)" | |
| 1085 | unfolding dom_def | |
| 1086 | by simp | |
| 1087 | ||
| 1088 | lemma fmpred_fmmap_keys[simp]: "fmpred P (fmmap_keys f m) = fmpred (\<lambda>a b. P a (f a b)) m" | |
| 1089 | by transfer' (auto simp: map_pred_def split: option.splits) | |
| 1090 | ||
| 1091 | lemma fmdom_fmmap_keys[simp]: "fmdom (fmmap_keys f m) = fmdom m" | |
| 1092 | including fset.lifting | |
| 1093 | by transfer' auto | |
| 1094 | ||
| 1095 | lemma fmlookup_fmmap_keys[simp]: "fmlookup (fmmap_keys f m) x = map_option (f x) (fmlookup m x)" | |
| 1096 | by transfer' simp | |
| 1097 | ||
| 1098 | lemma fmfilter_fmmap_keys[simp]: "fmfilter P (fmmap_keys f m) = fmmap_keys f (fmfilter P m)" | |
| 1099 | by transfer' (auto simp: map_filter_def) | |
| 1100 | ||
| 1101 | lemma fmdrop_fmmap_keys[simp]: "fmdrop a (fmmap_keys f m) = fmmap_keys f (fmdrop a m)" | |
| 1102 | unfolding fmfilter_alt_defs by simp | |
| 1103 | ||
| 1104 | lemma fmdrop_set_fmmap_keys[simp]: "fmdrop_set A (fmmap_keys f m) = fmmap_keys f (fmdrop_set A m)" | |
| 1105 | unfolding fmfilter_alt_defs by simp | |
| 1106 | ||
| 1107 | lemma fmdrop_fset_fmmap_keys[simp]: "fmdrop_fset A (fmmap_keys f m) = fmmap_keys f (fmdrop_fset A m)" | |
| 1108 | unfolding fmfilter_alt_defs by simp | |
| 1109 | ||
| 1110 | lemma fmrestrict_set_fmmap_keys[simp]: "fmrestrict_set A (fmmap_keys f m) = fmmap_keys f (fmrestrict_set A m)" | |
| 1111 | unfolding fmfilter_alt_defs by simp | |
| 1112 | ||
| 1113 | lemma fmrestrict_fset_fmmap_keys[simp]: "fmrestrict_fset A (fmmap_keys f m) = fmmap_keys f (fmrestrict_fset A m)" | |
| 1114 | unfolding fmfilter_alt_defs by simp | |
| 1115 | ||
| 1116 | lemma fmmap_keys_subset[intro]: "m \<subseteq>\<^sub>f n \<Longrightarrow> fmmap_keys f m \<subseteq>\<^sub>f fmmap_keys f n" | |
| 1117 | by transfer' (auto simp: map_le_def dom_def) | |
| 1118 | ||
| 68463 
410818a69ee3
material on finite sets and maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68462diff
changeset | 1119 | definition sorted_list_of_fmap :: "('a::linorder, 'b) fmap \<Rightarrow> ('a \<times> 'b) list" where
 | 
| 
410818a69ee3
material on finite sets and maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68462diff
changeset | 1120 | "sorted_list_of_fmap m = map (\<lambda>k. (k, the (fmlookup m k))) (sorted_list_of_fset (fmdom m))" | 
| 
410818a69ee3
material on finite sets and maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68462diff
changeset | 1121 | |
| 
410818a69ee3
material on finite sets and maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68462diff
changeset | 1122 | lemma list_all_sorted_list[simp]: "list_all P (sorted_list_of_fmap m) = fmpred (curry P) m" | 
| 
410818a69ee3
material on finite sets and maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68462diff
changeset | 1123 | unfolding sorted_list_of_fmap_def curry_def list.pred_map | 
| 
410818a69ee3
material on finite sets and maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68462diff
changeset | 1124 | apply (auto simp: list_all_iff) | 
| 68810 | 1125 | including fset.lifting | 
| 68463 
410818a69ee3
material on finite sets and maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68462diff
changeset | 1126 | by (transfer; auto simp: dom_def map_pred_def split: option.splits)+ | 
| 
410818a69ee3
material on finite sets and maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68462diff
changeset | 1127 | |
| 
410818a69ee3
material on finite sets and maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68462diff
changeset | 1128 | lemma map_of_sorted_list[simp]: "map_of (sorted_list_of_fmap m) = fmlookup m" | 
| 
410818a69ee3
material on finite sets and maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68462diff
changeset | 1129 | unfolding sorted_list_of_fmap_def | 
| 68810 | 1130 | including fset.lifting | 
| 68463 
410818a69ee3
material on finite sets and maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68462diff
changeset | 1131 | by transfer (simp add: map_of_map_keys) | 
| 
410818a69ee3
material on finite sets and maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
68462diff
changeset | 1132 | |
| 66269 | 1133 | |
| 68909 | 1134 | subsection \<open>Additional properties\<close> | 
| 1135 | ||
| 1136 | lemma fmchoice': | |
| 1137 | assumes "finite S" "\<forall>x \<in> S. \<exists>y. Q x y" | |
| 1138 | shows "\<exists>m. fmdom' m = S \<and> fmpred Q m" | |
| 1139 | proof - | |
| 1140 | obtain f where f: "Q x (f x)" if "x \<in> S" for x | |
| 1141 | using assms by (metis bchoice) | |
| 1142 | define f' where "f' x = (if x \<in> S then Some (f x) else None)" for x | |
| 1143 | ||
| 1144 | have "eq_onp (\<lambda>m. finite (dom m)) f' f'" | |
| 1145 | unfolding eq_onp_def f'_def dom_def using assms by auto | |
| 1146 | ||
| 1147 | show ?thesis | |
| 1148 | apply (rule exI[where x = "Abs_fmap f'"]) | |
| 1149 | apply (subst fmpred.abs_eq, fact) | |
| 1150 | apply (subst fmdom'.abs_eq, fact) | |
| 1151 | unfolding f'_def dom_def map_pred_def using f | |
| 1152 | by auto | |
| 1153 | qed | |
| 1154 | ||
| 66269 | 1155 | subsection \<open>Lifting/transfer setup\<close> | 
| 1156 | ||
| 1157 | context includes lifting_syntax begin | |
| 1158 | ||
| 1159 | lemma fmempty_transfer[simp, intro, transfer_rule]: "fmrel P fmempty fmempty" | |
| 1160 | by transfer auto | |
| 1161 | ||
| 1162 | lemma fmadd_transfer[transfer_rule]: | |
| 1163 | "(fmrel P ===> fmrel P ===> fmrel P) fmadd fmadd" | |
| 68909 | 1164 | by (intro fmrel_addI rel_funI) | 
| 66269 | 1165 | |
| 1166 | lemma fmupd_transfer[transfer_rule]: | |
| 67399 | 1167 | "((=) ===> P ===> fmrel P ===> fmrel P) fmupd fmupd" | 
| 68909 | 1168 | by auto | 
| 66269 | 1169 | |
| 1170 | end | |
| 1171 | ||
| 68909 | 1172 | lemma Quotient_fmap_bnf[quot_map]: | 
| 1173 | assumes "Quotient R Abs Rep T" | |
| 1174 | shows "Quotient (fmrel R) (fmmap Abs) (fmmap Rep) (fmrel T)" | |
| 1175 | unfolding Quotient_alt_def4 proof safe | |
| 1176 | fix m n | |
| 1177 | assume "fmrel T m n" | |
| 1178 | then have "fmlookup (fmmap Abs m) x = fmlookup n x" for x | |
| 1179 | apply (cases rule: fmrel_cases[where x = x]) | |
| 1180 | using assms unfolding Quotient_alt_def by auto | |
| 1181 | then show "fmmap Abs m = n" | |
| 1182 | by (rule fmap_ext) | |
| 1183 | next | |
| 1184 | fix m | |
| 1185 | show "fmrel T (fmmap Rep m) m" | |
| 1186 | unfolding fmap.rel_map | |
| 1187 | apply (rule fmap.rel_refl) | |
| 1188 | using assms unfolding Quotient_alt_def | |
| 1189 | by auto | |
| 1190 | next | |
| 1191 | from assms have "R = T OO T\<inverse>\<inverse>" | |
| 1192 | unfolding Quotient_alt_def4 by simp | |
| 1193 | ||
| 1194 | then show "fmrel R = fmrel T OO (fmrel T)\<inverse>\<inverse>" | |
| 1195 | by (simp add: fmap.rel_compp fmap.rel_conversep) | |
| 1196 | qed | |
| 1197 | ||
| 66274 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1198 | |
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1199 | subsection \<open>View as datatype\<close> | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1200 | |
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1201 | lemma fmap_distinct[simp]: | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1202 | "fmempty \<noteq> fmupd k v m" | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1203 | "fmupd k v m \<noteq> fmempty" | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1204 | by (transfer'; auto simp: map_upd_def fun_eq_iff)+ | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1205 | |
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1206 | lifting_update fmap.lifting | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1207 | |
| 68810 | 1208 | lemma fmap_exhaust[cases type: fmap]: | 
| 1209 | obtains (fmempty) "m = fmempty" | |
| 1210 | | (fmupd) x y m' where "m = fmupd x y m'" "x |\<notin>| fmdom m'" | |
| 1211 | using that including fmap.lifting fset.lifting | |
| 66274 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1212 | proof transfer | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1213 | fix m P | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1214 | assume "finite (dom m)" | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1215 | assume empty: P if "m = Map.empty" | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1216 | assume map_upd: P if "finite (dom m')" "m = map_upd x y m'" "x \<notin> dom m'" for x y m' | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1217 | |
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1218 | show P | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1219 | proof (cases "m = Map.empty") | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1220 | case True thus ?thesis using empty by simp | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1221 | next | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1222 | case False | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1223 |       hence "dom m \<noteq> {}" by simp
 | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1224 | then obtain x where "x \<in> dom m" by blast | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1225 | |
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1226 | let ?m' = "map_drop x m" | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1227 | |
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1228 | show ?thesis | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1229 | proof (rule map_upd) | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1230 | show "finite (dom ?m')" | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1231 | using \<open>finite (dom m)\<close> | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1232 | unfolding map_drop_def | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1233 | by auto | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1234 | next | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1235 | show "m = map_upd x (the (m x)) ?m'" | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1236 | using \<open>x \<in> dom m\<close> unfolding map_drop_def map_filter_def map_upd_def | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1237 | by auto | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1238 | next | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1239 | show "x \<notin> dom ?m'" | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1240 | unfolding map_drop_def map_filter_def | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1241 | by auto | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1242 | qed | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1243 | qed | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1244 | qed | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1245 | |
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1246 | lemma fmap_induct[case_names fmempty fmupd, induct type: fmap]: | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1247 | assumes "P fmempty" | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1248 | assumes "(\<And>x y m. P m \<Longrightarrow> fmlookup m x = None \<Longrightarrow> P (fmupd x y m))" | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1249 | shows "P m" | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1250 | proof (induction "fmdom m" arbitrary: m rule: fset_induct_stronger) | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1251 | case empty | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1252 | hence "m = fmempty" | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1253 | by (metis fmrestrict_fset_dom fmrestrict_fset_null) | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1254 | with assms show ?case | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1255 | by simp | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1256 | next | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1257 | case (insert x S) | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1258 | hence "S = fmdom (fmdrop x m)" | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1259 | by auto | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1260 | with insert have "P (fmdrop x m)" | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1261 | by auto | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1262 | |
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1263 | have "x |\<in>| fmdom m" | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1264 | using insert by auto | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1265 | then obtain y where "fmlookup m x = Some y" | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1266 | by auto | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1267 | hence "m = fmupd x y (fmdrop x m)" | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1268 | by (auto intro: fmap_ext) | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1269 | |
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1270 | show ?case | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1271 | apply (subst \<open>m = _\<close>) | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1272 | apply (rule assms) | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1273 | apply fact | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1274 | apply simp | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1275 | done | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1276 | qed | 
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1277 | |
| 
be8d3819c21c
more material on finite maps
 Lars Hupel <lars.hupel@mytum.de> parents: 
66273diff
changeset | 1278 | |
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1279 | subsection \<open>Code setup\<close> | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1280 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1281 | instantiation fmap :: (type, equal) equal begin | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1282 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1283 | definition "equal_fmap \<equiv> fmrel HOL.equal" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1284 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1285 | instance proof | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1286 |   fix m n :: "('a, 'b) fmap"
 | 
| 67399 | 1287 | have "fmrel (=) m n \<longleftrightarrow> (m = n)" | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1288 | by transfer' (simp add: option.rel_eq rel_fun_eq) | 
| 64180 | 1289 | then show "equal_class.equal m n \<longleftrightarrow> (m = n)" | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1290 | unfolding equal_fmap_def | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1291 | by (simp add: equal_eq[abs_def]) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1292 | qed | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1293 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1294 | end | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1295 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1296 | lemma fBall_alt_def: "fBall S P \<longleftrightarrow> (\<forall>x. x |\<in>| S \<longrightarrow> P x)" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1297 | by force | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1298 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1299 | lemma fmrel_code: | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1300 | "fmrel R m n \<longleftrightarrow> | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1301 | fBall (fmdom m) (\<lambda>x. rel_option R (fmlookup m x) (fmlookup n x)) \<and> | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1302 | fBall (fmdom n) (\<lambda>x. rel_option R (fmlookup m x) (fmlookup n x))" | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1303 | unfolding fmrel_iff fmlookup_dom_iff fBall_alt_def | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1304 | by (metis option.collapse option.rel_sel) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1305 | |
| 66291 | 1306 | lemmas [code] = | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1307 | fmrel_code | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1308 | fmran'_alt_def | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1309 | fmdom'_alt_def | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1310 | fmfilter_alt_defs | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1311 | pred_fmap_fmpred | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1312 | fmsubset_alt_def | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1313 | fmupd_alt_def | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1314 | fmrel_on_fset_alt_def | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1315 | fmpred_alt_def | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1316 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1317 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1318 | code_datatype fmap_of_list | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1319 | quickcheck_generator fmap constructors: fmap_of_list | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1320 | |
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1321 | context includes fset.lifting begin | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1322 | |
| 66269 | 1323 | lemma fmlookup_of_list[code]: "fmlookup (fmap_of_list m) = map_of m" | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1324 | by transfer simp | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1325 | |
| 66269 | 1326 | lemma fmempty_of_list[code]: "fmempty = fmap_of_list []" | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1327 | by transfer simp | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1328 | |
| 66269 | 1329 | lemma fmran_of_list[code]: "fmran (fmap_of_list m) = snd |`| fset_of_list (AList.clearjunk m)" | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1330 | by transfer (auto simp: ran_map_of) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1331 | |
| 66269 | 1332 | lemma fmdom_of_list[code]: "fmdom (fmap_of_list m) = fst |`| fset_of_list m" | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1333 | by transfer (auto simp: dom_map_of_conv_image_fst) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1334 | |
| 66269 | 1335 | lemma fmfilter_of_list[code]: "fmfilter P (fmap_of_list m) = fmap_of_list (filter (\<lambda>(k, _). P k) m)" | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1336 | by transfer' auto | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1337 | |
| 66269 | 1338 | lemma fmadd_of_list[code]: "fmap_of_list m ++\<^sub>f fmap_of_list n = fmap_of_list (AList.merge m n)" | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1339 | by transfer (simp add: merge_conv') | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1340 | |
| 66269 | 1341 | lemma fmmap_of_list[code]: "fmmap f (fmap_of_list m) = fmap_of_list (map (apsnd f) m)" | 
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1342 | apply transfer | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1343 | apply (subst map_of_map[symmetric]) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1344 | apply (auto simp: apsnd_def map_prod_def) | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1345 | done | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1346 | |
| 68810 | 1347 | lemma fmmap_keys_of_list[code]: | 
| 1348 | "fmmap_keys f (fmap_of_list m) = fmap_of_list (map (\<lambda>(a, b). (a, f a b)) m)" | |
| 66269 | 1349 | apply transfer | 
| 1350 | subgoal for f m by (induction m) (auto simp: apsnd_def map_prod_def fun_eq_iff) | |
| 1351 | done | |
| 1352 | ||
| 68810 | 1353 | lemma fmimage_of_list[code]: | 
| 1354 | "fmimage (fmap_of_list m) A = fset_of_list (map snd (filter (\<lambda>(k, _). k |\<in>| A) (AList.clearjunk m)))" | |
| 1355 | apply (subst fmimage_alt_def) | |
| 1356 | apply (subst fmfilter_alt_defs) | |
| 1357 | apply (subst fmfilter_of_list) | |
| 1358 | apply (subst fmran_of_list) | |
| 1359 | apply transfer' | |
| 1360 | apply (subst AList.restrict_eq[symmetric]) | |
| 1361 | apply (subst clearjunk_restrict) | |
| 1362 | apply (subst AList.restrict_eq) | |
| 1363 | by auto | |
| 1364 | ||
| 1365 | lemma fmcomp_list[code]: | |
| 1366 | "fmap_of_list m \<circ>\<^sub>f fmap_of_list n = fmap_of_list (AList.compose n m)" | |
| 1367 | by (rule fmap_ext) (simp add: fmlookup_of_list compose_conv map_comp_def split: option.splits) | |
| 1368 | ||
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1369 | end | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1370 | |
| 66267 | 1371 | |
| 1372 | subsection \<open>Instances\<close> | |
| 1373 | ||
| 1374 | lemma exists_map_of: | |
| 1375 | assumes "finite (dom m)" shows "\<exists>xs. map_of xs = m" | |
| 1376 | using assms | |
| 1377 | proof (induction "dom m" arbitrary: m) | |
| 1378 | case empty | |
| 1379 | hence "m = Map.empty" | |
| 1380 | by auto | |
| 1381 | moreover have "map_of [] = Map.empty" | |
| 1382 | by simp | |
| 1383 | ultimately show ?case | |
| 1384 | by blast | |
| 1385 | next | |
| 1386 | case (insert x F) | |
| 1387 | hence "F = dom (map_drop x m)" | |
| 1388 | unfolding map_drop_def map_filter_def dom_def by auto | |
| 1389 | with insert have "\<exists>xs'. map_of xs' = map_drop x m" | |
| 1390 | by auto | |
| 1391 | then obtain xs' where "map_of xs' = map_drop x m" | |
| 1392 | .. | |
| 1393 | moreover obtain y where "m x = Some y" | |
| 1394 | using insert unfolding dom_def by blast | |
| 1395 | ultimately have "map_of ((x, y) # xs') = m" | |
| 1396 | using \<open>insert x F = dom m\<close> | |
| 1397 | unfolding map_drop_def map_filter_def | |
| 1398 | by auto | |
| 1399 | thus ?case | |
| 1400 | .. | |
| 1401 | qed | |
| 1402 | ||
| 1403 | lemma exists_fmap_of_list: "\<exists>xs. fmap_of_list xs = m" | |
| 1404 | by transfer (rule exists_map_of) | |
| 1405 | ||
| 1406 | lemma fmap_of_list_surj[simp, intro]: "surj fmap_of_list" | |
| 1407 | proof - | |
| 1408 |   have "x \<in> range fmap_of_list" for x :: "('a, 'b) fmap"
 | |
| 1409 | unfolding image_iff | |
| 1410 | using exists_fmap_of_list by (metis UNIV_I) | |
| 1411 | thus ?thesis by auto | |
| 1412 | qed | |
| 1413 | ||
| 1414 | instance fmap :: (countable, countable) countable | |
| 1415 | proof | |
| 1416 |   obtain to_nat :: "('a \<times> 'b) list \<Rightarrow> nat" where "inj to_nat"
 | |
| 1417 | by (metis ex_inj) | |
| 1418 | moreover have "inj (inv fmap_of_list)" | |
| 1419 | using fmap_of_list_surj by (rule surj_imp_inj_inv) | |
| 1420 | ultimately have "inj (to_nat \<circ> inv fmap_of_list)" | |
| 69700 
7a92cbec7030
new material about summations and powers, along with some tweaks
 paulson <lp15@cam.ac.uk> parents: 
69593diff
changeset | 1421 | by (rule inj_compose) | 
| 66267 | 1422 |   thus "\<exists>to_nat::('a, 'b) fmap \<Rightarrow> nat. inj to_nat"
 | 
| 1423 | by auto | |
| 1424 | qed | |
| 1425 | ||
| 66282 | 1426 | instance fmap :: (finite, finite) finite | 
| 1427 | proof | |
| 1428 |   show "finite (UNIV :: ('a, 'b) fmap set)"
 | |
| 1429 | by (rule finite_imageD) auto | |
| 1430 | qed | |
| 1431 | ||
| 63885 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1432 | lifting_update fmap.lifting | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1433 | lifting_forget fmap.lifting | 
| 
a6cd18af8bf9
new type for finite maps; use it in HOL-Probability
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 1434 | |
| 68909 | 1435 | |
| 1436 | subsection \<open>Tests\<close> | |
| 1437 | ||
| 1438 | \<comment> \<open>Code generation\<close> | |
| 1439 | ||
| 1440 | export_code | |
| 78117 
7735645667f0
redefined FSet.fBall and FSet.fBex as abbreviations based on Set.Ball and Set.Bex
 desharna parents: 
71262diff
changeset | 1441 | Ball fset fmrel fmran fmran' fmdom fmdom' fmpred pred_fmap fmsubset fmupd fmrel_on_fset | 
| 68909 | 1442 | fmdrop fmdrop_set fmdrop_fset fmrestrict_set fmrestrict_fset fmimage fmlookup fmempty | 
| 1443 | fmfilter fmadd fmmap fmmap_keys fmcomp | |
| 1444 | checking SML Scala Haskell? OCaml? | |
| 1445 | ||
| 69593 | 1446 | \<comment> \<open>\<open>lifting\<close> through \<^type>\<open>fmap\<close>\<close> | 
| 68909 | 1447 | |
| 1448 | experiment begin | |
| 1449 | ||
| 1450 | context includes fset.lifting begin | |
| 1451 | ||
| 1452 | lift_definition test1 :: "('a, 'b fset) fmap" is "fmempty :: ('a, 'b set) fmap"
 | |
| 1453 | by auto | |
| 1454 | ||
| 1455 | lift_definition test2 :: "'a \<Rightarrow> 'b \<Rightarrow> ('a, 'b fset) fmap" is "\<lambda>a b. fmupd a {b} fmempty"
 | |
| 1456 | by auto | |
| 1457 | ||
| 1458 | end | |
| 1459 | ||
| 1460 | end | |
| 1461 | ||
| 67485 
89f5d876a656
repair malformed fundef_cong rule
 Lars Hupel <lars.hupel@mytum.de> parents: 
67399diff
changeset | 1462 | end |