Imports
import Mathlib.Tactic import Analysis.Section_5_4

Analysis I, Section 5.5: The least upper bound property

I have attempted to make the translation as faithful a paraphrasing as possible of the original text. When there is a choice between a more idiomatic Lean solution and a more faithful translation, I have generally chosen the latter. In particular, there will be places where the Lean code could be "golfed" to be more elegant and idiomatic, but I have consciously avoided doing so.

Main constructions and results of this section:

  • Upper bound and least upper bound on the real line

Tips from past users

Users of the companion who have completed the exercises in this section are welcome to send their tips for future users in this section as PRs.

  • (Add tip here)

namespace Chapter5

Definition 5.5.1 (upper bounds). Here we use the upperBounds set defined in Mathlib.

theorem Real.upperBound_def (E: Set Real) (M: Real) : M upperBounds E x E, x M := mem_upperBounds
theorem Real.lowerBound_def (E: Set Real) (M: Real) : M lowerBounds E x E, x M := mem_lowerBounds

API for Example 5.5.2

theorem Real.Icc_def (x y:Real) : .Icc x y = { z | x z z y } := rfl

API for Example 5.5.2

theorem Real.mem_Icc (x y z:Real) : z Set.Icc x y x z z y := x:Realy:Realz:Realz Set.Icc x y x z z y All goals completed! 🐙
/-- Example 5.5.2 -/ declaration uses `sorry`example (M: Real) : M upperBounds (.Icc 0 1) M 1 := M:RealM upperBounds (Set.Icc 0 1) M 1 All goals completed! 🐙

API for Example 5.5.3

theorem Real.Ioi_def (x:Real) : .Ioi x = { z | z > x } := rfl
/-- Example 5.5.3 -/ declaration uses `sorry`example : ¬ M : Real, M upperBounds (.Ioi 0) := ¬ M, M upperBounds (Set.Ioi 0) All goals completed! 🐙/-- Example 5.5.4 -/ declaration uses `sorry`example : M, M upperBounds ( : Set Real) := (M : Real), M upperBounds All goals completed! 🐙theorem declaration uses `sorry`Real.upperBound_upper {M M': Real} (h: M M') {E: Set Real} (hb: M upperBounds E) : M' upperBounds E := M:RealM':Realh:M M'E:Set Realhb:M upperBounds EM' upperBounds E All goals completed! 🐙

Definition 5.5.5 (least upper bound). Here we use the IsLUB predicate defined in Mathlib.

theorem Real.isLUB_def (E: Set Real) (M: Real) : IsLUB E M M upperBounds E M' upperBounds E, M' M := E:Set RealM:RealIsLUB E M M upperBounds E M' upperBounds E, M' M All goals completed! 🐙
theorem Real.isGLB_def (E: Set Real) (M: Real) : IsGLB E M M lowerBounds E M' lowerBounds E, M' M := E:Set RealM:RealIsGLB E M M lowerBounds E M' lowerBounds E, M' M All goals completed! 🐙/-- Example 5.5.6 -/ declaration uses `sorry`example : IsLUB (.Icc 0 1) (1 : Real) := IsLUB (Set.Icc 0 1) 1 All goals completed! 🐙/-- Example 5.5.7 -/ declaration uses `sorry`example : ¬ M, IsLUB (: Set Real) M := ¬ M, IsLUB M All goals completed! 🐙

Proposition 5.5.8 (Uniqueness of least upper bound)

theorem Real.LUB_unique {E: Set Real} {M M': Real} (h1: IsLUB E M) (h2: IsLUB E M') : M = M' := E:Set RealM:RealM':Realh1:IsLUB E Mh2:IsLUB E M'M = M' All goals completed! 🐙

Definition of "bounded above", using Mathlib notation

theorem Real.bddAbove_def (E: Set Real) : BddAbove E M, M upperBounds E := Set.nonempty_def
theorem Real.bddBelow_def (E: Set Real) : BddBelow E M, M lowerBounds E := Set.nonempty_def

Exercise 5.5.2

theorem declaration uses `sorry`Real.upperBound_between {E: Set Real} {n:} {L K:} (hLK: L < K) (hK: K*((1/(n+1):):Real) upperBounds E) (hL: L*((1/(n+1):):Real) upperBounds E) : m, L < m m K m*((1/(n+1):):Real) upperBounds E (m-1)*((1/(n+1):):Real) upperBounds E := E:Set Realn:L:K:hLK:L < KhK:K * (1 / (n + 1)) upperBounds EhL:L * (1 / (n + 1)) upperBounds E m, L < m m K m * (1 / (n + 1)) upperBounds E (m - 1) * (1 / (n + 1)) upperBounds E All goals completed! 🐙

Exercise 5.5.3

