Аналіз I, Глава 5.4

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:

namespace Chapter5

Визначення 5.4.1 (sequences bounded away from zero with sign). Sequences are indexed to start from zero as this is more convenient for Mathlib purposes.

abbrev bounded_away_pos (a: ) : Prop := (c:), c > 0 n, a n c

Визначення 5.4.1 (sequences bounded away from zero with sign).

abbrev bounded_away_neg (a: ) : Prop := (c:), c > 0 n, a n -c

Визначення 5.4.1 (sequences bounded away from zero with sign).

theorem bounded_away_pos_def (a: ) : bounded_away_pos a (c:), c > 0 n, a n c := a: bounded_away_pos a c > 0, (n : ), a n c All goals completed! 🐙

Визначення 5.4.1 (sequences bounded away from zero with sign).

theorem bounded_away_neg_def (a: ) : bounded_away_neg a (c:), c > 0 n, a n -c := a: bounded_away_neg a c > 0, (n : ), a n -c All goals completed! 🐙

Приклади 5.4.2

declaration uses 'sorry'example : bounded_away_pos (fun n 1 + 10^(-(n:)-1)) := bounded_away_pos fun n => 1 + 10 ^ (-n - 1) All goals completed! 🐙

Приклади 5.4.2

declaration uses 'sorry'example : bounded_away_neg (fun n - - 10^(-(n:)-1)) := bounded_away_neg fun n => - -10 ^ (-n - 1) All goals completed! 🐙

Приклади 5.4.2

