@@ -6,6 +6,7 @@ Authors: Johannes Hölzl, Mario Carneiro, Floris van Doorn
6
6
import data.set.countable
7
7
import set_theory.schroeder_bernstein
8
8
import data.fintype.card
9
+ import data.nat.enat
9
10
10
11
/-!
11
12
# Cardinal Numbers
@@ -786,16 +787,116 @@ end
786
787
theorem infinite_iff {α : Type u} : infinite α ↔ omega ≤ mk α :=
787
788
by rw [←not_lt, lt_omega_iff_fintype, not_nonempty_fintype]
788
789
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
+
789
794
lemma countable_iff (s : set α) : countable s ↔ mk s ≤ omega :=
790
795
begin
791
796
rw [countable_iff_exists_injective], split,
792
797
rintro ⟨f, hf⟩, exact ⟨embedding.trans ⟨f, hf⟩ equiv.ulift.symm.to_embedding⟩,
793
798
rintro ⟨f'⟩, cases embedding.trans f' equiv.ulift.to_embedding with f hf, exact ⟨f, hf⟩
794
799
end
795
800
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]
799
900
800
901
lemma mk_int : mk ℤ = omega :=
801
902
denumerable_iff.mp ⟨by apply_instance⟩
0 commit comments