src/ZF/Cardinal.ML
changeset 833 ba386650df2c
parent 803 4c8333ab3eae
child 845 825e96b87ef7
equal deleted inserted replaced
832:ad50a9e74eaf 833:ba386650df2c
   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";