Аналіз I, Розділ 8.4: Аксіома вибору

Я (прим. перекл. Терренс Тао) намагався зробити переклад якомога точнішим перефразуванням оригінального тексту. Коли є вибір між більш ідіоматичним підходом Lean та більш точним перекладом, я зазвичай обирав останній. Зокрема, будуть місця, де код Lean можна було б "підправити", щоб зробити його більш елегантним та ідіоматичним, але я свідомо уникав цього вибору.

Основні конструкції та результати цього розділу:

Оскільки розділ 3, присвячений теорії множин, у багатьох місцях вже не використовується, ми не будемо вставляти аксіому вибору безпосередньо в цю теорію у цьому тексті; проте це можна зробити за бажання (наприклад, розширивши клас Unknown identifier `Chapter3.SetTheory`Chapter3.SetTheory до Unknown identifier `Chapter3.SetTheoryWithChoice`Chapter3.SetTheoryWithChoice), і студентам можна запропонувати зробити це окремо. Натомість ми використовуватимемо вбудовану в Mathlib аксіому Classical.choice.{u} {α : Sort u} : Nonempty α → αClassical.choice. Технічно ця аксіома вже досить часто використовувалась у тексті, оскільки Mathlib використовує Classical.choice.{u} {α : Sort u} : Nonempty α → αClassical.choice для виведення багатьох слабших тверджень, наприклад закону виключеного третього. Тож розмежування, зроблене в оригінальному тексті щодо того, чи використовує конкретне твердження аксіому вибору, у цій формалізації дещо розмито. Теоретично можна відновити це розмежування, прибравши залежність від Mathlib і працюючи з власними структурами типу Unknown identifier `Chapter3.SetTheory`Chapter3.SetTheory і Unknown identifier `Chapter3.SetTheoryWithChoice`Chapter3.SetTheoryWithChoice, але це було б дуже трудомістким і тут не розглядається.

namespace Chapter8

Визначення 8.4.1 (Нескінченні декартові добутки). Ми уникатимемо використання цієї дефініції на користь форми Mathlib ?m.1 → sorry : Sort (imax ?u.374702 u_1)∀ α, Unknown identifier `X`X α, яка, як незабаром покажемо є еквівалентною (або, точніше, такою, що узагальнює) цю.

Оскільки Lean не дозволяє необмежених об'єднань типів, ми дещо обходимо це, припускаючи, що всі Unknown identifier `X`X α є підмножинами в спільній універсі Unknown identifier `U`U. Зауважте, що визначення в Mathlib не має цього обмеження.

