Аналіз I, Розділ 8.4: Аксіома вибору
Я (прим. перекл. Терренс Тао) намагався зробити переклад якомога точнішим перефразуванням оригінального тексту. Коли є вибір між більш ідіоматичним підходом Lean та більш точним перекладом, я зазвичай обирав останній. Зокрема, будуть місця, де код Lean можна було б "підправити", щоб зробити його більш елегантним та ідіоматичним, але я свідомо уникав цього вибору.
Основні конструкції та результати цього розділу:
-
Огляд типу залежного добутку Mathlib
∀ α, X α. -
Аксіома вибору в різних еквівалентних формах, а також її рахункова версія.
Оскільки розділ 3, присвячений теорії множин, у багатьох місцях вже не використовується, ми не будемо
вставляти аксіому вибору безпосередньо в цю теорію у цьому тексті; проте це можна зробити за бажання
(наприклад, розширивши клас Chapter3.SetTheory до Chapter3.SetTheoryWithChoice), і студентам
можна запропонувати зробити це окремо. Натомість ми використовуватимемо вбудовану в Mathlib
аксіому Classical.choice. Технічно ця аксіома вже досить часто використовувалась у тексті, оскільки
Mathlib використовує Classical.choice для виведення багатьох слабших тверджень, наприклад закону виключеного третього.
Тож розмежування, зроблене в оригінальному тексті щодо того, чи використовує конкретне твердження
аксіому вибору, у цій формалізації дещо розмито. Теоретично можна відновити це розмежування,
прибравши залежність від Mathlib і працюючи з власними структурами типу
Chapter3.SetTheory і Chapter3.SetTheoryWithChoice, але це було б дуже трудомістким і тут не розглядається.
namespace Chapter8
Визначення 8.4.1 (Нескінченні декартові добутки). Ми уникатимемо використання цієї
дефініції на користь форми Mathlib ∀ α, X α, яка, як незабаром покажемо є еквівалентною (або,
точніше, такою, що узагальнює) цю.
Оскільки Lean не дозволяє необмежених об'єднань типів, ми дещо обходимо це, припускаючи,
що всі X α є підмножинами в спільній універсі 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 f := rfl
right_inv 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 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. Сенс цього завдання — встановити цей результат прямо з 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 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. Сенс цього завдання — встановити цей результат прямо з exists_set_singleton_intersect,
уникаючи попередніх результатів, що більш явно покладалися на аксіому вибору.
theorem 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 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. Сенс цього завдання — встановити цей результат прямо з Function.Injective.inv_surjective,
уникаючи попередніх результатів, що більш явно покладалися на аксіому вибору.
theorem 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