src/ZF/CardinalArith.ML
changeset 1609 5324067d993f
parent 1461 6bcb44e4d6e5
child 1622 4b0608ce6150
equal deleted inserted replaced
1608:e15e8c0c1e37 1609:5324067d993f
    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