abbrev CartesianProduct {I U: Type} (X : I → Set U) := { x : I → ⋃ α, X α // ∀ α, ↑(x α) ∈ X α }

Еквівалентність з добутком у Mathlib

def CartesianProduct.equiv {I U: Type} (X : I → Set U) : CartesianProduct X ≃ ∀ α, X α := { toFun x α := ⟨ x.val α, I:TypeU:TypeX:I → Set Ux:CartesianProduct Xα:I⊢ ↑(↑x α) ∈ X α All goals completed! 🐙 ⟩ invFun x := ⟨ fun α ↦ ⟨ x α, I:TypeU:TypeX:I → Set Ux:(α : I) → ↑(X α)α:I⊢ ↑(x α) ∈ ⋃ α, X α I:TypeU:TypeX:I → Set Ux:(α : I) → ↑(X α)α:I⊢ ∃ i, ↑(x α) ∈ X i; I:TypeU:TypeX:I → Set Ux:(α : I) → ↑(X α)α:I⊢ ↑(x α) ∈ X α; All goals completed! 🐙 ⟩, I:TypeU:TypeX:I → Set Ux:(α : I) → ↑(X α)⊢ ∀ (α : I), ↑((fun α => ⟨↑(x α), ⋯⟩) α) ∈ X α All goals completed! 🐙 ⟩ left_inv x := I:TypeU:TypeX:I → Set Ux:CartesianProduct X⊢ (fun x => ⟨fun α => ⟨↑(x α), ⋯⟩, ⋯⟩) ((fun x α => ⟨↑(↑x α), ⋯⟩) x) = x All goals completed! 🐙 right_inv x := I:TypeU:TypeX:I → Set Ux:(α : I) → ↑(X α)⊢ (fun x α => ⟨↑(↑x α), ⋯⟩) ((fun x => ⟨fun α => ⟨↑(x α), ⋯⟩, ⋯⟩) x) = x All goals completed! 🐙 }

Приклад 8.4.2.

def Function.equiv {I X:Type} : (∀ _:I, X) ≃ (I → X) := { toFun f := f invFun f := f left_inv unused variable `f` Note: This linter can be disabled with `set_option linter.unusedVariables false`f := rfl right_inv unused variable `f` Note: This linter can be disabled with `set_option linter.unusedVariables false`f := rfl }
def product_zero_equiv {X: Fin 0 → Type} : (∀ i:Fin 0, X i) ≃ PUnit := { toFun f := PUnit.unit invFun x i := nomatch i left_inv f := X:Fin 0 → Typef:(i : Fin 0) → X i⊢ (fun x i => nomatch i) ((fun f => PUnit.unit) f) = f All goals completed! 🐙 right_inv f := rfl }def product_one_equiv {X: Fin 1 → Type} : (∀ i:Fin 1, X i) ≃ X 0 := { toFun f := f 0 invFun x i := X:Fin 1 → Typex:X 0i:Fin 1⊢ X i rwa [←Fin.fin_one_eq_zero iX:Fin 1 → Typei:Fin 1x:X i⊢ X i at x left_inv f := X:Fin 1 → Typef:(i : Fin 1) → X i⊢ (fun x i => ⋯.mp x) ((fun f => f 0) f) = f X:Fin 1 → Typef:(i : Fin 1) → X ii:Fin 1⊢ (fun x i => ⋯.mp x) ((fun f => f 0) f) i = f i; X:Fin 1 → Typef:(i : Fin 1) → X ii:Fin 1⊢ (fun x i => ⋯.mp x) ((fun f => f 0) f) 0 = f 0; All goals completed! 🐙 right_inv f := rfl }def product_two_equiv {X: Fin 2 → Type} : (∀ i:Fin 2, X i) ≃ (X 0 × X 1) := { toFun f := (f 0, f 1) invFun f i := match i with | 0 => f.1 | 1 => f.2 left_inv f := X:Fin 2 → Typef:(i : Fin 2) → X i⊢ (fun f i => match i with | 0 => f.1 | 1 => f.2) ((fun f => (f 0, f 1)) f) = f All goals completed! 🐙 right_inv f := rfl }def product_three_equiv {X: Fin 3 → Type} : (∀ i:Fin 3, X i) ≃ (X 0 × X 1 × X 2) := { toFun f := (f 0, f 1, f 2) invFun f i := match i with | 0 => f.1 | 1 => f.2.1 | 2 => f.2.2 left_inv f := X:Fin 3 → Typef:(i : Fin 3) → X i⊢ (fun f i => match i with | 0 => f.1 | 1 => f.2.1 | 2 => f.2.2) ((fun f => (f 0, f 1, f 2)) f) = f All goals completed! 🐙 right_inv f := rfl }

Аксіома 8.1 (Аксіома вибору)

theorem axiom_of_choice {I: Type} {X: I → Type} (h : ∀ i, Nonempty (X i)) : Nonempty (∀ i, X i) := I:TypeX:I → Typeh:∀ (i : I), Nonempty (X i)⊢ Nonempty ((i : I) → X i) All goals completed! 🐙
theorem axiom_of_countable_choice {I: Type} {X: I → Type} [Countable I] (h : ∀ i, Nonempty (X i)) : Nonempty (∀ i, X i) := axiom_of_choice h

Лема 8.4.5

theorem exist_tendsTo_sup {E: Set ℝ} (hnon: E.Nonempty) (hbound: BddAbove E) : ∃ a : ℕ → ℝ, (∀ n, a n ∈ E) ∧ Filter.atTop.Tendsto a (nhds (sSup E)) := E:Set ℝhnon:E.Nonemptyhbound:BddAbove E⊢ ∃ a, (∀ (n : ℕ), a n ∈ E) ∧ Filter.Tendsto a Filter.atTop (nhds (sSup E)) -- Доведення написане так, щоб відповідати структурі оригінального тексту. E:Set ℝhnon:E.Nonemptyhbound:BddAbove EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.12371 ∧ sSup _fvar.12371 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.12371}⊢ ∃ a, (∀ (n : ℕ), a n ∈ E) ∧ Filter.Tendsto a Filter.atTop (nhds (sSup E)) have hX : ∀ n, Nonempty (X n) := E:Set ℝhnon:E.Nonemptyhbound:BddAbove E⊢ ∃ a, (∀ (n : ℕ), a n ∈ E) ∧ Filter.Tendsto a Filter.atTop (nhds (sSup E)) E:Set ℝhnon:E.Nonemptyhbound:BddAbove EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.12371 ∧ sSup _fvar.12371 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.12371}n:ℕ⊢ Nonempty ↑(X n) have : 1 / (n+1:ℝ) > 0 := E:Set ℝhnon:E.Nonemptyhbound:BddAbove E⊢ ∃ a, (∀ (n : ℕ), a n ∈ E) ∧ Filter.Tendsto a Filter.atTop (nhds (sSup E)) All goals completed! 🐙 choose s hs using (lt_csSup_iff hbound hnon).mp (show sSup E - 1 / (n+1:ℝ) < sSup E E:Set ℝhnon:E.Nonemptyhbound:BddAbove E⊢ ∃ a, (∀ (n : ℕ), a n ∈ E) ∧ Filter.Tendsto a Filter.atTop (nhds (sSup E)) All goals completed! 🐙) E:Set ℝhnon:E.Nonemptyhbound:BddAbove EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.12371 ∧ sSup _fvar.12371 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.12371}n:ℕthis:1 / (↑_fvar.13050 + 1) > 0 := ?_mvar.13284s:ℝhs:s ∈ E ∧ sSup E - 1 / (↑n + 1) < s⊢ s ∈ X n; E:Set ℝhnon:E.Nonemptyhbound:BddAbove EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.12371 ∧ sSup _fvar.12371 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.12371}n:ℕs:ℝthis:0 < ↑n + 1hs:s ∈ E ∧ sSup E - (↑n + 1)⁻¹ < s⊢ sSup E ≤ s + (↑n + 1)⁻¹ ∧ s ≤ sSup E refine ⟨ E:Set ℝhnon:E.Nonemptyhbound:BddAbove EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.12371 ∧ sSup _fvar.12371 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.12371}n:ℕs:ℝthis:0 < ↑n + 1hs:s ∈ E ∧ sSup E - (↑n + 1)⁻¹ < s⊢ sSup E ≤ s + (↑n + 1)⁻¹ All goals completed! 🐙, ConditionallyCompleteLattice.le_csSup _ _ hbound hs.1 ⟩ E:Set ℝhnon:E.Nonemptyhbound:BddAbove EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.12371 ∧ sSup _fvar.12371 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.12371}hX:∀ (n : ℕ), Nonempty ↑(@_fvar.12743 n) := ?_mvar.13045a:(i : ℕ) → ↑(X i)⊢ ∃ a, (∀ (n : ℕ), a n ∈ E) ∧ Filter.Tendsto a Filter.atTop (nhds (sSup E)) E:Set ℝhnon:E.Nonemptyhbound:BddAbove EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.12371 ∧ sSup _fvar.12371 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.12371}hX:∀ (n : ℕ), Nonempty ↑(@_fvar.12743 n) := ?_mvar.13045a:(i : ℕ) → ↑(X i)⊢ (∀ (n : ℕ), (fun n => ↑(a n)) n ∈ E) ∧ Filter.Tendsto (fun n => ↑(a n)) Filter.atTop (nhds (sSup E)); E:Set ℝhnon:E.Nonemptyhbound:BddAbove EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.12371 ∧ sSup _fvar.12371 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.12371}hX:∀ (n : ℕ), Nonempty ↑(@_fvar.12743 n) := ?_mvar.13045a:(i : ℕ) → ↑(X i)⊢ ∀ (n : ℕ), ↑(a n) ∈ EE:Set ℝhnon:E.Nonemptyhbound:BddAbove EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.12371 ∧ sSup _fvar.12371 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.12371}hX:∀ (n : ℕ), Nonempty ↑(@_fvar.12743 n) := ?_mvar.13045a:(i : ℕ) → ↑(X i)⊢ Filter.Tendsto (fun n => ↑(a n)) Filter.atTop (nhds (sSup E)); E:Set ℝhnon:E.Nonemptyhbound:BddAbove EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.12371 ∧ sSup _fvar.12371 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.12371}hX:∀ (n : ℕ), Nonempty ↑(@_fvar.12743 n) := ?_mvar.13045a:(i : ℕ) → ↑(X i)⊢ Filter.Tendsto (fun n => ↑(a n)) Filter.atTop (nhds (sSup E))E:Set ℝhnon:E.Nonemptyhbound:BddAbove EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.12371 ∧ sSup _fvar.12371 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.12371}hX:∀ (n : ℕ), Nonempty ↑(@_fvar.12743 n) := ?_mvar.13045a:(i : ℕ) → ↑(X i)⊢ ∀ (n : ℕ), ↑(a n) ∈ E E:Set ℝhnon:E.Nonemptyhbound:BddAbove EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.12371 ∧ sSup _fvar.12371 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.12371}hX:∀ (n : ℕ), Nonempty ↑(@_fvar.12743 n) := ?_mvar.13045a:(i : ℕ) → ↑(X i)⊢ Filter.Tendsto (fun n => sSup E - 1 / (↑n + 1)) Filter.atTop (nhds (sSup E))E:Set ℝhnon:E.Nonemptyhbound:BddAbove EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.12371 ∧ sSup _fvar.12371 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.12371}hX:∀ (n : ℕ), Nonempty ↑(@_fvar.12743 n) := ?_mvar.13045a:(i : ℕ) → ↑(X i)⊢ Filter.Tendsto (fun x => sSup E) Filter.atTop (nhds (sSup E))E:Set ℝhnon:E.Nonemptyhbound:BddAbove EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.12371 ∧ sSup _fvar.12371 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.12371}hX:∀ (n : ℕ), Nonempty ↑(@_fvar.12743 n) := ?_mvar.13045a:(i : ℕ) → ↑(X i)⊢ (fun n => sSup E - 1 / (↑n + 1)) ≤ fun n => ↑(a n)E:Set ℝhnon:E.Nonemptyhbound:BddAbove EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.12371 ∧ sSup _fvar.12371 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.12371}hX:∀ (n : ℕ), Nonempty ↑(@_fvar.12743 n) := ?_mvar.13045a:(i : ℕ) → ↑(X i)⊢ (fun n => ↑(a n)) ≤ fun x => sSup EE:Set ℝhnon:E.Nonemptyhbound:BddAbove EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.12371 ∧ sSup _fvar.12371 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.12371}hX:∀ (n : ℕ), Nonempty ↑(@_fvar.12743 n) := ?_mvar.13045a:(i : ℕ) → ↑(X i)⊢ ∀ (n : ℕ), ↑(a n) ∈ E E:Set ℝhnon:E.Nonemptyhbound:BddAbove EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.12371 ∧ sSup _fvar.12371 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.12371}hX:∀ (n : ℕ), Nonempty ↑(@_fvar.12743 n) := ?_mvar.13045a:(i : ℕ) → ↑(X i)⊢ Filter.Tendsto (fun n => sSup E - 1 / (↑n + 1)) Filter.atTop (nhds (sSup E)) E:Set ℝhnon:E.Nonemptyhbound:BddAbove EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.12371 ∧ sSup _fvar.12371 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.12371}hX:∀ (n : ℕ), Nonempty ↑(@_fvar.12743 n) := ?_mvar.13045a:(i : ℕ) → ↑(X i)⊢ sSup E = sSup E - 0E:Set ℝhnon:E.Nonemptyhbound:BddAbove EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.12371 ∧ sSup _fvar.12371 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.12371}hX:∀ (n : ℕ), Nonempty ↑(@_fvar.12743 n) := ?_mvar.13045a:(i : ℕ) → ↑(X i)⊢ Filter.Tendsto (fun n => 1 / (↑n + 1)) Filter.atTop (nhds 0); E:Set ℝhnon:E.Nonemptyhbound:BddAbove EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.12371 ∧ sSup _fvar.12371 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.12371}hX:∀ (n : ℕ), Nonempty ↑(@_fvar.12743 n) := ?_mvar.13045a:(i : ℕ) → ↑(X i)⊢ Filter.Tendsto (fun n => 1 / (↑n + 1)) Filter.atTop (nhds 0) All goals completed! 🐙 E:Set ℝhnon:E.Nonemptyhbound:BddAbove EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.12371 ∧ sSup _fvar.12371 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.12371}hX:∀ (n : ℕ), Nonempty ↑(@_fvar.12743 n) := ?_mvar.13045a:(i : ℕ) → ↑(X i)⊢ Filter.Tendsto (fun x => sSup E) Filter.atTop (nhds (sSup E)) All goals completed! 🐙 all_goals E:Set ℝhnon:E.Nonemptyhbound:BddAbove EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.12371 ∧ sSup _fvar.12371 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.12371}hX:∀ (n : ℕ), Nonempty ↑(@_fvar.12743 n) := ?_mvar.13045a:(i : ℕ) → ↑(X i)n:ℕ⊢ ↑(a n) ∈ E; E:Set ℝhnon:E.Nonemptyhbound:BddAbove EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.12371 ∧ sSup _fvar.12371 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.12371}hX:∀ (n : ℕ), Nonempty ↑(@_fvar.12743 n) := ?_mvar.13045a:(i : ℕ) → ↑(X i)n:ℕthis:?_mvar.107430 := failed to pretty print expression (use 'set_option pp.rawOnError true' for raw representation)⊢ ↑(a n) ∈ E; All goals completed! 🐙