theorem declaration uses `sorry`Real.upperBound_discrete_unique {E: Set Real} {n:} {m m':} (hm1: (((m:) / (n+1):):Real) upperBounds E) (hm2: (((m:) / (n+1) - 1 / (n+1):):Real) upperBounds E) (hm'1: (((m':) / (n+1):):Real) upperBounds E) (hm'2: (((m':) / (n+1) - 1 / (n+1):):Real) upperBounds E) : m = m' := E:Set Realn:m:m':hm1:(m / (n + 1)) upperBounds Ehm2:(m / (n + 1) - 1 / (n + 1)) upperBounds Ehm'1:(m' / (n + 1)) upperBounds Ehm'2:(m' / (n + 1) - 1 / (n + 1)) upperBounds Em = m' All goals completed! 🐙

Lemmas that can be helpful for proving 5.5.4

theorem declaration uses `sorry`Sequence.IsCauchy.abs {a: } (ha: (a:Sequence).IsCauchy): ((|a| : ) : Sequence).IsCauchy := a: ha:(↑a).IsCauchy(↑|a|).IsCauchy All goals completed! 🐙
theorem declaration uses `sorry`Real.LIM.abs_eq {a b: } (ha: (a: Sequence).IsCauchy) (hb: (b: Sequence).IsCauchy) (h: LIM a = LIM b): LIM |a| = LIM |b| := a: b: ha:(↑a).IsCauchyhb:(↑b).IsCauchyh:LIM a = LIM bLIM |a| = LIM |b| All goals completed! 🐙theorem declaration uses `sorry`Real.LIM.abs_eq_pos {a: } (h: LIM a > 0) (ha: (a:Sequence).IsCauchy): LIM a = LIM |a| := a: h:LIM a > 0ha:(↑a).IsCauchyLIM a = LIM |a| All goals completed! 🐙theorem declaration uses `sorry`Real.LIM_abs {a: } (ha: (a:Sequence).IsCauchy): |LIM a| = LIM |a| := a: ha:(↑a).IsCauchy|LIM a| = LIM |a| All goals completed! 🐙theorem declaration uses `sorry`Real.LIM_of_le' {x:Real} {a: } (hcauchy: (a:Sequence).IsCauchy) (h: N, n N, a n x) : LIM a x := x:Reala: hcauchy:(↑a).IsCauchyh: N, n N, (a n) xLIM a x All goals completed! 🐙

Exercise 5.5.4

theorem declaration uses `sorry`Real.LIM_of_Cauchy {q: } (hq: M, n M, n' M, |q n - q n'| 1 / (M+1)) : (q:Sequence).IsCauchy M, |q M - LIM q| 1 / (M+1) := q: hq: (M n : ), n M n' M, |q n - q n'| 1 / (M + 1)(↑q).IsCauchy (M : ), |(q M) - LIM q| 1 / (M + 1) All goals completed! 🐙

The sequence m₁, m₂, … is well-defined. This proof uses a different indexing convention than the text

lemma Real.LUB_claim1 (n : ) {E: Set Real} (hE: Set.Nonempty E) (hbound: BddAbove E) : ∃! m:, (((m:) / (n+1):):Real) upperBounds E ¬ (((m:) / (n+1) - 1 / (n+1):):Real) upperBounds E := n:E:Set RealhE:E.Nonemptyhbound:BddAbove E∃! m, (m / (n + 1)) upperBounds E (m / (n + 1) - 1 / (n + 1)) upperBounds E n:E:Set RealhE:E.Nonemptyhbound:BddAbove Ex₀:Real := hE.some∃! m, (m / (n + 1)) upperBounds E (m / (n + 1) - 1 / (n + 1)) upperBounds E n:E:Set RealhE:E.Nonemptyhbound:BddAbove Ex₀:Real := hE.somehx₀:hE.some E∃! m, (m / (n + 1)) upperBounds E (m / (n + 1) - 1 / (n + 1)) upperBounds E n:E:Set RealhE:E.Nonemptyhbound:BddAbove Ex₀:Real := hE.somehx₀:hE.some Eε:Real := (1 / (n + 1))∃! m, (m / (n + 1)) upperBounds E (m / (n + 1) - 1 / (n + 1)) upperBounds E have hpos : ε.IsPos := n:E:Set RealhE:E.Nonemptyhbound:BddAbove E∃! m, (m / (n + 1)) upperBounds E (m / (n + 1) - 1 / (n + 1)) upperBounds E n:E:Set RealhE:E.Nonemptyhbound:BddAbove Ex₀:Real := hE.somehx₀:hE.some Eε:Real := (1 / (n + 1))0 < n + 1; All goals completed! 🐙 n:E:Set RealhE:E.Nonemptyhbound:BddAbove Ex₀:Real := hE.somehx₀:hE.some Eε:Real := (1 / (n + 1))hpos:ε.IsPos x, (x / (n + 1)) upperBounds E (x / (n + 1) - 1 / (n + 1)) upperBounds En:E:Set RealhE:E.Nonemptyhbound:BddAbove Ex₀:Real := hE.somehx₀:hE.some Eε:Real := (1 / (n + 1))hpos:ε.IsPos (y₁ y₂ : ), (y₁ / (n + 1)) upperBounds E (y₁ / (n + 1) - 1 / (n + 1)) upperBounds E (y₂ / (n + 1)) upperBounds E (y₂ / (n + 1) - 1 / (n + 1)) upperBounds E y₁ = y₂ n:E:Set RealhE:E.Nonemptyhbound:BddAbove Ex₀:Real := hE.somehx₀:hE.some Eε:Real := (1 / (n + 1))hpos:ε.IsPos x, (x / (n + 1)) upperBounds E (x / (n + 1) - 1 / (n + 1)) upperBounds E n:E:Set RealhE:E.Nonemptyhbound: M, M upperBounds Ex₀:Real := hE.somehx₀:hE.some Eε:Real := (1 / (n + 1))hpos:ε.IsPos x, (x / (n + 1)) upperBounds E (x / (n + 1) - 1 / (n + 1)) upperBounds E; n:E:Set RealhE:E.Nonemptyx₀:Real := hE.somehx₀:hE.some Eε:Real := (1 / (n + 1))hpos:ε.IsPosM:Realhbound:M upperBounds E x, (x / (n + 1)) upperBounds E (x / (n + 1) - 1 / (n + 1)) upperBounds E n:E:Set RealhE:E.Nonemptyx₀:Real := hE.somehx₀:hE.some Eε:Real := (1 / (n + 1))hpos:ε.IsPosM:Realhbound:M upperBounds EK:h✝:K > 0hK:K * ε > M x, (x / (n + 1)) upperBounds E (x / (n + 1) - 1 / (n + 1)) upperBounds E n:E:Set RealhE:E.Nonemptyx₀:Real := hE.somehx₀:hE.some Eε:Real := (1 / (n + 1))hpos:ε.IsPosM:Realhbound:M upperBounds EK:h✝¹:K > 0hK:K * ε > ML':h✝:L' > 0hL:L' * ε > -x₀ x, (x / (n + 1)) upperBounds E (x / (n + 1) - 1 / (n + 1)) upperBounds E n:E:Set RealhE:E.Nonemptyx₀:Real := hE.somehx₀:hE.some Eε:Real := (1 / (n + 1))hpos:ε.IsPosM:Realhbound:M upperBounds EK:h✝¹:K > 0hK:K * ε > ML':h✝:L' > 0hL:L' * ε > -x₀L: := -L' x, (x / (n + 1)) upperBounds E (x / (n + 1) - 1 / (n + 1)) upperBounds E have claim1_1 : L * ε < x₀ := n:E:Set RealhE:E.Nonemptyhbound:BddAbove E∃! m, (m / (n + 1)) upperBounds E (m / (n + 1) - 1 / (n + 1)) upperBounds E n:E:Set RealhE:E.Nonemptyx₀:Real := hE.somehx₀:hE.some Eε:Real := (1 / (n + 1))hpos:ε.IsPosM:Realhbound:M upperBounds EK:h✝¹:K > 0hK:K * ε > ML':h✝:L' > 0hL:L' * ε > -x₀L: := -L'-(L' * ε) < x₀; All goals completed! 🐙 have claim1_2 : L * ε upperBounds E := n:E:Set RealhE:E.Nonemptyhbound:BddAbove E∃! m, (m / (n + 1)) upperBounds E (m / (n + 1) - 1 / (n + 1)) upperBounds E All goals completed! 🐙 have claim1_3 : (K:Real) > (L:Real) := n:E:Set RealhE:E.Nonemptyhbound:BddAbove E∃! m, (m / (n + 1)) upperBounds E (m / (n + 1) - 1 / (n + 1)) upperBounds E n:E:Set RealhE:E.Nonemptyx₀:Real := hE.somehx₀:hE.some Eε:Real := (1 / (n + 1))hpos:ε.IsPosM:Realhbound:M upperBounds EK:h✝¹:K > 0hK:K * ε > ML':h✝:L' > 0hL:L' * ε > -x₀L: := -L'claim1_1:L * ε < x₀claim1_2:K LL * ε upperBounds E n:E:Set RealhE:E.Nonemptyx₀:Real := hE.somehx₀:hE.some Eε:Real := (1 / (n + 1))hpos:ε.IsPosM:Realhbound:M upperBounds EK:h✝¹:K > 0hK:K * ε > ML':h✝:L' > 0hL:L' * ε > -x₀L: := -L'claim1_1:L * ε < x₀claim1_2:ε * K ε * LL * ε upperBounds E simp_rw n:E:Set RealhE:E.Nonemptyx₀:Real := hE.somehx₀:hE.some Eε:Real := (1 / (n + 1))hpos:ε.IsPosM:Realhbound:M upperBounds EK:h✝¹:K > 0hK:K * ε > ML':h✝:L' > 0hL:L' * ε > -x₀L: := -L'claim1_1:L * ε < x₀claim1_2:ε * K ε * LL * ε upperBounds Emul_comm] at claim1_2 replace claim1_2 : M L * ε := n:E:Set RealhE:E.Nonemptyhbound:BddAbove E∃! m, (m / (n + 1)) upperBounds E (m / (n + 1) - 1 / (n + 1)) upperBounds E All goals completed! 🐙 All goals completed! 🐙 have claim1_4 : m:, L < m m K m*ε upperBounds E (m-1)*ε upperBounds E := n:E:Set RealhE:E.Nonemptyhbound:BddAbove E∃! m, (m / (n + 1)) upperBounds E (m / (n + 1) - 1 / (n + 1)) upperBounds E n:E:Set RealhE:E.Nonemptyx₀:Real := hE.somehx₀:hE.some Eε:Real := (1 / (n + 1))hpos:ε.IsPosM:Realhbound:M upperBounds EK:h✝¹:K > 0hK:K * ε > ML':h✝:L' > 0hL:L' * ε > -x₀L: := -L'claim1_1:L * ε < x₀claim1_2:L * ε upperBounds Eclaim1_3:K > LL < Kn:E:Set RealhE:E.Nonemptyx₀:Real := hE.somehx₀:hE.some Eε:Real := (1 / (n + 1))hpos:ε.IsPosM:Realhbound:M upperBounds EK:h✝¹:K > 0hK:K * ε > ML':h✝:L' > 0hL:L' * ε > -x₀L: := -L'claim1_1:L * ε < x₀claim1_2:L * ε upperBounds Eclaim1_3:K > LK * (1 / (n + 1)) upperBounds E n:E:Set RealhE:E.Nonemptyx₀:Real := hE.somehx₀:hE.some Eε:Real := (1 / (n + 1))hpos:ε.IsPosM:Realhbound:M upperBounds EK:h✝¹:K > 0hK:K * ε > ML':h✝:L' > 0hL:L' * ε > -x₀L: := -L'claim1_1:L * ε < x₀claim1_2:L * ε upperBounds Eclaim1_3:K > LL < K n:E:Set RealhE:E.Nonemptyx₀:Real := hE.somehx₀:hE.some Eε:Real := (1 / (n + 1))hpos:ε.IsPosM:Realhbound:M upperBounds EK:h✝¹:K > 0hK:K * ε > ML':h✝:L' > 0hL:L' * ε > -x₀L: := -L'claim1_1:L * ε < x₀claim1_2:L * ε upperBounds Eclaim1_3:K > LL < K; rwa [gt_iff_lt, gt_of_coen:E:Set RealhE:E.Nonemptyx₀:Real := hE.somehx₀:hE.some Eε:Real := (1 / (n + 1))hpos:ε.IsPosM:Realhbound:M upperBounds EK:h✝¹:K > 0hK:K * ε > ML':h✝:L' > 0hL:L' * ε > -x₀L: := -L'claim1_1:L * ε < x₀claim1_2:L * ε upperBounds Eclaim1_3:K > LK > L n:E:Set RealhE:E.Nonemptyx₀:Real := hE.somehx₀:hE.some Eε:Real := (1 / (n + 1))M:Realhbound:M upperBounds EK:L':L: := -L'hpos:(n + 1)⁻¹.IsPosh✝¹:0 < KhK:M < K * (n + 1)⁻¹h✝:0 < L'hL:-x₀ < L' * (n + 1)⁻¹claim1_1:L * (n + 1)⁻¹ < x₀claim1_2:L * (n + 1)⁻¹ upperBounds Eclaim1_3:L < KK * (n + 1)⁻¹ upperBounds E; n:E:Set RealhE:E.Nonemptyx₀:Real := hE.somehx₀:hE.some Eε:Real := (1 / (n + 1))M:Realhbound:M upperBounds EK:L':L: := -L'hpos:(n + 1)⁻¹.IsPosh✝¹:0 < KhK:M < K * (n + 1)⁻¹h✝:0 < L'hL:-x₀ < L' * (n + 1)⁻¹claim1_1:L * (n + 1)⁻¹ < x₀claim1_2:L * (n + 1)⁻¹ upperBounds Eclaim1_3:L < KM K * (n + 1)⁻¹; All goals completed! 🐙 n:E:Set RealhE:E.Nonemptyx₀:Real := hE.somehx₀:hE.some Eε:Real := (1 / (n + 1))hpos:ε.IsPosM:Realhbound:M upperBounds EK:h✝³:K > 0hK:K * ε > ML':h✝²:L' > 0hL:L' * ε > -x₀L: := -L'claim1_1:L * ε < x₀claim1_2:L * ε upperBounds Eclaim1_3:K > Lm:h✝¹:L < mh✝:m Khm:m * ε upperBounds Ehm':(m - 1) * ε upperBounds E x, (x / (n + 1)) upperBounds E (x / (n + 1) - 1 / (n + 1)) upperBounds E; n:E:Set RealhE:E.Nonemptyx₀:Real := hE.somehx₀:hE.some Eε:Real := (1 / (n + 1))hpos:ε.IsPosM:Realhbound:M upperBounds EK:h✝³:K > 0hK:K * ε > ML':h✝²:L' > 0hL:L' * ε > -x₀L: := -L'claim1_1:L * ε < x₀claim1_2:L * ε upperBounds Eclaim1_3:K > Lm:h✝¹:L < mh✝:m Khm:m * ε upperBounds Ehm':(m - 1) * ε upperBounds E(m / (n + 1)) upperBounds E (m / (n + 1) - 1 / (n + 1)) upperBounds E have : (m/(n+1):) = m*ε := n:E:Set RealhE:E.Nonemptyhbound:BddAbove E∃! m, (m / (n + 1)) upperBounds E (m / (n + 1) - 1 / (n + 1)) upperBounds E n:E:Set RealhE:E.Nonemptyx₀:Real := hE.somehx₀:hE.some Eε:Real := (1 / (n + 1))hpos:ε.IsPosM:Realhbound:M upperBounds EK:h✝³:K > 0hK:K * ε > ML':h✝²:L' > 0hL:L' * ε > -x₀L: := -L'claim1_1:L * ε < x₀claim1_2:L * ε upperBounds Eclaim1_3:K > Lm:h✝¹:L < mh✝:m Khm:m * ε upperBounds Ehm':(m - 1) * ε upperBounds Em / (n + 1) = m * (n + 1)⁻¹; All goals completed! 🐙 exact n:E:Set RealhE:E.Nonemptyx₀:Real := hE.somehx₀:hE.some Eε:Real := (1 / (n + 1))hpos:ε.IsPosM:Realhbound:M upperBounds EK:h✝³:K > 0hK:K * ε > ML':h✝²:L' > 0hL:L' * ε > -x₀L: := -L'claim1_1:L * ε < x₀claim1_2:L * ε upperBounds Eclaim1_3:K > Lm:h✝¹:L < mh✝:m Khm:m * ε upperBounds Ehm':(m - 1) * ε upperBounds Ethis:(m / (n + 1)) = m * ε(m / (n + 1)) upperBounds E All goals completed! 🐙, n:E:Set RealhE:E.Nonemptyx₀:Real := hE.somehx₀:hE.some Eε:Real := (1 / (n + 1))hpos:ε.IsPosM:Realhbound:M upperBounds EK:h✝³:K > 0hK:K * ε > ML':h✝²:L' > 0hL:L' * ε > -x₀L: := -L'claim1_1:L * ε < x₀claim1_2:L * ε upperBounds Eclaim1_3:K > Lm:h✝¹:L < mh✝:m Khm:m * ε upperBounds Ehm':(m - 1) * ε upperBounds Ethis:(m / (n + 1)) = m * ε(m / (n + 1) - 1 / (n + 1)) upperBounds E n:E:Set RealhE:E.Nonemptyx₀:Real := hE.somehx₀:hE.some Eε:Real := (1 / (n + 1))hpos:ε.IsPosM:Realhbound:M upperBounds EK:h✝³:K > 0hK:K * ε > ML':h✝²:L' > 0hL:L' * ε > -x₀L: := -L'claim1_1:L * ε < x₀claim1_2:L * ε upperBounds Eclaim1_3:K > Lm:h✝¹:L < mh✝:m Khm:m * ε upperBounds Ehm':(m - 1) * ε upperBounds Ethis:(m / (n + 1)) = m * ε(m / (n + 1) - 1 / (n + 1)) = (m - 1) * ε; All goals completed! 🐙 All goals completed! 🐙
lemma Real.LUB_claim2 {E : Set Real} (N:) {a b: } (hb : n, b n = 1 / (n + 1)) (hm1 : (n : ), (a n) upperBounds E) (hm2 : (n : ), ((a - b) n) upperBounds E) : n N, n' N, |a n - a n'| 1 / (N+1) := E:Set RealN:a: b: hb: (n : ), b n = 1 / (n + 1)hm1: (n : ), (a n) upperBounds Ehm2: (n : ), ((a - b) n) upperBounds E n N, n' N, |a n - a n'| 1 / (N + 1) intro n E:Set RealN:a: b: hb: (n : ), b n = 1 / (n + 1)hm1: (n : ), (a n) upperBounds Ehm2: (n : ), ((a - b) n) upperBounds En:hn:n N n' N, |a n - a n'| 1 / (N + 1) E:Set RealN:a: b: hb: (n : ), b n = 1 / (n + 1)hm1: (n : ), (a n) upperBounds Ehm2: (n : ), ((a - b) n) upperBounds En:hn:n Nn':n' N |a n - a n'| 1 / (N + 1) E:Set RealN:a: b: hb: (n : ), b n = 1 / (n + 1)hm1: (n : ), (a n) upperBounds Ehm2: (n : ), ((a - b) n) upperBounds En:hn:n Nn':hn':n' N|a n - a n'| 1 / (N + 1) E:Set RealN:a: b: hb: (n : ), b n = 1 / (n + 1)hm1: (n : ), (a n) upperBounds Ehm2: (n : ), ((a - b) n) upperBounds En:hn:n Nn':hn':n' N-(1 / (N + 1)) a n - a n' a n - a n' 1 / (N + 1) E:Set RealN:a: b: hb: (n : ), b n = 1 / (n + 1)hm1: (n : ), (a n) upperBounds Ehm2: (n : ), ((a - b) n) upperBounds En:hn:n Nn':hn':n' N-(1 / (N + 1)) a n - a n'E:Set RealN:a: b: hb: (n : ), b n = 1 / (n + 1)hm1: (n : ), (a n) upperBounds Ehm2: (n : ), ((a - b) n) upperBounds En:hn:n Nn':hn':n' Na n - a n' 1 / (N + 1) E:Set RealN:a: b: hb: (n : ), b n = 1 / (n + 1)hm1: (n : ), (a n) upperBounds Ehm2: (n : ), ((a - b) n) upperBounds En:hn:n Nn':hn':n' N-(1 / (N + 1)) a n - a n' E:Set RealN:a: b: hb: (n : ), b n = 1 / (n + 1)hm2: (n : ), ((a - b) n) upperBounds En:hn:n Nn':hn':n' Nhm1:(a n) upperBounds E-(1 / (N + 1)) a n - a n'; E:Set RealN:a: b: hb: (n : ), b n = 1 / (n + 1)n:hn:n Nn':hn':n' Nhm1:(a n) upperBounds Ehm2:((a - b) n') upperBounds E-(1 / (N + 1)) a n - a n' have bound1 : ((a-b) n') < a n := E:Set RealN:a: b: hb: (n : ), b n = 1 / (n + 1)hm1: (n : ), (a n) upperBounds Ehm2: (n : ), ((a - b) n) upperBounds E n N, n' N, |a n - a n'| 1 / (N + 1) E:Set RealN:a: b: hb: (n : ), b n = 1 / (n + 1)n:hn:n Nn':hn':n' Nhm1:(a n) upperBounds Ehm2:((a - b) n') upperBounds E((a - b) n') < (a n); E:Set RealN:a: b: hb: (n : ), b n = 1 / (n + 1)n:hn:n Nn':hn':n' Nhm1:(a n) upperBounds Ehm2:(a n) ((a - b) n')((a - b) n') upperBounds E; All goals completed! 🐙 have bound3 : 1/((n':)+1) 1/(N+1) := E:Set RealN:a: b: hb: (n : ), b n = 1 / (n + 1)hm1: (n : ), (a n) upperBounds Ehm2: (n : ), ((a - b) n) upperBounds E n N, n' N, |a n - a n'| 1 / (N + 1) All goals completed! 🐙 E:Set RealN:a: b: hb: (n : ), b n = 1 / (n + 1)n:hn:n Nn':hn':n' Nhm1:(a n) upperBounds Ehm2:((a - b) n') upperBounds Ebound1:(a - b) n' < a nbound3:-(1 / (N + 1)) -(1 / (n' + 1))-(1 / (N + 1)) a n - a n'; E:Set RealN:a: b: hb: (n : ), b n = 1 / (n + 1)n:hn:n Nn':hn':n' Nhm1:(a n) upperBounds Ehm2:((a - b) n') upperBounds Ebound1:a n' - b n' < a nbound3:-(1 / (N + 1)) -(1 / (n' + 1))-(1 / (N + 1)) a n - a n'; All goals completed! 🐙 E:Set RealN:a: b: hb: (n : ), b n = 1 / (n + 1)hm2: (n : ), ((a - b) n) upperBounds En:hn:n Nn':hn':n' Nhm1:(a n') upperBounds Ea n - a n' 1 / (N + 1); E:Set RealN:a: b: hb: (n : ), b n = 1 / (n + 1)n:hn:n Nn':hn':n' Nhm1:(a n') upperBounds Ehm2:((a - b) n) upperBounds Ea n - a n' 1 / (N + 1) have bound1 : ((a-b) n) < a n' := E:Set RealN:a: b: hb: (n : ), b n = 1 / (n + 1)hm1: (n : ), (a n) upperBounds Ehm2: (n : ), ((a - b) n) upperBounds E n N, n' N, |a n - a n'| 1 / (N + 1) E:Set RealN:a: b: hb: (n : ), b n = 1 / (n + 1)n:hn:n Nn':hn':n' Nhm1:(a n') upperBounds Ehm2:((a - b) n) upperBounds E((a - b) n) < (a n'); E:Set RealN:a: b: hb: (n : ), b n = 1 / (n + 1)n:hn:n Nn':hn':n' Nhm1:(a n') upperBounds Ehm2:(a n') ((a - b) n)((a - b) n) upperBounds E; All goals completed! 🐙 have bound2 : ((a-b) n) = a n - 1 / (n+1) := E:Set RealN:a: b: hb: (n : ), b n = 1 / (n + 1)hm1: (n : ), (a n) upperBounds Ehm2: (n : ), ((a - b) n) upperBounds E n N, n' N, |a n - a n'| 1 / (N + 1) All goals completed! 🐙 have bound3 : 1/((n+1):) 1/(N+1) := E:Set RealN:a: b: hb: (n : ), b n = 1 / (n + 1)hm1: (n : ), (a n) upperBounds Ehm2: (n : ), ((a - b) n) upperBounds E n N, n' N, |a n - a n'| 1 / (N + 1) All goals completed! 🐙 All goals completed! 🐙

Theorem 5.5.9 (Existence of least upper bound)

theorem Real.LUB_exist {E: Set Real} (hE: Set.Nonempty E) (hbound: BddAbove E): S, IsLUB E S := E:Set RealhE:E.Nonemptyhbound:BddAbove E S, IsLUB E S -- This proof is written to follow the structure of the original text. E:Set RealhE:E.Nonemptyhbound:BddAbove Ex₀:Real := hE.some S, IsLUB E S E:Set RealhE:E.Nonemptyhbound:BddAbove Ex₀:Real := hE.somehx₀:x₀ E S, IsLUB E S E:Set RealhE:E.Nonemptyhbound:BddAbove Ex₀:Real := hE.somehx₀:x₀ Em: := fun n .choose S, IsLUB E S E:Set RealhE:E.Nonemptyhbound:BddAbove Ex₀:Real := hE.somehx₀:x₀ Em: := fun n .choosea: := fun n (m n) / (n + 1) S, IsLUB E S E:Set RealhE:E.Nonemptyhbound:BddAbove Ex₀:Real := hE.somehx₀:x₀ Em: := fun n .choosea: := fun n (m n) / (n + 1)b: := fun n 1 / (n + 1) S, IsLUB E S E:Set RealhE:E.Nonemptyhbound:BddAbove Ex₀:Real := hE.somehx₀:x₀ Em: := fun n .choosea: := fun n (m n) / (n + 1)b: := fun n 1 / (n + 1)claim1: (n : ), ∃! m, (m / (n + 1)) upperBounds E (m / (n + 1) - 1 / (n + 1)) upperBounds E S, IsLUB E S E:Set RealhE:E.Nonemptyhbound:BddAbove Ex₀:Real := hE.somehx₀:x₀ Em: := fun n .choosea: := fun n (m n) / (n + 1)b: := fun n 1 / (n + 1)claim1: (n : ), ∃! m, (m / (n + 1)) upperBounds E (m / (n + 1) - 1 / (n + 1)) upperBounds Ehb:(↑b).IsCauchy S, IsLUB E S E:Set RealhE:E.Nonemptyhbound:BddAbove Ex₀:Real := hE.somehx₀:x₀ Em: := fun n .choosea: := fun n (m n) / (n + 1)b: := fun n 1 / (n + 1)claim1: (n : ), ∃! m, (m / (n + 1)) upperBounds E (m / (n + 1) - 1 / (n + 1)) upperBounds Ehb:(↑b).IsCauchyhm1: (n : ), (.choose / (n + 1)) upperBounds E S, IsLUB E S E:Set RealhE:E.Nonemptyhbound:BddAbove Ex₀:Real := hE.somehx₀:x₀ Em: := fun n .choosea: := fun n (m n) / (n + 1)b: := fun n 1 / (n + 1)claim1: (n : ), ∃! m, (m / (n + 1)) upperBounds E (m / (n + 1) - 1 / (n + 1)) upperBounds Ehb:(↑b).IsCauchyhm1: (n : ), (.choose / (n + 1)) upperBounds Ehm2: (n : ), ((a - b) n) upperBounds E S, IsLUB E S have claim2 (N:) := LUB_claim2 N (E:Set RealhE:E.Nonemptyhbound:BddAbove Ex₀:Real := hE.somehx₀:x₀ Em: := fun n .choosea: := fun n (m n) / (n + 1)b: := fun n 1 / (n + 1)claim1: (n : ), ∃! m, (m / (n + 1)) upperBounds E (m / (n + 1) - 1 / (n + 1)) upperBounds Ehb:(↑b).IsCauchyhm1: (n : ), (.choose / (n + 1)) upperBounds Ehm2: (n : ), ((a - b) n) upperBounds EN: (n : ), b n = 1 / (n + 1) All goals completed! 🐙) hm1 hm2 E:Set RealhE:E.Nonemptyhbound:BddAbove Ex₀:Real := hE.somehx₀:x₀ Em: := fun n .choosea: := fun n (m n) / (n + 1)b: := fun n 1 / (n + 1)claim1: (n : ), ∃! m, (m / (n + 1)) upperBounds E (m / (n + 1) - 1 / (n + 1)) upperBounds Ehb:(↑b).IsCauchyhm1: (n : ), (.choose / (n + 1)) upperBounds Ehm2: (n : ), ((a - b) n) upperBounds Eclaim2: (N n : ), n N n' N, |.choose / (n + 1) - .choose / (n' + 1)| 1 / (N + 1)claim3:(↑a).IsCauchy S, IsLUB E S E:Set RealhE:E.Nonemptyhbound:BddAbove Ex₀:Real := hE.somehx₀:x₀ Em: := fun n .choosea: := fun n (m n) / (n + 1)b: := fun n 1 / (n + 1)claim1: (n : ), ∃! m, (m / (n + 1)) upperBounds E (m / (n + 1) - 1 / (n + 1)) upperBounds Ehb:(↑b).IsCauchyhm1: (n : ), (.choose / (n + 1)) upperBounds Ehm2: (n : ), ((a - b) n) upperBounds Eclaim2: (N n : ), n N n' N, |.choose / (n + 1) - .choose / (n' + 1)| 1 / (N + 1)claim3:(↑a).IsCauchyS:Real := LIM a S, IsLUB E S; E:Set RealhE:E.Nonemptyhbound:BddAbove Ex₀:Real := hE.somehx₀:x₀ Em: := fun n .choosea: := fun n (m n) / (n + 1)b: := fun n 1 / (n + 1)claim1: (n : ), ∃! m, (m / (n + 1)) upperBounds E (m / (n + 1) - 1 / (n + 1)) upperBounds Ehb:(↑b).IsCauchyhm1: (n : ), (.choose / (n + 1)) upperBounds Ehm2: (n : ), ((a - b) n) upperBounds Eclaim2: (N n : ), n N n' N, |.choose / (n + 1) - .choose / (n' + 1)| 1 / (N + 1)claim3:(↑a).IsCauchyS:Real := LIM aIsLUB E S have claim4 : S = LIM (a - b) := E:Set RealhE:E.Nonemptyhbound:BddAbove E S, IsLUB E S E:Set RealhE:E.Nonemptyhbound:BddAbove Ex₀:Real := hE.somehx₀:x₀ Em: := fun n .choosea: := fun n (m n) / (n + 1)b: := fun n 1 / (n + 1)claim1: (n : ), ∃! m, (m / (n + 1)) upperBounds E (m / (n + 1) - 1 / (n + 1)) upperBounds Ehb:(↑b).IsCauchyhm1: (n : ), (.choose / (n + 1)) upperBounds Ehm2: (n : ), ((a - b) n) upperBounds Eclaim2: (N n : ), n N n' N, |.choose / (n + 1) - .choose / (n' + 1)| 1 / (N + 1)claim3:(↑a).IsCauchyS:Real := LIM athis:LIM b = 0S = LIM (a - b) All goals completed! 🐙 E:Set RealhE:E.Nonemptyhbound:BddAbove Ex₀:Real := hE.somehx₀:x₀ Em: := fun n .choosea: := fun n (m n) / (n + 1)b: := fun n 1 / (n + 1)claim1: (n : ), ∃! m, (m / (n + 1)) upperBounds E (m / (n + 1) - 1 / (n + 1)) upperBounds Ehb:(↑b).IsCauchyhm1: (n : ), (.choose / (n + 1)) upperBounds Ehm2: (n : ), ((a - b) n) upperBounds Eclaim2: (N n : ), n N n' N, |.choose / (n + 1) - .choose / (n' + 1)| 1 / (N + 1)claim3:(↑a).IsCauchyS:Real := LIM aclaim4:S = LIM (a - b)(∀ x E, x S) M' upperBounds E, M' S E:Set RealhE:E.Nonemptyhbound:BddAbove Ex₀:Real := hE.somehx₀:x₀ Em: := fun n .choosea: := fun n (m n) / (n + 1)b: := fun n 1 / (n + 1)claim1: (n : ), ∃! m, (m / (n + 1)) upperBounds E (m / (n + 1) - 1 / (n + 1)) upperBounds Ehb:(↑b).IsCauchyhm1: (n : ), (.choose / (n + 1)) upperBounds Ehm2: (n : ), ((a - b) n) upperBounds Eclaim2: (N n : ), n N n' N, |.choose / (n + 1) - .choose / (n' + 1)| 1 / (N + 1)claim3:(↑a).IsCauchyS:Real := LIM aclaim4:S = LIM (a - b) x E, x SE:Set RealhE:E.Nonemptyhbound:BddAbove Ex₀:Real := hE.somehx₀:x₀ Em: := fun n .choosea: := fun n (m n) / (n + 1)b: := fun n 1 / (n + 1)claim1: (n : ), ∃! m, (m / (n + 1)) upperBounds E (m / (n + 1) - 1 / (n + 1)) upperBounds Ehb:(↑b).IsCauchyhm1: (n : ), (.choose / (n + 1)) upperBounds Ehm2: (n : ), ((a - b) n) upperBounds Eclaim2: (N n : ), n N n' N, |.choose / (n + 1) - .choose / (n' + 1)| 1 / (N + 1)claim3:(↑a).IsCauchyS:Real := LIM aclaim4:S = LIM (a - b) M' upperBounds E, M' S E:Set RealhE:E.Nonemptyhbound:BddAbove Ex₀:Real := hE.somehx₀:x₀ Em: := fun n .choosea: := fun n (m n) / (n + 1)b: := fun n 1 / (n + 1)claim1: (n : ), ∃! m, (m / (n + 1)) upperBounds E (m / (n + 1) - 1 / (n + 1)) upperBounds Ehb:(↑b).IsCauchyhm1: (n : ), (.choose / (n + 1)) upperBounds Ehm2: (n : ), ((a - b) n) upperBounds Eclaim2: (N n : ), n N n' N, |.choose / (n + 1) - .choose / (n' + 1)| 1 / (N + 1)claim3:(↑a).IsCauchyS:Real := LIM aclaim4:S = LIM (a - b) x E, x S intro x E:Set RealhE:E.Nonemptyhbound:BddAbove Ex₀:Real := hE.somehx₀:x₀ Em: := fun n .choosea: := fun n (m n) / (n + 1)b: := fun n 1 / (n + 1)claim1: (n : ), ∃! m, (m / (n + 1)) upperBounds E (m / (n + 1) - 1 / (n + 1)) upperBounds Ehb:(↑b).IsCauchyhm1: (n : ), (.choose / (n + 1)) upperBounds Ehm2: (n : ), ((a - b) n) upperBounds Eclaim2: (N n : ), n N n' N, |.choose / (n + 1) - .choose / (n' + 1)| 1 / (N + 1)claim3:(↑a).IsCauchyS:Real := LIM aclaim4:S = LIM (a - b)x:Realhx:x Ex S; E:Set RealhE:E.Nonemptyhbound:BddAbove Ex₀:Real := hE.somehx₀:x₀ Em: := fun n .choosea: := fun n (m n) / (n + 1)b: := fun n 1 / (n + 1)claim1: (n : ), ∃! m, (m / (n + 1)) upperBounds E (m / (n + 1) - 1 / (n + 1)) upperBounds Ehb:(↑b).IsCauchyhm1: (n : ), (.choose / (n + 1)) upperBounds Ehm2: (n : ), ((a - b) n) upperBounds Eclaim2: (N n : ), n N n' N, |.choose / (n + 1) - .choose / (n' + 1)| 1 / (N + 1)claim3:(↑a).IsCauchyS:Real := LIM aclaim4:S = LIM (a - b)x:Realhx:x E (n : ), (a n) x; E:Set RealhE:E.Nonemptyhbound:BddAbove Ex₀:Real := hE.somehx₀:x₀ Em: := fun n .choosea: := fun n (m n) / (n + 1)b: := fun n 1 / (n + 1)claim1: (n : ), ∃! m, (m / (n + 1)) upperBounds E (m / (n + 1) - 1 / (n + 1)) upperBounds Ehb:(↑b).IsCauchyhm1: (n : ), (.choose / (n + 1)) upperBounds Ehm2: (n : ), ((a - b) n) upperBounds Eclaim2: (N n : ), n N n' N, |.choose / (n + 1) - .choose / (n' + 1)| 1 / (N + 1)claim3:(↑a).IsCauchyS:Real := LIM aclaim4:S = LIM (a - b)x:Realhx:x En:(a n) x All goals completed! 🐙 intro y E:Set RealhE:E.Nonemptyhbound:BddAbove Ex₀:Real := hE.somehx₀:x₀ Em: := fun n .choosea: := fun n (m n) / (n + 1)b: := fun n 1 / (n + 1)claim1: (n : ), ∃! m, (m / (n + 1)) upperBounds E (m / (n + 1) - 1 / (n + 1)) upperBounds Ehb:(↑b).IsCauchyhm1: (n : ), (.choose / (n + 1)) upperBounds Ehm2: (n : ), ((a - b) n) upperBounds Eclaim2: (N n : ), n N n' N, |.choose / (n + 1) - .choose / (n' + 1)| 1 / (N + 1)claim3:(↑a).IsCauchyS:Real := LIM aclaim4:S = LIM (a - b)y:Realhy:y upperBounds Ey S have claim5 (n:) : y (a-b) n := E:Set RealhE:E.Nonemptyhbound:BddAbove E S, IsLUB E S E:Set RealhE:E.Nonemptyhbound:BddAbove Ex₀:Real := hE.somehx₀:x₀ Em: := fun n .choosea: := fun n (m n) / (n + 1)b: := fun n 1 / (n + 1)claim1: (n : ), ∃! m, (m / (n + 1)) upperBounds E (m / (n + 1) - 1 / (n + 1)) upperBounds Ehb:(↑b).IsCauchyhm1: (n : ), (.choose / (n + 1)) upperBounds Eclaim2: (N n : ), n N n' N, |.choose / (n + 1) - .choose / (n' + 1)| 1 / (N + 1)claim3:(↑a).IsCauchyS:Real := LIM aclaim4:S = LIM (a - b)y:Realhy:y upperBounds En:hm2:y < ((a - b) n) n, ((a - b) n) upperBounds E; E:Set RealhE:E.Nonemptyhbound:BddAbove Ex₀:Real := hE.somehx₀:x₀ Em: := fun n .choosea: := fun n (m n) / (n + 1)b: := fun n 1 / (n + 1)claim1: (n : ), ∃! m, (m / (n + 1)) upperBounds E (m / (n + 1) - 1 / (n + 1)) upperBounds Ehb:(↑b).IsCauchyhm1: (n : ), (.choose / (n + 1)) upperBounds Eclaim2: (N n : ), n N n' N, |.choose / (n + 1) - .choose / (n' + 1)| 1 / (N + 1)claim3:(↑a).IsCauchyS:Real := LIM aclaim4:S = LIM (a - b)y:Realhy:y upperBounds En:hm2:y < ((a - b) n)((a - b) n) upperBounds E; E:Set RealhE:E.Nonemptyhbound:BddAbove Ex₀:Real := hE.somehx₀:x₀ Em: := fun n .choosea: := fun n (m n) / (n + 1)b: := fun n 1 / (n + 1)claim1: (n : ), ∃! m, (m / (n + 1)) upperBounds E (m / (n + 1) - 1 / (n + 1)) upperBounds Ehb:(↑b).IsCauchyhm1: (n : ), (.choose / (n + 1)) upperBounds Eclaim2: (N n : ), n N n' N, |.choose / (n + 1) - .choose / (n' + 1)| 1 / (N + 1)claim3:(↑a).IsCauchyS:Real := LIM aclaim4:S = LIM (a - b)y:Realhy:y upperBounds En:hm2:y < ((a - b) n)y ((a - b) n); All goals completed! 🐙 E:Set RealhE:E.Nonemptyhbound:BddAbove Ex₀:Real := hE.somehx₀:x₀ Em: := fun n .choosea: := fun n (m n) / (n + 1)b: := fun n 1 / (n + 1)claim1: (n : ), ∃! m, (m / (n + 1)) upperBounds E (m / (n + 1) - 1 / (n + 1)) upperBounds Ehb:(↑b).IsCauchyhm1: (n : ), (.choose / (n + 1)) upperBounds Ehm2: (n : ), ((a - b) n) upperBounds Eclaim2: (N n : ), n N n' N, |.choose / (n + 1) - .choose / (n' + 1)| 1 / (N + 1)claim3:(↑a).IsCauchyS:Real := LIM aclaim4:S = LIM (a - b)y:Realhy:y upperBounds Eclaim5: (n : ), y ((a - b) n)y LIM (a - b); E:Set RealhE:E.Nonemptyhbound:BddAbove Ex₀:Real := hE.somehx₀:x₀ Em: := fun n .choosea: := fun n (m n) / (n + 1)b: := fun n 1 / (n + 1)claim1: (n : ), ∃! m, (m / (n + 1)) upperBounds E (m / (n + 1) - 1 / (n + 1)) upperBounds Ehb:(↑b).IsCauchyhm1: (n : ), (.choose / (n + 1)) upperBounds Ehm2: (n : ), ((a - b) n) upperBounds Eclaim2: (N n : ), n N n' N, |.choose / (n + 1) - .choose / (n' + 1)| 1 / (N + 1)claim3:(↑a).IsCauchyS:Real := LIM aclaim4:S = LIM (a - b)y:Realhy:y upperBounds Eclaim5: (n : ), y ((a - b) n)(↑(a - b)).IsCauchy; All goals completed! 🐙

