Аналіз 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 1X i rwa [Fin.fin_one_eq_zero iX:Fin 1 Typei:Fin 1x:X iX 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) < ss 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)⁻¹ < ssSup 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)⁻¹ < ssSup 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) < ss 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)⁻¹ < ssSup 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)⁻¹ < ssSup 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 nFilter.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 nFilter.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 nFilter.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 nFilter.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 na 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 nFilter.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 nsSup 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 nFilter.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 nFilter.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 nFilter.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