103 |
103 |
104 goal Cardinal.thy "X eqpoll Y <-> X lepoll Y & Y lepoll X"; |
104 goal Cardinal.thy "X eqpoll Y <-> X lepoll Y & Y lepoll X"; |
105 by (fast_tac (ZF_cs addIs [eqpollI] addSEs [eqpollE]) 1); |
105 by (fast_tac (ZF_cs addIs [eqpollI] addSEs [eqpollE]) 1); |
106 qed "eqpoll_iff"; |
106 qed "eqpoll_iff"; |
107 |
107 |
|
108 goalw Cardinal.thy [lepoll_def, inj_def] "!!A. A lepoll 0 ==> A = 0"; |
|
109 by (fast_tac (eq_cs addDs [apply_type]) 1); |
|
110 qed "lepoll_0_is_0"; |
|
111 |
|
112 (*0 lepoll Y*) |
|
113 bind_thm ("empty_lepollI", empty_subsetI RS subset_imp_lepoll); |
|
114 |
|
115 (*A eqpoll 0 ==> A=0*) |
|
116 bind_thm ("eqpoll_0_is_0", eqpoll_imp_lepoll RS lepoll_0_is_0); |
|
117 |
|
118 |
|
119 (*** lesspoll: contributions by Krzysztof Grabczewski ***) |
|
120 |
|
121 goalw Cardinal.thy [inj_def, surj_def] |
|
122 "!!f. [| f : inj(A, succ(m)); f ~: surj(A, succ(m)) |] ==> EX f. f:inj(A,m)"; |
|
123 by (safe_tac lemmas_cs); |
|
124 by (swap_res_tac [exI] 1); |
|
125 by (res_inst_tac [("a", "lam z:A. if(f`z=m, y, f`z)")] CollectI 1); |
|
126 by (fast_tac (ZF_cs addSIs [if_type RS lam_type] |
|
127 addEs [apply_funtype RS succE]) 1); |
|
128 (*Proving it's injective*) |
|
129 by (asm_simp_tac (ZF_ss setloop split_tac [expand_if]) 1); |
|
130 by (fast_tac ZF_cs 1); |
|
131 qed "inj_not_surj_succ"; |
|
132 |
|
133 (** Variations on transitivity **) |
|
134 |
|
135 goalw Cardinal.thy [lesspoll_def] |
|
136 "!!X. [| X lesspoll Y; Y lesspoll Z |] ==> X lesspoll Z"; |
|
137 by (fast_tac (ZF_cs addSIs [eqpollI] addSEs [eqpollE] addIs [lepoll_trans]) 1); |
|
138 qed "lesspoll_trans"; |
|
139 |
|
140 goalw Cardinal.thy [lesspoll_def] |
|
141 "!!X. [| X lesspoll Y; Y lepoll Z |] ==> X lesspoll Z"; |
|
142 by (fast_tac (ZF_cs addSIs [eqpollI] addSEs [eqpollE] addIs [lepoll_trans]) 1); |
|
143 qed "lesspoll_lepoll_lesspoll"; |
|
144 |
|
145 goalw Cardinal.thy [lesspoll_def] |
|
146 "!!X. [| X lesspoll Y; Z lepoll X |] ==> Z lesspoll Y"; |
|
147 by (fast_tac (ZF_cs addSIs [eqpollI] addSEs [eqpollE] addIs [lepoll_trans]) 1); |
|
148 qed "lepoll_lesspoll_lesspoll"; |
|
149 |
108 |
150 |
109 (** LEAST -- the least number operator [from HOL/Univ.ML] **) |
151 (** LEAST -- the least number operator [from HOL/Univ.ML] **) |
110 |
152 |
111 val [premP,premOrd,premNot] = goalw Cardinal.thy [Least_def] |
153 val [premP,premOrd,premNot] = goalw Cardinal.thy [Least_def] |
112 "[| P(i); Ord(i); !!x. x<i ==> ~P(x) |] ==> (LEAST x.P(x)) = i"; |
154 "[| P(i); Ord(i); !!x. x<i ==> ~P(x) |] ==> (LEAST x.P(x)) = i"; |
294 [Card_lt_iff, Card_is_Ord, Ord_cardinal, |
336 [Card_lt_iff, Card_is_Ord, Ord_cardinal, |
295 not_lt_iff_le RS iff_sym]) 1); |
337 not_lt_iff_le RS iff_sym]) 1); |
296 qed "Card_le_iff"; |
338 qed "Card_le_iff"; |
297 |
339 |
298 |
340 |
299 (** The swap operator [NOT USED] **) |
|
300 |
|
301 goalw Cardinal.thy [swap_def] |
|
302 "!!A. [| x:A; y:A |] ==> swap(A,x,y) : A->A"; |
|
303 by (REPEAT (ares_tac [lam_type,if_type] 1)); |
|
304 qed "swap_type"; |
|
305 |
|
306 goalw Cardinal.thy [swap_def] |
|
307 "!!A. [| x:A; y:A; z:A |] ==> swap(A,x,y)`(swap(A,x,y)`z) = z"; |
|
308 by (asm_simp_tac (ZF_ss setloop split_tac [expand_if]) 1); |
|
309 qed "swap_swap_identity"; |
|
310 |
|
311 goal Cardinal.thy "!!A. [| x:A; y:A |] ==> swap(A,x,y) : bij(A,A)"; |
|
312 by (rtac nilpotent_imp_bijective 1); |
|
313 by (REPEAT (ares_tac [swap_type, comp_eq_id_iff RS iffD2, |
|
314 ballI, swap_swap_identity] 1)); |
|
315 qed "swap_bij"; |
|
316 |
|
317 (*** The finite cardinals ***) |
341 (*** The finite cardinals ***) |
318 |
342 |
319 (*Lemma suggested by Mike Fourman*) |
343 goalw Cardinal.thy [lepoll_def, inj_def] |
320 val [prem] = goalw Cardinal.thy [inj_def] |
344 "!!A B. [| cons(u,A) lepoll cons(v,B); u~:A; v~:B |] ==> A lepoll B"; |
321 "f: inj(succ(m), succ(n)) ==> (lam x:m. if(f`x=n, f`m, f`x)) : inj(m,n)"; |
345 by (safe_tac ZF_cs); |
|
346 by (res_inst_tac [("x", "lam x:A. if(f`x=v, f`u, f`x)")] exI 1); |
322 by (rtac CollectI 1); |
347 by (rtac CollectI 1); |
323 (*Proving it's in the function space m->n*) |
348 (*Proving it's in the function space A->B*) |
324 by (cut_facts_tac [prem] 1); |
|
325 by (rtac (if_type RS lam_type) 1); |
349 by (rtac (if_type RS lam_type) 1); |
326 by (fast_tac (ZF_cs addSEs [mem_irrefl] addEs [apply_funtype RS succE]) 1); |
350 by (fast_tac (ZF_cs addEs [apply_funtype RS consE]) 1); |
327 by (fast_tac (ZF_cs addSEs [mem_irrefl] addEs [apply_funtype RS succE]) 1); |
351 by (fast_tac (ZF_cs addSEs [mem_irrefl] addEs [apply_funtype RS consE]) 1); |
328 (*Proving it's injective*) |
352 (*Proving it's injective*) |
329 by (asm_simp_tac (ZF_ss setloop split_tac [expand_if]) 1); |
353 by (asm_simp_tac (ZF_ss setloop split_tac [expand_if]) 1); |
330 (*Adding prem earlier would cause the simplifier to loop*) |
354 by (fast_tac ZF_cs 1); |
331 by (cut_facts_tac [prem] 1); |
355 qed "cons_lepoll_consD"; |
332 by (fast_tac (ZF_cs addSEs [mem_irrefl]) 1); |
356 |
333 qed "inj_succ_succD"; |
357 goal Cardinal.thy |
334 |
358 "!!A B. [| cons(u,A) eqpoll cons(v,B); u~:A; v~:B |] ==> A eqpoll B"; |
335 val [prem] = goalw Cardinal.thy [lepoll_def] |
359 by (asm_full_simp_tac (ZF_ss addsimps [eqpoll_iff]) 1); |
|
360 by (fast_tac (ZF_cs addIs [cons_lepoll_consD]) 1); |
|
361 qed "cons_eqpoll_consD"; |
|
362 |
|
363 (*Lemma suggested by Mike Fourman*) |
|
364 goalw Cardinal.thy [succ_def] "!!m n. succ(m) lepoll succ(n) ==> m lepoll n"; |
|
365 by (etac cons_lepoll_consD 1); |
|
366 by (REPEAT (rtac mem_not_refl 1)); |
|
367 qed "succ_lepoll_succD"; |
|
368 |
|
369 val [prem] = goal Cardinal.thy |
336 "m:nat ==> ALL n: nat. m lepoll n --> m le n"; |
370 "m:nat ==> ALL n: nat. m lepoll n --> m le n"; |
337 by (nat_ind_tac "m" [prem] 1); |
371 by (nat_ind_tac "m" [prem] 1); |
338 by (fast_tac (ZF_cs addSIs [nat_0_le]) 1); |
372 by (fast_tac (ZF_cs addSIs [nat_0_le]) 1); |
339 by (rtac ballI 1); |
373 by (rtac ballI 1); |
340 by (eres_inst_tac [("n","n")] natE 1); |
374 by (eres_inst_tac [("n","n")] natE 1); |
341 by (asm_simp_tac (ZF_ss addsimps [inj_def, succI1 RS Pi_empty2]) 1); |
375 by (asm_simp_tac (ZF_ss addsimps [lepoll_def, inj_def, |
342 by (fast_tac (ZF_cs addSIs [succ_leI] addSDs [inj_succ_succD]) 1); |
376 succI1 RS Pi_empty2]) 1); |
|
377 by (fast_tac (ZF_cs addSIs [succ_leI] addSDs [succ_lepoll_succD]) 1); |
343 val nat_lepoll_imp_le_lemma = result(); |
378 val nat_lepoll_imp_le_lemma = result(); |
344 |
379 |
345 bind_thm ("nat_lepoll_imp_le", nat_lepoll_imp_le_lemma RS bspec RS mp); |
380 bind_thm ("nat_lepoll_imp_le", nat_lepoll_imp_le_lemma RS bspec RS mp); |
346 |
381 |
347 goal Cardinal.thy |
382 goal Cardinal.thy |
363 (*Part of Kunen's Lemma 10.6*) |
398 (*Part of Kunen's Lemma 10.6*) |
364 goal Cardinal.thy "!!n. [| succ(n) lepoll n; n:nat |] ==> P"; |
399 goal Cardinal.thy "!!n. [| succ(n) lepoll n; n:nat |] ==> P"; |
365 by (rtac (nat_lepoll_imp_le RS lt_irrefl) 1); |
400 by (rtac (nat_lepoll_imp_le RS lt_irrefl) 1); |
366 by (REPEAT (ares_tac [nat_succI] 1)); |
401 by (REPEAT (ares_tac [nat_succI] 1)); |
367 qed "succ_lepoll_natE"; |
402 qed "succ_lepoll_natE"; |
|
403 |
|
404 |
|
405 (** lepoll, lesspoll and natural numbers **) |
|
406 |
|
407 goalw Cardinal.thy [lesspoll_def] |
|
408 "!!m. [| A lepoll m; m:nat |] ==> A lesspoll succ(m)"; |
|
409 by (rtac conjI 1); |
|
410 by (fast_tac (ZF_cs addIs [subset_imp_lepoll RSN (2,lepoll_trans)]) 1); |
|
411 by (rtac notI 1); |
|
412 by (dresolve_tac [eqpoll_sym RS eqpoll_imp_lepoll] 1); |
|
413 by (dtac lepoll_trans 1 THEN assume_tac 1); |
|
414 by (etac succ_lepoll_natE 1 THEN assume_tac 1); |
|
415 qed "lepoll_imp_lesspoll_succ"; |
|
416 |
|
417 goalw Cardinal.thy [lesspoll_def, lepoll_def, eqpoll_def, bij_def] |
|
418 "!!m. [| A lesspoll succ(m); m:nat |] ==> A lepoll m"; |
|
419 by (step_tac ZF_cs 1); |
|
420 by (fast_tac (ZF_cs addSIs [inj_not_surj_succ]) 1); |
|
421 qed "lesspoll_succ_imp_lepoll"; |
|
422 |
|
423 goal Cardinal.thy "!!A m. [| A lepoll succ(m); m:nat |] ==> \ |
|
424 \ A lepoll m | A eqpoll succ(m)"; |
|
425 by (rtac disjCI 1); |
|
426 by (rtac lesspoll_succ_imp_lepoll 1); |
|
427 by (assume_tac 2); |
|
428 by (asm_simp_tac (ZF_ss addsimps [lesspoll_def]) 1); |
|
429 qed "lepoll_succ_disj"; |
368 |
430 |
369 |
431 |
370 (*** The first infinite cardinal: Omega, or nat ***) |
432 (*** The first infinite cardinal: Omega, or nat ***) |
371 |
433 |
372 (*This implies Kunen's Lemma 10.6*) |
434 (*This implies Kunen's Lemma 10.6*) |
425 |
487 |
426 goal Cardinal.thy |
488 goal Cardinal.thy |
427 "!!A B. [| A eqpoll B; a ~: A; b ~: B |] ==> cons(a,A) eqpoll cons(b,B)"; |
489 "!!A B. [| A eqpoll B; a ~: A; b ~: B |] ==> cons(a,A) eqpoll cons(b,B)"; |
428 by (asm_full_simp_tac (ZF_ss addsimps [eqpoll_iff, cons_lepoll_cong]) 1); |
490 by (asm_full_simp_tac (ZF_ss addsimps [eqpoll_iff, cons_lepoll_cong]) 1); |
429 qed "cons_eqpoll_cong"; |
491 qed "cons_eqpoll_cong"; |
|
492 |
|
493 goal Cardinal.thy |
|
494 "!!A B. [| a ~: A; b ~: B |] ==> \ |
|
495 \ cons(a,A) lepoll cons(b,B) <-> A lepoll B"; |
|
496 by (fast_tac (ZF_cs addIs [cons_lepoll_cong, cons_lepoll_consD]) 1); |
|
497 qed "cons_lepoll_cons_iff"; |
|
498 |
|
499 goal Cardinal.thy |
|
500 "!!A B. [| a ~: A; b ~: B |] ==> \ |
|
501 \ cons(a,A) eqpoll cons(b,B) <-> A eqpoll B"; |
|
502 by (fast_tac (ZF_cs addIs [cons_eqpoll_cong, cons_eqpoll_consD]) 1); |
|
503 qed "cons_eqpoll_cons_iff"; |
|
504 |
|
505 goalw Cardinal.thy [succ_def] "{a} eqpoll 1"; |
|
506 by (fast_tac (ZF_cs addSIs [eqpoll_refl RS cons_eqpoll_cong]) 1); |
|
507 qed "singleton_eqpoll_1"; |
430 |
508 |
431 (*Congruence law for succ under equipollence*) |
509 (*Congruence law for succ under equipollence*) |
432 goalw Cardinal.thy [succ_def] |
510 goalw Cardinal.thy [succ_def] |
433 "!!A B. A eqpoll B ==> succ(A) eqpoll succ(B)"; |
511 "!!A B. A eqpoll B ==> succ(A) eqpoll succ(B)"; |
434 by (REPEAT (ares_tac [cons_eqpoll_cong, mem_not_refl] 1)); |
512 by (REPEAT (ares_tac [cons_eqpoll_cong, mem_not_refl] 1)); |
473 by (asm_simp_tac |
551 by (asm_simp_tac |
474 (ZF_ss addsimps [inj_converse_fun RS apply_funtype, right_inverse] |
552 (ZF_ss addsimps [inj_converse_fun RS apply_funtype, right_inverse] |
475 setloop split_tac [expand_if]) 1); |
553 setloop split_tac [expand_if]) 1); |
476 by (fast_tac (ZF_cs addEs [equals0D]) 1); |
554 by (fast_tac (ZF_cs addEs [equals0D]) 1); |
477 qed "inj_disjoint_eqpoll"; |
555 qed "inj_disjoint_eqpoll"; |
|
556 |
|
557 |
|
558 (*** Lemmas by Krzysztof Grabczewski. New proofs using cons_lepoll_cons. |
|
559 Could easily generalise from succ to cons. ***) |
|
560 |
|
561 goalw Cardinal.thy [succ_def] |
|
562 "!!A a n. [| a:A; A lepoll succ(n) |] ==> A - {a} lepoll n"; |
|
563 by (rtac cons_lepoll_consD 1); |
|
564 by (rtac mem_not_refl 3); |
|
565 by (eresolve_tac [cons_Diff RS ssubst] 1); |
|
566 by (safe_tac ZF_cs); |
|
567 qed "diff_sing_lepoll"; |
|
568 |
|
569 goalw Cardinal.thy [succ_def] |
|
570 "!!A a n. [| a:A; succ(n) lepoll A |] ==> n lepoll A - {a}"; |
|
571 by (rtac cons_lepoll_consD 1); |
|
572 by (rtac mem_not_refl 2); |
|
573 by (eresolve_tac [cons_Diff RS ssubst] 1); |
|
574 by (safe_tac ZF_cs); |
|
575 qed "lepoll_diff_sing"; |
|
576 |
|
577 goal Cardinal.thy "!!A a n. [| a:A; A eqpoll succ(n) |] ==> A - {a} eqpoll n"; |
|
578 by (fast_tac (ZF_cs addSIs [eqpollI] addSEs [eqpollE] |
|
579 addIs [diff_sing_lepoll,lepoll_diff_sing]) 1); |
|
580 qed "diff_sing_eqpoll"; |
|
581 |
|
582 goal Cardinal.thy "!!A. [| A lepoll 1; a:A |] ==> A = {a}"; |
|
583 by (forward_tac [diff_sing_lepoll] 1); |
|
584 by (assume_tac 1); |
|
585 by (dtac lepoll_0_is_0 1); |
|
586 by (fast_tac (eq_cs addEs [equalityE]) 1); |
|
587 qed "lepoll_1_is_sing"; |
|
588 |
|
589 |
|
590 (*** Finite and infinite sets ***) |
|
591 |
|
592 goalw Cardinal.thy [Finite_def] |
|
593 "!!A. [| A lepoll n; n:nat |] ==> Finite(A)"; |
|
594 by (etac rev_mp 1); |
|
595 by (etac nat_induct 1); |
|
596 by (fast_tac (ZF_cs addSDs [lepoll_0_is_0] addSIs [eqpoll_refl,nat_0I]) 1); |
|
597 by (fast_tac (ZF_cs addSDs [lepoll_succ_disj] addSIs [nat_succI]) 1); |
|
598 qed "lepoll_nat_imp_Finite"; |
|
599 |
|
600 goalw Cardinal.thy [Finite_def] |
|
601 "!!X. [| Y lepoll X; Finite(X) |] ==> Finite(Y)"; |
|
602 by (fast_tac (ZF_cs addSEs [eqpollE] |
|
603 addEs [lepoll_trans RS |
|
604 rewrite_rule [Finite_def] lepoll_nat_imp_Finite]) 1); |
|
605 qed "lepoll_Finite"; |
|
606 |
|
607 goalw Cardinal.thy [Finite_def] "!!x. Finite(x) ==> Finite(cons(y,x))"; |
|
608 by (excluded_middle_tac "y:x" 1); |
|
609 by (asm_simp_tac (ZF_ss addsimps [cons_absorb]) 2); |
|
610 by (etac bexE 1); |
|
611 by (rtac bexI 1); |
|
612 by (etac nat_succI 2); |
|
613 by (asm_simp_tac |
|
614 (ZF_ss addsimps [succ_def, cons_eqpoll_cong, mem_not_refl]) 1); |
|
615 qed "Finite_imp_cons_Finite"; |
|
616 |
|
617 goalw Cardinal.thy [succ_def] "!!x. Finite(x) ==> Finite(succ(x))"; |
|
618 by (etac Finite_imp_cons_Finite 1); |
|
619 qed "Finite_imp_succ_Finite"; |
|
620 |
|
621 goalw Cardinal.thy [Finite_def] |
|
622 "!!i. [| Ord(i); ~ Finite(i) |] ==> nat le i"; |
|
623 by (eresolve_tac [Ord_nat RSN (2,Ord_linear2)] 1); |
|
624 by (assume_tac 2); |
|
625 by (fast_tac (ZF_cs addSIs [eqpoll_refl] addSEs [ltE]) 1); |
|
626 qed "nat_le_infinite_Ord"; |
|
627 |
|
628 |
|
629 (*Krzysztof Grabczewski's proof that the converse of a finite, well-ordered |
|
630 set is well-ordered. Proofs simplified by lcp. *) |
|
631 |
|
632 goal Nat.thy "!!n. n:nat ==> wf[n](converse(Memrel(n)))"; |
|
633 by (etac nat_induct 1); |
|
634 by (fast_tac (ZF_cs addIs [wf_onI]) 1); |
|
635 by (rtac wf_onI 1); |
|
636 by (asm_full_simp_tac |
|
637 (ZF_ss addsimps [wf_on_def, wf_def, converse_iff, Memrel_iff]) 1); |
|
638 by (excluded_middle_tac "x:Z" 1); |
|
639 by (dres_inst_tac [("x", "x")] bspec 2 THEN assume_tac 2); |
|
640 by (fast_tac (ZF_cs addSEs [mem_irrefl] addEs [mem_asym]) 2); |
|
641 by (dres_inst_tac [("x", "Z")] spec 1); |
|
642 by (safe_tac ZF_cs); |
|
643 by (dres_inst_tac [("x", "xa")] bspec 1 THEN assume_tac 1); |
|
644 by (fast_tac ZF_cs 1); |
|
645 qed "nat_wf_on_converse_Memrel"; |
|
646 |
|
647 goal Cardinal.thy "!!n. n:nat ==> well_ord(n,converse(Memrel(n)))"; |
|
648 by (forward_tac [Ord_nat RS Ord_in_Ord RS well_ord_Memrel] 1); |
|
649 by (rewtac well_ord_def); |
|
650 by (fast_tac (ZF_cs addSIs [tot_ord_converse, nat_wf_on_converse_Memrel]) 1); |
|
651 qed "nat_well_ord_converse_Memrel"; |
|
652 |
|
653 goal Cardinal.thy |
|
654 "!!A. [| well_ord(A,r); \ |
|
655 \ well_ord(ordertype(A,r), converse(Memrel(ordertype(A, r)))) \ |
|
656 \ |] ==> well_ord(A,converse(r))"; |
|
657 by (resolve_tac [well_ord_Int_iff RS iffD1] 1); |
|
658 by (forward_tac [ordermap_bij RS bij_is_inj RS well_ord_rvimage] 1); |
|
659 by (assume_tac 1); |
|
660 by (asm_full_simp_tac |
|
661 (ZF_ss addsimps [rvimage_converse, converse_Int, converse_prod, |
|
662 ordertype_ord_iso RS ord_iso_rvimage_eq]) 1); |
|
663 qed "well_ord_converse"; |
|
664 |
|
665 goal Cardinal.thy |
|
666 "!!A. [| well_ord(A,r); A eqpoll n; n:nat |] ==> ordertype(A,r)=n"; |
|
667 by (rtac (Ord_ordertype RS Ord_nat_eqpoll_iff RS iffD1) 1 THEN |
|
668 REPEAT (assume_tac 1)); |
|
669 by (rtac eqpoll_trans 1 THEN assume_tac 2); |
|
670 by (rewtac eqpoll_def); |
|
671 by (fast_tac (ZF_cs addSIs [ordermap_bij RS bij_converse_bij]) 1); |
|
672 qed "ordertype_eq_n"; |
|
673 |
|
674 goalw Cardinal.thy [Finite_def] |
|
675 "!!A. [| Finite(A); well_ord(A,r) |] ==> well_ord(A,converse(r))"; |
|
676 by (rtac well_ord_converse 1 THEN assume_tac 1); |
|
677 by (fast_tac (ZF_cs addDs [ordertype_eq_n] |
|
678 addSIs [nat_well_ord_converse_Memrel]) 1); |
|
679 qed "Finite_well_ord_converse"; |