A bare-bones extended real class to define supremum.

inductive ExtendedReal where | neg_infty : ExtendedReal | real (x:Real) : ExtendedReal | infty : ExtendedReal

Mathlib prefers to denote the +∞ element.

instance ExtendedReal.inst_Top : Top ExtendedReal where top := infty

Mathlib prefers to denote the -∞ element.

instance ExtendedReal.inst_Bot: Bot ExtendedReal where bot := neg_infty
instance ExtendedReal.coe_real : Coe Real ExtendedReal where coe x := ExtendedReal.real xinstance ExtendedReal.real_coe : Coe ExtendedReal Real where coe X := match X with | neg_infty => 0 | real x => x | infty => 0abbrev ExtendedReal.IsFinite (X : ExtendedReal) : Prop := match X with | neg_infty => False | real _ => True | infty => Falsetheorem ExtendedReal.finite_eq_coe {X: ExtendedReal} (hX: X.IsFinite) : X = ((X:Real):ExtendedReal) := X:ExtendedRealhX:X.IsFiniteX = real (match X with | neg_infty => 0 | real x => x | infty => 0) hX:neg_infty.IsFiniteneg_infty = real (match neg_infty with | neg_infty => 0 | real x => x | infty => 0)x✝:RealhX:(real x✝).IsFinitereal x✝ = real (match real x✝ with | neg_infty => 0 | real x => x | infty => 0)hX:infty.IsFiniteinfty = real (match infty with | neg_infty => 0 | real x => x | infty => 0) hX:neg_infty.IsFiniteneg_infty = real (match neg_infty with | neg_infty => 0 | real x => x | infty => 0)x✝:RealhX:(real x✝).IsFinitereal x✝ = real (match real x✝ with | neg_infty => 0 | real x => x | infty => 0)hX:infty.IsFiniteinfty = real (match infty with | neg_infty => 0 | real x => x | infty => 0) try All goals completed! 🐙 All goals completed! 🐙

