| author | wenzelm | 
| Tue, 18 Jul 2023 12:55:43 +0200 | |
| changeset 78393 | a2d22d519bf2 | 
| 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: 
68386 
diff
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: 
67485 
diff
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: 
68386 
diff
changeset
 | 
14  | 
parametric_constant map_add_transfer[transfer_rule]: map_add_def  | 
| 
 
8d1bf38c6fe6
simplify parametricity proofs
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68386 
diff
changeset
 | 
15  | 
parametric_constant map_of_transfer[transfer_rule]: map_of_def  | 
| 
 
8d1bf38c6fe6
simplify parametricity proofs
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68386 
diff
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: 
68386 
diff
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: 
68386 
diff
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: 
68386 
diff
changeset
 | 
71  | 
parametric_constant map_filter_transfer[transfer_rule]: map_filter_def  | 
| 
 
8d1bf38c6fe6
simplify parametricity proofs
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68386 
diff
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: 
68386 
diff
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: 
68386 
diff
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: 
68386 
diff
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: 
68386 
diff
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: 
68909 
diff
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: 
68386 
diff
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: 
66267 
diff
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: 
66267 
diff
changeset
 | 
182  | 
by transfer' (auto simp: ran_def)  | 
| 
 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66267 
diff
changeset
 | 
183  | 
|
| 
 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66267 
diff
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: 
66267 
diff
changeset
 | 
185  | 
|
| 
 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66267 
diff
changeset
 | 
186  | 
lemma fmranE[elim]:  | 
| 
 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66267 
diff
changeset
 | 
187  | 
assumes "y |\<in>| fmran m"  | 
| 
 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66267 
diff
changeset
 | 
188  | 
obtains x where "fmlookup m x = Some y"  | 
| 
 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66267 
diff
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: 
66267 
diff
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: 
66267 
diff
changeset
 | 
197  | 
by transfer' auto  | 
| 
 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66267 
diff
changeset
 | 
198  | 
|
| 
 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66267 
diff
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: 
66267 
diff
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: 
66267 
diff
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: 
66267 
diff
changeset
 | 
202  | 
|
| 
 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66267 
diff
changeset
 | 
203  | 
lemma fmdomE[elim]:  | 
| 
 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66267 
diff
changeset
 | 
204  | 
assumes "x |\<in>| fmdom m"  | 
| 
 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66267 
diff
changeset
 | 
205  | 
obtains y where "fmlookup m x = Some y"  | 
| 
 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66267 
diff
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: 
66267 
diff
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: 
66267 
diff
changeset
 | 
214  | 
by transfer' auto  | 
| 
 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66267 
diff
changeset
 | 
215  | 
|
| 
 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66267 
diff
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: 
66267 
diff
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: 
66267 
diff
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: 
66267 
diff
changeset
 | 
220  | 
lemma fmdom'E[elim]:  | 
| 
 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66267 
diff
changeset
 | 
221  | 
assumes "x \<in> fmdom' m"  | 
| 
 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66267 
diff
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: 
66267 
diff
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: 
66267 
diff
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: 
66267 
diff
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: 
68909 
diff
changeset
 | 
228  | 
lemma finite_fmdom'[simp]: "finite (fmdom' m)"  | 
| 
 
c5e3212455ed
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68909 
diff
changeset
 | 
229  | 
unfolding fmdom'_alt_def by simp  | 
| 
 
c5e3212455ed
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68909 
diff
changeset
 | 
230  | 
|
| 
 
c5e3212455ed
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68909 
diff
changeset
 | 
231  | 
lemma dom_fmlookup[simp]: "dom (fmlookup m) = fmdom' m"  | 
| 
 
c5e3212455ed
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68909 
diff
changeset
 | 
232  | 
by transfer' simp  | 
| 
 
c5e3212455ed
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68909 
diff
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: 
69700 
diff
changeset
 | 
257  | 
lemma fmupd_reorder_neq:  | 
| 
 
ac24aaf84a36
Finite_Map: move lemmas from LambdaAuth AFP entry
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
69700 
diff
changeset
 | 
258  | 
assumes "a \<noteq> b"  | 
| 
 
ac24aaf84a36
Finite_Map: move lemmas from LambdaAuth AFP entry
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
69700 
diff
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: 
69700 
diff
changeset
 | 
260  | 
using assms  | 
| 
 
