src/HOL/Cardinals/Cardinal_Order_Relation.thy
changeset 54475 b4d644be252c
parent 54473 8bee5ca99e63
child 54481 5c9819d7713b
equal deleted inserted replaced
54474:6d5941722fae 54475:b4d644be252c
    32   card_of_image[simp]
    32   card_of_image[simp]
    33   card_of_singl_ordLeq[simp]
    33   card_of_singl_ordLeq[simp]
    34   Card_order_singl_ordLeq[simp]
    34   Card_order_singl_ordLeq[simp]
    35   card_of_Pow[simp]
    35   card_of_Pow[simp]
    36   Card_order_Pow[simp]
    36   Card_order_Pow[simp]
    37   card_of_set_type[simp]
       
    38   card_of_Plus1[simp]
    37   card_of_Plus1[simp]
    39   Card_order_Plus1[simp]
    38   Card_order_Plus1[simp]
    40   card_of_Plus2[simp]
    39   card_of_Plus2[simp]
    41   Card_order_Plus2[simp]
    40   Card_order_Plus2[simp]
    42   card_of_Plus_mono1[simp]
    41   card_of_Plus_mono1[simp]
    43   card_of_Plus_mono2[simp]
    42   card_of_Plus_mono2[simp]
    44   card_of_Plus_mono[simp]
    43   card_of_Plus_mono[simp]
    45   card_of_Plus_cong2[simp]
    44   card_of_Plus_cong2[simp]
    46   card_of_Plus_cong[simp]
    45   card_of_Plus_cong[simp]
    47   card_of_Un1[simp]
       
    48   card_of_diff[simp]
       
    49   card_of_Un_Plus_ordLeq[simp]
    46   card_of_Un_Plus_ordLeq[simp]
    50   card_of_Times1[simp]
    47   card_of_Times1[simp]
    51   card_of_Times2[simp]
    48   card_of_Times2[simp]
    52   card_of_Times3[simp]
    49   card_of_Times3[simp]
    53   card_of_Times_mono1[simp]
    50   card_of_Times_mono1[simp]
    54   card_of_Times_mono2[simp]
    51   card_of_Times_mono2[simp]
    55   card_of_Times_cong1[simp]
       
    56   card_of_Times_cong2[simp]
       
    57   card_of_ordIso_finite[simp]
    52   card_of_ordIso_finite[simp]
    58   finite_ordLess_infinite2[simp]
       
    59   card_of_Times_same_infinite[simp]
    53   card_of_Times_same_infinite[simp]
    60   card_of_Times_infinite_simps[simp]
    54   card_of_Times_infinite_simps[simp]
    61   card_of_Plus_infinite1[simp]
    55   card_of_Plus_infinite1[simp]
    62   card_of_Plus_infinite2[simp]
    56   card_of_Plus_infinite2[simp]
    63   card_of_Plus_ordLess_infinite[simp]
    57   card_of_Plus_ordLess_infinite[simp]
    64   card_of_Plus_ordLess_infinite_Field[simp]
    58   card_of_Plus_ordLess_infinite_Field[simp]
    65   card_of_lists_infinite[simp]
       
    66   infinite_cartesian_product[simp]
    59   infinite_cartesian_product[simp]
    67   cardSuc_Card_order[simp]
    60   cardSuc_Card_order[simp]
    68   cardSuc_greater[simp]
    61   cardSuc_greater[simp]
    69   cardSuc_ordLeq[simp]
    62   cardSuc_ordLeq[simp]
    70   cardSuc_ordLeq_ordLess[simp]
    63   cardSuc_ordLeq_ordLess[simp]
   141 qed
   134 qed
   142 
   135 
   143 
   136 
   144 subsection {* Cardinals versus set operations on arbitrary sets *}
   137 subsection {* Cardinals versus set operations on arbitrary sets *}
   145 
   138 
       
   139 lemma infinite_Pow:
       
   140 assumes "infinite A"
       
   141 shows "infinite (Pow A)"
       
   142 proof-
       
   143   have "|A| \<le>o |Pow A|" by (metis card_of_Pow ordLess_imp_ordLeq)
       
   144   thus ?thesis by (metis assms finite_Pow_iff)
       
   145 qed
       
   146 
       
   147 corollary card_of_set_type[simp]: "|UNIV::'a set| <o |UNIV::'a set set|"
       
   148 using card_of_Pow[of "UNIV::'a set"] by simp
       
   149 
       
   150 lemma card_of_Un1[simp]:
       
   151 shows "|A| \<le>o |A \<union> B| "
       
   152 using inj_on_id[of A] card_of_ordLeq[of A _] by fastforce
       
   153 
       
   154 lemma card_of_diff[simp]:
       
   155 shows "|A - B| \<le>o |A|"
       
   156 using inj_on_id[of "A - B"] card_of_ordLeq[of "A - B" _] by fastforce
       
   157 
   146 lemma subset_ordLeq_strict:
   158 lemma subset_ordLeq_strict:
   147 assumes "A \<le> B" and "|A| <o |B|"
   159 assumes "A \<le> B" and "|A| <o |B|"
   148 shows "A < B"
   160 shows "A < B"
   149 proof-
   161 proof-
   150   {assume "\<not>(A < B)"
   162   {assume "\<not>(A < B)"
   305 corollary Card_order_Times3:
   317 corollary Card_order_Times3:
   306 "Card_order r \<Longrightarrow> |Field r| \<le>o |(Field r) \<times> (Field r)|"
   318 "Card_order r \<Longrightarrow> |Field r| \<le>o |(Field r) \<times> (Field r)|"
   307 using card_of_Times3 card_of_Field_ordIso
   319 using card_of_Times3 card_of_Field_ordIso
   308       ordIso_ordLeq_trans ordIso_symmetric by blast
   320       ordIso_ordLeq_trans ordIso_symmetric by blast
   309 
   321 
       
   322 lemma card_of_Times_cong1[simp]:
       
   323 assumes "|A| =o |B|"
       
   324 shows "|A \<times> C| =o |B \<times> C|"
       
   325 using assms by (simp add: ordIso_iff_ordLeq card_of_Times_mono1)
       
   326 
       
   327 lemma card_of_Times_cong2[simp]:
       
   328 assumes "|A| =o |B|"
       
   329 shows "|C \<times> A| =o |C \<times> B|"
       
   330 using assms by (simp add: ordIso_iff_ordLeq card_of_Times_mono2)
       
   331 
   310 lemma card_of_Times_mono[simp]:
   332 lemma card_of_Times_mono[simp]:
   311 assumes "|A| \<le>o |B|" and "|C| \<le>o |D|"
   333 assumes "|A| \<le>o |B|" and "|C| \<le>o |D|"
   312 shows "|A \<times> C| \<le>o |B \<times> D|"
   334 shows "|A \<times> C| \<le>o |B \<times> D|"
   313 using assms card_of_Times_mono1[of A B C] card_of_Times_mono2[of C D B]
   335 using assms card_of_Times_mono1[of A B C] card_of_Times_mono2[of C D B]
   314       ordLeq_transitive[of "|A \<times> C|"] by blast
   336       ordLeq_transitive[of "|A \<times> C|"] by blast
   320 
   342 
   321 corollary ordIso_Times_cong1[simp]:
   343 corollary ordIso_Times_cong1[simp]:
   322 assumes "r =o r'"
   344 assumes "r =o r'"
   323 shows "|(Field r) \<times> C| =o |(Field r') \<times> C|"
   345 shows "|(Field r) \<times> C| =o |(Field r') \<times> C|"
   324 using assms card_of_cong card_of_Times_cong1 by blast
   346 using assms card_of_cong card_of_Times_cong1 by blast
       
   347 
       
   348 corollary ordIso_Times_cong2:
       
   349 assumes "r =o r'"
       
   350 shows "|A \<times> (Field r)| =o |A \<times> (Field r')|"
       
   351 using assms card_of_cong card_of_Times_cong2 by blast
   325 
   352 
   326 lemma card_of_Times_cong[simp]:
   353 lemma card_of_Times_cong[simp]:
   327 assumes "|A| =o |B|" and "|C| =o |D|"
   354 assumes "|A| =o |B|" and "|C| =o |D|"
   328 shows "|A \<times> C| =o |B \<times> D|"
   355 shows "|A \<times> C| =o |B \<times> D|"
   329 using assms
   356 using assms
   499         BIJ: "inj(g::'b \<Rightarrow> 'a)"
   526         BIJ: "inj(g::'b \<Rightarrow> 'a)"
   500 shows "(\<exists>(f::('b + 'a) => 'a). bij f) \<and> (\<exists>(h::('a + 'b) => 'a). bij h)"
   527 shows "(\<exists>(f::('b + 'a) => 'a). bij f) \<and> (\<exists>(h::('a + 'b) => 'a). bij h)"
   501 using assms Plus_infinite_bij_betw[of "UNIV::'a set" g "UNIV::'b set"]
   528 using assms Plus_infinite_bij_betw[of "UNIV::'a set" g "UNIV::'b set"]
   502 by auto
   529 by auto
   503 
   530 
       
   531 lemma card_of_Un_infinite:
       
   532 assumes INF: "infinite A" and LEQ: "|B| \<le>o |A|"
       
   533 shows "|A \<union> B| =o |A| \<and> |B \<union> A| =o |A|"
       
   534 proof-
       
   535   have "|A \<union> B| \<le>o |A <+> B|" by (rule card_of_Un_Plus_ordLeq)
       
   536   moreover have "|A <+> B| =o |A|"
       
   537   using assms by (metis card_of_Plus_infinite)
       
   538   ultimately have "|A \<union> B| \<le>o |A|" using ordLeq_ordIso_trans by blast
       
   539   hence "|A \<union> B| =o |A|" using card_of_Un1 ordIso_iff_ordLeq by blast
       
   540   thus ?thesis using Un_commute[of B A] by auto
       
   541 qed
       
   542 
   504 lemma card_of_Un_infinite_simps[simp]:
   543 lemma card_of_Un_infinite_simps[simp]:
   505 "\<lbrakk>infinite A; |B| \<le>o |A| \<rbrakk> \<Longrightarrow> |A \<union> B| =o |A|"
   544 "\<lbrakk>infinite A; |B| \<le>o |A| \<rbrakk> \<Longrightarrow> |A \<union> B| =o |A|"
   506 "\<lbrakk>infinite A; |B| \<le>o |A| \<rbrakk> \<Longrightarrow> |B \<union> A| =o |A|"
   545 "\<lbrakk>infinite A; |B| \<le>o |A| \<rbrakk> \<Longrightarrow> |B \<union> A| =o |A|"
   507 using card_of_Un_infinite by auto
   546 using card_of_Un_infinite by auto
       
   547 
       
   548 lemma card_of_Un_diff_infinite:
       
   549 assumes INF: "infinite A" and LESS: "|B| <o |A|"
       
   550 shows "|A - B| =o |A|"
       
   551 proof-
       
   552   obtain C where C_def: "C = A - B" by blast
       
   553   have "|A \<union> B| =o |A|"
       
   554   using assms ordLeq_iff_ordLess_or_ordIso card_of_Un_infinite by blast
       
   555   moreover have "C \<union> B = A \<union> B" unfolding C_def by auto
       
   556   ultimately have 1: "|C \<union> B| =o |A|" by auto
       
   557   (*  *)
       
   558   {assume *: "|C| \<le>o |B|"
       
   559    moreover
       
   560    {assume **: "finite B"
       
   561     hence "finite C"
       
   562     using card_of_ordLeq_finite * by blast
       
   563     hence False using ** INF card_of_ordIso_finite 1 by blast
       
   564    }
       
   565    hence "infinite B" by auto
       
   566    ultimately have False
       
   567    using card_of_Un_infinite 1 ordIso_equivalence(1,3) LESS not_ordLess_ordIso by metis
       
   568   }
       
   569   hence 2: "|B| \<le>o |C|" using card_of_Well_order ordLeq_total by blast
       
   570   {assume *: "finite C"
       
   571     hence "finite B" using card_of_ordLeq_finite 2 by blast
       
   572     hence False using * INF card_of_ordIso_finite 1 by blast
       
   573   }
       
   574   hence "infinite C" by auto
       
   575   hence "|C| =o |A|"
       
   576   using  card_of_Un_infinite 1 2 ordIso_equivalence(1,3) by metis
       
   577   thus ?thesis unfolding C_def .
       
   578 qed
   508 
   579 
   509 corollary Card_order_Un_infinite:
   580 corollary Card_order_Un_infinite:
   510 assumes INF: "infinite(Field r)" and CARD: "Card_order r" and
   581 assumes INF: "infinite(Field r)" and CARD: "Card_order r" and
   511         LEQ: "p \<le>o r"
   582         LEQ: "p \<le>o r"
   512 shows "| (Field r) \<union> (Field p) | =o r \<and> | (Field p) \<union> (Field r) | =o r"
   583 shows "| (Field r) \<union> (Field p) | =o r \<and> | (Field p) \<union> (Field r) | =o r"
   595   hence  "|A Un B| <o |?C|" using INF
   666   hence  "|A Un B| <o |?C|" using INF
   596   card_of_Un_ordLess_infinite by blast
   667   card_of_Un_ordLess_infinite by blast
   597   thus ?thesis using 1 ordLess_ordIso_trans by blast
   668   thus ?thesis using 1 ordLess_ordIso_trans by blast
   598 qed
   669 qed
   599 
   670 
       
   671 
       
   672 subsection {* Cardinals versus set operations involving infinite sets *}
       
   673 
       
   674 lemma finite_iff_cardOf_nat:
       
   675 "finite A = ( |A| <o |UNIV :: nat set| )"
       
   676 using infinite_iff_card_of_nat[of A]
       
   677 not_ordLeq_iff_ordLess[of "|A|" "|UNIV :: nat set|"]
       
   678 by (fastforce simp: card_of_Well_order)
       
   679 
       
   680 lemma finite_ordLess_infinite2[simp]:
       
   681 assumes "finite A" and "infinite B"
       
   682 shows "|A| <o |B|"
       
   683 using assms
       
   684 finite_ordLess_infinite[of "|A|" "|B|"]
       
   685 card_of_Well_order[of A] card_of_Well_order[of B]
       
   686 Field_card_of[of A] Field_card_of[of B] by auto
       
   687 
       
   688 lemma infinite_card_of_insert:
       
   689 assumes "infinite A"
       
   690 shows "|insert a A| =o |A|"
       
   691 proof-
       
   692   have iA: "insert a A = A \<union> {a}" by simp
       
   693   show ?thesis
       
   694   using infinite_imp_bij_betw2[OF assms] unfolding iA
       
   695   by (metis bij_betw_inv card_of_ordIso)
       
   696 qed
       
   697 
   600 lemma card_of_Un_singl_ordLess_infinite1:
   698 lemma card_of_Un_singl_ordLess_infinite1:
   601 assumes "infinite B" and "|A| <o |B|"
   699 assumes "infinite B" and "|A| <o |B|"
   602 shows "|{a} Un A| <o |B|"
   700 shows "|{a} Un A| <o |B|"
   603 proof-
   701 proof-
   604   have "|{a}| <o |B|" using assms by auto
   702   have "|{a}| <o |B|" using assms by auto
   614   moreover have "|A| <=o |insert a A|" using card_of_mono1[of A "insert a A"] by blast
   712   moreover have "|A| <=o |insert a A|" using card_of_mono1[of A "insert a A"] by blast
   615   ultimately show "|A| <o |B|" using ordLeq_ordLess_trans by blast
   713   ultimately show "|A| <o |B|" using ordLeq_ordLess_trans by blast
   616 qed
   714 qed
   617 
   715 
   618 
   716 
   619 subsection {* Cardinals versus lists  *}
   717 subsection {* Cardinals versus lists *}
       
   718 
       
   719 text{* The next is an auxiliary operator, which shall be used for inductive
       
   720 proofs of facts concerning the cardinality of @{text "List"} : *}
       
   721 
       
   722 definition nlists :: "'a set \<Rightarrow> nat \<Rightarrow> 'a list set"
       
   723 where "nlists A n \<equiv> {l. set l \<le> A \<and> length l = n}"
       
   724 
       
   725 lemma lists_def2: "lists A = {l. set l \<le> A}"
       
   726 using in_listsI by blast
       
   727 
       
   728 lemma lists_UNION_nlists: "lists A = (\<Union> n. nlists A n)"
       
   729 unfolding lists_def2 nlists_def by blast
       
   730 
       
   731 lemma card_of_lists: "|A| \<le>o |lists A|"
       
   732 proof-
       
   733   let ?h = "\<lambda> a. [a]"
       
   734   have "inj_on ?h A \<and> ?h ` A \<le> lists A"
       
   735   unfolding inj_on_def lists_def2 by auto
       
   736   thus ?thesis by (metis card_of_ordLeq)
       
   737 qed
       
   738 
       
   739 lemma nlists_0: "nlists A 0 = {[]}"
       
   740 unfolding nlists_def by auto
       
   741 
       
   742 lemma nlists_not_empty:
       
   743 assumes "A \<noteq> {}"
       
   744 shows "nlists A n \<noteq> {}"
       
   745 proof(induct n, simp add: nlists_0)
       
   746   fix n assume "nlists A n \<noteq> {}"
       
   747   then obtain a and l where "a \<in> A \<and> l \<in> nlists A n" using assms by auto
       
   748   hence "a # l \<in> nlists A (Suc n)" unfolding nlists_def by auto
       
   749   thus "nlists A (Suc n) \<noteq> {}" by auto
       
   750 qed
       
   751 
       
   752 lemma Nil_in_lists: "[] \<in> lists A"
       
   753 unfolding lists_def2 by auto
       
   754 
       
   755 lemma lists_not_empty: "lists A \<noteq> {}"
       
   756 using Nil_in_lists by blast
       
   757 
       
   758 lemma card_of_nlists_Succ: "|nlists A (Suc n)| =o |A \<times> (nlists A n)|"
       
   759 proof-
       
   760   let ?B = "A \<times> (nlists A n)"   let ?h = "\<lambda>(a,l). a # l"
       
   761   have "inj_on ?h ?B \<and> ?h ` ?B \<le> nlists A (Suc n)"
       
   762   unfolding inj_on_def nlists_def by auto
       
   763   moreover have "nlists A (Suc n) \<le> ?h ` ?B"
       
   764   proof(auto)
       
   765     fix l assume "l \<in> nlists A (Suc n)"
       
   766     hence 1: "length l = Suc n \<and> set l \<le> A" unfolding nlists_def by auto
       
   767     then obtain a and l' where 2: "l = a # l'" by (auto simp: length_Suc_conv)
       
   768     hence "a \<in> A \<and> set l' \<le> A \<and> length l' = n" using 1 by auto
       
   769     thus "l \<in> ?h ` ?B"  using 2 unfolding nlists_def by auto
       
   770   qed
       
   771   ultimately have "bij_betw ?h ?B (nlists A (Suc n))"
       
   772   unfolding bij_betw_def by auto
       
   773   thus ?thesis using card_of_ordIso ordIso_symmetric by blast
       
   774 qed
       
   775 
       
   776 lemma card_of_nlists_infinite:
       
   777 assumes "infinite A"
       
   778 shows "|nlists A n| \<le>o |A|"
       
   779 proof(induct n)
       
   780   have "A \<noteq> {}" using assms by auto
       
   781   thus "|nlists A 0| \<le>o |A|" by (simp add: nlists_0 card_of_singl_ordLeq)
       
   782 next
       
   783   fix n assume IH: "|nlists A n| \<le>o |A|"
       
   784   have "|nlists A (Suc n)| =o |A \<times> (nlists A n)|"
       
   785   using card_of_nlists_Succ by blast
       
   786   moreover
       
   787   {have "nlists A n \<noteq> {}" using assms nlists_not_empty[of A] by blast
       
   788    hence "|A \<times> (nlists A n)| =o |A|"
       
   789    using assms IH by (auto simp add: card_of_Times_infinite)
       
   790   }
       
   791   ultimately show "|nlists A (Suc n)| \<le>o |A|"
       
   792   using ordIso_transitive ordIso_iff_ordLeq by blast
       
   793 qed
   620 
   794 
   621 lemma Card_order_lists: "Card_order r \<Longrightarrow> r \<le>o |lists(Field r) |"
   795 lemma Card_order_lists: "Card_order r \<Longrightarrow> r \<le>o |lists(Field r) |"
   622 using card_of_lists card_of_Field_ordIso ordIso_ordLeq_trans ordIso_symmetric by blast
   796 using card_of_lists card_of_Field_ordIso ordIso_ordLeq_trans ordIso_symmetric by blast
   623 
   797 
   624 lemma Union_set_lists:
   798 lemma Union_set_lists:
   688   hence "bij_betw (map f) (lists A) (lists B)"
   862   hence "bij_betw (map f) (lists A) (lists B)"
   689   by (auto simp add: bij_betw_map_lists)
   863   by (auto simp add: bij_betw_map_lists)
   690   thus ?thesis using card_of_ordIso[of "lists A"] by auto
   864   thus ?thesis using card_of_ordIso[of "lists A"] by auto
   691 qed
   865 qed
   692 
   866 
       
   867 lemma card_of_lists_infinite[simp]:
       
   868 assumes "infinite A"
       
   869 shows "|lists A| =o |A|"
       
   870 proof-
       
   871   have "|lists A| \<le>o |A|"
       
   872   using assms
       
   873   by (auto simp add: lists_UNION_nlists card_of_UNION_ordLeq_infinite
       
   874                      infinite_iff_card_of_nat card_of_nlists_infinite)
       
   875   thus ?thesis using card_of_lists ordIso_iff_ordLeq by blast
       
   876 qed
       
   877 
       
   878 lemma Card_order_lists_infinite:
       
   879 assumes "Card_order r" and "infinite(Field r)"
       
   880 shows "|lists(Field r)| =o r"
       
   881 using assms card_of_lists_infinite card_of_Field_ordIso ordIso_transitive by blast
       
   882 
   693 lemma ordIso_lists_cong:
   883 lemma ordIso_lists_cong:
   694 assumes "r =o r'"
   884 assumes "r =o r'"
   695 shows "|lists(Field r)| =o |lists(Field r')|"
   885 shows "|lists(Field r)| =o |lists(Field r')|"
   696 using assms card_of_cong card_of_lists_cong by blast
   886 using assms card_of_cong card_of_lists_cong by blast
   697 
   887 
   825 subsubsection {* First as well-orders *}
  1015 subsubsection {* First as well-orders *}
   826 
  1016 
   827 lemma Field_natLess: "Field natLess = (UNIV::nat set)"
  1017 lemma Field_natLess: "Field natLess = (UNIV::nat set)"
   828 by(unfold Field_def, auto)
  1018 by(unfold Field_def, auto)
   829 
  1019 
       
  1020 lemma natLeq_well_order_on: "well_order_on UNIV natLeq"
       
  1021 using natLeq_Well_order Field_natLeq by auto
       
  1022 
       
  1023 lemma natLeq_wo_rel: "wo_rel natLeq"
       
  1024 unfolding wo_rel_def using natLeq_Well_order .
       
  1025 
   830 lemma natLeq_ofilter_less: "ofilter natLeq {0 ..< n}"
  1026 lemma natLeq_ofilter_less: "ofilter natLeq {0 ..< n}"
   831 by(auto simp add: natLeq_wo_rel wo_rel.ofilter_def,
  1027 by(auto simp add: natLeq_wo_rel wo_rel.ofilter_def,
   832    simp add:  Field_natLeq, unfold rel.under_def, auto)
  1028    simp add: Field_natLeq, unfold rel.under_def, auto)
   833 
  1029 
   834 lemma natLeq_ofilter_leq: "ofilter natLeq {0 .. n}"
  1030 lemma natLeq_ofilter_leq: "ofilter natLeq {0 .. n}"
   835 by(auto simp add: natLeq_wo_rel wo_rel.ofilter_def,
  1031 by(auto simp add: natLeq_wo_rel wo_rel.ofilter_def,
   836    simp add:  Field_natLeq, unfold rel.under_def, auto)
  1032    simp add: Field_natLeq, unfold rel.under_def, auto)
       
  1033 
       
  1034 lemma natLeq_UNIV_ofilter: "wo_rel.ofilter natLeq UNIV"
       
  1035 using natLeq_wo_rel Field_natLeq wo_rel.Field_ofilter[of natLeq] by auto
   837 
  1036 
   838 lemma natLeq_ofilter_iff:
  1037 lemma natLeq_ofilter_iff:
   839 "ofilter natLeq A = (A = UNIV \<or> (\<exists>n. A = {0 ..< n}))"
  1038 "ofilter natLeq A = (A = UNIV \<or> (\<exists>n. A = {0 ..< n}))"
   840 proof(rule iffI)
  1039 proof(rule iffI)
   841   assume "ofilter natLeq A"
  1040   assume "ofilter natLeq A"
   898   using assms card_of_less ordIso_symmetric ordLeq_ordIso_trans by blast
  1097   using assms card_of_less ordIso_symmetric ordLeq_ordIso_trans by blast
   899   thus ?thesis by (auto simp add: card_of_ordLeq_finite)
  1098   thus ?thesis by (auto simp add: card_of_ordLeq_finite)
   900 qed
  1099 qed
   901 
  1100 
   902 
  1101 
   903 subsubsection {* "Backwards compatibility" with the numeric cardinal operator for finite sets *}
  1102 subsubsection {* "Backward compatibility" with the numeric cardinal operator for finite sets *}
   904 
  1103 
   905 lemma finite_card_of_iff_card:
  1104 lemma finite_card_of_iff_card:
   906 assumes FIN: "finite A" and FIN': "finite B"
  1105 assumes FIN: "finite A" and FIN': "finite B"
   907 shows "( |A| =o |B| ) = (card A = card B)"
  1106 shows "( |A| =o |B| ) = (card A = card B)"
   908 using assms card_of_ordIso[of A B] bij_betw_iff_card[of A B] by blast
  1107 using assms card_of_ordIso[of A B] bij_betw_iff_card[of A B] by blast
   990 
  1189 
   991 lemma relChain_under:
  1190 lemma relChain_under:
   992 assumes "Well_order r"
  1191 assumes "Well_order r"
   993 shows "relChain r (\<lambda> i. under r i)"
  1192 shows "relChain r (\<lambda> i. under r i)"
   994 using assms unfolding relChain_def by auto
  1193 using assms unfolding relChain_def by auto
       
  1194 
       
  1195 lemma card_of_infinite_diff_finite:
       
  1196 assumes "infinite A" and "finite B"
       
  1197 shows "|A - B| =o |A|"
       
  1198 by (metis assms card_of_Un_diff_infinite finite_ordLess_infinite2)
   995 
  1199 
   996 lemma infinite_card_of_diff_singl:
  1200 lemma infinite_card_of_diff_singl:
   997 assumes "infinite A"
  1201 assumes "infinite A"
   998 shows "|A - {a}| =o |A|"
  1202 shows "|A - {a}| =o |A|"
   999 by (metis assms card_of_infinite_diff_finite finite.emptyI finite_insert)
  1203 by (metis assms card_of_infinite_diff_finite finite.emptyI finite_insert)
  1108 next
  1312 next
  1109   fix f A' assume "f \<in> Func_option A' B" and "A' \<subseteq> A"
  1313   fix f A' assume "f \<in> Func_option A' B" and "A' \<subseteq> A"
  1110   thus "f \<in> Pfunc A B" unfolding Func_option_def Pfunc_def by auto
  1314   thus "f \<in> Pfunc A B" unfolding Func_option_def Pfunc_def by auto
  1111 qed
  1315 qed
  1112 
  1316 
       
  1317 lemma card_of_Func_mono:
       
  1318 fixes A1 A2 :: "'a set" and B :: "'b set"
       
  1319 assumes A12: "A1 \<subseteq> A2" and B: "B \<noteq> {}"
       
  1320 shows "|Func A1 B| \<le>o |Func A2 B|"
       
  1321 proof-
       
  1322   obtain bb where bb: "bb \<in> B" using B by auto
       
  1323   def F \<equiv> "\<lambda> (f1::'a \<Rightarrow> 'b) a. if a \<in> A2 then (if a \<in> A1 then f1 a else bb)
       
  1324                                                 else undefined"
       
  1325   show ?thesis unfolding card_of_ordLeq[symmetric] proof(intro exI[of _ F] conjI)
       
  1326     show "inj_on F (Func A1 B)" unfolding inj_on_def proof safe
       
  1327       fix f g assume f: "f \<in> Func A1 B" and g: "g \<in> Func A1 B" and eq: "F f = F g"
       
  1328       show "f = g"
       
  1329       proof(rule ext)
       
  1330         fix a show "f a = g a"
       
  1331         proof(cases "a \<in> A1")
       
  1332           case True
       
  1333           thus ?thesis using eq A12 unfolding F_def fun_eq_iff
       
  1334           by (elim allE[of _ a]) auto
       
  1335         qed(insert f g, unfold Func_def, fastforce)
       
  1336       qed
       
  1337     qed
       
  1338   qed(insert bb, unfold Func_def F_def, force)
       
  1339 qed
       
  1340 
  1113 lemma card_of_Func_option_mono:
  1341 lemma card_of_Func_option_mono:
  1114 fixes A1 A2 :: "'a set" and B :: "'b set"
  1342 fixes A1 A2 :: "'a set" and B :: "'b set"
  1115 assumes A12: "A1 \<subseteq> A2" and B: "B \<noteq> {}"
  1343 assumes A12: "A1 \<subseteq> A2" and B: "B \<noteq> {}"
  1116 shows "|Func_option A1 B| \<le>o |Func_option A2 B|"
  1344 shows "|Func_option A1 B| \<le>o |Func_option A2 B|"
  1117 by (metis card_of_Func_mono[OF A12 B] card_of_Func_option_Func
  1345 by (metis card_of_Func_mono[OF A12 B] card_of_Func_option_Func
  1176 
  1404 
  1177 lemma card_of_Func_UNIV_UNIV:
  1405 lemma card_of_Func_UNIV_UNIV:
  1178 "|Func (UNIV::'a set) (UNIV::'b set)| =o |UNIV::('a \<Rightarrow> 'b) set|"
  1406 "|Func (UNIV::'a set) (UNIV::'b set)| =o |UNIV::('a \<Rightarrow> 'b) set|"
  1179 using card_of_Func_UNIV[of "UNIV::'b set"] by auto
  1407 using card_of_Func_UNIV[of "UNIV::'b set"] by auto
  1180 
  1408 
       
  1409 lemma ordLeq_Func:
       
  1410 assumes "{b1,b2} \<subseteq> B" "b1 \<noteq> b2"
       
  1411 shows "|A| \<le>o |Func A B|"
       
  1412 unfolding card_of_ordLeq[symmetric] proof(intro exI conjI)
       
  1413   let ?F = "\<lambda> aa a. if a \<in> A then (if a = aa then b1 else b2) else undefined"
       
  1414   show "inj_on ?F A" using assms unfolding inj_on_def fun_eq_iff by auto
       
  1415   show "?F ` A \<subseteq> Func A B" using assms unfolding Func_def by auto
       
  1416 qed
       
  1417 
       
  1418 lemma infinite_Func:
       
  1419 assumes A: "infinite A" and B: "{b1,b2} \<subseteq> B" "b1 \<noteq> b2"
       
  1420 shows "infinite (Func A B)"
       
  1421 using ordLeq_Func[OF B] by (metis A card_of_ordLeq_finite)
       
  1422 
  1181 end
  1423 end