declaration uses 'sorry'example : ¬ bounded_away_pos (fun n (-1)^n) := ¬bounded_away_pos fun n => (-1) ^ n All goals completed! 🐙
declaration uses 'sorry'example : ¬ bounded_away_neg (fun n (-1)^n) := ¬bounded_away_neg fun n => (-1) ^ n All goals completed! 🐙declaration uses 'sorry'example : bounded_away_zero (fun n (-1)^n) := bounded_away_zero fun n => (-1) ^ n All goals completed! 🐙theorem declaration uses 'sorry'bounded_away_zero_of_pos {a: } (ha: bounded_away_pos a) : bounded_away_zero a := a: ha:bounded_away_pos abounded_away_zero a All goals completed! 🐙theorem declaration uses 'sorry'bounded_away_zero_of_neg {a: } (ha: bounded_away_neg a) : bounded_away_zero a := a: ha:bounded_away_neg abounded_away_zero a All goals completed! 🐙theorem declaration uses 'sorry'not_bounded_away_pos_neg {a: } : ¬ (bounded_away_pos a bounded_away_neg a) := a: ¬(bounded_away_pos a bounded_away_neg a) All goals completed! 🐙abbrev Real.isPos (x:Real) : Prop := a: , bounded_away_pos a (a:Sequence).isCauchy x = LIM aabbrev Real.isNeg (x:Real) : Prop := a: , bounded_away_neg a (a:Sequence).isCauchy x = LIM atheorem Real.isPos_def (x:Real) : Real.isPos x a: , bounded_away_pos a (a:Sequence).isCauchy x = LIM a := x:Realx.isPos a, bounded_away_pos a { n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchy x = LIM a All goals completed! 🐙theorem Real.isNeg_def (x:Real) : Real.isNeg x a: , bounded_away_neg a (a:Sequence).isCauchy x = LIM a := x:Realx.isNeg a, bounded_away_neg a { n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchy x = LIM a All goals completed! 🐙

Твердження 5.4.4 (basic properties of positive reals) / Вправа 5.4.1

theorem declaration uses 'sorry'Real.trichotomous (x:Real) : x = 0 x.isPos x.isNeg := x:Realx = 0 x.isPos x.isNeg All goals completed! 🐙

Твердження 5.4.4 (basic properties of positive reals) / Вправа 5.4.1

theorem declaration uses 'sorry'Real.not_zero_pos (x:Real) : ¬ (x = 0 x.isPos) := x:Real¬(x = 0 x.isPos) All goals completed! 🐙
theorem Real.nonzero_of_pos {x:Real} (hx: x.isPos) : x 0 := x:Realhx:x.isPosx 0 x:Realhx:x.isPosthis:¬(x = 0 x.isPos)x 0 x:Realhx:x.isPosthis:¬x = 0¬x = 0 All goals completed! 🐙

Твердження 5.4.4 (basic properties of positive reals) / Вправа 5.4.1

theorem declaration uses 'sorry'Real.not_zero_neg (x:Real) : ¬ (x = 0 x.isNeg) := x:Real¬(x = 0 x.isNeg) All goals completed! 🐙
theorem Real.nonzero_of_neg {x:Real} (hx: x.isNeg) : x 0 := x:Realhx:x.isNegx 0 x:Realhx:x.isNegthis:¬(x = 0 x.isNeg)x 0 x:Realhx:x.isNegthis:¬x = 0¬x = 0 All goals completed! 🐙

Твердження 5.4.4 (basic properties of positive reals) / Вправа 5.4.1

theorem declaration uses 'sorry'Real.not_pos_neg (x:Real) : ¬ (x.isPos x.isNeg) := x:Real¬(x.isPos x.isNeg) All goals completed! 🐙

Твердження 5.4.4 (basic properties of positive reals) / Вправа 5.4.1

@[simp] theorem declaration uses 'sorry'Real.neg_iff_pos_of_neg (x:Real) : x.isNeg (-x).isPos := x:Realx.isNeg (-x).isPos All goals completed! 🐙

Твердження 5.4.4 (basic properties of positive reals) / Вправа 5.4.1

theorem declaration uses 'sorry'Real.pos_add {x y:Real} (hx: x.isPos) (hy: y.isPos) : (x+y).isPos := x:Realy:Realhx:x.isPoshy:y.isPos(x + y).isPos All goals completed! 🐙

Твердження 5.4.4 (basic properties of positive reals) / Вправа 5.4.1

theorem declaration uses 'sorry'Real.pos_mul {x y:Real} (hx: x.isPos) (hy: y.isPos) : (x*y).isPos := x:Realy:Realhx:x.isPoshy:y.isPos(x * y).isPos All goals completed! 🐙
theorem declaration uses 'sorry'Real.pos_of_coe (q:) : (q:Real).isPos q > 0 := q:(↑q).isPos q > 0 All goals completed! 🐙theorem declaration uses 'sorry'Real.neg_of_coe (q:) : (q:Real).isNeg q < 0 := q:(↑q).isNeg q < 0 All goals completed! 🐙open Classical in /-- Need to use classical logic here because isPos and isNeg are not decidable -/ noncomputable abbrev Real.abs (x:Real) : Real := if x.isPos then x else (if x.isNeg then -x else 0)

Визначення 5.4.5 (absolute value)

@[simp] theorem Real.abs_of_pos (x:Real) (hx: x.isPos) : Real.abs x = x := x:Realhx:x.isPosx.abs = x All goals completed! 🐙

Визначення 5.4.5 (absolute value)

@[simp] theorem Real.abs_of_neg (x:Real) (hx: x.isNeg) : Real.abs x = -x := x:Realhx:x.isNegx.abs = -x have : ¬ x.isPos := x:Realhx:x.isNegx.abs = -x x:Realhx:x.isNegthis:¬(x.isPos x.isNeg)¬x.isPos; x:Realhx:x.isNegthis:¬x.isPos¬x.isPos; All goals completed! 🐙 All goals completed! 🐙

Визначення 5.4.5 (absolute value)

@[simp] theorem Real.abs_of_zero : Real.abs 0 = 0 := abs 0 = 0 have hpos: ¬ (0:Real).isPos := abs 0 = 0 this:¬(0 = 0 isPos 0)¬isPos 0 this:¬isPos 0¬isPos 0; All goals completed! 🐙 have hneg: ¬ (0:Real).isNeg := abs 0 = 0 hpos:¬isPos 0this:¬(0 = 0 isNeg 0)¬isNeg 0 hpos:¬isPos 0this:¬isNeg 0¬isNeg 0; All goals completed! 🐙 All goals completed! 🐙

Визначення 5.4.6 (Ordering of the reals)

instance Real.instLT : LT Real where lt x y := (x-y).isNeg

Визначення 5.4.6 (Ordering of the reals)

instance Real.instLE : LE Real where le x y := (x < y) (x = y)
theorem Real.lt_iff (x y:Real) : x < y (x-y).isNeg := x:Realy:Realx < y (x - y).isNeg All goals completed! 🐙theorem Real.le_iff (x y:Real) : x y (x < y) (x = y) := x:Realy:Realx y x < y x = y All goals completed! 🐙theorem declaration uses 'sorry'Real.gt_iff (x y:Real) : x > y (x-y).isPos := x:Realy:Realx > y (x - y).isPos All goals completed! 🐙theorem declaration uses 'sorry'Real.ge_iff (x y:Real) : x y (x > y) (x = y) := x:Realy:Realx y x > y x = y All goals completed! 🐙theorem declaration uses 'sorry'Real.lt_of_coe (q q':): q < q' (q:Real) < (q':Real) := q:q':q < q' q < q' All goals completed! 🐙theorem Real.gt_of_coe (q q':): q > q' (q:Real) > (q':Real) := Real.lt_of_coe _ _theorem declaration uses 'sorry'Real.isPos_iff (x:Real) : x.isPos x > 0 := x:Realx.isPos x > 0 All goals completed! 🐙theorem declaration uses 'sorry'Real.isNeg_iff (x:Real) : x.isNeg x < 0 := x:Realx.isNeg x < 0 All goals completed! 🐙

Твердження 5.4.7(a) (order trichotomy) / Вправа 5.4.2

theorem declaration uses 'sorry'Real.trichotomous' (x y:Real) : x > y x < y x = y := x:Realy:Realx > y x < y x = y All goals completed! 🐙

Твердження 5.4.7(a) (order trichotomy) / Вправа 5.4.2

theorem declaration uses 'sorry'Real.not_gt_and_lt (x y:Real) : ¬ (x > y x < y):= x:Realy:Real¬(x > y x < y) All goals completed! 🐙

Твердження 5.4.7(a) (order trichotomy) / Вправа 5.4.2

theorem declaration uses 'sorry'Real.not_gt_and_eq (x y:Real) : ¬ (x > y x = y):= x:Realy:Real¬(x > y x = y) All goals completed! 🐙

Твердження 5.4.7(a) (order trichotomy) / Вправа 5.4.2

theorem declaration uses 'sorry'Real.not_lt_and_eq (x y:Real) : ¬ (x < y x = y):= x:Realy:Real¬(x < y x = y) All goals completed! 🐙

Твердження 5.4.7(b) (order is anti-symmetric) / Вправа 5.4.2

theorem declaration uses 'sorry'Real.antisymm (x y:Real) : x < y (y - x).isPos := x:Realy:Realx < y (y - x).isPos All goals completed! 🐙

Твердження 5.4.7(c) (order is transitive) / Вправа 5.4.2

theorem declaration uses 'sorry'Real.lt_trans {x y z:Real} (hxy: x < y) (hyz: y < z) : x < z := x:Realy:Realz:Realhxy:x < yhyz:y < zx < z All goals completed! 🐙

Твердження 5.4.7(d) (addition preserves order) / Вправа 5.4.2

theorem declaration uses 'sorry'Real.add_lt_add_right {x y:Real} (z:Real) (hxy: x < y) : x + z < y + z := x:Realy:Realz:Realhxy:x < yx + z < y + z All goals completed! 🐙

Твердження 5.4.7(e) (positive multiplication preserves order) / Вправа 5.4.2

theorem Real.mul_lt_mul_right {x y z:Real} (hxy: x < y) (hz: z.isPos) : x * z < y * z := x:Realy:Realz:Realhxy:x < yhz:z.isPosx * z < y * z x:Realy:Realz:Realhxy:(y - x).isPoshz:z.isPos(y * z - x * z).isPos x:Realy:Realz:Realhxy:(y - x).isPoshz:z.isPosy * z - x * z = (y - x) * z All goals completed! 🐙

Твердження 5.4.7(e) (positive multiplication preserves order) / Вправа 5.4.2

theorem declaration uses 'sorry'Real.mul_le_mul_left {x y z:Real} (hxy: x y) (hz: z.isPos) : z * x z * y := x:Realy:Realz:Realhxy:x yhz:z.isPosz * x z * y All goals completed! 🐙
theorem declaration uses 'sorry'Real.mul_pos_neg {x y:Real} (hx: x.isPos) (hy: y.isNeg) : (x * y).isNeg := x:Realy:Realhx:x.isPoshy:y.isNeg(x * y).isNeg All goals completed! 🐙

(Не із книги) Real has the structure of a linear ordering. The order is not computable, and so classical logic is required to impose decidability.

noncomputable instance declaration uses 'sorry'declaration uses 'sorry'declaration uses 'sorry'declaration uses 'sorry'declaration uses 'sorry'declaration uses 'sorry'Real.instLinearOrder : LinearOrder Real where le_refl := sorry le_trans := sorry lt_iff_le_not_le := sorry le_antisymm := sorry le_total := sorry toDecidableLE := DecidableLE Real classical All goals completed! 🐙

Твердження 5.4.8

theorem Real.inv_of_pos {x:Real} (hx: x.isPos) : x⁻¹.isPos := x:Realhx:x.isPosx⁻¹.isPos x:Realhx:x.isPoshnon:x 0x⁻¹.isPos x:Realhx:x.isPoshnon:x 0hident:x * x⁻¹ = 1x⁻¹.isPos have hinv_non: x⁻¹ 0 := x:Realhx:x.isPosx⁻¹.isPos x:Realhx:x.isPoshnon:x 0hident:x⁻¹ = 0x * x⁻¹ 1; All goals completed! 🐙 have hnonneg : ¬ x⁻¹.isNeg := x:Realhx:x.isPosx⁻¹.isPos x:Realhx:x.isPoshnon:x 0hident:x * x⁻¹ = 1hinv_non:x⁻¹ 0h:x⁻¹.isNegFalse x:Realhx:x.isPoshnon:x 0hident:x * x⁻¹ = 1hinv_non:x⁻¹ 0h:x⁻¹.isNegthis:(x * x⁻¹).isNegFalse have id : -(1:Real) = (-1:) := x:Realhx:x.isPosx⁻¹.isPos All goals completed! 🐙 x:Realhx:x.isPoshnon:x 0hident:x * x⁻¹ = 1hinv_non:x⁻¹ 0h:x⁻¹.isNegid:-1 = (-1)this:-1 > 0False All goals completed! 🐙 x:Realhx:x.isPoshnon:x 0hident:x * x⁻¹ = 1hinv_non:x⁻¹ 0hnonneg:¬x⁻¹.isNegtrich:x⁻¹ = 0 x⁻¹.isPos x⁻¹.isNegx⁻¹.isPos x:Realhx:x.isPoshnon:x 0hident:x * x⁻¹ = 1hinv_non:x⁻¹ 0hnonneg:¬x⁻¹.isNegtrich:x⁻¹.isPosx⁻¹.isPos All goals completed! 🐙
theorem declaration uses 'sorry'Real.div_of_pos {x y:Real} (hx: x.isPos) (hy: y.isPos) : (x/y).isPos := x:Realy:Realhx:x.isPoshy:y.isPos(x / y).isPos All goals completed! 🐙theorem Real.inv_of_gt {x y:Real} (hx: x.isPos) (hy: y.isPos) (hxy: x > y) : x⁻¹ < y⁻¹ := x:Realy:Realhx:x.isPoshy:y.isPoshxy:x > yx⁻¹ < y⁻¹ x:Realy:Realhx:x.isPoshy:y.isPoshxy:x > yhxnon:x 0x⁻¹ < y⁻¹ x:Realy:Realhx:x.isPoshy:y.isPoshxy:x > yhxnon:x 0hynon:y 0x⁻¹ < y⁻¹ x:Realy:Realhx:x.isPoshy:y.isPoshxy:x > yhxnon:x 0hynon:y 0hxinv:x⁻¹.isPosx⁻¹ < y⁻¹ x:Realy:Realhx:x.isPoshy:y.isPoshxy:x > yhxnon:x 0hynon:y 0hxinv:x⁻¹.isPosthis:y⁻¹ x⁻¹False x:Realy:Realhx:x.isPoshy:y.isPoshxy:x > yhxnon:x 0hynon:y 0hxinv:x⁻¹.isPosthis✝:y⁻¹ x⁻¹this:1 > 1False All goals completed! 🐙

(Не із книги) Real has the structure of a strict ordered ring.

instance declaration uses 'sorry'Real.instIsStrictOrderedRing : IsStrictOrderedRing Real where add_le_add_left := (a b : Real), a b (c : Real), c + a c + b All goals completed! 🐙 add_le_add_right := (a b : Real), a b (c : Real), a + c b + c All goals completed! 🐙 mul_lt_mul_of_pos_left := (a b c : Real), a < b 0 < c c * a < c * b All goals completed! 🐙 mul_lt_mul_of_pos_right := (a b c : Real), a < b 0 < c a * c < b * c All goals completed! 🐙 le_of_add_le_add_left := (a b c : Real), a + b a + c b c All goals completed! 🐙 zero_le_one := 0 1 All goals completed! 🐙

Твердження 5.4.9 (The non-negative reals are closed)

theorem Real.LIM_of_nonneg {a: } (ha: n, a n 0) (hcauchy: (a:Sequence).isCauchy) : LIM a 0 := a: ha: (n : ), a n 0hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyLIM a 0 -- цей доказ написан так, щоб співпадати із структурою орігінального тексту. a: ha: (n : ), a n 0hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyhlim:LIM a < 0False a: ha: (n : ), a n 0hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyx:Real := LIM ahlim:x < 0False a: ha: (n : ), a n 0hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyx:Real := LIM ahlim: a, bounded_away_neg a { n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchy x = LIM aFalse a: ha: (n : ), a n 0hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyx:Real := LIM ab: hb:bounded_away_neg bhb_cauchy:{ n₀ := 0, seq := fun n => if n 0 then b n.toNat else 0, vanish := }.isCauchyhlim:x = LIM bFalse a: ha: (n : ), a n 0hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyx:Real := LIM ab: hb: c > 0, (n : ), b n -chb_cauchy:{ n₀ := 0, seq := fun n => if n 0 then b n.toNat else 0, vanish := }.isCauchyhlim:x = LIM bFalse a: ha: (n : ), a n 0hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyx:Real := LIM ab: hb_cauchy:{ n₀ := 0, seq := fun n => if n 0 then b n.toNat else 0, vanish := }.isCauchyhlim:x = LIM bc:cpos:c > 0hb: (n : ), b n -cFalse have claim1 : n, ¬ (c/2).close (a n) (b n) := a: ha: (n : ), a n 0hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyLIM a 0 a: ha: (n : ), a n 0hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyx:Real := LIM ab: hb_cauchy:{ n₀ := 0, seq := fun n => if n 0 then b n.toNat else 0, vanish := }.isCauchyhlim:x = LIM bc:cpos:c > 0hb: (n : ), b n -cn:¬(c / 2).close (a n) (b n) a: hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyx:Real := LIM ab: hb_cauchy:{ n₀ := 0, seq := fun n => if n 0 then b n.toNat else 0, vanish := }.isCauchyhlim:x = LIM bc:cpos:c > 0hb: (n : ), b n -cn:ha:a n 0¬(c / 2).close (a n) (b n) a: hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyx:Real := LIM ab: hb_cauchy:{ n₀ := 0, seq := fun n => if n 0 then b n.toNat else 0, vanish := }.isCauchyhlim:x = LIM bc:cpos:c > 0n:ha:a n 0hb:b n -c¬(c / 2).close (a n) (b n) a: hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyx:Real := LIM ab: hb_cauchy:{ n₀ := 0, seq := fun n => if n 0 then b n.toNat else 0, vanish := }.isCauchyhlim:x = LIM bc:cpos:c > 0n:ha:a n 0hb:b n -cc / 2 < |a n - b n| calc _ < c := a: hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyx:Real := LIM ab: hb_cauchy:{ n₀ := 0, seq := fun n => if n 0 then b n.toNat else 0, vanish := }.isCauchyhlim:x = LIM bc:cpos:c > 0n:ha:a n 0hb:b n -cc / 2 < c All goals completed! 🐙 _ a n - b n := a: hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyx:Real := LIM ab: hb_cauchy:{ n₀ := 0, seq := fun n => if n 0 then b n.toNat else 0, vanish := }.isCauchyhlim:x = LIM bc:cpos:c > 0n:ha:a n 0hb:b n -cc a n - b n All goals completed! 🐙 _ _ := le_abs_self _ have claim2 : ¬ (c/2).eventually_close (a:Sequence) (b:Sequence) := a: ha: (n : ), a n 0hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyLIM a 0 a: ha: (n : ), a n 0hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyx:Real := LIM ab: hb_cauchy:{ n₀ := 0, seq := fun n => if n 0 then b n.toNat else 0, vanish := }.isCauchyhlim:x = LIM bc:cpos:c > 0hb: (n : ), b n -cclaim1:(c / 2).eventually_close { n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := } { n₀ := 0, seq := fun n => if n 0 then b n.toNat else 0, vanish := } n, (c / 2).close (a n) (b n) a: ha: (n : ), a n 0hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyx:Real := LIM ab: hb_cauchy:{ n₀ := 0, seq := fun n => if n 0 then b n.toNat else 0, vanish := }.isCauchyhlim:x = LIM bc:cpos:c > 0hb: (n : ), b n -cclaim1: N, n N, |a n - b n| c / 2 n, (c / 2).close (a n) (b n) a: ha: (n : ), a n 0hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyx:Real := LIM ab: hb_cauchy:{ n₀ := 0, seq := fun n => if n 0 then b n.toNat else 0, vanish := }.isCauchyhlim:x = LIM bc:cpos:c > 0hb: (n : ), b n -cN:claim1: n N, |a n - b n| c / 2 n, (c / 2).close (a n) (b n) a: ha: (n : ), a n 0hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyx:Real := LIM ab: hb_cauchy:{ n₀ := 0, seq := fun n => if n 0 then b n.toNat else 0, vanish := }.isCauchyhlim:x = LIM bc:cpos:c > 0hb: (n : ), b n -cN:claim1:|a N - b N| c / 2 n, (c / 2).close (a n) (b n) a: ha: (n : ), a n 0hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyx:Real := LIM ab: hb_cauchy:{ n₀ := 0, seq := fun n => if n 0 then b n.toNat else 0, vanish := }.isCauchyhlim:x = LIM bc:cpos:c > 0hb: (n : ), b n -cN:claim1:|a N - b N| c / 2(c / 2).close (a N) (b N) rwa [Section_4_3.close_iffa: ha: (n : ), a n 0hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyx:Real := LIM ab: hb_cauchy:{ n₀ := 0, seq := fun n => if n 0 then b n.toNat else 0, vanish := }.isCauchyhlim:x = LIM bc:cpos:c > 0hb: (n : ), b n -cN:claim1:|a N - b N| c / 2|a N - b N| c / 2 have claim3 : ¬ Sequence.equiv a b := a: ha: (n : ), a n 0hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyLIM a 0 a: ha: (n : ), a n 0hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyx:Real := LIM ab: hb_cauchy:{ n₀ := 0, seq := fun n => if n 0 then b n.toNat else 0, vanish := }.isCauchyhlim:x = LIM bc:cpos:c > 0hb: (n : ), b n -cclaim1: (n : ), ¬(c / 2).close (a n) (b n)claim2:Sequence.equiv a b(c / 2).eventually_close { n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := } { n₀ := 0, seq := fun n => if n 0 then b n.toNat else 0, vanish := } a: ha: (n : ), a n 0hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyx:Real := LIM ab: hb_cauchy:{ n₀ := 0, seq := fun n => if n 0 then b n.toNat else 0, vanish := }.isCauchyhlim:x = LIM bc:cpos:c > 0hb: (n : ), b n -cclaim1: (n : ), ¬(c / 2).close (a n) (b n)claim2: ε > 0, ε.eventually_close { n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := } { n₀ := 0, seq := fun n => if n 0 then b n.toNat else 0, vanish := }(c / 2).eventually_close { n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := } { n₀ := 0, seq := fun n => if n 0 then b n.toNat else 0, vanish := } All goals completed! 🐙 a: ha: (n : ), a n 0hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyx:Real := LIM ab: hb_cauchy:{ n₀ := 0, seq := fun n => if n 0 then b n.toNat else 0, vanish := }.isCauchyc:cpos:c > 0hb: (n : ), b n -cclaim1: (n : ), ¬(c / 2).close (a n) (b n)claim2:¬(c / 2).eventually_close { n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := } { n₀ := 0, seq := fun n => if n 0 then b n.toNat else 0, vanish := }claim3:¬Sequence.equiv a bhlim:Sequence.equiv a bFalse All goals completed! 🐙

Наслідок 5.4.10

theorem Real.LIM_mono {a b: } (ha: (a:Sequence).isCauchy) (hb: (b:Sequence).isCauchy) (hmono: n, a n b n) : LIM a LIM b := a: b: ha:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyhb:{ n₀ := 0, seq := fun n => if n 0 then b n.toNat else 0, vanish := }.isCauchyhmono: (n : ), a n b nLIM a LIM b -- цей доказ написан так, щоб співпадати із структурою орігінального тексту. have := LIM_of_nonneg (a := b - a) (a: b: ha:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyhb:{ n₀ := 0, seq := fun n => if n 0 then b n.toNat else 0, vanish := }.isCauchyhmono: (n : ), a n b n (n : ), (b - a) n 0 a: b: ha:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyhb:{ n₀ := 0, seq := fun n => if n 0 then b n.toNat else 0, vanish := }.isCauchyhmono: (n : ), a n b nn:(b - a) n 0; All goals completed! 🐙) (sub_of_cauchy hb ha) a: b: ha:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyhb:{ n₀ := 0, seq := fun n => if n 0 then b n.toNat else 0, vanish := }.isCauchyhmono: (n : ), a n b nthis:LIM b - LIM a 0LIM a LIM b All goals completed! 🐙

Ремарка 5.4.11 -

theorem declaration uses 'sorry'Real.LIM_mono_fail : (a b: ), (a:Sequence).isCauchy (b:Sequence).isCauchy ¬ ( n, a n > b n) ¬ LIM a > LIM b := a b, { n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchy { n₀ := 0, seq := fun n => if n 0 then b n.toNat else 0, vanish := }.isCauchy (¬ (n : ), a n > b n) ¬LIM a > LIM b b, { n₀ := 0, seq := fun n => if n 0 then (fun n => 1 + 1 / n) n.toNat else 0, vanish := }.isCauchy { n₀ := 0, seq := fun n => if n 0 then b n.toNat else 0, vanish := }.isCauchy (¬ (n : ), (fun n => 1 + 1 / n) n > b n) ¬(LIM fun n => 1 + 1 / n) > LIM b { n₀ := 0, seq := fun n => if n 0 then 1 + 1 / n.toNat else 0, vanish := }.isCauchy { n₀ := 0, seq := fun n => if n 0 then (fun n => 1 - 1 / n) n.toNat else 0, vanish := }.isCauchy (¬ (n : ), 1 + 1 / n > (fun n => 1 - 1 / n) n) ¬(LIM fun n => 1 + 1 / n) > LIM fun n => 1 - 1 / n All goals completed! 🐙

Твердження 5.4.12 (Bounding reals by rationals)

theorem Real.exists_rat_le_and_nat_ge {x:Real} (hx: x.isPos) : ( q:, q > 0 (q:Real) x) N:, x < (N:Real) := x:Realhx:x.isPos(∃ q > 0, q x) N, x < N -- цей доказ написан так, щоб співпадати із структурою орігінального тексту. x:Realhx: a, bounded_away_pos a { n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchy x = LIM a(∃ q > 0, q x) N, x < N x:Reala: hbound:bounded_away_pos ahcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyheq:x = LIM a(∃ q > 0, q x) N, x < N x:Reala: hbound:bounded_away_pos ahcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyheq:x = LIM athis:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isBounded(∃ q > 0, q x) N, x < N x:Reala: hbound: c > 0, (n : ), a n chcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyheq:x = LIM athis:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isBounded(∃ q > 0, q x) N, x < N x:Reala: hbound: c > 0, (n : ), a n chcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyheq:x = LIM athis: M 0, { n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.BoundedBy M(∃ q > 0, q x) N, x < N x:Reala: hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyheq:x = LIM athis: M 0, { n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.BoundedBy Mq:hq:q > 0hbound: (n : ), a n q(∃ q > 0, q x) N, x < N x:Reala: hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyheq:x = LIM aq:hq:q > 0hbound: (n : ), a n qr:hr:r 0this:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.BoundedBy r(∃ q > 0, q x) N, x < N x:Reala: hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyheq:x = LIM aq:hq:q > 0hbound: (n : ), a n qr:hr:r 0this: (n : ), |if 0 n then a n.toNat else 0| r(∃ q > 0, q x) N, x < N x:Reala: hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyheq:x = LIM aq:hq:q > 0hbound: (n : ), a n qr:hr:r 0this: (n : ), |if 0 n then a n.toNat else 0| r q > 0, q xx:Reala: hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyheq:x = LIM aq:hq:q > 0hbound: (n : ), a n qr:hr:r 0this: (n : ), |if 0 n then a n.toNat else 0| r N, x < N x:Reala: hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyheq:x = LIM aq:hq:q > 0hbound: (n : ), a n qr:hr:r 0this: (n : ), |if 0 n then a n.toNat else 0| r q > 0, q x x:Reala: hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyheq:x = LIM aq:hq:q > 0hbound: (n : ), a n qr:hr:r 0this: (n : ), |if 0 n then a n.toNat else 0| rq x x:Reala: hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyheq:x = LIM aq:hq:q > 0hbound: (n : ), a n qr:hr:r 0this: (n : ), |if 0 n then a n.toNat else 0| rq = LIM fun n => qx:Reala: hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyheq:x = LIM aq:hq:q > 0hbound: (n : ), a n qr:hr:r 0this: (n : ), |if 0 n then a n.toNat else 0| r{ n₀ := 0, seq := fun n => if n 0 then q else 0, vanish := }.isCauchy x:Reala: hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyheq:x = LIM aq:hq:q > 0hbound: (n : ), a n qr:hr:r 0this: (n : ), |if 0 n then a n.toNat else 0| rq = LIM fun n => q All goals completed! 🐙 All goals completed! 🐙 x:Reala: hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyheq:x = LIM aq:hq:q > 0hbound: (n : ), a n qr:hr:r 0this: (n : ), |if 0 n then a n.toNat else 0| rN:hN:r < N N, x < N x:Reala: hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyheq:x = LIM aq:hq:q > 0hbound: (n : ), a n qr:hr:r 0this: (n : ), |if 0 n then a n.toNat else 0| rN:hN:r < Nx < N calc x r := x:Reala: hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyheq:x = LIM aq:hq:q > 0hbound: (n : ), a n qr:hr:r 0this: (n : ), |if 0 n then a n.toNat else 0| rN:hN:r < Nx r x:Reala: hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyheq:x = LIM aq:hq:q > 0hbound: (n : ), a n qr:hr:r 0this: (n : ), |if 0 n then a n.toNat else 0| rN:hN:r < Nx LIM fun x => r x:Reala: hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyheq:x = LIM aq:hq:q > 0hbound: (n : ), a n qr:hr:r 0this: (n : ), |if 0 n then a n.toNat else 0| rN:hN:r < N{ n₀ := 0, seq := fun n => if n 0 then r else 0, vanish := }.isCauchyx:Reala: hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyheq:x = LIM aq:hq:q > 0hbound: (n : ), a n qr:hr:r 0this: (n : ), |if 0 n then a n.toNat else 0| rN:hN:r < N (n : ), a n r x:Reala: hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyheq:x = LIM aq:hq:q > 0hbound: (n : ), a n qr:hr:r 0this: (n : ), |if 0 n then a n.toNat else 0| rN:hN:r < N{ n₀ := 0, seq := fun n => if n 0 then r else 0, vanish := }.isCauchy All goals completed! 🐙 x:Reala: hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyheq:x = LIM aq:hq:q > 0hbound: (n : ), a n qr:hr:r 0this: (n : ), |if 0 n then a n.toNat else 0| rN:hN:r < Nn:a n r x:Reala: hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyheq:x = LIM aq:hq:q > 0hbound: (n : ), a n qr:hr:r 0N:hN:r < Nn:this:|if 0 n then a (↑n).toNat else 0| ra n r x:Reala: hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyheq:x = LIM aq:hq:q > 0hbound: (n : ), a n qr:hr:r 0N:hN:r < Nn:this:|a n| ra n r All goals completed! 🐙 _ < ((N:):Real) := x:Reala: hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyheq:x = LIM aq:hq:q > 0hbound: (n : ), a n qr:hr:r 0this: (n : ), |if 0 n then a n.toNat else 0| rN:hN:r < Nr < N All goals completed! 🐙 _ = N := x:Reala: hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyheq:x = LIM aq:hq:q > 0hbound: (n : ), a n qr:hr:r 0this: (n : ), |if 0 n then a n.toNat else 0| rN:hN:r < NN = N All goals completed! 🐙

Наслідок 5.4.13 (Archimedean property )

theorem Real.le_mul {ε:Real} (: ε.isPos) (x:Real) : M:, M > 0 M * ε > x := ε:Real:ε.isPosx:Real M > 0, M * ε > x -- цей доказ написан так, щоб співпадати із структурою орігінального тексту. ε:Real:ε.isPosx:Realhx:x = 0 M > 0, M * ε > xε:Real:ε.isPosx:Realhx:x.isPos M > 0, M * ε > xε:Real:ε.isPosx:Realhx:x.isNeg M > 0, M * ε > x ε:Real:ε.isPosx:Realhx:x = 0 M > 0, M * ε > x ε:Real:ε.isPosx:Realhx:x = 01 > 0 1 * ε > x; ε:Real:ε > 0x:Realhx:x = 01 > 0 1 * ε > x; All goals completed! 🐙 ε:Real:ε.isPosx:Realhx:x.isPos M > 0, M * ε > x ε:Real:ε.isPosx:Realhx:x.isPosN:hN:x / ε < N M > 0, M * ε > x ε:Real:ε.isPosx:Realhx:x.isPosN:hN:x / ε < NM: := N + 1 M > 0, M * ε > x refine M, ε:Real:ε.isPosx:Realhx:x.isPosN:hN:x / ε < NM: := N + 1M > 0 All goals completed! 🐙, ?_ replace hN : x/ε < M := hN.trans (ε:Real:ε.isPosx:Realhx:x.isPosN:hN:x / ε < NM: := N + 1N < M All goals completed! 🐙) ε:Real:ε.isPosx:Realhx:x.isPosN:M: := N + 1hN:x / ε * ε < M * εM * ε > x ε:Real:ε.isPosx:Realhx:x.isPosN:M: := N + 1hN:x / ε * ε < M * εx < M * ε ε:Real:ε.isPosx:Realhx:x.isPosN:M: := N + 1hN:x / ε * ε < M * εx = x / ε * ε ε:Real:ε > 0x:Realhx:x.isPosN:M: := N + 1hN:x / ε * ε < M * εx = x / ε * ε All goals completed! 🐙 ε:Real:ε.isPosx:Realhx:x.isNeg1 > 0 1 * ε > x ε:Real:ε > 0x:Realhx:x.isNeg1 > 0 1 * ε > x ε:Real:ε > 0x:Realhx:x < 01 > 0 1 * ε > x ε:Real:ε > 0x:Realhx:x < 0x < ε All goals completed! 🐙

Твердження 5.4.14 / Вправа 5.4.5

theorem declaration uses 'sorry'Real.rat_between {x y:Real} (hxy: x < y) : q:, x < (q:Real) (q:Real) < y := x:Realy:Realhxy:x < y q, x < q q < y All goals completed! 🐙

Вправа 5.4.3

theorem declaration uses 'sorry'Real.floor_exist (x:Real) : n:, (n:Real) x x < (n:Real)+1 := x:Real n, n x x < n + 1 All goals completed! 🐙

Вправа 5.4.4

theorem declaration uses 'sorry'Real.exist_inv_nat_le {x:Real} (hx: x.isPos) : N, N>0 (N:Real)⁻¹ < x := x:Realhx:x.isPos N > 0, N⁻¹ < x All goals completed! 🐙

Вправа 5.4.6

theorem declaration uses 'sorry'Real.dist_lt_iff (ε x y:Real) : |x-y| < ε y-ε < x x < y+ε := ε:Realx:Realy:Real|x - y| < ε y - ε < x x < y + ε All goals completed! 🐙

Вправа 5.4.6

theorem declaration uses 'sorry'Real.dist_le_iff (ε x y:Real) : |x-y| ε y-ε x x y+ε := ε:Realx:Realy:Real|x - y| ε y - ε x x y + ε All goals completed! 🐙

Вправа 5.4.7

theorem declaration uses 'sorry'Real.le_add_eps_iff (x y:Real) : ε > 0, x y+ε x y := x:Realy:Real ε > 0, x y + ε x y All goals completed! 🐙

Вправа 5.4.7

theorem declaration uses 'sorry'Real.dist_le_eps_iff (x y:Real) : ε > 0, |x-y| ε x = y := x:Realy:Real ε > 0, |x - y| ε x = y All goals completed! 🐙

Вправа 5.4.8

theorem declaration uses 'sorry'Real.LIM_of_le {x:Real} {a: } (hcauchy: (a:Sequence).isCauchy) (h: n, a n x) : LIM a x := x:Reala: hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyh: (n : ), (a n) xLIM a x All goals completed! 🐙

Вправа 5.4.8

theorem declaration uses 'sorry'Real.LIM_of_ge {x:Real} {a: } (hcauchy: (a:Sequence).isCauchy) (h: n, a n x) : LIM a x := x:Reala: hcauchy:{ n₀ := 0, seq := fun n => if n 0 then a n.toNat else 0, vanish := }.isCauchyh: (n : ), (a n) xLIM a x All goals completed! 🐙
theorem Real.max_eq (x y:Real) : max x y = (if x y then x else y) := max_def' x ytheorem Real.min_eq (x y:Real) : min x y = (if x y then x else y) := rfl

Вправа 5.4.9

theorem declaration uses 'sorry'Real.neg_max (x y:Real) : max x y = - min (-x) (-y) := x:Realy:Realmax x y = -min (-x) (-y) All goals completed! 🐙

Вправа 5.4.9

theorem declaration uses 'sorry'Real.neg_min (x y:Real) : min x y = - max (-x) (-y) := x:Realy:Realmin x y = -max (-x) (-y) All goals completed! 🐙

Вправа 5.4.9

theorem declaration uses 'sorry'Real.max_comm (x y:Real) : max x y = max y x := x:Realy:Realmax x y = max y x All goals completed! 🐙

Вправа 5.4.9

theorem declaration uses 'sorry'Real.max_self (x:Real) : max x x = x := x:Realmax x x = x All goals completed! 🐙

Вправа 5.4.9

theorem declaration uses 'sorry'Real.max_add (x y z:Real) : max (x + z) (y + z) = max x y + z := x:Realy:Realz:Realmax (x + z) (y + z) = max x y + z All goals completed! 🐙

Вправа 5.4.9

theorem declaration uses 'sorry'Real.max_mul (x y :Real) {z:Real} (hz: z.isPos) : max (x * z) (y * z) = max x y * z := x:Realy:Realz:Realhz:z.isPosmax (x * z) (y * z) = max x y * z All goals completed! 🐙
/- Additional exercise: What happens if z is negative? -/

Вправа 5.4.9

theorem declaration uses 'sorry'Real.min_comm (x y:Real) : min x y = min y x := x:Realy:Realmin x y = min y x All goals completed! 🐙

Вправа 5.4.9

theorem declaration uses 'sorry'Real.min_self (x:Real) : min x x = x := x:Realmin x x = x All goals completed! 🐙

Вправа 5.4.9

theorem declaration uses 'sorry'Real.min_add (x y z:Real) : min (x + z) (y + z) = min x y + z := x:Realy:Realz:Realmin (x + z) (y + z) = min x y + z All goals completed! 🐙

Вправа 5.4.9

theorem declaration uses 'sorry'Real.min_mul (x y :Real) {z:Real} (hz: z.isPos) : min (x * z) (y * z) = min x y * z := x:Realy:Realz:Realhz:z.isPosmin (x * z) (y * z) = min x y * z All goals completed! 🐙

Вправа 5.4.9

theorem declaration uses 'sorry'Real.inv_max {x y :Real} (hx:x.isPos) (hy:y.isPos) : (max x y)⁻¹ = min x⁻¹ y⁻¹ := x:Realy:Realhx:x.isPoshy:y.isPos(max x y)⁻¹ = min x⁻¹ y⁻¹ All goals completed! 🐙

Вправа 5.4.9

theorem declaration uses 'sorry'Real.inv_min {x y :Real} (hx:x.isPos) (hy:y.isPos) : (min x y)⁻¹ = max x⁻¹ y⁻¹ := x:Realy:Realhx:x.isPoshy:y.isPos(min x y)⁻¹ = max x⁻¹ y⁻¹ All goals completed! 🐙

Not from textbook: the rationals map as an ordered ring homomorphism into the reals.

abbrev declaration uses 'sorry'Real.ratCast_ordered_hom : →+*o Real where toRingHom := ratCast_hom monotone' := Monotone (↑ratCast_hom).toFun All goals completed! 🐙
end Chapter5