ac24aaf84a36
Finite_Map: move lemmas from LambdaAuth AFP entry
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
69700 
diff
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: 
69700 
diff
changeset
 | 
262  | 
|
| 
 
ac24aaf84a36
Finite_Map: move lemmas from LambdaAuth AFP entry
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
69700 
diff
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: 
69700 
diff
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: 
69700 
diff
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: 
66267 
diff
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: 
66267 
diff
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: 
66267 
diff
changeset
 | 
294  | 
lemma fmfilter_false[simp]:  | 
| 
 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66267 
diff
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: 
66267 
diff
changeset
 | 
296  | 
shows "fmfilter P m = fmempty"  | 
| 
 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66267 
diff
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: 
66267 
diff
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: 
66267 
diff
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: 
67399 
diff
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: 
67399 
diff
changeset
 | 
318  | 
shows "fmfilter P m = fmfilter Q n"  | 
| 
 
89f5d876a656
repair malformed fundef_cong rule
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
67399 
diff
changeset
 | 
319  | 
using assms(2) unfolding assms(1)  | 
| 
66268
 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66267 
diff
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: 
69700 
diff
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: 
69700 
diff
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: 
69700 
diff
changeset
 | 
371  | 
|
| 
 
ac24aaf84a36
Finite_Map: move lemmas from LambdaAuth AFP entry
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
69700 
diff
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: 
69700 
diff
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: 
69700 
diff
changeset
 | 
374  | 
|
| 
 
ac24aaf84a36
Finite_Map: move lemmas from LambdaAuth AFP entry
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
69700 
diff
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: 
69700 
diff
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: 
69700 
diff
changeset
 | 
377  | 
|
| 
 
ac24aaf84a36
Finite_Map: move lemmas from LambdaAuth AFP entry
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
69700 
diff
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: 
69700 
diff
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: 
69700 
diff
changeset
 | 
380  | 
|
| 
69142
 
c5e3212455ed
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68909 
diff
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: 
68909 
diff
changeset
 | 
382  | 
unfolding fmfilter_alt_defs by auto  | 
| 
 
c5e3212455ed
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68909 
diff
changeset
 | 
383  | 
|
| 
 
c5e3212455ed
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68909 
diff
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: 
68909 
diff
changeset
 | 
385  | 
unfolding fmfilter_alt_defs by auto  | 
| 
 
c5e3212455ed
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68909 
diff
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: 
69700 
diff
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: 
69700 
diff
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: 
69700 
diff
changeset
 | 
430  | 
|
| 
 
ac24aaf84a36
Finite_Map: move lemmas from LambdaAuth AFP entry
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
69700 
diff
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: 
69700 
diff
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: 
69700 
diff
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: 
68909 
diff
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: 
68909 
diff
changeset
 | 
468  | 
unfolding fmfilter_alt_defs by auto  | 
| 
 
c5e3212455ed
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68909 
diff
changeset
 | 
469  | 
|
| 
 
c5e3212455ed
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68909 
diff
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: 
68909 
diff
changeset
 | 
471  | 
unfolding fmfilter_alt_defs by auto  | 
| 
 
c5e3212455ed
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68909 
diff
changeset
 | 
472  | 
|
| 
 
c5e3212455ed
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68909 
diff
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: 
68909 
diff
changeset
 | 
474  | 
unfolding fmfilter_alt_defs by auto  | 
| 
 
c5e3212455ed
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68909 
diff
changeset
 | 
475  | 
|
| 
 
c5e3212455ed
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68909 
diff
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: 
68909 
diff
changeset
 | 
477  | 
unfolding fmfilter_alt_defs by auto  | 
| 
 
c5e3212455ed
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68909 
diff
changeset
 | 
478  | 
|
| 
 
c5e3212455ed
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68909 
diff
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: 
68909 
diff
changeset
 | 
480  | 
by (rule fmap_ext) auto  | 
| 
 
c5e3212455ed
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68909 
diff
changeset
 | 
481  | 
|
| 
 
c5e3212455ed
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68909 
diff
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: 
68909 
diff
changeset
 | 
483  | 
by (rule fmap_ext) auto  | 
| 
 
c5e3212455ed
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68909 
diff
changeset
 | 
484  | 
|
| 
 
c5e3212455ed
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68909 
diff
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: 
68909 
diff
changeset
 | 
486  | 
unfolding fmfilter_alt_defs by auto  | 
| 
 
