src/HOL/Library/AssocList.thy
changeset 21404 eb85850d3eb7
parent 20503 503ac4c5ef91
child 22740 2d8d0d61475a
equal deleted inserted replaced
21403:dd58f13a8eb4 21404:eb85850d3eb7
    94 (* ******************************************************************************** *)
    94 (* ******************************************************************************** *)
    95 subsection {* @{const delete} *}
    95 subsection {* @{const delete} *}
    96 (* ******************************************************************************** *)
    96 (* ******************************************************************************** *)
    97 
    97 
    98 lemma delete_simps [simp]:
    98 lemma delete_simps [simp]:
    99 "delete k [] = []"
    99     "delete k [] = []"
   100 "delete k (p#ps) = (if fst p = k then delete k ps else p # delete k ps)"
   100     "delete k (p#ps) = (if fst p = k then delete k ps else p # delete k ps)"
   101   by (simp_all add: delete_def)
   101   by (simp_all add: delete_def)
   102 
   102 
   103 lemma delete_id[simp]: "k \<notin> fst ` set al \<Longrightarrow> delete k al = al"
   103 lemma delete_id[simp]: "k \<notin> fst ` set al \<Longrightarrow> delete k al = al"
   104 by(induct al, auto)
   104   by (induct al) auto
   105 
   105 
   106 lemma delete_conv: "map_of (delete k al) k' = ((map_of al)(k := None)) k'"
   106 lemma delete_conv: "map_of (delete k al) k' = ((map_of al)(k := None)) k'"
   107   by (induct al) auto
   107   by (induct al) auto
   108 
   108 
   109 lemma delete_conv': "map_of (delete k al) = ((map_of al)(k := None))"
   109 lemma delete_conv': "map_of (delete k al) = ((map_of al)(k := None))"
   110   by (rule ext) (rule delete_conv)
   110   by (rule ext) (rule delete_conv)
   111 
   111 
   112 lemma delete_idem: "delete k (delete k al) = delete k al"
   112 lemma delete_idem: "delete k (delete k al) = delete k al"
   113   by (induct al) auto
   113   by (induct al) auto
   114 
   114 
   115 lemma map_of_delete[simp]:
   115 lemma map_of_delete [simp]:
   116  "k' \<noteq> k \<Longrightarrow> map_of (delete k al) k' = map_of al k'"
   116     "k' \<noteq> k \<Longrightarrow> map_of (delete k al) k' = map_of al k'"
   117 by(induct al, auto)
   117   by (induct al) auto
   118 
   118 
   119 lemma delete_notin_dom: "k \<notin> fst ` set (delete k al)"
   119 lemma delete_notin_dom: "k \<notin> fst ` set (delete k al)"
   120   by (induct al) auto
   120   by (induct al) auto
   121 
   121 
   122 lemma dom_delete_subset: "fst ` set (delete k al) \<subseteq> fst ` set al"
   122 lemma dom_delete_subset: "fst ` set (delete k al) \<subseteq> fst ` set al"
   545 by (induct xs ys rule: compose_induct) (auto split: option.splits split_if_asm)
   545 by (induct xs ys rule: compose_induct) (auto split: option.splits split_if_asm)
   546 
   546 
   547 
   547 
   548 lemma compose_conv: 
   548 lemma compose_conv: 
   549   shows "map_of (compose xs ys) k = (map_of ys \<circ>\<^sub>m map_of xs) k"
   549   shows "map_of (compose xs ys) k = (map_of ys \<circ>\<^sub>m map_of xs) k"
   550 proof (induct xs ys rule: compose_induct )
   550 proof (induct xs ys rule: compose_induct)
   551   case Nil thus ?case by simp
   551   case Nil thus ?case by simp
   552 next
   552 next
   553   case (Cons x xs)
   553   case (Cons x xs)
   554   show ?case
   554   show ?case
   555   proof (cases "map_of ys (snd x)")
   555   proof (cases "map_of ys (snd x)")
   593   assumes "map_of xs k = Some v" 
   593   assumes "map_of xs k = Some v" 
   594   shows "map_of (compose xs ys) k = map_of ys v"
   594   shows "map_of (compose xs ys) k = map_of ys v"
   595 using prems by (simp add: compose_conv)
   595 using prems by (simp add: compose_conv)
   596 
   596 
   597 lemma dom_compose: "fst ` set (compose xs ys) \<subseteq> fst ` set xs"
   597 lemma dom_compose: "fst ` set (compose xs ys) \<subseteq> fst ` set xs"
   598 proof (induct xs ys rule: compose_induct )
   598 proof (induct xs ys rule: compose_induct)
   599   case Nil thus ?case by simp
   599   case Nil thus ?case by simp
   600 next
   600 next
   601   case (Cons x xs)
   601   case (Cons x xs)
   602   show ?case
   602   show ?case
   603   proof (cases "map_of ys (snd x)")
   603   proof (cases "map_of ys (snd x)")
   797 
   797 
   798 lemma update_restr:
   798 lemma update_restr:
   799  "map_of (update x y (restrict D al)) = map_of (update x y (restrict (D-{x}) al))"
   799  "map_of (update x y (restrict D al)) = map_of (update x y (restrict (D-{x}) al))"
   800   by (simp add: update_conv' restr_conv') (rule fun_upd_restrict)
   800   by (simp add: update_conv' restr_conv') (rule fun_upd_restrict)
   801 
   801 
   802 lemma upate_restr_conv[simp]:
   802 lemma upate_restr_conv [simp]:
   803  "x \<in> D \<Longrightarrow> 
   803  "x \<in> D \<Longrightarrow> 
   804  map_of (update x y (restrict D al)) = map_of (update x y (restrict (D-{x}) al))"
   804  map_of (update x y (restrict D al)) = map_of (update x y (restrict (D-{x}) al))"
   805   by (simp add: update_conv' restr_conv')
   805   by (simp add: update_conv' restr_conv')
   806 
   806 
   807 lemma restr_updates[simp]: "
   807 lemma restr_updates [simp]: "
   808  \<lbrakk> length xs = length ys; set xs \<subseteq> D \<rbrakk>
   808  \<lbrakk> length xs = length ys; set xs \<subseteq> D \<rbrakk>
   809  \<Longrightarrow> map_of (restrict D (updates xs ys al)) = 
   809  \<Longrightarrow> map_of (restrict D (updates xs ys al)) = 
   810      map_of (updates xs ys (restrict (D - set xs) al))"
   810      map_of (updates xs ys (restrict (D - set xs) al))"
   811   by (simp add: updates_conv' restr_conv')
   811   by (simp add: updates_conv' restr_conv')
   812 
   812