Analysis I, Section 6.5: Some standard limits

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 Chapter6theorem declaration uses 'sorry'Sequence.lim_of_const (c:) : ((fun (_:) c):Sequence).TendsTo c := c:(↑fun x => c).TendsTo c All goals completed! 🐙instance Sequence.inst_pow: Pow Sequence where pow a k := { m := a.m seq n := if n a.m then a n ^ k else 0 vanish := a:Sequencek: n < a.m, (if n a.m then a.seq n ^ k else 0) = 0 All goals completed! 🐙 }@[simp] lemma Sequence.pow_eval {a:Sequence} {k: } {n: } (hn : n a.m): (a ^ k) n = a n ^ k := a:Sequencek:n:hn:n a.m(a ^ k).seq n = a.seq n ^ k a:Sequencek:n:hn:n a.m({ hPow := fun a b => { pow := fun a k => { m := a.m, seq := fun n => if n a.m then a.seq n ^ k else 0, vanish := } }.1 a b }.1 a k).seq n = a.seq n ^ k All goals completed! 🐙@[simp] lemma Sequence.pow_one (a:Sequence) : a^1 = a := a:Sequencea ^ 1 = a a:Sequence(a ^ 1).m = a.ma:Sequencen:(a ^ 1).seq n = a.seq n; a:Sequencen:(a ^ 1).seq n = a.seq n; a:Sequencen:(if n a.m then Monoid.npow 1 (a.seq n) else 0) = a.seq n; a:Sequencen:h:n a.mMonoid.npow 1 (a.seq n) = a.seq na:Sequencen:h:¬n a.m0 = a.seq n; a:Sequencen:h:¬n a.m0 = a.seq n; All goals completed! 🐙lemma Sequence.pow_succ (a:Sequence) (k:): a^(k+1) = a^k * a := a:Sequencek:a ^ (k + 1) = a ^ k * a a:Sequencek:(a ^ (k + 1)).m = (a ^ k * a).ma:Sequencek:x:(a ^ (k + 1)).seq x = (a ^ k * a).seq x a:Sequencek:(a ^ (k + 1)).m = (a ^ k * a).m a:Sequencek:(a ^ k * a).m = (a ^ (k + 1)).m; All goals completed! 🐙 a:Sequencek:x:(a ^ (k + 1)).seq x = (a ^ k * a).seq x a:Sequencek:x:(a ^ (k + 1)).seq x = (a ^ k).seq x * a.seq x a:Sequencek:x:h:x a.m(a ^ (k + 1)).seq x = (a ^ k).seq x * a.seq xa:Sequencek:x:h:¬x a.m(a ^ (k + 1)).seq x = (a ^ k).seq x * a.seq x a:Sequencek:x:h:x a.m(a ^ (k + 1)).seq x = (a ^ k).seq x * a.seq x a:Sequencek:x:h:x a.ma.seq x ^ (k + 1) = a.seq x ^ k * a.seq x All goals completed! 🐙 a:Sequencek:x:h:¬x a.m(a ^ (k + 1)).seq x = (a ^ k).seq x * a.seq x a:Sequencek:x:h:¬x a.m(a ^ (k + 1)).seq x = 0 exact vanish _ _ (a:Sequencek:x:h:¬x a.mx < (a ^ (k + 1)).m a:Sequencek:x:h:x < a.mx < (a ^ (k + 1)).m; All goals completed! 🐙)

Corollary 6.5.1

