99 lemma eqpoll_sym: "X \<approx> Y ==> Y \<approx> X" |
99 lemma eqpoll_sym: "X \<approx> Y ==> Y \<approx> X" |
100 apply (unfold eqpoll_def) |
100 apply (unfold eqpoll_def) |
101 apply (blast intro: bij_converse_bij) |
101 apply (blast intro: bij_converse_bij) |
102 done |
102 done |
103 |
103 |
104 lemma eqpoll_trans: |
104 lemma eqpoll_trans [trans]: |
105 "[| X \<approx> Y; Y \<approx> Z |] ==> X \<approx> Z" |
105 "[| X \<approx> Y; Y \<approx> Z |] ==> X \<approx> Z" |
106 apply (unfold eqpoll_def) |
106 apply (unfold eqpoll_def) |
107 apply (blast intro: comp_bij) |
107 apply (blast intro: comp_bij) |
108 done |
108 done |
109 |
109 |
120 lemmas le_imp_lepoll = le_imp_subset [THEN subset_imp_lepoll] |
120 lemmas le_imp_lepoll = le_imp_subset [THEN subset_imp_lepoll] |
121 |
121 |
122 lemma eqpoll_imp_lepoll: "X \<approx> Y ==> X \<lesssim> Y" |
122 lemma eqpoll_imp_lepoll: "X \<approx> Y ==> X \<lesssim> Y" |
123 by (unfold eqpoll_def bij_def lepoll_def, blast) |
123 by (unfold eqpoll_def bij_def lepoll_def, blast) |
124 |
124 |
125 lemma lepoll_trans: "[| X \<lesssim> Y; Y \<lesssim> Z |] ==> X \<lesssim> Z" |
125 lemma lepoll_trans [trans]: "[| X \<lesssim> Y; Y \<lesssim> Z |] ==> X \<lesssim> Z" |
126 apply (unfold lepoll_def) |
126 apply (unfold lepoll_def) |
127 apply (blast intro: comp_inj) |
127 apply (blast intro: comp_inj) |
128 done |
128 done |
|
129 |
|
130 lemma eq_lepoll_trans [trans]: "[| X \<approx> Y; Y \<lesssim> Z |] ==> X \<lesssim> Z" |
|
131 by (blast intro: eqpoll_imp_lepoll lepoll_trans) |
|
132 |
|
133 lemma lepoll_eq_trans [trans]: "[| X \<lesssim> Y; Y \<approx> Z |] ==> X \<lesssim> Z" |
|
134 by (blast intro: eqpoll_imp_lepoll lepoll_trans) |
129 |
135 |
130 (*Asymmetry law*) |
136 (*Asymmetry law*) |
131 lemma eqpollI: "[| X \<lesssim> Y; Y \<lesssim> X |] ==> X \<approx> Y" |
137 lemma eqpollI: "[| X \<lesssim> Y; Y \<lesssim> X |] ==> X \<approx> Y" |
132 apply (unfold lepoll_def eqpoll_def) |
138 apply (unfold lepoll_def eqpoll_def) |
133 apply (elim exE) |
139 apply (elim exE) |
192 apply (unfold lesspoll_def) |
198 apply (unfold lesspoll_def) |
193 apply (blast intro!: eqpollI elim!: eqpollE) |
199 apply (blast intro!: eqpollI elim!: eqpollE) |
194 done |
200 done |
195 |
201 |
196 lemma inj_not_surj_succ: |
202 lemma inj_not_surj_succ: |
197 "[| f \<in> inj(A, succ(m)); f \<notin> surj(A, succ(m)) |] ==> \<exists>f. f:inj(A,m)" |
203 "[| f \<in> inj(A, succ(m)); f \<notin> surj(A, succ(m)) |] ==> \<exists>f. f \<in> inj(A,m)" |
198 apply (unfold inj_def surj_def) |
204 apply (unfold inj_def surj_def) |
199 apply (safe del: succE) |
205 apply (safe del: succE) |
200 apply (erule swap, rule exI) |
206 apply (erule swap, rule exI) |
201 apply (rule_tac a = "\<lambda>z\<in>A. if f`z=m then y else f`z" in CollectI) |
207 apply (rule_tac a = "\<lambda>z\<in>A. if f`z=m then y else f`z" in CollectI) |
202 txt{*the typing condition*} |
208 txt{*the typing condition*} |
206 apply blast |
212 apply blast |
207 done |
213 done |
208 |
214 |
209 (** Variations on transitivity **) |
215 (** Variations on transitivity **) |
210 |
216 |
211 lemma lesspoll_trans: |
217 lemma lesspoll_trans [trans]: |
212 "[| X \<prec> Y; Y \<prec> Z |] ==> X \<prec> Z" |
218 "[| X \<prec> Y; Y \<prec> Z |] ==> X \<prec> Z" |
213 apply (unfold lesspoll_def) |
219 apply (unfold lesspoll_def) |
214 apply (blast elim!: eqpollE intro: eqpollI lepoll_trans) |
220 apply (blast elim!: eqpollE intro: eqpollI lepoll_trans) |
215 done |
221 done |
216 |
222 |
217 lemma lesspoll_trans1: |
223 lemma lesspoll_trans1 [trans]: |
218 "[| X \<lesssim> Y; Y \<prec> Z |] ==> X \<prec> Z" |
224 "[| X \<lesssim> Y; Y \<prec> Z |] ==> X \<prec> Z" |
219 apply (unfold lesspoll_def) |
225 apply (unfold lesspoll_def) |
220 apply (blast elim!: eqpollE intro: eqpollI lepoll_trans) |
226 apply (blast elim!: eqpollE intro: eqpollI lepoll_trans) |
221 done |
227 done |
222 |
228 |
223 lemma lesspoll_trans2: |
229 lemma lesspoll_trans2 [trans]: |
224 "[| X \<prec> Y; Y \<lesssim> Z |] ==> X \<prec> Z" |
230 "[| X \<prec> Y; Y \<lesssim> Z |] ==> X \<prec> Z" |
225 apply (unfold lesspoll_def) |
231 apply (unfold lesspoll_def) |
226 apply (blast elim!: eqpollE intro: eqpollI lepoll_trans) |
232 apply (blast elim!: eqpollE intro: eqpollI lepoll_trans) |
227 done |
233 done |
|
234 |
|
235 lemma eq_lesspoll_trans [trans]: |
|
236 "[| X \<approx> Y; Y \<prec> Z |] ==> X \<prec> Z" |
|
237 by (blast intro: eqpoll_imp_lepoll lesspoll_trans1) |
|
238 |
|
239 lemma lesspoll_eq_trans [trans]: |
|
240 "[| X \<prec> Y; Y \<approx> Z |] ==> X \<prec> Z" |
|
241 by (blast intro: eqpoll_imp_lepoll lesspoll_trans2) |
228 |
242 |
229 |
243 |
230 (** LEAST -- the least number operator [from HOL/Univ.ML] **) |
244 (** LEAST -- the least number operator [from HOL/Univ.ML] **) |
231 |
245 |
232 lemma Least_equality: |
246 lemma Least_equality: |
309 done |
323 done |
310 |
324 |
311 (* @{term"Ord(A) ==> |A| \<approx> A"} *) |
325 (* @{term"Ord(A) ==> |A| \<approx> A"} *) |
312 lemmas Ord_cardinal_eqpoll = well_ord_Memrel [THEN well_ord_cardinal_eqpoll] |
326 lemmas Ord_cardinal_eqpoll = well_ord_Memrel [THEN well_ord_cardinal_eqpoll] |
313 |
327 |
|
328 lemma Ord_cardinal_idem: "Ord(A) \<Longrightarrow> ||A|| = |A|" |
|
329 by (rule Ord_cardinal_eqpoll [THEN cardinal_cong]) |
|
330 |
314 lemma well_ord_cardinal_eqE: |
331 lemma well_ord_cardinal_eqE: |
315 "[| well_ord(X,r); well_ord(Y,s); |X| = |Y| |] ==> X \<approx> Y" |
332 "[| well_ord(X,r); well_ord(Y,s); |X| = |Y| |] ==> X \<approx> Y" |
316 apply (rule eqpoll_sym [THEN eqpoll_trans]) |
333 apply (rule eqpoll_sym [THEN eqpoll_trans]) |
317 apply (erule well_ord_cardinal_eqpoll) |
334 apply (erule well_ord_cardinal_eqpoll) |
318 apply (simp (no_asm_simp) add: well_ord_cardinal_eqpoll) |
335 apply (simp (no_asm_simp) add: well_ord_cardinal_eqpoll) |
333 lemma Card_cardinal_eq: "Card(K) ==> |K| = K" |
350 lemma Card_cardinal_eq: "Card(K) ==> |K| = K" |
334 apply (unfold Card_def) |
351 apply (unfold Card_def) |
335 apply (erule sym) |
352 apply (erule sym) |
336 done |
353 done |
337 |
354 |
338 (* Could replace the @{term"~(j \<approx> i)"} by @{term"~(i \<lesssim> j)"}. *) |
355 (* Could replace the @{term"~(j \<approx> i)"} by @{term"~(i \<preceq> j)"}. *) |
339 lemma CardI: "[| Ord(i); !!j. j<i ==> ~(j \<approx> i) |] ==> Card(i)" |
356 lemma CardI: "[| Ord(i); !!j. j<i ==> ~(j \<approx> i) |] ==> Card(i)" |
340 apply (unfold Card_def cardinal_def) |
357 apply (unfold Card_def cardinal_def) |
341 apply (subst Least_equality) |
358 apply (subst Least_equality) |
342 apply (blast intro: eqpoll_refl )+ |
359 apply (blast intro: eqpoll_refl )+ |
343 done |
360 done |
397 apply (erule eqpoll_trans) |
414 apply (erule eqpoll_trans) |
398 apply (best intro: LeastI ) |
415 apply (best intro: LeastI ) |
399 done |
416 done |
400 |
417 |
401 (*Kunen's Lemma 10.5*) |
418 (*Kunen's Lemma 10.5*) |
402 lemma cardinal_eq_lemma: "[| |i| \<le> j; j \<le> i |] ==> |j| = |i|" |
419 lemma cardinal_eq_lemma: |
403 apply (rule eqpollI [THEN cardinal_cong]) |
420 assumes i:"|i| \<le> j" and j: "j \<le> i" shows "|j| = |i|" |
404 apply (erule le_imp_lepoll) |
421 proof (rule eqpollI [THEN cardinal_cong]) |
405 apply (rule lepoll_trans) |
422 show "j \<lesssim> i" by (rule le_imp_lepoll [OF j]) |
406 apply (erule_tac [2] le_imp_lepoll) |
423 next |
407 apply (rule eqpoll_sym [THEN eqpoll_imp_lepoll]) |
424 have Oi: "Ord(i)" using j by (rule le_Ord2) |
408 apply (rule Ord_cardinal_eqpoll) |
425 hence "i \<approx> |i|" |
409 apply (elim ltE Ord_succD) |
426 by (blast intro: Ord_cardinal_eqpoll eqpoll_sym) |
410 done |
427 also have "... \<lesssim> j" |
|
428 by (blast intro: le_imp_lepoll i) |
|
429 finally show "i \<lesssim> j" . |
|
430 qed |
411 |
431 |
412 lemma cardinal_mono: "i \<le> j ==> |i| \<le> |j|" |
432 lemma cardinal_mono: "i \<le> j ==> |i| \<le> |j|" |
413 apply (rule_tac i = "|i|" and j = "|j|" in Ord_linear_le) |
433 apply (rule_tac i = "|i|" and j = "|j|" in Ord_linear_le) |
414 apply (safe intro!: Ord_cardinal le_eqI) |
434 apply (safe intro!: Ord_cardinal le_eqI) |
415 apply (rule cardinal_eq_lemma) |
435 apply (rule cardinal_eq_lemma) |
436 lemma Card_le_iff: "[| Ord(i); Card(K) |] ==> (K \<le> |i|) \<longleftrightarrow> (K \<le> i)" |
456 lemma Card_le_iff: "[| Ord(i); Card(K) |] ==> (K \<le> |i|) \<longleftrightarrow> (K \<le> i)" |
437 by (simp add: Card_lt_iff Card_is_Ord Ord_cardinal not_lt_iff_le [THEN iff_sym]) |
457 by (simp add: Card_lt_iff Card_is_Ord Ord_cardinal not_lt_iff_le [THEN iff_sym]) |
438 |
458 |
439 (*Can use AC or finiteness to discharge first premise*) |
459 (*Can use AC or finiteness to discharge first premise*) |
440 lemma well_ord_lepoll_imp_Card_le: |
460 lemma well_ord_lepoll_imp_Card_le: |
441 "[| well_ord(B,r); A \<lesssim> B |] ==> |A| \<le> |B|" |
461 assumes wB: "well_ord(B,r)" and AB: "A \<lesssim> B" |
442 apply (rule_tac i = "|A|" and j = "|B|" in Ord_linear_le) |
462 shows "|A| \<le> |B|" |
443 apply (safe intro!: Ord_cardinal le_eqI) |
463 proof (rule Ord_linear_le [of "|A|" "|B|", OF Ord_cardinal Ord_cardinal], assumption) |
444 apply (rule eqpollI [THEN cardinal_cong], assumption) |
464 assume BA: "|B| \<le> |A|" |
445 apply (rule lepoll_trans) |
465 from lepoll_well_ord [OF AB wB] |
446 apply (rule well_ord_cardinal_eqpoll [THEN eqpoll_sym, THEN eqpoll_imp_lepoll], assumption) |
466 obtain s where s: "well_ord(A, s)" by blast |
447 apply (erule le_imp_lepoll [THEN lepoll_trans]) |
467 have "B \<approx> |B|" by (blast intro: wB eqpoll_sym well_ord_cardinal_eqpoll) |
448 apply (rule eqpoll_imp_lepoll) |
468 also have "... \<lesssim> |A|" by (rule le_imp_lepoll [OF BA]) |
449 apply (unfold lepoll_def) |
469 also have "... \<approx> A" by (rule well_ord_cardinal_eqpoll [OF s]) |
450 apply (erule exE) |
470 finally have "B \<lesssim> A" . |
451 apply (rule well_ord_cardinal_eqpoll) |
471 hence "A \<approx> B" by (blast intro: eqpollI AB) |
452 apply (erule well_ord_rvimage, assumption) |
472 hence "|A| = |B|" by (rule cardinal_cong) |
453 done |
473 thus ?thesis by simp |
|
474 qed |
454 |
475 |
455 lemma lepoll_cardinal_le: "[| A \<lesssim> i; Ord(i) |] ==> |A| \<le> i" |
476 lemma lepoll_cardinal_le: "[| A \<lesssim> i; Ord(i) |] ==> |A| \<le> i" |
456 apply (rule le_trans) |
477 apply (rule le_trans) |
457 apply (erule well_ord_Memrel [THEN well_ord_lepoll_imp_Card_le], assumption) |
478 apply (erule well_ord_Memrel [THEN well_ord_lepoll_imp_Card_le], assumption) |
458 apply (erule Ord_cardinal_le) |
479 apply (erule Ord_cardinal_le) |
533 |
554 |
534 (*Part of Kunen's Lemma 10.6*) |
555 (*Part of Kunen's Lemma 10.6*) |
535 lemma succ_lepoll_natE: "[| succ(n) \<lesssim> n; n:nat |] ==> P" |
556 lemma succ_lepoll_natE: "[| succ(n) \<lesssim> n; n:nat |] ==> P" |
536 by (rule nat_lepoll_imp_le [THEN lt_irrefl], auto) |
557 by (rule nat_lepoll_imp_le [THEN lt_irrefl], auto) |
537 |
558 |
538 lemma n_lesspoll_nat: "n \<in> nat ==> n \<prec> nat" |
|
539 apply (unfold lesspoll_def) |
|
540 apply (fast elim!: Ord_nat [THEN [2] ltI [THEN leI, THEN le_imp_lepoll]] |
|
541 eqpoll_sym [THEN eqpoll_imp_lepoll] |
|
542 intro: Ord_nat [THEN [2] nat_succI [THEN ltI], THEN leI, |
|
543 THEN le_imp_lepoll, THEN lepoll_trans, THEN succ_lepoll_natE]) |
|
544 done |
|
545 |
|
546 lemma nat_lepoll_imp_ex_eqpoll_n: |
559 lemma nat_lepoll_imp_ex_eqpoll_n: |
547 "[| n \<in> nat; nat \<lesssim> X |] ==> \<exists>Y. Y \<subseteq> X & n \<approx> Y" |
560 "[| n \<in> nat; nat \<lesssim> X |] ==> \<exists>Y. Y \<subseteq> X & n \<approx> Y" |
548 apply (unfold lepoll_def eqpoll_def) |
561 apply (unfold lepoll_def eqpoll_def) |
549 apply (fast del: subsetI subsetCE |
562 apply (fast del: subsetI subsetCE |
550 intro!: subset_SIs |
563 intro!: subset_SIs |
624 (*Allows showing that |i| is a limit cardinal*) |
637 (*Allows showing that |i| is a limit cardinal*) |
625 lemma nat_le_cardinal: "nat \<le> i ==> nat \<le> |i|" |
638 lemma nat_le_cardinal: "nat \<le> i ==> nat \<le> |i|" |
626 apply (rule Card_nat [THEN Card_cardinal_eq, THEN subst]) |
639 apply (rule Card_nat [THEN Card_cardinal_eq, THEN subst]) |
627 apply (erule cardinal_mono) |
640 apply (erule cardinal_mono) |
628 done |
641 done |
|
642 |
|
643 lemma n_lesspoll_nat: "n \<in> nat ==> n \<prec> nat" |
|
644 by (blast intro: Ord_nat Card_nat ltI lt_Card_imp_lesspoll) |
629 |
645 |
630 |
646 |
631 subsection{*Towards Cardinal Arithmetic *} |
647 subsection{*Towards Cardinal Arithmetic *} |
632 (** Congruence laws for successor, cardinal addition and multiplication **) |
648 (** Congruence laws for successor, cardinal addition and multiplication **) |
633 |
649 |