Cardinal arithmetic #
Arithmetic operations on cardinals are defined in Mathlib/SetTheory/Cardinal/Order.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 #
Cardinal.mul_eq_maxandCardinal.add_eq_maxstate that the product (resp. sum) of two infinite cardinals is just their maximum. Several variations around this fact are also given.Cardinal.mk_list_eq_mk: whenαis infinite,αandList αhave the same cardinality.
Tags #
cardinal arithmetic (for infinite cardinals)
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 = max a b
If α and β are infinite types, then the cardinality of α × β is the maximum
of the cardinalities of α and β.
@[simp]
@[simp]
@[simp]
@[simp]
@[simp]
theorem
Cardinal.mul_lt_of_lt
{a b c : Cardinal.{u_1}}
(hc : aleph0 ≤ c)
(h1 : a < c)
(h2 : b < c)
:
theorem
Cardinal.mul_eq_max_of_aleph0_le_left
{a b : Cardinal.{u_1}}
(h : aleph0 ≤ a)
(h' : b ≠ 0)
:
a * b = max a b
theorem
Cardinal.mul_eq_max_of_aleph0_le_right
{a b : Cardinal.{u_1}}
(h' : a ≠ 0)
(h : aleph0 ≤ b)
:
a * b = max 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
Properties of add #
If α is an infinite type, then α ⊕ α and α have the same cardinality.
If α is an infinite type, then the cardinality of α ⊕ β is the maximum
of the cardinalities of α and β.
@[simp]
@[simp]
theorem
Cardinal.add_le_of_le
{a b c : Cardinal.{u_1}}
(hc : aleph0 ≤ c)
(h1 : a ≤ c)
(h2 : b ≤ c)
:
theorem
Cardinal.add_lt_of_lt
{a b c : Cardinal.{u_1}}
(hc : aleph0 ≤ c)
(h1 : a < c)
(h2 : 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.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_lift_iSup_of_lift_mk_le_lift_iSup
{ι : Type u}
[Small.{v, u} ι]
{f : ι → Cardinal.{v}}
(hι : aleph0 ≤ mk ι)
(h : lift.{v, u} (mk ι) ≤ lift.{u, v} (⨆ (i : ι), f i))
:
sum f = lift.{u, v} (⨆ (i : ι), f i)
theorem
Cardinal.sum_eq_iSup_of_lift_mk_le_iSup
{ι : Type u}
{f : ι → Cardinal.{max u v}}
(hι : aleph0 ≤ mk ι)
(h : lift.{v, u} (mk ι) ≤ ⨆ (i : ι), f i)
:
sum f = ⨆ (i : ι), f i
theorem
Cardinal.sum_eq_iSup_of_mk_le_iSup
{ι : Type u}
{f : ι → Cardinal.{u}}
(hι : aleph0 ≤ mk ι)
(h : mk ι ≤ iSup f)
:
sum f = ⨆ (i : ι), f i
Properties of aleph #
@[simp]
theorem
Cardinal.add_right_inj_of_lt_aleph0
{α β γ : Cardinal.{u_1}}
(γ₀ : γ < aleph0)
:
α + γ = β + γ ↔ α = β
@[simp]
@[simp]
@[simp]
@[simp]
theorem
Cardinal.natCast_mul_strictMono
{n : ℕ}
(hn : n ≠ 0)
:
StrictMono fun (a : Cardinal.{u_1}) => ↑n * a
theorem
Cardinal.mul_natCast_strictMono
{n : ℕ}
(hn : n ≠ 0)
:
StrictMono fun (a : Cardinal.{u_1}) => a * ↑n
@[simp]
theorem
Cardinal.natCast_mul_inj
{n : ℕ}
{a b : Cardinal.{u_1}}
(hn : n ≠ 0)
:
↑n * a = ↑n * b ↔ a = b
@[simp]
theorem
Cardinal.mul_natCast_inj
{n : ℕ}
{a b : Cardinal.{u_1}}
(hn : n ≠ 0)
:
a * ↑n = b * ↑n ↔ a = b
@[simp]
@[simp]
@[simp]
@[simp]
Properties about power #
theorem
Cardinal.pow_eq
{κ μ : Cardinal.{u}}
(H1 : aleph0 ≤ κ)
(H2 : 1 ≤ μ)
(H3 : μ < aleph0)
:
κ ^ μ = κ
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
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_embedding_eq_zero_iff_lift_lt
{α : Type u}
{β' : Type v}
:
mk (α ↪ β') = 0 ↔ lift.{u, v} (mk β') < lift.{v, u} (mk α)
theorem
Cardinal.mk_equiv_eq_arrow_of_lift_eq
{α : Type u}
{β' : Type v}
[Infinite α]
(leq : lift.{v, u} (mk α) = lift.{u, v} (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_embedding_eq_arrow_of_lift_le
{α : Type u}
{β' : Type v}
[Infinite α]
(lle : lift.{u, v} (mk β') ≤ lift.{v, u} (mk α))
:
theorem
Cardinal.mk_surjective_eq_arrow_of_lift_le
{α : Type u}
{β' : Type v}
[Infinite α]
(lle : lift.{u, v} (mk β') ≤ lift.{v, u} (mk α))
:
@[simp]
Properties of compl #
theorem
Cardinal.mk_compl_eq_mk_compl_finite_lift
{α : Type u}
{β : Type v}
[Finite α]
{s : Set α}
{t : Set β}
(h1 : lift.{v, u} (mk α) = lift.{u, v} (mk β))
(h2 : lift.{v, u} (mk ↑s) = lift.{u, v} (mk ↑t))
:
lift.{v, u} (mk ↑sᶜ) = lift.{u, v} (mk ↑tᶜ)