110 "RBT_Impl.keys (impl_of t) = keys t" |
110 "RBT_Impl.keys (impl_of t) = keys t" |
111 by (simp add: keys_def) |
111 by (simp add: keys_def) |
112 |
112 |
113 lemma lookup_empty [simp]: |
113 lemma lookup_empty [simp]: |
114 "lookup empty = Map.empty" |
114 "lookup empty = Map.empty" |
115 by (simp add: empty_def lookup_RBT expand_fun_eq) |
115 by (simp add: empty_def lookup_RBT ext_iff) |
116 |
116 |
117 lemma lookup_insert [simp]: |
117 lemma lookup_insert [simp]: |
118 "lookup (insert k v t) = (lookup t)(k \<mapsto> v)" |
118 "lookup (insert k v t) = (lookup t)(k \<mapsto> v)" |
119 by (simp add: insert_def lookup_RBT lookup_insert lookup_impl_of) |
119 by (simp add: insert_def lookup_RBT lookup_insert lookup_impl_of) |
120 |
120 |
142 "lookup (map f t) k = Option.map (f k) (lookup t k)" |
142 "lookup (map f t) k = Option.map (f k) (lookup t k)" |
143 by (simp add: map_def lookup_RBT lookup_map lookup_impl_of) |
143 by (simp add: map_def lookup_RBT lookup_map lookup_impl_of) |
144 |
144 |
145 lemma fold_fold: |
145 lemma fold_fold: |
146 "fold f t = More_List.fold (prod_case f) (entries t)" |
146 "fold f t = More_List.fold (prod_case f) (entries t)" |
147 by (simp add: fold_def expand_fun_eq RBT_Impl.fold_def entries_impl_of) |
147 by (simp add: fold_def ext_iff RBT_Impl.fold_def entries_impl_of) |
148 |
148 |
149 lemma is_empty_empty [simp]: |
149 lemma is_empty_empty [simp]: |
150 "is_empty t \<longleftrightarrow> t = empty" |
150 "is_empty t \<longleftrightarrow> t = empty" |
151 by (simp add: rbt_eq is_empty_def impl_of_empty split: rbt.split) |
151 by (simp add: rbt_eq is_empty_def impl_of_empty split: rbt.split) |
152 |
152 |
153 lemma RBT_lookup_empty [simp]: (*FIXME*) |
153 lemma RBT_lookup_empty [simp]: (*FIXME*) |
154 "RBT_Impl.lookup t = Map.empty \<longleftrightarrow> t = RBT_Impl.Empty" |
154 "RBT_Impl.lookup t = Map.empty \<longleftrightarrow> t = RBT_Impl.Empty" |
155 by (cases t) (auto simp add: expand_fun_eq) |
155 by (cases t) (auto simp add: ext_iff) |
156 |
156 |
157 lemma lookup_empty_empty [simp]: |
157 lemma lookup_empty_empty [simp]: |
158 "lookup t = Map.empty \<longleftrightarrow> t = empty" |
158 "lookup t = Map.empty \<longleftrightarrow> t = empty" |
159 by (cases t) (simp add: empty_def lookup_def RBT_inject RBT_inverse) |
159 by (cases t) (simp add: empty_def lookup_def RBT_inject RBT_inverse) |
160 |
160 |
218 "Mapping.tabulate ks f = Mapping (bulkload (List.map (\<lambda>k. (k, f k)) ks))" |
218 "Mapping.tabulate ks f = Mapping (bulkload (List.map (\<lambda>k. (k, f k)) ks))" |
219 by (rule mapping_eqI) (simp add: map_of_map_restrict) |
219 by (rule mapping_eqI) (simp add: map_of_map_restrict) |
220 |
220 |
221 lemma bulkload_Mapping [code]: |
221 lemma bulkload_Mapping [code]: |
222 "Mapping.bulkload vs = Mapping (bulkload (List.map (\<lambda>n. (n, vs ! n)) [0..<length vs]))" |
222 "Mapping.bulkload vs = Mapping (bulkload (List.map (\<lambda>n. (n, vs ! n)) [0..<length vs]))" |
223 by (rule mapping_eqI) (simp add: map_of_map_restrict expand_fun_eq) |
223 by (rule mapping_eqI) (simp add: map_of_map_restrict ext_iff) |
224 |
224 |
225 lemma equal_Mapping [code]: |
225 lemma equal_Mapping [code]: |
226 "HOL.equal (Mapping t1) (Mapping t2) \<longleftrightarrow> entries t1 = entries t2" |
226 "HOL.equal (Mapping t1) (Mapping t2) \<longleftrightarrow> entries t1 = entries t2" |
227 by (simp add: equal Mapping_def entries_lookup) |
227 by (simp add: equal Mapping_def entries_lookup) |
228 |
228 |