Зауваження 8.4.6. Цей спеціальний випадок Леми 8.4.5 обходиться без (рахункової) аксіоми вибору.

theorem exist_tendsTo_sup_of_closed {E: Set ℝ} (hnon: E.Nonempty) (hbound: BddAbove E) (hclosed: IsClosed E) : ∃ a : ℕ → ℝ, (∀ n, a n ∈ E) ∧ Filter.atTop.Tendsto a (nhds (sSup E)) := E:Set ℝhnon:E.Nonemptyhbound:BddAbove Ehclosed:IsClosed E⊢ ∃ a, (∀ (n : ℕ), a n ∈ E) ∧ Filter.Tendsto a Filter.atTop (nhds (sSup E)) E:Set ℝhnon:E.Nonemptyhbound:BddAbove Ehclosed:IsClosed EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.139221 ∧ sSup _fvar.139221 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.139221}⊢ ∃ a, (∀ (n : ℕ), a n ∈ E) ∧ Filter.Tendsto a Filter.atTop (nhds (sSup E)) have hX : ∀ n, Nonempty (X n) := E:Set ℝhnon:E.Nonemptyhbound:BddAbove Ehclosed:IsClosed E⊢ ∃ a, (∀ (n : ℕ), a n ∈ E) ∧ Filter.Tendsto a Filter.atTop (nhds (sSup E)) E:Set ℝhnon:E.Nonemptyhbound:BddAbove Ehclosed:IsClosed EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.139221 ∧ sSup _fvar.139221 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.139221}n:ℕ⊢ Nonempty ↑(X n) have : 1 / (n+1:ℝ) > 0 := E:Set ℝhnon:E.Nonemptyhbound:BddAbove Ehclosed:IsClosed E⊢ ∃ a, (∀ (n : ℕ), a n ∈ E) ∧ Filter.Tendsto a Filter.atTop (nhds (sSup E)) All goals completed! 🐙 choose s hs using (lt_csSup_iff hbound hnon).mp (show sSup E - 1 / (n+1:ℝ) < sSup E E:Set ℝhnon:E.Nonemptyhbound:BddAbove Ehclosed:IsClosed E⊢ ∃ a, (∀ (n : ℕ), a n ∈ E) ∧ Filter.Tendsto a Filter.atTop (nhds (sSup E)) All goals completed! 🐙) E:Set ℝhnon:E.Nonemptyhbound:BddAbove Ehclosed:IsClosed EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.139221 ∧ sSup _fvar.139221 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.139221}n:ℕthis:1 / (↑_fvar.139913 + 1) > 0 := ?_mvar.140147s:ℝhs:s ∈ E ∧ sSup E - 1 / (↑n + 1) < s⊢ s ∈ X n; E:Set ℝhnon:E.Nonemptyhbound:BddAbove Ehclosed:IsClosed EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.139221 ∧ sSup _fvar.139221 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.139221}n:ℕs:ℝthis:0 < ↑n + 1hs:s ∈ E ∧ sSup E - (↑n + 1)⁻¹ < s⊢ sSup E ≤ s + (↑n + 1)⁻¹ ∧ s ≤ sSup E refine ⟨ E:Set ℝhnon:E.Nonemptyhbound:BddAbove Ehclosed:IsClosed EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.139221 ∧ sSup _fvar.139221 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.139221}n:ℕs:ℝthis:0 < ↑n + 1hs:s ∈ E ∧ sSup E - (↑n + 1)⁻¹ < s⊢ sSup E ≤ s + (↑n + 1)⁻¹ All goals completed! 🐙, ConditionallyCompleteLattice.le_csSup _ _ hbound hs.1 ⟩ E:Set ℝhnon:E.Nonemptyhbound:BddAbove Ehclosed:IsClosed EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.139221 ∧ sSup _fvar.139221 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.139221}hX:∀ (n : ℕ), Nonempty ↑(@_fvar.139594 n) := ?_mvar.139908a:ℕ → ℝ := fun n => sInf (@_fvar.139594 n)⊢ ∃ a, (∀ (n : ℕ), a n ∈ E) ∧ Filter.Tendsto a Filter.atTop (nhds (sSup E)) have ha (n:ℕ) : a n ∈ X n := E:Set ℝhnon:E.Nonemptyhbound:BddAbove Ehclosed:IsClosed E⊢ ∃ a, (∀ (n : ℕ), a n ∈ E) ∧ Filter.Tendsto a Filter.atTop (nhds (sSup E)) E:Set ℝhnon:E.Nonemptyhbound:BddAbove Ehclosed:IsClosed EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.139221 ∧ sSup _fvar.139221 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.139221}hX:∀ (n : ℕ), Nonempty ↑(@_fvar.139594 n) := ?_mvar.139908a:ℕ → ℝ := fun n => sInf (@_fvar.139594 n)n:ℕ⊢ BddBelow (X n)E:Set ℝhnon:E.Nonemptyhbound:BddAbove Ehclosed:IsClosed EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.139221 ∧ sSup _fvar.139221 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.139221}hX:∀ (n : ℕ), Nonempty ↑(@_fvar.139594 n) := ?_mvar.139908a:ℕ → ℝ := fun n => sInf (@_fvar.139594 n)n:ℕ⊢ IsClosed (X n) E:Set ℝhnon:E.Nonemptyhbound:BddAbove Ehclosed:IsClosed EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.139221 ∧ sSup _fvar.139221 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.139221}hX:∀ (n : ℕ), Nonempty ↑(@_fvar.139594 n) := ?_mvar.139908a:ℕ → ℝ := fun n => sInf (@_fvar.139594 n)n:ℕ⊢ BddBelow (X n) E:Set ℝhnon:E.Nonemptyhbound:BddAbove Ehclosed:IsClosed EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.139221 ∧ sSup _fvar.139221 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.139221}hX:∀ (n : ℕ), Nonempty ↑(@_fvar.139594 n) := ?_mvar.139908a:ℕ → ℝ := fun n => sInf (@_fvar.139594 n)n:ℕ⊢ ∃ x, ∀ y ∈ X n, x ≤ y; E:Set ℝhnon:E.Nonemptyhbound:BddAbove Ehclosed:IsClosed EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.139221 ∧ sSup _fvar.139221 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.139221}hX:∀ (n : ℕ), Nonempty ↑(@_fvar.139594 n) := ?_mvar.139908a:ℕ → ℝ := fun n => sInf (@_fvar.139594 n)n:ℕ⊢ ∀ y ∈ X n, sSup E - 1 / (↑n + 1) ≤ y; All goals completed! 🐙 E:Set ℝhnon:E.Nonemptyhbound:BddAbove Ehclosed:IsClosed EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.139221 ∧ sSup _fvar.139221 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.139221}hX:∀ (n : ℕ), Nonempty ↑(@_fvar.139594 n) := ?_mvar.139908a:ℕ → ℝ := fun n => sInf (@_fvar.139594 n)n:ℕ⊢ IsClosed (X n) E:Set ℝhnon:E.Nonemptyhbound:BddAbove Ehclosed:IsClosed EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.139221 ∧ sSup _fvar.139221 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.139221}hX:∀ (n : ℕ), Nonempty ↑(@_fvar.139594 n) := ?_mvar.139908a:ℕ → ℝ := fun n => sInf (@_fvar.139594 n)n:ℕ⊢ IsClosed (E ∩ Set.Icc (sSup E - 1 / (↑n + 1)) (sSup E)) All goals completed! 🐙 E:Set ℝhnon:E.Nonemptyhbound:BddAbove Ehclosed:IsClosed EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.139221 ∧ sSup _fvar.139221 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.139221}hX:∀ (n : ℕ), Nonempty ↑(@_fvar.139594 n) := ?_mvar.139908a:ℕ → ℝ := fun n => sInf (@_fvar.139594 n)ha:∀ (n : ℕ), @_fvar.168330 n ∈ @_fvar.139594 n := fun n => @?_mvar.168504 n⊢ (∀ (n : ℕ), a n ∈ E) ∧ Filter.Tendsto a Filter.atTop (nhds (sSup E)); E:Set ℝhnon:E.Nonemptyhbound:BddAbove Ehclosed:IsClosed EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.139221 ∧ sSup _fvar.139221 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.139221}hX:∀ (n : ℕ), Nonempty ↑(@_fvar.139594 n) := ?_mvar.139908a:ℕ → ℝ := fun n => sInf (@_fvar.139594 n)ha:∀ (n : ℕ), @_fvar.168330 n ∈ @_fvar.139594 n := fun n => @?_mvar.168504 n⊢ ∀ (n : ℕ), a n ∈ EE:Set ℝhnon:E.Nonemptyhbound:BddAbove Ehclosed:IsClosed EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.139221 ∧ sSup _fvar.139221 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.139221}hX:∀ (n : ℕ), Nonempty ↑(@_fvar.139594 n) := ?_mvar.139908a:ℕ → ℝ := fun n => sInf (@_fvar.139594 n)ha:∀ (n : ℕ), @_fvar.168330 n ∈ @_fvar.139594 n := fun n => @?_mvar.168504 n⊢ Filter.Tendsto a Filter.atTop (nhds (sSup E)); E:Set ℝhnon:E.Nonemptyhbound:BddAbove Ehclosed:IsClosed EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.139221 ∧ sSup _fvar.139221 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.139221}hX:∀ (n : ℕ), Nonempty ↑(@_fvar.139594 n) := ?_mvar.139908a:ℕ → ℝ := fun n => sInf (@_fvar.139594 n)ha:∀ (n : ℕ), @_fvar.168330 n ∈ @_fvar.139594 n := fun n => @?_mvar.168504 n⊢ Filter.Tendsto a Filter.atTop (nhds (sSup E))E:Set ℝhnon:E.Nonemptyhbound:BddAbove Ehclosed:IsClosed EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.139221 ∧ sSup _fvar.139221 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.139221}hX:∀ (n : ℕ), Nonempty ↑(@_fvar.139594 n) := ?_mvar.139908a:ℕ → ℝ := fun n => sInf (@_fvar.139594 n)ha:∀ (n : ℕ), @_fvar.168330 n ∈ @_fvar.139594 n := fun n => @?_mvar.168504 n⊢ ∀ (n : ℕ), a n ∈ E E:Set ℝhnon:E.Nonemptyhbound:BddAbove Ehclosed:IsClosed EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.139221 ∧ sSup _fvar.139221 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.139221}hX:∀ (n : ℕ), Nonempty ↑(@_fvar.139594 n) := ?_mvar.139908a:ℕ → ℝ := fun n => sInf (@_fvar.139594 n)ha:∀ (n : ℕ), @_fvar.168330 n ∈ @_fvar.139594 n := fun n => @?_mvar.168504 n⊢ Filter.Tendsto (fun n => sSup E - 1 / (↑n + 1)) Filter.atTop (nhds (sSup E))E:Set ℝhnon:E.Nonemptyhbound:BddAbove Ehclosed:IsClosed EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.139221 ∧ sSup _fvar.139221 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.139221}hX:∀ (n : ℕ), Nonempty ↑(@_fvar.139594 n) := ?_mvar.139908a:ℕ → ℝ := fun n => sInf (@_fvar.139594 n)ha:∀ (n : ℕ), @_fvar.168330 n ∈ @_fvar.139594 n := fun n => @?_mvar.168504 n⊢ Filter.Tendsto (fun x => sSup E) Filter.atTop (nhds (sSup E))E:Set ℝhnon:E.Nonemptyhbound:BddAbove Ehclosed:IsClosed EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.139221 ∧ sSup _fvar.139221 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.139221}hX:∀ (n : ℕ), Nonempty ↑(@_fvar.139594 n) := ?_mvar.139908a:ℕ → ℝ := fun n => sInf (@_fvar.139594 n)ha:∀ (n : ℕ), @_fvar.168330 n ∈ @_fvar.139594 n := fun n => @?_mvar.168504 n⊢ (fun n => sSup E - 1 / (↑n + 1)) ≤ aE:Set ℝhnon:E.Nonemptyhbound:BddAbove Ehclosed:IsClosed EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.139221 ∧ sSup _fvar.139221 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.139221}hX:∀ (n : ℕ), Nonempty ↑(@_fvar.139594 n) := ?_mvar.139908a:ℕ → ℝ := fun n => sInf (@_fvar.139594 n)ha:∀ (n : ℕ), @_fvar.168330 n ∈ @_fvar.139594 n := fun n => @?_mvar.168504 n⊢ a ≤ fun x => sSup EE:Set ℝhnon:E.Nonemptyhbound:BddAbove Ehclosed:IsClosed EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.139221 ∧ sSup _fvar.139221 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.139221}hX:∀ (n : ℕ), Nonempty ↑(@_fvar.139594 n) := ?_mvar.139908a:ℕ → ℝ := fun n => sInf (@_fvar.139594 n)ha:∀ (n : ℕ), @_fvar.168330 n ∈ @_fvar.139594 n := fun n => @?_mvar.168504 n⊢ ∀ (n : ℕ), a n ∈ E E:Set ℝhnon:E.Nonemptyhbound:BddAbove Ehclosed:IsClosed EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.139221 ∧ sSup _fvar.139221 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.139221}hX:∀ (n : ℕ), Nonempty ↑(@_fvar.139594 n) := ?_mvar.139908a:ℕ → ℝ := fun n => sInf (@_fvar.139594 n)ha:∀ (n : ℕ), @_fvar.168330 n ∈ @_fvar.139594 n := fun n => @?_mvar.168504 n⊢ Filter.Tendsto (fun n => sSup E - 1 / (↑n + 1)) Filter.atTop (nhds (sSup E)) E:Set ℝhnon:E.Nonemptyhbound:BddAbove Ehclosed:IsClosed EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.139221 ∧ sSup _fvar.139221 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.139221}hX:∀ (n : ℕ), Nonempty ↑(@_fvar.139594 n) := ?_mvar.139908a:ℕ → ℝ := fun n => sInf (@_fvar.139594 n)ha:∀ (n : ℕ), @_fvar.168330 n ∈ @_fvar.139594 n := fun n => @?_mvar.168504 n⊢ sSup E = sSup E - 0E:Set ℝhnon:E.Nonemptyhbound:BddAbove Ehclosed:IsClosed EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.139221 ∧ sSup _fvar.139221 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.139221}hX:∀ (n : ℕ), Nonempty ↑(@_fvar.139594 n) := ?_mvar.139908a:ℕ → ℝ := fun n => sInf (@_fvar.139594 n)ha:∀ (n : ℕ), @_fvar.168330 n ∈ @_fvar.139594 n := fun n => @?_mvar.168504 n⊢ Filter.Tendsto (fun n => 1 / (↑n + 1)) Filter.atTop (nhds 0); E:Set ℝhnon:E.Nonemptyhbound:BddAbove Ehclosed:IsClosed EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.139221 ∧ sSup _fvar.139221 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.139221}hX:∀ (n : ℕ), Nonempty ↑(@_fvar.139594 n) := ?_mvar.139908a:ℕ → ℝ := fun n => sInf (@_fvar.139594 n)ha:∀ (n : ℕ), @_fvar.168330 n ∈ @_fvar.139594 n := fun n => @?_mvar.168504 n⊢ Filter.Tendsto (fun n => 1 / (↑n + 1)) Filter.atTop (nhds 0) All goals completed! 🐙 E:Set ℝhnon:E.Nonemptyhbound:BddAbove Ehclosed:IsClosed EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.139221 ∧ sSup _fvar.139221 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.139221}hX:∀ (n : ℕ), Nonempty ↑(@_fvar.139594 n) := ?_mvar.139908a:ℕ → ℝ := fun n => sInf (@_fvar.139594 n)ha:∀ (n : ℕ), @_fvar.168330 n ∈ @_fvar.139594 n := fun n => @?_mvar.168504 n⊢ Filter.Tendsto (fun x => sSup E) Filter.atTop (nhds (sSup E)) All goals completed! 🐙 all_goals E:Set ℝhnon:E.Nonemptyhbound:BddAbove Ehclosed:IsClosed EX:ℕ → Set ℝ := fun n => {x | x ∈ _fvar.139221 ∧ sSup _fvar.139221 - 1 / (↑n + 1) ≤ x ∧ x ≤ sSup _fvar.139221}hX:∀ (n : ℕ), Nonempty ↑(@_fvar.139594 n) := ?_mvar.139908a:ℕ → ℝ := fun n => sInf (@_fvar.139594 n)ha:∀ (n : ℕ), @_fvar.168330 n ∈ @_fvar.139594 n := fun n => @?_mvar.168504 nn✝:ℕ⊢ a n✝ ∈ E; All goals completed! 🐙