Definition 5.5.10 (Supremum)

open Classical innoncomputable abbrev ExtendedReal.sup (E: Set Real) : ExtendedReal := if h1:E.Nonempty then (if h2:BddAbove E then ((Real.LUB_exist h1 h2).choose:Real) else ) else

Definition 5.5.10 (Supremum)

theorem ExtendedReal.sup_of_empty : sup = := sup = All goals completed! 🐙

Definition 5.5.10 (Supremum)

theorem ExtendedReal.sup_of_unbounded {E: Set Real} (hb: ¬ BddAbove E) : sup E = := E:Set Realhb:¬BddAbove Esup E = have hE : E.Nonempty := E:Set Realhb:¬BddAbove Esup E = E:Set Realhb:E = BddAbove E; All goals completed! 🐙 All goals completed! 🐙

Definition 5.5.10 (Supremum)

theorem ExtendedReal.sup_of_bounded {E: Set Real} (hnon: E.Nonempty) (hb: BddAbove E) : IsLUB E (sup E) := E:Set Realhnon:E.Nonemptyhb:BddAbove EIsLUB E (match sup E with | neg_infty => 0 | real x => x | infty => 0) E:Set Realhnon:E.Nonemptyhb:BddAbove EIsLUB E .choose; All goals completed! 🐙
theorem ExtendedReal.sup_of_bounded_finite {E: Set Real} (hnon: E.Nonempty) (hb: BddAbove E) : (sup E).IsFinite := E:Set Realhnon:E.Nonemptyhb:BddAbove E(sup E).IsFinite All goals completed! 🐙

