27 by (simp add: project_def) |
27 by (simp add: project_def) |
28 |
28 |
29 |
29 |
30 subsection {* Basic set operations *} |
30 subsection {* Basic set operations *} |
31 |
31 |
32 lemma is_empty_set: |
32 lemma is_empty_set [code]: |
33 "Set.is_empty (set xs) \<longleftrightarrow> List.null xs" |
33 "Set.is_empty (set xs) \<longleftrightarrow> List.null xs" |
34 by (simp add: Set.is_empty_def null_def) |
34 by (simp add: Set.is_empty_def null_def) |
35 |
35 |
36 lemma empty_set: |
36 lemma empty_set [code]: |
37 "{} = set []" |
37 "{} = set []" |
38 by simp |
38 by simp |
39 |
39 |
40 lemma insert_set_compl: |
40 lemma insert_set_compl: |
41 "insert x (- set xs) = - set (removeAll x xs)" |
41 "insert x (- set xs) = - set (removeAll x xs)" |
90 qed |
90 qed |
91 |
91 |
92 |
92 |
93 subsection {* Derived set operations *} |
93 subsection {* Derived set operations *} |
94 |
94 |
95 lemma member: |
95 lemma member [code]: |
96 "a \<in> A \<longleftrightarrow> (\<exists>x\<in>A. a = x)" |
96 "a \<in> A \<longleftrightarrow> (\<exists>x\<in>A. a = x)" |
97 by simp |
97 by simp |
98 |
98 |
99 lemma subset_eq: |
99 lemma subset [code]: |
100 "A \<subseteq> B \<longleftrightarrow> (\<forall>x\<in>A. x \<in> B)" |
|
101 by (fact subset_eq) |
|
102 |
|
103 lemma subset: |
|
104 "A \<subset> B \<longleftrightarrow> A \<subseteq> B \<and> \<not> B \<subseteq> A" |
100 "A \<subset> B \<longleftrightarrow> A \<subseteq> B \<and> \<not> B \<subseteq> A" |
105 by (fact less_le_not_le) |
101 by (fact less_le_not_le) |
106 |
102 |
107 lemma set_eq: |
103 lemma set_eq [code]: |
108 "A = B \<longleftrightarrow> A \<subseteq> B \<and> B \<subseteq> A" |
104 "A = B \<longleftrightarrow> A \<subseteq> B \<and> B \<subseteq> A" |
109 by (fact eq_iff) |
105 by (fact eq_iff) |
110 |
106 |
111 lemma inter: |
107 lemma inter [code]: |
112 "A \<inter> B = Set.project (\<lambda>x. x \<in> A) B" |
108 "A \<inter> B = Set.project (\<lambda>x. x \<in> A) B" |
113 by (auto simp add: project_def) |
109 by (auto simp add: project_def) |
114 |
|
115 |
|
116 subsection {* Theorems on relations *} |
|
117 |
|
118 lemma product_code: |
|
119 "Product_Type.product (set xs) (set ys) = set [(x, y). x \<leftarrow> xs, y \<leftarrow> ys]" |
|
120 by (auto simp add: Product_Type.product_def) |
|
121 |
|
122 lemma Id_on_set: |
|
123 "Id_on (set xs) = set [(x, x). x \<leftarrow> xs]" |
|
124 by (auto simp add: Id_on_def) |
|
125 |
|
126 lemma trancl_set_ntrancl: "trancl (set xs) = ntrancl (card (set xs) - 1) (set xs)" |
|
127 by (simp add: finite_trancl_ntranl) |
|
128 |
|
129 lemma set_rel_comp: |
|
130 "set xys O set yzs = set ([(fst xy, snd yz). xy \<leftarrow> xys, yz \<leftarrow> yzs, snd xy = fst yz])" |
|
131 by (auto simp add: Bex_def) |
|
132 |
|
133 lemma wf_set: |
|
134 "wf (set xs) = acyclic (set xs)" |
|
135 by (simp add: wf_iff_acyclic_if_finite) |
|
136 |
110 |
137 |
111 |
138 subsection {* Code generator setup *} |
112 subsection {* Code generator setup *} |
139 |
113 |
140 definition coset :: "'a list \<Rightarrow> 'a set" where |
114 definition coset :: "'a list \<Rightarrow> 'a set" where |
148 lemma [code]: |
122 lemma [code]: |
149 "x \<in> set xs \<longleftrightarrow> List.member xs x" |
123 "x \<in> set xs \<longleftrightarrow> List.member xs x" |
150 "x \<in> coset xs \<longleftrightarrow> \<not> List.member xs x" |
124 "x \<in> coset xs \<longleftrightarrow> \<not> List.member xs x" |
151 by (simp_all add: member_def) |
125 by (simp_all add: member_def) |
152 |
126 |
153 lemma [code_unfold]: |
|
154 "A = {} \<longleftrightarrow> Set.is_empty A" |
|
155 by (simp add: Set.is_empty_def) |
|
156 |
|
157 declare empty_set [code] |
|
158 |
|
159 declare is_empty_set [code] |
|
160 |
|
161 lemma UNIV_coset [code]: |
127 lemma UNIV_coset [code]: |
162 "UNIV = coset []" |
128 "UNIV = coset []" |
163 by simp |
129 by simp |
164 |
130 |
165 lemma insert_code [code]: |
131 lemma insert_code [code]: |
170 lemma remove_code [code]: |
136 lemma remove_code [code]: |
171 "Set.remove x (set xs) = set (removeAll x xs)" |
137 "Set.remove x (set xs) = set (removeAll x xs)" |
172 "Set.remove x (coset xs) = coset (List.insert x xs)" |
138 "Set.remove x (coset xs) = coset (List.insert x xs)" |
173 by (simp_all add: remove_def Compl_insert) |
139 by (simp_all add: remove_def Compl_insert) |
174 |
140 |
175 declare image_set [code] |
|
176 |
|
177 declare project_set [code] |
|
178 |
|
179 lemma Ball_set [code]: |
141 lemma Ball_set [code]: |
180 "Ball (set xs) P \<longleftrightarrow> list_all P xs" |
142 "Ball (set xs) P \<longleftrightarrow> list_all P xs" |
181 by (simp add: list_all_iff) |
143 by (simp add: list_all_iff) |
182 |
144 |
183 lemma Bex_set [code]: |
145 lemma Bex_set [code]: |
189 proof - |
151 proof - |
190 have "card (set (remdups xs)) = length (remdups xs)" |
152 have "card (set (remdups xs)) = length (remdups xs)" |
191 by (rule distinct_card) simp |
153 by (rule distinct_card) simp |
192 then show ?thesis by simp |
154 then show ?thesis by simp |
193 qed |
155 qed |
194 |
|
195 |
|
196 subsection {* Derived operations *} |
|
197 |
|
198 declare subset_eq [code] |
|
199 |
|
200 declare subset [code] |
|
201 |
156 |
202 |
157 |
203 subsection {* Functorial operations *} |
158 subsection {* Functorial operations *} |
204 |
159 |
205 lemma inter_code [code]: |
160 lemma inter_code [code]: |
271 hide_const (open) coset |
226 hide_const (open) coset |
272 |
227 |
273 |
228 |
274 subsection {* Operations on relations *} |
229 subsection {* Operations on relations *} |
275 |
230 |
276 text {* Initially contributed by Tjark Weber. *} |
231 lemma product_code [code]: |
277 |
232 "Product_Type.product (set xs) (set ys) = set [(x, y). x \<leftarrow> xs, y \<leftarrow> ys]" |
278 declare Domain_fst [code] |
233 by (auto simp add: Product_Type.product_def) |
279 |
234 |
280 declare Range_snd [code] |
235 lemma Id_on_set [code]: |
281 |
236 "Id_on (set xs) = set [(x, x). x \<leftarrow> xs]" |
282 declare trans_join [code] |
237 by (auto simp add: Id_on_def) |
283 |
238 |
284 declare irrefl_distinct [code] |
239 lemma trancl_set_ntrancl [code]: "trancl (set xs) = ntrancl (card (set xs) - 1) (set xs)" |
285 |
240 by (simp add: finite_trancl_ntranl) |
286 declare trancl_set_ntrancl [code] |
241 |
287 |
242 lemma set_rel_comp [code]: |
288 declare acyclic_irrefl [code] |
243 "set xys O set yzs = set ([(fst xy, snd yz). xy \<leftarrow> xys, yz \<leftarrow> yzs, snd xy = fst yz])" |
289 |
244 by (auto simp add: Bex_def) |
290 declare product_code [code] |
245 |
291 |
246 lemma wf_set [code]: |
292 declare Id_on_set [code] |
247 "wf (set xs) = acyclic (set xs)" |
293 |
248 by (simp add: wf_iff_acyclic_if_finite) |
294 declare set_rel_comp [code] |
|
295 |
|
296 declare wf_set [code] |
|
297 |
249 |
298 end |
250 end |
299 |
251 |