src/ZF/Cardinal.thy
changeset 46841 49b91b716cbe
parent 46821 ff6b0c1087f2
child 46847 8740cea39a4a
equal deleted inserted replaced
46823:57bf0cecb366 46841:49b91b716cbe
    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