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 |