theorem Sequence.lim_of_power_decay {k:} : ((fun (n:) 1/((n:)+1)^(1/(k+1:))):Sequence).TendsTo 0 := k:(↑fun n => 1 / (n + 1) ^ (1 / (k + 1))).TendsTo 0 -- This proof is written to follow the structure of the original text. k:a:Chapter6.Sequence := fun n => 1 / (n + 1) ^ (1 / (_fvar.7919 + 1))a.TendsTo 0 have ha : a.BddBelow := k:(↑fun n => 1 / (n + 1) ^ (1 / (k + 1))).TendsTo 0 k:a:Chapter6.Sequence := fun n => 1 / (n + 1) ^ (1 / (_fvar.7919 + 1))a.BddBelowBy 0; k:a:Chapter6.Sequence := fun n => 1 / (n + 1) ^ (1 / (_fvar.7919 + 1))n:a✝:n a.ma.seq n 0; k:a:Chapter6.Sequence := fun n => 1 / (n + 1) ^ (1 / (_fvar.7919 + 1))n:a✝:n a.m0 if 0 n then ((n.toNat + 1) ^ (k + 1)⁻¹)⁻¹ else 0; All goals completed! 🐙 have ha' : a.IsAntitone := k:(↑fun n => 1 / (n + 1) ^ (1 / (k + 1))).TendsTo 0 k:a:Chapter6.Sequence := fun n => 1 / (n + 1) ^ (1 / (_fvar.7919 + 1))ha:Chapter6.Sequence.BddBelow _fvar.8506 := ?_mvar.8546n:hn:n a.ma.seq (n + 1) a.seq n; k:a:Chapter6.Sequence := fun n => 1 / (n + 1) ^ (1 / (_fvar.7919 + 1))ha:Chapter6.Sequence.BddBelow _fvar.8506 := ?_mvar.8546n:hn:n a.mhn':0 n + 1a.seq (n + 1) a.seq n; k:a:Chapter6.Sequence := fun n => 1 / (n + 1) ^ (1 / (_fvar.7919 + 1))ha:Chapter6.Sequence.BddBelow _fvar.8506 := ?_mvar.8546n:hn:n a.mhn':0 n + 1(((n + 1).toNat + 1) ^ (k + 1)⁻¹)⁻¹ ((n.toNat + 1) ^ (k + 1)⁻¹)⁻¹ k:a:Chapter6.Sequence := fun n => 1 / (n + 1) ^ (1 / (_fvar.7919 + 1))ha:Chapter6.Sequence.BddBelow _fvar.8506 := ?_mvar.8546n:hn:n a.mhn':0 n + 1n.toNat + 1 (n + 1).toNat + 1k:a:Chapter6.Sequence := fun n => 1 / (n + 1) ^ (1 / (_fvar.7919 + 1))ha:Chapter6.Sequence.BddBelow _fvar.8506 := ?_mvar.8546n:hn:n a.mhn':0 n + 10 n.toNat + 1k:a:Chapter6.Sequence := fun n => 1 / (n + 1) ^ (1 / (_fvar.7919 + 1))ha:Chapter6.Sequence.BddBelow _fvar.8506 := ?_mvar.8546n:hn:n a.mhn':0 n + 10 (n + 1).toNat + 1k:a:Chapter6.Sequence := fun n => 1 / (n + 1) ^ (1 / (_fvar.7919 + 1))ha:Chapter6.Sequence.BddBelow _fvar.8506 := ?_mvar.8546n:hn:n a.mhn':0 n + 10 < (k + 1)⁻¹k:a:Chapter6.Sequence := fun n => 1 / (n + 1) ^ (1 / (_fvar.7919 + 1))ha:Chapter6.Sequence.BddBelow _fvar.8506 := ?_mvar.8546n:hn:n a.mhn':0 n + 10 < ((n + 1).toNat + 1) ^ (k + 1)⁻¹k:a:Chapter6.Sequence := fun n => 1 / (n + 1) ^ (1 / (_fvar.7919 + 1))ha:Chapter6.Sequence.BddBelow _fvar.8506 := ?_mvar.8546n:hn:n a.mhn':0 n + 10 < (n.toNat + 1) ^ (k + 1)⁻¹ k:a:Chapter6.Sequence := fun n => 1 / (n + 1) ^ (1 / (_fvar.7919 + 1))ha:Chapter6.Sequence.BddBelow _fvar.8506 := ?_mvar.8546n:hn:n a.mhn':0 n + 1n.toNat + 1 (n + 1).toNat + 1k:a:Chapter6.Sequence := fun n => 1 / (n + 1) ^ (1 / (_fvar.7919 + 1))ha:Chapter6.Sequence.BddBelow _fvar.8506 := ?_mvar.8546n:hn:n a.mhn':0 n + 10 n.toNat + 1k:a:Chapter6.Sequence := fun n => 1 / (n + 1) ^ (1 / (_fvar.7919 + 1))ha:Chapter6.Sequence.BddBelow _fvar.8506 := ?_mvar.8546n:hn:n a.mhn':0 n + 10 (n + 1).toNat + 1k:a:Chapter6.Sequence := fun n => 1 / (n + 1) ^ (1 / (_fvar.7919 + 1))ha:Chapter6.Sequence.BddBelow _fvar.8506 := ?_mvar.8546n:hn:n a.mhn':0 n + 10 < (k + 1)⁻¹k:a:Chapter6.Sequence := fun n => 1 / (n + 1) ^ (1 / (_fvar.7919 + 1))ha:Chapter6.Sequence.BddBelow _fvar.8506 := ?_mvar.8546n:hn:n a.mhn':0 n + 10 < ((n + 1).toNat + 1) ^ (k + 1)⁻¹k:a:Chapter6.Sequence := fun n => 1 / (n + 1) ^ (1 / (_fvar.7919 + 1))ha:Chapter6.Sequence.BddBelow _fvar.8506 := ?_mvar.8546n:hn:n a.mhn':0 n + 10 < (n.toNat + 1) ^ (k + 1)⁻¹ try All goals completed! 🐙 All goals completed! 🐙 k:a:Chapter6.Sequence := fun n => 1 / (n + 1) ^ (1 / (_fvar.7919 + 1))ha:Chapter6.Sequence.BddBelow _fvar.8506 := ?_mvar.8546ha':a.Convergenta.TendsTo 0 have hpow (n:): (a^(n+1)).Convergent lim (a^(n+1)) = (lim a)^(n+1) := k:(↑fun n => 1 / (n + 1) ^ (1 / (k + 1))).TendsTo 0 k:a:Chapter6.Sequence := fun n => 1 / (n + 1) ^ (1 / (_fvar.7919 + 1))ha:Chapter6.Sequence.BddBelow _fvar.8506 := ?_mvar.8546ha':a.Convergent(a ^ (0 + 1)).Convergent lim (a ^ (0 + 1)) = lim a ^ (0 + 1)k:a:Chapter6.Sequence := fun n => 1 / (n + 1) ^ (1 / (_fvar.7919 + 1))ha:Chapter6.Sequence.BddBelow _fvar.8506 := ?_mvar.8546ha':a.Convergentn:ih:(a ^ (n + 1)).Convergent lim (a ^ (n + 1)) = lim a ^ (n + 1)(a ^ (n + 1 + 1)).Convergent lim (a ^ (n + 1 + 1)) = lim a ^ (n + 1 + 1) k:a:Chapter6.Sequence := fun n => 1 / (n + 1) ^ (1 / (_fvar.7919 + 1))ha:Chapter6.Sequence.BddBelow _fvar.8506 := ?_mvar.8546ha':a.Convergent(a ^ (0 + 1)).Convergent lim (a ^ (0 + 1)) = lim a ^ (0 + 1) All goals completed! 🐙 k:a:Chapter6.Sequence := fun n => 1 / (n + 1) ^ (1 / (_fvar.7919 + 1))ha:Chapter6.Sequence.BddBelow _fvar.8506 := ?_mvar.8546ha':a.Convergentn:ih:(a ^ (n + 1)).Convergent lim (a ^ (n + 1)) = lim a ^ (n + 1)(a ^ (n + 1) * a).Convergent lim (a ^ (n + 1) * a) = lim a ^ (n + 1 + 1); k:a:Chapter6.Sequence := fun n => 1 / (n + 1) ^ (1 / (_fvar.7919 + 1))ha:Chapter6.Sequence.BddBelow _fvar.8506 := ?_mvar.8546ha':a.Convergentn:ih:(a ^ (n + 1)).Convergent lim (a ^ (n + 1)) = lim a ^ (n + 1)lim a ^ (n + 1 + 1) = lim (a ^ (n + 1)) * lim a; All goals completed! 🐙 have hlim : (lim a)^(k+1) = 0 := k:(↑fun n => 1 / (n + 1) ^ (1 / (k + 1))).TendsTo 0 k:a:Chapter6.Sequence := fun n => 1 / (n + 1) ^ (1 / (_fvar.7919 + 1))ha:Chapter6.Sequence.BddBelow _fvar.8506 := ?_mvar.8546ha':a.Convergenthpow: (n : ), (_fvar.8506 ^ (n + 1)).Convergent Chapter6.lim (_fvar.8506 ^ (n + 1)) = Chapter6.lim _fvar.8506 ^ (n + 1) := fun n => @?_mvar.89904 nlim (a ^ (k + 1)) = 0; k:a:Chapter6.Sequence := fun n => 1 / (n + 1) ^ (1 / (_fvar.7919 + 1))ha:Chapter6.Sequence.BddBelow _fvar.8506 := ?_mvar.8546ha':a.Convergenthpow: (n : ), (_fvar.8506 ^ (n + 1)).Convergent Chapter6.lim (_fvar.8506 ^ (n + 1)) = Chapter6.lim _fvar.8506 ^ (n + 1) := fun n => @?_mvar.89904 na ^ (k + 1) = fun n => (n + 1)⁻¹; k:a:Chapter6.Sequence := fun n => 1 / (n + 1) ^ (1 / (_fvar.7919 + 1))ha:Chapter6.Sequence.BddBelow _fvar.8506 := ?_mvar.8546ha':a.Convergenthpow: (n : ), (_fvar.8506 ^ (n + 1)).Convergent Chapter6.lim (_fvar.8506 ^ (n + 1)) = Chapter6.lim _fvar.8506 ^ (n + 1) := fun n => @?_mvar.89904 n(a ^ (k + 1)).m = (↑fun n => (n + 1)⁻¹).mk:a:Chapter6.Sequence := fun n => 1 / (n + 1) ^ (1 / (_fvar.7919 + 1))ha:Chapter6.Sequence.BddBelow _fvar.8506 := ?_mvar.8546ha':a.Convergenthpow: (n : ), (_fvar.8506 ^ (n + 1)).Convergent Chapter6.lim (_fvar.8506 ^ (n + 1)) = Chapter6.lim _fvar.8506 ^ (n + 1) := fun n => @?_mvar.89904 nx✝:(a ^ (k + 1)).seq x✝ = (↑fun n => (n + 1)⁻¹).seq x✝; k:a:Chapter6.Sequence := fun n => 1 / (n + 1) ^ (1 / (_fvar.7919 + 1))ha:Chapter6.Sequence.BddBelow _fvar.8506 := ?_mvar.8546ha':a.Convergenthpow: (n : ), (_fvar.8506 ^ (n + 1)).Convergent Chapter6.lim (_fvar.8506 ^ (n + 1)) = Chapter6.lim _fvar.8506 ^ (n + 1) := fun n => @?_mvar.89904 nx✝:(a ^ (k + 1)).seq x✝ = (↑fun n => (n + 1)⁻¹).seq x✝ k:a:Chapter6.Sequence := fun n => 1 / (n + 1) ^ (1 / (_fvar.7919 + 1))ha:Chapter6.Sequence.BddBelow _fvar.8506 := ?_mvar.8546ha':a.Convergenthpow: (n : ), (_fvar.8506 ^ (n + 1)).Convergent Chapter6.lim (_fvar.8506 ^ (n + 1)) = Chapter6.lim _fvar.8506 ^ (n + 1) := fun n => @?_mvar.89904 nx✝:(if x✝ 0 then Monoid.npow (k + 1) (if x✝ 0 then 1 / (x✝.toNat + 1).rpow (1 / (k + 1)) else 0) else 0) = if x✝ 0 then (x✝.toNat + 1)⁻¹ else 0; k:a:Chapter6.Sequence := fun n => 1 / (n + 1) ^ (1 / (_fvar.7919 + 1))ha:Chapter6.Sequence.BddBelow _fvar.8506 := ?_mvar.8546ha':a.Convergenthpow: (n : ), (_fvar.8506 ^ (n + 1)).Convergent Chapter6.lim (_fvar.8506 ^ (n + 1)) = Chapter6.lim _fvar.8506 ^ (n + 1) := fun n => @?_mvar.89904 nx✝:h:x✝ 0Monoid.npow (k + 1) (1 / (x✝.toNat + 1).rpow (1 / (k + 1))) = (x✝.toNat + 1)⁻¹k:a:Chapter6.Sequence := fun n => 1 / (n + 1) ^ (1 / (_fvar.7919 + 1))ha:Chapter6.Sequence.BddBelow _fvar.8506 := ?_mvar.8546ha':a.Convergenthpow: (n : ), (_fvar.8506 ^ (n + 1)).Convergent Chapter6.lim (_fvar.8506 ^ (n + 1)) = Chapter6.lim _fvar.8506 ^ (n + 1) := fun n => @?_mvar.89904 nx✝:h:¬x✝ 00 = 0 k:a:Chapter6.Sequence := fun n => 1 / (n + 1) ^ (1 / (_fvar.7919 + 1))ha:Chapter6.Sequence.BddBelow _fvar.8506 := ?_mvar.8546ha':a.Convergenthpow: (n : ), (_fvar.8506 ^ (n + 1)).Convergent Chapter6.lim (_fvar.8506 ^ (n + 1)) = Chapter6.lim _fvar.8506 ^ (n + 1) := fun n => @?_mvar.89904 nx✝:h:x✝ 0Monoid.npow (k + 1) (1 / (x✝.toNat + 1).rpow (1 / (k + 1))) = (x✝.toNat + 1)⁻¹k:a:Chapter6.Sequence := fun n => 1 / (n + 1) ^ (1 / (_fvar.7919 + 1))ha:Chapter6.Sequence.BddBelow _fvar.8506 := ?_mvar.8546ha':a.Convergenthpow: (n : ), (_fvar.8506 ^ (n + 1)).Convergent Chapter6.lim (_fvar.8506 ^ (n + 1)) = Chapter6.lim _fvar.8506 ^ (n + 1) := fun n => @?_mvar.89904 nx✝:h:¬x✝ 00 = 0 All goals completed! 🐙 k:a:Chapter6.Sequence := fun n => 1 / (n + 1) ^ (1 / (_fvar.7919 + 1))ha:Chapter6.Sequence.BddBelow _fvar.8506 := ?_mvar.8546ha':a.Convergenthpow: (n : ), (_fvar.8506 ^ (n + 1)).Convergent Chapter6.lim (_fvar.8506 ^ (n + 1)) = Chapter6.lim _fvar.8506 ^ (n + 1) := fun n => @?_mvar.89904 nx✝:h:x✝ 0(x✝.toNat + 1) ^ ((k + 1)⁻¹ * (k + 1)) = x✝.toNat + 1 k:a:Chapter6.Sequence := fun n => 1 / (n + 1) ^ (1 / (_fvar.7919 + 1))ha:Chapter6.Sequence.BddBelow _fvar.8506 := ?_mvar.8546ha':a.Convergenthpow: (n : ), (_fvar.8506 ^ (n + 1)).Convergent Chapter6.lim (_fvar.8506 ^ (n + 1)) = Chapter6.lim _fvar.8506 ^ (n + 1) := fun n => @?_mvar.89904 nx✝:h:x✝ 0(k + 1)⁻¹ * (k + 1) = 1; All goals completed! 🐙 All goals completed! 🐙