c5e3212455ed
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68909 
diff
changeset
 | 
487  | 
|
| 
 
c5e3212455ed
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68909 
diff
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: 
68909 
diff
changeset
 | 
489  | 
unfolding fmfilter_alt_defs by auto  | 
| 
 
c5e3212455ed
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68909 
diff
changeset
 | 
490  | 
|
| 
 
c5e3212455ed
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68909 
diff
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: 
68909 
diff
changeset
 | 
492  | 
unfolding fmfilter_alt_defs by auto  | 
| 
 
c5e3212455ed
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68909 
diff
changeset
 | 
493  | 
|
| 
 
c5e3212455ed
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68909 
diff
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: 
68909 
diff
changeset
 | 
495  | 
by (rule fmap_ext) auto  | 
| 
 
c5e3212455ed
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68909 
diff
changeset
 | 
496  | 
|
| 
 
c5e3212455ed
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68909 
diff
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: 
68909 
diff
changeset
 | 
498  | 
by (rule fmap_ext) auto  | 
| 
 
c5e3212455ed
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68909 
diff
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: 
68463 
diff
changeset
 | 
575  | 
lemma fmpred_mono_strong:  | 
| 
 
e7e3776385ba
Finite_Map: monotonicity
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68463 
diff
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: 
68463 
diff
changeset
 | 
577  | 
shows "fmpred P m \<Longrightarrow> fmpred Q m"  | 
| 
 
e7e3776385ba
Finite_Map: monotonicity
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68463 
diff
changeset
 | 
578  | 
using assms unfolding fmpred_iff by auto  | 
| 
 
e7e3776385ba
Finite_Map: monotonicity
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68463 
diff
changeset
 | 
579  | 
|
| 
 
e7e3776385ba
Finite_Map: monotonicity
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68463 
diff
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: 
68463 
diff
changeset
 | 
581  | 
apply rule  | 
| 
 
e7e3776385ba
Finite_Map: monotonicity
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68463 
diff
changeset
 | 
582  | 
apply (rule fmpred_mono_strong[where P = P and Q = Q])  | 
| 
 
e7e3776385ba
Finite_Map: monotonicity
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68463 
diff
changeset
 | 
583  | 
apply auto  | 
| 
 
e7e3776385ba
Finite_Map: monotonicity
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68463 
diff
changeset
 | 
584  | 
done  | 
| 
 
e7e3776385ba
Finite_Map: monotonicity
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68463 
diff
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: 
68909 
diff
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: 
68909 
diff
changeset
 | 
652  | 
unfolding fmsubset_alt_def fmpred_iff by auto  | 
| 
 
c5e3212455ed
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68909 
diff
changeset
 | 
653  | 
|
| 
 
c5e3212455ed
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68909 
diff
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: 
68909 
diff
changeset
 | 
655  | 
unfolding fmfilter_alt_defs by (rule fmfilter_subset)  | 
| 
 
c5e3212455ed
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68909 
diff
changeset
 | 
656  | 
|
| 
 
c5e3212455ed
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68909 
diff
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: 
68909 
diff
changeset
 | 
658  | 
unfolding fmfilter_alt_defs by (rule fmfilter_subset)  | 
| 
 
c5e3212455ed
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68909 
diff
changeset
 | 
659  | 
|
| 
 
c5e3212455ed
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68909 
diff
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: 
68909 
diff
changeset
 | 
661  | 
unfolding fmfilter_alt_defs by (rule fmfilter_subset)  | 
| 
 
c5e3212455ed
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68909 
diff
changeset
 | 
662  | 
|
| 
 
c5e3212455ed
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68909 
diff
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: 
68909 
diff
changeset
 | 
664  | 
unfolding fmfilter_alt_defs by (rule fmfilter_subset)  | 
| 
 
c5e3212455ed
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68909 
diff
changeset
 | 
665  | 
|
| 
 
c5e3212455ed
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68909 
diff
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: 
68909 
diff
changeset
 | 
667  | 
unfolding fmfilter_alt_defs by (rule fmfilter_subset)  | 
| 
 
c5e3212455ed
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68909 
diff
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: 
64180 
diff
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: 
66273 
diff
changeset
 | 
740  | 
lemma fmrel_on_fset_unionI:  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
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: 
66273 
diff
changeset
 | 
