1 (* Title: HOL/equalities |
1 (* Title: HOL/equalities |
2 ID: $Id$ |
2 ID: $Id$ |
3 Author: Lawrence C Paulson, Cambridge University Computer Laboratory |
3 Author: Lawrence C Paulson, Cambridge University Computer Laboratory |
4 Copyright 1991 University of Cambridge |
4 Copyright 1994 University of Cambridge |
5 |
5 |
6 Equalities involving union, intersection, inclusion, etc. |
6 Equalities involving union, intersection, inclusion, etc. |
7 *) |
7 *) |
8 |
8 |
9 writeln"File HOL/equalities"; |
9 writeln"File HOL/equalities"; |
10 |
10 |
11 val eq_cs = set_cs addSIs [equalityI]; |
11 val eq_cs = set_cs addSIs [equalityI]; |
12 |
12 |
13 (** : **) |
13 (** The membership relation, : **) |
14 |
14 |
15 goal Set.thy "x ~: {}"; |
15 goal Set.thy "x ~: {}"; |
16 by(fast_tac set_cs 1); |
16 by(fast_tac set_cs 1); |
17 val in_empty = result(); |
17 val in_empty = result(); |
18 |
18 |
177 by (best_tac eq_cs 1); |
177 by (best_tac eq_cs 1); |
178 val Inter_Un_distrib = result(); |
178 val Inter_Un_distrib = result(); |
179 |
179 |
180 (** Unions and Intersections of Families **) |
180 (** Unions and Intersections of Families **) |
181 |
181 |
|
182 (*Basic identities*) |
|
183 |
|
184 goal Set.thy "Union(range(f)) = (UN x.f(x))"; |
|
185 by (fast_tac eq_cs 1); |
|
186 val Union_range_eq = result(); |
|
187 |
|
188 goal Set.thy "Inter(range(f)) = (INT x.f(x))"; |
|
189 by (fast_tac eq_cs 1); |
|
190 val Inter_range_eq = result(); |
|
191 |
|
192 goal Set.thy "Union(B``A) = (UN x:A. B(x))"; |
|
193 by (fast_tac eq_cs 1); |
|
194 val Union_image_eq = result(); |
|
195 |
|
196 goal Set.thy "Inter(B``A) = (INT x:A. B(x))"; |
|
197 by (fast_tac eq_cs 1); |
|
198 val Inter_image_eq = result(); |
|
199 |
|
200 goal Set.thy "!!A. a: A ==> (UN y:A. c) = c"; |
|
201 by (fast_tac eq_cs 1); |
|
202 val UN_constant = result(); |
|
203 |
|
204 goal Set.thy "!!A. a: A ==> (INT y:A. c) = c"; |
|
205 by (fast_tac eq_cs 1); |
|
206 val INT_constant = result(); |
|
207 |
|
208 goal Set.thy "(UN x.B) = B"; |
|
209 by (fast_tac eq_cs 1); |
|
210 val UN1_constant = result(); |
|
211 |
|
212 goal Set.thy "(INT x.B) = B"; |
|
213 by (fast_tac eq_cs 1); |
|
214 val INT1_constant = result(); |
|
215 |
182 goal Set.thy "(UN x:A. B(x)) = Union({Y. ? x:A. Y=B(x)})"; |
216 goal Set.thy "(UN x:A. B(x)) = Union({Y. ? x:A. Y=B(x)})"; |
183 by (fast_tac eq_cs 1); |
217 by (fast_tac eq_cs 1); |
184 val UN_eq = result(); |
218 val UN_eq = result(); |
185 |
219 |
186 (*Look: it has an EXISTENTIAL quantifier*) |
220 (*Look: it has an EXISTENTIAL quantifier*) |
187 goal Set.thy "(INT x:A. B(x)) = Inter({Y. ? x:A. Y=B(x)})"; |
221 goal Set.thy "(INT x:A. B(x)) = Inter({Y. ? x:A. Y=B(x)})"; |
188 by (fast_tac eq_cs 1); |
222 by (fast_tac eq_cs 1); |
189 val INT_eq = result(); |
223 val INT_eq = result(); |
190 |
224 |
|
225 (*Distributive laws...*) |
|
226 |
191 goal Set.thy "A Int Union(B) = (UN C:B. A Int C)"; |
227 goal Set.thy "A Int Union(B) = (UN C:B. A Int C)"; |
192 by (fast_tac eq_cs 1); |
228 by (fast_tac eq_cs 1); |
193 val Int_Union = result(); |
229 val Int_Union = result(); |
194 |
230 |
195 (* Devlin, page 12: Union of a family of unions **) |
231 (* Devlin, Fundamentals of Contemporary Set Theory, page 12, exercise 5: |
|
232 Union of a family of unions **) |
196 goal Set.thy "(UN x:C. A(x) Un B(x)) = Union(A``C) Un Union(B``C)"; |
233 goal Set.thy "(UN x:C. A(x) Un B(x)) = Union(A``C) Un Union(B``C)"; |
197 by (fast_tac eq_cs 1); |
234 by (fast_tac eq_cs 1); |
198 val Un_Union_image = result(); |
235 val Un_Union_image = result(); |
|
236 |
|
237 (*Equivalent version*) |
|
238 goal Set.thy "(UN i:I. A(i) Un B(i)) = (UN i:I. A(i)) Un (UN i:I. B(i))"; |
|
239 by (fast_tac eq_cs 1); |
|
240 val UN_Un_distrib = result(); |
199 |
241 |
200 goal Set.thy "A Un Inter(B) = (INT C:B. A Un C)"; |
242 goal Set.thy "A Un Inter(B) = (INT C:B. A Un C)"; |
201 by (fast_tac eq_cs 1); |
243 by (fast_tac eq_cs 1); |
202 val Un_Inter = result(); |
244 val Un_Inter = result(); |
203 |
245 |
204 goal Set.thy "(INT x:C. A(x) Int B(x)) = Inter(A``C) Int Inter(B``C)"; |
246 goal Set.thy "(INT x:C. A(x) Int B(x)) = Inter(A``C) Int Inter(B``C)"; |
205 by (best_tac eq_cs 1); |
247 by (best_tac eq_cs 1); |
206 val Int_Inter_image = result(); |
248 val Int_Inter_image = result(); |
207 |
249 |
208 (** Other identities about Unions and Intersections **) |
250 (*Equivalent version*) |
209 |
251 goal Set.thy "(INT i:I. A(i) Int B(i)) = (INT i:I. A(i)) Int (INT i:I. B(i))"; |
210 goal Set.thy "Union(range(f)) = (UN x.f(x))"; |
252 by (fast_tac eq_cs 1); |
211 by (fast_tac eq_cs 1); |
253 val INT_Int_distrib = result(); |
212 val Union_range_eq = result(); |
254 |
213 |
255 (*Halmos, Naive Set Theory, page 35.*) |
214 goal Set.thy "Inter(range(f)) = (INT x.f(x))"; |
256 goal Set.thy "B Int (UN i:I. A(i)) = (UN i:I. B Int A(i))"; |
215 by (fast_tac eq_cs 1); |
257 by (fast_tac eq_cs 1); |
216 val Inter_range_eq = result(); |
258 val Int_UN_distrib = result(); |
217 |
259 |
218 goal Set.thy "Union(B``A) = (UN x:A. B(x))"; |
260 goal Set.thy "B Un (INT i:I. A(i)) = (INT i:I. B Un A(i))"; |
219 by (fast_tac eq_cs 1); |
261 by (fast_tac eq_cs 1); |
220 val Union_image_eq = result(); |
262 val Un_INT_distrib = result(); |
221 |
263 |
222 goal Set.thy "Inter(B``A) = (INT x:A. B(x))"; |
264 goal Set.thy |
223 by (fast_tac eq_cs 1); |
265 "(UN i:I. A(i)) Int (UN j:J. B(j)) = (UN i:I. UN j:J. A(i) Int B(j))"; |
224 val Inter_image_eq = result(); |
266 by (fast_tac eq_cs 1); |
225 |
267 val Int_UN_distrib2 = result(); |
226 goal Set.thy "(UN x.B) = B"; |
268 |
227 by (fast_tac eq_cs 1); |
269 goal Set.thy |
228 val constant_UN = result(); |
270 "(INT i:I. A(i)) Un (INT j:J. B(j)) = (INT i:I. INT j:J. A(i) Un B(j))"; |
|
271 by (fast_tac eq_cs 1); |
|
272 val Un_INT_distrib2 = result(); |
229 |
273 |
230 (** Simple properties of Diff -- set difference **) |
274 (** Simple properties of Diff -- set difference **) |
231 |
275 |
232 goal Set.thy "A-A = {}"; |
276 goal Set.thy "A-A = {}"; |
233 by (fast_tac eq_cs 1); |
277 by (fast_tac eq_cs 1); |
278 |
321 |
279 val set_ss = set_ss addsimps |
322 val set_ss = set_ss addsimps |
280 [in_empty,in_insert,insert_subset, |
323 [in_empty,in_insert,insert_subset, |
281 Int_absorb,Int_empty_left,Int_empty_right, |
324 Int_absorb,Int_empty_left,Int_empty_right, |
282 Un_absorb,Un_empty_left,Un_empty_right, |
325 Un_absorb,Un_empty_left,Un_empty_right, |
283 constant_UN,image_empty, |
326 UN1_constant,image_empty, |
284 Compl_disjoint,double_complement, |
327 Compl_disjoint,double_complement, |
285 Union_empty,Union_insert,empty_subsetI,subset_refl, |
328 Union_empty,Union_insert,empty_subsetI,subset_refl, |
286 Diff_cancel,empty_Diff,Diff_empty,Diff_disjoint]; |
329 Diff_cancel,empty_Diff,Diff_empty,Diff_disjoint]; |