252 by transfer' (auto simp: map_upd_def) |
252 by transfer' (auto simp: map_upd_def) |
253 |
253 |
254 lemma fmdom_fmupd[simp]: "fmdom (fmupd a b m) = finsert a (fmdom m)" by transfer (simp add: map_upd_def) |
254 lemma fmdom_fmupd[simp]: "fmdom (fmupd a b m) = finsert a (fmdom m)" by transfer (simp add: map_upd_def) |
255 lemma fmdom'_fmupd[simp]: "fmdom' (fmupd a b m) = insert a (fmdom' m)" by transfer (simp add: map_upd_def) |
255 lemma fmdom'_fmupd[simp]: "fmdom' (fmupd a b m) = insert a (fmdom' m)" by transfer (simp add: map_upd_def) |
256 |
256 |
|
257 lemma fmupd_reorder_neq: |
|
258 assumes "a \<noteq> b" |
|
259 shows "fmupd a x (fmupd b y m) = fmupd b y (fmupd a x m)" |
|
260 using assms |
|
261 by transfer' (auto simp: map_upd_def) |
|
262 |
|
263 lemma fmupd_idem[simp]: "fmupd a x (fmupd a y m) = fmupd a x m" |
|
264 by transfer' (auto simp: map_upd_def) |
|
265 |
257 lift_definition fmfilter :: "('a \<Rightarrow> bool) \<Rightarrow> ('a, 'b) fmap \<Rightarrow> ('a, 'b) fmap" |
266 lift_definition fmfilter :: "('a \<Rightarrow> bool) \<Rightarrow> ('a, 'b) fmap \<Rightarrow> ('a, 'b) fmap" |
258 is map_filter |
267 is map_filter |
259 parametric map_filter_transfer |
268 parametric map_filter_transfer |
260 by auto |
269 by auto |
261 |
270 |
355 lemma fmdom'_drop_set[simp]: "fmdom' (fmdrop_set A m) = fmdom' m - A" unfolding fmfilter_alt_defs by auto |
364 lemma fmdom'_drop_set[simp]: "fmdom' (fmdrop_set A m) = fmdom' m - A" unfolding fmfilter_alt_defs by auto |
356 lemma fmdom_drop_fset[simp]: "fmdom (fmdrop_fset A m) = fmdom m - A" unfolding fmfilter_alt_defs by auto |
365 lemma fmdom_drop_fset[simp]: "fmdom (fmdrop_fset A m) = fmdom m - A" unfolding fmfilter_alt_defs by auto |
357 lemma fmdom'_restrict_set: "fmdom' (fmrestrict_set A m) \<subseteq> A" unfolding fmfilter_alt_defs by auto |
366 lemma fmdom'_restrict_set: "fmdom' (fmrestrict_set A m) \<subseteq> A" unfolding fmfilter_alt_defs by auto |
358 lemma fmdom_restrict_fset: "fmdom (fmrestrict_fset A m) |\<subseteq>| A" unfolding fmfilter_alt_defs by auto |
367 lemma fmdom_restrict_fset: "fmdom (fmrestrict_fset A m) |\<subseteq>| A" unfolding fmfilter_alt_defs by auto |
359 |
368 |
|
369 lemma fmdrop_fmupd: "fmdrop x (fmupd y z m) = (if x = y then fmdrop x m else fmupd y z (fmdrop x m))" |
|
370 by transfer' (auto simp: map_drop_def map_filter_def map_upd_def) |
|
371 |
|
372 lemma fmdrop_idle: "x |\<notin>| fmdom B \<Longrightarrow> fmdrop x B = B" |
|
373 by transfer' (auto simp: map_drop_def map_filter_def) |
|
374 |
|
375 lemma fmdrop_idle': "x \<notin> fmdom' B \<Longrightarrow> fmdrop x B = B" |
|
376 by transfer' (auto simp: map_drop_def map_filter_def) |
|
377 |
|
378 lemma fmdrop_fmupd_same: "fmdrop x (fmupd x y m) = fmdrop x m" |
|
379 by transfer' (auto simp: map_drop_def map_filter_def map_upd_def) |
|
380 |
360 lemma fmdom'_restrict_set_precise: "fmdom' (fmrestrict_set A m) = fmdom' m \<inter> A" |
381 lemma fmdom'_restrict_set_precise: "fmdom' (fmrestrict_set A m) = fmdom' m \<inter> A" |
361 unfolding fmfilter_alt_defs by auto |
382 unfolding fmfilter_alt_defs by auto |
362 |
383 |
363 lemma fmdom'_restrict_fset_precise: "fmdom (fmrestrict_fset A m) = fmdom m |\<inter>| A" |
384 lemma fmdom'_restrict_fset_precise: "fmdom (fmrestrict_fset A m) = fmdom m |\<inter>| A" |
364 unfolding fmfilter_alt_defs by auto |
385 unfolding fmfilter_alt_defs by auto |
401 lemma fmdrop_set_empty[simp]: "fmdrop_set A fmempty = fmempty" |
422 lemma fmdrop_set_empty[simp]: "fmdrop_set A fmempty = fmempty" |
402 unfolding fmfilter_alt_defs by simp |
423 unfolding fmfilter_alt_defs by simp |
403 |
424 |
404 lemma fmdrop_fset_empty[simp]: "fmdrop_fset A fmempty = fmempty" |
425 lemma fmdrop_fset_empty[simp]: "fmdrop_fset A fmempty = fmempty" |
405 unfolding fmfilter_alt_defs by simp |
426 unfolding fmfilter_alt_defs by simp |
|
427 |
|
428 lemma fmdrop_fset_fmdom[simp]: "fmdrop_fset (fmdom A) A = fmempty" |
|
429 by transfer' (auto simp: map_drop_set_def map_filter_def) |
|
430 |
|
431 lemma fmdrop_set_fmdom[simp]: "fmdrop_set (fmdom' A) A = fmempty" |
|
432 by transfer' (auto simp: map_drop_set_def map_filter_def) |
406 |
433 |
407 lemma fmrestrict_set_empty[simp]: "fmrestrict_set A fmempty = fmempty" |
434 lemma fmrestrict_set_empty[simp]: "fmrestrict_set A fmempty = fmempty" |
408 unfolding fmfilter_alt_defs by simp |
435 unfolding fmfilter_alt_defs by simp |
409 |
436 |
410 lemma fmrestrict_fset_empty[simp]: "fmrestrict_fset A fmempty = fmempty" |
437 lemma fmrestrict_fset_empty[simp]: "fmrestrict_fset A fmempty = fmempty" |
1026 |
1053 |
1027 lemma fmmap_fset_of_fmap: "fset_of_fmap (fmmap f m) = (\<lambda>(k, v). (k, f v)) |`| fset_of_fmap m" |
1054 lemma fmmap_fset_of_fmap: "fset_of_fmap (fmmap f m) = (\<lambda>(k, v). (k, f v)) |`| fset_of_fmap m" |
1028 including fset.lifting |
1055 including fset.lifting |
1029 by transfer' (auto simp: set_of_map_def) |
1056 by transfer' (auto simp: set_of_map_def) |
1030 |
1057 |
|
1058 lemma fmmap_fmupd: "fmmap f (fmupd x y m) = fmupd x (f y) (fmmap f m)" |
|
1059 by transfer' (auto simp: fun_eq_iff map_upd_def) |
1031 |
1060 |
1032 subsection \<open>\<^const>\<open>size\<close> setup\<close> |
1061 subsection \<open>\<^const>\<open>size\<close> setup\<close> |
1033 |
1062 |
1034 definition size_fmap :: "('a \<Rightarrow> nat) \<Rightarrow> ('b \<Rightarrow> nat) \<Rightarrow> ('a, 'b) fmap \<Rightarrow> nat" where |
1063 definition size_fmap :: "('a \<Rightarrow> nat) \<Rightarrow> ('b \<Rightarrow> nat) \<Rightarrow> ('a, 'b) fmap \<Rightarrow> nat" where |
1035 [simp]: "size_fmap f g m = size_fset (\<lambda>(a, b). f a + g b) (fset_of_fmap m)" |
1064 [simp]: "size_fmap f g m = size_fset (\<lambda>(a, b). f a + g b) (fset_of_fmap m)" |