Proposition 5.5.12

theorem declaration uses `sorry`Real.exist_sqrt_two : x:Real, x^2 = 2 := x, x ^ 2 = 2 -- This proof is written to follow the structure of the original text. E:Set Real := {y | y 0 y ^ 2 < 2} x, x ^ 2 = 2 have claim1: 2 upperBounds E := x, x ^ 2 = 2 E:Set Real := {y | y 0 y ^ 2 < 2} x E, x 2 intro y E:Set Real := {y | y 0 y ^ 2 < 2}y:Realhy:y Ey 2; E:Set Real := {y | y 0 y ^ 2 < 2}y:Realhy:0 y y ^ 2 < 2y 2; E:Set Real := {y | y 0 y ^ 2 < 2}y:Realhy:2 < y0 y 2 y ^ 2 E:Set Real := {y | y 0 y ^ 2 < 2}y:Realhy:2 < yhpos:0 y2 y ^ 2 calc _ 2 * 2 := E:Set Real := {y | y 0 y ^ 2 < 2}y:Realhy:2 < yhpos:0 y2 2 * 2 All goals completed! 🐙 _ y * y := E:Set Real := {y | y 0 y ^ 2 < 2}y:Realhy:2 < yhpos:0 y2 * 2 y * y All goals completed! 🐙 _ = y^2 := E:Set Real := {y | y 0 y ^ 2 < 2}y:Realhy:2 < yhpos:0 yy * y = y ^ 2 All goals completed! 🐙 have claim1' : BddAbove E := x, x ^ 2 = 2 E:Set Real := {y | y 0 y ^ 2 < 2}claim1:2 upperBounds E M, M upperBounds E; All goals completed! 🐙 have claim2: 1 E := x, x ^ 2 = 2 All goals completed! 🐙 E:Set Real := {y | y 0 y ^ 2 < 2}claim1:2 upperBounds Eclaim1':BddAbove Eclaim2:1 Eclaim2':E.Nonempty x, x ^ 2 = 2 E:Set Real := {y | y 0 y ^ 2 < 2}claim1:2 upperBounds Eclaim1':BddAbove Eclaim2:1 Eclaim2':E.Nonemptyx:Real := match ExtendedReal.sup E with | ExtendedReal.neg_infty => 0 | ExtendedReal.real x => x | ExtendedReal.infty => 0 x, x ^ 2 = 2 have claim3 : IsLUB E x := x, x ^ 2 = 2 All goals completed! 🐙 have claim4 : x 1 := x, x ^ 2 = 2 All goals completed! 🐙 have claim5 : x 2 := x, x ^ 2 = 2 All goals completed! 🐙 have claim6 : x.IsPos := x, x ^ 2 = 2 E:Set Real := {y | y 0 y ^ 2 < 2}claim1:2 upperBounds Eclaim1':BddAbove Eclaim2:1 Eclaim2':E.Nonemptyx:Real := match ExtendedReal.sup E with | ExtendedReal.neg_infty => 0 | ExtendedReal.real x => x | ExtendedReal.infty => 0claim3:IsLUB E xclaim4:x 1claim5:x 2x > 0; All goals completed! 🐙 E:Set Real := {y | y 0 y ^ 2 < 2}claim1:2 upperBounds Eclaim1':BddAbove Eclaim2:1 Eclaim2':E.Nonemptyx:Real := match ExtendedReal.sup E with | ExtendedReal.neg_infty => 0 | ExtendedReal.real x => x | ExtendedReal.infty => 0claim3:IsLUB E xclaim4:x 1claim5:x 2claim6:x.IsPosx ^ 2 = 2; E:Set Real := {y | y 0 y ^ 2 < 2}claim1:2 upperBounds Eclaim1':BddAbove Eclaim2:1 Eclaim2':E.Nonemptyx:Real := match ExtendedReal.sup E with | ExtendedReal.neg_infty => 0 | ExtendedReal.real x => x | ExtendedReal.infty => 0claim3:IsLUB E xclaim4:x 1claim5:x 2claim6:x.IsPosh:x ^ 2 > 2x ^ 2 = 2E:Set Real := {y | y 0 y ^ 2 < 2}claim1:2 upperBounds Eclaim1':BddAbove Eclaim2:1 Eclaim2':E.Nonemptyx:Real := match ExtendedReal.sup E with | ExtendedReal.neg_infty => 0 | ExtendedReal.real x => x | ExtendedReal.infty => 0claim3:IsLUB E xclaim4:x 1claim5:x 2claim6:x.IsPosh:x ^ 2 < 2x ^ 2 = 2E:Set Real := {y | y 0 y ^ 2 < 2}claim1:2 upperBounds Eclaim1':BddAbove Eclaim2:1 Eclaim2':E.Nonemptyx:Real := match ExtendedReal.sup E with | ExtendedReal.neg_infty => 0 | ExtendedReal.real x => x | ExtendedReal.infty => 0claim3:IsLUB E xclaim4:x 1claim5:x 2claim6:x.IsPosh:x ^ 2 = 2x ^ 2 = 2 E:Set Real := {y | y 0 y ^ 2 < 2}claim1:2 upperBounds Eclaim1':BddAbove Eclaim2:1 Eclaim2':E.Nonemptyx:Real := match ExtendedReal.sup E with | ExtendedReal.neg_infty => 0 | ExtendedReal.real x => x | ExtendedReal.infty => 0claim3:IsLUB E xclaim4:x 1claim5:x 2claim6:x.IsPosh:x ^ 2 > 2x ^ 2 = 2 have claim11: ε, 0 < ε ε < 1 x^2 - 4*ε > 2 := x, x ^ 2 = 2 E:Set Real := {y | y 0 y ^ 2 < 2}claim1:2 upperBounds Eclaim1':BddAbove Eclaim2:1 Eclaim2':E.Nonemptyx:Real := match ExtendedReal.sup E with | ExtendedReal.neg_infty => 0 | ExtendedReal.real x => x | ExtendedReal.infty => 0claim3:IsLUB E xclaim4:x 1claim5:x 2claim6:x.IsPosh:x ^ 2 > 2ε:Real := min (1 / 2) ((x ^ 2 - 2) / 8) ε, 0 < ε ε < 1 x ^ 2 - 4 * ε > 2 have hx : x^2 - 2 > 0 := x, x ^ 2 = 2 All goals completed! 🐙 have : 0 < ε := x, x ^ 2 = 2 All goals completed! 🐙 E:Set Real := {y | y 0 y ^ 2 < 2}claim1:2 upperBounds Eclaim1':BddAbove Eclaim2:1 Eclaim2':E.Nonemptyx:Real := match ExtendedReal.sup E with | ExtendedReal.neg_infty => 0 | ExtendedReal.real x => x | ExtendedReal.infty => 0claim3:IsLUB E xclaim4:x 1claim5:x 2claim6:x.IsPosh:x ^ 2 > 2ε:Real := min (1 / 2) ((x ^ 2 - 2) / 8)hx:x ^ 2 - 2 > 0:0 < εhε1:min (1 / 2) ((x ^ 2 - 2) / 8) 1 / 2 ε, 0 < ε ε < 1 x ^ 2 - 4 * ε > 2 E:Set Real := {y | y 0 y ^ 2 < 2}claim1:2 upperBounds Eclaim1':BddAbove Eclaim2:1 Eclaim2':E.Nonemptyx:Real := match ExtendedReal.sup E with | ExtendedReal.neg_infty => 0 | ExtendedReal.real x => x | ExtendedReal.infty => 0claim3:IsLUB E xclaim4:x 1claim5:x 2claim6:x.IsPosh:x ^ 2 > 2ε:Real := min (1 / 2) ((x ^ 2 - 2) / 8)hx:x ^ 2 - 2 > 0:0 < εhε1:min (1 / 2) ((x ^ 2 - 2) / 8) 1 / 2hε2:min (1 / 2) ((x ^ 2 - 2) / 8) (x ^ 2 - 2) / 8 ε, 0 < ε ε < 1 x ^ 2 - 4 * ε > 2 E:Set Real := {y | y 0 y ^ 2 < 2}claim1:2 upperBounds Eclaim1':BddAbove Eclaim2:1 Eclaim2':E.Nonemptyx:Real := match ExtendedReal.sup E with | ExtendedReal.neg_infty => 0 | ExtendedReal.real x => x | ExtendedReal.infty => 0claim3:IsLUB E xclaim4:x 1claim5:x 2claim6:x.IsPosh:x ^ 2 > 2ε:Real := min (1 / 2) ((x ^ 2 - 2) / 8)hx:x ^ 2 - 2 > 0:0 < εhε1:min (1 / 2) ((x ^ 2 - 2) / 8) 1 / 2hε2:min (1 / 2) ((x ^ 2 - 2) / 8) (x ^ 2 - 2) / 8ε < 1E:Set Real := {y | y 0 y ^ 2 < 2}claim1:2 upperBounds Eclaim1':BddAbove Eclaim2:1 Eclaim2':E.Nonemptyx:Real := match ExtendedReal.sup E with | ExtendedReal.neg_infty => 0 | ExtendedReal.real x => x | ExtendedReal.infty => 0claim3:IsLUB E xclaim4:x 1claim5:x 2claim6:x.IsPosh:x ^ 2 > 2ε:Real := min (1 / 2) ((x ^ 2 - 2) / 8)hx:x ^ 2 - 2 > 0:0 < εhε1:min (1 / 2) ((x ^ 2 - 2) / 8) 1 / 2hε2:min (1 / 2) ((x ^ 2 - 2) / 8) (x ^ 2 - 2) / 8x ^ 2 - 4 * ε > 2 E:Set Real := {y | y 0 y ^ 2 < 2}claim1:2 upperBounds Eclaim1':BddAbove Eclaim2:1 Eclaim2':E.Nonemptyx:Real := match ExtendedReal.sup E with | ExtendedReal.neg_infty => 0 | ExtendedReal.real x => x | ExtendedReal.infty => 0claim3:IsLUB E xclaim4:x 1claim5:x 2claim6:x.IsPosh:x ^ 2 > 2ε:Real := min (1 / 2) ((x ^ 2 - 2) / 8)hx:x ^ 2 - 2 > 0:0 < εhε1:min (1 / 2) ((x ^ 2 - 2) / 8) 1 / 2hε2:min (1 / 2) ((x ^ 2 - 2) / 8) (x ^ 2 - 2) / 8ε < 1E:Set Real := {y | y 0 y ^ 2 < 2}claim1:2 upperBounds Eclaim1':BddAbove Eclaim2:1 Eclaim2':E.Nonemptyx:Real := match ExtendedReal.sup E with | ExtendedReal.neg_infty => 0 | ExtendedReal.real x => x | ExtendedReal.infty => 0claim3:IsLUB E xclaim4:x 1claim5:x 2claim6:x.IsPosh:x ^ 2 > 2ε:Real := min (1 / 2) ((x ^ 2 - 2) / 8)hx:x ^ 2 - 2 > 0:0 < εhε1:min (1 / 2) ((x ^ 2 - 2) / 8) 1 / 2hε2:min (1 / 2) ((x ^ 2 - 2) / 8) (x ^ 2 - 2) / 8x ^ 2 - 4 * ε > 2 All goals completed! 🐙 E:Set Real := {y | y 0 y ^ 2 < 2}claim1:2 upperBounds Eclaim1':BddAbove Eclaim2:1 Eclaim2':E.Nonemptyx:Real := match ExtendedReal.sup E with | ExtendedReal.neg_infty => 0 | ExtendedReal.real x => x | ExtendedReal.infty => 0claim3:IsLUB E xclaim4:x 1claim5:x 2claim6:x.IsPosh:x ^ 2 > 2ε:Realhε1:0 < εhε2:ε < 1hε3:x ^ 2 - 4 * ε > 2x ^ 2 = 2 have claim12: (x-ε)^2 > 2 := calc _ = x^2 - 2 * ε * x + ε * ε := E:Set Real := {y | y 0 y ^ 2 < 2}claim1:2 upperBounds Eclaim1':BddAbove Eclaim2:1 Eclaim2':E.Nonemptyx:Real := match ExtendedReal.sup E with | ExtendedReal.neg_infty => 0 | ExtendedReal.real x => x | ExtendedReal.infty => 0claim3:IsLUB E xclaim4:x 1claim5:x 2claim6:x.IsPosh:x ^ 2 > 2ε:Realhε1:0 < εhε2:ε < 1hε3:x ^ 2 - 4 * ε > 2(x - ε) ^ 2 = x ^ 2 - 2 * ε * x + ε * ε All goals completed! 🐙 _ x^2 - 2 * ε * 2 + 0 * 0 := E:Set Real := {y | y 0 y ^ 2 < 2}claim1:2 upperBounds Eclaim1':BddAbove Eclaim2:1 Eclaim2':E.Nonemptyx:Real := match ExtendedReal.sup E with | ExtendedReal.neg_infty => 0 | ExtendedReal.real x => x | ExtendedReal.infty => 0claim3:IsLUB E xclaim4:x 1claim5:x 2claim6:x.IsPosh:x ^ 2 > 2ε:Realhε1:0 < εhε2:ε < 1hε3:x ^ 2 - 4 * ε > 2x ^ 2 - 2 * ε * x + ε * ε x ^ 2 - 2 * ε * 2 + 0 * 0 All goals completed! 🐙 _ = x^2 - 4 * ε := E:Set Real := {y | y 0 y ^ 2 < 2}claim1:2 upperBounds Eclaim1':BddAbove Eclaim2:1 Eclaim2':E.Nonemptyx:Real := match ExtendedReal.sup E with | ExtendedReal.neg_infty => 0 | ExtendedReal.real x => x | ExtendedReal.infty => 0claim3:IsLUB E xclaim4:x 1claim5:x 2claim6:x.IsPosh:x ^ 2 > 2ε:Realhε1:0 < εhε2:ε < 1hε3:x ^ 2 - 4 * ε > 2x ^ 2 - 2 * ε * 2 + 0 * 0 = x ^ 2 - 4 * ε All goals completed! 🐙 _ > 2 := hε3 have why (y:Real) (hy: y E) : x - ε y := x, x ^ 2 = 2 All goals completed! 🐙 have claim13: x-ε upperBounds E := x, x ^ 2 = 2 rwa [upperBound_defE:Set Real := {y | y 0 y ^ 2 < 2}claim1:2 upperBounds Eclaim1':BddAbove Eclaim2:1 Eclaim2':E.Nonemptyx:Real := match ExtendedReal.sup E with | ExtendedReal.neg_infty => 0 | ExtendedReal.real x => x | ExtendedReal.infty => 0claim3:IsLUB E xclaim4:x 1claim5:x 2claim6:x.IsPosh:x ^ 2 > 2ε:Realhε1:0 < εhε2:ε < 1hε3:x ^ 2 - 4 * ε > 2claim12:(x - ε) ^ 2 > 2why: y E, x - ε y x_1 E, x_1 x - ε have claim14: x x-ε := x, x ^ 2 = 2 All goals completed! 🐙 All goals completed! 🐙 E:Set Real := {y | y 0 y ^ 2 < 2}claim1:2 upperBounds Eclaim1':BddAbove Eclaim2:1 Eclaim2':E.Nonemptyx:Real := match ExtendedReal.sup E with | ExtendedReal.neg_infty => 0 | ExtendedReal.real x => x | ExtendedReal.infty => 0claim3:IsLUB E xclaim4:x 1claim5:x 2claim6:x.IsPosh:x ^ 2 < 2x ^ 2 = 2 have claim7 : ε, 0 < ε ε < 1 x^2 + 5*ε < 2 := x, x ^ 2 = 2 E:Set Real := {y | y 0 y ^ 2 < 2}claim1:2 upperBounds Eclaim1':BddAbove Eclaim2:1 Eclaim2':E.Nonemptyx:Real := match ExtendedReal.sup E with | ExtendedReal.neg_infty => 0 | ExtendedReal.real x => x | ExtendedReal.infty => 0claim3:IsLUB E xclaim4:x 1claim5:x 2claim6:x.IsPosh:x ^ 2 < 2ε:Real := min (1 / 2) ((2 - x ^ 2) / 10) ε, 0 < ε ε < 1 x ^ 2 + 5 * ε < 2 have hx : 2 - x^2 > 0 := x, x ^ 2 = 2 All goals completed! 🐙 have : 0 < ε := x, x ^ 2 = 2 All goals completed! 🐙 E:Set Real := {y | y 0 y ^ 2 < 2}claim1:2 upperBounds Eclaim1':BddAbove Eclaim2:1 Eclaim2':E.Nonemptyx:Real := match ExtendedReal.sup E with | ExtendedReal.neg_infty => 0 | ExtendedReal.real x => x | ExtendedReal.infty => 0claim3:IsLUB E xclaim4:x 1claim5:x 2claim6:x.IsPosh:x ^ 2 < 2ε:Real := min (1 / 2) ((2 - x ^ 2) / 10)hx:2 - x ^ 2 > 0:0 < εhε1:ε 1 / 2 ε, 0 < ε ε < 1 x ^ 2 + 5 * ε < 2 E:Set Real := {y | y 0 y ^ 2 < 2}claim1:2 upperBounds Eclaim1':BddAbove Eclaim2:1 Eclaim2':E.Nonemptyx:Real := match ExtendedReal.sup E with | ExtendedReal.neg_infty => 0 | ExtendedReal.real x => x | ExtendedReal.infty => 0claim3:IsLUB E xclaim4:x 1claim5:x 2claim6:x.IsPosh:x ^ 2 < 2ε:Real := min (1 / 2) ((2 - x ^ 2) / 10)hx:2 - x ^ 2 > 0:0 < εhε1:ε 1 / 2hε2:ε (2 - x ^ 2) / 10 ε, 0 < ε ε < 1 x ^ 2 + 5 * ε < 2 E:Set Real := {y | y 0 y ^ 2 < 2}claim1:2 upperBounds Eclaim1':BddAbove Eclaim2:1 Eclaim2':E.Nonemptyx:Real := match ExtendedReal.sup E with | ExtendedReal.neg_infty => 0 | ExtendedReal.real x => x | ExtendedReal.infty => 0claim3:IsLUB E xclaim4:x 1claim5:x 2claim6:x.IsPosh:x ^ 2 < 2ε:Real := min (1 / 2) ((2 - x ^ 2) / 10)hx:2 - x ^ 2 > 0:0 < εhε1:ε 1 / 2hε2:ε (2 - x ^ 2) / 10ε < 1E:Set Real := {y | y 0 y ^ 2 < 2}claim1:2 upperBounds Eclaim1':BddAbove Eclaim2:1 Eclaim2':E.Nonemptyx:Real := match ExtendedReal.sup E with | ExtendedReal.neg_infty => 0 | ExtendedReal.real x => x | ExtendedReal.infty => 0claim3:IsLUB E xclaim4:x 1claim5:x 2claim6:x.IsPosh:x ^ 2 < 2ε:Real := min (1 / 2) ((2 - x ^ 2) / 10)hx:2 - x ^ 2 > 0:0 < εhε1:ε 1 / 2hε2:ε (2 - x ^ 2) / 10x ^ 2 + 5 * ε < 2 E:Set Real := {y | y 0 y ^ 2 < 2}claim1:2 upperBounds Eclaim1':BddAbove Eclaim2:1 Eclaim2':E.Nonemptyx:Real := match ExtendedReal.sup E with | ExtendedReal.neg_infty => 0 | ExtendedReal.real x => x | ExtendedReal.infty => 0claim3:IsLUB E xclaim4:x 1claim5:x 2claim6:x.IsPosh:x ^ 2 < 2ε:Real := min (1 / 2) ((2 - x ^ 2) / 10)hx:2 - x ^ 2 > 0:0 < εhε1:ε 1 / 2hε2:ε (2 - x ^ 2) / 10ε < 1E:Set Real := {y | y 0 y ^ 2 < 2}claim1:2 upperBounds Eclaim1':BddAbove Eclaim2:1 Eclaim2':E.Nonemptyx:Real := match ExtendedReal.sup E with | ExtendedReal.neg_infty => 0 | ExtendedReal.real x => x | ExtendedReal.infty => 0claim3:IsLUB E xclaim4:x 1claim5:x 2claim6:x.IsPosh:x ^ 2 < 2ε:Real := min (1 / 2) ((2 - x ^ 2) / 10)hx:2 - x ^ 2 > 0:0 < εhε1:ε 1 / 2hε2:ε (2 - x ^ 2) / 10x ^ 2 + 5 * ε < 2 All goals completed! 🐙 E:Set Real := {y | y 0 y ^ 2 < 2}claim1:2 upperBounds Eclaim1':BddAbove Eclaim2:1 Eclaim2':E.Nonemptyx:Real := match ExtendedReal.sup E with | ExtendedReal.neg_infty => 0 | ExtendedReal.real x => x | ExtendedReal.infty => 0claim3:IsLUB E xclaim4:x 1claim5:x 2claim6:x.IsPosh:x ^ 2 < 2ε:Realhε1:0 < εhε2:ε < 1hε3:x ^ 2 + 5 * ε < 2x ^ 2 = 2 have claim8 : (x+ε)^2 < 2 := calc _ = x^2 + (2*x)*ε + ε*ε := E:Set Real := {y | y 0 y ^ 2 < 2}claim1:2 upperBounds Eclaim1':BddAbove Eclaim2:1 Eclaim2':E.Nonemptyx:Real := match ExtendedReal.sup E with | ExtendedReal.neg_infty => 0 | ExtendedReal.real x => x | ExtendedReal.infty => 0claim3:IsLUB E xclaim4:x 1claim5:x 2claim6:x.IsPosh:x ^ 2 < 2ε:Realhε1:0 < εhε2:ε < 1hε3:x ^ 2 + 5 * ε < 2(x + ε) ^ 2 = x ^ 2 + 2 * x * ε + ε * ε All goals completed! 🐙 _ x^2 + (2*2)*ε + 1*ε := E:Set Real := {y | y 0 y ^ 2 < 2}claim1:2 upperBounds Eclaim1':BddAbove Eclaim2:1 Eclaim2':E.Nonemptyx:Real := match ExtendedReal.sup E with | ExtendedReal.neg_infty => 0 | ExtendedReal.real x => x | ExtendedReal.infty => 0claim3:IsLUB E xclaim4:x 1claim5:x 2claim6:x.IsPosh:x ^ 2 < 2ε:Realhε1:0 < εhε2:ε < 1hε3:x ^ 2 + 5 * ε < 2x ^ 2 + 2 * x * ε + ε * ε x ^ 2 + 2 * 2 * ε + 1 * ε All goals completed! 🐙 _ = x^2 + 5*ε := E:Set Real := {y | y 0 y ^ 2 < 2}claim1:2 upperBounds Eclaim1':BddAbove Eclaim2:1 Eclaim2':E.Nonemptyx:Real := match ExtendedReal.sup E with | ExtendedReal.neg_infty => 0 | ExtendedReal.real x => x | ExtendedReal.infty => 0claim3:IsLUB E xclaim4:x 1claim5:x 2claim6:x.IsPosh:x ^ 2 < 2ε:Realhε1:0 < εhε2:ε < 1hε3:x ^ 2 + 5 * ε < 2x ^ 2 + 2 * 2 * ε + 1 * ε = x ^ 2 + 5 * ε All goals completed! 🐙 _ < 2 := hε3 have claim9 : x + ε E := x, x ^ 2 = 2 E:Set Real := {y | y 0 y ^ 2 < 2}claim1:2 upperBounds Eclaim1':BddAbove Eclaim2:1 Eclaim2':E.Nonemptyx:Real := match ExtendedReal.sup E with | ExtendedReal.neg_infty => 0 | ExtendedReal.real x => x | ExtendedReal.infty => 0claim3:IsLUB E xclaim4:x 1claim5:x 2claim6:x.IsPosh:x ^ 2 < 2ε:Realhε1:0 < εhε2:ε < 1hε3:x ^ 2 + 5 * ε < 2claim8:(x + ε) ^ 2 < 20 x + ε; All goals completed! 🐙 have claim10 : x + ε x := x, x ^ 2 = 2 All goals completed! 🐙 All goals completed! 🐙 All goals completed! 🐙

