import Bookshelf.Enderton.Set.Chapter_4 import Common.Logic.Basic import Common.Nat.Basic import Common.Set.Basic import Common.Set.Equinumerous import Common.Set.Function import Common.Set.Intervals import Mathlib.Data.Finset.Card import Mathlib.Data.Set.Finite /-! # Enderton.Set.Chapter_6 Cardinal Numbers and the Axiom of Choice NOTE: We choose to use injectivity/surjectivity concepts found in `Mathlib.Data.Set.Function` over those in `Mathlib.Init.Function` since the former provides noncomputable utilities around obtaining inverse functions (namely `Function.invFunOn`). -/ namespace Enderton.Set.Chapter_6 /-- ### Theorem 6B No set is equinumerous to its powerset. -/ theorem theorem_6b (A : Set α) : A ≉ 𝒫 A := by /- > Let `A` be an arbitrary set and `f: A → 𝒫 A`. -/ rw [Set.not_equinumerous_def] intro f hf unfold Set.BijOn at hf /- > Define `φ = {a ∈ A | a ∉ f(a)}`. -/ let φ := { a ∈ A | a ∉ f a } /- > Clearly `φ ∈ 𝒫 A`. Furthermore, for all `a ∈ A`, `φ ≠ f(a)` since `a ∈ φ` if > and only if `a ∉ f(a)`. Thus `f` cannot be onto `𝒫 A`. Since `f` was > arbitrarily chosen, there exists no one-to-one correspondence between `A` and > `𝒫 A`. Since `A` was arbitrarily chosen, there is no set equinumerous to its > powerset. -/ suffices ∀ a ∈ A, f a ≠ φ by have hφ := hf.right.right (show φ ∈ 𝒫 A by simp) have ⟨a, ha⟩ := hφ exact absurd ha.right (this a ha.left) intro a ha hfa by_cases h : a ∈ f a · have h' := h rw [hfa] at h simp only [Set.mem_setOf_eq] at h exact absurd h' h.right · rw [Set.Subset.antisymm_iff] at hfa have := hfa.right ⟨ha, h⟩ exact absurd this h /-! ### Pigeonhole Principle -/ /-- A subset of a finite set of natural numbers has a max member. -/ lemma subset_finite_max_nat {S' S : Set ℕ} (hS : Set.Finite S) (hS' : Set.Nonempty S') (h : S' ⊆ S) : ∃ m, m ∈ S' ∧ ∀ n, n ∈ S' → n ≤ m := by have ⟨m, hm₁, hm₂⟩ := Set.Finite.exists_maximal_wrt id S' (Set.Finite.subset hS h) hS' simp only [id_eq] at hm₂ refine ⟨m, hm₁, ?_⟩ intro n hn match @trichotomous ℕ LT.lt _ m n with | Or.inr (Or.inl r) => exact Nat.le_of_eq r.symm | Or.inl r => have := hm₂ n hn (Nat.le_of_lt r) exact Nat.le_of_eq this.symm | Or.inr (Or.inr r) => exact Nat.le_of_lt r /-- Auxiliary function to be proven by induction. -/ lemma pigeonhole_principle_aux (n : ℕ) : ∀ M, M ⊂ Set.Iio n → ∀ f : ℕ → ℕ, Set.MapsTo f M (Set.Iio n) ∧ Set.InjOn f M → ¬ Set.SurjOn f M (Set.Iio n) := by /- > Let > > `S = {n ∈ ω | ∀ M ⊂ n, every one-to-one function f: M → n is not onto}`. (1) > > We show that (i) `0 ∈ S` and (ii) if `n ∈ S`, then so is `n⁺`. Afterward we > prove (iii) the theorem statement. -/ induction n with /- > #### (i) > By definition, `0 = ∅`. Then `0` has no proper subsets. Hence `0 ∈ S` > vacuously. -/ | zero => intro _ hM unfold Set.Iio at hM simp only [Nat.zero_eq, not_lt_zero', Set.setOf_false] at hM rw [Set.ssubset_empty_iff_false] at hM exact False.elim hM /- > #### (ii) > Suppose `n ∈ S` and `M ⊂ n⁺`. Furthermore, let `f: M → n⁺` be a one-to-one > function. -/ | succ n ih => intro M hM f ⟨hf_maps, hf_inj⟩ hf_surj /- > If `M = ∅`, it vacuously holds that `f` is not onto `n⁺`. -/ by_cases hM' : M = ∅ · rw [hM', Set.SurjOn_emptyset_Iio_iff_eq_zero] at hf_surj simp at hf_surj /- > Otherwise `M ≠ 0`. Because `M` is finite, the *Trichotomy Law for `ω`* implies > the existence of a largest member `p ∈ M`. There are two cases to consider: -/ by_cases h : ¬ ∃ t, t ∈ M ∧ f t = n /- > ##### Case 1 > `n ∉ ran f`. > Then `f` is not onto `n⁺`. -/ · have ⟨t, ht⟩ := hf_surj (show n ∈ _ by simp) exact absurd ⟨t, ht⟩ h /- > ##### Case 2 > `n ∈ ran f`. > Then there exists some `t ∈ M` such that `⟨t, n⟩ ∈ f`. -/ have ⟨t, ht₁, ht₂⟩ := not_not.mp h /- > Define `f': M → n⁺` given by > > `f'(p) = f(t) = n` > `f'(t) = f(p)` > `f'(x) = f(x)` for all other `x`. > > That is, `f'` is a variant of `f` in which the largest element of its domain > (i.e. `p`) corresponds to value `n`. -/ -- `M ≠ ∅` so `∃ p, ∀ x ∈ M, p ≥ x`, i.e. a maximum member. have ⟨p, hp₁, hp₂⟩ : ∃ p ∈ M, ∀ x, x ∈ M → p ≥ x := by refine subset_finite_max_nat (show Set.Finite M from ?_) ?_ ?_ · show Set.Finite M have := Set.finite_lt_nat (n + 1) exact Set.Finite.subset this (subset_of_ssubset hM) · show Set.Nonempty M exact Set.nmem_singleton_empty.mp hM' · show M ⊆ M exact Eq.subset rfl /- > Next define `g = f' - {⟨p, n⟩}`. Then `g` is a function mapping `M - {p}` to > `n`. -/ let g := Set.Function.swap f p t /- > Since `f` is one-to-one, `f'` and `g` are also one-to-one. -/ have hg_maps := Set.Function.swap_MapsTo_self hp₁ ht₁ hf_maps have hg_inj := Set.Function.swap_InjOn_self hp₁ ht₁ hf_inj /- > Then *(1)* indicates `g` must not be onto `n`. -/ let M' := M \ {p} have hM' : M' ⊂ Set.Iio n := by by_cases hc : p = n · suffices Set.Iio (n + 1) \ {n} = Set.Iio n by have h₁ := Set.diff_ssubset_diff_left hM hp₁ conv at h₁ => right; rw [hc] rwa [← this] ext x apply Iff.intro · intro hx₁ refine Or.elim (Nat.lt_or_eq_of_lt hx₁.left) (by simp) ?_ intro hx₂ rw [hx₂] at hx₁ simp at hx₁ · intro hx₁ exact ⟨Nat.lt_trans hx₁ (by simp), Nat.ne_of_lt hx₁⟩ have hp_lt_n : p < n := by have := subset_of_ssubset hM have hp' : p < n + 1 := this hp₁ exact Or.elim (Nat.lt_or_eq_of_lt hp') id (absurd · hc) rw [Set.ssubset_def] apply And.intro · show ∀ x, x ∈ M' → x < n intro x hx simp only [Set.mem_diff, Set.mem_singleton_iff] at hx calc x _ ≤ p := hp₂ x hx.left _ < n := hp_lt_n · show ¬ ∀ x, x < n → x ∈ M' by_contra np have := np p hp_lt_n simp at this -- Consider `g = f' - {⟨p, n⟩}`. This restriction will allow us to use -- the induction hypothesis to prove `g` isn't surjective. have ng_surj : ¬ Set.SurjOn g M' (Set.Iio n) := by refine ih _ hM' g ⟨?_, ?_⟩ · -- `Set.MapsTo g M' (Set.Iio n)` intro x hx have hx₁ : x ∈ M := Set.mem_of_mem_diff hx apply Or.elim (Nat.lt_or_eq_of_lt $ hg_maps hx₁) id intro hx₂ unfold Set.Function.swap at hx₂ by_cases hc₁ : x = p · exact absurd hc₁ hx.right · rw [if_neg hc₁] at hx₂ by_cases hc₂ : x = t · rw [if_pos hc₂, ← ht₂] at hx₂ have := hf_inj hp₁ ht₁ hx₂ rw [← hc₂] at this exact absurd this.symm hc₁ · rw [if_neg hc₂, ← ht₂] at hx₂ have := hf_inj hx₁ ht₁ hx₂ exact absurd this hc₂ · -- `Set.InjOn g M'` intro x₁ hx₁ x₂ hx₂ hg have hx₁' : x₁ ∈ M := (Set.diff_subset M {p}) hx₁ have hx₂' : x₂ ∈ M := (Set.diff_subset M {p}) hx₂ exact hg_inj hx₁' hx₂' hg /- > That is, there exists some `a ∈ n` such that `a ∉ ran g`. -/ have ⟨a, ha₁, ha₂⟩ : ∃ a, a < n ∧ a ∉ g '' M' := by unfold Set.SurjOn at ng_surj rw [Set.subset_def] at ng_surj simp only [ Set.mem_Iio, Set.mem_image, not_forall, not_exists, not_and, exists_prop ] at ng_surj unfold Set.image simp only [Set.mem_Iio, Set.mem_setOf_eq, not_exists, not_and] exact ng_surj /- > By the *Trichotomy Law for `ω`*, `a ≠ n`. Therefore `a ∉ ran f'`. > `ran f' = ran f` meaning `a ∉ ran f`. Because `a ∈ n ∈ n⁺`, *Theorem 4F* > implies `a ∈ n⁺`. Hence `f` is not onto `n⁺`. -/ refine absurd (hf_surj $ calc a _ < n := ha₁ _ < n + 1 := by simp) (show ↑a ∉ f '' M from ?_) suffices g '' M = f '' M by rw [← this] show a ∉ g '' M unfold Set.image at ha₂ ⊢ simp only [Set.mem_Iio, Set.mem_setOf_eq, not_exists, not_and] at ha₂ ⊢ intro x hx by_cases hxp : x = p · unfold Set.Function.swap rw [if_pos hxp, ht₂] exact (Nat.ne_of_lt ha₁).symm · refine ha₂ x ?_ exact Set.mem_diff_of_mem hx hxp ext x dsimp only unfold Set.Function.swap simp only [Set.mem_image, Set.mem_Iio] apply Iff.intro · intro ⟨y, hy₁, hy₂⟩ by_cases hc₁ : y = p · rw [if_pos hc₁, ht₂] at hy₂ rw [hy₂] at ht₂ exact ⟨t, ht₁, ht₂⟩ · rw [if_neg hc₁] at hy₂ by_cases hc₂ : y = t · rw [if_pos hc₂] at hy₂ exact ⟨p, hp₁, hy₂⟩ · rw [if_neg hc₂] at hy₂ exact ⟨y, hy₁, hy₂⟩ · intro ⟨y, hy₁, hy₂⟩ by_cases hc₁ : y = p · refine ⟨t, ht₁, ?_⟩ by_cases hc₂ : y = t · rw [hc₂, ht₂] at hy₂ rw [← hc₁, ← hc₂] simp only [ite_self, ite_true] rwa [hc₂, ht₂] · rw [hc₁, ← Ne.def] at hc₂ rwa [if_neg hc₂.symm, if_pos rfl, ← hc₁] · by_cases hc₂ : y = t · refine ⟨p, hp₁, ?_⟩ simp only [ite_self, ite_true] rwa [hc₂] at hy₂ · refine ⟨y, hy₁, ?_⟩ rwa [if_neg hc₁, if_neg hc₂] /- > ##### Subconclusion > The foregoing cases are exhaustive. Hence `n⁺ ∈ S`. > > #### (iii) > By *(i)* and *(ii)*, `S` is an inductive set. By *Theorem 4B*, `S = ω`. Thus > for all natural numbers `n`, there is no one-to-one correspondence between `n` > and a proper subset of `n`. In other words, no natural number is equinumerous > to a proper subset of itself. -/ /-- No natural number is equinumerous to a proper subset of itself. -/ theorem pigeonhole_principle {n : ℕ} : ∀ {M}, M ⊂ Set.Iio n → M ≉ Set.Iio n := by intro M hM nM have ⟨f, hf⟩ := nM have := pigeonhole_principle_aux n M hM f ⟨hf.left, hf.right.left⟩ exact absurd hf.right.right this /-- ### Corollary 6C No finite set is equinumerous to a proper subset of itself. -/ theorem corollary_6c [DecidableEq α] [Nonempty α] {S S' : Set α} (hS : Set.Finite S) (h : S' ⊂ S) : S ≉ S' := by /- > Let `S` be a finite set and `S'` be a proper subset of `S`. Then there exists > some set `T`, disjoint from `S'`, such that `S' ∪ T = S`. By definition of a > finite set, `S` is equinumerous to a natural number `n`. -/ let T := S \ S' have hT : S = S' ∪ (S \ S') := by simp only [Set.union_diff_self] exact (Set.left_subset_union_eq_self (subset_of_ssubset h)).symm /- > By *Theorem 6A*, `S' ∪ T ≈ S` which, by the same theorem, implies > `S' ∪ T ≈ n`. -/ have hF := Set.equinumerous_refl S conv at hF => arg 1; rw [hT] have ⟨n, hG⟩ := Set.finite_iff_equinumerous_nat.mp hS /- > Let `f` be a one-to-one correspondence between `S' ∪ T` and `n`. -/ have ⟨f, hf⟩ := Set.equinumerous_trans hF hG /- > Then `f ↾ S'` is a one-to-one correspondence between `S'` and a proper subset > of `n`. -/ let R := (Set.Iio n) \ (f '' T) have hR : Set.BijOn f S' R := by refine ⟨?_, ?_, ?_⟩ · -- `Set.MapsTo H S' R` intro x hx refine ⟨hf.left $ Set.mem_union_left T hx, ?_⟩ unfold Set.image by_contra nx simp only [Finset.mem_coe, Set.mem_setOf_eq] at nx have ⟨a, ha₁, ha₂⟩ := nx have hc₁ : a ∈ S' ∪ T := Set.mem_union_right S' ha₁ have hc₂ : x ∈ S' ∪ T := Set.mem_union_left T hx rw [hf.right.left hc₁ hc₂ ha₂] at ha₁ have hx₁ : {x} ⊆ S' := Set.singleton_subset_iff.mpr hx have hx₂ : {x} ⊆ T := Set.singleton_subset_iff.mpr ha₁ have hx₃ := Set.disjoint_sdiff_right hx₁ hx₂ simp only [ Set.bot_eq_empty, Set.le_eq_subset, Set.singleton_subset_iff, Set.mem_empty_iff_false ] at hx₃ · -- `Set.InjOn H S'` intro x₁ hx₁ x₂ hx₂ h have hc₁ : x₁ ∈ S' ∪ T := Set.mem_union_left T hx₁ have hc₂ : x₂ ∈ S' ∪ T := Set.mem_union_left T hx₂ exact hf.right.left hc₁ hc₂ h · -- `Set.SurjOn H S' R` show ∀ r, r ∈ R → r ∈ f '' S' intro r hr unfold Set.image simp only [Set.mem_setOf_eq] dsimp only at hr have := hf.right.right hr.left simp only [Set.mem_image, Set.mem_union] at this have ⟨x, hx⟩ := this apply Or.elim hx.left · intro hx' exact ⟨x, hx', hx.right⟩ · intro hx' refine absurd ?_ hr.right rw [← hx.right] simp only [Set.mem_image, Finset.mem_coe] exact ⟨x, hx', rfl⟩ /- > By the *Pigeonhole Principle*, `n` is not equinumerous to any proper subset of > `n`. Therefore *Theorem 6A* implies `S'` cannot be equinumerous to `n`, which, > by the same theorem, implies `S'` cannot be equinumerous to `S`. Hence no > finite set is equinumerous to a proper subset of itself. -/ intro hf' have hf₁ : S ≈ R := Set.equinumerous_trans hf' ⟨f, hR⟩ have hf₂ : R ≈ Set.Iio n := by have ⟨k, hk⟩ := Set.equinumerous_symm hf₁ exact Set.equinumerous_trans ⟨k, hk⟩ hG refine absurd hf₂ (pigeonhole_principle ?_) show R ⊂ Set.Iio n apply And.intro · show ∀ r, r ∈ R → r ∈ Set.Iio n intro _ hr exact hr.left · show ¬ ∀ r, r ∈ Set.Iio n → r ∈ R intro nr have ⟨t, ht₁⟩ : Set.Nonempty T := Set.diff_ssubset_nonempty h have ht₂ : f t ∈ Set.Iio n := hf.left (Set.mem_union_right S' ht₁) have ht₃ : f t ∈ R := nr (f t) ht₂ exact absurd ⟨t, ht₁, rfl⟩ ht₃.right /-- ### Corollary 6D (a) Any set equinumerous to a proper subset of itself is infinite. -/ theorem corollary_6d_a [DecidableEq α] [Nonempty α] {S S' : Set α} (hS : S' ⊂ S) (hf : S ≈ S') : Set.Infinite S := by /- > Let `S` be a set equinumerous to proper subset `S'` of itself. Then `S` cannot > be a finite set by *Corollary 6C*. By definition, `S` is an infinite set. -/ by_contra nS simp only [Set.not_infinite] at nS exact absurd hf (corollary_6c nS hS) /-- ### Corollary 6D (b) The set `ω` is infinite. -/ theorem corollary_6d_b : Set.Infinite (@Set.univ ℕ) := by /- > Consider set `S = {n ∈ ω | n is even}`. We prove that (i) `S` is equinumerous > to `ω` and (ii) that `ω` is infinite. -/ let S : Set ℕ := { 2 * n | n ∈ @Set.univ ℕ } let f x := 2 * x /- > #### (i) > Define `f : ω → S` given by `f(n) = 2 ⬝ n`. Notice `f` is well-defined by the > definition of an even natural number, introduced in *Exercise 4.14*. We first > show `f` is one-to-one and then that `f` is onto. -/ have : Set.BijOn f (@Set.univ ℕ) S := by refine ⟨by simp, ?_, ?_⟩ /- > Suppose `f(n₁) = f(n₁) = 2 ⬝ n₁`. We must prove that `n₁ = n₂`. -/ · -- `Set.InjOn f Set.univ` intro n₁ _ n₂ _ hf /- > By the *Trichotomy Law for `ω`*, exactly one of the following may occur: > `n₁ = n₂`, `n₁ < n₂`, or `n₂ < n₁`. If `n₁ < n₂`, then *Theorem 4N* implies > `n₁ ⬝ 2 < n₂ ⬝ 2`. *Theorem 4K-5* then indicates `2 ⬝ n₁ < 2 ⬝ n₂`, a > contradiction to `2 ⬝ n₁ = 2 ⬝ n₂`. A parallel argument holds for when > `n₂ < n₁`. Thus `n₁ = n₂`. -/ match @trichotomous ℕ LT.lt _ n₁ n₂ with | Or.inr (Or.inl r) => exact r | Or.inl r => have := (Chapter_4.theorem_4n_ii n₁ n₂ 1).mp r conv at this => left; rw [mul_comm] conv at this => right; rw [mul_comm] exact absurd hf (Nat.ne_of_lt this) | Or.inr (Or.inr r) => have := (Chapter_4.theorem_4n_ii n₂ n₁ 1).mp r conv at this => left; rw [mul_comm] conv at this => right; rw [mul_comm] exact absurd hf.symm (Nat.ne_of_lt this) /- > Next, let `m ∈ S`. That is, `m` is an even number. By definition, there exists > some `n ∈ ω` such that `m = 2 ⬝ n`. Thus `f(n) = m`. -/ · -- `Set.SurjOn f Set.univ S` show ∀ x, x ∈ S → x ∈ f '' Set.univ intro x hx unfold Set.image simp only [Set.mem_univ, true_and, Set.mem_setOf_eq] at hx ⊢ exact hx /- > By *(i)*, `ω` is equinumerous to a subset of itself. By *Corollary 6D (a)*, > `ω` is infinite. -/ refine corollary_6d_a ?_ ⟨f, this⟩ rw [Set.ssubset_def] apply And.intro · simp · show ¬ ∀ x, x ∈ Set.univ → x ∈ S simp only [ Set.mem_univ, true_and, Set.mem_setOf_eq, forall_true_left, not_forall, not_exists ] refine ⟨1, ?_⟩ intro x nx simp only [mul_eq_one, false_and] at nx /-- ### Corollary 6E Any finite set is equinumerous to a unique natural number. -/ theorem corollary_6e [Nonempty α] (S : Set α) (hS : Set.Finite S) : ∃! n : ℕ, S ≈ Set.Iio n := by /- > Let `S` be a finite set. By definition `S` is equinumerous to a natural number > `n`. -/ have ⟨n, hf⟩ := Set.finite_iff_equinumerous_nat.mp hS refine ⟨n, hf, ?_⟩ /- > Suppose `S` is equinumerous to another natural number `m`. -/ intro m hg /- > By the *Trichotomy Law for `ω`*, exactly one of three situations is possible: > `n = m`, `n < m`, or `m < n`. -/ match @trichotomous ℕ LT.lt _ m n with /- > If `n < m`, then `m ≈ S` and `S ≈ n`. By *Theorem 6A*, it follows `m ≈ n`. But > the *Pigeonhole Principle* indicates no natural number is equinumerous to a > proper subset of itself, a contradiction. -/ | Or.inr (Or.inr r) => have hh := Set.equinumerous_symm hf have hk := Set.equinumerous_trans hh hg have hnm : Set.Iio n ⊂ Set.Iio m := Set.Iio_nat_lt_ssubset r exact absurd hk (pigeonhole_principle hnm) /- > If `m < n`, a parallel argument applies. -/ | Or.inl r => have hh := Set.equinumerous_symm hg have hk := Set.equinumerous_trans hh hf have hmn : Set.Iio m ⊂ Set.Iio n := Set.Iio_nat_lt_ssubset r exact absurd hk (pigeonhole_principle hmn) /- > Hence `n = m`, proving every finite set is equinumerous to a unique natural > number. -/ | Or.inr (Or.inl r) => exact r /-- ### Lemma 6F If `C` is a proper subset of a natural number `n`, then `C ≈ m` for some `m` less than `n`. -/ lemma lemma_6f {n : ℕ} : ∀ {C}, C ⊂ Set.Iio n → ∃ m, m < n ∧ C ≈ Set.Iio m := by /- > Let > > `S = {n ∈ ω | ∀C ⊂ n, ∃m < n such that C ≈ m}`. (2) > > We prove that (i) `0 ∈ S` and (ii) if `n ∈ S` then `n⁺ ∈ S`. Afterward we > prove (iii) the lemma statement. -/ induction n with /- > #### (i) > By definition, `0 = ∅`. Thus `0` has no proper subsets. Hence `0 ∈ S` > vacuously. -/ | zero => intro C hC unfold Set.Iio at hC simp only [Nat.zero_eq, not_lt_zero', Set.setOf_false] at hC rw [Set.ssubset_empty_iff_false] at hC exact False.elim hC /- > #### (ii) > Suppose `n ∈ S` and consider `n⁺`. By definition of the successor, > `n⁺ = n ∪ {n}`. There are two cases to consider: -/ | succ n ih => /- > Let `C` be an arbitrary, proper subset of `n⁺`. -/ intro C hC -- A useful theorem we use in a couple of places. have h_subset_equinumerous : ∀ S, S ⊆ Set.Iio n → ∃ m, m < n + 1 ∧ S ≈ Set.Iio m := by intro S hS rw [subset_iff_ssubset_or_eq] at hS apply Or.elim hS · -- `S ⊂ Set.Iio n` intro h have ⟨m, hm⟩ := ih h exact ⟨m, calc m _ < n := hm.left _ < n + 1 := by simp, hm.right⟩ · -- `S = Set.Iio n` intro h exact ⟨n, by simp, Set.eq_imp_equinumerous h⟩ /- > There are two cases to consider: -/ by_cases hn : n ∉ C /- > ##### Case 1 > Suppose `n ∉ C`. Then `C ⊆ n`. If `C` is a proper subset of `n`, *(2)* implies > `C` is equinumerous to some `m < n < n⁺`. If `C = n`, then *Theorem 6A* > implies `C` is equinumerous to `n < n⁺`. -/ · refine h_subset_equinumerous C ?_ show ∀ x, x ∈ C → x ∈ Set.Iio n intro x hx apply Or.elim (Nat.lt_or_eq_of_lt (subset_of_ssubset hC hx)) · exact id · intro hx₁ rw [hx₁] at hx exact absurd hx hn /- > ##### Case 2 > Suppose `n ∈ C`. Since `C` is a proper subset of `n⁺`, the set `n⁺ - C` is > nonempty. By the *Well Ordering of `ω`*, `n⁺ - C` has a least element, say > `p` (which does not equal `n`). -/ simp only [not_not] at hn have hC₁ : Set.Nonempty (Set.Iio (n + 1) \ C) := by rw [Set.ssubset_def] at hC have : ¬ ∀ x, x ∈ Set.Iio (n + 1) → x ∈ C := hC.right simp only [Set.mem_Iio, not_forall, exists_prop] at this exact this -- `p` is the least element of `n⁺ - C`. have ⟨p, hp⟩ := Chapter_4.well_ordering_nat hC₁ /- > Consider now set `C' = (C - {n}) ∪ {p}`. By construction, `C' ⊆ n`. -/ let C' := (C \ {n}) ∪ {p} have hC'₁ : C' ⊆ Set.Iio n := by show ∀ x, x ∈ C' → x ∈ Set.Iio n intro x hx match @trichotomous ℕ LT.lt _ x n with | Or.inl r => exact r | Or.inr (Or.inl r) => rw [r] at hx apply Or.elim hx · intro nx simp at nx · intro nx simp only [Set.mem_singleton_iff] at nx rw [nx] at hn exact absurd hn hp.left.right | Or.inr (Or.inr r) => apply Or.elim hx · intro ⟨h₁, h₂⟩ have h₃ := subset_of_ssubset hC h₁ simp only [Set.mem_singleton_iff, Set.mem_Iio] at h₂ h₃ exact Or.elim (Nat.lt_or_eq_of_lt h₃) id (absurd · h₂) · intro h simp only [Set.mem_singleton_iff] at h have := hp.left.left rw [← h] at this exact Or.elim (Nat.lt_or_eq_of_lt this) id (absurd · (Nat.ne_of_lt r).symm) /- > As seen in *Case 1*, `C'` is equinumerous to some `m < n⁺`. -/ have ⟨m, hm₁, hm₂⟩ := h_subset_equinumerous C' hC'₁ /- > It suffices to show there exists a one-to-one correspondence between `C'` and > `C`, since then *Theorem 6A* implies `C` is equinumerous to `m` as well. -/ suffices C' ≈ C from ⟨m, hm₁, Set.equinumerous_trans (Set.equinumerous_symm this) hm₂⟩ /- > Function `f : C' → C` given by > > `f(x) = if x = p then n else x` > > is trivially one-to-one and onto as expected. -/ let f x := if x = p then n else x refine ⟨f, ?_, ?_, ?_⟩ · -- `Set.MapsTo f C' C` intro x hx dsimp only by_cases hxp : x = p · rw [if_pos hxp] exact hn · rw [if_neg hxp] apply Or.elim hx · exact fun x => x.left · intro hx₁ simp only [Set.mem_singleton_iff] at hx₁ exact absurd hx₁ hxp · -- `Set.InjOn f C'` intro x₁ hx₁ x₂ hx₂ hf dsimp only at hf by_cases hx₁p : x₁ = p · by_cases hx₂p : x₂ = p · rw [hx₁p, hx₂p] · rw [if_pos hx₁p, if_neg hx₂p] at hf apply Or.elim hx₂ · intro nx exact absurd hf.symm nx.right · intro nx simp only [Set.mem_singleton_iff] at nx exact absurd nx hx₂p · by_cases hx₂p : x₂ = p · rw [if_neg hx₁p, if_pos hx₂p] at hf apply Or.elim hx₁ · intro nx exact absurd hf nx.right · intro nx simp only [Set.mem_singleton_iff] at nx exact absurd nx hx₁p · rwa [if_neg hx₁p, if_neg hx₂p] at hf · -- `Set.SurjOn f C' C` show ∀ x, x ∈ C → x ∈ f '' C' intro x hx simp only [ Set.union_singleton, Set.mem_diff, Set.mem_singleton_iff, Set.mem_image, Set.mem_insert_iff, exists_eq_or_imp, ite_true ] by_cases nx₁ : x = n · left exact nx₁.symm · right by_cases nx₂ : x = p · have := hp.left.right rw [← nx₂] at this exact absurd hx this · exact ⟨x, ⟨hx, nx₁⟩, by rwa [if_neg]⟩ /- > #### (iii) > By *(i)* and *(ii)*, `S` is an inductive set. By *Theorem 4B*, `S = ω`. > Therefore, for every proper subset `C` of a natural number `n`, there exists > some `m < n` such that `C ≈ n`. -/ /-- ### Corollary 6G Any subset of a finite set is finite. -/ theorem corollary_6g {S S' : Set α} (hS : Set.Finite S) (hS' : S' ⊆ S) : Set.Finite S' := by /- > Let `S` be a finite set and `S' ⊆ S`. -/ rw [subset_iff_ssubset_or_eq, or_comm] at hS' apply Or.elim hS' /- > Clearly, if `S' = S`, then `S'` is finite. -/ · intro h rwa [h] /- > Therefore suppose `S'` is a proper subset of `S`. -/ intro h /- > By definition of a finite set, `S` is equinumerous to some natural number `n`. > Let `f` be a one-to-one correspondence between `S` and `n`. -/ rw [Set.finite_iff_equinumerous_nat] at hS have ⟨n, f, hf⟩ := hS /- > Then `f ↾ S'` is a one-to-one correspondence between `S'` and some proper > subset of `n`. -/ -- Mirrors logic found in `corollary_6c`. let T := S \ S' let R := (Set.Iio n) \ (f '' T) have hR : R ⊂ Set.Iio n := by rw [Set.ssubset_def] apply And.intro · show ∀ x, x ∈ R → x ∈ Set.Iio n intro _ hx exact hx.left · show ¬ ∀ x, x ∈ Set.Iio n → x ∈ R intro nr have ⟨t, ht₁⟩ : Set.Nonempty T := Set.diff_ssubset_nonempty h have ht₂ : f t ∈ Set.Iio n := hf.left ht₁.left have ht₃ : f t ∈ R := nr (f t) ht₂ exact absurd ⟨t, ht₁, rfl⟩ ht₃.right have : Set.BijOn f S' R := by refine ⟨?_, ?_, ?_⟩ · -- `Set.MapsTo f S' R` intro x hx dsimp only simp only [Set.mem_diff, Set.mem_Iio, Set.mem_image, not_exists, not_and] apply And.intro · exact hf.left (subset_of_ssubset h hx) · intro y hy by_contra nf have := hf.right.left (subset_of_ssubset h hx) hy.left nf.symm rw [this] at hx exact absurd hx hy.right · -- `Set.InjOn f S'` intro x₁ hx₁ x₂ hx₂ hf' have h₁ : x₁ ∈ S := subset_of_ssubset h hx₁ have h₂ : x₂ ∈ S := subset_of_ssubset h hx₂ exact hf.right.left h₁ h₂ hf' · -- `Set.SurjOn f S' R` show ∀ x, x ∈ R → x ∈ f '' S' intro x hx have h₁ := hf.right.right unfold Set.SurjOn at h₁ rw [Set.subset_def] at h₁ have ⟨y, hy⟩ := h₁ x hx.left refine ⟨y, ?_, hy.right⟩ rw [← hy.right] at hx simp only [Set.mem_image, Set.mem_diff, not_exists, not_and] at hx by_contra ny exact (hx.right y ⟨hy.left, ny⟩) rfl /- > By *Lemma 6f*, `ran (f ↾ S')` is equinumerous to some `m < n`. -/ have ⟨m, hm⟩ := lemma_6f hR /- > Then *Theorem 6A* indicates `S' ≈ m`. Hence `S'` is a finite set. -/ have := Set.equinumerous_trans ⟨f, this⟩ hm.right exact Set.finite_iff_equinumerous_nat.mpr ⟨m, this⟩ /-- ### Subset Size Let `A` be a finite set and `B ⊂ A`. Then there exist natural numbers `m, n ∈ ω` such that `B ≈ m`, `A ≈ n`, and `m ≤ n`. -/ lemma subset_size [DecidableEq α] [Nonempty α] {A B : Set α} (hBA : B ⊆ A) (hA : Set.Finite A) : ∃ m n : ℕ, B ≈ Set.Iio m ∧ A ≈ Set.Iio n ∧ m ≤ n := by /- > Let `A` be a finite set and `B` be a subset of `A`. By *Corollary 6G*, `B` > must be finite. By definition of a finite set, there exists natural numbers > `m, n ∈ ω` such that `B ≈ m` and `A ≈ n`. -/ have ⟨n, hn⟩ := Set.finite_iff_equinumerous_nat.mp hA have ⟨m, hm⟩ := Set.finite_iff_equinumerous_nat.mp (corollary_6g hA hBA) refine ⟨m, n, hm, hn, ?_⟩ /- > By the *Trichotomy Law for `ω`*, it suffices to prove that `m > n` is not > possible for then either `m < n` or `m = n`. -/ suffices ¬ m > n by match @trichotomous ℕ LT.lt _ m n with | Or.inr (Or.inl hr) => -- m = n rw [hr] | Or.inr (Or.inr hr) => -- m > n exact absurd hr this | Or.inl hr => -- m < n exact Nat.le_of_lt hr /- > For the sake of contradiction, assume `m > n`. By definition of equinumerous, > there exists a one-to-one correspondence between `B` and `m`. *Theorem 6A* > indicates there then exists a one-to-one correspondence `f` between `m` and > `B`. Likewise, there exists a one-to-one correspondence `g` between `A` and > `n`. -/ by_contra nr have ⟨f, hf⟩ := Set.equinumerous_symm hm have ⟨g, hg⟩ := hn /- > Define `h : A → B` as `h(x) = f(g(x))` for all `x ∈ A`. Since `n ⊂ m` by > *Corollary 4M*, `h` is well-defined. By *One-to-One Composition*, `h` must be > one-to-one. thus `h` is a one-to-one correspondence between `A` and `ran h`, > i.e. `A ≈ ran h`. -/ let h x := f (g x) have hh : Set.BijOn h A (h '' A) := by refine ⟨?_, ?_, Eq.subset rfl⟩ · -- `Set.MapsTo h A (ran h)` intro x hx simp only [Set.mem_image] exact ⟨x, hx, rfl⟩ · -- `Set.InjOn h A` refine Set.InjOn.comp hf.right.left hg.right.left ?_ intro x hx exact Nat.lt_trans (hg.left hx) nr /- > But `n < m` meaning `ran h ⊂ B` which in turn is a proper subset of `A` by > hypothesis. *Corollary 6C* states no finite set is equinumerous to a proper > subset of itself, a contradiction. -/ have : h '' A ⊂ A := by rw [Set.ssubset_def] apply And.intro · show ∀ x, x ∈ h '' A → x ∈ A intro x hx have ⟨y, hy₁, hy₂⟩ := hx have h₁ : g y ∈ Set.Iio n := hg.left hy₁ have h₂ : f (g y) ∈ B := hf.left (Nat.lt_trans h₁ nr) have h₃ : x ∈ B := by rwa [← hy₂] exact hBA h₃ · rw [Set.subset_def] simp only [Set.mem_image, not_forall, not_exists, not_and, exists_prop] refine ⟨f n, hBA (hf.left nr), ?_⟩ intro x hx by_contra nh have h₁ : g x < n := hg.left hx have h₂ : g x ∈ Set.Iio m := Nat.lt_trans h₁ nr rw [hf.right.left h₂ nr nh] at h₁ simp at h₁ exact absurd ⟨h, hh⟩ (corollary_6c hA this) /-- ### Finite Domain and Range Size Let `A` and `B` be finite sets and `f : A → B` be a function. Then there exist natural numbers `m, n ∈ ω` such that `dom f ≈ m`, `ran f ≈ n`, and `m ≥ n`. -/ theorem finite_dom_ran_size [Nonempty α] {A B : Set α} (hA : Set.Finite A) (hB : Set.Finite B) (hf : Set.MapsTo f A B) : ∃ m n : ℕ, A ≈ Set.Iio m ∧ f '' A ≈ Set.Iio n ∧ m ≥ n := by /- > Let `A` and `B` be finite sets and `f : A → B` be a function. By definition of > finite sets, there exists natural numbers `m, p ∈ ω` such that `A ≈ m` and > `B ≈ p`. By definition of the domain of a function, `dom f = A`. Thus > `dom f ≈ m`. -/ have ⟨m, hm⟩ := Set.finite_iff_equinumerous_nat.mp hA have ⟨p, hp⟩ := Set.finite_iff_equinumerous_nat.mp hB /- > By *Theorem 6A*, there exists a one-to-one correspondence `g` between `m` and > `dom f = A`. -/ have ⟨g, hg⟩ := Set.equinumerous_symm hm /- > For all `y ∈ ran f`, consider `f⁻¹⟦{y}⟧`. Let > > `A_y = {x ∈ m | f(g(x)) = y}`. > > Since `g` is a one-to-one correspondence, it follows that `A_y ≈ f⁻¹⟦{y}⟧`. -/ let A_y y := { x ∈ Set.Iio m | f (g x) = y } have hA₁ : ∀ y ∈ B, A_y y ≈ f ⁻¹' {y} := by intro y hy dsimp only refine ⟨fun x => g x, ?_, ?_, ?_⟩ · intro x hx simp only [Set.mem_Iio, Set.mem_setOf_eq, Set.mem_preimage, Set.mem_singleton_iff] at hx ⊢ exact hx.right · intro x₁ hx₁ x₂ hx₂ hf exact (hg.right.left hx₁.left hx₂.left hf) · sorry /- > Since `A_y` is a nonempty subset of natural numbers, the > *Well Ordering of `ω`* implies there exists a least element, say `q_y`. -/ have hA₂ : ∀ y ∈ B, Set.Nonempty (A_y y) := by sorry have hA₃ : ∀ y ∈ B, ∃ q : ℕ, ∀ p ∈ A_y y, q ≤ p := by sorry /- > Define `C = {q_y | y ∈ ran f}`. -/ let C := { q | ∃ y ∈ B, ∀ p ∈ A_y y, q ≤ p } /- > Thus `h : C → ran f` given by `h(x) = f(g(x))` is a one-to-on ecorrespondence > between `C` and `ran f` by construction. That is, `C ≈ ran f`. -/ let h x := f (g x) have hh : C ≈ f '' A := by sorry /- > By *Lemma 6F*, there exists some `n ≤ m` such that `C ≈ n`. By *Theorem 6A*, > `n ≈ ran f`. -/ sorry /-- ### Set Difference Size Let `A ≈ m` for some natural number `m` and `B ⊆ A`. Then there exists some `n ∈ ω` such that `B ≈ n` and `A - B ≈ m - n`. -/ lemma sdiff_size_aux [DecidableEq α] [Nonempty α] : ∀ A : Set α, A ≈ Set.Iio m → ∀ B, B ⊆ A → ∃ n : ℕ, n ≤ m ∧ B ≈ Set.Iio n ∧ A \ B ≈ (Set.Iio m) \ (Set.Iio n) := by /- > `Let > > `S = {m ∈ ω | ∀ A ≈ m, ∀ B ⊆ A, ∃ n ∈ ω(n ≤ m ∧ B ≈ n ∧ A - B ≈ m - n) }`. > > We prove that (i) `0 ∈ S` and (ii) if `n ∈ S` then `n⁺ ∈ S`. Afterward we > prove (iii) the lemma statement. -/ induction m with | zero => /- > #### (i) > Let `A ≈ 0` and `B ⊆ A`. Then it follows `A = B = ∅ = 0`. Since `0 ≤ 0`, > `B ≈ 0`, and `A - B = ∅ ≈ 0 = 0 - 0`, it follows `0 ∈ S`. -/ intro A hA B hB refine ⟨0, ?_⟩ simp only [ Nat.zero_eq, sdiff_self, Set.bot_eq_empty, Set.equinumerous_zero_iff_emptyset ] at hA ⊢ have hB' : B = ∅ := Set.subset_eq_empty hB hA have : A \ B = ∅ := by rw [hB'] simp only [Set.diff_empty] exact hA rw [this] refine ⟨trivial, hB', Set.equinumerous_emptyset_emptyset⟩ | succ m ih => /- > #### (ii) > Suppose `m ∈ S` and consider `m⁺`. Let `A ≈ m⁺` and let `B ⊆ A`. By definition > of equinumerous, there exists a one-to-one corerspondnece `f` between `A` and > `m⁺`. -/ intro A ⟨f, hf⟩ B hB /- > Since `f` is one-to-one and onto, there exists a unique value `a ∈ A` such > that `f(a) = m`. -/ have hfa := hf.right.right unfold Set.SurjOn at hfa have ⟨a, ha₁, ha₂⟩ := (Set.subset_def ▸ hfa) m (by simp) /- > Then `B - {a} ⊆A - {a}` and `f` is a one-to-one correspondence between > `A - {a}` and `m`. -/ have hBA : B \ {a} ⊆ A \ {a} := Set.diff_subset_diff_left hB have hfBA : Set.BijOn f (A \ {a}) (Set.Iio m) := by refine ⟨?_, ?_, ?_⟩ · intro x hx have := hf.left hx.left simp only [Set.mem_Iio, gt_iff_lt] at this ⊢ apply Or.elim (Nat.lt_or_eq_of_lt this) · simp · intro h rw [← ha₂] at h exact absurd (hf.right.left hx.left ha₁ h) hx.right · intro x₁ hx₁ x₂ hx₂ h exact hf.right.left hx₁.left hx₂.left h · have := hf.right.right unfold Set.SurjOn Set.image at this ⊢ rw [Set.subset_def] at this ⊢ simp only [ Set.mem_Iio, Set.mem_diff, Set.mem_singleton_iff, Set.mem_setOf_eq ] at this ⊢ intro x hx have ⟨b, hb⟩ := this x (Nat.lt.step hx) refine ⟨b, ⟨hb.left, ?_⟩, hb.right⟩ by_contra nb rw [← nb, hb.right] at ha₂ exact absurd ha₂ (Nat.ne_of_lt hx) /- > By *(IH)*, there exists some `n ∈ ω` such that `n ≤ m`, `B - {a} ≈ n` and > > `(A - {a}) - (B - {a}) ≈ m - n`. (6.4) > > There are two cases to consider: -/ -- `(A - {a}) - (B - {a}) ≈ m - n` have ⟨n, hn₁, hn₂, hn₃⟩ := ih (A \ {a}) ⟨f, hfBA⟩ (B \ {a}) hBA by_cases hc : a ∈ B · refine ⟨n.succ, ?_, ?_, ?_⟩ /- > ##### Case 1 > Assume `a ∈ B`. Then `B ≈ n⁺`. -/ · exact Nat.succ_le_succ hn₁ · -- `B ≈ Set.Iio n.succ` have ⟨g, hg⟩ := hn₂ let g' x := if x = a then n else g x refine ⟨g', ⟨?_, ?_, ?_⟩⟩ · -- `Set.MapsTo g' B (Set.Iio n.succ)` intro x hx dsimp only by_cases hx' : x = a · rw [if_pos hx'] simp · rw [if_neg hx'] calc g x _ < n := hg.left ⟨hx, hx'⟩ _ < n + 1 := by simp · -- `Set.InjOn g' B` intro x₁ hx₁ x₂ hx₂ h dsimp only at h by_cases hc₁ : x₁ = a <;> by_cases hc₂ : x₂ = a · rw [hc₁, hc₂] · rw [if_pos hc₁, if_neg hc₂] at h exact absurd h.symm (Nat.ne_of_lt $ hg.left ⟨hx₂, hc₂⟩) · rw [if_neg hc₁, if_pos hc₂] at h exact absurd h (Nat.ne_of_lt $ hg.left ⟨hx₁, hc₁⟩) · rw [if_neg hc₁, if_neg hc₂] at h exact hg.right.left ⟨hx₁, hc₁⟩ ⟨hx₂, hc₂⟩ h · -- `Set.SurjOn g' B (Set.Iio n.succ)` have := hg.right.right unfold Set.SurjOn Set.image at this ⊢ rw [Set.subset_def] at this ⊢ simp only [Set.mem_Iio, Set.mem_setOf_eq] at this ⊢ intro x hx by_cases hc₁ : x = n · refine ⟨a, hc, ?_⟩ simp only [ite_true] exact hc₁.symm · apply Or.elim (Nat.lt_or_eq_of_lt hx) · intro hx₁ have ⟨b, ⟨hb₁, hb₂⟩, hb₃⟩ := this x hx₁ refine ⟨b, hb₁, ?_⟩ simp only [Set.mem_singleton_iff] at hb₂ rwa [if_neg hb₂] · intro hx₁ exact absurd hx₁ hc₁ /- > Furthermore, by definition of the set difference, > > `...` -/ · have hA₁ : (A \ {a}) \ (B \ {a}) = (A \ B) \ {a} := Set.diff_mem_diff_mem_eq_diff_diff_mem /- > Since `a ∈ A` and `a ∈ B`, `(A - B) - {a} = A - B`. -/ have hA₂ : (A \ B) \ {a} = A \ B := by refine Set.not_mem_diff_eq_self ?_ by_contra na exact absurd hc na.right /- > Thus > > `(A - {a} - (B - {a})) = (A - B) - {a}` > ` = A - B` > ` ≈ m - n` *(6.4)* > ` ≈ m⁺ - n⁺` -/ rw [hA₁, hA₂] at hn₃ exact Set.equinumerous_trans hn₃ (Set.equinumerous_symm Set.succ_diff_succ_equinumerous_diff) /- > ##### Case 2 > Assume `a ∉ B`. Then `B - {a} = B` (i.e. `B ≈ n`) and > > `(A - {a}) - (B - {a}) = (A - {a}) - B` > ` ≈ m - n`. *(6.4) -/ · have hB : B \ {a} = B := Set.not_mem_diff_eq_self hc refine ⟨n, ?_, ?_, ?_⟩ · calc n _ ≤ m := hn₁ _ ≤ m + 1 := by simp · rwa [← hB] /- > The above implies that there exists a one-to-one correspondence `g` between > `(A - {a}) - B` and `m - n`. Therefore `g ∪ {⟨a, m⟩}` is a one-to-one > correspondence between `A - B` and `(m - n) ∪ {m}`. -/ · rw [hB] at hn₃ have ⟨g, hg⟩ := hn₃ have hAB : A \ B ≈ (Set.Iio m) \ (Set.Iio n) ∪ {m} := by refine ⟨fun x => if x = a then m else g x, ?_, ?_, ?_⟩ · intro x hx dsimp only by_cases hc₁ : x = a · rw [if_pos hc₁] simp · rw [if_neg hc₁] have := hg.left ⟨⟨hx.left, hc₁⟩, hx.right⟩ simp only [ Set.Iio_diff_Iio, gt_iff_lt, not_lt, ge_iff_le, Set.union_singleton, Set.mem_Ico, lt_self_iff_false, and_false, Set.mem_insert_iff ] at this ⊢ right exact this · intro x₁ hx₁ x₂ hx₂ h dsimp only at h by_cases hc₁ : x₁ = a <;> by_cases hc₂ : x₂ = a · rw [hc₁, hc₂] · rw [if_pos hc₁, if_neg hc₂] at h have := hg.left ⟨⟨hx₂.left, hc₂⟩, hx₂.right⟩ simp at this exact absurd h.symm (Nat.ne_of_lt this.right) · rw [if_neg hc₁, if_pos hc₂] at h have := hg.left ⟨⟨hx₁.left, hc₁⟩, hx₁.right⟩ simp only [Set.Iio_diff_Iio, gt_iff_lt, not_lt, ge_iff_le, Set.mem_Ico] at this exact absurd h (Nat.ne_of_lt this.right) · rw [if_neg hc₁, if_neg hc₂] at h exact hg.right.left ⟨⟨hx₁.left, hc₁⟩, hx₁.right⟩ ⟨⟨hx₂.left, hc₂⟩, hx₂.right⟩ h · have := hg.right.right unfold Set.SurjOn Set.image at this ⊢ rw [Set.subset_def] at this ⊢ simp at this ⊢ refine ⟨⟨a, ⟨ha₁, hc⟩, ?_⟩, ?_⟩ · intro ha simp at ha · intro x hx₁ hx₂ have ⟨y, hy₁, hy₂⟩ := this x hx₁ hx₂ refine ⟨y, ?_, ?_⟩ · exact ⟨hy₁.left.left, hy₁.right⟩ · rwa [if_neg hy₁.left.right] /- > Hence > > `A - B ≈ (m - n) ∪ {m} ≈ m⁺ - n`. -/ exact Set.equinumerous_trans hAB (Set.diff_union_equinumerous_succ_diff hn₁) /- > ##### Subconclusion > The above two cases are exhaustive and both conclude the existence of some > `n ∈ ω` such that `n ≤ m⁺`, `B ≈ n`, and `A - B ≈ m⁺ - n`. Hence `m⁺ ∈ S`. > > #### (iii) > By *(i)* and *(ii)*, `S ⊆ ω` is an inductive set. Thus *Theorem 4B* implies > `S = ω`. Hence, for all `A ≈ m` for some `m ∈ ω`, if `B ⊆ A`, then there > exists some `n ∈ ω` such that `n ≤ m`, `B ≈ n`, and `A - B ≈ m - n`. -/ lemma sdiff_size [DecidableEq α] [Nonempty α] {A B : Set α} (hB : B ⊆ A) (hA : A ≈ Set.Iio m) : ∃ n : ℕ, n ≤ m ∧ B ≈ Set.Iio n ∧ A \ B ≈ (Set.Iio m) \ (Set.Iio n) := sdiff_size_aux A hA B hB /-- ### Exercise 6.7 Assume that `A` is finite and `f : A → A`. Show that `f` is one-to-one **iff** `ran f = A`. -/ theorem exercise_6_7 [DecidableEq α] [Nonempty α] {A : Set α} {f : α → α} (hA₁ : Set.Finite A) (hA₂ : Set.MapsTo f A A) : Set.InjOn f A ↔ f '' A = A := by apply Iff.intro · intro hf have hf₂ : A ≈ f '' A := by refine ⟨f, ?_, hf, ?_⟩ · -- `Set.MapsTo f A (f '' A)` intro x hx simp only [Set.mem_image] exact ⟨x, hx, rfl⟩ · -- `Set.SurjOn f A (f '' A)` intro _ hx exact hx have hf₃ : f '' A ⊆ A := by show ∀ x, x ∈ f '' A → x ∈ A intro x ⟨a, ha₁, ha₂⟩ rw [← ha₂] exact hA₂ ha₁ rw [subset_iff_ssubset_or_eq] at hf₃ exact Or.elim hf₃ (fun h => absurd hf₂ (corollary_6c hA₁ h)) id · intro hf₁ by_cases hA₃ : A = ∅ · rw [hA₃] simp · intro x₁ hx₁ x₂ hx₂ hf₂ let y := f x₁ let B := f ⁻¹' {y} have hB₁ : x₁ ∈ B := sorry have hB₂ : x₂ ∈ B := sorry have hB₃ : B ⊆ A := sorry have ⟨m₁, n₁, hm₁, hn₁, hmn₁⟩ := subset_size hB₃ hA₁ have hf'₁ : Set.MapsTo f (A \ B) (A \ {y}) := sorry have hf'₂ : f '' (A \ B) = A \ {y} := sorry have hf'₃ : Set.Finite (A \ B) := sorry have hf'₄ : Set.Finite (A \ {y}) := sorry have ⟨m₂, n₂, hm₂, hn₂, hmn₂⟩ := finite_dom_ran_size hf'₃ hf'₄ hf'₁ have h₁ : A \ B ≈ Set.Iio (n₁ - m₁) := sorry have h₂ : A \ {y} ≈ Set.Iio (n₁ - 1) := sorry sorry /-- ### Exercise 6.8 Prove that the union of two finites sets is finite, without any use of arithmetic. -/ theorem exercise_6_8 {A B : Set α} (hA : Set.Finite A) (hB : Set.Finite B) : Set.Finite (A ∪ B) := by sorry /-- ### Exercise 6.9 Prove that the Cartesian product of two finites sets is finite, without any use of arithmetic. -/ theorem exercise_6_9 {A : Set α} {B : Set β} (hA : Set.Finite A) (hB : Set.Finite B) : Set.Finite (Set.prod A B) := by sorry end Enderton.Set.Chapter_6