742  | 
unfolding fmrel_on_fset_alt_def  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
743  | 
by auto  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
744  | 
|
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
745  | 
lemma fmrel_on_fset_updateI:  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
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: 
66273 
diff
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: 
66273 
diff
changeset
 | 
748  | 
using assms  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
749  | 
unfolding fmrel_on_fset_alt_def  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
750  | 
by auto  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
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: 
66267 
diff
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: 
66267 
diff
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: 
66267 
diff
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: 
66267 
diff
changeset
 | 
846  | 
by transfer' (auto simp: ran_def)  | 
| 
 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66267 
diff
changeset
 | 
847  | 
|
| 
 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66267 
diff
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: 
66267 
diff
changeset
 | 
849  | 
|
| 
 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66267 
diff
changeset
 | 
850  | 
lemma fmran'E[elim]:  | 
| 
 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66267 
diff
changeset
 | 
851  | 
assumes "y \<in> fmran' m"  | 
| 
 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66267 
diff
changeset
 | 
852  | 
obtains x where "fmlookup m x = Some y"  | 
| 
 
e4b98cad5ab4
canonical representation for fmaps is fmlookup
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66267 
diff
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: 
66273 
diff
changeset
 | 
908  | 
lemma fmrel_on_fset_fmrel_restrict:  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
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: 
66273 
diff
changeset
 | 
910  | 
unfolding fmrel_on_fset_alt_def fmrel_iff  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
911  | 
by auto  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
912  | 
|
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
913  | 
lemma fmrel_on_fset_refl_strong:  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
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: 
66273 
diff
changeset
 | 
915  | 
shows "fmrel_on_fset S P m m"  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
916  | 
unfolding fmrel_on_fset_fmrel_restrict fmrel_iff  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
917  | 
using assms  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
918  | 
by (simp add: option.rel_sel)  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
919  | 
|
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
920  | 
lemma fmrel_on_fset_addI:  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
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: 
66273 
diff
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: 
66273 
diff
changeset
 | 
923  | 
using assms  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
924  | 
unfolding fmrel_on_fset_fmrel_restrict  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
925  | 
by auto  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
926  | 
|
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
927  | 
lemma fmrel_fmdom_eq:  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
928  | 
assumes "fmrel P x y"  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
929  | 
shows "fmdom x = fmdom y"  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
930  | 
proof -  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
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: 
66273 
diff
changeset
 | 
932  | 
proof -  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
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: 
66273 
diff
changeset
 | 
934  | 
using assms by (simp add: fmrel_iff)  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
935  | 
thus ?thesis  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
936  | 
by cases (auto intro: fmdomI)  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
937  | 
qed  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
938  | 
thus ?thesis  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
939  | 
by auto  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
940  | 
qed  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
941  | 
|
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
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: 
66273 
diff
changeset
 | 
943  | 
unfolding fmdom'_alt_def  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
944  | 
by (metis fmrel_fmdom_eq)  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
945  | 
|
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
946  | 
lemma fmrel_rel_fmran:  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
947  | 
assumes "fmrel P x y"  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
948  | 
shows "rel_fset P (fmran x) (fmran y)"  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
949  | 
proof -  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
950  | 
  {
 | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
951  | 
fix b  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
952  | 
assume "b |\<in>| fmran x"  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
953  | 
then obtain a where "fmlookup x a = Some b"  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
954  | 
by auto  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
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: 
66273 
diff
changeset
 | 
956  | 
using assms by auto  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
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: 
66273 
diff
changeset
 | 
958  | 
by (metis option_rel_Some1 fmranI)  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
959  | 
}  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
960  | 
moreover  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
961  | 
  {
 | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
962  | 
fix b  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
963  | 
assume "b |\<in>| fmran y"  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
964  | 
then obtain a where "fmlookup y a = Some b"  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
965  | 
by auto  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
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: 
66273 
diff
changeset
 | 
967  | 
using assms by auto  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
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: 
66273 
diff
changeset
 | 
969  | 
by (metis option_rel_Some2 fmranI)  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
970  | 
}  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
971  | 
ultimately show ?thesis  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
972  | 
unfolding rel_fset_alt_def  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
973  | 
by auto  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
974  | 
qed  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
975  | 
|
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
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: 
66273 
diff
changeset
 | 
977  | 
unfolding fmran'_alt_def  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
978  | 
by (metis fmrel_rel_fmran rel_fset_fset)  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
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: 
66273 
diff
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: 
66273 
diff
changeset
 | 
