49 code_datatype Set Coset |
49 code_datatype Set Coset |
50 |
50 |
51 lemma member_code [code]: |
51 lemma member_code [code]: |
52 "member (Set xs) = List.member xs" |
52 "member (Set xs) = List.member xs" |
53 "member (Coset xs) = Not \<circ> List.member xs" |
53 "member (Coset xs) = Not \<circ> List.member xs" |
54 by (simp_all add: ext_iff member_def fun_Compl_def bool_Compl_def) |
54 by (simp_all add: fun_eq_iff member_def fun_Compl_def bool_Compl_def) |
55 |
55 |
56 lemma member_image_UNIV [simp]: |
56 lemma member_image_UNIV [simp]: |
57 "member ` UNIV = UNIV" |
57 "member ` UNIV = UNIV" |
58 proof - |
58 proof - |
59 have "\<And>A \<Colon> 'a set. \<exists>B \<Colon> 'a fset. A = member B" |
59 have "\<And>A \<Colon> 'a set. \<exists>B \<Colon> 'a fset. A = member B" |
250 "inf A (Coset xs) = foldr remove xs A" |
250 "inf A (Coset xs) = foldr remove xs A" |
251 proof - |
251 proof - |
252 show "inf A (Set xs) = Set (List.filter (member A) xs)" |
252 show "inf A (Set xs) = Set (List.filter (member A) xs)" |
253 by (simp add: inter project_def Set_def) |
253 by (simp add: inter project_def Set_def) |
254 have *: "\<And>x::'a. remove = (\<lambda>x. Fset \<circ> More_Set.remove x \<circ> member)" |
254 have *: "\<And>x::'a. remove = (\<lambda>x. Fset \<circ> More_Set.remove x \<circ> member)" |
255 by (simp add: ext_iff) |
255 by (simp add: fun_eq_iff) |
256 have "member \<circ> fold (\<lambda>x. Fset \<circ> More_Set.remove x \<circ> member) xs = |
256 have "member \<circ> fold (\<lambda>x. Fset \<circ> More_Set.remove x \<circ> member) xs = |
257 fold More_Set.remove xs \<circ> member" |
257 fold More_Set.remove xs \<circ> member" |
258 by (rule fold_apply) (simp add: ext_iff) |
258 by (rule fold_apply) (simp add: fun_eq_iff) |
259 then have "fold More_Set.remove xs (member A) = |
259 then have "fold More_Set.remove xs (member A) = |
260 member (fold (\<lambda>x. Fset \<circ> More_Set.remove x \<circ> member) xs A)" |
260 member (fold (\<lambda>x. Fset \<circ> More_Set.remove x \<circ> member) xs A)" |
261 by (simp add: ext_iff) |
261 by (simp add: fun_eq_iff) |
262 then have "inf A (Coset xs) = fold remove xs A" |
262 then have "inf A (Coset xs) = fold remove xs A" |
263 by (simp add: Diff_eq [symmetric] minus_set *) |
263 by (simp add: Diff_eq [symmetric] minus_set *) |
264 moreover have "\<And>x y :: 'a. Fset.remove y \<circ> Fset.remove x = Fset.remove x \<circ> Fset.remove y" |
264 moreover have "\<And>x y :: 'a. Fset.remove y \<circ> Fset.remove x = Fset.remove x \<circ> Fset.remove y" |
265 by (auto simp add: More_Set.remove_def * intro: ext) |
265 by (auto simp add: More_Set.remove_def * intro: ext) |
266 ultimately show "inf A (Coset xs) = foldr remove xs A" |
266 ultimately show "inf A (Coset xs) = foldr remove xs A" |
275 lemma union_insert [code]: |
275 lemma union_insert [code]: |
276 "sup (Set xs) A = foldr insert xs A" |
276 "sup (Set xs) A = foldr insert xs A" |
277 "sup (Coset xs) A = Coset (List.filter (Not \<circ> member A) xs)" |
277 "sup (Coset xs) A = Coset (List.filter (Not \<circ> member A) xs)" |
278 proof - |
278 proof - |
279 have *: "\<And>x::'a. insert = (\<lambda>x. Fset \<circ> Set.insert x \<circ> member)" |
279 have *: "\<And>x::'a. insert = (\<lambda>x. Fset \<circ> Set.insert x \<circ> member)" |
280 by (simp add: ext_iff) |
280 by (simp add: fun_eq_iff) |
281 have "member \<circ> fold (\<lambda>x. Fset \<circ> Set.insert x \<circ> member) xs = |
281 have "member \<circ> fold (\<lambda>x. Fset \<circ> Set.insert x \<circ> member) xs = |
282 fold Set.insert xs \<circ> member" |
282 fold Set.insert xs \<circ> member" |
283 by (rule fold_apply) (simp add: ext_iff) |
283 by (rule fold_apply) (simp add: fun_eq_iff) |
284 then have "fold Set.insert xs (member A) = |
284 then have "fold Set.insert xs (member A) = |
285 member (fold (\<lambda>x. Fset \<circ> Set.insert x \<circ> member) xs A)" |
285 member (fold (\<lambda>x. Fset \<circ> Set.insert x \<circ> member) xs A)" |
286 by (simp add: ext_iff) |
286 by (simp add: fun_eq_iff) |
287 then have "sup (Set xs) A = fold insert xs A" |
287 then have "sup (Set xs) A = fold insert xs A" |
288 by (simp add: union_set *) |
288 by (simp add: union_set *) |
289 moreover have "\<And>x y :: 'a. Fset.insert y \<circ> Fset.insert x = Fset.insert x \<circ> Fset.insert y" |
289 moreover have "\<And>x y :: 'a. Fset.insert y \<circ> Fset.insert x = Fset.insert x \<circ> Fset.insert y" |
290 by (auto simp add: * intro: ext) |
290 by (auto simp add: * intro: ext) |
291 ultimately show "sup (Set xs) A = foldr insert xs A" |
291 ultimately show "sup (Set xs) A = foldr insert xs A" |