Lemma 6.5.2 / Exercise 6.5.2

theorem declaration uses 'sorry'Sequence.lim_of_geometric {x:} (hx: |x| < 1) : ((fun (n:) x^n):Sequence).TendsTo 0 := x:hx:|x| < 1(↑fun n => x ^ n).TendsTo 0 All goals completed! 🐙

Lemma 6.5.2 / Exercise 6.5.2

theorem declaration uses 'sorry'Sequence.lim_of_geometric' {x:} (hx: x = 1) : ((fun (n:) x^n):Sequence).TendsTo 1 := x:hx:x = 1(↑fun n => x ^ n).TendsTo 1 All goals completed! 🐙

Lemma 6.5.2 / Exercise 6.5.2

theorem declaration uses 'sorry'Sequence.lim_of_geometric'' {x:} (hx: x = -1 |x| > 1) : ((fun (n:) x^n):Sequence).Divergent := x:hx:x = -1 |x| > 1(↑fun n => x ^ n).Divergent All goals completed! 🐙

Lemma 6.5.3 / Exercise 6.5.3

theorem declaration uses 'sorry'Sequence.lim_of_roots {x:} (hx: x > 0) : ((fun (n:) x^(1/(n+1:))):Sequence).TendsTo 1 := x:hx:x > 0(↑fun n => x ^ (1 / (n + 1))).TendsTo 1 All goals completed! 🐙

Exercise 6.5.1

theorem declaration uses 'sorry'Sequence.lim_of_rat_power_decay {q:} (hq: q > 0) : (fun (n:) 1/((n+1:)^(q:)):Sequence).TendsTo 0 := q:hq:q > 0(↑fun n => 1 / (n + 1) ^ q).TendsTo 0 All goals completed! 🐙

Exercise 6.5.1

theorem declaration uses 'sorry'Sequence.lim_of_rat_power_growth {q:} (hq: q > 0) : (fun (n:) ((n+1:)^(q:)):Sequence).Divergent := q:hq:q > 0(↑fun n => (n + 1) ^ q).Divergent All goals completed! 🐙
end Chapter6