993  | 
by auto  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
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: 
69700 
diff
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: 
69700 
diff
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: 
68462 
diff
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: 
68462 
diff
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: 
68462 
diff
changeset
 | 
1121  | 
|
| 
 
410818a69ee3
material on finite sets and maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68462 
diff
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: 
68462 
diff
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: 
68462 
diff
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: 
68462 
diff
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: 
68462 
diff
changeset
 | 
1127  | 
|
| 
 
410818a69ee3
material on finite sets and maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68462 
diff
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: 
68462 
diff
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: 
68462 
diff
changeset
 | 
1131  | 
by transfer (simp add: map_of_map_keys)  | 
| 
 
410818a69ee3
material on finite sets and maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
68462 
diff
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: 
66273 
diff
changeset
 | 
1198  | 
|
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1199  | 
subsection \<open>View as datatype\<close>  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1200  | 
|
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1201  | 
lemma fmap_distinct[simp]:  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1202  | 
"fmempty \<noteq> fmupd k v m"  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1203  | 
"fmupd k v m \<noteq> fmempty"  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
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: 
66273 
diff
changeset
 | 
1205  | 
|
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1206  | 
lifting_update fmap.lifting  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
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: 
66273 
diff
changeset
 | 
1212  | 
proof transfer  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1213  | 
fix m P  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1214  | 
assume "finite (dom m)"  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1215  | 
assume empty: P if "m = Map.empty"  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
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: 
66273 
diff
changeset
 | 
1217  | 
|
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1218  | 
show P  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1219  | 
proof (cases "m = Map.empty")  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1220  | 
case True thus ?thesis using empty by simp  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1221  | 
next  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1222  | 
case False  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1223  | 
      hence "dom m \<noteq> {}" by simp
 | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
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: 
66273 
diff
changeset
 | 
1225  | 
|
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1226  | 
let ?m' = "map_drop x m"  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1227  | 
|
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1228  | 
show ?thesis  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1229  | 
proof (rule map_upd)  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1230  | 
show "finite (dom ?m')"  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1231  | 
using \<open>finite (dom m)\<close>  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1232  | 
unfolding map_drop_def  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1233  | 
by auto  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1234  | 
next  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1235  | 
show "m = map_upd x (the (m x)) ?m'"  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
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: 
66273 
diff
changeset
 | 
1237  | 
by auto  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1238  | 
next  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1239  | 
show "x \<notin> dom ?m'"  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1240  | 
unfolding map_drop_def map_filter_def  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1241  | 
by auto  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1242  | 
qed  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1243  | 
qed  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1244  | 
qed  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1245  | 
|
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
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: 
66273 
diff
changeset
 | 
1247  | 
assumes "P fmempty"  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
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: 
66273 
diff
changeset
 | 
1249  | 
shows "P m"  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
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: 
66273 
diff
changeset
 | 
1251  | 
case empty  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1252  | 
hence "m = fmempty"  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1253  | 
by (metis fmrestrict_fset_dom fmrestrict_fset_null)  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1254  | 
with assms show ?case  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1255  | 
by simp  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1256  | 
next  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1257  | 
case (insert x S)  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1258  | 
hence "S = fmdom (fmdrop x m)"  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1259  | 
by auto  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1260  | 
with insert have "P (fmdrop x m)"  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1261  | 
by auto  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1262  | 
|
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1263  | 
have "x |\<in>| fmdom m"  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1264  | 
using insert by auto  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1265  | 
then obtain y where "fmlookup m x = Some y"  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1266  | 
by auto  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1267  | 
hence "m = fmupd x y (fmdrop x m)"  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1268  | 
by (auto intro: fmap_ext)  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1269  | 
|
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1270  | 
show ?case  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1271  | 
apply (subst \<open>m = _\<close>)  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1272  | 
apply (rule assms)  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1273  | 
apply fact  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1274  | 
apply simp  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1275  | 
done  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1276  | 
qed  | 
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
changeset
 | 
1277  | 
|
| 
 
be8d3819c21c
more material on finite maps
 
Lars Hupel <lars.hupel@mytum.de> 
parents: 
66273 
diff
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: 
69593 
diff
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: 
71262 
diff
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: 
67399 
diff
changeset
 | 
1462  | 
end  |