src/HOL/Cardinals/Cardinal_Order_Relation.thy
author wenzelm
Wed, 12 Mar 2025 11:39:00 +0100
changeset 82265 4b875a4c83b0
parent 76951 293caf3dbecd
permissions -rw-r--r--
update for release;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
49310
6e30078de4f0 renamed "Ordinals_and_Cardinals" to "Cardinals"
blanchet
parents: 48979
diff changeset
     1
(*  Title:      HOL/Cardinals/Cardinal_Order_Relation.thy
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
     2
    Author:     Andrei Popescu, TU Muenchen
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
     3
    Copyright   2012
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
     4
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
     5
Cardinal-order relations.
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
     6
*)
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
     7
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 63092
diff changeset
     8
section \<open>Cardinal-Order Relations\<close>
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
     9
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    10
theory Cardinal_Order_Relation
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
    11
  imports Wellorder_Constructions
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    12
begin
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    13
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    14
declare
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    15
  card_order_on_well_order_on[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    16
  card_of_card_order_on[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    17
  card_of_well_order_on[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    18
  Field_card_of[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    19
  card_of_Card_order[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    20
  card_of_Well_order[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    21
  card_of_least[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    22
  card_of_unique[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    23
  card_of_mono1[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    24
  card_of_mono2[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    25
  card_of_cong[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    26
  card_of_Field_ordIso[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    27
  card_of_underS[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    28
  ordLess_Field[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    29
  card_of_empty[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    30
  card_of_empty1[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    31
  card_of_image[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    32
  card_of_singl_ordLeq[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    33
  Card_order_singl_ordLeq[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    34
  card_of_Pow[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    35
  Card_order_Pow[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    36
  card_of_Plus1[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    37
  Card_order_Plus1[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    38
  card_of_Plus2[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    39
  Card_order_Plus2[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    40
  card_of_Plus_mono1[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    41
  card_of_Plus_mono2[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    42
  card_of_Plus_mono[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    43
  card_of_Plus_cong2[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    44
  card_of_Plus_cong[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    45
  card_of_Un_Plus_ordLeq[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    46
  card_of_Times1[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    47
  card_of_Times2[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    48
  card_of_Times3[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    49
  card_of_Times_mono1[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    50
  card_of_Times_mono2[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    51
  card_of_ordIso_finite[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    52
  card_of_Times_same_infinite[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    53
  card_of_Times_infinite_simps[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    54
  card_of_Plus_infinite1[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    55
  card_of_Plus_infinite2[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    56
  card_of_Plus_ordLess_infinite[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    57
  card_of_Plus_ordLess_infinite_Field[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    58
  infinite_cartesian_product[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    59
  cardSuc_Card_order[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    60
  cardSuc_greater[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    61
  cardSuc_ordLeq[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    62
  cardSuc_ordLeq_ordLess[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    63
  cardSuc_mono_ordLeq[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    64
  cardSuc_invar_ordIso[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    65
  card_of_cardSuc_finite[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    66
  cardSuc_finite[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    67
  card_of_Plus_ordLeq_infinite_Field[simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    68
  curr_in[intro, simp]
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    69
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    70
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 63092
diff changeset
    71
subsection \<open>Cardinal of a set\<close>
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    72
67613
ce654b0e6d69 more symbols;
wenzelm
parents: 66453
diff changeset
    73
lemma card_of_inj_rel: assumes INJ: "\<And>x y y'. \<lbrakk>(x,y) \<in> R; (x,y') \<in> R\<rbrakk> \<Longrightarrow> y = y'"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
    74
  shows "|{y. \<exists>x. (x,y) \<in> R}| <=o |{x. \<exists>y. (x,y) \<in> R}|"
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    75
proof-
67613
ce654b0e6d69 more symbols;
wenzelm
parents: 66453
diff changeset
    76
  let ?Y = "{y. \<exists>x. (x,y) \<in> R}"  let ?X = "{x. \<exists>y. (x,y) \<in> R}"
ce654b0e6d69 more symbols;
wenzelm
parents: 66453
diff changeset
    77
  let ?f = "\<lambda>y. SOME x. (x,y) \<in> R"
51764
67f05cb13e08 optimized proofs
traytel
parents: 49310
diff changeset
    78
  have "?f ` ?Y <= ?X" by (auto dest: someI)
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    79
  moreover have "inj_on ?f ?Y"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
    80
    by (metis (mono_tags, lifting) assms inj_onI mem_Collect_eq)
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    81
  ultimately show "|?Y| <=o |?X|" using card_of_ordLeq by blast
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    82
qed
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    83
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    84
lemma card_of_unique2: "\<lbrakk>card_order_on B r; bij_betw f A B\<rbrakk> \<Longrightarrow> r =o |A|"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
    85
  using card_of_ordIso card_of_unique ordIso_equivalence by blast
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    86
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    87
lemma internalize_card_of_ordLess2:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
    88
  "( |A| <o |C| ) = (\<exists>B < C. |A| =o |B| \<and> |B| <o |C| )"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
    89
  using internalize_card_of_ordLess[of "A" "|C|"] Field_card_of[of C] by auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    90
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    91
lemma Card_order_omax:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
    92
  assumes "finite R" and "R \<noteq> {}" and "\<forall>r\<in>R. Card_order r"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
    93
  shows "Card_order (omax R)"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
    94
  by (simp add: assms omax_in)
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    95
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    96
lemma Card_order_omax2:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
    97
  assumes "finite I" and "I \<noteq> {}"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
    98
  shows "Card_order (omax {|A i| | i. i \<in> I})"
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    99
proof-
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   100
  let ?R = "{|A i| | i. i \<in> I}"
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   101
  have "finite ?R" and "?R \<noteq> {}" using assms by auto
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   102
  moreover have "\<forall>r\<in>?R. Card_order r"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   103
    using card_of_Card_order by auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   104
  ultimately show ?thesis by(rule Card_order_omax)
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   105
qed
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   106
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   107
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 63092
diff changeset
   108
subsection \<open>Cardinals versus set operations on arbitrary sets\<close>
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   109
54481
5c9819d7713b compile
blanchet
parents: 54475
diff changeset
   110
lemma card_of_set_type[simp]: "|UNIV::'a set| <o |UNIV::'a set set|"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   111
  using card_of_Pow[of "UNIV::'a set"] by simp
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   112
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   113
lemma card_of_Un1[simp]: "|A| \<le>o |A \<union> B| "
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   114
  by fastforce
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   115
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   116
lemma card_of_diff[simp]: "|A - B| \<le>o |A|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   117
  by fastforce
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   118
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   119
lemma subset_ordLeq_strict:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   120
  assumes "A \<le> B" and "|A| <o |B|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   121
  shows "A < B"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   122
  using assms ordLess_irreflexive by blast
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   123
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   124
corollary subset_ordLeq_diff:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   125
  assumes "A \<le> B" and "|A| <o |B|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   126
  shows "B - A \<noteq> {}"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   127
  using assms subset_ordLeq_strict by blast
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   128
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   129
lemma card_of_empty4:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   130
  "|{}::'b set| <o |A::'a set| = (A \<noteq> {})"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   131
  by (metis card_of_empty card_of_ordLess2 image_is_empty not_ordLess_ordLeq)
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   132
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   133
lemma card_of_empty5:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   134
  "|A| <o |B| \<Longrightarrow> B \<noteq> {}"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   135
  using card_of_empty not_ordLess_ordLeq by blast
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   136
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   137
lemma Well_order_card_of_empty:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   138
  "Well_order r \<Longrightarrow> |{}| \<le>o r" 
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   139
  by simp
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   140
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   141
lemma card_of_UNIV[simp]:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   142
  "|A :: 'a set| \<le>o |UNIV :: 'a set|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   143
  by simp
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   144
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   145
lemma card_of_UNIV2[simp]:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   146
  "Card_order r \<Longrightarrow> (r :: 'a rel) \<le>o |UNIV :: 'a set|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   147
  using card_of_UNIV[of "Field r"] card_of_Field_ordIso
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   148
    ordIso_symmetric ordIso_ordLeq_trans by blast
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   149
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   150
lemma card_of_Pow_mono[simp]:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   151
  assumes "|A| \<le>o |B|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   152
  shows "|Pow A| \<le>o |Pow B|"
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   153
proof-
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   154
  obtain f where "inj_on f A \<and> f ` A \<le> B"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   155
    using assms card_of_ordLeq[of A B] by auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   156
  hence "inj_on (image f) (Pow A) \<and> (image f) ` (Pow A) \<le> (Pow B)"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   157
    by (auto simp: inj_on_image_Pow image_Pow_mono)
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   158
  thus ?thesis using card_of_ordLeq[of "Pow A"] by metis
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   159
qed
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   160
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   161
lemma ordIso_Pow_mono[simp]:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   162
  assumes "r \<le>o r'"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   163
  shows "|Pow(Field r)| \<le>o |Pow(Field r')|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   164
  using assms card_of_mono2 card_of_Pow_mono by blast
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   165
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   166
lemma card_of_Pow_cong[simp]:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   167
  assumes "|A| =o |B|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   168
  shows "|Pow A| =o |Pow B|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   169
  by (meson assms card_of_Pow_mono ordIso_iff_ordLeq)
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   170
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   171
lemma ordIso_Pow_cong[simp]:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   172
  assumes "r =o r'"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   173
  shows "|Pow(Field r)| =o |Pow(Field r')|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   174
  using assms card_of_cong card_of_Pow_cong by blast
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   175
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   176
corollary Card_order_Plus_empty1:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   177
  "Card_order r \<Longrightarrow> r =o |(Field r) <+> {}|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   178
  using card_of_Plus_empty1 card_of_Field_ordIso ordIso_equivalence by blast
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   179
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   180
corollary Card_order_Plus_empty2:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   181
  "Card_order r \<Longrightarrow> r =o |{} <+> (Field r)|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   182
  using card_of_Plus_empty2 card_of_Field_ordIso ordIso_equivalence by blast
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   183
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   184
lemma card_of_Un2[simp]:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   185
  shows "|A| \<le>o |B \<union> A|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   186
  by fastforce
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   187
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   188
lemma Un_Plus_bij_betw:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   189
  assumes "A Int B = {}"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   190
  shows "\<exists>f. bij_betw f (A \<union> B) (A <+> B)"
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   191
proof-
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   192
  have "bij_betw (\<lambda> c. if c \<in> A then Inl c else Inr c) (A \<union> B) (A <+> B)"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   193
    using assms unfolding bij_betw_def inj_on_def by auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   194
  thus ?thesis by blast
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   195
qed
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   196
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   197
lemma card_of_Un_Plus_ordIso:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   198
  assumes "A Int B = {}"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   199
  shows "|A \<union> B| =o |A <+> B|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   200
  by (meson Un_Plus_bij_betw assms card_of_ordIso)
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   201
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   202
lemma card_of_Un_Plus_ordIso1:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   203
  "|A \<union> B| =o |A <+> (B - A)|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   204
  using card_of_Un_Plus_ordIso[of A "B - A"] by auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   205
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   206
lemma card_of_Un_Plus_ordIso2:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   207
  "|A \<union> B| =o |(A - B) <+> B|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   208
  using card_of_Un_Plus_ordIso[of "A - B" B] by auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   209
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   210
lemma card_of_Times_singl1: "|A| =o |A \<times> {b}|"
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   211
proof-
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   212
  have "bij_betw fst (A \<times> {b}) A" unfolding bij_betw_def inj_on_def by force
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   213
  thus ?thesis using card_of_ordIso ordIso_symmetric by blast
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   214
qed
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   215
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   216
corollary Card_order_Times_singl1:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   217
  "Card_order r \<Longrightarrow> r =o |(Field r) \<times> {b}|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   218
  using card_of_Times_singl1[of _ b] card_of_Field_ordIso ordIso_equivalence by blast
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   219
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   220
lemma card_of_Times_singl2: "|A| =o |{b} \<times> A|"
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   221
proof-
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   222
  have "bij_betw snd ({b} \<times> A) A" 
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   223
    unfolding bij_betw_def inj_on_def by force
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   224
  thus ?thesis using card_of_ordIso ordIso_symmetric by blast
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   225
qed
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   226
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   227
corollary Card_order_Times_singl2:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   228
  "Card_order r \<Longrightarrow> r =o |{a} \<times> (Field r)|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   229
  using card_of_Times_singl2[of _ a] card_of_Field_ordIso ordIso_equivalence by blast
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   230
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   231
lemma card_of_Times_assoc: "|(A \<times> B) \<times> C| =o |A \<times> B \<times> C|"
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   232
proof -
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   233
  let ?f = "\<lambda>((a,b),c). (a,(b,c))"
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   234
  have "A \<times> B \<times> C \<subseteq> ?f ` ((A \<times> B) \<times> C)"
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   235
  proof
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   236
    fix x assume "x \<in> A \<times> B \<times> C"
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   237
    then obtain a b c where *: "a \<in> A" "b \<in> B" "c \<in> C" "x = (a, b, c)" by blast
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   238
    let ?x = "((a, b), c)"
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   239
    from * have "?x \<in> (A \<times> B) \<times> C" "x = ?f ?x" by auto
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   240
    thus "x \<in> ?f ` ((A \<times> B) \<times> C)" by blast
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   241
  qed
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   242
  hence "bij_betw ?f ((A \<times> B) \<times> C) (A \<times> B \<times> C)"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   243
    unfolding bij_betw_def inj_on_def by auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   244
  thus ?thesis using card_of_ordIso by blast
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   245
qed
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   246
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   247
lemma card_of_Times_cong1[simp]:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   248
  assumes "|A| =o |B|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   249
  shows "|A \<times> C| =o |B \<times> C|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   250
  using assms by (simp add: ordIso_iff_ordLeq)
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   251
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   252
lemma card_of_Times_cong2[simp]:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   253
  assumes "|A| =o |B|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   254
  shows "|C \<times> A| =o |C \<times> B|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   255
  using assms by (simp add: ordIso_iff_ordLeq)
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   256
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   257
lemma card_of_Times_mono[simp]:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   258
  assumes "|A| \<le>o |B|" and "|C| \<le>o |D|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   259
  shows "|A \<times> C| \<le>o |B \<times> D|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   260
  using assms card_of_Times_mono1[of A B C] card_of_Times_mono2[of C D B]
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   261
    ordLeq_transitive[of "|A \<times> C|"] by blast
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   262
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   263
corollary ordLeq_Times_mono:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   264
  assumes "r \<le>o r'" and "p \<le>o p'"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   265
  shows "|(Field r) \<times> (Field p)| \<le>o |(Field r') \<times> (Field p')|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   266
  using assms card_of_mono2[of r r'] card_of_mono2[of p p'] card_of_Times_mono by blast
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   267
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   268
corollary ordIso_Times_cong1[simp]:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   269
  assumes "r =o r'"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   270
  shows "|(Field r) \<times> C| =o |(Field r') \<times> C|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   271
  using assms card_of_cong card_of_Times_cong1 by blast
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   272
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   273
corollary ordIso_Times_cong2:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   274
  assumes "r =o r'"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   275
  shows "|A \<times> (Field r)| =o |A \<times> (Field r')|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   276
  using assms card_of_cong card_of_Times_cong2 by blast
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   277
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   278
lemma card_of_Times_cong[simp]:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   279
  assumes "|A| =o |B|" and "|C| =o |D|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   280
  shows "|A \<times> C| =o |B \<times> D|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   281
  using assms
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   282
  by (auto simp: ordIso_iff_ordLeq)
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   283
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   284
corollary ordIso_Times_cong:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   285
  assumes "r =o r'" and "p =o p'"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   286
  shows "|(Field r) \<times> (Field p)| =o |(Field r') \<times> (Field p')|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   287
  using assms card_of_cong[of r r'] card_of_cong[of p p'] card_of_Times_cong by blast
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   288
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   289
lemma card_of_Sigma_mono2:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   290
  assumes "inj_on f (I::'i set)" and "f ` I \<le> (J::'j set)"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   291
  shows "|SIGMA i : I. (A::'j \<Rightarrow> 'a set) (f i)| \<le>o |SIGMA j : J. A j|"
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   292
proof-
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   293
  let ?LEFT = "SIGMA i : I. A (f i)"
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   294
  let ?RIGHT = "SIGMA j : J. A j"
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   295
  obtain u where u_def: "u = (\<lambda>(i::'i,a::'a). (f i,a))" by blast
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   296
  have "inj_on u ?LEFT \<and> u `?LEFT \<le> ?RIGHT"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   297
    using assms unfolding u_def inj_on_def by auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   298
  thus ?thesis using card_of_ordLeq by blast
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   299
qed
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   300
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   301
lemma card_of_Sigma_mono:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   302
  assumes INJ: "inj_on f I" and IM: "f ` I \<le> J" and
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   303
    LEQ: "\<forall>j \<in> J. |A j| \<le>o |B j|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   304
  shows "|SIGMA i : I. A (f i)| \<le>o |SIGMA j : J. B j|"
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   305
proof-
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   306
  have "\<forall>i \<in> I. |A(f i)| \<le>o |B(f i)|"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   307
    using IM LEQ by blast
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   308
  hence "|SIGMA i : I. A (f i)| \<le>o |SIGMA i : I. B (f i)|"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   309
    using card_of_Sigma_mono1[of I] by metis
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   310
  moreover have "|SIGMA i : I. B (f i)| \<le>o |SIGMA j : J. B j|"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   311
    using INJ IM card_of_Sigma_mono2 by blast
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   312
  ultimately show ?thesis using ordLeq_transitive by blast
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   313
qed
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   314
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   315
lemma ordLeq_Sigma_mono1:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   316
  assumes "\<forall>i \<in> I. p i \<le>o r i"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   317
  shows "|SIGMA i : I. Field(p i)| \<le>o |SIGMA i : I. Field(r i)|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   318
  using assms by (auto simp: card_of_Sigma_mono1)
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   319
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   320
lemma ordLeq_Sigma_mono:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   321
  assumes "inj_on f I" and "f ` I \<le> J" and
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   322
    "\<forall>j \<in> J. p j \<le>o r j"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   323
  shows "|SIGMA i : I. Field(p(f i))| \<le>o |SIGMA j : J. Field(r j)|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   324
  using assms card_of_mono2 card_of_Sigma_mono [of f I J "\<lambda> i. Field(p i)"] by metis
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   325
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   326
lemma ordIso_Sigma_cong1:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   327
  assumes "\<forall>i \<in> I. p i =o r i"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   328
  shows "|SIGMA i : I. Field(p i)| =o |SIGMA i : I. Field(r i)|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   329
  using assms by (auto simp: card_of_Sigma_cong1)
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   330
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   331
lemma ordLeq_Sigma_cong:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   332
  assumes "bij_betw f I J" and
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   333
    "\<forall>j \<in> J. p j =o r j"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   334
  shows "|SIGMA i : I. Field(p(f i))| =o |SIGMA j : J. Field(r j)|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   335
  using assms card_of_cong card_of_Sigma_cong
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   336
    [of f I J "\<lambda> j. Field(p j)" "\<lambda> j. Field(r j)"] by blast
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   337
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   338
lemma card_of_UNION_Sigma2:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   339
  assumes "\<And>i j. \<lbrakk>{i,j} <= I; i \<noteq> j\<rbrakk> \<Longrightarrow> A i Int A j = {}"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   340
  shows "|\<Union>i\<in>I. A i| =o |Sigma I A|"
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   341
proof-
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   342
  let ?L = "\<Union>i\<in>I. A i"  let ?R = "Sigma I A"
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   343
  have "|?L| <=o |?R|" using card_of_UNION_Sigma .
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   344
  moreover have "|?R| <=o |?L|"
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   345
  proof-
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   346
    have "inj_on snd ?R"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   347
      unfolding inj_on_def using assms by auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   348
    moreover have "snd ` ?R <= ?L" by auto
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   349
    ultimately show ?thesis using card_of_ordLeq by blast
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   350
  qed
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   351
  ultimately show ?thesis by(simp add: ordIso_iff_ordLeq)
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   352
qed
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   353
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   354
corollary Plus_into_Times:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   355
  assumes A2: "a1 \<noteq> a2 \<and> {a1,a2} \<le> A" and B2: "b1 \<noteq> b2 \<and> {b1,b2} \<le> B"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   356
  shows "\<exists>f. inj_on f (A <+> B) \<and> f ` (A <+> B) \<le> A \<times> B"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   357
  using assms by (auto simp: card_of_Plus_Times card_of_ordLeq)
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   358
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   359
corollary Plus_into_Times_types:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   360
  assumes A2: "(a1::'a) \<noteq> a2" and B2: "(b1::'b) \<noteq> b2"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   361
  shows "\<exists>(f::'a + 'b \<Rightarrow> 'a * 'b). inj f"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   362
  using assms Plus_into_Times[of a1 a2 UNIV b1 b2 UNIV]
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   363
  by auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   364
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   365
corollary Times_same_infinite_bij_betw:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   366
  assumes "\<not>finite A"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   367
  shows "\<exists>f. bij_betw f (A \<times> A) A"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   368
  using assms by (auto simp: card_of_ordIso)
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   369
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   370
corollary Times_same_infinite_bij_betw_types:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   371
  assumes INF: "\<not>finite(UNIV::'a set)"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   372
  shows "\<exists>(f::('a * 'a) => 'a). bij f"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   373
  using assms Times_same_infinite_bij_betw[of "UNIV::'a set"]
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   374
  by auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   375
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   376
corollary Times_infinite_bij_betw:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   377
  assumes INF: "\<not>finite A" and NE: "B \<noteq> {}" and INJ: "inj_on g B \<and> g ` B \<le> A"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   378
  shows "(\<exists>f. bij_betw f (A \<times> B) A) \<and> (\<exists>h. bij_betw h (B \<times> A) A)"
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   379
proof-
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   380
  have "|B| \<le>o |A|" using INJ card_of_ordLeq by blast
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   381
  thus ?thesis using INF NE
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   382
    by (auto simp: card_of_ordIso card_of_Times_infinite)
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   383
qed
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   384
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   385
corollary Times_infinite_bij_betw_types:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   386
  assumes "\<not>finite(UNIV::'a set)" and "inj(g::'b \<Rightarrow> 'a)"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   387
  shows "(\<exists>(f::('b * 'a) => 'a). bij f) \<and> (\<exists>(h::('a * 'b) => 'a). bij h)"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   388
  using assms Times_infinite_bij_betw[of "UNIV::'a set" "UNIV::'b set" g]
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   389
  by auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   390
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   391
lemma card_of_Times_ordLeq_infinite:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   392
  "\<lbrakk>\<not>finite C; |A| \<le>o |C|; |B| \<le>o |C|\<rbrakk> \<Longrightarrow> |A \<times> B| \<le>o |C|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   393
  by(simp add: card_of_Sigma_ordLeq_infinite)
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   394
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   395
corollary Plus_infinite_bij_betw:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   396
  assumes INF: "\<not>finite A" and INJ: "inj_on g B \<and> g ` B \<le> A"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   397
  shows "(\<exists>f. bij_betw f (A <+> B) A) \<and> (\<exists>h. bij_betw h (B <+> A) A)"
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   398
proof-
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   399
  have "|B| \<le>o |A|" using INJ card_of_ordLeq by blast
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   400
  thus ?thesis using INF
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   401
    by (auto simp: card_of_ordIso)
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   402
qed
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   403
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   404
corollary Plus_infinite_bij_betw_types:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   405
  assumes "\<not>finite(UNIV::'a set)" and "inj(g::'b \<Rightarrow> 'a)"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   406
  shows "(\<exists>(f::('b + 'a) => 'a). bij f) \<and> (\<exists>(h::('a + 'b) => 'a). bij h)"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   407
  using assms Plus_infinite_bij_betw[of "UNIV::'a set" g "UNIV::'b set"]
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   408
  by auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   409
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   410
lemma card_of_Un_infinite:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   411
  assumes INF: "\<not>finite A" and LEQ: "|B| \<le>o |A|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   412
  shows "|A \<union> B| =o |A| \<and> |B \<union> A| =o |A|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   413
  by (simp add: INF LEQ card_of_Un_ordLeq_infinite_Field ordIso_iff_ordLeq)
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   414
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   415
lemma card_of_Un_infinite_simps[simp]:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   416
  "\<lbrakk>\<not>finite A; |B| \<le>o |A| \<rbrakk> \<Longrightarrow> |A \<union> B| =o |A|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   417
  "\<lbrakk>\<not>finite A; |B| \<le>o |A| \<rbrakk> \<Longrightarrow> |B \<union> A| =o |A|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   418
  using card_of_Un_infinite by auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   419
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   420
lemma card_of_Un_diff_infinite:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   421
  assumes INF: "\<not>finite A" and LESS: "|B| <o |A|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   422
  shows "|A - B| =o |A|"
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   423
proof-
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   424
  obtain C where C_def: "C = A - B" by blast
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   425
  have "|A \<union> B| =o |A|"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   426
    using assms ordLeq_iff_ordLess_or_ordIso card_of_Un_infinite by blast
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   427
  moreover have "C \<union> B = A \<union> B" unfolding C_def by auto
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   428
  ultimately have 1: "|C \<union> B| =o |A|" by auto
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   429
      (*  *)
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   430
  {assume *: "|C| \<le>o |B|"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   431
    moreover
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   432
    {assume **: "finite B"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   433
      hence "finite C"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   434
        using card_of_ordLeq_finite * by blast
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   435
      hence False using ** INF card_of_ordIso_finite 1 by blast
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   436
    }
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   437
    hence "\<not>finite B" by auto
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   438
    ultimately have False
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   439
      using card_of_Un_infinite 1 ordIso_equivalence(1,3) LESS not_ordLess_ordIso by metis
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   440
  }
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   441
  hence 2: "|B| \<le>o |C|" using card_of_Well_order ordLeq_total by blast
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   442
  {assume *: "finite C"
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   443
    hence "finite B" using card_of_ordLeq_finite 2 by blast
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   444
    hence False using * INF card_of_ordIso_finite 1 by blast
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   445
  }
54578
9387251b6a46 eliminated dependence of BNF on Infinite_Set by moving 3 theorems from the latter to Main
traytel
parents: 54481
diff changeset
   446
  hence "\<not>finite C" by auto
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   447
  hence "|C| =o |A|"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   448
    using card_of_Un_infinite 1 2 ordIso_equivalence(1,3) by metis
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   449
  thus ?thesis unfolding C_def .
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   450
qed
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   451
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   452
corollary Card_order_Un_infinite:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   453
  assumes INF: "\<not>finite(Field r)" and CARD: "Card_order r" and
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   454
    LEQ: "p \<le>o r"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   455
  shows "| (Field r) \<union> (Field p) | =o r \<and> | (Field p) \<union> (Field r) | =o r"
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   456
proof-
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   457
  have "| Field r \<union> Field p | =o | Field r | \<and>
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   458
        | Field p \<union> Field r | =o | Field r |"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   459
    using assms by (auto simp: card_of_Un_infinite)
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   460
  thus ?thesis
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   461
    using assms card_of_Field_ordIso[of r]
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   462
      ordIso_transitive[of "|Field r \<union> Field p|"]
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   463
      ordIso_transitive[of _ "|Field r|"] by blast
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   464
qed
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   465
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   466
corollary subset_ordLeq_diff_infinite:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   467
  assumes INF: "\<not>finite B" and SUB: "A \<le> B" and LESS: "|A| <o |B|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   468
  shows "\<not>finite (B - A)"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   469
  using assms card_of_Un_diff_infinite card_of_ordIso_finite by blast
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   470
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   471
lemma card_of_Times_ordLess_infinite[simp]:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   472
  assumes INF: "\<not>finite C" and
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   473
    LESS1: "|A| <o |C|" and LESS2: "|B| <o |C|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   474
  shows "|A \<times> B| <o |C|"
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   475
proof(cases "A = {} \<or> B = {}")
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   476
  assume Case1: "A = {} \<or> B = {}"
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   477
  hence "A \<times> B = {}" by blast
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   478
  moreover have "C \<noteq> {}" using
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   479
      LESS1 card_of_empty5 by blast
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   480
  ultimately show ?thesis by(auto simp:  card_of_empty4)
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   481
next
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   482
  assume Case2: "\<not>(A = {} \<or> B = {})"
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   483
  {assume *: "|C| \<le>o |A \<times> B|"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   484
    hence "\<not>finite (A \<times> B)" using INF card_of_ordLeq_finite by blast
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   485
    hence 1: "\<not>finite A \<or> \<not>finite B" using finite_cartesian_product by blast
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   486
    {assume Case21: "|A| \<le>o |B|" 
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   487
      hence "\<not>finite B" using 1 card_of_ordLeq_finite by blast
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   488
      hence "|A \<times> B| =o |B|" using Case2 Case21
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   489
        by (auto simp: card_of_Times_infinite)
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   490
      hence False using LESS2 not_ordLess_ordLeq * ordLeq_ordIso_trans by blast
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   491
    }
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   492
    moreover
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   493
    {assume Case22: "|B| \<le>o |A|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   494
      hence "\<not>finite A" using 1 card_of_ordLeq_finite by blast
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   495
      hence "|A \<times> B| =o |A|" using Case2 Case22
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   496
        by (auto simp: card_of_Times_infinite)
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   497
      hence False using LESS1 not_ordLess_ordLeq * ordLeq_ordIso_trans by blast
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   498
    }
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   499
    ultimately have False using ordLeq_total card_of_Well_order[of A]
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   500
        card_of_Well_order[of B] by blast
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   501
  }
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   502
  thus ?thesis using ordLess_or_ordLeq[of "|A \<times> B|" "|C|"]
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   503
      card_of_Well_order[of "A \<times> B"] card_of_Well_order[of "C"] by auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   504
qed
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   505
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   506
lemma card_of_Times_ordLess_infinite_Field[simp]:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   507
  assumes INF: "\<not>finite (Field r)" and r: "Card_order r" and
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   508
    LESS1: "|A| <o r" and LESS2: "|B| <o r"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   509
  shows "|A \<times> B| <o r"
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   510
proof-
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   511
  let ?C  = "Field r"
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   512
  have 1: "r =o |?C| \<and> |?C| =o r" using r card_of_Field_ordIso
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   513
      ordIso_symmetric by blast
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   514
  hence "|A| <o |?C|"  "|B| <o |?C|"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   515
    using LESS1 LESS2 ordLess_ordIso_trans by blast+
61943
7fba644ed827 discontinued ASCII replacement syntax <*>;
wenzelm
parents: 60585
diff changeset
   516
  hence  "|A \<times> B| <o |?C|" using INF
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   517
      card_of_Times_ordLess_infinite by blast
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   518
  thus ?thesis using 1 ordLess_ordIso_trans by blast
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   519
qed
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   520
55174
2e8fe898fa71 extended cardinals library
traytel
parents: 55102
diff changeset
   521
lemma ordLeq_finite_Field:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   522
  assumes "r \<le>o s" and "finite (Field s)"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   523
  shows "finite (Field r)"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   524
  by (metis assms card_of_mono2 card_of_ordLeq_infinite)
55174
2e8fe898fa71 extended cardinals library
traytel
parents: 55102
diff changeset
   525
2e8fe898fa71 extended cardinals library
traytel
parents: 55102
diff changeset
   526
lemma ordIso_finite_Field:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   527
  assumes "r =o s"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   528
  shows "finite (Field r) \<longleftrightarrow> finite (Field s)"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   529
  by (metis assms ordIso_iff_ordLeq ordLeq_finite_Field)
55174
2e8fe898fa71 extended cardinals library
traytel
parents: 55102
diff changeset
   530
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   531
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 63092
diff changeset
   532
subsection \<open>Cardinals versus set operations involving infinite sets\<close>
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   533
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   534
lemma finite_iff_cardOf_nat:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   535
  "finite A = ( |A| <o |UNIV :: nat set| )"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   536
  by (meson card_of_Well_order infinite_iff_card_of_nat not_ordLeq_iff_ordLess)
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   537
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   538
lemma finite_ordLess_infinite2[simp]:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   539
  assumes "finite A" and "\<not>finite B"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   540
  shows "|A| <o |B|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   541
  by (meson assms card_of_Well_order card_of_ordLeq_finite not_ordLeq_iff_ordLess)
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   542
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   543
lemma infinite_card_of_insert:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   544
  assumes "\<not>finite A"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   545
  shows "|insert a A| =o |A|"
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   546
proof-
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   547
  have iA: "insert a A = A \<union> {a}" by simp
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   548
  show ?thesis
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   549
    using infinite_imp_bij_betw2[OF assms] unfolding iA
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   550
    by (metis bij_betw_inv card_of_ordIso)
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   551
qed
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   552
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   553
lemma card_of_Un_singl_ordLess_infinite1:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   554
  assumes "\<not>finite B" and "|A| <o |B|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   555
  shows "|{a} Un A| <o |B|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   556
  by (metis assms card_of_Un_ordLess_infinite finite.emptyI finite_insert finite_ordLess_infinite2)
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   557
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   558
lemma card_of_Un_singl_ordLess_infinite:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   559
  assumes "\<not>finite B"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   560
  shows "|A| <o |B| \<longleftrightarrow> |{a} Un A| <o |B|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   561
  using assms card_of_Un_singl_ordLess_infinite1[of B A]
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   562
  using card_of_Un2 ordLeq_ordLess_trans by blast
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   563
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   564
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 63092
diff changeset
   565
subsection \<open>Cardinals versus lists\<close>
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   566
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 63092
diff changeset
   567
text\<open>The next is an auxiliary operator, which shall be used for inductive
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 63092
diff changeset
   568
proofs of facts concerning the cardinality of \<open>List\<close> :\<close>
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   569
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   570
definition nlists :: "'a set \<Rightarrow> nat \<Rightarrow> 'a list set"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   571
  where "nlists A n \<equiv> {l. set l \<le> A \<and> length l = n}"
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   572
60585
48fdff264eb2 tuned whitespace;
wenzelm
parents: 59166
diff changeset
   573
lemma lists_UNION_nlists: "lists A = (\<Union>n. nlists A n)"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   574
  unfolding lists_eq_set nlists_def by blast
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   575
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   576
lemma card_of_lists: "|A| \<le>o |lists A|"
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   577
proof-
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   578
  let ?h = "\<lambda> a. [a]"
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   579
  have "inj_on ?h A \<and> ?h ` A \<le> lists A"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   580
    unfolding inj_on_def lists_eq_set by auto
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   581
  thus ?thesis by (metis card_of_ordLeq)
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   582
qed
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   583
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   584
lemma nlists_0: "nlists A 0 = {[]}"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   585
  unfolding nlists_def by auto
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   586
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   587
lemma nlists_not_empty:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   588
  assumes "A \<noteq> {}"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   589
  shows "nlists A n \<noteq> {}"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   590
proof (induction n)
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   591
  case (Suc n)
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   592
  then obtain a and l where "a \<in> A \<and> l \<in> nlists A n" using assms by auto
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   593
  hence "a # l \<in> nlists A (Suc n)" unfolding nlists_def by auto
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   594
  then show ?case  by auto
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   595
qed (simp add: nlists_0)
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   596
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   597
lemma card_of_nlists_Succ: "|nlists A (Suc n)| =o |A \<times> (nlists A n)|"
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   598
proof-
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   599
  let ?B = "A \<times> (nlists A n)"   let ?h = "\<lambda>(a,l). a # l"
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   600
  have "inj_on ?h ?B \<and> ?h ` ?B \<le> nlists A (Suc n)"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   601
    unfolding inj_on_def nlists_def by auto
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   602
  moreover have "nlists A (Suc n) \<le> ?h ` ?B"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   603
  proof clarify
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   604
    fix l assume "l \<in> nlists A (Suc n)"
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   605
    hence 1: "length l = Suc n \<and> set l \<le> A" unfolding nlists_def by auto
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   606
    then obtain a and l' where 2: "l = a # l'" by (auto simp: length_Suc_conv)
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   607
    hence "a \<in> A \<and> set l' \<le> A \<and> length l' = n" using 1 by auto
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   608
    thus "l \<in> ?h ` ?B"  using 2 unfolding nlists_def by auto
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   609
  qed
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   610
  ultimately have "bij_betw ?h ?B (nlists A (Suc n))"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   611
    unfolding bij_betw_def by auto
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   612
  thus ?thesis using card_of_ordIso ordIso_symmetric by blast
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   613
qed
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   614
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   615
lemma card_of_nlists_infinite:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   616
  assumes "\<not>finite A"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   617
  shows "|nlists A n| \<le>o |A|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   618
proof(induction n)
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   619
  case 0
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   620
  have "A \<noteq> {}" using assms by auto
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   621
  then show ?case
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   622
    by (simp add: nlists_0)
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   623
next
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   624
  case (Suc n)
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   625
  have "|nlists A (Suc n)| =o |A \<times> (nlists A n)|"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   626
    using card_of_nlists_Succ by blast
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   627
  moreover
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   628
  have "nlists A n \<noteq> {}" using assms nlists_not_empty[of A] by blast
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   629
  hence "|A \<times> (nlists A n)| =o |A|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   630
    using Suc assms by auto
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   631
  ultimately show ?case
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   632
    using ordIso_transitive ordIso_iff_ordLeq by blast
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   633
qed
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   634
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   635
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   636
lemma Card_order_lists: "Card_order r \<Longrightarrow> r \<le>o |lists(Field r) |"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   637
  using card_of_lists card_of_Field_ordIso ordIso_ordLeq_trans ordIso_symmetric by blast
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   638
61952
546958347e05 prefer symbols for "Union", "Inter";
wenzelm
parents: 61943
diff changeset
   639
lemma Union_set_lists: "\<Union>(set ` (lists A)) = A"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   640
proof -
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   641
  { fix a assume "a \<in> A"
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   642
  hence "set [a] \<le> A \<and> a \<in> set [a]" by auto
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   643
  hence "\<exists>l. set l \<le> A \<and> a \<in> set l" by blast }
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   644
  then show ?thesis by force
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   645
qed
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   646
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   647
lemma inj_on_map_lists:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   648
  assumes "inj_on f A"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   649
  shows "inj_on (map f) (lists A)"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   650
  using assms Union_set_lists[of A] inj_on_mapI[of f "lists A"] by auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   651
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   652
lemma map_lists_mono:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   653
  assumes "f ` A \<le> B"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   654
  shows "(map f) ` (lists A) \<le> lists B"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   655
  using assms by force
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   656
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   657
lemma map_lists_surjective:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   658
  assumes "f ` A = B"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   659
  shows "(map f) ` (lists A) = lists B"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   660
  by (metis assms lists_image)
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   661
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   662
lemma bij_betw_map_lists:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   663
  assumes "bij_betw f A B"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   664
  shows "bij_betw (map f) (lists A) (lists B)"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   665
  using assms unfolding bij_betw_def
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   666
  by(auto simp: inj_on_map_lists map_lists_surjective)
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   667
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   668
lemma card_of_lists_mono[simp]:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   669
  assumes "|A| \<le>o |B|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   670
  shows "|lists A| \<le>o |lists B|"
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   671
proof-
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   672
  obtain f where "inj_on f A \<and> f ` A \<le> B"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   673
    using assms card_of_ordLeq[of A B] by auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   674
  hence "inj_on (map f) (lists A) \<and> (map f) ` (lists A) \<le> (lists B)"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   675
    by (auto simp: inj_on_map_lists map_lists_mono)
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   676
  thus ?thesis using card_of_ordLeq[of "lists A"] by metis
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   677
qed
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   678
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   679
lemma ordIso_lists_mono:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   680
  assumes "r \<le>o r'"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   681
  shows "|lists(Field r)| \<le>o |lists(Field r')|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   682
  using assms card_of_mono2 card_of_lists_mono by blast
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   683
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   684
lemma card_of_lists_cong[simp]:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   685
  assumes "|A| =o |B|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   686
  shows "|lists A| =o |lists B|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   687
  by (meson assms card_of_lists_mono ordIso_iff_ordLeq)
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   688
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   689
lemma card_of_lists_infinite[simp]:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   690
  assumes "\<not>finite A"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   691
  shows "|lists A| =o |A|"
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   692
proof-
54578
9387251b6a46 eliminated dependence of BNF on Infinite_Set by moving 3 theorems from the latter to Main
traytel
parents: 54481
diff changeset
   693
  have "|lists A| \<le>o |A|" unfolding lists_UNION_nlists
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   694
    by (rule card_of_UNION_ordLeq_infinite[OF assms _ ballI[OF card_of_nlists_infinite[OF assms]]])
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   695
      (metis infinite_iff_card_of_nat assms)
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   696
  thus ?thesis using card_of_lists ordIso_iff_ordLeq by blast
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   697
qed
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   698
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   699
lemma Card_order_lists_infinite:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   700
  assumes "Card_order r" and "\<not>finite(Field r)"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   701
  shows "|lists(Field r)| =o r"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   702
  using assms card_of_lists_infinite card_of_Field_ordIso ordIso_transitive by blast
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   703
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   704
lemma ordIso_lists_cong:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   705
  assumes "r =o r'"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   706
  shows "|lists(Field r)| =o |lists(Field r')|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   707
  using assms card_of_cong card_of_lists_cong by blast
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   708
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   709
corollary lists_infinite_bij_betw:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   710
  assumes "\<not>finite A"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   711
  shows "\<exists>f. bij_betw f (lists A) A"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   712
  using assms card_of_lists_infinite card_of_ordIso by blast
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   713
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   714
corollary lists_infinite_bij_betw_types:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   715
  assumes "\<not>finite(UNIV :: 'a set)"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   716
  shows "\<exists>(f::'a list \<Rightarrow> 'a). bij f"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   717
  using assms lists_infinite_bij_betw by fastforce
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   718
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   719
69735
8230dca028eb the theory of Equipollence, and moving Fpow from Cardinals into Main
paulson <lp15@cam.ac.uk>
parents: 69712
diff changeset
   720
subsection \<open>Cardinals versus the finite powerset operator\<close>
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   721
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   722
lemma card_of_Fpow[simp]: "|A| \<le>o |Fpow A|"
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   723
proof-
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   724
  let ?h = "\<lambda> a. {a}"
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   725
  have "inj_on ?h A \<and> ?h ` A \<le> Fpow A"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   726
    unfolding inj_on_def Fpow_def by auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   727
  thus ?thesis using card_of_ordLeq by metis
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   728
qed
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   729
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   730
lemma Card_order_Fpow: "Card_order r \<Longrightarrow> r \<le>o |Fpow(Field r) |"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   731
  using card_of_Fpow card_of_Field_ordIso ordIso_ordLeq_trans ordIso_symmetric by blast
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   732
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   733
lemma image_Fpow_surjective:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   734
  assumes "f ` A = B"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   735
  shows "(image f) ` (Fpow A) = Fpow B"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   736
proof -
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   737
  have "\<And>C. \<lbrakk>C \<subseteq> f ` A; finite C\<rbrakk> \<Longrightarrow> C \<in> (`) f ` {X. X \<subseteq> A \<and> finite X}"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   738
    by (simp add: finite_subset_image image_iff)
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   739
  then show ?thesis
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   740
    using assms by (force simp add: Fpow_def)
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   741
qed
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   742
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   743
lemma bij_betw_image_Fpow:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   744
  assumes "bij_betw f A B"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   745
  shows "bij_betw (image f) (Fpow A) (Fpow B)"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   746
  using assms unfolding bij_betw_def
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   747
  by (auto simp: inj_on_image_Fpow image_Fpow_surjective)
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   748
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   749
lemma card_of_Fpow_mono[simp]:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   750
  assumes "|A| \<le>o |B|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   751
  shows "|Fpow A| \<le>o |Fpow B|"
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   752
proof-
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   753
  obtain f where "inj_on f A \<and> f ` A \<le> B"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   754
    using assms card_of_ordLeq[of A B] by auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   755
  hence "inj_on (image f) (Fpow A) \<and> (image f) ` (Fpow A) \<le> (Fpow B)"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   756
    by (auto simp: inj_on_image_Fpow image_Fpow_mono)
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   757
  thus ?thesis using card_of_ordLeq[of "Fpow A"] by auto
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   758
qed
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   759
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   760
lemma ordIso_Fpow_mono:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   761
  assumes "r \<le>o r'"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   762
  shows "|Fpow(Field r)| \<le>o |Fpow(Field r')|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   763
  using assms card_of_mono2 card_of_Fpow_mono by blast
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   764
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   765
lemma card_of_Fpow_cong[simp]:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   766
  assumes "|A| =o |B|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   767
  shows "|Fpow A| =o |Fpow B|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   768
  by (meson assms card_of_Fpow_mono ordIso_iff_ordLeq)
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   769
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   770
lemma ordIso_Fpow_cong:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   771
  assumes "r =o r'"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   772
  shows "|Fpow(Field r)| =o |Fpow(Field r')|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   773
  using assms card_of_cong card_of_Fpow_cong by blast
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   774
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   775
lemma card_of_Fpow_lists: "|Fpow A| \<le>o |lists A|"
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   776
proof-
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   777
  have "set ` (lists A) = Fpow A"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   778
    unfolding lists_eq_set Fpow_def using finite_list finite_set by blast
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   779
  thus ?thesis using card_of_ordLeq2[of "Fpow A"] Fpow_not_empty[of A] by blast
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   780
qed
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   781
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   782
lemma card_of_Fpow_infinite[simp]:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   783
  assumes "\<not>finite A"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   784
  shows "|Fpow A| =o |A|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   785
  using assms card_of_Fpow_lists card_of_lists_infinite card_of_Fpow
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   786
    ordLeq_ordIso_trans ordIso_iff_ordLeq by blast
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   787
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   788
corollary Fpow_infinite_bij_betw:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   789
  assumes "\<not>finite A"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   790
  shows "\<exists>f. bij_betw f (Fpow A) A"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   791
  using assms card_of_Fpow_infinite card_of_ordIso by blast
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   792
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   793
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 63092
diff changeset
   794
subsection \<open>The cardinal $\omega$ and the finite cardinals\<close>
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   795
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 63092
diff changeset
   796
subsubsection \<open>First as well-orders\<close>
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   797
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   798
lemma Field_natLess: "Field natLess = (UNIV::nat set)"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   799
  by (auto simp: Field_def natLess_def)
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   800
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   801
lemma natLeq_well_order_on: "well_order_on UNIV natLeq"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   802
  using natLeq_Well_order Field_natLeq by auto
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   803
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   804
lemma natLeq_wo_rel: "wo_rel natLeq"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   805
  unfolding wo_rel_def using natLeq_Well_order .
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   806
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   807
lemma natLeq_ofilter_less: "ofilter natLeq {0 ..< n}"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   808
proof -
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   809
  have "\<forall>t<n. t \<in> Field natLeq"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   810
    by (simp add: Field_natLeq)
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   811
  moreover have "\<forall>x<n. \<forall>t. (t, x) \<in> natLeq \<longrightarrow> t < n"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   812
    by (simp add: natLeq_def)
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   813
  ultimately show ?thesis
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   814
    by (auto simp: natLeq_wo_rel wo_rel.ofilter_def under_def)
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   815
qed
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   816
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   817
lemma natLeq_ofilter_leq: "ofilter natLeq {0 .. n}"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   818
  by (metis (no_types) atLeastLessThanSuc_atLeastAtMost natLeq_ofilter_less)
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   819
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
   820
lemma natLeq_UNIV_ofilter: "wo_rel.ofilter natLeq UNIV"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   821
  using natLeq_wo_rel Field_natLeq wo_rel.Field_ofilter[of natLeq] by auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   822
54581
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   823
lemma closed_nat_set_iff:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   824
  assumes "\<forall>(m::nat) n. n \<in> A \<and> m \<le> n \<longrightarrow> m \<in> A"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   825
  shows "A = UNIV \<or> (\<exists>n. A = {0 ..< n})"
54581
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   826
proof-
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   827
  {assume "A \<noteq> UNIV" hence "\<exists>n. n \<notin> A" by blast
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   828
    moreover obtain n where n_def: "n = (LEAST n. n \<notin> A)" by blast
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   829
    ultimately have 1: "n \<notin> A \<and> (\<forall>m. m < n \<longrightarrow> m \<in> A)"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   830
      using LeastI_ex[of "\<lambda> n. n \<notin> A"] n_def Least_le[of "\<lambda> n. n \<notin> A"] by fastforce
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   831
    then have "A = {0 ..< n}"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   832
    proof(auto simp: 1)
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   833
      fix m assume *: "m \<in> A"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   834
      {assume "n \<le> m" with assms * have "n \<in> A" by blast
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   835
        hence False using 1 by auto
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   836
      }
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   837
      thus "m < n" by fastforce
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   838
    qed
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   839
    hence "\<exists>n. A = {0 ..< n}" by blast
54581
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   840
  }
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   841
  thus ?thesis by blast
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   842
qed
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   843
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   844
lemma natLeq_ofilter_iff:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   845
  "ofilter natLeq A = (A = UNIV \<or> (\<exists>n. A = {0 ..< n}))"
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   846
proof(rule iffI)
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   847
  assume "ofilter natLeq A"
56011
39d5043ce8a3 made natLe{q,ss} constants (yields smaller terms in composition)
traytel
parents: 55174
diff changeset
   848
  hence "\<forall>m n. n \<in> A \<and> m \<le> n \<longrightarrow> m \<in> A" using natLeq_wo_rel
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   849
    by(auto simp: natLeq_def wo_rel.ofilter_def under_def)
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   850
  thus "A = UNIV \<or> (\<exists>n. A = {0 ..< n})" using closed_nat_set_iff by blast
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   851
next
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   852
  assume "A = UNIV \<or> (\<exists>n. A = {0 ..< n})"
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   853
  thus "ofilter natLeq A"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   854
    by(auto simp: natLeq_ofilter_less natLeq_UNIV_ofilter)
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   855
qed
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   856
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   857
lemma natLeq_under_leq: "under natLeq n = {0 .. n}"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   858
  unfolding under_def natLeq_def by auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   859
54581
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   860
lemma natLeq_on_ofilter_less_eq:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   861
  "n \<le> m \<Longrightarrow> wo_rel.ofilter (natLeq_on m) {0 ..< n}"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   862
  by (auto simp: natLeq_on_wo_rel wo_rel.ofilter_def Field_natLeq_on under_def)
54581
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   863
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   864
lemma natLeq_on_ofilter_iff:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   865
  "wo_rel.ofilter (natLeq_on m) A = (\<exists>n \<le> m. A = {0 ..< n})"
54581
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   866
proof(rule iffI)
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   867
  assume *: "wo_rel.ofilter (natLeq_on m) A"
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   868
  hence 1: "A \<le> {0..<m}"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   869
    by (auto simp: natLeq_on_wo_rel wo_rel.ofilter_def under_def Field_natLeq_on)
54581
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   870
  hence "\<forall>n1 n2. n2 \<in> A \<and> n1 \<le> n2 \<longrightarrow> n1 \<in> A"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   871
    using * by(fastforce simp add: natLeq_on_wo_rel wo_rel.ofilter_def under_def)
54581
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   872
  hence "A = UNIV \<or> (\<exists>n. A = {0 ..< n})" using closed_nat_set_iff by blast
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   873
  thus "\<exists>n \<le> m. A = {0 ..< n}" using 1 atLeastLessThan_less_eq by blast
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   874
next
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   875
  assume "(\<exists>n\<le>m. A = {0 ..< n})"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   876
  thus "wo_rel.ofilter (natLeq_on m) A" by (auto simp: natLeq_on_ofilter_less_eq)
54581
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   877
qed
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   878
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   879
corollary natLeq_on_ofilter:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   880
  "ofilter(natLeq_on n) {0 ..< n}"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   881
  by (auto simp: natLeq_on_ofilter_less_eq)
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   882
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   883
lemma natLeq_on_ofilter_less:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   884
  assumes "n < m" shows "ofilter (natLeq_on m) {0 .. n}"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   885
proof -
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   886
  have "Suc n \<le> m"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   887
    using assms by simp
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   888
  then show ?thesis
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   889
    using natLeq_on_ofilter_iff by auto
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   890
qed
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   891
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   892
lemma natLeq_on_ordLess_natLeq: "natLeq_on n <o natLeq"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   893
proof -
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   894
  have "well_order natLeq"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   895
    using Field_natLeq natLeq_Well_order by auto
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   896
  moreover have "\<And>n. well_order_on {na. na < n} (natLeq_on n)"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   897
    using Field_natLeq_on natLeq_on_Well_order by presburger
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   898
  ultimately show ?thesis
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   899
    by (simp add: Field_natLeq Field_natLeq_on finite_ordLess_infinite)
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   900
qed
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   901
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   902
lemma natLeq_on_injective:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   903
  "natLeq_on m = natLeq_on n \<Longrightarrow> m = n"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   904
  using Field_natLeq_on[of m] Field_natLeq_on[of n]
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   905
    atLeastLessThan_injective[of m n, unfolded atLeastLessThan_def] by blast
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   906
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   907
lemma natLeq_on_injective_ordIso:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   908
  "(natLeq_on m =o natLeq_on n) = (m = n)"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   909
proof(auto simp: natLeq_on_Well_order ordIso_reflexive)
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   910
  assume "natLeq_on m =o natLeq_on n"
54581
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   911
  then obtain f where "bij_betw f {x. x<m} {x. x<n}"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   912
    using Field_natLeq_on unfolding ordIso_def iso_def[abs_def] by auto
54581
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   913
  thus "m = n" using atLeastLessThan_injective2[of f m n]
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   914
    unfolding atLeast_0 atLeastLessThan_def lessThan_def Int_UNIV_left by blast
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   915
qed
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   916
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   917
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 63092
diff changeset
   918
subsubsection \<open>Then as cardinals\<close>
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   919
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   920
lemma ordIso_natLeq_infinite1:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   921
  "|A| =o natLeq \<Longrightarrow> \<not>finite A"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   922
  by (meson finite_iff_ordLess_natLeq not_ordLess_ordIso)
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   923
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   924
lemma ordIso_natLeq_infinite2:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   925
  "natLeq =o |A| \<Longrightarrow> \<not>finite A"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   926
  using ordIso_imp_ordLeq infinite_iff_natLeq_ordLeq by blast
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   927
54581
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   928
lemma ordIso_natLeq_on_imp_finite:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   929
  "|A| =o natLeq_on n \<Longrightarrow> finite A"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   930
  unfolding ordIso_def iso_def[abs_def]
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   931
  by (auto simp: Field_natLeq_on bij_betw_finite)
54581
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   932
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   933
lemma natLeq_on_Card_order: "Card_order (natLeq_on n)"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   934
proof -
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   935
  { fix r assume "well_order_on {x. x < n} r"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   936
    hence "natLeq_on n \<le>o r"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   937
      using finite_atLeastLessThan natLeq_on_well_order_on
54581
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   938
        finite_well_order_on_ordIso ordIso_iff_ordLeq by blast
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   939
  }
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   940
  then show ?thesis
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   941
    unfolding card_order_on_def using Field_natLeq_on natLeq_on_Well_order by presburger
54581
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   942
qed
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   943
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   944
corollary card_of_Field_natLeq_on:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   945
  "|Field (natLeq_on n)| =o natLeq_on n"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   946
  using Field_natLeq_on natLeq_on_Card_order
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   947
    Card_order_iff_ordIso_card_of[of "natLeq_on n"]
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   948
    ordIso_symmetric[of "natLeq_on n"] by blast
54581
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   949
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   950
corollary card_of_less:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   951
  "|{0 ..< n}| =o natLeq_on n"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   952
  using Field_natLeq_on card_of_Field_natLeq_on
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   953
  unfolding atLeast_0 atLeastLessThan_def lessThan_def Int_UNIV_left by auto
54581
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   954
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   955
lemma natLeq_on_ordLeq_less_eq:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   956
  "((natLeq_on m) \<le>o (natLeq_on n)) = (m \<le> n)"
54581
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   957
proof
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   958
  assume "natLeq_on m \<le>o natLeq_on n"
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   959
  then obtain f where "inj_on f {x. x < m} \<and> f ` {x. x < m} \<le> {x. x < n}"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   960
    unfolding ordLeq_def using
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   961
      embed_inj_on[OF natLeq_on_Well_order[of m], of "natLeq_on n", unfolded Field_natLeq_on]
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   962
      embed_Field Field_natLeq_on by blast
54581
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   963
  thus "m \<le> n" using atLeastLessThan_less_eq2
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   964
    unfolding atLeast_0 atLeastLessThan_def lessThan_def Int_UNIV_left by blast
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   965
next
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   966
  assume "m \<le> n"
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   967
  hence "inj_on id {0..<m} \<and> id ` {0..<m} \<le> {0..<n}" unfolding inj_on_def by auto
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   968
  hence "|{0..<m}| \<le>o |{0..<n}|" using card_of_ordLeq by blast
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   969
  thus "natLeq_on m \<le>o natLeq_on n"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   970
    using card_of_less ordIso_ordLeq_trans ordLeq_ordIso_trans ordIso_symmetric by blast
54581
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   971
qed
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   972
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   973
lemma natLeq_on_ordLeq_less:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   974
  "((natLeq_on m) <o (natLeq_on n)) = (m < n)"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   975
  using not_ordLeq_iff_ordLess[OF natLeq_on_Well_order natLeq_on_Well_order, of n m]
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   976
    natLeq_on_ordLeq_less_eq[of n m] by linarith
54581
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   977
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   978
lemma ordLeq_natLeq_on_imp_finite:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   979
  assumes "|A| \<le>o natLeq_on n"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   980
  shows "finite A"
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   981
proof-
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   982
  have "|A| \<le>o |{0 ..< n}|"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   983
    using assms card_of_less ordIso_symmetric ordLeq_ordIso_trans by blast
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   984
  thus ?thesis by (auto simp: card_of_ordLeq_finite)
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   985
qed
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   986
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   987
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 63092
diff changeset
   988
subsubsection \<open>"Backward compatibility" with the numeric cardinal operator for finite sets\<close>
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   989
54581
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   990
lemma finite_card_of_iff_card2:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   991
  assumes FIN: "finite A" and FIN': "finite B"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   992
  shows "( |A| \<le>o |B| ) = (card A \<le> card B)"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   993
  using assms card_of_ordLeq[of A B] inj_on_iff_card_le[of A B] by blast
54581
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   994
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   995
lemma finite_imp_card_of_natLeq_on:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   996
  assumes "finite A"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
   997
  shows "|A| =o natLeq_on (card A)"
54581
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   998
proof-
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
   999
  obtain h where "bij_betw h A {0 ..< card A}"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1000
    using assms ex_bij_betw_finite_nat by blast
54581
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
  1001
  thus ?thesis using card_of_ordIso card_of_less ordIso_equivalence by blast
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
  1002
qed
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
  1003
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
  1004
lemma finite_iff_card_of_natLeq_on:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1005
  "finite A = (\<exists>n. |A| =o natLeq_on n)"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1006
  using finite_imp_card_of_natLeq_on[of A]
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1007
  by(auto simp: ordIso_natLeq_on_imp_finite)
54581
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
  1008
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1009
lemma finite_card_of_iff_card:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1010
  assumes FIN: "finite A" and FIN': "finite B"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1011
  shows "( |A| =o |B| ) = (card A = card B)"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1012
  using assms card_of_ordIso[of A B] bij_betw_iff_card[of A B] by blast
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1013
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1014
lemma finite_card_of_iff_card3:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1015
  assumes FIN: "finite A" and FIN': "finite B"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1016
  shows "( |A| <o |B| ) = (card A < card B)"
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1017
proof-
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1018
  have "( |A| <o |B| ) = (~ ( |B| \<le>o |A| ))" by simp
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1019
  also have "\<dots> = (~ (card B \<le> card A))"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1020
    using assms by(simp add: finite_card_of_iff_card2)
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1021
  also have "\<dots> = (card A < card B)" by auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1022
  finally show ?thesis .
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1023
qed
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1024
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1025
lemma card_Field_natLeq_on:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1026
  "card(Field(natLeq_on n)) = n"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1027
  using Field_natLeq_on card_atLeastLessThan by auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1028
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1029
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 63092
diff changeset
  1030
subsection \<open>The successor of a cardinal\<close>
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1031
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1032
lemma embed_implies_ordIso_Restr:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1033
  assumes WELL: "Well_order r" and WELL': "Well_order r'" and EMB: "embed r' r f"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1034
  shows "r' =o Restr r (f ` (Field r'))"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1035
  using assms embed_implies_iso_Restr Well_order_Restr unfolding ordIso_def by blast
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1036
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1037
lemma cardSuc_mono_ordLess[simp]:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1038
  assumes CARD: "Card_order r" and CARD': "Card_order r'"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1039
  shows "(cardSuc r <o cardSuc r') = (r <o r')"
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1040
proof-
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1041
  have 0: "Well_order r \<and> Well_order r' \<and> Well_order(cardSuc r) \<and> Well_order(cardSuc r')"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1042
    using assms by auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1043
  thus ?thesis
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1044
    using not_ordLeq_iff_ordLess not_ordLeq_iff_ordLess[of r r']
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1045
    using cardSuc_mono_ordLeq[of r' r] assms by blast
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1046
qed
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1047
54581
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
  1048
lemma cardSuc_natLeq_on_Suc:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1049
  "cardSuc(natLeq_on n) =o natLeq_on(Suc n)"
54581
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
  1050
proof-
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
  1051
  obtain r r' p where r_def: "r = natLeq_on n" and
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1052
    r'_def: "r' = cardSuc(natLeq_on n)"  and
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1053
    p_def: "p = natLeq_on(Suc n)" by blast
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1054
      (* Preliminary facts:  *)
54581
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
  1055
  have CARD: "Card_order r \<and> Card_order r' \<and> Card_order p" unfolding r_def r'_def p_def
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1056
    using cardSuc_ordLess_ordLeq natLeq_on_Card_order cardSuc_Card_order by blast
54581
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
  1057
  hence WELL: "Well_order r \<and> Well_order r' \<and>  Well_order p"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1058
    unfolding card_order_on_def by force
54581
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
  1059
  have FIELD: "Field r = {0..<n} \<and> Field p = {0..<(Suc n)}"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1060
    unfolding r_def p_def Field_natLeq_on atLeast_0 atLeastLessThan_def lessThan_def by simp
54581
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
  1061
  hence FIN: "finite (Field r)" by force
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
  1062
  have "r <o r'" using CARD unfolding r_def r'_def using cardSuc_greater by blast
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
  1063
  hence "|Field r| <o r'" using CARD card_of_Field_ordIso ordIso_ordLess_trans by blast
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
  1064
  hence LESS: "|Field r| <o |Field r'|"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1065
    using CARD card_of_Field_ordIso ordLess_ordIso_trans ordIso_symmetric by blast
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1066
      (* Main proof: *)
54581
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
  1067
  have "r' \<le>o p" using CARD unfolding r_def r'_def p_def
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1068
    using natLeq_on_ordLeq_less cardSuc_ordLess_ordLeq by blast
54581
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
  1069
  moreover have "p \<le>o r'"
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
  1070
  proof-
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
  1071
    {assume "r' <o p"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1072
      then obtain f where 0: "embedS r' p f" unfolding ordLess_def by force
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1073
      let ?q = "Restr p (f ` Field r')"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1074
      have 1: "embed r' p f" using 0 unfolding embedS_def by force
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1075
      hence 2: "f ` Field r' < {0..<(Suc n)}"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1076
        using WELL FIELD 0 by (auto simp: embedS_iff)
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1077
      have "wo_rel.ofilter p (f ` Field r')" using embed_Field_ofilter 1 WELL by blast
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1078
      then obtain m where "m \<le> Suc n" and 3: "f ` (Field r') = {0..<m}"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1079
        unfolding p_def by (auto simp: natLeq_on_ofilter_iff)
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1080
      hence 4: "m \<le> n" using 2 by force
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1081
          (*  *)
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1082
      have "bij_betw f (Field r') (f ` (Field r'))"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1083
        using WELL embed_inj_on[OF _ 1] unfolding bij_betw_def by blast
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1084
      moreover have "finite(f ` (Field r'))" using 3 finite_atLeastLessThan[of 0 m] by force
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1085
      ultimately have 5: "finite (Field r') \<and> card(Field r') = card (f ` (Field r'))"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1086
        using bij_betw_same_card bij_betw_finite by metis
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1087
      hence "card(Field r') \<le> card(Field r)" using 3 4 FIELD by force
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1088
      hence "|Field r'| \<le>o |Field r|" using FIN 5 finite_card_of_iff_card2 by blast
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1089
      hence False using LESS not_ordLess_ordLeq by auto
54581
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
  1090
    }
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
  1091
    thus ?thesis using WELL CARD by fastforce
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
  1092
  qed
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
  1093
  ultimately show ?thesis using ordIso_iff_ordLeq unfolding r'_def p_def by blast
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
  1094
qed
1502a1f707d9 eliminated dependence of Cardinals_FP on Set_Intervals, more precise imports
traytel
parents: 54578
diff changeset
  1095
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1096
lemma card_of_Plus_ordLeq_infinite[simp]:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1097
  assumes "\<not>finite C" and "|A| \<le>o |C|" and "|B| \<le>o |C|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1098
  shows "|A <+> B| \<le>o |C|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1099
  by (simp add: assms)
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1100
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1101
lemma card_of_Un_ordLeq_infinite[simp]:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1102
  assumes "\<not>finite C" and "|A| \<le>o |C|" and "|B| \<le>o |C|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1103
  shows "|A Un B| \<le>o |C|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1104
  using assms card_of_Plus_ordLeq_infinite card_of_Un_Plus_ordLeq ordLeq_transitive by metis
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1105
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1106
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 63092
diff changeset
  1107
subsection \<open>Others\<close>
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1108
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1109
lemma under_mono[simp]:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1110
  assumes "Well_order r" and "(i,j) \<in> r"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1111
  shows "under r i \<subseteq> under r j"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1112
  using assms unfolding under_def order_on_defs trans_def by blast
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1113
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1114
lemma underS_under:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1115
  assumes "i \<in> Field r"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1116
  shows "underS r i = under r i - {i}"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1117
  using assms unfolding underS_def under_def by auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1118
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1119
lemma relChain_under:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1120
  assumes "Well_order r"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1121
  shows "relChain r (\<lambda> i. under r i)"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1122
  using assms unfolding relChain_def by auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1123
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
  1124
lemma card_of_infinite_diff_finite:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1125
  assumes "\<not>finite A" and "finite B"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1126
  shows "|A - B| =o |A|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1127
  by (metis assms card_of_Un_diff_infinite finite_ordLess_infinite2)
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
  1128
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1129
lemma infinite_card_of_diff_singl:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1130
  assumes "\<not>finite A"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1131
  shows "|A - {a}| =o |A|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1132
  by (metis assms card_of_infinite_diff_finite finite.emptyI finite_insert)
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1133
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1134
lemma card_of_vimage:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1135
  assumes "B \<subseteq> range f"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1136
  shows "|B| \<le>o |f -` B|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1137
  by (metis Int_absorb2 assms image_vimage_eq order_refl surj_imp_ordLeq)
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1138
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1139
lemma surj_card_of_vimage:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1140
  assumes "surj f"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1141
  shows "|B| \<le>o |f -` B|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1142
  by (metis assms card_of_vimage subset_UNIV)
54794
e279c2ceb54c reduced cardinals dependencies of (co)datatypes
traytel
parents: 54581
diff changeset
  1143
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1144
(* bounded powerset *)
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1145
definition Bpow where
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1146
  "Bpow r A \<equiv> {X . X \<subseteq> A \<and> |X| \<le>o r}"
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1147
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1148
lemma Bpow_empty[simp]:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1149
  assumes "Card_order r"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1150
  shows "Bpow r {} = {{}}"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1151
  using assms unfolding Bpow_def by auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1152
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1153
lemma singl_in_Bpow:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1154
  assumes rc: "Card_order r"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1155
    and r: "Field r \<noteq> {}" and a: "a \<in> A"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1156
  shows "{a} \<in> Bpow r A"
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1157
proof-
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1158
  have "|{a}| \<le>o r" using r rc by auto
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1159
  thus ?thesis unfolding Bpow_def using a by auto
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1160
qed
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1161
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1162
lemma ordLeq_card_Bpow:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1163
  assumes rc: "Card_order r" and r: "Field r \<noteq> {}"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1164
  shows "|A| \<le>o |Bpow r A|"
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1165
proof-
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1166
  have "inj_on (\<lambda> a. {a}) A" unfolding inj_on_def by auto
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1167
  moreover have "(\<lambda> a. {a}) ` A \<subseteq> Bpow r A"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1168
    using singl_in_Bpow[OF assms] by auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1169
  ultimately show ?thesis unfolding card_of_ordLeq[symmetric] by blast
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1170
qed
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1171
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1172
lemma infinite_Bpow:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1173
  assumes rc: "Card_order r" and r: "Field r \<noteq> {}"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1174
    and A: "\<not>finite A"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1175
  shows "\<not>finite (Bpow r A)"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1176
  using ordLeq_card_Bpow[OF rc r]
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1177
  by (metis A card_of_ordLeq_infinite)
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1178
52545
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1179
definition Func_option where
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1180
  "Func_option A B \<equiv>
52545
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1181
  {f. (\<forall> a. f a \<noteq> None \<longleftrightarrow> a \<in> A) \<and> (\<forall> a \<in> A. case f a of Some b \<Rightarrow> b \<in> B |None \<Rightarrow> True)}"
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1182
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1183
lemma card_of_Func_option_Func:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1184
  "|Func_option A B| =o |Func A B|"
52545
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1185
proof (rule ordIso_symmetric, unfold card_of_ordIso[symmetric], intro exI)
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1186
  let ?F = "\<lambda> f a. if a \<in> A then Some (f a) else None"
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1187
  show "bij_betw ?F (Func A B) (Func_option A B)"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1188
    unfolding bij_betw_def unfolding inj_on_def proof(intro conjI ballI impI)
52545
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1189
    fix f g assume f: "f \<in> Func A B" and g: "g \<in> Func A B" and eq: "?F f = ?F g"
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1190
    show "f = g"
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1191
    proof(rule ext)
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1192
      fix a
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1193
      show "f a = g a"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1194
        by (smt (verit) Func_def eq f g mem_Collect_eq option.inject)
52545
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1195
    qed
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1196
  next
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1197
    show "?F ` Func A B = Func_option A B"
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1198
    proof safe
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1199
      fix f assume f: "f \<in> Func_option A B"
63040
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 61952
diff changeset
  1200
      define g where [abs_def]: "g a = (case f a of Some b \<Rightarrow> b | None \<Rightarrow> undefined)" for a
52545
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1201
      have "g \<in> Func A B"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1202
        using f unfolding g_def Func_def Func_option_def by force+
52545
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1203
      moreover have "f = ?F g"
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1204
      proof(rule ext)
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1205
        fix a show "f a = ?F g a"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1206
          using f unfolding Func_option_def g_def by (cases "a \<in> A") force+
52545
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1207
      qed
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1208
      ultimately show "f \<in> ?F ` (Func A B)" by blast
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1209
    qed(unfold Func_def Func_option_def, auto)
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1210
  qed
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1211
qed
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1212
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1213
(* partial-function space: *)
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1214
definition Pfunc where
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1215
  "Pfunc A B \<equiv>
52545
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1216
 {f. (\<forall>a. f a \<noteq> None \<longrightarrow> a \<in> A) \<and>
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1217
     (\<forall>a. case f a of None \<Rightarrow> True | Some b \<Rightarrow> b \<in> B)}"
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1218
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1219
lemma Func_Pfunc:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1220
  "Func_option A B \<subseteq> Pfunc A B"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1221
  unfolding Func_option_def Pfunc_def by auto
52545
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1222
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1223
lemma Pfunc_Func_option:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1224
  "Pfunc A B = (\<Union>A' \<in> Pow A. Func_option A' B)"
52545
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1225
proof safe
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1226
  fix f assume f: "f \<in> Pfunc A B"
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1227
  show "f \<in> (\<Union>A'\<in>Pow A. Func_option A' B)"
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1228
  proof (intro UN_I)
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1229
    let ?A' = "{a. f a \<noteq> None}"
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1230
    show "?A' \<in> Pow A" using f unfolding Pow_def Pfunc_def by auto
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1231
    show "f \<in> Func_option ?A' B" using f unfolding Func_option_def Pfunc_def by auto
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1232
  qed
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1233
next
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1234
  fix f A' assume "f \<in> Func_option A' B" and "A' \<subseteq> A"
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1235
  thus "f \<in> Pfunc A B" unfolding Func_option_def Pfunc_def by auto
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1236
qed
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1237
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
  1238
lemma card_of_Func_mono:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1239
  fixes A1 A2 :: "'a set" and B :: "'b set"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1240
  assumes A12: "A1 \<subseteq> A2" and B: "B \<noteq> {}"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1241
  shows "|Func A1 B| \<le>o |Func A2 B|"
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
  1242
proof-
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
  1243
  obtain bb where bb: "bb \<in> B" using B by auto
63040
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 61952
diff changeset
  1244
  define F where [abs_def]: "F f1 a =
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 61952
diff changeset
  1245
    (if a \<in> A2 then (if a \<in> A1 then f1 a else bb) else undefined)" for f1 :: "'a \<Rightarrow> 'b" and a
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1246
  show ?thesis unfolding card_of_ordLeq[symmetric]
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1247
  proof(intro exI[of _ F] conjI)
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1248
    show "inj_on F (Func A1 B)" unfolding inj_on_def 
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1249
    proof safe
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
  1250
      fix f g assume f: "f \<in> Func A1 B" and g: "g \<in> Func A1 B" and eq: "F f = F g"
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
  1251
      show "f = g"
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
  1252
      proof(rule ext)
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
  1253
        fix a show "f a = g a"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1254
          by (smt (verit) A12 F_def Func_def eq f g mem_Collect_eq subsetD)
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
  1255
      qed
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
  1256
    qed
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
  1257
  qed(insert bb, unfold Func_def F_def, force)
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
  1258
qed
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
  1259
52545
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1260
lemma card_of_Func_option_mono:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1261
  fixes A1 A2 :: "'a set" and B :: "'b set"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1262
  assumes A12: "A1 \<subseteq> A2" and B: "B \<noteq> {}"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1263
  shows "|Func_option A1 B| \<le>o |Func_option A2 B|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1264
  by (metis card_of_Func_mono[OF A12 B] card_of_Func_option_Func
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1265
      ordIso_ordLeq_trans ordLeq_ordIso_trans ordIso_symmetric)
52545
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1266
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1267
lemma card_of_Pfunc_Pow_Func_option:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1268
  assumes "B \<noteq> {}"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1269
  shows "|Pfunc A B| \<le>o |Pow A \<times> Func_option A B|"
52545
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1270
proof-
60585
48fdff264eb2 tuned whitespace;
wenzelm
parents: 59166
diff changeset
  1271
  have "|Pfunc A B| =o |\<Union>A' \<in> Pow A. Func_option A' B|" (is "_ =o ?K")
52545
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1272
    unfolding Pfunc_Func_option by(rule card_of_refl)
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1273
  also have "?K \<le>o |Sigma (Pow A) (\<lambda> A'. Func_option A' B)|" using card_of_UNION_Sigma .
61943
7fba644ed827 discontinued ASCII replacement syntax <*>;
wenzelm
parents: 60585
diff changeset
  1274
  also have "|Sigma (Pow A) (\<lambda> A'. Func_option A' B)| \<le>o |Pow A \<times> Func_option A B|"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1275
    by (simp add: assms card_of_Func_option_mono card_of_Sigma_mono1)
52545
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1276
  finally show ?thesis .
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1277
qed
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1278
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1279
lemma Bpow_ordLeq_Func_Field:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1280
  assumes rc: "Card_order r" and r: "Field r \<noteq> {}" and A: "\<not>finite A"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1281
  shows "|Bpow r A| \<le>o |Func (Field r) A|"
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1282
proof-
52545
d2ad6eae514f Func -> Func_option, Ffunc -> Func (avoids dependence of codatatypes on the option type)
traytel
parents: 52544
diff changeset
  1283
  let ?F = "\<lambda> f. {x | x a. f a = x \<and> a \<in> Field r}"
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1284
  {fix X assume "X \<in> Bpow r A - {{}}"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1285
    hence XA: "X \<subseteq> A" and "|X| \<le>o r"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1286
      and X: "X \<noteq> {}" unfolding Bpow_def by auto
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1287
    hence "|X| \<le>o |Field r|" by (metis Field_card_of card_of_mono2)
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1288
    then obtain F where 1: "X = F ` (Field r)"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1289
      using card_of_ordLeq2[OF X] by metis
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1290
    define f where [abs_def]: "f i = (if i \<in> Field r then F i else undefined)" for i
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1291
    have "\<exists> f \<in> Func (Field r) A. X = ?F f"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1292
      apply (intro bexI[of _ f]) using 1 XA unfolding Func_def f_def by auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1293
  }
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1294
  hence "Bpow r A - {{}} \<subseteq> ?F ` (Func (Field r) A)" by auto
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1295
  hence "|Bpow r A - {{}}| \<le>o |Func (Field r) A|"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1296
    by (rule surj_imp_ordLeq)
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1297
  moreover
54578
9387251b6a46 eliminated dependence of BNF on Infinite_Set by moving 3 theorems from the latter to Main
traytel
parents: 54481
diff changeset
  1298
  {have 2: "\<not>finite (Bpow r A)" using infinite_Bpow[OF rc r A] .
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1299
    have "|Bpow r A| =o |Bpow r A - {{}}|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1300
      by (metis 2 infinite_card_of_diff_singl ordIso_symmetric)
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1301
  }
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1302
  ultimately show ?thesis by (metis ordIso_ordLeq_trans)
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1303
qed
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1304
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1305
lemma empty_in_Func[simp]:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1306
  "B \<noteq> {} \<Longrightarrow> (\<lambda>x. undefined) \<in> Func {} B"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1307
  by simp
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1308
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1309
lemma Func_mono[simp]:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1310
  assumes "B1 \<subseteq> B2"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1311
  shows "Func A B1 \<subseteq> Func A B2"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1312
  using assms unfolding Func_def by force
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1313
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1314
lemma Pfunc_mono[simp]:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1315
  assumes "A1 \<subseteq> A2" and "B1 \<subseteq> B2"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1316
  shows "Pfunc A B1 \<subseteq> Pfunc A B2"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1317
  using assms unfolding Pfunc_def
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1318
  by (force split: option.split_asm option.split)
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1319
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1320
lemma card_of_Func_UNIV_UNIV:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1321
  "|Func (UNIV::'a set) (UNIV::'b set)| =o |UNIV::('a \<Rightarrow> 'b) set|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1322
  using card_of_Func_UNIV[of "UNIV::'b set"] by auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1323
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
  1324
lemma ordLeq_Func:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1325
  assumes "{b1,b2} \<subseteq> B" "b1 \<noteq> b2"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1326
  shows "|A| \<le>o |Func A B|"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1327
  unfolding card_of_ordLeq[symmetric] proof(intro exI conjI)
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1328
  let ?F = "\<lambda>x a. if a \<in> A then (if a = x then b1 else b2) else undefined"
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
  1329
  show "inj_on ?F A" using assms unfolding inj_on_def fun_eq_iff by auto
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
  1330
  show "?F ` A \<subseteq> Func A B" using assms unfolding Func_def by auto
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
  1331
qed
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
  1332
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
  1333
lemma infinite_Func:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1334
  assumes A: "\<not>finite A" and B: "{b1,b2} \<subseteq> B" "b1 \<noteq> b2"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1335
  shows "\<not>finite (Func A B)"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1336
  using ordLeq_Func[OF B] by (metis A card_of_ordLeq_finite)
54475
b4d644be252c moved theorems out of LFP
blanchet
parents: 54473
diff changeset
  1337
55102
761e40ce91bc whitespace tuning
blanchet
parents: 55087
diff changeset
  1338
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 63092
diff changeset
  1339
subsection \<open>Infinite cardinals are limit ordinals\<close>
54980
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1340
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1341
lemma card_order_infinite_isLimOrd:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1342
  assumes c: "Card_order r" and i: "\<not>finite (Field r)"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1343
  shows "isLimOrd r"
54980
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1344
proof-
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1345
  have 0: "wo_rel r" and 00: "Well_order r"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1346
    using c unfolding card_order_on_def wo_rel_def by auto
54980
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1347
  hence rr: "Refl r" by (metis wo_rel.REFL)
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1348
  show ?thesis unfolding wo_rel.isLimOrd_def[OF 0] wo_rel.isSuccOrd_def[OF 0] 
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1349
  proof safe
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1350
    fix j assume "j \<in> Field r" and "\<forall>i\<in>Field r. (i, j) \<in> r"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1351
    then show False
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1352
      by (metis Card_order_trans c i infinite_Card_order_limit)
54980
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1353
  qed
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1354
qed
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1355
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1356
lemma insert_Chain:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1357
  assumes "Refl r" "C \<in> Chains r" and "i \<in> Field r" and "\<And>j. j \<in> C \<Longrightarrow> (j,i) \<in> r \<or> (i,j) \<in> r"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1358
  shows "insert i C \<in> Chains r"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1359
  using assms unfolding Chains_def by (auto dest: refl_onD)
54980
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1360
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1361
lemma Collect_insert: "{R j |j. j \<in> insert j1 J} = insert (R j1) {R j |j. j \<in> J}"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1362
  by auto
54980
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1363
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1364
lemma Field_init_seg_of[simp]:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1365
  "Field init_seg_of = UNIV"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1366
  unfolding Field_def init_seg_of_def by auto
54980
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1367
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1368
lemma refl_init_seg_of[intro, simp]: "refl init_seg_of"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1369
  unfolding refl_on_def Field_def by auto
54980
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1370
55087
252c7fec4119 renamed 'regular' to 'regularCard' to avoid clashes (e.g. in Meson_Test)
blanchet
parents: 55056
diff changeset
  1371
lemma regularCard_all_ex:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1372
  assumes r: "Card_order r"   "regularCard r"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1373
    and As: "\<And> i j b. b \<in> B \<Longrightarrow> (i,j) \<in> r \<Longrightarrow> P i b \<Longrightarrow> P j b"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1374
    and Bsub: "\<forall> b \<in> B. \<exists> i \<in> Field r. P i b"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1375
    and cardB: "|B| <o r"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1376
  shows "\<exists> i \<in> Field r. \<forall> b \<in> B. P i b"
54980
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1377
proof-
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1378
  let ?As = "\<lambda>i. {b \<in> B. P i b}"
67613
ce654b0e6d69 more symbols;
wenzelm
parents: 66453
diff changeset
  1379
  have "\<exists>i \<in> Field r. B \<le> ?As i"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1380
    apply(rule regularCard_UNION) using assms unfolding relChain_def by auto
54980
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1381
  thus ?thesis by auto
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1382
qed
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1383
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1384
lemma relChain_stabilize:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1385
  assumes rc: "relChain r As" and AsB: "(\<Union>i \<in> Field r. As i) \<subseteq> B" and Br: "|B| <o r"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1386
    and ir: "\<not>finite (Field r)" and cr: "Card_order r"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1387
  shows "\<exists> i \<in> Field r. As (succ r i) = As i"
54980
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1388
proof(rule ccontr, auto)
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1389
  have 0: "wo_rel r" and 00: "Well_order r"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1390
    unfolding wo_rel_def by (metis card_order_on_well_order_on cr)+
54980
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1391
  have L: "isLimOrd r" using ir cr by (metis card_order_infinite_isLimOrd)
60585
48fdff264eb2 tuned whitespace;
wenzelm
parents: 59166
diff changeset
  1392
  have AsBs: "(\<Union>i \<in> Field r. As (succ r i)) \<subseteq> B"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1393
    using AsB L by (simp add: "0" Sup_le_iff wo_rel.isLimOrd_succ)
54980
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1394
  assume As_s: "\<forall>i\<in>Field r. As (succ r i) \<noteq> As i"
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1395
  have 1: "\<forall>i j. (i,j) \<in> r \<and> i \<noteq> j \<longrightarrow> As i \<subset> As j"
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1396
  proof safe
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1397
    fix i j assume 1: "(i, j) \<in> r" "i \<noteq> j" and Asij: "As i = As j"
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1398
    hence rij: "(succ r i, j) \<in> r" by (metis "0" wo_rel.succ_smallest)
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1399
    hence "As (succ r i) \<subseteq> As j" using rc unfolding relChain_def by auto
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1400
    moreover
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1401
    { have "(i,succ r i) \<in> r"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1402
        by (meson "0" "1"(1) FieldI1 L wo_rel.isLimOrd_aboveS wo_rel.succ_in)
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1403
      hence "As i \<subset> As (succ r i)" using As_s rc rij unfolding relChain_def Field_def by auto
54980
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1404
    }
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1405
    ultimately show False unfolding Asij by auto
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1406
  qed (insert rc, unfold relChain_def, auto)
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1407
  hence "\<forall> i \<in> Field r. \<exists> a. a \<in> As (succ r i) - As i"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1408
    using wo_rel.succ_in[OF 0] AsB
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1409
    by(metis 0 card_order_infinite_isLimOrd cr ir psubset_imp_ex_mem
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1410
        wo_rel.isLimOrd_aboveS wo_rel.succ_diff)
54980
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1411
  then obtain f where f: "\<forall> i \<in> Field r. f i \<in> As (succ r i) - As i" by metis
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1412
  have "inj_on f (Field r)" unfolding inj_on_def 
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1413
  proof safe
54980
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1414
    fix i j assume ij: "i \<in> Field r" "j \<in> Field r" and fij: "f i = f j"
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1415
    show "i = j"
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1416
    proof(cases rule: wo_rel.cases_Total3[OF 0], safe)
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1417
      assume "(i, j) \<in> r" and ijd: "i \<noteq> j"
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1418
      hence rij: "(succ r i, j) \<in> r" by (metis "0" wo_rel.succ_smallest)
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1419
      hence "As (succ r i) \<subseteq> As j" using rc unfolding relChain_def by auto
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1420
      thus "i = j" using ij ijd fij f by auto
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1421
    next
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1422
      assume "(j, i) \<in> r" and ijd: "i \<noteq> j"
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1423
      hence rij: "(succ r j, i) \<in> r" by (metis "0" wo_rel.succ_smallest)
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1424
      hence "As (succ r j) \<subseteq> As i" using rc unfolding relChain_def by auto
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1425
      thus "j = i" using ij ijd fij f by fastforce
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1426
    qed(insert ij, auto)
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1427
  qed
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1428
  moreover have "f ` (Field r) \<subseteq> B" using f AsBs by auto
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1429
  moreover have "|B| <o |Field r|" using Br cr by (metis card_of_unique ordLess_ordIso_trans)
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1430
  ultimately show False unfolding card_of_ordLess[symmetric] by auto
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1431
qed
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1432
55102
761e40ce91bc whitespace tuning
blanchet
parents: 55087
diff changeset
  1433
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 63092
diff changeset
  1434
subsection \<open>Regular vs. stable cardinals\<close>
54980
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1435
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1436
lemma stable_cardSuc:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1437
  assumes CARD: "Card_order r" and INF: "\<not>finite (Field r)"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1438
  shows "stable(cardSuc r)"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1439
  using infinite_cardSuc_regularCard regularCard_stable
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1440
  by (metis CARD INF cardSuc_Card_order cardSuc_finite)
54980
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1441
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1442
lemma stable_ordIso:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1443
  assumes "r =o r'"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1444
  shows "stable r = stable r'"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1445
  by (metis assms ordIso_symmetric stable_ordIso1)
54980
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1446
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1447
lemma stable_nat: "stable |UNIV::nat set|"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1448
  using stable_natLeq card_of_nat stable_ordIso by auto
54980
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1449
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 63092
diff changeset
  1450
text\<open>Below, the type of "A" is not important -- we just had to choose an appropriate
54980
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1451
   type to make "A" possible. What is important is that arbitrarily large
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 63092
diff changeset
  1452
   infinite sets of stable cardinality exist.\<close>
54980
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1453
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1454
lemma infinite_stable_exists:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1455
  assumes CARD: "\<forall>r \<in> R. Card_order (r::'a rel)"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1456
  shows "\<exists>(A :: (nat + 'a set)set).
54980
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1457
          \<not>finite A \<and> stable |A| \<and> (\<forall>r \<in> R. r <o |A| )"
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1458
proof-
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1459
  have "\<exists>(A :: (nat + 'a set)set).
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1460
          \<not>finite A \<and> stable |A| \<and> |UNIV::'a set| <o |A|"
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1461
  proof(cases "finite (UNIV::'a set)")
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1462
    case True
54980
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1463
    let ?B = "UNIV::nat set"
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1464
    have "\<not>finite(?B <+> {})" using finite_Plus_iff by blast
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1465
    moreover
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1466
    have "stable |?B|" using stable_natLeq card_of_nat stable_ordIso1 by blast
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1467
    hence "stable |?B <+> {}|" using stable_ordIso card_of_Plus_empty1 by blast
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1468
    moreover
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1469
    have "\<not>finite(Field |?B| ) \<and> finite(Field |UNIV::'a set| )" using True by simp
54980
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1470
    hence "|UNIV::'a set| <o |?B|" by (simp add: finite_ordLess_infinite)
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1471
    hence "|UNIV::'a set| <o |?B <+> {}|" using card_of_Plus_empty1 ordLess_ordIso_trans by blast
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1472
    ultimately show ?thesis by blast
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1473
  next
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1474
    case False
54980
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1475
    hence *: "\<not>finite(Field |UNIV::'a set| )" by simp
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1476
    let ?B = "Field(cardSuc |UNIV::'a set| )"
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1477
    have 0: "|?B| =o |{} <+> ?B|" using card_of_Plus_empty2 by blast
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1478
    have 1: "\<not>finite ?B" using False card_of_cardSuc_finite by blast
54980
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1479
    hence 2: "\<not>finite({} <+> ?B)" using 0 card_of_ordIso_finite by blast
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1480
    have "|?B| =o cardSuc |UNIV::'a set|"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1481
      using card_of_Card_order cardSuc_Card_order card_of_Field_ordIso by blast
54980
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1482
    moreover have "stable(cardSuc |UNIV::'a set| )"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1483
      using stable_cardSuc * card_of_Card_order by blast
54980
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1484
    ultimately have "stable |?B|" using stable_ordIso by blast
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1485
    hence 3: "stable |{} <+> ?B|" using stable_ordIso 0 by blast
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1486
    have "|UNIV::'a set| <o cardSuc |UNIV::'a set|"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1487
      using card_of_Card_order cardSuc_greater by blast
54980
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1488
    moreover have "|?B| =o  cardSuc |UNIV::'a set|"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1489
      using card_of_Card_order cardSuc_Card_order  card_of_Field_ordIso by blast
54980
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1490
    ultimately have "|UNIV::'a set| <o |?B|"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1491
      using ordIso_symmetric ordLess_ordIso_trans by blast
54980
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1492
    hence "|UNIV::'a set| <o |{} <+> ?B|" using 0 ordLess_ordIso_trans by blast
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1493
    thus ?thesis using 2 3 by blast
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1494
  qed
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1495
  thus ?thesis using CARD card_of_UNIV2 ordLeq_ordLess_trans by blast
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1496
qed
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1497
55087
252c7fec4119 renamed 'regular' to 'regularCard' to avoid clashes (e.g. in Meson_Test)
blanchet
parents: 55056
diff changeset
  1498
corollary infinite_regularCard_exists:
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1499
  assumes CARD: "\<forall>r \<in> R. Card_order (r::'a rel)"
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1500
  shows "\<exists>(A :: (nat + 'a set)set).
55087
252c7fec4119 renamed 'regular' to 'regularCard' to avoid clashes (e.g. in Meson_Test)
blanchet
parents: 55056
diff changeset
  1501
          \<not>finite A \<and> regularCard |A| \<and> (\<forall>r \<in> R. r <o |A| )"
76946
5df58a471d9e Trying to clean up HOL/Cardinals
paulson <lp15@cam.ac.uk>
parents: 75624
diff changeset
  1502
  using infinite_stable_exists[OF CARD] stable_regularCard by (metis Field_card_of card_of_card_order_on)
54980
7e0573a490ee basic ordinal arithmetic and cardinals library extension (not relevant for BNFs)
traytel
parents: 54794
diff changeset
  1503
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
  1504
end