10 addition and multiplication of natural numbers; on infinite cardinals they |
10 addition and multiplication of natural numbers; on infinite cardinals they |
11 coincide with union (maximum). Either way we get most laws for free. |
11 coincide with union (maximum). Either way we get most laws for free. |
12 *) |
12 *) |
13 |
13 |
14 open CardinalArith; |
14 open CardinalArith; |
15 |
|
16 (*** Elementary properties ***) |
|
17 |
|
18 (*Use AC to discharge first premise*) |
|
19 goal CardinalArith.thy |
|
20 "!!A B. [| well_ord(B,r); A lepoll B |] ==> |A| le |B|"; |
|
21 by (res_inst_tac [("i","|A|"),("j","|B|")] Ord_linear_le 1); |
|
22 by (REPEAT_FIRST (ares_tac [Ord_cardinal, le_eqI])); |
|
23 by (rtac (eqpollI RS cardinal_cong) 1 THEN assume_tac 1); |
|
24 by (rtac lepoll_trans 1); |
|
25 by (rtac (well_ord_cardinal_eqpoll RS eqpoll_sym RS eqpoll_imp_lepoll) 1); |
|
26 by (assume_tac 1); |
|
27 by (etac (le_imp_subset RS subset_imp_lepoll RS lepoll_trans) 1); |
|
28 by (rtac eqpoll_imp_lepoll 1); |
|
29 by (rewtac lepoll_def); |
|
30 by (etac exE 1); |
|
31 by (rtac well_ord_cardinal_eqpoll 1); |
|
32 by (etac well_ord_rvimage 1); |
|
33 by (assume_tac 1); |
|
34 qed "well_ord_lepoll_imp_Card_le"; |
|
35 |
|
36 (*Each element of Fin(A) is equivalent to a natural number*) |
|
37 goal CardinalArith.thy |
|
38 "!!X A. X: Fin(A) ==> EX n:nat. X eqpoll n"; |
|
39 by (etac Fin_induct 1); |
|
40 by (fast_tac (ZF_cs addIs [eqpoll_refl, nat_0I]) 1); |
|
41 by (fast_tac (ZF_cs addSIs [cons_eqpoll_cong, |
|
42 rewrite_rule [succ_def] nat_succI] |
|
43 addSEs [mem_irrefl]) 1); |
|
44 qed "Fin_eqpoll"; |
|
45 |
15 |
46 (*** Cardinal addition ***) |
16 (*** Cardinal addition ***) |
47 |
17 |
48 (** Cardinal addition is commutative **) |
18 (** Cardinal addition is commutative **) |
49 |
19 |
491 \ | ordermap(K*K, csquare_rel(K)) ` <x,y> | le |succ(z)| |*| |succ(z)|"; |
461 \ | ordermap(K*K, csquare_rel(K)) ` <x,y> | le |succ(z)| |*| |succ(z)|"; |
492 by (rtac (well_ord_rmult RS well_ord_lepoll_imp_Card_le) 1); |
462 by (rtac (well_ord_rmult RS well_ord_lepoll_imp_Card_le) 1); |
493 by (REPEAT (ares_tac [Ord_cardinal, well_ord_Memrel] 1)); |
463 by (REPEAT (ares_tac [Ord_cardinal, well_ord_Memrel] 1)); |
494 by (subgoals_tac ["z<K"] 1); |
464 by (subgoals_tac ["z<K"] 1); |
495 by (fast_tac (ZF_cs addSIs [Un_least_lt, Limit_has_succ]) 2); |
465 by (fast_tac (ZF_cs addSIs [Un_least_lt, Limit_has_succ]) 2); |
496 by (rtac (ordermap_z_lt RS leI RS le_imp_subset RS subset_imp_lepoll RS |
466 by (rtac (ordermap_z_lt RS leI RS le_imp_lepoll RS lepoll_trans) 1); |
497 lepoll_trans) 1); |
|
498 by (REPEAT_SOME assume_tac); |
467 by (REPEAT_SOME assume_tac); |
499 by (rtac (ordermap_eqpoll_pred RS eqpoll_imp_lepoll RS lepoll_trans) 1); |
468 by (rtac (ordermap_eqpoll_pred RS eqpoll_imp_lepoll RS lepoll_trans) 1); |
500 by (etac (Limit_is_Ord RS well_ord_csquare) 1); |
469 by (etac (Limit_is_Ord RS well_ord_csquare) 1); |
501 by (fast_tac (ZF_cs addIs [ltD]) 1); |
470 by (fast_tac (ZF_cs addIs [ltD]) 1); |
502 by (rtac (pred_csquare_subset RS subset_imp_lepoll RS lepoll_trans) 1 THEN |
471 by (rtac (pred_csquare_subset RS subset_imp_lepoll RS lepoll_trans) 1 THEN |
734 "!!K. InfCard(K) ==> InfCard(csucc(K))"; |
703 "!!K. InfCard(K) ==> InfCard(csucc(K))"; |
735 by (asm_simp_tac (ZF_ss addsimps [Card_csucc, Card_is_Ord, |
704 by (asm_simp_tac (ZF_ss addsimps [Card_csucc, Card_is_Ord, |
736 lt_csucc RS leI RSN (2,le_trans)]) 1); |
705 lt_csucc RS leI RSN (2,le_trans)]) 1); |
737 qed "InfCard_csucc"; |
706 qed "InfCard_csucc"; |
738 |
707 |
|
708 |
|
709 (*** Finite sets ***) |
|
710 |
|
711 goal CardinalArith.thy |
|
712 "!!n. n: nat ==> ALL A. A eqpoll n --> A : Fin(A)"; |
|
713 by (eresolve_tac [nat_induct] 1); |
|
714 by (simp_tac (ZF_ss addsimps (eqpoll_0_iff::Fin.intrs)) 1); |
|
715 by (step_tac ZF_cs 1); |
|
716 by (subgoal_tac "EX u. u:A" 1); |
|
717 by (eresolve_tac [exE] 1); |
|
718 by (resolve_tac [Diff_sing_eqpoll RS revcut_rl] 1); |
|
719 by (assume_tac 2); |
|
720 by (assume_tac 1); |
|
721 by (res_inst_tac [("b", "A")] (cons_Diff RS subst) 1); |
|
722 by (assume_tac 1); |
|
723 by (resolve_tac [Fin.consI] 1); |
|
724 by (fast_tac ZF_cs 1); |
|
725 by (deepen_tac (ZF_cs addIs [Fin_mono RS subsetD]) 0 1); (*SLOW*) |
|
726 (*Now for the lemma assumed above*) |
|
727 by (rewrite_goals_tac [eqpoll_def]); |
|
728 by (fast_tac (ZF_cs addSEs [bij_converse_bij RS bij_is_fun RS apply_type]) 1); |
|
729 val lemma = result(); |
|
730 |
|
731 goalw CardinalArith.thy [Finite_def] "!!A. Finite(A) ==> A : Fin(A)"; |
|
732 by (fast_tac (ZF_cs addIs [lemma RS spec RS mp]) 1); |
|
733 qed "Finite_into_Fin"; |
|
734 |
|
735 goal CardinalArith.thy "!!A. A : Fin(U) ==> Finite(A)"; |
|
736 by (fast_tac (ZF_cs addSIs [Finite_0, Finite_cons] addEs [Fin.induct]) 1); |
|
737 qed "Fin_into_Finite"; |
|
738 |
|
739 goal CardinalArith.thy "Finite(A) <-> A : Fin(A)"; |
|
740 by (fast_tac (ZF_cs addIs [Finite_into_Fin] addEs [Fin_into_Finite]) 1); |
|
741 qed "Finite_Fin_iff"; |
|
742 |
|
743 goal CardinalArith.thy |
|
744 "!!A. [| Finite(A); Finite(B) |] ==> Finite(A Un B)"; |
|
745 by (fast_tac (ZF_cs addSIs [Fin_into_Finite, Fin_UnI] |
|
746 addSDs [Finite_into_Fin] |
|
747 addSEs [Un_upper1 RS Fin_mono RS subsetD, |
|
748 Un_upper2 RS Fin_mono RS subsetD]) 1); |
|
749 qed "Finite_Un"; |
|
750 |
|
751 |
|
752 (** Removing elements from a finite set decreases its cardinality **) |
|
753 |
|
754 goal CardinalArith.thy |
|
755 "!!A. A: Fin(U) ==> x~:A --> ~ cons(x,A) lepoll A"; |
|
756 by (eresolve_tac [Fin_induct] 1); |
|
757 by (simp_tac (ZF_ss addsimps [lepoll_0_iff]) 1); |
|
758 by (subgoal_tac "cons(x,cons(xa,y)) = cons(xa,cons(x,y))" 1); |
|
759 by (asm_simp_tac ZF_ss 1); |
|
760 by (fast_tac (ZF_cs addSDs [cons_lepoll_consD]) 1); |
|
761 by (fast_tac eq_cs 1); |
|
762 qed "Fin_imp_not_cons_lepoll"; |
|
763 |
|
764 goal CardinalArith.thy |
|
765 "!!a A. [| Finite(A); a~:A |] ==> |cons(a,A)| = succ(|A|)"; |
|
766 by (rewrite_goals_tac [cardinal_def]); |
|
767 by (resolve_tac [Least_equality] 1); |
|
768 by (fold_tac [cardinal_def]); |
|
769 by (simp_tac (ZF_ss addsimps [succ_def]) 1); |
|
770 by (fast_tac (ZF_cs addIs [cons_eqpoll_cong, well_ord_cardinal_eqpoll] |
|
771 addSEs [mem_irrefl] |
|
772 addSDs [Finite_imp_well_ord]) 1); |
|
773 by (fast_tac (ZF_cs addIs [Ord_succ, Card_cardinal, Card_is_Ord]) 1); |
|
774 by (resolve_tac [notI] 1); |
|
775 by (resolve_tac [Finite_into_Fin RS Fin_imp_not_cons_lepoll RS mp RS notE] 1); |
|
776 by (assume_tac 1); |
|
777 by (assume_tac 1); |
|
778 by (eresolve_tac [eqpoll_sym RS eqpoll_imp_lepoll RS lepoll_trans] 1); |
|
779 by (eresolve_tac [le_imp_lepoll RS lepoll_trans] 1); |
|
780 by (fast_tac (ZF_cs addIs [well_ord_cardinal_eqpoll RS eqpoll_imp_lepoll] |
|
781 addSDs [Finite_imp_well_ord]) 1); |
|
782 qed "Finite_imp_cardinal_cons"; |
|
783 |
|
784 |
|
785 goal CardinalArith.thy "!!a A. [| Finite(A); a:A |] ==> |A-{a}| < |A|"; |
|
786 by (res_inst_tac [("b", "A")] (cons_Diff RS subst) 1); |
|
787 by (assume_tac 1); |
|
788 by (asm_simp_tac (ZF_ss addsimps [Finite_imp_cardinal_cons, |
|
789 Diff_subset RS subset_imp_lepoll RS |
|
790 lepoll_Finite]) 1); |
|
791 by (asm_simp_tac (ZF_ss addsimps [cons_Diff, Ord_cardinal RS le_refl]) 1); |
|
792 qed "Finite_imp_cardinal_Diff"; |
|
793 |
|
794 |
|
795 (** Thanks to Krzysztof Grabczewski **) |
|
796 |
|
797 val nat_implies_well_ord = nat_into_Ord RS well_ord_Memrel; |
|
798 |
|
799 goal CardinalArith.thy "!!m n. [| m:nat; n:nat |] ==> m + n eqpoll m #+ n"; |
|
800 by (rtac eqpoll_trans 1); |
|
801 by (eresolve_tac [nat_implies_well_ord RS ( |
|
802 nat_implies_well_ord RSN (2, |
|
803 well_ord_radd RS well_ord_cardinal_eqpoll)) RS eqpoll_sym] 1 |
|
804 THEN (assume_tac 1)); |
|
805 by (eresolve_tac [nat_cadd_eq_add RS subst] 1 THEN (assume_tac 1)); |
|
806 by (asm_full_simp_tac (ZF_ss addsimps [cadd_def, eqpoll_refl]) 1); |
|
807 qed "nat_sum_eqpoll_sum"; |
|
808 |
|
809 goal Nat.thy "!!m. [| m le n; n:nat |] ==> m:nat"; |
|
810 by (fast_tac (ZF_cs addSDs [nat_succI RS (Ord_nat RSN (2, OrdmemD))] |
|
811 addSEs [ltE]) 1); |
|
812 qed "le_in_nat"; |
|
813 |