src/ZF/CardinalArith.thy
changeset 47765 1382bba4b7a5
parent 47707 49b91b716cbe
child 47778 eea3eb057fea
equal deleted inserted replaced
47764:d5bb4c212df1 47765:1382bba4b7a5
    61   then obtain c where c: "c\<in>A" "j < c" "Card(c)"
    61   then obtain c where c: "c\<in>A" "j < c" "Card(c)"
    62     by blast
    62     by blast
    63   hence jls: "j \<prec> c" 
    63   hence jls: "j \<prec> c" 
    64     by (simp add: lt_Card_imp_lesspoll) 
    64     by (simp add: lt_Card_imp_lesspoll) 
    65   { assume eqp: "j \<approx> \<Union>A"
    65   { assume eqp: "j \<approx> \<Union>A"
    66     hence Uls: "\<Union>A \<prec> c" using jls
    66     have  "c \<lesssim> \<Union>A" using c
    67       by (blast intro: eqpoll_sym eqpoll_imp_lepoll lesspoll_trans1)
       
    68     moreover have  "c \<lesssim> \<Union>A" using c
       
    69       by (blast intro: subset_imp_lepoll)
    67       by (blast intro: subset_imp_lepoll)
    70     ultimately have "c \<prec> c"
    68     also have "... \<approx> j"  by (rule eqpoll_sym [OF eqp])
    71       by (blast intro: lesspoll_trans1) 
    69     also have "... \<prec> c"  by (rule jls)
       
    70     finally have "c \<prec> c" .
    72     hence False 
    71     hence False 
    73       by auto
    72       by auto
    74   } thus "\<not> j \<approx> \<Union>A" by blast
    73   } thus "\<not> j \<approx> \<Union>A" by blast
    75 qed
    74 qed
    76 
    75 
    83 
    82 
    84 lemma in_Card_imp_lesspoll: "[| Card(K); b \<in> K |] ==> b \<prec> K"
    83 lemma in_Card_imp_lesspoll: "[| Card(K); b \<in> K |] ==> b \<prec> K"
    85 apply (unfold lesspoll_def)
    84 apply (unfold lesspoll_def)
    86 apply (simp add: Card_iff_initial)
    85 apply (simp add: Card_iff_initial)
    87 apply (fast intro!: le_imp_lepoll ltI leI)
    86 apply (fast intro!: le_imp_lepoll ltI leI)
    88 done
       
    89 
       
    90 lemma lesspoll_lemma: "[| ~ A \<prec> B; C \<prec> B |] ==> A - C \<noteq> 0"
       
    91 apply (unfold lesspoll_def)
       
    92 apply (fast dest!: Diff_eq_0_iff [THEN iffD1, THEN subset_imp_lepoll]
       
    93             intro!: eqpollI elim: notE
       
    94             elim!: eqpollE lepoll_trans)
       
    95 done
    87 done
    96 
    88 
    97 
    89 
    98 subsection{*Cardinal addition*}
    90 subsection{*Cardinal addition*}
    99 
    91 
   121 apply (unfold eqpoll_def)
   113 apply (unfold eqpoll_def)
   122 apply (rule exI)
   114 apply (rule exI)
   123 apply (rule sum_assoc_bij)
   115 apply (rule sum_assoc_bij)
   124 done
   116 done
   125 
   117 
   126 (*Unconditional version requires AC*)
   118 text{*Unconditional version requires AC*}
   127 lemma well_ord_cadd_assoc:
   119 lemma well_ord_cadd_assoc:
   128     "[| well_ord(i,ri); well_ord(j,rj); well_ord(k,rk) |]
   120   assumes i: "well_ord(i,ri)" and j: "well_ord(j,rj)" and k: "well_ord(k,rk)"
   129      ==> (i \<oplus> j) \<oplus> k = i \<oplus> (j \<oplus> k)"
   121   shows "(i \<oplus> j) \<oplus> k = i \<oplus> (j \<oplus> k)"
   130 apply (unfold cadd_def)
   122 proof (unfold cadd_def, rule cardinal_cong)
   131 apply (rule cardinal_cong)
   123   have "|i + j| + k \<approx> (i + j) + k"
   132 apply (rule eqpoll_trans)
   124     by (blast intro: sum_eqpoll_cong well_ord_cardinal_eqpoll eqpoll_refl well_ord_radd i j) 
   133  apply (rule sum_eqpoll_cong [OF well_ord_cardinal_eqpoll eqpoll_refl])
   125   also have "...  \<approx> i + (j + k)"
   134  apply (blast intro: well_ord_radd )
   126     by (rule sum_assoc_eqpoll) 
   135 apply (rule sum_assoc_eqpoll [THEN eqpoll_trans])
   127   also have "...  \<approx> i + |j + k|"
   136 apply (rule eqpoll_sym)
   128     by (blast intro: sum_eqpoll_cong well_ord_cardinal_eqpoll eqpoll_refl well_ord_radd j k eqpoll_sym) 
   137 apply (rule sum_eqpoll_cong [OF eqpoll_refl well_ord_cardinal_eqpoll])
   129   finally show "|i + j| + k \<approx> i + |j + k|" .
   138 apply (blast intro: well_ord_radd )
   130 qed
   139 done
   131 
   140 
   132 
   141 subsubsection{*0 is the identity for addition*}
   133 subsubsection{*0 is the identity for addition*}
   142 
   134 
   143 lemma sum_0_eqpoll: "0+A \<approx> A"
   135 lemma sum_0_eqpoll: "0+A \<approx> A"
   144 apply (unfold eqpoll_def)
   136 apply (unfold eqpoll_def)
   222 
   214 
   223 subsection{*Cardinal multiplication*}
   215 subsection{*Cardinal multiplication*}
   224 
   216 
   225 subsubsection{*Cardinal multiplication is commutative*}
   217 subsubsection{*Cardinal multiplication is commutative*}
   226 
   218 
   227 (*Easier to prove the two directions separately*)
       
   228 lemma prod_commute_eqpoll: "A*B \<approx> B*A"
   219 lemma prod_commute_eqpoll: "A*B \<approx> B*A"
   229 apply (unfold eqpoll_def)
   220 apply (unfold eqpoll_def)
   230 apply (rule exI)
   221 apply (rule exI)
   231 apply (rule_tac c = "%<x,y>.<y,x>" and d = "%<x,y>.<y,x>" in lam_bijective,
   222 apply (rule_tac c = "%<x,y>.<y,x>" and d = "%<x,y>.<y,x>" in lam_bijective,
   232        auto)
   223        auto)
   243 apply (unfold eqpoll_def)
   234 apply (unfold eqpoll_def)
   244 apply (rule exI)
   235 apply (rule exI)
   245 apply (rule prod_assoc_bij)
   236 apply (rule prod_assoc_bij)
   246 done
   237 done
   247 
   238 
   248 (*Unconditional version requires AC*)
   239 text{*Unconditional version requires AC*}
   249 lemma well_ord_cmult_assoc:
   240 lemma well_ord_cmult_assoc:
   250     "[| well_ord(i,ri); well_ord(j,rj); well_ord(k,rk) |]
   241   assumes i: "well_ord(i,ri)" and j: "well_ord(j,rj)" and k: "well_ord(k,rk)"
   251      ==> (i \<otimes> j) \<otimes> k = i \<otimes> (j \<otimes> k)"
   242   shows "(i \<otimes> j) \<otimes> k = i \<otimes> (j \<otimes> k)"
   252 apply (unfold cmult_def)
   243 proof (unfold cmult_def, rule cardinal_cong)
   253 apply (rule cardinal_cong)
   244   have "|i * j| * k \<approx> (i * j) * k"
   254 apply (rule eqpoll_trans)
   245     by (blast intro: prod_eqpoll_cong well_ord_cardinal_eqpoll eqpoll_refl well_ord_rmult i j) 
   255  apply (rule prod_eqpoll_cong [OF well_ord_cardinal_eqpoll eqpoll_refl])
   246   also have "...  \<approx> i * (j * k)"
   256  apply (blast intro: well_ord_rmult)
   247     by (rule prod_assoc_eqpoll) 
   257 apply (rule prod_assoc_eqpoll [THEN eqpoll_trans])
   248   also have "...  \<approx> i * |j * k|"
   258 apply (rule eqpoll_sym)
   249     by (blast intro: prod_eqpoll_cong well_ord_cardinal_eqpoll eqpoll_refl well_ord_rmult j k eqpoll_sym) 
   259 apply (rule prod_eqpoll_cong [OF eqpoll_refl well_ord_cardinal_eqpoll])
   250   finally show "|i * j| * k \<approx> i * |j * k|" .
   260 apply (blast intro: well_ord_rmult)
   251 qed
   261 done
       
   262 
   252 
   263 subsubsection{*Cardinal multiplication distributes over addition*}
   253 subsubsection{*Cardinal multiplication distributes over addition*}
   264 
   254 
   265 lemma sum_prod_distrib_eqpoll: "(A+B)*C \<approx> (A*C)+(B*C)"
   255 lemma sum_prod_distrib_eqpoll: "(A+B)*C \<approx> (A*C)+(B*C)"
   266 apply (unfold eqpoll_def)
   256 apply (unfold eqpoll_def)
   267 apply (rule exI)
   257 apply (rule exI)
   268 apply (rule sum_prod_distrib_bij)
   258 apply (rule sum_prod_distrib_bij)
   269 done
   259 done
   270 
   260 
   271 lemma well_ord_cadd_cmult_distrib:
   261 lemma well_ord_cadd_cmult_distrib:
   272     "[| well_ord(i,ri); well_ord(j,rj); well_ord(k,rk) |]
   262   assumes i: "well_ord(i,ri)" and j: "well_ord(j,rj)" and k: "well_ord(k,rk)"
   273      ==> (i \<oplus> j) \<otimes> k = (i \<otimes> k) \<oplus> (j \<otimes> k)"
   263   shows "(i \<oplus> j) \<otimes> k = (i \<otimes> k) \<oplus> (j \<otimes> k)"
   274 apply (unfold cadd_def cmult_def)
   264 proof (unfold cadd_def cmult_def, rule cardinal_cong)
   275 apply (rule cardinal_cong)
   265   have "|i + j| * k \<approx> (i + j) * k"
   276 apply (rule eqpoll_trans)
   266     by (blast intro: prod_eqpoll_cong well_ord_cardinal_eqpoll eqpoll_refl well_ord_radd i j) 
   277  apply (rule prod_eqpoll_cong [OF well_ord_cardinal_eqpoll eqpoll_refl])
   267   also have "...  \<approx> i * k + j * k"
   278 apply (blast intro: well_ord_radd)
   268     by (rule sum_prod_distrib_eqpoll) 
   279 apply (rule sum_prod_distrib_eqpoll [THEN eqpoll_trans])
   269   also have "...  \<approx> |i * k| + |j * k|"
   280 apply (rule eqpoll_sym)
   270     by (blast intro: sum_eqpoll_cong well_ord_cardinal_eqpoll well_ord_rmult i j k eqpoll_sym) 
   281 apply (rule sum_eqpoll_cong [OF well_ord_cardinal_eqpoll
   271   finally show "|i + j| * k \<approx> |i * k| + |j * k|" .
   282                                 well_ord_cardinal_eqpoll])
   272 qed
   283 apply (blast intro: well_ord_rmult)+
       
   284 done
       
   285 
   273 
   286 subsubsection{*Multiplication by 0 yields 0*}
   274 subsubsection{*Multiplication by 0 yields 0*}
   287 
   275 
   288 lemma prod_0_eqpoll: "0*A \<approx> 0"
   276 lemma prod_0_eqpoll: "0*A \<approx> 0"
   289 apply (unfold eqpoll_def)
   277 apply (unfold eqpoll_def)
   389 done
   377 done
   390 
   378 
   391 lemma cmult_2: "Card(n) ==> 2 \<otimes> n = n \<oplus> n"
   379 lemma cmult_2: "Card(n) ==> 2 \<otimes> n = n \<oplus> n"
   392 by (simp add: cmult_succ_lemma Card_is_Ord cadd_commute [of _ 0])
   380 by (simp add: cmult_succ_lemma Card_is_Ord cadd_commute [of _ 0])
   393 
   381 
   394 lemma sum_lepoll_prod: "2 \<lesssim> C ==> B+B \<lesssim> C*B"
   382 lemma sum_lepoll_prod: 
   395 apply (rule lepoll_trans)
   383   assumes C: "2 \<lesssim> C" shows "B+B \<lesssim> C*B"
   396 apply (rule sum_eq_2_times [THEN equalityD1, THEN subset_imp_lepoll])
   384 proof -
   397 apply (erule prod_lepoll_mono)
   385   have "B+B \<lesssim> 2*B"
   398 apply (rule lepoll_refl)
   386     by (simp add: sum_eq_2_times) 
   399 done
   387   also have "... \<lesssim> C*B"
       
   388     by (blast intro: prod_lepoll_mono lepoll_refl C) 
       
   389   finally show "B+B \<lesssim> C*B" .
       
   390 qed
   400 
   391 
   401 lemma lepoll_imp_sum_lepoll_prod: "[| A \<lesssim> B; 2 \<lesssim> A |] ==> A+B \<lesssim> A*B"
   392 lemma lepoll_imp_sum_lepoll_prod: "[| A \<lesssim> B; 2 \<lesssim> A |] ==> A+B \<lesssim> A*B"
   402 by (blast intro: sum_lepoll_mono sum_lepoll_prod lepoll_trans lepoll_refl)
   393 by (blast intro: sum_lepoll_mono sum_lepoll_prod lepoll_trans lepoll_refl)
   403 
   394 
   404 
   395 
   483 apply (rule pred_subset)
   474 apply (rule pred_subset)
   484 done
   475 done
   485 
   476 
   486 subsubsection{*Establishing the well-ordering*}
   477 subsubsection{*Establishing the well-ordering*}
   487 
   478 
   488 lemma csquare_lam_inj:
   479 lemma well_ord_csquare: 
   489      "Ord(K) ==> (lam <x,y>:K*K. <x \<union> y, x, y>) \<in> inj(K*K, K*K*K)"
   480   assumes K: "Ord(K)" shows "well_ord(K*K, csquare_rel(K))"
   490 apply (unfold inj_def)
   481 proof (unfold csquare_rel_def, rule well_ord_rvimage)
   491 apply (force intro: lam_type Un_least_lt [THEN ltD] ltI)
   482   show "(\<lambda>\<langle>x,y\<rangle>\<in>K \<times> K. \<langle>x \<union> y, x, y\<rangle>) \<in> inj(K \<times> K, K \<times> K \<times> K)" using K
   492 done
   483     by (force simp add: inj_def intro: lam_type Un_least_lt [THEN ltD] ltI)
   493 
   484 next
   494 lemma well_ord_csquare: "Ord(K) ==> well_ord(K*K, csquare_rel(K))"
   485   show "well_ord(K \<times> K \<times> K, rmult(K, Memrel(K), K \<times> K, rmult(K, Memrel(K), K, Memrel(K))))"
   495 apply (unfold csquare_rel_def)
   486     using K by (blast intro: well_ord_rmult well_ord_Memrel)
   496 apply (rule csquare_lam_inj [THEN well_ord_rvimage], assumption)
   487 qed
   497 apply (blast intro: well_ord_rmult well_ord_Memrel)
       
   498 done
       
   499 
   488 
   500 subsubsection{*Characterising initial segments of the well-ordering*}
   489 subsubsection{*Characterising initial segments of the well-ordering*}
   501 
   490 
   502 lemma csquareD:
   491 lemma csquareD:
   503  "[| <<x,y>, <z,z>> \<in> csquare_rel(K);  x<K;  y<K;  z<K |] ==> x \<le> z & y \<le> z"
   492  "[| <<x,y>, <z,z>> \<in> csquare_rel(K);  x<K;  y<K;  z<K |] ==> x \<le> z & y \<le> z"
   510 done
   499 done
   511 
   500 
   512 lemma pred_csquare_subset:
   501 lemma pred_csquare_subset:
   513     "z<K ==> Order.pred(K*K, <z,z>, csquare_rel(K)) \<subseteq> succ(z)*succ(z)"
   502     "z<K ==> Order.pred(K*K, <z,z>, csquare_rel(K)) \<subseteq> succ(z)*succ(z)"
   514 apply (unfold Order.pred_def)
   503 apply (unfold Order.pred_def)
   515 apply (safe del: SigmaI succCI)
   504 apply (safe del: SigmaI dest!: csquareD)
   516 apply (erule csquareD [THEN conjE])
       
   517 apply (unfold lt_def, auto)
   505 apply (unfold lt_def, auto)
   518 done
   506 done
   519 
   507 
   520 lemma csquare_ltI:
   508 lemma csquare_ltI:
   521  "[| x<z;  y<z;  z<K |] ==>  <<x,y>, <z,z>> \<in> csquare_rel(K)"
   509  "[| x<z;  y<z;  z<K |] ==>  <<x,y>, <z,z>> \<in> csquare_rel(K)"
   551 apply (rule csquare_ltI [THEN ordermap_mono, THEN ltI])
   539 apply (rule csquare_ltI [THEN ordermap_mono, THEN ltI])
   552 apply (erule_tac [4] well_ord_is_wf)
   540 apply (erule_tac [4] well_ord_is_wf)
   553 apply (blast intro!: Un_upper1_le Un_upper2_le Ord_ordermap elim!: ltE)+
   541 apply (blast intro!: Un_upper1_le Un_upper2_le Ord_ordermap elim!: ltE)+
   554 done
   542 done
   555 
   543 
   556 (*Kunen: "each <x,y>: K*K has no more than z*z predecessors..." (page 29) *)
   544 text{*Kunen: "each @{term"\<langle>x,y\<rangle> \<in> K \<times> K"} has no more than @{term"z \<times> z"} predecessors..." (page 29) *}
   557 lemma ordermap_csquare_le:
   545 lemma ordermap_csquare_le:
   558   "[| Limit(K);  x<K;  y<K;  z=succ(x \<union> y) |]
   546   assumes K: "Limit(K)" and x: "x<K" and y: " y<K" and z: "z=succ(x \<union> y)"
   559    ==> | ordermap(K*K, csquare_rel(K)) ` <x,y> | \<le> |succ(z)| \<otimes> |succ(z)|"
   547   shows "|ordermap(K \<times> K, csquare_rel(K)) ` \<langle>x,y\<rangle>| \<le> |succ(z)| \<otimes> |succ(z)|"
   560 apply (unfold cmult_def)
   548 proof (unfold cmult_def, rule well_ord_lepoll_imp_Card_le)
   561 apply (rule well_ord_rmult [THEN well_ord_lepoll_imp_Card_le])
   549   show "well_ord(|succ(z)| \<times> |succ(z)|, 
   562 apply (rule Ord_cardinal [THEN well_ord_Memrel])+
   550                  rmult(|succ(z)|, Memrel(|succ(z)|), |succ(z)|, Memrel(|succ(z)|)))"
   563 apply (subgoal_tac "z<K")
   551     by (blast intro: Ord_cardinal well_ord_Memrel well_ord_rmult) 
   564  prefer 2 apply (blast intro!: Un_least_lt Limit_has_succ)
   552 next
   565 apply (rule ordermap_z_lt [THEN leI, THEN le_imp_lepoll, THEN lepoll_trans],
   553   have zK: "z<K" using x y z K 
   566        assumption+)
   554     by (blast intro: Un_least_lt Limit_has_succ)
   567 apply (rule ordermap_eqpoll_pred [THEN eqpoll_imp_lepoll, THEN lepoll_trans])
   555   hence oz: "Ord(z)" by (elim ltE) 
   568 apply (erule Limit_is_Ord [THEN well_ord_csquare])
   556   have "ordermap(K \<times> K, csquare_rel(K)) ` \<langle>x,y\<rangle> \<lesssim> ordermap(K \<times> K, csquare_rel(K)) ` \<langle>z,z\<rangle>"
   569 apply (blast intro: ltD)
   557     by (blast intro: ordermap_z_lt leI le_imp_lepoll K x y z) 
   570 apply (rule pred_csquare_subset [THEN subset_imp_lepoll, THEN lepoll_trans],
   558   also have "... \<approx>  Order.pred(K \<times> K, \<langle>z,z\<rangle>, csquare_rel(K))"
   571             assumption)
   559     proof (rule ordermap_eqpoll_pred)
   572 apply (elim ltE)
   560       show "well_ord(K \<times> K, csquare_rel(K))" using K 
   573 apply (rule prod_eqpoll_cong [THEN eqpoll_sym, THEN eqpoll_imp_lepoll])
   561         by (rule Limit_is_Ord [THEN well_ord_csquare])
   574 apply (erule Ord_succ [THEN Ord_cardinal_eqpoll])+
   562     next
   575 done
   563       show "\<langle>z, z\<rangle> \<in> K \<times> K" using zK
   576 
   564         by (blast intro: ltD)
   577 (*Kunen: "... so the order type is @{text"\<le>"} K" *)
   565     qed
       
   566   also have "...  \<lesssim> succ(z) \<times> succ(z)" using zK
       
   567     by (rule pred_csquare_subset [THEN subset_imp_lepoll])
       
   568   also have "... \<approx> |succ(z)| \<times> |succ(z)|" using oz
       
   569     by (blast intro: prod_eqpoll_cong Ord_succ Ord_cardinal_eqpoll eqpoll_sym) 
       
   570   finally show "ordermap(K \<times> K, csquare_rel(K)) ` \<langle>x,y\<rangle> \<lesssim> |succ(z)| \<times> |succ(z)|" .
       
   571 qed
       
   572 
       
   573 text{*Kunen: "... so the order type is @{text"\<le>"} K" *}
   578 lemma ordertype_csquare_le:
   574 lemma ordertype_csquare_le:
   579      "[| InfCard(K);  \<forall>y\<in>K. InfCard(y) \<longrightarrow> y \<otimes> y = y |]
   575      "[| InfCard(K);  \<forall>y\<in>K. InfCard(y) \<longrightarrow> y \<otimes> y = y |]
   580       ==> ordertype(K*K, csquare_rel(K)) \<le> K"
   576       ==> ordertype(K*K, csquare_rel(K)) \<le> K"
   581 apply (frule InfCard_is_Card [THEN Card_is_Ord])
   577 apply (frule InfCard_is_Card [THEN Card_is_Ord])
   582 apply (rule all_lt_imp_le, assumption)
   578 apply (rule all_lt_imp_le, assumption)