88 qed |
88 qed |
89 |
89 |
90 lemma Quotient_fset_list: |
90 lemma Quotient_fset_list: |
91 shows "Quotient (list_all2 op \<approx>) (map abs_fset) (map rep_fset)" |
91 shows "Quotient (list_all2 op \<approx>) (map abs_fset) (map rep_fset)" |
92 by (fact list_quotient[OF Quotient_fset]) |
92 by (fact list_quotient[OF Quotient_fset]) |
93 |
|
94 (* |
|
95 lemma set_in_eq: "(\<forall>e. ((e \<in> xs) \<longleftrightarrow> (e \<in> ys))) \<equiv> xs = ys" |
|
96 by (rule eq_reflection) auto |
|
97 *) |
|
98 |
93 |
99 lemma map_rel_cong: "b \<approx> ba \<Longrightarrow> map f b \<approx> map f ba" |
94 lemma map_rel_cong: "b \<approx> ba \<Longrightarrow> map f b \<approx> map f ba" |
100 unfolding list_eq.simps |
95 unfolding list_eq.simps |
101 by (simp only: set_map) |
96 by (simp only: set_map) |
102 |
97 |
153 then show "(list_all2 op \<approx> OOO op \<approx>) r s" |
148 then show "(list_all2 op \<approx> OOO op \<approx>) r s" |
154 using a c pred_compI by simp |
149 using a c pred_compI by simp |
155 qed |
150 qed |
156 qed |
151 qed |
157 |
152 |
|
153 |
|
154 lemma set_finter_raw[simp]: |
|
155 "set (finter_raw xs ys) = set xs \<inter> set ys" |
|
156 by (induct xs) (auto simp add: memb_def) |
|
157 |
|
158 lemma set_fminus_raw[simp]: |
|
159 "set (fminus_raw xs ys) = (set xs - set ys)" |
|
160 by (induct ys arbitrary: xs) (auto) |
|
161 |
|
162 |
158 text {* Respectfullness *} |
163 text {* Respectfullness *} |
159 |
164 |
160 lemma append_rsp[quot_respect]: |
165 lemma append_rsp[quot_respect]: |
161 shows "(op \<approx> ===> op \<approx> ===> op \<approx>) append append" |
166 shows "(op \<approx> ===> op \<approx> ===> op \<approx>) append append" |
162 by (simp) |
167 by (simp) |
163 |
168 |
164 (* |
169 lemma sub_list_rsp[quot_respect]: |
165 lemma append_rsp_unfolded: |
|
166 "\<lbrakk>x \<approx> y; v \<approx> w\<rbrakk> \<Longrightarrow> x @ v \<approx> y @ w" |
|
167 by auto |
|
168 *) |
|
169 |
|
170 lemma [quot_respect]: |
|
171 shows "(op \<approx> ===> op \<approx> ===> op =) sub_list sub_list" |
170 shows "(op \<approx> ===> op \<approx> ===> op =) sub_list sub_list" |
172 by (auto simp add: sub_list_def) |
171 by (auto simp add: sub_list_def) |
173 |
172 |
174 lemma memb_rsp[quot_respect]: |
173 lemma memb_rsp[quot_respect]: |
175 shows "(op = ===> op \<approx> ===> op =) memb memb" |
174 shows "(op = ===> op \<approx> ===> op =) memb memb" |
176 by (auto simp add: memb_def) |
175 by (auto simp add: memb_def) |
177 |
176 |
178 lemma nil_rsp[quot_respect]: |
177 lemma nil_rsp[quot_respect]: |
179 shows "[] \<approx> []" |
178 shows "(op \<approx>) Nil Nil" |
180 by simp |
179 by simp |
181 |
180 |
182 lemma cons_rsp[quot_respect]: |
181 lemma cons_rsp[quot_respect]: |
183 shows "(op = ===> op \<approx> ===> op \<approx>) Cons Cons" |
182 shows "(op = ===> op \<approx> ===> op \<approx>) Cons Cons" |
184 by simp |
183 by simp |
193 |
192 |
194 lemma list_equiv_rsp[quot_respect]: |
193 lemma list_equiv_rsp[quot_respect]: |
195 shows "(op \<approx> ===> op \<approx> ===> op =) op \<approx> op \<approx>" |
194 shows "(op \<approx> ===> op \<approx> ===> op =) op \<approx> op \<approx>" |
196 by auto |
195 by auto |
197 |
196 |
|
197 lemma finter_raw_rsp[quot_respect]: |
|
198 shows "(op \<approx> ===> op \<approx> ===> op \<approx>) finter_raw finter_raw" |
|
199 by simp |
|
200 |
|
201 lemma removeAll_rsp[quot_respect]: |
|
202 shows "(op = ===> op \<approx> ===> op \<approx>) removeAll removeAll" |
|
203 by simp |
|
204 |
|
205 lemma fminus_raw_rsp[quot_respect]: |
|
206 shows "(op \<approx> ===> op \<approx> ===> op \<approx>) fminus_raw fminus_raw" |
|
207 by simp |
|
208 |
|
209 lemma fcard_raw_rsp[quot_respect]: |
|
210 shows "(op \<approx> ===> op =) fcard_raw fcard_raw" |
|
211 by (simp add: fcard_raw_def) |
|
212 |
|
213 |
|
214 |
198 lemma not_memb_nil: |
215 lemma not_memb_nil: |
199 shows "\<not> memb x []" |
216 shows "\<not> memb x []" |
200 by (simp add: memb_def) |
217 by (simp add: memb_def) |
201 |
218 |
202 lemma memb_cons_iff: |
219 lemma memb_cons_iff: |
203 shows "memb x (y # xs) = (x = y \<or> memb x xs)" |
220 shows "memb x (y # xs) = (x = y \<or> memb x xs)" |
204 by (induct xs) (auto simp add: memb_def) |
221 by (induct xs) (auto simp add: memb_def) |
205 |
222 |
206 lemma set_finter_raw[simp]: |
|
207 "set (finter_raw xs ys) = set xs \<inter> set ys" |
|
208 by (induct xs) (auto simp add: memb_def) |
|
209 |
|
210 lemma [quot_respect]: |
|
211 shows "(op \<approx> ===> op \<approx> ===> op \<approx>) finter_raw finter_raw" |
|
212 by (simp) |
|
213 |
|
214 (* |
|
215 lemma memb_removeAll: |
|
216 "memb x (removeAll y xs) \<longleftrightarrow> memb x xs \<and> x \<noteq> y" |
|
217 by (induct xs arbitrary: x y) (auto simp add: memb_def) |
|
218 *) |
|
219 |
|
220 lemma [quot_respect]: |
|
221 shows "(op = ===> op \<approx> ===> op \<approx>) removeAll removeAll" |
|
222 by (simp) |
|
223 |
|
224 lemma set_fminus_raw[simp]: |
|
225 "set (fminus_raw xs ys) = (set xs - set ys)" |
|
226 by (induct ys arbitrary: xs) (auto) |
|
227 |
|
228 lemma [quot_respect]: |
|
229 shows "(op \<approx> ===> op \<approx> ===> op \<approx>) fminus_raw fminus_raw" |
|
230 by simp |
|
231 |
|
232 lemma fcard_raw_rsp[quot_respect]: |
|
233 shows "(op \<approx> ===> op =) fcard_raw fcard_raw" |
|
234 by (simp add: fcard_raw_def) |
|
235 |
|
236 lemma memb_absorb: |
223 lemma memb_absorb: |
237 shows "memb x xs \<Longrightarrow> x # xs \<approx> xs" |
224 shows "memb x xs \<Longrightarrow> x # xs \<approx> xs" |
238 by (induct xs) (auto simp add: memb_def) |
225 by (induct xs) (auto simp add: memb_def) |
239 |
226 |
240 lemma none_memb_nil: |
227 lemma none_memb_nil: |
241 "(\<forall>x. \<not> memb x xs) = (xs \<approx> [])" |
228 "(\<forall>x. \<not> memb x xs) = (xs \<approx> [])" |
242 by (simp add: memb_def) |
229 by (simp add: memb_def) |
243 |
230 |
244 lemma not_memb_removeAll_ident: |
|
245 shows "\<not> memb x xs \<Longrightarrow> removeAll x xs = xs" |
|
246 by (induct xs) (auto simp add: memb_def) |
|
247 |
231 |
248 lemma memb_commute_ffold_raw: |
232 lemma memb_commute_ffold_raw: |
249 "rsp_fold f \<Longrightarrow> h \<in> set b \<Longrightarrow> ffold_raw f z b = f h (ffold_raw f z (removeAll h b))" |
233 "rsp_fold f \<Longrightarrow> h \<in> set b \<Longrightarrow> ffold_raw f z b = f h (ffold_raw f z (removeAll h b))" |
250 apply (induct b) |
234 apply (induct b) |
251 apply (auto simp add: rsp_fold_def) |
235 apply (auto simp add: rsp_fold_def) |
788 apply (simp_all) |
769 apply (simp_all) |
789 apply (case_tac "memb a A") |
770 apply (case_tac "memb a A") |
790 apply (auto simp add: memb_def)[2] |
771 apply (auto simp add: memb_def)[2] |
791 apply (metis list_eq2.intros(3) list_eq2.intros(4) list_eq2.intros(5) list_eq2.intros(6)) |
772 apply (metis list_eq2.intros(3) list_eq2.intros(4) list_eq2.intros(5) list_eq2.intros(6)) |
792 apply (metis list_eq2.intros(1) list_eq2.intros(5) list_eq2.intros(6)) |
773 apply (metis list_eq2.intros(1) list_eq2.intros(5) list_eq2.intros(6)) |
793 apply (auto simp add: list_eq2_refl not_memb_removeAll_ident) |
774 apply (auto simp add: list_eq2_refl memb_def) |
794 done |
775 done |
795 |
776 |
796 lemma memb_delete_list_eq2: |
777 lemma memb_delete_list_eq2: |
797 assumes a: "memb e r" |
778 assumes a: "memb e r" |
798 shows "list_eq2 (e # removeAll e r) r" |
779 shows "list_eq2 (e # removeAll e r) r" |
799 using a cons_delete_list_eq2[of e r] |
780 using a cons_delete_list_eq2[of e r] |
800 by simp |
781 by simp |
801 |
|
802 lemma removeAll_rsp: |
|
803 "xs \<approx> ys \<Longrightarrow> removeAll x xs \<approx> removeAll x ys" |
|
804 by (simp add: memb_def[symmetric]) |
|
805 |
782 |
806 lemma list_eq2_equiv: |
783 lemma list_eq2_equiv: |
807 "(l \<approx> r) \<longleftrightarrow> (list_eq2 l r)" |
784 "(l \<approx> r) \<longleftrightarrow> (list_eq2 l r)" |
808 proof |
785 proof |
809 show "list_eq2 l r \<Longrightarrow> l \<approx> r" by (induct rule: list_eq2.induct) auto |
786 show "list_eq2 l r \<Longrightarrow> l \<approx> r" by (induct rule: list_eq2.induct) auto |
831 done |
808 done |
832 then obtain a where e: "memb a l" by auto |
809 then obtain a where e: "memb a l" by auto |
833 then have e': "memb a r" using list_eq.simps[simplified memb_def[symmetric], of l r] b |
810 then have e': "memb a r" using list_eq.simps[simplified memb_def[symmetric], of l r] b |
834 unfolding memb_def by auto |
811 unfolding memb_def by auto |
835 have f: "fcard_raw (removeAll a l) = m" using fcard_raw_delete[of a l] e d by simp |
812 have f: "fcard_raw (removeAll a l) = m" using fcard_raw_delete[of a l] e d by simp |
836 have g: "removeAll a l \<approx> removeAll a r" using removeAll_rsp[OF b] by simp |
813 have g: "removeAll a l \<approx> removeAll a r" using removeAll_rsp b by simp |
837 have "list_eq2 (removeAll a l) (removeAll a r)" by (rule Suc.hyps[OF f g]) |
814 have "list_eq2 (removeAll a l) (removeAll a r)" by (rule Suc.hyps[OF f g]) |
838 then have h: "list_eq2 (a # removeAll a l) (a # removeAll a r)" by (rule list_eq2.intros(5)) |
815 then have h: "list_eq2 (a # removeAll a l) (a # removeAll a r)" by (rule list_eq2.intros(5)) |
839 have i: "list_eq2 l (a # removeAll a l)" |
816 have i: "list_eq2 l (a # removeAll a l)" |
840 by (rule list_eq2.intros(3)[OF memb_delete_list_eq2[OF e]]) |
817 by (rule list_eq2.intros(3)[OF memb_delete_list_eq2[OF e]]) |
841 have "list_eq2 l (a # removeAll a r)" by (rule list_eq2.intros(6)[OF i h]) |
818 have "list_eq2 l (a # removeAll a r)" by (rule list_eq2.intros(6)[OF i h]) |
1121 |
1098 |
1122 lemma fin_fdelete: |
1099 lemma fin_fdelete: |
1123 shows "x |\<in>| fdelete y S \<longleftrightarrow> x |\<in>| S \<and> x \<noteq> y" |
1100 shows "x |\<in>| fdelete y S \<longleftrightarrow> x |\<in>| S \<and> x \<noteq> y" |
1124 by (descending) (simp add: memb_def) |
1101 by (descending) (simp add: memb_def) |
1125 |
1102 |
1126 lemma fin_fdelete_ident: |
1103 lemma fnotin_fdelete: |
1127 shows "x |\<notin>| fdelete x S" |
1104 shows "x |\<notin>| fdelete x S" |
1128 by (lifting memb_removeAll_ident) |
1105 by (descending) (simp add: memb_def) |
1129 |
1106 |
1130 lemma not_memb_fdelete_ident: |
1107 lemma fnotin_fdelete_ident: |
1131 shows "x |\<notin>| S \<Longrightarrow> fdelete x S = S" |
1108 shows "x |\<notin>| S \<Longrightarrow> fdelete x S = S" |
1132 by (lifting not_memb_removeAll_ident) |
1109 by (descending) (simp add: memb_def) |
1133 |
1110 |
1134 lemma fset_fdelete_cases: |
1111 lemma fset_fdelete_cases: |
1135 shows "S = {||} \<or> (\<exists>x. x |\<in>| S \<and> S = finsert x (fdelete x S))" |
1112 shows "S = {||} \<or> (\<exists>x. x |\<in>| S \<and> S = finsert x (fdelete x S))" |
1136 by (lifting fset_raw_removeAll_cases) |
1113 by (lifting fset_raw_removeAll_cases) |
1137 |
1114 |