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 #

theorem Cardinal.mul_eq_self {c : Cardinal.{u_1}} (h : aleph0 c) :
c * c = c

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

theorem Cardinal.mul_eq_max {a b : Cardinal.{u_1}} (ha : aleph0 a) (hb : 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_mk_eq_max {α β : Type u} [Infinite α] [Infinite β] :
mk α * mk β = mk α mk β
@[simp]
theorem Cardinal.aleph_mul_aleph (o₁ o₂ : Ordinal.{u_1}) :
aleph o₁ * aleph o₂ = aleph (o₁ o₂)
@[simp]
@[simp]
theorem Cardinal.aleph0_mul_mk_eq {α : Type u_1} [Infinite α] :
aleph0 * mk α = mk α
theorem Cardinal.mk_mul_aleph0_eq {α : Type u_1} [Infinite α] :
mk α * aleph0 = mk α
theorem Cardinal.mul_lt_of_lt {a b c : Cardinal.{u_1}} (hc : aleph0 c) (h1 : a < c) (h2 : b < c) :
a * b < c
theorem Cardinal.mul_eq_max_of_aleph0_le_left {a b : Cardinal.{u_1}} (h : aleph0 a) (h' : b 0) :
a * b = a b
theorem Cardinal.mul_eq_max_of_aleph0_le_right {a b : Cardinal.{u_1}} (h' : a 0) (h : aleph0 b) :
a * b = a b
theorem Cardinal.mul_eq_max' {a b : Cardinal.{u_1}} (h : aleph0 a * b) :
a * b = a b
theorem Cardinal.mul_eq_left {a b : Cardinal.{u_1}} (ha : aleph0 a) (hb : b a) (hb' : b 0) :
a * b = a
theorem Cardinal.mul_eq_right {a b : Cardinal.{u_1}} (hb : 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
theorem Cardinal.mul_eq_left_iff {a b : Cardinal.{u_1}} :
a * b = a aleph0 b a b 0 b = 1 a = 0

Properties of add #

theorem Cardinal.add_eq_self {c : Cardinal.{u_1}} (h : aleph0 c) :
c + c = c

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

theorem Cardinal.add_eq_max {a b : Cardinal.{u_1}} (ha : 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_eq_max' {a b : Cardinal.{u_1}} (ha : aleph0 b) :
a + b = a b
@[simp]
theorem Cardinal.add_mk_eq_max {α β : Type u} [Infinite α] :
mk α + mk β = mk α mk β
@[simp]
theorem Cardinal.add_mk_eq_max' {α β : Type u} [Infinite β] :
mk α + mk β = mk α mk β
theorem Cardinal.add_mk_eq_self {α : Type u_1} [Infinite α] :
mk α + mk α = mk α
theorem Cardinal.add_le_of_le {a b c : Cardinal.{u_1}} (hc : aleph0 c) (h1 : a c) (h2 : b c) :
a + b c
theorem Cardinal.add_lt_of_lt {a b c : Cardinal.{u_1}} (hc : 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 : aleph0 c) :
b = c
theorem Cardinal.add_eq_left {a b : Cardinal.{u_1}} (ha : aleph0 a) (hb : b a) :
a + b = a
theorem Cardinal.add_eq_right {a b : Cardinal.{u_1}} (hb : aleph0 b) (ha : a b) :
a + b = b
theorem Cardinal.add_nat_eq {a : Cardinal.{u_1}} (n : ) (ha : aleph0 a) :
a + n = a
theorem Cardinal.nat_add_eq {a : Cardinal.{u_1}} (n : ) (ha : aleph0 a) :
n + a = a
theorem Cardinal.add_one_eq {a : Cardinal.{u_1}} (ha : aleph0 a) :
a + 1 = a
theorem Cardinal.mk_add_one_eq {α : Type u_1} [Infinite α] :
mk α + 1 = mk α
theorem Cardinal.eq_of_add_eq_add_left {a b c : Cardinal.{u_1}} (h : a + b = a + c) (ha : a < aleph0) :
b = c
theorem Cardinal.eq_of_add_eq_add_right {a b c : Cardinal.{u_1}} (h : a + b = c + b) (hb : b < 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
theorem Cardinal.sum_eq_iSup_lift {ι : Type u} {f : ιCardinal.{max u v}} (hι : aleph0 mk ι) (h : lift.{v, u} (mk ι) iSup f) :
sum f = iSup f
theorem Cardinal.sum_eq_iSup {ι : Type u} {f : ιCardinal.{u}} (hι : aleph0 mk ι) (h : mk ι iSup f) :
sum f = iSup f

Properties of aleph #

@[simp]
theorem Cardinal.aleph_add_aleph (o₁ o₂ : Ordinal.{u_1}) :
aleph o₁ + aleph o₂ = aleph (o₁ o₂)
theorem Cardinal.principal_add_ord {c : Cardinal.{u_1}} (hc : aleph0 c) :
Ordinal.Principal (fun (x1 x2 : Ordinal.{u_1}) => x1 + x2) c.ord
theorem Cardinal.add_right_inj_of_lt_aleph0 {α β γ : Cardinal.{u_1}} (γ₀ : γ < 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}} (γ₀ : γ < aleph0) :
α + γ β + γ α β
@[simp]
theorem Cardinal.add_nat_le_add_nat_iff {α β : Cardinal.{u_1}} (n : ) :
α + n β + n α β
@[simp]
theorem Cardinal.add_one_le_add_one_iff {α β : Cardinal.{u_1}} :
α + 1 β + 1 α β

Properties about power #

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

Computing cardinality of various types #

theorem Cardinal.mk_equiv_eq_zero_iff_lift_ne {α : Type u} {β' : Type v} :
mk (α β') = 0 lift.{v, u} (mk α) lift.{u, v} (mk β')
theorem Cardinal.mk_equiv_eq_zero_iff_ne {α β : Type u} :
mk (α β) = 0 mk α mk β
theorem Cardinal.mk_equiv_comm {α : Type u} {β' : Type v} :
mk (α β') = mk (β' α)

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

theorem Cardinal.mk_embedding_eq_zero_iff_lift_lt {α : Type u} {β' : Type v} :
mk (α β') = 0 lift.{u, v} (mk β') < lift.{v, u} (mk α)
theorem Cardinal.mk_embedding_eq_zero_iff_lt {α β : Type u} :
mk (α β) = 0 mk β < mk α
theorem Cardinal.mk_arrow_eq_zero_iff {α : Type u} {β' : Type v} :
mk (αβ') = 0 mk α 0 mk β' = 0
theorem Cardinal.mk_surjective_eq_zero_iff_lift {α : Type u} {β' : Type v} :
mk {f : αβ' | Function.Surjective f} = 0 lift.{v, u} (mk α) < lift.{u, v} (mk β') mk α 0 mk β' = 0
theorem Cardinal.mk_surjective_eq_zero_iff {α β : Type u} :
mk {f : αβ | Function.Surjective f} = 0 mk α < mk β mk α 0 mk β = 0
theorem Cardinal.mk_equiv_le_embedding (α : Type u) (β' : Type v) :
mk (α β') mk (α β')
theorem Cardinal.mk_embedding_le_arrow (α : Type u) (β' : Type v) :
mk (α β') mk (αβ')
theorem Cardinal.mk_equiv_eq_arrow_of_lift_eq {α : Type u} {β' : Type v} [Infinite α] (leq : lift.{v, u} (mk α) = lift.{u, v} (mk β')) :
mk (α β') = mk (αβ')
theorem Cardinal.mk_equiv_eq_arrow_of_eq {α β : Type u} [Infinite α] (eq : mk α = mk β) :
mk (α β) = mk (αβ)
theorem Cardinal.mk_equiv_of_lift_eq {α : Type u} {β' : Type v} [Infinite α] (leq : lift.{v, u} (mk α) = lift.{u, v} (mk β')) :
mk (α β') = 2 ^ lift.{v, u} (mk α)
theorem Cardinal.mk_equiv_of_eq {α β : Type u} [Infinite α] (eq : mk α = mk β) :
mk (α β) = 2 ^ mk α
theorem Cardinal.mk_embedding_eq_arrow_of_lift_le {α : Type u} {β' : Type v} [Infinite α] (lle : lift.{u, v} (mk β') lift.{v, u} (mk α)) :
mk (β' α) = mk (β'α)
theorem Cardinal.mk_embedding_eq_arrow_of_le {α β : Type u} [Infinite α] (le : mk β mk α) :
mk (β α) = mk (βα)
theorem Cardinal.mk_surjective_eq_arrow_of_lift_le {α : Type u} {β' : Type v} [Infinite α] (lle : lift.{u, v} (mk β') lift.{v, u} (mk α)) :
mk {f : αβ' | Function.Surjective f} = mk (αβ')
theorem Cardinal.mk_surjective_eq_arrow_of_le {α β : Type u} [Infinite α] (le : mk β mk α) :
mk {f : αβ | Function.Surjective f} = mk (αβ)
@[simp]
theorem Cardinal.mk_list_eq_mk (α : Type u) [Infinite α] :
mk (List α) = mk α
@[simp]
theorem Cardinal.mk_finset_of_infinite (α : Type u) [Infinite α] :
mk (Finset α) = mk α
theorem Cardinal.mk_bounded_set_le_of_infinite (α : Type u) [Infinite α] (c : Cardinal.{u}) :
mk { t : Set α // mk t c } mk α ^ c
theorem Cardinal.mk_bounded_set_le (α : Type u) (c : Cardinal.{u}) :
mk { t : Set α // mk t c } (mk α aleph0) ^ c
theorem Cardinal.mk_bounded_subset_le {α : Type u} (s : Set α) (c : Cardinal.{u}) :
mk { t : Set α // t s mk t c } (mk s aleph0) ^ c

Properties of compl #

theorem Cardinal.mk_compl_of_infinite {α : Type u_1} [Infinite α] (s : Set α) (h2 : mk s < mk α) :
mk s = mk α
theorem Cardinal.mk_compl_finset_of_infinite {α : Type u_1} [Infinite α] (s : Finset α) :
mk (↑s) = mk α
theorem Cardinal.mk_compl_eq_mk_compl_infinite {α : Type u_1} [Infinite α] {s t : Set α} (hs : mk s < mk α) (ht : mk t < mk α) :
mk s = mk t
theorem Cardinal.mk_compl_eq_mk_compl_finite {α β : Type u} [Finite α] {s : Set α} {t : Set β} (h1 : mk α = mk β) (h : mk s = mk t) :
mk s = mk t
theorem Cardinal.mk_compl_eq_mk_compl_finite_same {α : Type u} [Finite α] {s t : Set α} (h : mk s = mk t) :
mk s = 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 : mk s < 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 : lift.{v, u} o.card lift.{u, v} c) (hc : aleph0 c) (A : Ordinal.{u}Set β) (hA : j < o, mk (A j) c) :
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 : aleph0 c) (A : Ordinal.{u_1}Set β) (hA : j < o, mk (A j) c) :
mk (⋃ (j : Ordinal.{u_1}), ⋃ (_ : j < o), A j) c
@[deprecated Cardinal.mk_iUnion_Ordinal_le_of_le (since := "2024-11-02")]
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_of_omega0_le_left {a : Ordinal.{u_1}} (ha : omega0 a) (b : Ordinal.{u_1}) :
(a ^ b).card a.card b.card
theorem Ordinal.card_opow_le_of_omega0_le_right (a : Ordinal.{u_1}) {b : Ordinal.{u_1}} (hb : omega0 b) :
(a ^ b).card a.card b.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 : 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 : omega0 b) :
(a ^ b).card = a.card b.card
theorem Ordinal.card_omega0_opow {a : Ordinal.{u_1}} (h : a 0) :
(omega0 ^ a).card = Cardinal.aleph0 a.card
theorem Ordinal.card_opow_omega0 {a : Ordinal.{u_1}} (h : 1 < a) :
(a ^ omega0).card = Cardinal.aleph0 a.card
theorem Ordinal.IsInitial.principal_opow {o : Ordinal.{u_1}} (h : o.IsInitial) (ho : omega0 o) :
Principal (fun (x1 x2 : Ordinal.{u_1}) => x1 ^ x2) o
theorem Ordinal.principal_opow_ord {c : Cardinal.{u_1}} (hc : Cardinal.aleph0 c) :
Principal (fun (x1 x2 : Ordinal.{u_1}) => x1 ^ x2) c.ord