Твердження 8.4.7 / Вправа 8.4.1

theorem declaration uses 'sorry'exists_function {X Y : Type} {P : X → Y → Prop} (h: ∀ x, ∃ y, P x y) : ∃ f : X → Y, ∀ x, P x (f x) := X:TypeY:TypeP:X → Y → Proph:∀ (x : X), ∃ y, P x y⊢ ∃ f, ∀ (x : X), P x (f x) All goals completed! 🐙

Вправа 8.4.1. Сенс цього завдання — встановити цей результат прямо з Chapter8.exists_function {X Y : Type} {P : X → Y → Prop} (h : ∀ (x : X), ∃ y, P x y) : ∃ f, ∀ (x : X), P x (f x)exists_function, уникаючи попередніх результатів, що більш явно покладалися на аксіому вибору.

theorem axiom_of_choice_from_exists_function {I: Type} {X: I → Type} (h : ∀ i, Nonempty (X i)) : Nonempty (∀ i, X i) := ⟨ fun i ↦ (h i).some ⟩

Вправа 8.4.2

theorem declaration uses 'sorry'exists_set_singleton_intersect {I U:Type} {X: I → Set U} (h: Set.PairwiseDisjoint .univ X) (hnon: ∀ α, Nonempty (X α)) : ∃ Y : Set U, ∀ α, Nat.card (Y ∩ X α : Set U) = 1 := I:TypeU:TypeX:I → Set Uh:Set.univ.PairwiseDisjoint Xhnon:∀ (α : I), Nonempty ↑(X α)⊢ ∃ Y, ∀ (α : I), Nat.card ↑(Y ∩ X α) = 1 All goals completed! 🐙

