Documentation

Mathlib.SetTheory.Cardinal.Arithmetic

Cardinal arithmetic #

Arithmetic operations on cardinals are defined in SetTheory/Cardinal/Basic.lean. However, proving the important theorem c * c = c for infinite cardinals and its corollaries requires the use of ordinal numbers. This is done within this file.

Main statements #

Tags #

cardinal arithmetic (for infinite cardinals)

Properties of mul #

If α is an infinite type, then α × α and α have the same cardinality.

theorem Cardinal.mul_eq_max {a b : Cardinal.{u_1}} (ha : Cardinal.aleph0 a) (hb : Cardinal.aleph0 b) :
a * b = a b

If α and β are infinite types, then the cardinality of α × β is the maximum of the cardinalities of α and β.

@[simp]
theorem Cardinal.mul_lt_of_lt {a b c : Cardinal.{u_1}} (hc : Cardinal.aleph0 c) (h1 : a < c) (h2 : b < c) :
a * b < c
theorem Cardinal.mul_eq_left {a b : Cardinal.{u_1}} (ha : Cardinal.aleph0 a) (hb : b a) (hb' : b 0) :
a * b = a
theorem Cardinal.mul_eq_right {a b : Cardinal.{u_1}} (hb : Cardinal.aleph0 b) (ha : a b) (ha' : a 0) :
a * b = b
theorem Cardinal.le_mul_left {a b : Cardinal.{u_1}} (h : b 0) :
a b * a
theorem Cardinal.le_mul_right {a b : Cardinal.{u_1}} (h : b 0) :
a a * b

Properties of add #

If α is an infinite type, then α ⊕ α and α have the same cardinality.

theorem Cardinal.add_eq_max {a b : Cardinal.{u_1}} (ha : Cardinal.aleph0 a) :
a + b = a b

If α is an infinite type, then the cardinality of α ⊕ β is the maximum of the cardinalities of α and β.

theorem Cardinal.add_le_of_le {a b c : Cardinal.{u_1}} (hc : Cardinal.aleph0 c) (h1 : a c) (h2 : b c) :
a + b c
theorem Cardinal.add_lt_of_lt {a b c : Cardinal.{u_1}} (hc : Cardinal.aleph0 c) (h1 : a < c) (h2 : b < c) :
a + b < c
theorem Cardinal.eq_of_add_eq_of_aleph0_le {a b c : Cardinal.{u_1}} (h : a + b = c) (ha : a < c) (hc : Cardinal.aleph0 c) :
b = c
theorem Cardinal.add_eq_left {a b : Cardinal.{u_1}} (ha : Cardinal.aleph0 a) (hb : b a) :
a + b = a
theorem Cardinal.add_eq_right {a b : Cardinal.{u_1}} (hb : Cardinal.aleph0 b) (ha : a b) :
a + b = b
theorem Cardinal.add_nat_eq {a : Cardinal.{u_1}} (n : ) (ha : Cardinal.aleph0 a) :
a + n = a
theorem Cardinal.nat_add_eq {a : Cardinal.{u_1}} (n : ) (ha : Cardinal.aleph0 a) :
n + a = a
theorem Cardinal.eq_of_add_eq_add_left {a b c : Cardinal.{u_1}} (h : a + b = a + c) (ha : a < Cardinal.aleph0) :
b = c
theorem Cardinal.eq_of_add_eq_add_right {a b c : Cardinal.{u_1}} (h : a + b = c + b) (hb : b < Cardinal.aleph0) :
a = c

Properties of ciSup #

theorem Cardinal.ciSup_add {ι : Type u} (f : ιCardinal.{v}) [Nonempty ι] (hf : BddAbove (Set.range f)) (c : Cardinal.{v}) :
(⨆ (i : ι), f i) + c = ⨆ (i : ι), f i + c
theorem Cardinal.add_ciSup {ι : Type u} (f : ιCardinal.{v}) [Nonempty ι] (hf : BddAbove (Set.range f)) (c : Cardinal.{v}) :
c + ⨆ (i : ι), f i = ⨆ (i : ι), c + f i
theorem Cardinal.ciSup_add_ciSup {ι : Type u} {ι' : Type w} (f : ιCardinal.{v}) [Nonempty ι] [Nonempty ι'] (hf : BddAbove (Set.range f)) (g : ι'Cardinal.{v}) (hg : BddAbove (Set.range g)) :
(⨆ (i : ι), f i) + ⨆ (j : ι'), g j = ⨆ (i : ι), ⨆ (j : ι'), f i + g j
theorem Cardinal.ciSup_mul {ι : Type u} (f : ιCardinal.{v}) (c : Cardinal.{v}) :
(⨆ (i : ι), f i) * c = ⨆ (i : ι), f i * c
theorem Cardinal.mul_ciSup {ι : Type u} (f : ιCardinal.{v}) (c : Cardinal.{v}) :
c * ⨆ (i : ι), f i = ⨆ (i : ι), c * f i
theorem Cardinal.ciSup_mul_ciSup {ι : Type u} {ι' : Type w} (f : ιCardinal.{v}) (g : ι'Cardinal.{v}) :
(⨆ (i : ι), f i) * ⨆ (j : ι'), g j = ⨆ (i : ι), ⨆ (j : ι'), f i * g j

Properties of aleph #

@[simp]
theorem Cardinal.add_right_inj_of_lt_aleph0 {α β γ : Cardinal.{u_1}} (γ₀ : γ < Cardinal.aleph0) :
α + γ = β + γ α = β
@[simp]
theorem Cardinal.add_nat_inj {α β : Cardinal.{u_1}} (n : ) :
α + n = β + n α = β
@[simp]
theorem Cardinal.add_one_inj {α β : Cardinal.{u_1}} :
α + 1 = β + 1 α = β
theorem Cardinal.add_le_add_iff_of_lt_aleph0 {α β γ : Cardinal.{u_1}} (γ₀ : γ < Cardinal.aleph0) :
α + γ β + γ α β
@[simp]
theorem Cardinal.add_nat_le_add_nat_iff {α β : Cardinal.{u_1}} (n : ) :
α + n β + n α β
@[deprecated Cardinal.add_nat_le_add_nat_iff]
theorem Cardinal.add_nat_le_add_nat_iff_of_lt_aleph_0 {α β : Cardinal.{u_1}} (n : ) :
α + n β + n α β

Alias of Cardinal.add_nat_le_add_nat_iff.

@[simp]
theorem Cardinal.add_one_le_add_one_iff {α β : Cardinal.{u_1}} :
α + 1 β + 1 α β
@[deprecated Cardinal.add_one_le_add_one_iff]

Alias of Cardinal.add_one_le_add_one_iff.

Properties about power #

theorem Cardinal.pow_le {κ μ : Cardinal.{u}} (H1 : Cardinal.aleph0 κ) (H2 : μ < Cardinal.aleph0) :
κ ^ μ κ
theorem Cardinal.pow_eq {κ μ : Cardinal.{u}} (H1 : Cardinal.aleph0 κ) (H2 : 1 μ) (H3 : μ < Cardinal.aleph0) :
κ ^ μ = κ
theorem Cardinal.prod_eq_two_power {ι : Type u} [Infinite ι] {c : ιCardinal.{v}} (h₁ : ∀ (i : ι), 2 c i) (h₂ : ∀ (i : ι), Cardinal.lift.{u, v} (c i) Cardinal.lift.{v, u} (Cardinal.mk ι)) :
theorem Cardinal.power_eq_two_power {c₁ c₂ : Cardinal.{u_1}} (h₁ : Cardinal.aleph0 c₁) (h₂ : 2 c₂) (h₂' : c₂ c₁) :
c₂ ^ c₁ = 2 ^ c₁
theorem Cardinal.nat_power_eq {c : Cardinal.{u}} (h : Cardinal.aleph0 c) {n : } (hn : 2 n) :
n ^ c = 2 ^ c
theorem Cardinal.power_nat_eq {c : Cardinal.{u}} {n : } (h1 : Cardinal.aleph0 c) (h2 : 1 n) :
c ^ n = c

Computing cardinality of various types #

theorem Cardinal.mk_equiv_comm {α : Type u} {β' : Type v} :
Cardinal.mk (α β') = Cardinal.mk (β' α)

This lemma makes lemmas assuming Infinite α applicable to the situation where we have Infinite β instead.

theorem Cardinal.mk_arrow_eq_zero_iff {α : Type u} {β' : Type v} :
Cardinal.mk (αβ') = 0 Cardinal.mk α 0 Cardinal.mk β' = 0
theorem Cardinal.mk_equiv_le_embedding (α : Type u) (β' : Type v) :
Cardinal.mk (α β') Cardinal.mk (α β')
theorem Cardinal.mk_embedding_le_arrow (α : Type u) (β' : Type v) :
Cardinal.mk (α β') Cardinal.mk (αβ')
theorem Cardinal.mk_equiv_eq_arrow_of_eq {α β : Type u} [Infinite α] (eq : Cardinal.mk α = Cardinal.mk β) :
Cardinal.mk (α β) = Cardinal.mk (αβ)
theorem Cardinal.mk_equiv_of_eq {α β : Type u} [Infinite α] (eq : Cardinal.mk α = Cardinal.mk β) :
theorem Cardinal.mk_surjective_eq_arrow_of_le {α β : Type u} [Infinite α] (le : Cardinal.mk β Cardinal.mk α) :
Cardinal.mk {f : αβ | Function.Surjective f} = Cardinal.mk (αβ)
@[simp]
theorem Cardinal.mk_bounded_subset_le {α : Type u} (s : Set α) (c : Cardinal.{u}) :

Properties of compl #

theorem Cardinal.mk_compl_of_infinite {α : Type u_1} [Infinite α] (s : Set α) (h2 : Cardinal.mk s < Cardinal.mk α) :
theorem Cardinal.mk_compl_eq_mk_compl_finite {α β : Type u} [Finite α] {s : Set α} {t : Set β} (h1 : Cardinal.mk α = Cardinal.mk β) (h : Cardinal.mk s = Cardinal.mk t) :

Extending an injection to an equiv #

theorem Cardinal.extend_function {α : Type u_1} {β : Type u_2} {s : Set α} (f : s β) (h : Nonempty (s (Set.range f))) :
∃ (g : α β), ∀ (x : s), g x = f x
theorem Cardinal.extend_function_finite {α : Type u} {β : Type v} [Finite α] {s : Set α} (f : s β) (h : Nonempty (α β)) :
∃ (g : α β), ∀ (x : s), g x = f x
theorem Cardinal.extend_function_of_lt {α : Type u_1} {β : Type u_2} {s : Set α} (f : s β) (hs : Cardinal.mk s < Cardinal.mk α) (h : Nonempty (α β)) :
∃ (g : α β), ∀ (x : s), g x = f x

Cardinal operations with ordinal indices #

theorem Cardinal.mk_iUnion_Ordinal_lift_le_of_le {β : Type v} {o : Ordinal.{u}} {c : Cardinal.{v}} (ho : Cardinal.lift.{v, u} o.card Cardinal.lift.{u, v} c) (hc : Cardinal.aleph0 c) (A : Ordinal.{u}Set β) (hA : j < o, Cardinal.mk (A j) c) :
Cardinal.mk (⋃ (j : Ordinal.{u}), ⋃ (_ : j < o), A j) c

Bounds the cardinal of an ordinal-indexed union of sets.

theorem Cardinal.mk_iUnion_Ordinal_le_of_le {β : Type u_1} {o : Ordinal.{u_1}} {c : Cardinal.{u_1}} (ho : o.card c) (hc : Cardinal.aleph0 c) (A : Ordinal.{u_1}Set β) (hA : j < o, Cardinal.mk (A j) c) :
Cardinal.mk (⋃ (j : Ordinal.{u_1}), ⋃ (_ : j < o), A j) c
@[deprecated Cardinal.mk_iUnion_Ordinal_le_of_le]
theorem Ordinal.Cardinal.mk_iUnion_Ordinal_le_of_le {β : Type u_1} {o : Ordinal.{u_1}} {c : Cardinal.{u_1}} (ho : o.card c) (hc : Cardinal.aleph0 c) (A : Ordinal.{u_1}Set β) (hA : j < o, Cardinal.mk (A j) c) :
Cardinal.mk (⋃ (j : Ordinal.{u_1}), ⋃ (_ : j < o), A j) c

Alias of Cardinal.mk_iUnion_Ordinal_le_of_le.

Cardinality of ordinals #

theorem Ordinal.lift_card_iSup_le_sum_card {ι : Type u} [Small.{v, u} ι] (f : ιOrdinal.{v}) :
Cardinal.lift.{u, v} (⨆ (i : ι), f i).card Cardinal.sum fun (i : ι) => (f i).card
theorem Ordinal.card_iSup_le_sum_card {ι : Type u} (f : ιOrdinal.{max u v}) :
(⨆ (i : ι), f i).card Cardinal.sum fun (i : ι) => (f i).card
theorem Ordinal.card_iSup_Iio_le_sum_card {o : Ordinal.{u}} (f : (Set.Iio o)Ordinal.{max u v}) :
(⨆ (a : (Set.Iio o)), f a).card Cardinal.sum fun (i : o.toType) => (f (o.enumIsoToType.symm i)).card
theorem Ordinal.card_iSup_Iio_le_card_mul_iSup {o : Ordinal.{u}} (f : (Set.Iio o)Ordinal.{max u v}) :
(⨆ (a : (Set.Iio o)), f a).card Cardinal.lift.{v, u} o.card * ⨆ (a : (Set.Iio o)), (f a).card
theorem Ordinal.card_opow_le (a b : Ordinal.{u_1}) :
(a ^ b).card Cardinal.aleph0 (a.card b.card)
theorem Ordinal.card_opow_eq_of_omega0_le_left {a b : Ordinal.{u_1}} (ha : Ordinal.omega0 a) (hb : 0 < b) :
(a ^ b).card = a.card b.card
theorem Ordinal.card_opow_eq_of_omega0_le_right {a b : Ordinal.{u_1}} (ha : 1 < a) (hb : Ordinal.omega0 b) :
(a ^ b).card = a.card b.card
theorem Ordinal.IsInitial.principal_opow {o : Ordinal.{u_1}} (h : o.IsInitial) (ho : Ordinal.omega0 o) :
Ordinal.Principal (fun (x1 x2 : Ordinal.{u_1}) => x1 ^ x2) o