4 header {* Relating (finite) sets and lists *} |
4 header {* Relating (finite) sets and lists *} |
5 |
5 |
6 theory More_Set |
6 theory More_Set |
7 imports List |
7 imports List |
8 begin |
8 begin |
9 |
|
10 subsection {* Basic set operations *} |
|
11 |
|
12 lemma is_empty_set [code]: |
|
13 "Set.is_empty (set xs) \<longleftrightarrow> List.null xs" |
|
14 by (simp add: Set.is_empty_def null_def) |
|
15 |
|
16 lemma empty_set [code]: |
|
17 "{} = set []" |
|
18 by simp |
|
19 |
|
20 |
|
21 subsection {* Functorial set operations *} |
|
22 |
|
23 lemma union_set_fold: |
|
24 "set xs \<union> A = fold Set.insert xs A" |
|
25 proof - |
|
26 interpret comp_fun_idem Set.insert |
|
27 by (fact comp_fun_idem_insert) |
|
28 show ?thesis by (simp add: union_fold_insert fold_set_fold) |
|
29 qed |
|
30 |
|
31 lemma union_set_foldr: |
|
32 "set xs \<union> A = foldr Set.insert xs A" |
|
33 proof - |
|
34 have "\<And>x y :: 'a. insert y \<circ> insert x = insert x \<circ> insert y" |
|
35 by auto |
|
36 then show ?thesis by (simp add: union_set_fold foldr_fold) |
|
37 qed |
|
38 |
|
39 lemma minus_set_fold: |
|
40 "A - set xs = fold Set.remove xs A" |
|
41 proof - |
|
42 interpret comp_fun_idem Set.remove |
|
43 by (fact comp_fun_idem_remove) |
|
44 show ?thesis |
|
45 by (simp add: minus_fold_remove [of _ A] fold_set_fold) |
|
46 qed |
|
47 |
|
48 lemma minus_set_foldr: |
|
49 "A - set xs = foldr Set.remove xs A" |
|
50 proof - |
|
51 have "\<And>x y :: 'a. Set.remove y \<circ> Set.remove x = Set.remove x \<circ> Set.remove y" |
|
52 by (auto simp add: remove_def) |
|
53 then show ?thesis by (simp add: minus_set_fold foldr_fold) |
|
54 qed |
|
55 |
|
56 |
|
57 subsection {* Basic operations *} |
|
58 |
|
59 lemma [code]: |
|
60 "x \<in> set xs \<longleftrightarrow> List.member xs x" |
|
61 "x \<in> List.coset xs \<longleftrightarrow> \<not> List.member xs x" |
|
62 by (simp_all add: member_def) |
|
63 |
|
64 lemma UNIV_coset [code]: |
|
65 "UNIV = List.coset []" |
|
66 by simp |
|
67 |
|
68 lemma insert_code [code]: |
|
69 "insert x (set xs) = set (List.insert x xs)" |
|
70 "insert x (List.coset xs) = List.coset (removeAll x xs)" |
|
71 by simp_all |
|
72 |
|
73 lemma remove_code [code]: |
|
74 "Set.remove x (set xs) = set (removeAll x xs)" |
|
75 "Set.remove x (List.coset xs) = List.coset (List.insert x xs)" |
|
76 by (simp_all add: remove_def Compl_insert) |
|
77 |
|
78 lemma Ball_set [code]: |
|
79 "Ball (set xs) P \<longleftrightarrow> list_all P xs" |
|
80 by (simp add: list_all_iff) |
|
81 |
|
82 lemma Bex_set [code]: |
|
83 "Bex (set xs) P \<longleftrightarrow> list_ex P xs" |
|
84 by (simp add: list_ex_iff) |
|
85 |
|
86 lemma card_set [code]: |
|
87 "card (set xs) = length (remdups xs)" |
|
88 proof - |
|
89 have "card (set (remdups xs)) = length (remdups xs)" |
|
90 by (rule distinct_card) simp |
|
91 then show ?thesis by simp |
|
92 qed |
|
93 |
|
94 |
9 |
95 subsection {* Functorial operations *} |
10 subsection {* Functorial operations *} |
96 |
11 |
97 lemma inter_code [code]: |
12 lemma inter_code [code]: |
98 "A \<inter> set xs = set (List.filter (\<lambda>x. x \<in> A) xs)" |
13 "A \<inter> set xs = set (List.filter (\<lambda>x. x \<in> A) xs)" |
150 |
65 |
151 lemma pred_of_set_set_foldr_sup [code]: |
66 lemma pred_of_set_set_foldr_sup [code]: |
152 "pred_of_set (set xs) = foldr sup (map Predicate.single xs) bot" |
67 "pred_of_set (set xs) = foldr sup (map Predicate.single xs) bot" |
153 by (simp add: pred_of_set_set_fold_sup ac_simps foldr_fold fun_eq_iff) |
68 by (simp add: pred_of_set_set_fold_sup ac_simps foldr_fold fun_eq_iff) |
154 |
69 |
155 |
|
156 subsection {* Operations on relations *} |
|
157 |
|
158 lemma product_code [code]: |
|
159 "Product_Type.product (set xs) (set ys) = set [(x, y). x \<leftarrow> xs, y \<leftarrow> ys]" |
|
160 by (auto simp add: Product_Type.product_def) |
|
161 |
|
162 lemma Id_on_set [code]: |
|
163 "Id_on (set xs) = set [(x, x). x \<leftarrow> xs]" |
|
164 by (auto simp add: Id_on_def) |
|
165 |
|
166 lemma trancl_set_ntrancl [code]: |
|
167 "trancl (set xs) = ntrancl (card (set xs) - 1) (set xs)" |
|
168 by (simp add: finite_trancl_ntranl) |
|
169 |
|
170 lemma set_rel_comp [code]: |
|
171 "set xys O set yzs = set ([(fst xy, snd yz). xy \<leftarrow> xys, yz \<leftarrow> yzs, snd xy = fst yz])" |
|
172 by (auto simp add: Bex_def) |
|
173 |
|
174 lemma wf_set [code]: |
|
175 "wf (set xs) = acyclic (set xs)" |
|
176 by (simp add: wf_iff_acyclic_if_finite) |
|
177 |
|
178 end |
70 end |
179 |
71 |