src/HOL/Library/Finite_Map.thy
changeset 70277 ac24aaf84a36
parent 69700 7a92cbec7030
child 71262 a30278c8585f
equal deleted inserted replaced
70276:910dc065b869 70277:ac24aaf84a36
   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)"