| author | wenzelm | 
| Tue, 18 May 1999 15:52:34 +0200 | |
| changeset 6671 | 677713791bd8 | 
| parent 6176 | 707b6f9859d2 | 
| child 7499 | 23e090051cb8 | 
| permissions | -rw-r--r-- | 
| 1461 | 1  | 
(* Title: ZF/Cardinal.ML  | 
| 435 | 2  | 
ID: $Id$  | 
| 1461 | 3  | 
Author: Lawrence C Paulson, Cambridge University Computer Laboratory  | 
| 435 | 4  | 
Copyright 1994 University of Cambridge  | 
5  | 
||
6  | 
Cardinals in Zermelo-Fraenkel Set Theory  | 
|
7  | 
||
8  | 
This theory does NOT assume the Axiom of Choice  | 
|
9  | 
*)  | 
|
10  | 
||
11  | 
(*** The Schroeder-Bernstein Theorem -- see Davey & Priestly, page 106 ***)  | 
|
12  | 
||
13  | 
(** Lemma: Banach's Decomposition Theorem **)  | 
|
14  | 
||
| 5067 | 15  | 
Goal "bnd_mono(X, %W. X - g``(Y - f``W))";  | 
| 435 | 16  | 
by (rtac bnd_monoI 1);  | 
17  | 
by (REPEAT (ares_tac [Diff_subset, subset_refl, Diff_mono, image_mono] 1));  | 
|
| 760 | 18  | 
qed "decomp_bnd_mono";  | 
| 435 | 19  | 
|
20  | 
val [gfun] = goal Cardinal.thy  | 
|
| 1461 | 21  | 
"g: Y->X ==> \  | 
22  | 
\ g``(Y - f`` lfp(X, %W. X - g``(Y - f``W))) = \  | 
|
| 435 | 23  | 
\ X - lfp(X, %W. X - g``(Y - f``W)) ";  | 
24  | 
by (res_inst_tac [("P", "%u. ?v = X-u")] 
 | 
|
25  | 
(decomp_bnd_mono RS lfp_Tarski RS ssubst) 1);  | 
|
| 4091 | 26  | 
by (simp_tac (simpset() addsimps [subset_refl, double_complement,  | 
| 1461 | 27  | 
gfun RS fun_is_rel RS image_subset]) 1);  | 
| 760 | 28  | 
qed "Banach_last_equation";  | 
| 435 | 29  | 
|
| 
5325
 
f7a5e06adea1
Yet more removal of "goal" commands, especially "goal ZF.thy", so ZF.thy
 
paulson 
parents: 
5284 
diff
changeset
 | 
30  | 
Goal "[| f: X->Y; g: Y->X |] ==> \  | 
| 
 
f7a5e06adea1
Yet more removal of "goal" commands, especially "goal ZF.thy", so ZF.thy
 
paulson 
parents: 
5284 
diff
changeset
 | 
31  | 
\ EX XA XB YA YB. (XA Int XB = 0) & (XA Un XB = X) & \  | 
| 
 
f7a5e06adea1
Yet more removal of "goal" commands, especially "goal ZF.thy", so ZF.thy
 
paulson 
parents: 
5284 
diff
changeset
 | 
32  | 
\ (YA Int YB = 0) & (YA Un YB = Y) & \  | 
| 
 
f7a5e06adea1
Yet more removal of "goal" commands, especially "goal ZF.thy", so ZF.thy
 
paulson 
parents: 
5284 
diff
changeset
 | 
33  | 
\ f``XA=YA & g``YB=XB";  | 
| 435 | 34  | 
by (REPEAT  | 
35  | 
(FIRSTGOAL  | 
|
36  | 
(resolve_tac [refl, exI, conjI, Diff_disjoint, Diff_partition])));  | 
|
37  | 
by (rtac Banach_last_equation 3);  | 
|
| 
5325
 
f7a5e06adea1
Yet more removal of "goal" commands, especially "goal ZF.thy", so ZF.thy
 
paulson 
parents: 
5284 
diff
changeset
 | 
38  | 
by (REPEAT (ares_tac [fun_is_rel, image_subset, lfp_subset] 1));  | 
| 760 | 39  | 
qed "decomposition";  | 
| 435 | 40  | 
|
41  | 
val prems = goal Cardinal.thy  | 
|
42  | 
"[| f: inj(X,Y); g: inj(Y,X) |] ==> EX h. h: bij(X,Y)";  | 
|
43  | 
by (cut_facts_tac prems 1);  | 
|
44  | 
by (cut_facts_tac [(prems RL [inj_is_fun]) MRS decomposition] 1);  | 
|
| 4091 | 45  | 
by (blast_tac (claset() addSIs [restrict_bij,bij_disjoint_Un]  | 
| 435 | 46  | 
addIs [bij_converse_bij]) 1);  | 
47  | 
(* The instantiation of exI to "restrict(f,XA) Un converse(restrict(g,YB))"  | 
|
48  | 
is forced by the context!! *)  | 
|
| 760 | 49  | 
qed "schroeder_bernstein";  | 
| 435 | 50  | 
|
51  | 
||
52  | 
(** Equipollence is an equivalence relation **)  | 
|
53  | 
||
| 5137 | 54  | 
Goalw [eqpoll_def] "f: bij(A,B) ==> A eqpoll B";  | 
| 
845
 
825e96b87ef7
Added Krzysztof's theorem LeastI2.  Proof of sum_eqpoll_cong
 
lcp 
parents: 
833 
diff
changeset
 | 
55  | 
by (etac exI 1);  | 
| 
 
825e96b87ef7
Added Krzysztof's theorem LeastI2.  Proof of sum_eqpoll_cong
 
lcp 
parents: 
833 
diff
changeset
 | 
56  | 
qed "bij_imp_eqpoll";  | 
| 
 
825e96b87ef7
Added Krzysztof's theorem LeastI2.  Proof of sum_eqpoll_cong
 
lcp 
parents: 
833 
diff
changeset
 | 
57  | 
|
| 
 
825e96b87ef7
Added Krzysztof's theorem LeastI2.  Proof of sum_eqpoll_cong
 
lcp 
parents: 
833 
diff
changeset
 | 
58  | 
(*A eqpoll A*)  | 
| 
 
825e96b87ef7
Added Krzysztof's theorem LeastI2.  Proof of sum_eqpoll_cong
 
lcp 
parents: 
833 
diff
changeset
 | 
59  | 
bind_thm ("eqpoll_refl", id_bij RS bij_imp_eqpoll);
 | 
| 435 | 60  | 
|
| 5137 | 61  | 
Goalw [eqpoll_def] "X eqpoll Y ==> Y eqpoll X";  | 
| 4091 | 62  | 
by (blast_tac (claset() addIs [bij_converse_bij]) 1);  | 
| 760 | 63  | 
qed "eqpoll_sym";  | 
| 435 | 64  | 
|
| 5067 | 65  | 
Goalw [eqpoll_def]  | 
| 5137 | 66  | 
"[| X eqpoll Y; Y eqpoll Z |] ==> X eqpoll Z";  | 
| 4091 | 67  | 
by (blast_tac (claset() addIs [comp_bij]) 1);  | 
| 760 | 68  | 
qed "eqpoll_trans";  | 
| 435 | 69  | 
|
70  | 
(** Le-pollence is a partial ordering **)  | 
|
71  | 
||
| 5137 | 72  | 
Goalw [lepoll_def] "X<=Y ==> X lepoll Y";  | 
| 437 | 73  | 
by (rtac exI 1);  | 
74  | 
by (etac id_subset_inj 1);  | 
|
| 760 | 75  | 
qed "subset_imp_lepoll";  | 
| 435 | 76  | 
|
| 1609 | 77  | 
bind_thm ("lepoll_refl", subset_refl RS subset_imp_lepoll);
 | 
78  | 
||
79  | 
bind_thm ("le_imp_lepoll", le_imp_subset RS subset_imp_lepoll);
 | 
|
| 435 | 80  | 
|
| 5067 | 81  | 
Goalw [eqpoll_def, bij_def, lepoll_def]  | 
| 5137 | 82  | 
"X eqpoll Y ==> X lepoll Y";  | 
| 2875 | 83  | 
by (Blast_tac 1);  | 
| 760 | 84  | 
qed "eqpoll_imp_lepoll";  | 
| 435 | 85  | 
|
| 5067 | 86  | 
Goalw [lepoll_def]  | 
| 5137 | 87  | 
"[| X lepoll Y; Y lepoll Z |] ==> X lepoll Z";  | 
| 4091 | 88  | 
by (blast_tac (claset() addIs [comp_inj]) 1);  | 
| 760 | 89  | 
qed "lepoll_trans";  | 
| 435 | 90  | 
|
91  | 
(*Asymmetry law*)  | 
|
| 5067 | 92  | 
Goalw [lepoll_def,eqpoll_def]  | 
| 5137 | 93  | 
"[| X lepoll Y; Y lepoll X |] ==> X eqpoll Y";  | 
| 435 | 94  | 
by (REPEAT (etac exE 1));  | 
95  | 
by (rtac schroeder_bernstein 1);  | 
|
96  | 
by (REPEAT (assume_tac 1));  | 
|
| 760 | 97  | 
qed "eqpollI";  | 
| 435 | 98  | 
|
| 5268 | 99  | 
val [major,minor] = Goal  | 
| 435 | 100  | 
"[| X eqpoll Y; [| X lepoll Y; Y lepoll X |] ==> P |] ==> P";  | 
| 437 | 101  | 
by (rtac minor 1);  | 
| 435 | 102  | 
by (REPEAT (resolve_tac [major, eqpoll_imp_lepoll, eqpoll_sym] 1));  | 
| 760 | 103  | 
qed "eqpollE";  | 
| 435 | 104  | 
|
| 5067 | 105  | 
Goal "X eqpoll Y <-> X lepoll Y & Y lepoll X";  | 
| 4091 | 106  | 
by (blast_tac (claset() addIs [eqpollI] addSEs [eqpollE]) 1);  | 
| 760 | 107  | 
qed "eqpoll_iff";  | 
| 435 | 108  | 
|
| 
5147
 
825877190618
More tidying and removal of "\!\!... from Goal commands
 
paulson 
parents: 
5143 
diff
changeset
 | 
109  | 
Goalw [lepoll_def, inj_def] "A lepoll 0 ==> A = 0";  | 
| 4091 | 110  | 
by (blast_tac (claset() addDs [apply_type]) 1);  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
111  | 
qed "lepoll_0_is_0";  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
112  | 
|
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
113  | 
(*0 lepoll Y*)  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
114  | 
bind_thm ("empty_lepollI", empty_subsetI RS subset_imp_lepoll);
 | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
115  | 
|
| 5067 | 116  | 
Goal "A lepoll 0 <-> A=0";  | 
| 4091 | 117  | 
by (blast_tac (claset() addIs [lepoll_0_is_0, lepoll_refl]) 1);  | 
| 1609 | 118  | 
qed "lepoll_0_iff";  | 
119  | 
||
| 5067 | 120  | 
Goalw [lepoll_def]  | 
| 5137 | 121  | 
"[| A lepoll B; C lepoll D; B Int D = 0 |] ==> A Un C lepoll B Un D";  | 
| 4091 | 122  | 
by (blast_tac (claset() addIs [inj_disjoint_Un]) 1);  | 
| 1709 | 123  | 
qed "Un_lepoll_Un";  | 
124  | 
||
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
125  | 
(*A eqpoll 0 ==> A=0*)  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
126  | 
bind_thm ("eqpoll_0_is_0",  eqpoll_imp_lepoll RS lepoll_0_is_0);
 | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
127  | 
|
| 5067 | 128  | 
Goal "A eqpoll 0 <-> A=0";  | 
| 4091 | 129  | 
by (blast_tac (claset() addIs [eqpoll_0_is_0, eqpoll_refl]) 1);  | 
| 1609 | 130  | 
qed "eqpoll_0_iff";  | 
131  | 
||
| 5067 | 132  | 
Goalw [eqpoll_def]  | 
| 5137 | 133  | 
"[| A eqpoll B; C eqpoll D; A Int C = 0; B Int D = 0 |] ==> \  | 
| 1609 | 134  | 
\ A Un C eqpoll B Un D";  | 
| 4091 | 135  | 
by (blast_tac (claset() addIs [bij_disjoint_Un]) 1);  | 
| 1609 | 136  | 
qed "eqpoll_disjoint_Un";  | 
137  | 
||
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
138  | 
|
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
139  | 
(*** lesspoll: contributions by Krzysztof Grabczewski ***)  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
140  | 
|
| 5137 | 141  | 
Goalw [lesspoll_def] "A lesspoll B ==> A lepoll B";  | 
| 2875 | 142  | 
by (Blast_tac 1);  | 
| 1609 | 143  | 
qed "lesspoll_imp_lepoll";  | 
144  | 
||
| 5067 | 145  | 
Goalw [lepoll_def]  | 
| 5137 | 146  | 
"[| A lepoll B; well_ord(B,r) |] ==> EX s. well_ord(A,s)";  | 
| 4091 | 147  | 
by (blast_tac (claset() addIs [well_ord_rvimage]) 1);  | 
| 1609 | 148  | 
qed "lepoll_well_ord";  | 
149  | 
||
| 5067 | 150  | 
Goalw [lesspoll_def] "A lepoll B <-> A lesspoll B | A eqpoll B";  | 
| 4091 | 151  | 
by (blast_tac (claset() addSIs [eqpollI] addSEs [eqpollE]) 1);  | 
| 1609 | 152  | 
qed "lepoll_iff_leqpoll";  | 
153  | 
||
| 5067 | 154  | 
Goalw [inj_def, surj_def]  | 
| 5137 | 155  | 
"[| f : inj(A, succ(m)); f ~: surj(A, succ(m)) |] ==> EX f. f:inj(A,m)";  | 
| 4091 | 156  | 
by (safe_tac (claset_of ZF.thy));  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
157  | 
by (swap_res_tac [exI] 1);  | 
| 6068 | 158  | 
by (res_inst_tac [("a", "lam z:A. if f`z=m then y else f`z")] CollectI 1);
 | 
| 4091 | 159  | 
by (best_tac (claset() addSIs [if_type RS lam_type]  | 
| 3016 | 160  | 
addEs [apply_funtype RS succE]) 1);  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
161  | 
(*Proving it's injective*)  | 
| 5137 | 162  | 
by (Asm_simp_tac 1);  | 
| 4091 | 163  | 
by (blast_tac (claset() delrules [equalityI]) 1);  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
164  | 
qed "inj_not_surj_succ";  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
165  | 
|
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
166  | 
(** Variations on transitivity **)  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
167  | 
|
| 5067 | 168  | 
Goalw [lesspoll_def]  | 
| 5137 | 169  | 
"[| X lesspoll Y; Y lesspoll Z |] ==> X lesspoll Z";  | 
| 4091 | 170  | 
by (blast_tac (claset() addSEs [eqpollE] addIs [eqpollI, lepoll_trans]) 1);  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
171  | 
qed "lesspoll_trans";  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
172  | 
|
| 5067 | 173  | 
Goalw [lesspoll_def]  | 
| 5137 | 174  | 
"[| X lesspoll Y; Y lepoll Z |] ==> X lesspoll Z";  | 
| 4091 | 175  | 
by (blast_tac (claset() addSEs [eqpollE] addIs [eqpollI, lepoll_trans]) 1);  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
176  | 
qed "lesspoll_lepoll_lesspoll";  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
177  | 
|
| 5067 | 178  | 
Goalw [lesspoll_def]  | 
| 5137 | 179  | 
"[| X lesspoll Y; Z lepoll X |] ==> Z lesspoll Y";  | 
| 4091 | 180  | 
by (blast_tac (claset() addSEs [eqpollE] addIs [eqpollI, lepoll_trans]) 1);  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
181  | 
qed "lepoll_lesspoll_lesspoll";  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
182  | 
|
| 435 | 183  | 
|
184  | 
(** LEAST -- the least number operator [from HOL/Univ.ML] **)  | 
|
185  | 
||
| 5268 | 186  | 
val [premP,premOrd,premNot] = Goalw [Least_def]  | 
| 3840 | 187  | 
"[| P(i); Ord(i); !!x. x<i ==> ~P(x) |] ==> (LEAST x. P(x)) = i";  | 
| 435 | 188  | 
by (rtac the_equality 1);  | 
| 4091 | 189  | 
by (blast_tac (claset() addSIs [premP,premOrd,premNot]) 1);  | 
| 435 | 190  | 
by (REPEAT (etac conjE 1));  | 
| 437 | 191  | 
by (etac (premOrd RS Ord_linear_lt) 1);  | 
| 4091 | 192  | 
by (ALLGOALS (blast_tac (claset() addSIs [premP] addSDs [premNot])));  | 
| 760 | 193  | 
qed "Least_equality";  | 
| 435 | 194  | 
|
| 5137 | 195  | 
Goal "[| P(i); Ord(i) |] ==> P(LEAST x. P(x))";  | 
| 435 | 196  | 
by (etac rev_mp 1);  | 
197  | 
by (trans_ind_tac "i" [] 1);  | 
|
198  | 
by (rtac impI 1);  | 
|
199  | 
by (rtac classical 1);  | 
|
| 2033 | 200  | 
by (EVERY1 [stac Least_equality, assume_tac, assume_tac]);  | 
| 435 | 201  | 
by (assume_tac 2);  | 
| 4091 | 202  | 
by (blast_tac (claset() addSEs [ltE]) 1);  | 
| 760 | 203  | 
qed "LeastI";  | 
| 435 | 204  | 
|
205  | 
(*Proof is almost identical to the one above!*)  | 
|
| 5137 | 206  | 
Goal "[| P(i); Ord(i) |] ==> (LEAST x. P(x)) le i";  | 
| 435 | 207  | 
by (etac rev_mp 1);  | 
208  | 
by (trans_ind_tac "i" [] 1);  | 
|
209  | 
by (rtac impI 1);  | 
|
210  | 
by (rtac classical 1);  | 
|
| 2033 | 211  | 
by (EVERY1 [stac Least_equality, assume_tac, assume_tac]);  | 
| 435 | 212  | 
by (etac le_refl 2);  | 
| 4091 | 213  | 
by (blast_tac (claset() addEs [ltE] addIs [leI, ltI, lt_trans1]) 1);  | 
| 760 | 214  | 
qed "Least_le";  | 
| 435 | 215  | 
|
216  | 
(*LEAST really is the smallest*)  | 
|
| 5137 | 217  | 
Goal "[| P(i); i < (LEAST x. P(x)) |] ==> Q";  | 
| 437 | 218  | 
by (rtac (Least_le RSN (2,lt_trans2) RS lt_irrefl) 1);  | 
| 435 | 219  | 
by (REPEAT (eresolve_tac [asm_rl, ltE] 1));  | 
| 760 | 220  | 
qed "less_LeastE";  | 
| 435 | 221  | 
|
| 1031 | 222  | 
(*Easier to apply than LeastI: conclusion has only one occurrence of P*)  | 
| 
845
 
825e96b87ef7
Added Krzysztof's theorem LeastI2.  Proof of sum_eqpoll_cong
 
lcp 
parents: 
833 
diff
changeset
 | 
223  | 
qed_goal "LeastI2" Cardinal.thy  | 
| 
 
825e96b87ef7
Added Krzysztof's theorem LeastI2.  Proof of sum_eqpoll_cong
 
lcp 
parents: 
833 
diff
changeset
 | 
224  | 
"[| P(i); Ord(i); !!j. P(j) ==> Q(j) |] ==> Q(LEAST j. P(j))"  | 
| 
 
825e96b87ef7
Added Krzysztof's theorem LeastI2.  Proof of sum_eqpoll_cong
 
lcp 
parents: 
833 
diff
changeset
 | 
225  | 
(fn prems => [ resolve_tac prems 1,  | 
| 1461 | 226  | 
rtac LeastI 1,  | 
227  | 
resolve_tac prems 1,  | 
|
228  | 
resolve_tac prems 1 ]);  | 
|
| 
845
 
825e96b87ef7
Added Krzysztof's theorem LeastI2.  Proof of sum_eqpoll_cong
 
lcp 
parents: 
833 
diff
changeset
 | 
229  | 
|
| 437 | 230  | 
(*If there is no such P then LEAST is vacuously 0*)  | 
| 5067 | 231  | 
Goalw [Least_def]  | 
| 5137 | 232  | 
"[| ~ (EX i. Ord(i) & P(i)) |] ==> (LEAST x. P(x)) = 0";  | 
| 437 | 233  | 
by (rtac the_0 1);  | 
| 2875 | 234  | 
by (Blast_tac 1);  | 
| 760 | 235  | 
qed "Least_0";  | 
| 437 | 236  | 
|
| 5067 | 237  | 
Goal "Ord(LEAST x. P(x))";  | 
| 437 | 238  | 
by (excluded_middle_tac "EX i. Ord(i) & P(i)" 1);  | 
| 4152 | 239  | 
by Safe_tac;  | 
| 437 | 240  | 
by (rtac (Least_le RS ltE) 2);  | 
| 435 | 241  | 
by (REPEAT_SOME assume_tac);  | 
| 437 | 242  | 
by (etac (Least_0 RS ssubst) 1);  | 
243  | 
by (rtac Ord_0 1);  | 
|
| 760 | 244  | 
qed "Ord_Least";  | 
| 435 | 245  | 
|
246  | 
||
247  | 
(** Basic properties of cardinals **)  | 
|
248  | 
||
249  | 
(*Not needed for simplification, but helpful below*)  | 
|
| 5268 | 250  | 
val prems = Goal "(!!y. P(y) <-> Q(y)) ==> (LEAST x. P(x)) = (LEAST x. Q(x))";  | 
| 4091 | 251  | 
by (simp_tac (simpset() addsimps prems) 1);  | 
| 760 | 252  | 
qed "Least_cong";  | 
| 435 | 253  | 
|
| 1609 | 254  | 
(*Need AC to get X lepoll Y ==> |X| le |Y|; see well_ord_lepoll_imp_Card_le  | 
255  | 
Converse also requires AC, but see well_ord_cardinal_eqE*)  | 
|
| 
5143
 
b94cd208f073
Removal of leading "\!\!..." from most Goal commands
 
paulson 
parents: 
5137 
diff
changeset
 | 
256  | 
Goalw [eqpoll_def,cardinal_def] "X eqpoll Y ==> |X| = |Y|";  | 
| 437 | 257  | 
by (rtac Least_cong 1);  | 
| 4091 | 258  | 
by (blast_tac (claset() addIs [comp_bij, bij_converse_bij]) 1);  | 
| 760 | 259  | 
qed "cardinal_cong";  | 
| 435 | 260  | 
|
261  | 
(*Under AC, the premise becomes trivial; one consequence is ||A|| = |A|*)  | 
|
| 5067 | 262  | 
Goalw [cardinal_def]  | 
| 5137 | 263  | 
"well_ord(A,r) ==> |A| eqpoll A";  | 
| 437 | 264  | 
by (rtac LeastI 1);  | 
265  | 
by (etac Ord_ordertype 2);  | 
|
| 
845
 
825e96b87ef7
Added Krzysztof's theorem LeastI2.  Proof of sum_eqpoll_cong
 
lcp 
parents: 
833 
diff
changeset
 | 
266  | 
by (etac (ordermap_bij RS bij_converse_bij RS bij_imp_eqpoll) 1);  | 
| 760 | 267  | 
qed "well_ord_cardinal_eqpoll";  | 
| 435 | 268  | 
|
| 1609 | 269  | 
(* Ord(A) ==> |A| eqpoll A *)  | 
| 
803
 
4c8333ab3eae
changed useless "qed" calls for lemmas back to uses of "result",
 
lcp 
parents: 
792 
diff
changeset
 | 
270  | 
bind_thm ("Ord_cardinal_eqpoll", well_ord_Memrel RS well_ord_cardinal_eqpoll);
 | 
| 435 | 271  | 
|
| 5268 | 272  | 
Goal "[| well_ord(X,r); well_ord(Y,s); |X| = |Y| |] ==> X eqpoll Y";  | 
| 437 | 273  | 
by (rtac (eqpoll_sym RS eqpoll_trans) 1);  | 
274  | 
by (etac well_ord_cardinal_eqpoll 1);  | 
|
| 4091 | 275  | 
by (asm_simp_tac (simpset() addsimps [well_ord_cardinal_eqpoll]) 1);  | 
| 760 | 276  | 
qed "well_ord_cardinal_eqE";  | 
| 435 | 277  | 
|
| 5268 | 278  | 
Goal "[| well_ord(X,r); well_ord(Y,s) |] ==> |X| = |Y| <-> X eqpoll Y";  | 
| 4091 | 279  | 
by (blast_tac (claset() addIs [cardinal_cong, well_ord_cardinal_eqE]) 1);  | 
| 1609 | 280  | 
qed "well_ord_cardinal_eqpoll_iff";  | 
281  | 
||
| 435 | 282  | 
|
283  | 
(** Observations from Kunen, page 28 **)  | 
|
284  | 
||
| 5137 | 285  | 
Goalw [cardinal_def] "Ord(i) ==> |i| le i";  | 
| 437 | 286  | 
by (etac (eqpoll_refl RS Least_le) 1);  | 
| 760 | 287  | 
qed "Ord_cardinal_le";  | 
| 435 | 288  | 
|
| 5137 | 289  | 
Goalw [Card_def] "Card(K) ==> |K| = K";  | 
| 437 | 290  | 
by (etac sym 1);  | 
| 760 | 291  | 
qed "Card_cardinal_eq";  | 
| 435 | 292  | 
|
| 
845
 
825e96b87ef7
Added Krzysztof's theorem LeastI2.  Proof of sum_eqpoll_cong
 
lcp 
parents: 
833 
diff
changeset
 | 
293  | 
(* Could replace the ~(j eqpoll i) by ~(i lepoll j) *)  | 
| 5268 | 294  | 
val prems = Goalw [Card_def,cardinal_def]  | 
| 435 | 295  | 
"[| Ord(i); !!j. j<i ==> ~(j eqpoll i) |] ==> Card(i)";  | 
| 2033 | 296  | 
by (stac Least_equality 1);  | 
| 435 | 297  | 
by (REPEAT (ares_tac ([refl,eqpoll_refl]@prems) 1));  | 
| 760 | 298  | 
qed "CardI";  | 
| 435 | 299  | 
|
| 
5147
 
825877190618
More tidying and removal of "\!\!... from Goal commands
 
paulson 
parents: 
5143 
diff
changeset
 | 
300  | 
Goalw [Card_def, cardinal_def] "Card(i) ==> Ord(i)";  | 
| 437 | 301  | 
by (etac ssubst 1);  | 
302  | 
by (rtac Ord_Least 1);  | 
|
| 760 | 303  | 
qed "Card_is_Ord";  | 
| 435 | 304  | 
|
| 5137 | 305  | 
Goal "Card(K) ==> K le |K|";  | 
| 4091 | 306  | 
by (asm_simp_tac (simpset() addsimps [le_refl, Card_is_Ord, Card_cardinal_eq]) 1);  | 
| 
782
 
200a16083201
added bind_thm for theorems defined by "standard ..."
 
clasohm 
parents: 
765 
diff
changeset
 | 
307  | 
qed "Card_cardinal_le";  | 
| 765 | 308  | 
|
| 5067 | 309  | 
Goalw [cardinal_def] "Ord(|A|)";  | 
| 437 | 310  | 
by (rtac Ord_Least 1);  | 
| 760 | 311  | 
qed "Ord_cardinal";  | 
| 435 | 312  | 
|
| 
845
 
825e96b87ef7
Added Krzysztof's theorem LeastI2.  Proof of sum_eqpoll_cong
 
lcp 
parents: 
833 
diff
changeset
 | 
313  | 
(*The cardinals are the initial ordinals*)  | 
| 5067 | 314  | 
Goal "Card(K) <-> Ord(K) & (ALL j. j<K --> ~ j eqpoll K)";  | 
| 4091 | 315  | 
by (safe_tac (claset() addSIs [CardI, Card_is_Ord]));  | 
| 2875 | 316  | 
by (Blast_tac 2);  | 
| 
845
 
825e96b87ef7
Added Krzysztof's theorem LeastI2.  Proof of sum_eqpoll_cong
 
lcp 
parents: 
833 
diff
changeset
 | 
317  | 
by (rewrite_goals_tac [Card_def, cardinal_def]);  | 
| 1461 | 318  | 
by (rtac less_LeastE 1);  | 
319  | 
by (etac subst 2);  | 
|
| 
845
 
825e96b87ef7
Added Krzysztof's theorem LeastI2.  Proof of sum_eqpoll_cong
 
lcp 
parents: 
833 
diff
changeset
 | 
320  | 
by (ALLGOALS assume_tac);  | 
| 
 
825e96b87ef7
Added Krzysztof's theorem LeastI2.  Proof of sum_eqpoll_cong
 
lcp 
parents: 
833 
diff
changeset
 | 
321  | 
qed "Card_iff_initial";  | 
| 
 
825e96b87ef7
Added Krzysztof's theorem LeastI2.  Proof of sum_eqpoll_cong
 
lcp 
parents: 
833 
diff
changeset
 | 
322  | 
|
| 5137 | 323  | 
Goalw [lesspoll_def] "[| Card(a); i<a |] ==> i lesspoll a";  | 
| 1609 | 324  | 
by (dresolve_tac [Card_iff_initial RS iffD1] 1);  | 
| 4091 | 325  | 
by (blast_tac (claset() addSIs [leI RS le_imp_lepoll]) 1);  | 
| 1609 | 326  | 
qed "lt_Card_imp_lesspoll";  | 
327  | 
||
| 5067 | 328  | 
Goal "Card(0)";  | 
| 437 | 329  | 
by (rtac (Ord_0 RS CardI) 1);  | 
| 4091 | 330  | 
by (blast_tac (claset() addSEs [ltE]) 1);  | 
| 760 | 331  | 
qed "Card_0";  | 
| 437 | 332  | 
|
| 522 | 333  | 
val [premK,premL] = goal Cardinal.thy  | 
334  | 
"[| Card(K); Card(L) |] ==> Card(K Un L)";  | 
|
335  | 
by (rtac ([premK RS Card_is_Ord, premL RS Card_is_Ord] MRS Ord_linear_le) 1);  | 
|
336  | 
by (asm_simp_tac  | 
|
| 4091 | 337  | 
(simpset() addsimps [premL, le_imp_subset, subset_Un_iff RS iffD1]) 1);  | 
| 522 | 338  | 
by (asm_simp_tac  | 
| 4091 | 339  | 
(simpset() addsimps [premK, le_imp_subset, subset_Un_iff2 RS iffD1]) 1);  | 
| 760 | 340  | 
qed "Card_Un";  | 
| 522 | 341  | 
|
342  | 
(*Infinite unions of cardinals? See Devlin, Lemma 6.7, page 98*)  | 
|
343  | 
||
| 5067 | 344  | 
Goalw [cardinal_def] "Card(|A|)";  | 
| 437 | 345  | 
by (excluded_middle_tac "EX i. Ord(i) & i eqpoll A" 1);  | 
346  | 
by (etac (Least_0 RS ssubst) 1 THEN rtac Card_0 1);  | 
|
347  | 
by (rtac (Ord_Least RS CardI) 1);  | 
|
| 4152 | 348  | 
by Safe_tac;  | 
| 437 | 349  | 
by (rtac less_LeastE 1);  | 
350  | 
by (assume_tac 2);  | 
|
351  | 
by (etac eqpoll_trans 1);  | 
|
352  | 
by (REPEAT (ares_tac [LeastI] 1));  | 
|
| 760 | 353  | 
qed "Card_cardinal";  | 
| 437 | 354  | 
|
| 435 | 355  | 
(*Kunen's Lemma 10.5*)  | 
| 5137 | 356  | 
Goal "[| |i| le j; j le i |] ==> |j| = |i|";  | 
| 437 | 357  | 
by (rtac (eqpollI RS cardinal_cong) 1);  | 
| 1609 | 358  | 
by (etac le_imp_lepoll 1);  | 
| 437 | 359  | 
by (rtac lepoll_trans 1);  | 
| 1609 | 360  | 
by (etac le_imp_lepoll 2);  | 
| 437 | 361  | 
by (rtac (eqpoll_sym RS eqpoll_imp_lepoll) 1);  | 
362  | 
by (rtac Ord_cardinal_eqpoll 1);  | 
|
| 435 | 363  | 
by (REPEAT (eresolve_tac [ltE, Ord_succD] 1));  | 
| 760 | 364  | 
qed "cardinal_eq_lemma";  | 
| 435 | 365  | 
|
| 5137 | 366  | 
Goal "i le j ==> |i| le |j|";  | 
| 435 | 367  | 
by (res_inst_tac [("i","|i|"),("j","|j|")] Ord_linear_le 1);
 | 
368  | 
by (REPEAT_FIRST (ares_tac [Ord_cardinal, le_eqI]));  | 
|
| 437 | 369  | 
by (rtac cardinal_eq_lemma 1);  | 
370  | 
by (assume_tac 2);  | 
|
371  | 
by (etac le_trans 1);  | 
|
372  | 
by (etac ltE 1);  | 
|
373  | 
by (etac Ord_cardinal_le 1);  | 
|
| 760 | 374  | 
qed "cardinal_mono";  | 
| 435 | 375  | 
|
376  | 
(*Since we have |succ(nat)| le |nat|, the converse of cardinal_mono fails!*)  | 
|
| 5137 | 377  | 
Goal "[| |i| < |j|; Ord(i); Ord(j) |] ==> i < j";  | 
| 437 | 378  | 
by (rtac Ord_linear2 1);  | 
| 435 | 379  | 
by (REPEAT_SOME assume_tac);  | 
| 437 | 380  | 
by (etac (lt_trans2 RS lt_irrefl) 1);  | 
381  | 
by (etac cardinal_mono 1);  | 
|
| 760 | 382  | 
qed "cardinal_lt_imp_lt";  | 
| 435 | 383  | 
|
| 5137 | 384  | 
Goal "[| |i| < K; Ord(i); Card(K) |] ==> i < K";  | 
| 4091 | 385  | 
by (asm_simp_tac (simpset() addsimps  | 
| 1461 | 386  | 
[cardinal_lt_imp_lt, Card_is_Ord, Card_cardinal_eq]) 1);  | 
| 760 | 387  | 
qed "Card_lt_imp_lt";  | 
| 435 | 388  | 
|
| 5137 | 389  | 
Goal "[| Ord(i); Card(K) |] ==> (|i| < K) <-> (i < K)";  | 
| 4091 | 390  | 
by (blast_tac (claset() addIs [Card_lt_imp_lt, Ord_cardinal_le RS lt_trans1]) 1);  | 
| 760 | 391  | 
qed "Card_lt_iff";  | 
| 484 | 392  | 
|
| 5137 | 393  | 
Goal "[| Ord(i); Card(K) |] ==> (K le |i|) <-> (K le i)";  | 
| 4091 | 394  | 
by (asm_simp_tac (simpset() addsimps  | 
| 1461 | 395  | 
[Card_lt_iff, Card_is_Ord, Ord_cardinal,  | 
396  | 
not_lt_iff_le RS iff_sym]) 1);  | 
|
| 760 | 397  | 
qed "Card_le_iff";  | 
| 484 | 398  | 
|
| 1609 | 399  | 
(*Can use AC or finiteness to discharge first premise*)  | 
| 5268 | 400  | 
Goal "[| well_ord(B,r); A lepoll B |] ==> |A| le |B|";  | 
| 1609 | 401  | 
by (res_inst_tac [("i","|A|"),("j","|B|")] Ord_linear_le 1);
 | 
402  | 
by (REPEAT_FIRST (ares_tac [Ord_cardinal, le_eqI]));  | 
|
403  | 
by (rtac (eqpollI RS cardinal_cong) 1 THEN assume_tac 1);  | 
|
404  | 
by (rtac lepoll_trans 1);  | 
|
405  | 
by (rtac (well_ord_cardinal_eqpoll RS eqpoll_sym RS eqpoll_imp_lepoll) 1);  | 
|
406  | 
by (assume_tac 1);  | 
|
407  | 
by (etac (le_imp_lepoll RS lepoll_trans) 1);  | 
|
408  | 
by (rtac eqpoll_imp_lepoll 1);  | 
|
409  | 
by (rewtac lepoll_def);  | 
|
410  | 
by (etac exE 1);  | 
|
411  | 
by (rtac well_ord_cardinal_eqpoll 1);  | 
|
412  | 
by (etac well_ord_rvimage 1);  | 
|
413  | 
by (assume_tac 1);  | 
|
414  | 
qed "well_ord_lepoll_imp_Card_le";  | 
|
415  | 
||
416  | 
||
| 5137 | 417  | 
Goal "[| A lepoll i; Ord(i) |] ==> |A| le i";  | 
| 1623 | 418  | 
by (rtac le_trans 1);  | 
419  | 
by (etac (well_ord_Memrel RS well_ord_lepoll_imp_Card_le) 1);  | 
|
420  | 
by (assume_tac 1);  | 
|
421  | 
by (etac Ord_cardinal_le 1);  | 
|
| 1609 | 422  | 
qed "lepoll_cardinal_le";  | 
423  | 
||
| 435 | 424  | 
|
425  | 
(*** The finite cardinals ***)  | 
|
426  | 
||
| 5067 | 427  | 
Goalw [lepoll_def, inj_def]  | 
| 5137 | 428  | 
"[| cons(u,A) lepoll cons(v,B); u~:A; v~:B |] ==> A lepoll B";  | 
| 4152 | 429  | 
by Safe_tac;  | 
| 6068 | 430  | 
by (res_inst_tac [("x", "lam x:A. if f`x=v then f`u else f`x")] exI 1);
 | 
| 437 | 431  | 
by (rtac CollectI 1);  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
432  | 
(*Proving it's in the function space A->B*)  | 
| 437 | 433  | 
by (rtac (if_type RS lam_type) 1);  | 
| 4091 | 434  | 
by (blast_tac (claset() addEs [apply_funtype RS consE]) 1);  | 
435  | 
by (blast_tac (claset() addSEs [mem_irrefl] addEs [apply_funtype RS consE]) 1);  | 
|
| 435 | 436  | 
(*Proving it's injective*)  | 
| 5137 | 437  | 
by (Asm_simp_tac 1);  | 
| 2875 | 438  | 
by (Blast_tac 1);  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
439  | 
qed "cons_lepoll_consD";  | 
| 435 | 440  | 
|
| 5268 | 441  | 
Goal "[| cons(u,A) eqpoll cons(v,B); u~:A; v~:B |] ==> A eqpoll B";  | 
| 4091 | 442  | 
by (asm_full_simp_tac (simpset() addsimps [eqpoll_iff]) 1);  | 
443  | 
by (blast_tac (claset() addIs [cons_lepoll_consD]) 1);  | 
|
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
444  | 
qed "cons_eqpoll_consD";  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
445  | 
|
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
446  | 
(*Lemma suggested by Mike Fourman*)  | 
| 5137 | 447  | 
Goalw [succ_def] "succ(m) lepoll succ(n) ==> m lepoll n";  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
448  | 
by (etac cons_lepoll_consD 1);  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
449  | 
by (REPEAT (rtac mem_not_refl 1));  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
450  | 
qed "succ_lepoll_succD";  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
451  | 
|
| 5268 | 452  | 
Goal "m:nat ==> ALL n: nat. m lepoll n --> m le n";  | 
453  | 
by (nat_ind_tac "m" [] 1);  | 
|
| 4091 | 454  | 
by (blast_tac (claset() addSIs [nat_0_le]) 1);  | 
| 437 | 455  | 
by (rtac ballI 1);  | 
| 435 | 456  | 
by (eres_inst_tac [("n","n")] natE 1);
 | 
| 4091 | 457  | 
by (asm_simp_tac (simpset() addsimps [lepoll_def, inj_def,  | 
| 6112 | 458  | 
succI1 RS Pi_empty2]) 1);  | 
| 4091 | 459  | 
by (blast_tac (claset() addSIs [succ_leI] addSDs [succ_lepoll_succD]) 1);  | 
| 6112 | 460  | 
qed_spec_mp "nat_lepoll_imp_le";  | 
| 435 | 461  | 
|
| 5268 | 462  | 
Goal "[| m:nat; n: nat |] ==> m eqpoll n <-> m = n";  | 
| 437 | 463  | 
by (rtac iffI 1);  | 
| 4091 | 464  | 
by (asm_simp_tac (simpset() addsimps [eqpoll_refl]) 2);  | 
465  | 
by (blast_tac (claset() addIs [nat_lepoll_imp_le, le_anti_sym]  | 
|
| 437 | 466  | 
addSEs [eqpollE]) 1);  | 
| 760 | 467  | 
qed "nat_eqpoll_iff";  | 
| 435 | 468  | 
|
| 1609 | 469  | 
(*The object of all this work: every natural number is a (finite) cardinal*)  | 
| 5067 | 470  | 
Goalw [Card_def,cardinal_def]  | 
| 5137 | 471  | 
"n: nat ==> Card(n)";  | 
| 2033 | 472  | 
by (stac Least_equality 1);  | 
| 435 | 473  | 
by (REPEAT_FIRST (ares_tac [eqpoll_refl, nat_into_Ord, refl]));  | 
| 4091 | 474  | 
by (asm_simp_tac (simpset() addsimps [lt_nat_in_nat RS nat_eqpoll_iff]) 1);  | 
475  | 
by (blast_tac (claset() addSEs [lt_irrefl]) 1);  | 
|
| 760 | 476  | 
qed "nat_into_Card";  | 
| 435 | 477  | 
|
478  | 
(*Part of Kunen's Lemma 10.6*)  | 
|
| 5137 | 479  | 
Goal "[| succ(n) lepoll n; n:nat |] ==> P";  | 
| 437 | 480  | 
by (rtac (nat_lepoll_imp_le RS lt_irrefl) 1);  | 
| 435 | 481  | 
by (REPEAT (ares_tac [nat_succI] 1));  | 
| 760 | 482  | 
qed "succ_lepoll_natE";  | 
| 435 | 483  | 
|
484  | 
||
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
485  | 
(** lepoll, lesspoll and natural numbers **)  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
486  | 
|
| 5067 | 487  | 
Goalw [lesspoll_def]  | 
| 5137 | 488  | 
"[| A lepoll m; m:nat |] ==> A lesspoll succ(m)";  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
489  | 
by (rtac conjI 1);  | 
| 4091 | 490  | 
by (blast_tac (claset() addIs [subset_imp_lepoll RSN (2,lepoll_trans)]) 1);  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
491  | 
by (rtac notI 1);  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
492  | 
by (dresolve_tac [eqpoll_sym RS eqpoll_imp_lepoll] 1);  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
493  | 
by (dtac lepoll_trans 1 THEN assume_tac 1);  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
494  | 
by (etac succ_lepoll_natE 1 THEN assume_tac 1);  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
495  | 
qed "lepoll_imp_lesspoll_succ";  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
496  | 
|
| 5067 | 497  | 
Goalw [lesspoll_def, lepoll_def, eqpoll_def, bij_def]  | 
| 5137 | 498  | 
"[| A lesspoll succ(m); m:nat |] ==> A lepoll m";  | 
| 
3736
 
39ee3d31cfbc
Much tidying including step_tac -> clarify_tac or safe_tac; sometimes
 
paulson 
parents: 
3016 
diff
changeset
 | 
499  | 
by (Clarify_tac 1);  | 
| 4091 | 500  | 
by (blast_tac (claset() addSIs [inj_not_surj_succ]) 1);  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
501  | 
qed "lesspoll_succ_imp_lepoll";  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
502  | 
|
| 5137 | 503  | 
Goal "m:nat ==> A lesspoll succ(m) <-> A lepoll m";  | 
| 4091 | 504  | 
by (blast_tac (claset() addSIs [lepoll_imp_lesspoll_succ,  | 
| 1461 | 505  | 
lesspoll_succ_imp_lepoll]) 1);  | 
| 1031 | 506  | 
qed "lesspoll_succ_iff";  | 
507  | 
||
| 5137 | 508  | 
Goal "[| A lepoll succ(m); m:nat |] ==> \  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
509  | 
\ A lepoll m | A eqpoll succ(m)";  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
510  | 
by (rtac disjCI 1);  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
511  | 
by (rtac lesspoll_succ_imp_lepoll 1);  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
512  | 
by (assume_tac 2);  | 
| 4091 | 513  | 
by (asm_simp_tac (simpset() addsimps [lesspoll_def]) 1);  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
514  | 
qed "lepoll_succ_disj";  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
515  | 
|
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
516  | 
|
| 435 | 517  | 
(*** The first infinite cardinal: Omega, or nat ***)  | 
518  | 
||
519  | 
(*This implies Kunen's Lemma 10.6*)  | 
|
| 5137 | 520  | 
Goal "[| n<i; n:nat |] ==> ~ i lepoll n";  | 
| 437 | 521  | 
by (rtac notI 1);  | 
| 435 | 522  | 
by (rtac succ_lepoll_natE 1 THEN assume_tac 2);  | 
523  | 
by (rtac lepoll_trans 1 THEN assume_tac 2);  | 
|
| 437 | 524  | 
by (etac ltE 1);  | 
| 435 | 525  | 
by (REPEAT (ares_tac [Ord_succ_subsetI RS subset_imp_lepoll] 1));  | 
| 760 | 526  | 
qed "lt_not_lepoll";  | 
| 435 | 527  | 
|
| 5137 | 528  | 
Goal "[| Ord(i); n:nat |] ==> i eqpoll n <-> i=n";  | 
| 437 | 529  | 
by (rtac iffI 1);  | 
| 4091 | 530  | 
by (asm_simp_tac (simpset() addsimps [eqpoll_refl]) 2);  | 
| 435 | 531  | 
by (rtac Ord_linear_lt 1);  | 
532  | 
by (REPEAT_SOME (eresolve_tac [asm_rl, nat_into_Ord]));  | 
|
533  | 
by (etac (lt_nat_in_nat RS nat_eqpoll_iff RS iffD1) 1 THEN  | 
|
534  | 
REPEAT (assume_tac 1));  | 
|
535  | 
by (rtac (lt_not_lepoll RS notE) 1 THEN (REPEAT (assume_tac 1)));  | 
|
| 437 | 536  | 
by (etac eqpoll_imp_lepoll 1);  | 
| 760 | 537  | 
qed "Ord_nat_eqpoll_iff";  | 
| 435 | 538  | 
|
| 5067 | 539  | 
Goalw [Card_def,cardinal_def] "Card(nat)";  | 
| 2033 | 540  | 
by (stac Least_equality 1);  | 
| 437 | 541  | 
by (REPEAT_FIRST (ares_tac [eqpoll_refl, Ord_nat, refl]));  | 
542  | 
by (etac ltE 1);  | 
|
| 4091 | 543  | 
by (asm_simp_tac (simpset() addsimps [eqpoll_iff, lt_not_lepoll, ltI]) 1);  | 
| 760 | 544  | 
qed "Card_nat";  | 
| 435 | 545  | 
|
| 437 | 546  | 
(*Allows showing that |i| is a limit cardinal*)  | 
| 5137 | 547  | 
Goal "nat le i ==> nat le |i|";  | 
| 437 | 548  | 
by (rtac (Card_nat RS Card_cardinal_eq RS subst) 1);  | 
549  | 
by (etac cardinal_mono 1);  | 
|
| 760 | 550  | 
qed "nat_le_cardinal";  | 
| 437 | 551  | 
|
| 
571
 
0b03ce5b62f7
ZF/Cardinal: some results moved here from CardinalArith
 
lcp 
parents: 
522 
diff
changeset
 | 
552  | 
|
| 
 
0b03ce5b62f7
ZF/Cardinal: some results moved here from CardinalArith
 
lcp 
parents: 
522 
diff
changeset
 | 
553  | 
(*** Towards Cardinal Arithmetic ***)  | 
| 
 
0b03ce5b62f7
ZF/Cardinal: some results moved here from CardinalArith
 
lcp 
parents: 
522 
diff
changeset
 | 
554  | 
(** Congruence laws for successor, cardinal addition and multiplication **)  | 
| 
 
0b03ce5b62f7
ZF/Cardinal: some results moved here from CardinalArith
 
lcp 
parents: 
522 
diff
changeset
 | 
555  | 
|
| 
 
0b03ce5b62f7
ZF/Cardinal: some results moved here from CardinalArith
 
lcp 
parents: 
522 
diff
changeset
 | 
556  | 
(*Congruence law for cons under equipollence*)  | 
| 5067 | 557  | 
Goalw [lepoll_def]  | 
| 5137 | 558  | 
"[| A lepoll B; b ~: B |] ==> cons(a,A) lepoll cons(b,B)";  | 
| 4152 | 559  | 
by Safe_tac;  | 
| 6068 | 560  | 
by (res_inst_tac [("x", "lam y: cons(a,A). if y=a then b else f`y")] exI 1);
 | 
561  | 
by (res_inst_tac [("d","%z. if z:B then converse(f)`z else a")] 
 | 
|
| 
571
 
0b03ce5b62f7
ZF/Cardinal: some results moved here from CardinalArith
 
lcp 
parents: 
522 
diff
changeset
 | 
562  | 
lam_injective 1);  | 
| 4091 | 563  | 
by (asm_simp_tac (simpset() addsimps [inj_is_fun RS apply_type, cons_iff]  | 
| 
571
 
0b03ce5b62f7
ZF/Cardinal: some results moved here from CardinalArith
 
lcp 
parents: 
522 
diff
changeset
 | 
564  | 
setloop etac consE') 1);  | 
| 
6176
 
707b6f9859d2
tidied, with left_inverse & right_inverse as default simprules
 
paulson 
parents: 
6112 
diff
changeset
 | 
565  | 
by (asm_simp_tac (simpset() addsimps [inj_is_fun RS apply_type]  | 
| 
571
 
0b03ce5b62f7
ZF/Cardinal: some results moved here from CardinalArith
 
lcp 
parents: 
522 
diff
changeset
 | 
566  | 
setloop etac consE') 1);  | 
| 760 | 567  | 
qed "cons_lepoll_cong";  | 
| 
571
 
0b03ce5b62f7
ZF/Cardinal: some results moved here from CardinalArith
 
lcp 
parents: 
522 
diff
changeset
 | 
568  | 
|
| 5268 | 569  | 
Goal "[| A eqpoll B; a ~: A; b ~: B |] ==> cons(a,A) eqpoll cons(b,B)";  | 
| 4091 | 570  | 
by (asm_full_simp_tac (simpset() addsimps [eqpoll_iff, cons_lepoll_cong]) 1);  | 
| 760 | 571  | 
qed "cons_eqpoll_cong";  | 
| 
571
 
0b03ce5b62f7
ZF/Cardinal: some results moved here from CardinalArith
 
lcp 
parents: 
522 
diff
changeset
 | 
572  | 
|
| 5268 | 573  | 
Goal "[| a ~: A; b ~: B |] ==> \  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
574  | 
\ cons(a,A) lepoll cons(b,B) <-> A lepoll B";  | 
| 4091 | 575  | 
by (blast_tac (claset() addIs [cons_lepoll_cong, cons_lepoll_consD]) 1);  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
576  | 
qed "cons_lepoll_cons_iff";  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
577  | 
|
| 5268 | 578  | 
Goal "[| a ~: A; b ~: B |] ==> \  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
579  | 
\ cons(a,A) eqpoll cons(b,B) <-> A eqpoll B";  | 
| 4091 | 580  | 
by (blast_tac (claset() addIs [cons_eqpoll_cong, cons_eqpoll_consD]) 1);  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
581  | 
qed "cons_eqpoll_cons_iff";  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
582  | 
|
| 5067 | 583  | 
Goalw [succ_def] "{a} eqpoll 1";
 | 
| 4091 | 584  | 
by (blast_tac (claset() addSIs [eqpoll_refl RS cons_eqpoll_cong]) 1);  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
585  | 
qed "singleton_eqpoll_1";  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
586  | 
|
| 5067 | 587  | 
Goal "|{a}| = 1";
 | 
| 1609 | 588  | 
by (resolve_tac [singleton_eqpoll_1 RS cardinal_cong RS trans] 1);  | 
| 4091 | 589  | 
by (simp_tac (simpset() addsimps [nat_into_Card RS Card_cardinal_eq]) 1);  | 
| 1609 | 590  | 
qed "cardinal_singleton";  | 
591  | 
||
| 
571
 
0b03ce5b62f7
ZF/Cardinal: some results moved here from CardinalArith
 
lcp 
parents: 
522 
diff
changeset
 | 
592  | 
(*Congruence law for succ under equipollence*)  | 
| 5067 | 593  | 
Goalw [succ_def]  | 
| 5137 | 594  | 
"A eqpoll B ==> succ(A) eqpoll succ(B)";  | 
| 
571
 
0b03ce5b62f7
ZF/Cardinal: some results moved here from CardinalArith
 
lcp 
parents: 
522 
diff
changeset
 | 
595  | 
by (REPEAT (ares_tac [cons_eqpoll_cong, mem_not_refl] 1));  | 
| 760 | 596  | 
qed "succ_eqpoll_cong";  | 
| 
571
 
0b03ce5b62f7
ZF/Cardinal: some results moved here from CardinalArith
 
lcp 
parents: 
522 
diff
changeset
 | 
597  | 
|
| 
 
0b03ce5b62f7
ZF/Cardinal: some results moved here from CardinalArith
 
lcp 
parents: 
522 
diff
changeset
 | 
598  | 
(*Congruence law for + under equipollence*)  | 
| 5067 | 599  | 
Goalw [eqpoll_def]  | 
| 5137 | 600  | 
"[| A eqpoll C; B eqpoll D |] ==> A+B eqpoll C+D";  | 
| 4091 | 601  | 
by (blast_tac (claset() addSIs [sum_bij]) 1);  | 
| 760 | 602  | 
qed "sum_eqpoll_cong";  | 
| 
571
 
0b03ce5b62f7
ZF/Cardinal: some results moved here from CardinalArith
 
lcp 
parents: 
522 
diff
changeset
 | 
603  | 
|
| 
 
0b03ce5b62f7
ZF/Cardinal: some results moved here from CardinalArith
 
lcp 
parents: 
522 
diff
changeset
 | 
604  | 
(*Congruence law for * under equipollence*)  | 
| 5067 | 605  | 
Goalw [eqpoll_def]  | 
| 5137 | 606  | 
"[| A eqpoll C; B eqpoll D |] ==> A*B eqpoll C*D";  | 
| 4091 | 607  | 
by (blast_tac (claset() addSIs [prod_bij]) 1);  | 
| 760 | 608  | 
qed "prod_eqpoll_cong";  | 
| 
571
 
0b03ce5b62f7
ZF/Cardinal: some results moved here from CardinalArith
 
lcp 
parents: 
522 
diff
changeset
 | 
609  | 
|
| 5067 | 610  | 
Goalw [eqpoll_def]  | 
| 5137 | 611  | 
"[| f: inj(A,B); A Int B = 0 |] ==> A Un (B - range(f)) eqpoll B";  | 
| 
571
 
0b03ce5b62f7
ZF/Cardinal: some results moved here from CardinalArith
 
lcp 
parents: 
522 
diff
changeset
 | 
612  | 
by (rtac exI 1);  | 
| 6068 | 613  | 
by (res_inst_tac [("c", "%x. if x:A then f`x else x"),
 | 
614  | 
                  ("d", "%y. if y: range(f) then converse(f)`y else y")] 
 | 
|
| 
571
 
0b03ce5b62f7
ZF/Cardinal: some results moved here from CardinalArith
 
lcp 
parents: 
522 
diff
changeset
 | 
615  | 
lam_bijective 1);  | 
| 4091 | 616  | 
by (blast_tac (claset() addSIs [if_type, inj_is_fun RS apply_type]) 1);  | 
| 
571
 
0b03ce5b62f7
ZF/Cardinal: some results moved here from CardinalArith
 
lcp 
parents: 
522 
diff
changeset
 | 
617  | 
by (asm_simp_tac  | 
| 5137 | 618  | 
(simpset() addsimps [inj_converse_fun RS apply_funtype]) 1);  | 
| 
6176
 
707b6f9859d2
tidied, with left_inverse & right_inverse as default simprules
 
paulson 
parents: 
6112 
diff
changeset
 | 
619  | 
by (asm_simp_tac (simpset() addsimps [inj_is_fun RS apply_rangeI]  | 
| 
571
 
0b03ce5b62f7
ZF/Cardinal: some results moved here from CardinalArith
 
lcp 
parents: 
522 
diff
changeset
 | 
620  | 
setloop etac UnE') 1);  | 
| 
6176
 
707b6f9859d2
tidied, with left_inverse & right_inverse as default simprules
 
paulson 
parents: 
6112 
diff
changeset
 | 
621  | 
by (asm_simp_tac (simpset() addsimps [inj_converse_fun RS apply_funtype]) 1);  | 
| 
5265
 
9d1d4c43c76d
Disjointness reasoning by  AddEs [equals0E, sym RS equals0E]
 
paulson 
parents: 
5242 
diff
changeset
 | 
622  | 
by (Blast_tac 1);  | 
| 760 | 623  | 
qed "inj_disjoint_eqpoll";  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
624  | 
|
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
625  | 
|
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
626  | 
(*** Lemmas by Krzysztof Grabczewski. New proofs using cons_lepoll_cons.  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
627  | 
Could easily generalise from succ to cons. ***)  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
628  | 
|
| 
1055
 
67f5344605b7
Renamed diff_sing_lepoll, lepoll_diff_sing and diff_sing_eqpoll
 
lcp 
parents: 
1031 
diff
changeset
 | 
629  | 
(*If A has at most n+1 elements and a:A then A-{a} has at most n.*)
 | 
| 5067 | 630  | 
Goalw [succ_def]  | 
| 5137 | 631  | 
      "[| a:A;  A lepoll succ(n) |] ==> A - {a} lepoll n";
 | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
632  | 
by (rtac cons_lepoll_consD 1);  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
633  | 
by (rtac mem_not_refl 3);  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
634  | 
by (eresolve_tac [cons_Diff RS ssubst] 1);  | 
| 4152 | 635  | 
by Safe_tac;  | 
| 
1055
 
67f5344605b7
Renamed diff_sing_lepoll, lepoll_diff_sing and diff_sing_eqpoll
 
lcp 
parents: 
1031 
diff
changeset
 | 
636  | 
qed "Diff_sing_lepoll";  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
637  | 
|
| 
1055
 
67f5344605b7
Renamed diff_sing_lepoll, lepoll_diff_sing and diff_sing_eqpoll
 
lcp 
parents: 
1031 
diff
changeset
 | 
638  | 
(*If A has at least n+1 elements then A-{a} has at least n.*)
 | 
| 5067 | 639  | 
Goalw [succ_def]  | 
| 5137 | 640  | 
      "[| succ(n) lepoll A |] ==> n lepoll A - {a}";
 | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
641  | 
by (rtac cons_lepoll_consD 1);  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
642  | 
by (rtac mem_not_refl 2);  | 
| 2875 | 643  | 
by (Blast_tac 2);  | 
| 4091 | 644  | 
by (blast_tac (claset() addIs [subset_imp_lepoll RSN (2, lepoll_trans)]) 1);  | 
| 
1055
 
67f5344605b7
Renamed diff_sing_lepoll, lepoll_diff_sing and diff_sing_eqpoll
 
lcp 
parents: 
1031 
diff
changeset
 | 
645  | 
qed "lepoll_Diff_sing";  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
646  | 
|
| 5137 | 647  | 
Goal "[| a:A; A eqpoll succ(n) |] ==> A - {a} eqpoll n";
 | 
| 4091 | 648  | 
by (blast_tac (claset() addSIs [eqpollI] addSEs [eqpollE]  | 
| 
1055
 
67f5344605b7
Renamed diff_sing_lepoll, lepoll_diff_sing and diff_sing_eqpoll
 
lcp 
parents: 
1031 
diff
changeset
 | 
649  | 
addIs [Diff_sing_lepoll,lepoll_Diff_sing]) 1);  | 
| 
 
67f5344605b7
Renamed diff_sing_lepoll, lepoll_diff_sing and diff_sing_eqpoll
 
lcp 
parents: 
1031 
diff
changeset
 | 
650  | 
qed "Diff_sing_eqpoll";  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
651  | 
|
| 5137 | 652  | 
Goal "[| A lepoll 1; a:A |] ==> A = {a}";
 | 
| 
1055
 
67f5344605b7
Renamed diff_sing_lepoll, lepoll_diff_sing and diff_sing_eqpoll
 
lcp 
parents: 
1031 
diff
changeset
 | 
653  | 
by (forward_tac [Diff_sing_lepoll] 1);  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
654  | 
by (assume_tac 1);  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
655  | 
by (dtac lepoll_0_is_0 1);  | 
| 4091 | 656  | 
by (blast_tac (claset() addEs [equalityE]) 1);  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
657  | 
qed "lepoll_1_is_sing";  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
658  | 
|
| 5067 | 659  | 
Goalw [lepoll_def] "A Un B lepoll A+B";  | 
| 6068 | 660  | 
by (res_inst_tac [("x",
 | 
661  | 
"lam x: A Un B. if x:A then Inl(x) else Inr(x)")] exI 1);  | 
|
| 1609 | 662  | 
by (res_inst_tac [("d","%z. snd(z)")] lam_injective 1);
 | 
| 6068 | 663  | 
by (asm_full_simp_tac (simpset() addsimps [Inl_def, Inr_def]) 2);  | 
664  | 
by Auto_tac;  | 
|
| 1609 | 665  | 
qed "Un_lepoll_sum";  | 
666  | 
||
| 
5284
 
c77e9dd9bafc
Tidying of AC, especially of AC16_WO4 using a locale
 
paulson 
parents: 
5268 
diff
changeset
 | 
667  | 
Goal "[| well_ord(X,R); well_ord(Y,S) |] ==> EX T. well_ord(X Un Y, T)";  | 
| 
 
c77e9dd9bafc
Tidying of AC, especially of AC16_WO4 using a locale
 
paulson 
parents: 
5268 
diff
changeset
 | 
668  | 
by (eresolve_tac [well_ord_radd RS (Un_lepoll_sum RS lepoll_well_ord)] 1);  | 
| 
 
c77e9dd9bafc
Tidying of AC, especially of AC16_WO4 using a locale
 
paulson 
parents: 
5268 
diff
changeset
 | 
669  | 
by (assume_tac 1);  | 
| 
 
c77e9dd9bafc
Tidying of AC, especially of AC16_WO4 using a locale
 
paulson 
parents: 
5268 
diff
changeset
 | 
670  | 
qed "well_ord_Un";  | 
| 
 
c77e9dd9bafc
Tidying of AC, especially of AC16_WO4 using a locale
 
paulson 
parents: 
5268 
diff
changeset
 | 
671  | 
|
| 5242 | 672  | 
(*Krzysztof Grabczewski*)  | 
673  | 
Goalw [eqpoll_def] "A Int B = 0 ==> A Un B eqpoll A + B";  | 
|
| 6068 | 674  | 
by (res_inst_tac [("x","lam a:A Un B. if a:A then Inl(a) else Inr(a)")] exI 1);
 | 
| 5242 | 675  | 
by (res_inst_tac [("d","%z. case(%x. x, %x. x, z)")] lam_bijective 1);
 | 
| 
5265
 
9d1d4c43c76d
Disjointness reasoning by  AddEs [equals0E, sym RS equals0E]
 
paulson 
parents: 
5242 
diff
changeset
 | 
676  | 
by Auto_tac;  | 
| 5242 | 677  | 
qed "disj_Un_eqpoll_sum";  | 
678  | 
||
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
679  | 
|
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
680  | 
(*** Finite and infinite sets ***)  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
681  | 
|
| 5067 | 682  | 
Goalw [Finite_def] "Finite(0)";  | 
| 4091 | 683  | 
by (blast_tac (claset() addSIs [eqpoll_refl, nat_0I]) 1);  | 
| 1609 | 684  | 
qed "Finite_0";  | 
685  | 
||
| 5067 | 686  | 
Goalw [Finite_def]  | 
| 5137 | 687  | 
"[| A lepoll n; n:nat |] ==> Finite(A)";  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
688  | 
by (etac rev_mp 1);  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
689  | 
by (etac nat_induct 1);  | 
| 4091 | 690  | 
by (blast_tac (claset() addSDs [lepoll_0_is_0] addSIs [eqpoll_refl,nat_0I]) 1);  | 
| 5137 | 691  | 
by (blast_tac (claset() addSDs [lepoll_succ_disj]) 1);  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
692  | 
qed "lepoll_nat_imp_Finite";  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
693  | 
|
| 5067 | 694  | 
Goalw [Finite_def]  | 
| 5137 | 695  | 
"[| Y lepoll X; Finite(X) |] ==> Finite(Y)";  | 
| 3016 | 696  | 
by (blast_tac  | 
| 4091 | 697  | 
(claset() addSEs [eqpollE]  | 
| 3016 | 698  | 
addIs [lepoll_trans RS  | 
699  | 
rewrite_rule [Finite_def] lepoll_nat_imp_Finite]) 1);  | 
|
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
700  | 
qed "lepoll_Finite";  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
701  | 
|
| 1623 | 702  | 
bind_thm ("subset_Finite", subset_imp_lepoll RS lepoll_Finite);
 | 
703  | 
||
704  | 
bind_thm ("Finite_Diff", Diff_subset RS subset_Finite);
 | 
|
| 1609 | 705  | 
|
| 5137 | 706  | 
Goalw [Finite_def] "Finite(x) ==> Finite(cons(y,x))";  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
707  | 
by (excluded_middle_tac "y:x" 1);  | 
| 4091 | 708  | 
by (asm_simp_tac (simpset() addsimps [cons_absorb]) 2);  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
709  | 
by (etac bexE 1);  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
710  | 
by (rtac bexI 1);  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
711  | 
by (etac nat_succI 2);  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
712  | 
by (asm_simp_tac  | 
| 4091 | 713  | 
(simpset() addsimps [succ_def, cons_eqpoll_cong, mem_not_refl]) 1);  | 
| 1609 | 714  | 
qed "Finite_cons";  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
715  | 
|
| 5137 | 716  | 
Goalw [succ_def] "Finite(x) ==> Finite(succ(x))";  | 
| 1609 | 717  | 
by (etac Finite_cons 1);  | 
718  | 
qed "Finite_succ";  | 
|
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
719  | 
|
| 5067 | 720  | 
Goalw [Finite_def]  | 
| 5137 | 721  | 
"[| Ord(i); ~ Finite(i) |] ==> nat le i";  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
722  | 
by (eresolve_tac [Ord_nat RSN (2,Ord_linear2)] 1);  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
723  | 
by (assume_tac 2);  | 
| 4091 | 724  | 
by (blast_tac (claset() addSIs [eqpoll_refl] addSEs [ltE]) 1);  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
725  | 
qed "nat_le_infinite_Ord";  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
726  | 
|
| 5067 | 727  | 
Goalw [Finite_def, eqpoll_def]  | 
| 5137 | 728  | 
"Finite(A) ==> EX r. well_ord(A,r)";  | 
| 4091 | 729  | 
by (blast_tac (claset() addIs [well_ord_rvimage, bij_is_inj, well_ord_Memrel,  | 
| 3016 | 730  | 
nat_into_Ord]) 1);  | 
| 1609 | 731  | 
qed "Finite_imp_well_ord";  | 
732  | 
||
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
733  | 
|
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
734  | 
(*Krzysztof Grabczewski's proof that the converse of a finite, well-ordered  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
735  | 
set is well-ordered. Proofs simplified by lcp. *)  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
736  | 
|
| 
5325
 
f7a5e06adea1
Yet more removal of "goal" commands, especially "goal ZF.thy", so ZF.thy
 
paulson 
parents: 
5284 
diff
changeset
 | 
737  | 
Goal "n:nat ==> wf[n](converse(Memrel(n)))";  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
738  | 
by (etac nat_induct 1);  | 
| 4091 | 739  | 
by (blast_tac (claset() addIs [wf_onI]) 1);  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
740  | 
by (rtac wf_onI 1);  | 
| 4091 | 741  | 
by (asm_full_simp_tac (simpset() addsimps [wf_on_def, wf_def, Memrel_iff]) 1);  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
742  | 
by (excluded_middle_tac "x:Z" 1);  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
743  | 
by (dres_inst_tac [("x", "x")] bspec 2 THEN assume_tac 2);
 | 
| 4091 | 744  | 
by (blast_tac (claset() addEs [mem_irrefl, mem_asym]) 2);  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
745  | 
by (dres_inst_tac [("x", "Z")] spec 1);
 | 
| 4091 | 746  | 
by (Blast.depth_tac (claset()) 4 1);  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
747  | 
qed "nat_wf_on_converse_Memrel";  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
748  | 
|
| 5137 | 749  | 
Goal "n:nat ==> well_ord(n,converse(Memrel(n)))";  | 
| 3894 | 750  | 
by (forward_tac [transfer thy Ord_nat RS Ord_in_Ord RS well_ord_Memrel] 1);  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
751  | 
by (rewtac well_ord_def);  | 
| 4091 | 752  | 
by (blast_tac (claset() addSIs [tot_ord_converse,  | 
| 3016 | 753  | 
nat_wf_on_converse_Memrel]) 1);  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
754  | 
qed "nat_well_ord_converse_Memrel";  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
755  | 
|
| 5268 | 756  | 
Goal "[| well_ord(A,r); \  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
757  | 
\ well_ord(ordertype(A,r), converse(Memrel(ordertype(A, r)))) \  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
758  | 
\ |] ==> well_ord(A,converse(r))";  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
759  | 
by (resolve_tac [well_ord_Int_iff RS iffD1] 1);  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
760  | 
by (forward_tac [ordermap_bij RS bij_is_inj RS well_ord_rvimage] 1);  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
761  | 
by (assume_tac 1);  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
762  | 
by (asm_full_simp_tac  | 
| 4091 | 763  | 
(simpset() addsimps [rvimage_converse, converse_Int, converse_prod,  | 
| 1461 | 764  | 
ordertype_ord_iso RS ord_iso_rvimage_eq]) 1);  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
765  | 
qed "well_ord_converse";  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
766  | 
|
| 5268 | 767  | 
Goal "[| well_ord(A,r); A eqpoll n; n:nat |] ==> ordertype(A,r)=n";  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
768  | 
by (rtac (Ord_ordertype RS Ord_nat_eqpoll_iff RS iffD1) 1 THEN  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
769  | 
REPEAT (assume_tac 1));  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
770  | 
by (rtac eqpoll_trans 1 THEN assume_tac 2);  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
771  | 
by (rewtac eqpoll_def);  | 
| 4091 | 772  | 
by (blast_tac (claset() addSIs [ordermap_bij RS bij_converse_bij]) 1);  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
773  | 
qed "ordertype_eq_n";  | 
| 
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
774  | 
|
| 5067 | 775  | 
Goalw [Finite_def]  | 
| 5137 | 776  | 
"[| Finite(A); well_ord(A,r) |] ==> well_ord(A,converse(r))";  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
777  | 
by (rtac well_ord_converse 1 THEN assume_tac 1);  | 
| 4091 | 778  | 
by (blast_tac (claset() addDs [ordertype_eq_n]  | 
| 3016 | 779  | 
addSIs [nat_well_ord_converse_Memrel]) 1);  | 
| 
833
 
ba386650df2c
Proved cons_lepoll_consD, succ_lepoll_succD, cons_eqpoll_consD,
 
lcp 
parents: 
803 
diff
changeset
 | 
780  | 
qed "Finite_well_ord_converse";  |