equalities.ML
changeset 76 fb4fe9f8c3cd
parent 57 194d088c1511
child 90 5c7a69cef18b
equal deleted inserted replaced
75:74bc51d20112 76:fb4fe9f8c3cd
     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 
   162 
   162 
   163 goal Set.thy "Union(A Un B) = Union(A) Un Union(B)";
   163 goal Set.thy "Union(A Un B) = Union(A) Un Union(B)";
   164 by (fast_tac eq_cs 1);
   164 by (fast_tac eq_cs 1);
   165 val Union_Un_distrib = result();
   165 val Union_Un_distrib = result();
   166 
   166 
   167 goal Set.thy "Union(A Un B) = Union(A) Un Union(B)";
   167 goal Set.thy "Union(A Int B) <= Union(A) Int Union(B)";
   168 by (fast_tac eq_cs 1);
   168 by (fast_tac set_cs 1);
   169 val Union_Un_distrib = result();
   169 val Union_Int_subset = result();
   170 
   170 
   171 val prems = goal Set.thy
   171 val prems = goal Set.thy
   172    "(Union(C) Int A = {}) = (! B:C. B Int A = {})";
   172    "(Union(C) Int A = {}) = (! B:C. B Int A = {})";
   173 by (fast_tac (eq_cs addSEs [equalityE]) 1);
   173 by (fast_tac (eq_cs addSEs [equalityE]) 1);
   174 val Union_disjoint = result();
   174 val Union_disjoint = result();
   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);
   260 val Diff_disjoint = result();
   304 val Diff_disjoint = result();
   261 
   305 
   262 goal Set.thy "!!A. A<=B ==> A Un (B-A) = B";
   306 goal Set.thy "!!A. A<=B ==> A Un (B-A) = B";
   263 by (fast_tac eq_cs 1);
   307 by (fast_tac eq_cs 1);
   264 val Diff_partition = result();
   308 val Diff_partition = result();
   265 (*
   309 
   266 goal Set.thy "!!A. [| A<=B; B<= C |] ==> (B - (C-A)) = A";
   310 goal Set.thy "!!A. [| A<=B; B<= C |] ==> (B - (C - A)) = A :: 'a set";
   267 by (cut_facts_tac prems 1);
   311 by (fast_tac eq_cs 1);
   268 by (fast_tac eq_cs 1);
   312 val double_diff = result();
   269 val double_complement = result();
   313 
   270 *)
       
   271 goal Set.thy "A - (B Un C) = (A-B) Int (A-C)";
   314 goal Set.thy "A - (B Un C) = (A-B) Int (A-C)";
   272 by (fast_tac eq_cs 1);
   315 by (fast_tac eq_cs 1);
   273 val Diff_Un = result();
   316 val Diff_Un = result();
   274 
   317 
   275 goal Set.thy "A - (B Int C) = (A-B) Un (A-C)";
   318 goal Set.thy "A - (B Int C) = (A-B) Un (A-C)";
   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];