Вправа 8.4.2. Сенс цього завдання — встановити цей результат прямо з Chapter8.exists_set_singleton_intersect {I U : Type} {X : I → Set U} (h : Set.univ.PairwiseDisjoint X) (hnon : ∀ (α : I), Nonempty ↑(X α)) : ∃ Y, ∀ (α : I), Nat.card ↑(Y ∩ X α) = 1exists_set_singleton_intersect, уникаючи попередніх результатів, що більш явно покладалися на аксіому вибору.

theorem declaration uses 'sorry'axiom_of_choice_from_exists_set_singleton_intersect {I: Type} {X: I → Type} (h : ∀ i, Nonempty (X i)) : Nonempty (∀ i, X i) := I:TypeX:I → Typeh:∀ (i : I), Nonempty (X i)⊢ Nonempty ((i : I) → X i) All goals completed! 🐙

Вправа 8.4.3

theorem declaration uses 'sorry'Function.Injective.inv_surjective {A B:Type} {g: B → A} (hg: Function.Surjective g) : ∃ f : A → B, Function.Injective f ∧ Function.RightInverse f g := A:TypeB:Typeg:B → Ahg:Function.Surjective g⊢ ∃ f, Function.Injective f ∧ Function.RightInverse f g All goals completed! 🐙

Вправа 8.4.3. Сенс цього завдання — встановити цей результат прямо з Chapter8.Function.Injective.inv_surjective {A B : Type} {g : B → A} (hg : Function.Surjective g) : ∃ f, Function.Injective f ∧ Function.RightInverse f gFunction.Injective.inv_surjective, уникаючи попередніх результатів, що більш явно покладалися на аксіому вибору.

theorem declaration uses 'sorry'axiom_of_choice_from_function_injective_inv_surjective {I: Type} {X: I → Type} (h : ∀ i, Nonempty (X i)) : Nonempty (∀ i, X i) := I:TypeX:I → Typeh:∀ (i : I), Nonempty (X i)⊢ Nonempty ((i : I) → X i) All goals completed! 🐙
end Chapter8