Remark 5.5.13

theorem declaration uses `sorry`Real.exist_irrational : x:Real, ¬ q:, x = (q:Real) := x, ¬ q, x = q All goals completed! 🐙

Helper lemma for Exercise 5.5.1.

theorem Real.mem_neg (E: Set Real) (x:Real) : x -E -x E := Set.mem_neg

Exercise 5.5.1

theorem declaration uses `sorry`Real.inf_neg {E: Set Real} {M:Real} (h: IsLUB E M) : IsGLB (-E) (-M) := E:Set RealM:Realh:IsLUB E MIsGLB (-E) (-M) All goals completed! 🐙
theorem declaration uses `sorry`Real.GLB_exist {E: Set Real} (hE: Set.Nonempty E) (hbound: BddBelow E): S, IsGLB E S := E:Set RealhE:E.Nonemptyhbound:BddBelow E S, IsGLB E S All goals completed! 🐙open Classical in noncomputable abbrev ExtendedReal.inf (E: Set Real) : ExtendedReal := if h1:E.Nonempty then (if h2:BddBelow E then ((Real.GLB_exist h1 h2).choose:Real) else ) else theorem ExtendedReal.inf_of_empty : inf = := inf = All goals completed! 🐙theorem ExtendedReal.inf_of_unbounded {E: Set Real} (hb: ¬ BddBelow E) : inf E = := E:Set Realhb:¬BddBelow Einf E = have hE : E.Nonempty := E:Set Realhb:¬BddBelow Einf E = E:Set Realhb:E = BddBelow E; All goals completed! 🐙 All goals completed! 🐙theorem ExtendedReal.inf_of_bounded {E: Set Real} (hnon: E.Nonempty) (hb: BddBelow E) : IsGLB E (inf E) := E:Set Realhnon:E.Nonemptyhb:BddBelow EIsGLB E (match inf E with | neg_infty => 0 | real x => x | infty => 0) E:Set Realhnon:E.Nonemptyhb:BddBelow EIsGLB E .choose; All goals completed! 🐙theorem ExtendedReal.inf_of_bounded_finite {E: Set Real} (hnon: E.Nonempty) (hb: BddBelow E) : (inf E).IsFinite := E:Set Realhnon:E.Nonemptyhb:BddBelow E(inf E).IsFinite All goals completed! 🐙

Exercise 5.5.5

theorem declaration uses `sorry`Real.irrat_between {x y:Real} (hxy: x < y) : z, x < z z < y ¬ q:, z = (q:Real) := x:Realy:Realhxy:x < y z, x < z z < y ¬ q, z = q All goals completed! 🐙
/- Use the notion of supremum in this section to define a Mathlib `sSup` operation -/ noncomputable instance Real.inst_SupSet : SupSet Real where sSup E := ((ExtendedReal.sup E):Real)

Use the sSup operation to build a conditionally complete lattice structure on Real.

noncomputable instance Real.inst_conditionallyCompleteLattice : ConditionallyCompleteLattice Real := conditionallyCompleteLatticeOfLatticeOfsSup Real ( (s : Set Real), BddAbove s s.Nonempty IsLUB s (sSup s) s✝:Set Reala✝¹:BddAbove s✝a✝:s✝.NonemptyIsLUB s✝ (sSup s✝); All goals completed! 🐙)
theorem ExtendedReal.sSup_of_bounded {E: Set Real} (hnon: E.Nonempty) (hb: BddAbove E) : IsLUB E (sSup E) := sup_of_bounded hnon hbend Chapter5