Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit 1cc59b9

Browse files
committed
feat(set_theory/cardinal, data/nat/fincard): Define nat- and enat-valued cardinalities (#6494)
Defines `cardinal.to_nat` and `cardinal.to_enat` Uses those to define `nat.card` and `enat.card`
1 parent 9607dbd commit 1cc59b9

File tree

2 files changed

+106
-10
lines changed

2 files changed

+106
-10
lines changed

src/linear_algebra/finite_dimensional.lean

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -182,19 +182,14 @@ finite_dimensional_iff_dim_lt_omega.2 (lt_of_le_of_lt (dim_quotient_le _) (dim_l
182182
be `0` if the space is infinite-dimensional. -/
183183
noncomputable def findim (K V : Type*) [field K]
184184
[add_comm_group V] [vector_space K V] : ℕ :=
185-
if h : dim K V < omega.{v} then classical.some (lt_omega.1 h) else 0
185+
(dim K V).to_nat
186186

187187
/-- In a finite-dimensional space, its dimension (seen as a cardinal) coincides with its
188188
`findim`. -/
189189
lemma findim_eq_dim (K : Type u) (V : Type v) [field K]
190190
[add_comm_group V] [vector_space K V] [finite_dimensional K V] :
191191
(findim K V : cardinal.{v}) = dim K V :=
192-
begin
193-
have : findim K V = classical.some (lt_omega.1 (dim_lt_omega K V)) :=
194-
dif_pos (dim_lt_omega K V),
195-
rw this,
196-
exact (classical.some_spec (lt_omega.1 (dim_lt_omega K V))).symm
197-
end
192+
by rw [findim, cast_to_nat_of_lt_omega (dim_lt_omega K V)]
198193

199194
lemma findim_of_infinite_dimensional {K V : Type*} [field K] [add_comm_group V] [vector_space K V]
200195
(h : ¬finite_dimensional K V) : findim K V = 0 :=

src/set_theory/cardinal.lean

Lines changed: 104 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ Authors: Johannes Hölzl, Mario Carneiro, Floris van Doorn
66
import data.set.countable
77
import set_theory.schroeder_bernstein
88
import data.fintype.card
9+
import data.nat.enat
910

1011
/-!
1112
# Cardinal Numbers
@@ -786,16 +787,116 @@ end
786787
theorem infinite_iff {α : Type u} : infinite α ↔ omega ≤ mk α :=
787788
by rw [←not_lt, lt_omega_iff_fintype, not_nonempty_fintype]
788789

790+
lemma denumerable_iff {α : Type u} : nonempty (denumerable α) ↔ mk α = omega :=
791+
⟨λ⟨h⟩, quotient.sound $ by exactI ⟨ (denumerable.eqv α).trans equiv.ulift.symm ⟩,
792+
λ h, by { cases quotient.exact h with f, exact ⟨denumerable.mk' $ f.trans equiv.ulift⟩ }⟩
793+
789794
lemma countable_iff (s : set α) : countable s ↔ mk s ≤ omega :=
790795
begin
791796
rw [countable_iff_exists_injective], split,
792797
rintro ⟨f, hf⟩, exact ⟨embedding.trans ⟨f, hf⟩ equiv.ulift.symm.to_embedding⟩,
793798
rintro ⟨f'⟩, cases embedding.trans f' equiv.ulift.to_embedding with f hf, exact ⟨f, hf⟩
794799
end
795800

796-
lemma denumerable_iff {α : Type u} : nonempty (denumerable α) ↔ mk α = omega :=
797-
⟨λ⟨h⟩, quotient.sound $ by exactI ⟨ (denumerable.eqv α).trans equiv.ulift.symm ⟩,
798-
λ h, by { cases quotient.exact h with f, exact ⟨denumerable.mk' $ f.trans equiv.ulift⟩ }⟩
801+
/-- This function sends finite cardinals to the corresponding natural, and infinite cardinals
802+
to 0. -/
803+
noncomputable def to_nat : zero_hom cardinal ℕ :=
804+
⟨λ c, if h : c < omega.{v} then classical.some (lt_omega.1 h) else 0,
805+
begin
806+
have h : 0 < omega := nat_lt_omega 0,
807+
rw [dif_pos h, ← cardinal.nat_cast_inj, ← classical.some_spec (lt_omega.1 h), nat.cast_zero],
808+
end
809+
810+
lemma to_nat_apply_of_lt_omega {c : cardinal} (h : c < omega) :
811+
c.to_nat = classical.some (lt_omega.1 h) :=
812+
dif_pos h
813+
814+
@[simp]
815+
lemma to_nat_apply_of_omega_le {c : cardinal} (h : omega ≤ c) :
816+
c.to_nat = 0 :=
817+
dif_neg (not_lt_of_le h)
818+
819+
@[simp]
820+
lemma cast_to_nat_of_lt_omega {c : cardinal} (h : c < omega) :
821+
↑c.to_nat = c :=
822+
by rw [to_nat_apply_of_lt_omega h, ← classical.some_spec (lt_omega.1 h)]
823+
824+
@[simp]
825+
lemma to_nat_cast (n : ℕ) : cardinal.to_nat n = n :=
826+
begin
827+
rw [to_nat_apply_of_lt_omega (nat_lt_omega n), ← nat_cast_inj],
828+
exact (classical.some_spec (lt_omega.1 (nat_lt_omega n))).symm,
829+
end
830+
831+
/-- `to_nat` has a right-inverse: coercion. -/
832+
lemma to_nat_right_inverse : function.right_inverse (coe : ℕ → cardinal) to_nat := to_nat_cast
833+
834+
lemma to_nat_surjective : surjective to_nat := to_nat_right_inverse.surjective
835+
836+
@[simp]
837+
lemma mk_to_nat_of_infinite [h : infinite α] : (mk α).to_nat = 0 :=
838+
dif_neg (not_lt_of_le (infinite_iff.1 h))
839+
840+
@[simp]
841+
lemma mk_to_nat_eq_card [fintype α] : (mk α).to_nat = fintype.card α :=
842+
by simp [fintype_card]
843+
844+
@[simp]
845+
lemma zero_to_nat : cardinal.to_nat 0 = 0 :=
846+
by rw [← to_nat_cast 0, nat.cast_zero]
847+
848+
@[simp]
849+
lemma one_to_nat : cardinal.to_nat 1 = 1 :=
850+
by rw [← to_nat_cast 1, nat.cast_one]
851+
852+
/-- This function sends finite cardinals to the corresponding natural, and infinite cardinals
853+
to `⊤`. -/
854+
noncomputable def to_enat : cardinal →+ enat :=
855+
{ to_fun := λ c, if c < omega.{v} then c.to_nat else ⊤,
856+
map_zero' := by simp [if_pos (lt_trans zero_lt_one one_lt_omega)],
857+
map_add' := λ x y, begin
858+
by_cases hx : x < omega,
859+
{ obtain ⟨x0, rfl⟩ := lt_omega.1 hx,
860+
by_cases hy : y < omega,
861+
{ obtain ⟨y0, rfl⟩ := lt_omega.1 hy,
862+
simp only [add_lt_omega hx hy, hx, hy, to_nat_cast, if_true],
863+
rw [← nat.cast_add, to_nat_cast, enat.coe_add] },
864+
{ rw [if_neg hy, if_neg, enat.add_top],
865+
contrapose! hy,
866+
apply lt_of_le_of_lt (le_add_left (le_refl y)) hy } },
867+
{ rw [if_neg hx, if_neg, enat.top_add],
868+
contrapose! hx,
869+
apply lt_of_le_of_lt (le_add_right (le_refl x)) hx },
870+
end }
871+
872+
@[simp]
873+
lemma to_enat_apply_of_lt_omega {c : cardinal} (h : c < omega) :
874+
c.to_enat = c.to_nat :=
875+
if_pos h
876+
877+
@[simp]
878+
lemma to_enat_apply_of_omega_le {c : cardinal} (h : omega ≤ c) :
879+
c.to_enat = ⊤ :=
880+
if_neg (not_lt_of_le h)
881+
882+
@[simp]
883+
lemma to_enat_cast (n : ℕ) : cardinal.to_enat n = n :=
884+
by rw [to_enat_apply_of_lt_omega (nat_lt_omega n), to_nat_cast]
885+
886+
@[simp]
887+
lemma mk_to_enat_of_infinite [h : infinite α] : (mk α).to_enat = ⊤ :=
888+
to_enat_apply_of_omega_le (infinite_iff.1 h)
889+
890+
lemma to_enat_surjective : surjective to_enat :=
891+
begin
892+
intro x,
893+
exact enat.cases_on x ⟨omega, to_enat_apply_of_omega_le (le_refl omega)⟩
894+
(λ n, ⟨n, to_enat_cast n⟩),
895+
end
896+
897+
@[simp]
898+
lemma mk_to_enat_eq_coe_card [fintype α] : (mk α).to_enat = fintype.card α :=
899+
by simp [fintype_card]
799900

800901
lemma mk_int : mk ℤ = omega :=
801902
denumerable_iff.mp ⟨by apply_instance⟩

0 commit comments

Comments
 (0)