Analysis I, Chapter 6 epilogue: Connections with Mathlib limits
In this (technical) epilogue, we show that various operations and properties we have defined for
"Chapter 6" sequences Chapter6.Sequence are equivalent to Mathlib operations. Note however
that Mathlib's operations are defined in far greater generality than the setting of real-valued
sequences, in particular using the language of filters.
open FilterIdentification with the Cauchy sequence support in Mathlib/Algebra/Order/CauSeq/Basic
theorem Chapter6.Sequence.isCauchy_iff_isCauSeq (a: ℕ → ℝ) :
(a:Sequence).IsCauchy ↔ IsCauSeq _root_.abs a := a:ℕ → ℝ⊢ (↑a).IsCauchy ↔ IsCauSeq _root_.abs a
simp_rw a:ℕ → ℝ⊢ (↑a).IsCauchy ↔ IsCauSeq _root_.abs aIsCauchy.coe, Real.dist_eq, IsCauSeq]
a:ℕ → ℝ⊢ (∀ ε > 0, ∃ N, ∀ j ≥ N, ∀ k ≥ N, |a j - a k| ≤ ε) → ∀ ε > 0, ∃ i, ∀ j ≥ i, |a j - a i| < εa:ℕ → ℝ⊢ (∀ ε > 0, ∃ i, ∀ j ≥ i, |a j - a i| < ε) → ∀ ε > 0, ∃ N, ∀ j ≥ N, ∀ k ≥ N, |a j - a k| ≤ ε a:ℕ → ℝ⊢ (∀ ε > 0, ∃ N, ∀ j ≥ N, ∀ k ≥ N, |a j - a k| ≤ ε) → ∀ ε > 0, ∃ i, ∀ j ≥ i, |a j - a i| < εa:ℕ → ℝ⊢ (∀ ε > 0, ∃ i, ∀ j ≥ i, |a j - a i| < ε) → ∀ ε > 0, ∃ N, ∀ j ≥ N, ∀ k ≥ N, |a j - a k| ≤ ε intro h a:ℕ → ℝh:∀ ε > 0, ∃ i, ∀ j ≥ i, |a j - a i| < εε:ℝ⊢ ε > 0 → ∃ N, ∀ j ≥ N, ∀ k ≥ N, |a j - a k| ≤ ε a:ℕ → ℝh:∀ ε > 0, ∃ i, ∀ j ≥ i, |a j - a i| < εε:ℝhε:ε > 0⊢ ∃ N, ∀ j ≥ N, ∀ k ≥ N, |a j - a k| ≤ ε a:ℕ → ℝh:∀ ε > 0, ∃ N, ∀ j ≥ N, ∀ k ≥ N, |a j - a k| ≤ εε:ℝhε:ε > 0⊢ ∃ i, ∀ j ≥ i, |a j - a i| < εa:ℕ → ℝh:∀ ε > 0, ∃ i, ∀ j ≥ i, |a j - a i| < εε:ℝhε:ε > 0⊢ ∃ N, ∀ j ≥ N, ∀ k ≥ N, |a j - a k| ≤ ε a:ℕ → ℝh✝:∀ ε > 0, ∃ i, ∀ j ≥ i, |a j - a i| < εε:ℝhε:ε > 0N:ℕh:∀ j ≥ N, |a j - a N| < ε / 2⊢ ∃ N, ∀ j ≥ N, ∀ k ≥ N, |a j - a k| ≤ ε a:ℕ → ℝh✝:∀ ε > 0, ∃ N, ∀ j ≥ N, ∀ k ≥ N, |a j - a k| ≤ εε:ℝhε:ε > 0N:ℕh:∀ j ≥ N, ∀ k ≥ N, |a j - a k| ≤ ε / 2⊢ ∃ i, ∀ j ≥ i, |a j - a i| < εa:ℕ → ℝh✝:∀ ε > 0, ∃ i, ∀ j ≥ i, |a j - a i| < εε:ℝhε:ε > 0N:ℕh:∀ j ≥ N, |a j - a N| < ε / 2⊢ ∃ N, ∀ j ≥ N, ∀ k ≥ N, |a j - a k| ≤ ε a:ℕ → ℝh✝:∀ ε > 0, ∃ i, ∀ j ≥ i, |a j - a i| < εε:ℝhε:ε > 0N:ℕh:∀ j ≥ N, |a j - a N| < ε / 2⊢ ∀ j ≥ N, ∀ k ≥ N, |a j - a k| ≤ ε
a:ℕ → ℝh✝:∀ ε > 0, ∃ N, ∀ j ≥ N, ∀ k ≥ N, |a j - a k| ≤ εε:ℝhε:ε > 0N:ℕh:∀ j ≥ N, ∀ k ≥ N, |a j - a k| ≤ ε / 2⊢ ∀ j ≥ N, |a j - a N| < ε intro n a:ℕ → ℝh✝:∀ ε > 0, ∃ N, ∀ j ≥ N, ∀ k ≥ N, |a j - a k| ≤ εε:ℝhε:ε > 0N:ℕh:∀ j ≥ N, ∀ k ≥ N, |a j - a k| ≤ ε / 2n:ℕhn:n ≥ N⊢ |a n - a N| < ε; linarith [h n hn N (a:ℕ → ℝh✝:∀ ε > 0, ∃ N, ∀ j ≥ N, ∀ k ≥ N, |a j - a k| ≤ εε:ℝhε:ε > 0N:ℕh:∀ j ≥ N, ∀ k ≥ N, |a j - a k| ≤ ε / 2n:ℕhn:n ≥ N⊢ N ≥ N All goals completed! 🐙)]
intro n a:ℕ → ℝh✝:∀ ε > 0, ∃ i, ∀ j ≥ i, |a j - a i| < εε:ℝhε:ε > 0N:ℕh:∀ j ≥ N, |a j - a N| < ε / 2n:ℕhn:n ≥ N⊢ ∀ k ≥ N, |a n - a k| ≤ ε a:ℕ → ℝh✝:∀ ε > 0, ∃ i, ∀ j ≥ i, |a j - a i| < εε:ℝhε:ε > 0N:ℕh:∀ j ≥ N, |a j - a N| < ε / 2n:ℕhn:n ≥ Nm:ℕ⊢ m ≥ N → |a n - a m| ≤ ε a:ℕ → ℝh✝:∀ ε > 0, ∃ i, ∀ j ≥ i, |a j - a i| < εε:ℝhε:ε > 0N:ℕh:∀ j ≥ N, |a j - a N| < ε / 2n:ℕhn:n ≥ Nm:ℕhm:m ≥ N⊢ |a n - a m| ≤ ε
calc
_ ≤ |a n - a N| + |a m - a N| := a:ℕ → ℝh✝:∀ ε > 0, ∃ i, ∀ j ≥ i, |a j - a i| < εε:ℝhε:ε > 0N:ℕh:∀ j ≥ N, |a j - a N| < ε / 2n:ℕhn:n ≥ Nm:ℕhm:m ≥ N⊢ |a n - a m| ≤ |a n - a N| + |a m - a N| All goals completed! 🐙
_ ≤ ε/2 + ε/2 := a:ℕ → ℝh✝:∀ ε > 0, ∃ i, ∀ j ≥ i, |a j - a i| < εε:ℝhε:ε > 0N:ℕh:∀ j ≥ N, |a j - a N| < ε / 2n:ℕhn:n ≥ Nm:ℕhm:m ≥ N⊢ |a n - a N| + |a m - a N| ≤ ε / 2 + ε / 2 All goals completed! 🐙
_ = _ := a:ℕ → ℝh✝:∀ ε > 0, ∃ i, ∀ j ≥ i, |a j - a i| < εε:ℝhε:ε > 0N:ℕh:∀ j ≥ N, |a j - a N| < ε / 2n:ℕhn:n ≥ Nm:ℕhm:m ≥ N⊢ ε / 2 + ε / 2 = ε All goals completed! 🐙Identification with the Cauchy sequence support in Mathlib/Topology/UniformSpace/Cauchy
theorem Chapter6.Sequence.Cauchy_iff_CauchySeq (a: ℕ → ℝ) :
(a:Sequence).IsCauchy ↔ CauchySeq a := a:ℕ → ℝ⊢ (↑a).IsCauchy ↔ CauchySeq a
a:ℕ → ℝ⊢ IsCauSeq _root_.abs a ↔ CauchySeq a
All goals completed! 🐙
Identification with Filter.Tendsto
theorem Chapter6.Sequence.tendsto_iff_Tendsto (a: ℕ → ℝ) (L:ℝ) :
(a:Sequence).TendsTo L ↔ atTop.Tendsto a (nhds L) := a:ℕ → ℝL:ℝ⊢ (↑a).TendsTo L ↔ Tendsto a atTop (nhds L)
a:ℕ → ℝL:ℝ⊢ (∀ ε > 0, ∃ N, ∀ n ≥ N, |(↑a).seq n - L| ≤ ε) ↔ ∀ ε > 0, ∃ N, ∀ n ≥ N, dist (a n) L < ε
a:ℕ → ℝL:ℝ⊢ (∀ ε > 0, ∃ N, ∀ n ≥ N, |(↑a).seq n - L| ≤ ε) → ∀ ε > 0, ∃ N, ∀ n ≥ N, dist (a n) L < εa:ℕ → ℝL:ℝ⊢ (∀ ε > 0, ∃ N, ∀ n ≥ N, dist (a n) L < ε) → ∀ ε > 0, ∃ N, ∀ n ≥ N, |(↑a).seq n - L| ≤ ε a:ℕ → ℝL:ℝ⊢ (∀ ε > 0, ∃ N, ∀ n ≥ N, |(↑a).seq n - L| ≤ ε) → ∀ ε > 0, ∃ N, ∀ n ≥ N, dist (a n) L < εa:ℕ → ℝL:ℝ⊢ (∀ ε > 0, ∃ N, ∀ n ≥ N, dist (a n) L < ε) → ∀ ε > 0, ∃ N, ∀ n ≥ N, |(↑a).seq n - L| ≤ ε intro h a:ℕ → ℝL:ℝh:∀ ε > 0, ∃ N, ∀ n ≥ N, dist (a n) L < εε:ℝ⊢ ε > 0 → ∃ N, ∀ n ≥ N, |(↑a).seq n - L| ≤ ε a:ℕ → ℝL:ℝh:∀ ε > 0, ∃ N, ∀ n ≥ N, dist (a n) L < εε:ℝhε:ε > 0⊢ ∃ N, ∀ n ≥ N, |(↑a).seq n - L| ≤ ε
a:ℕ → ℝL:ℝh:∀ ε > 0, ∃ N, ∀ n ≥ N, |(↑a).seq n - L| ≤ εε:ℝhε:ε > 0⊢ ∃ N, ∀ n ≥ N, dist (a n) L < ε a:ℕ → ℝL:ℝh:∀ ε > 0, ∃ N, ∀ n ≥ N, |(↑a).seq n - L| ≤ εε:ℝhε:ε > 0N:ℤhN:∀ n ≥ N, |(↑a).seq n - L| ≤ ε / 2⊢ ∃ N, ∀ n ≥ N, dist (a n) L < ε; a:ℕ → ℝL:ℝh:∀ ε > 0, ∃ N, ∀ n ≥ N, |(↑a).seq n - L| ≤ εε:ℝhε:ε > 0N:ℤhN:∀ n ≥ N, |(↑a).seq n - L| ≤ ε / 2⊢ ∀ n ≥ N.toNat, dist (a n) L < ε; intro n a:ℕ → ℝL:ℝh:∀ ε > 0, ∃ N, ∀ n ≥ N, |(↑a).seq n - L| ≤ εε:ℝhε:ε > 0N:ℤhN:∀ n ≥ N, |(↑a).seq n - L| ≤ ε / 2n:ℕhn:n ≥ N.toNat⊢ dist (a n) L < ε
a:ℕ → ℝL:ℝh:∀ ε > 0, ∃ N, ∀ n ≥ N, |(↑a).seq n - L| ≤ εε:ℝhε:ε > 0N:ℤn:ℕhn:n ≥ N.toNathN:|(↑a).seq ↑n - L| ≤ ε / 2⊢ dist (a n) L < ε; a:ℕ → ℝL:ℝh:∀ ε > 0, ∃ N, ∀ n ≥ N, |(↑a).seq n - L| ≤ εε:ℝhε:ε > 0N:ℤn:ℕhn:n ≥ N.toNathN:|a n - L| ≤ ε / 2⊢ dist (a n) L < ε
a:ℕ → ℝL:ℝh:∀ ε > 0, ∃ N, ∀ n ≥ N, |(↑a).seq n - L| ≤ εε:ℝhε:ε > 0N:ℤn:ℕhn:n ≥ N.toNathN:|a n - L| ≤ ε / 2⊢ |a n - L| < ε; All goals completed! 🐙
a:ℕ → ℝL:ℝh:∀ ε > 0, ∃ N, ∀ n ≥ N, dist (a n) L < εε:ℝhε:ε > 0N:ℕhN:∀ n ≥ N, dist (a n) L < ε⊢ ∃ N, ∀ n ≥ N, |(↑a).seq n - L| ≤ ε; a:ℕ → ℝL:ℝh:∀ ε > 0, ∃ N, ∀ n ≥ N, dist (a n) L < εε:ℝhε:ε > 0N:ℕhN:∀ n ≥ N, dist (a n) L < ε⊢ ∀ n ≥ ↑N, |(↑a).seq n - L| ≤ ε; intro n a:ℕ → ℝL:ℝh:∀ ε > 0, ∃ N, ∀ n ≥ N, dist (a n) L < εε:ℝhε:ε > 0N:ℕhN:∀ n ≥ N, dist (a n) L < εn:ℤhn:n ≥ ↑N⊢ |(↑a).seq n - L| ≤ ε
have hpos : n ≥ 0 := a:ℕ → ℝL:ℝ⊢ (↑a).TendsTo L ↔ Tendsto a atTop (nhds L) All goals completed! 🐙
a:ℕ → ℝL:ℝh:∀ ε > 0, ∃ N, ∀ n ≥ N, dist (a n) L < εε:ℝhε:ε > 0N:ℕhN:∀ n ≥ N, dist (a n) L < εn:ℤhn:N ≤ n.toNathpos:n ≥ 0⊢ |(↑a).seq n - L| ≤ ε
All goals completed! 🐙theorem Chapter6.Sequence.tendsto_iff_Tendsto' (a: Sequence) (L:ℝ) : a.TendsTo L ↔ atTop.Tendsto a.seq (nhds L) := a:SequenceL:ℝ⊢ a.TendsTo L ↔ Tendsto a.seq atTop (nhds L)
a:SequenceL:ℝ⊢ (∀ ε > 0, ∃ N, ∀ n ≥ N, |a.seq n - L| ≤ ε) ↔ ∀ ε > 0, ∃ N, ∀ n ≥ N, dist (a.seq n) L < ε
a:SequenceL:ℝ⊢ (∀ ε > 0, ∃ N, ∀ n ≥ N, |a.seq n - L| ≤ ε) → ∀ ε > 0, ∃ N, ∀ n ≥ N, dist (a.seq n) L < εa:SequenceL:ℝ⊢ (∀ ε > 0, ∃ N, ∀ n ≥ N, dist (a.seq n) L < ε) → ∀ ε > 0, ∃ N, ∀ n ≥ N, |a.seq n - L| ≤ ε a:SequenceL:ℝ⊢ (∀ ε > 0, ∃ N, ∀ n ≥ N, |a.seq n - L| ≤ ε) → ∀ ε > 0, ∃ N, ∀ n ≥ N, dist (a.seq n) L < εa:SequenceL:ℝ⊢ (∀ ε > 0, ∃ N, ∀ n ≥ N, dist (a.seq n) L < ε) → ∀ ε > 0, ∃ N, ∀ n ≥ N, |a.seq n - L| ≤ ε intro h a:SequenceL:ℝh:∀ ε > 0, ∃ N, ∀ n ≥ N, dist (a.seq n) L < εε:ℝ⊢ ε > 0 → ∃ N, ∀ n ≥ N, |a.seq n - L| ≤ ε a:SequenceL:ℝh:∀ ε > 0, ∃ N, ∀ n ≥ N, dist (a.seq n) L < εε:ℝhε:ε > 0⊢ ∃ N, ∀ n ≥ N, |a.seq n - L| ≤ ε
a:SequenceL:ℝh:∀ ε > 0, ∃ N, ∀ n ≥ N, |a.seq n - L| ≤ εε:ℝhε:ε > 0⊢ ∃ N, ∀ n ≥ N, dist (a.seq n) L < ε a:SequenceL:ℝh:∀ ε > 0, ∃ N, ∀ n ≥ N, |a.seq n - L| ≤ εε:ℝhε:ε > 0N:ℤhN:∀ n ≥ N, |a.seq n - L| ≤ ε / 2⊢ ∃ N, ∀ n ≥ N, dist (a.seq n) L < ε; a:SequenceL:ℝh:∀ ε > 0, ∃ N, ∀ n ≥ N, |a.seq n - L| ≤ εε:ℝhε:ε > 0N:ℤhN:∀ n ≥ N, |a.seq n - L| ≤ ε / 2⊢ ∀ n ≥ N, dist (a.seq n) L < ε; a:SequenceL:ℝh:∀ ε > 0, ∃ N, ∀ n ≥ N, |a.seq n - L| ≤ εε:ℝhε:ε > 0N:ℤhN:∀ n ≥ N, |a.seq n - L| ≤ ε / 2n✝:ℤa✝:n✝ ≥ Nthis:|a.seq n✝ - L| ≤ ε / 2⊢ dist (a.seq n✝) L < ε; a:SequenceL:ℝh:∀ ε > 0, ∃ N, ∀ n ≥ N, |a.seq n - L| ≤ εε:ℝhε:ε > 0N:ℤhN:∀ n ≥ N, |a.seq n - L| ≤ ε / 2n✝:ℤa✝:n✝ ≥ Nthis:|a.seq n✝ - L| ≤ ε / 2⊢ |a.seq n✝ - L| < ε; All goals completed! 🐙
a:SequenceL:ℝh:∀ ε > 0, ∃ N, ∀ n ≥ N, dist (a.seq n) L < εε:ℝhε:ε > 0N:ℤhN:∀ n ≥ N, dist (a.seq n) L < ε⊢ ∃ N, ∀ n ≥ N, |a.seq n - L| ≤ ε; a:SequenceL:ℝh:∀ ε > 0, ∃ N, ∀ n ≥ N, dist (a.seq n) L < εε:ℝhε:ε > 0N:ℤhN:∀ n ≥ N, dist (a.seq n) L < ε⊢ ∀ n ≥ N, |a.seq n - L| ≤ ε; a:SequenceL:ℝh:∀ ε > 0, ∃ N, ∀ n ≥ N, dist (a.seq n) L < εε:ℝhε:ε > 0N:ℤhN:∀ n ≥ N, dist (a.seq n) L < εn✝:ℤa✝:n✝ ≥ Nthis:dist (a.seq n✝) L < ε⊢ |a.seq n✝ - L| ≤ ε; a:SequenceL:ℝh:∀ ε > 0, ∃ N, ∀ n ≥ N, dist (a.seq n) L < εε:ℝhε:ε > 0N:ℤhN:∀ n ≥ N, dist (a.seq n) L < εn✝:ℤa✝:n✝ ≥ Nthis:dist (a.seq n✝) L < ε⊢ dist (a.seq n✝) L ≤ ε; All goals completed! 🐙theorem Chapter6.Sequence.converges_iff_Tendsto (a: ℕ → ℝ) :
(a:Sequence).Convergent ↔ ∃ L, atTop.Tendsto a (nhds L) := a:ℕ → ℝ⊢ (↑a).Convergent ↔ ∃ L, Tendsto a atTop (nhds L) simp_rw a:ℕ → ℝ⊢ (↑a).Convergent ↔ ∃ L, Tendsto a atTop (nhds L)←tendsto_iff_Tendsto]theorem Chapter6.Sequence.converges_iff_Tendsto' (a: Sequence) :
a.Convergent ↔ ∃ L, atTop.Tendsto a.seq (nhds L) := a:Sequence⊢ a.Convergent ↔ ∃ L, Tendsto a.seq atTop (nhds L) simp_rw a:Sequence⊢ a.Convergent ↔ ∃ L, Tendsto a.seq atTop (nhds L)←tendsto_iff_Tendsto']
A technicality: CauSeq.IsComplete ℝ was established for _root_.abs but not for norm.
instance inst_real_complete : CauSeq.IsComplete ℝ norm := ⊢ CauSeq.IsComplete ℝ norm All goals completed! 🐙
Identification with CauSeq.lim
theorem Chapter6.Sequence.lim_eq_CauSeq_lim (a:ℕ → ℝ) (ha: (a:Sequence).IsCauchy) :
Chapter6.lim (a:Sequence) = CauSeq.lim ⟨ a, (isCauchy_iff_isCauSeq a).mp ha⟩ := a:ℕ → ℝha:(↑a).IsCauchy⊢ lim ↑a = CauSeq.lim ⟨a, ⋯⟩
a:ℕ → ℝha:(↑a).IsCauchyh1:Tendsto (↑⟨a, ⋯⟩) atTop (nhds (CauSeq.lim ⟨a, ⋯⟩)) := CauSeq.tendsto_limit ⟨a, (isCauchy_iff_isCauSeq a).mp ha⟩⊢ lim ↑a = CauSeq.lim ⟨a, ⋯⟩
a:ℕ → ℝha:(↑a).IsCauchyh1:Tendsto (↑⟨a, ⋯⟩) atTop (nhds (CauSeq.lim ⟨a, ⋯⟩)) := CauSeq.tendsto_limit ⟨a, (isCauchy_iff_isCauSeq a).mp ha⟩h2:(↑a).TendsTo (lim ↑a) := lim_def ((Cauchy_iff_convergent ↑a).mp ha)⊢ lim ↑a = CauSeq.lim ⟨a, ⋯⟩
a:ℕ → ℝha:(↑a).IsCauchyh1:(↑↑⟨a, ⋯⟩).TendsTo (CauSeq.lim ⟨a, ⋯⟩)h2:(↑a).TendsTo (lim ↑a)⊢ lim ↑a = CauSeq.lim ⟨a, ⋯⟩
a:ℕ → ℝha:(↑a).IsCauchyh1:(↑↑⟨a, ⋯⟩).TendsTo (CauSeq.lim ⟨a, ⋯⟩)h2:(↑a).TendsTo (lim ↑a)h:lim ↑a ≠ CauSeq.lim ⟨a, ⋯⟩⊢ False; a:ℕ → ℝha:(↑a).IsCauchyh1:(↑↑⟨a, ⋯⟩).TendsTo (CauSeq.lim ⟨a, ⋯⟩)h2:(↑a).TendsTo (lim ↑a)h:¬((↑a).TendsTo (lim ↑a) ∧ (↑a).TendsTo (CauSeq.lim ⟨a, ⋯⟩))⊢ False; All goals completed! 🐙
Identification with limUnder
theorem Chapter6.Sequence.lim_eq_limUnder (a:ℕ → ℝ) (ha: (a:Sequence).Convergent) :
Chapter6.lim (a:Sequence) = limUnder Filter.atTop a := a:ℕ → ℝha:(↑a).Convergent⊢ lim ↑a = limUnder atTop a
All goals completed! 🐙
Identification with Bornology.IsBounded
theorem Chapter6.Sequence.isBounded_iff_isBounded_range (a:ℕ → ℝ):
(a:Sequence).IsBounded ↔ Bornology.IsBounded (Set.range a) := a:ℕ → ℝ⊢ (↑a).IsBounded ↔ Bornology.IsBounded (Set.range a)
a:ℕ → ℝ⊢ (∃ M, 0 ≤ M ∧ ∀ (n : ℤ), |if 0 ≤ n then a n.toNat else 0| ≤ M) ↔ ∃ C, ∀ (a_1 a_2 : ℕ), dist (a a_1) (a a_2) ≤ C
a:ℕ → ℝ⊢ (∃ M, 0 ≤ M ∧ ∀ (n : ℤ), |if 0 ≤ n then a n.toNat else 0| ≤ M) → ∃ C, ∀ (a_2 a_3 : ℕ), dist (a a_2) (a a_3) ≤ Ca:ℕ → ℝ⊢ (∃ C, ∀ (a_1 a_2 : ℕ), dist (a a_1) (a a_2) ≤ C) → ∃ M, 0 ≤ M ∧ ∀ (n : ℤ), |if 0 ≤ n then a n.toNat else 0| ≤ M
a:ℕ → ℝ⊢ (∃ M, 0 ≤ M ∧ ∀ (n : ℤ), |if 0 ≤ n then a n.toNat else 0| ≤ M) → ∃ C, ∀ (a_2 a_3 : ℕ), dist (a a_2) (a a_3) ≤ C a:ℕ → ℝM:ℝhM:0 ≤ Mh:∀ (n : ℤ), |if 0 ≤ n then a n.toNat else 0| ≤ M⊢ ∃ C, ∀ (a_1 a_2 : ℕ), dist (a a_1) (a a_2) ≤ C; a:ℕ → ℝM:ℝhM:0 ≤ Mh:∀ (n : ℤ), |if 0 ≤ n then a n.toNat else 0| ≤ M⊢ ∀ (a_1 a_2 : ℕ), dist (a a_1) (a a_2) ≤ 2 * M; intro n a:ℕ → ℝM:ℝhM:0 ≤ Mh:∀ (n : ℤ), |if 0 ≤ n then a n.toNat else 0| ≤ Mn:ℕm:ℕ⊢ dist (a n) (a m) ≤ 2 * M
calc
_ = |a n - a m| := Real.dist_eq _ _
_ ≤ |a n| + |a m| := abs_sub _ _
_ ≤ M + M := a:ℕ → ℝM:ℝhM:0 ≤ Mh:∀ (n : ℤ), |if 0 ≤ n then a n.toNat else 0| ≤ Mn:ℕm:ℕ⊢ |a n| + |a m| ≤ M + M a:ℕ → ℝM:ℝhM:0 ≤ Mh:∀ (n : ℤ), |if 0 ≤ n then a n.toNat else 0| ≤ Mn:ℕm:ℕ⊢ |a n| ≤ Ma:ℕ → ℝM:ℝhM:0 ≤ Mh:∀ (n : ℤ), |if 0 ≤ n then a n.toNat else 0| ≤ Mn:ℕm:ℕ⊢ |a m| ≤ M; a:ℕ → ℝM:ℝhM:0 ≤ Mh:∀ (n : ℤ), |if 0 ≤ n then a n.toNat else 0| ≤ Mn:ℕm:ℕ⊢ |a m| ≤ M; All goals completed! 🐙
_ = _ := a:ℕ → ℝM:ℝhM:0 ≤ Mh:∀ (n : ℤ), |if 0 ≤ n then a n.toNat else 0| ≤ Mn:ℕm:ℕ⊢ M + M = 2 * M All goals completed! 🐙
a:ℕ → ℝC:ℝh:∀ (a_1 a_2 : ℕ), dist (a a_1) (a a_2) ≤ C⊢ ∃ M, 0 ≤ M ∧ ∀ (n : ℤ), |if 0 ≤ n then a n.toNat else 0| ≤ M
have : C ≥ 0 := a:ℕ → ℝ⊢ (↑a).IsBounded ↔ Bornology.IsBounded (Set.range a) a:ℕ → ℝC:ℝh:dist (a 0) (a 0) ≤ C⊢ C ≥ 0; All goals completed! 🐙
refine ⟨ C + |a 0|, a:ℕ → ℝC:ℝh:∀ (a_1 a_2 : ℕ), dist (a a_1) (a a_2) ≤ Cthis:C ≥ 0 := Eq.mpr (id ge_iff_le._simp_1) (Eq.mp (congrFun' (congrArg LE.le (dist_self (a 0))) C) (h 0 0))⊢ 0 ≤ C + |a 0| All goals completed! 🐙, ?_ ⟩
a:ℕ → ℝC:ℝh:∀ (a_1 a_2 : ℕ), dist (a a_1) (a a_2) ≤ Cthis:C ≥ 0 := Eq.mpr (id ge_iff_le._simp_1) (Eq.mp (congrFun' (congrArg LE.le (dist_self (a 0))) C) (h 0 0))n:ℤ⊢ |if 0 ≤ n then a n.toNat else 0| ≤ C + |a 0|; a:ℕ → ℝC:ℝh:∀ (a_1 a_2 : ℕ), dist (a a_1) (a a_2) ≤ Cthis:C ≥ 0 := Eq.mpr (id ge_iff_le._simp_1) (Eq.mp (congrFun' (congrArg LE.le (dist_self (a 0))) C) (h 0 0))n:ℤhn:n ≥ 0⊢ |if 0 ≤ n then a n.toNat else 0| ≤ C + |a 0|a:ℕ → ℝC:ℝh:∀ (a_1 a_2 : ℕ), dist (a a_1) (a a_2) ≤ Cthis:C ≥ 0 := Eq.mpr (id ge_iff_le._simp_1) (Eq.mp (congrFun' (congrArg LE.le (dist_self (a 0))) C) (h 0 0))n:ℤhn:¬n ≥ 0⊢ |if 0 ≤ n then a n.toNat else 0| ≤ C + |a 0| a:ℕ → ℝC:ℝh:∀ (a_1 a_2 : ℕ), dist (a a_1) (a a_2) ≤ Cthis:C ≥ 0 := Eq.mpr (id ge_iff_le._simp_1) (Eq.mp (congrFun' (congrArg LE.le (dist_self (a 0))) C) (h 0 0))n:ℤhn:n ≥ 0⊢ |if 0 ≤ n then a n.toNat else 0| ≤ C + |a 0|a:ℕ → ℝC:ℝh:∀ (a_1 a_2 : ℕ), dist (a a_1) (a a_2) ≤ Cthis:C ≥ 0 := Eq.mpr (id ge_iff_le._simp_1) (Eq.mp (congrFun' (congrArg LE.le (dist_self (a 0))) C) (h 0 0))n:ℤhn:¬n ≥ 0⊢ |if 0 ≤ n then a n.toNat else 0| ≤ C + |a 0| a:ℕ → ℝC:ℝh:∀ (a_1 a_2 : ℕ), dist (a a_1) (a a_2) ≤ Cthis:C ≥ 0 := Eq.mpr (id ge_iff_le._simp_1) (Eq.mp (congrFun' (congrArg LE.le (dist_self (a 0))) C) (h 0 0))n:ℤhn:¬n ≥ 0⊢ 0 ≤ C + |a 0|
a:ℕ → ℝC:ℝh:∀ (a_1 a_2 : ℕ), dist (a a_1) (a a_2) ≤ Cthis:C ≥ 0 := Eq.mpr (id ge_iff_le._simp_1) (Eq.mp (congrFun' (congrArg LE.le (dist_self (a 0))) C) (h 0 0))n:ℤhn:n ≥ 0⊢ |a n.toNat| ≤ C + |a 0| calc
_ ≤ |a n.toNat - a 0| + |a 0| := a:ℕ → ℝC:ℝh:∀ (a_1 a_2 : ℕ), dist (a a_1) (a a_2) ≤ Cthis:C ≥ 0 := Eq.mpr (id ge_iff_le._simp_1) (Eq.mp (congrFun' (congrArg LE.le (dist_self (a 0))) C) (h 0 0))n:ℤhn:n ≥ 0⊢ |a n.toNat| ≤ |a n.toNat - a 0| + |a 0| a:ℕ → ℝC:ℝh:∀ (a_1 a_2 : ℕ), dist (a a_1) (a a_2) ≤ Cthis:C ≥ 0 := Eq.mpr (id ge_iff_le._simp_1) (Eq.mp (congrFun' (congrArg LE.le (dist_self (a 0))) C) (h 0 0))n:ℤhn:n ≥ 0⊢ a n.toNat = a n.toNat - a 0 + a 0a:ℕ → ℝC:ℝh:∀ (a_1 a_2 : ℕ), dist (a a_1) (a a_2) ≤ Cthis:C ≥ 0 := Eq.mpr (id ge_iff_le._simp_1) (Eq.mp (congrFun' (congrArg LE.le (dist_self (a 0))) C) (h 0 0))n:ℤhn:n ≥ 0⊢ AddLeftMono ℝ; a:ℕ → ℝC:ℝh:∀ (a_1 a_2 : ℕ), dist (a a_1) (a a_2) ≤ Cthis:C ≥ 0 := Eq.mpr (id ge_iff_le._simp_1) (Eq.mp (congrFun' (congrArg LE.le (dist_self (a 0))) C) (h 0 0))n:ℤhn:n ≥ 0⊢ AddLeftMono ℝ; All goals completed! 🐙
_ ≤ C + |a 0| := a:ℕ → ℝC:ℝh:∀ (a_1 a_2 : ℕ), dist (a a_1) (a a_2) ≤ Cthis:C ≥ 0 := Eq.mpr (id ge_iff_le._simp_1) (Eq.mp (congrFun' (congrArg LE.le (dist_self (a 0))) C) (h 0 0))n:ℤhn:n ≥ 0⊢ |a n.toNat - a 0| + |a 0| ≤ C + |a 0| a:ℕ → ℝC:ℝh:∀ (a_1 a_2 : ℕ), dist (a a_1) (a a_2) ≤ Cthis:C ≥ 0 := Eq.mpr (id ge_iff_le._simp_1) (Eq.mp (congrFun' (congrArg LE.le (dist_self (a 0))) C) (h 0 0))n:ℤhn:n ≥ 0⊢ |a n.toNat - a 0| ≤ C; a:ℕ → ℝC:ℝh:∀ (a_1 a_2 : ℕ), dist (a a_1) (a a_2) ≤ Cthis:C ≥ 0 := Eq.mpr (id ge_iff_le._simp_1) (Eq.mp (congrFun' (congrArg LE.le (dist_self (a 0))) C) (h 0 0))n:ℤhn:n ≥ 0⊢ dist (a n.toNat) (a 0) ≤ C; All goals completed! 🐙
All goals completed! 🐙theorem Chapter6.Sequence.sup_eq_sSup (a:ℕ → ℝ):
(a:Sequence).sup = sSup (Set.range (fun n ↦ (a n:EReal))) := a:ℕ → ℝ⊢ (↑a).sup = sSup (Set.range fun n => ↑(a n)) All goals completed! 🐙theorem Chapter6.Sequence.inf_eq_sInf (a:ℕ → ℝ):
(a:Sequence).inf = sInf (Set.range (fun n ↦ (a n:EReal))) := a:ℕ → ℝ⊢ (↑a).inf = sInf (Set.range fun n => ↑(a n)) All goals completed! 🐙theorem Chapter6.Sequence.bddAbove_iff (a:ℕ → ℝ):
(a:Sequence).BddAbove ↔ _root_.BddAbove (Set.range a) := a:ℕ → ℝ⊢ (↑a).BddAbove ↔ _root_.BddAbove (Set.range a) All goals completed! 🐙theorem Chapter6.Sequence.bddBelow_iff (a:ℕ → ℝ):
(a:Sequence).BddBelow ↔ _root_.BddBelow (Set.range a) := a:ℕ → ℝ⊢ (↑a).BddBelow ↔ _root_.BddBelow (Set.range a) All goals completed! 🐙theorem Chapter6.Sequence.Monotone_iff (a:ℕ → ℝ): (a:Sequence).IsMonotone ↔ Monotone a := a:ℕ → ℝ⊢ (↑a).IsMonotone ↔ Monotone a All goals completed! 🐙theorem Chapter6.Sequence.Antitone_iff (a:ℕ → ℝ): (a:Sequence).IsAntitone ↔ Antitone a := a:ℕ → ℝ⊢ (↑a).IsAntitone ↔ Antitone a All goals completed! 🐙
Identification with MapClusterPt
theorem Chapter6.Sequence.limit_point_iff (a:ℕ → ℝ) (L:ℝ) :
(a:Sequence).LimitPoint L ↔ MapClusterPt L .atTop a := a:ℕ → ℝL:ℝ⊢ (↑a).LimitPoint L ↔ MapClusterPt L atTop a
simp_rw a:ℕ → ℝL:ℝ⊢ (↑a).LimitPoint L ↔ MapClusterPt L atTop alimit_point_def, mapClusterPt_iff_frequently, frequently_atTop, Metric.mem_nhds_iff]
a:ℕ → ℝL:ℝ⊢ (∀ ε > 0, ∀ N ≥ 0, ∃ n ≥ N, |(if n ≥ 0 then a n.toNat else 0) - L| ≤ ε) →
∀ (s : Set ℝ), (∃ ε > 0, Metric.ball L ε ⊆ s) → ∀ (a_3 : ℕ), ∃ b ≥ a_3, a b ∈ sa:ℕ → ℝL:ℝ⊢ (∀ (s : Set ℝ), (∃ ε > 0, Metric.ball L ε ⊆ s) → ∀ (a_2 : ℕ), ∃ b ≥ a_2, a b ∈ s) →
∀ ε > 0, ∀ N ≥ 0, ∃ n ≥ N, |(if n ≥ 0 then a n.toNat else 0) - L| ≤ ε
a:ℕ → ℝL:ℝ⊢ (∀ ε > 0, ∀ N ≥ 0, ∃ n ≥ N, |(if n ≥ 0 then a n.toNat else 0) - L| ≤ ε) →
∀ (s : Set ℝ), (∃ ε > 0, Metric.ball L ε ⊆ s) → ∀ (a_3 : ℕ), ∃ b ≥ a_3, a b ∈ s intro h a:ℕ → ℝL:ℝh:∀ ε > 0, ∀ N ≥ 0, ∃ n ≥ N, |(if n ≥ 0 then a n.toNat else 0) - L| ≤ εs:Set ℝ⊢ (∃ ε > 0, Metric.ball L ε ⊆ s) → ∀ (a_2 : ℕ), ∃ b ≥ a_2, a b ∈ s a:ℕ → ℝL:ℝh:∀ ε > 0, ∀ N ≥ 0, ∃ n ≥ N, |(if n ≥ 0 then a n.toNat else 0) - L| ≤ εs:Set ℝε:ℝhε:ε > 0hεs:Metric.ball L ε ⊆ s⊢ ∀ (a_1 : ℕ), ∃ b ≥ a_1, a b ∈ s a:ℕ → ℝL:ℝh:∀ ε > 0, ∀ N ≥ 0, ∃ n ≥ N, |(if n ≥ 0 then a n.toNat else 0) - L| ≤ εs:Set ℝε:ℝhε:ε > 0hεs:Metric.ball L ε ⊆ sN:ℕ⊢ ∃ b ≥ N, a b ∈ s
have ⟨ n, hn1, hn2 ⟩ := h _ (half_pos hε) N (a:ℕ → ℝL:ℝh:∀ ε > 0, ∀ N ≥ 0, ∃ n ≥ N, |(if n ≥ 0 then a n.toNat else 0) - L| ≤ εs:Set ℝε:ℝhε:ε > 0hεs:Metric.ball L ε ⊆ sN:ℕ⊢ ↑N ≥ 0 All goals completed! 🐙)
have hn : n ≥ 0 := a:ℕ → ℝL:ℝ⊢ (↑a).LimitPoint L ↔ MapClusterPt L atTop a All goals completed! 🐙
refine ⟨ n.toNat, a:ℕ → ℝL:ℝh:∀ ε > 0, ∀ N ≥ 0, ∃ n ≥ N, |(if n ≥ 0 then a n.toNat else 0) - L| ≤ εs:Set ℝε:ℝhε:ε > 0hεs:Metric.ball L ε ⊆ sN:ℕn:ℤhn1:n ≥ ↑Nhn2:|(if n ≥ 0 then a n.toNat else 0) - L| ≤ ε / 2hn:n ≥ 0 := tendsto_iff_Tendsto._proof_2 N n hn1⊢ n.toNat ≥ N rwa [ge_iff_le, Int.le_toNat hna:ℕ → ℝL:ℝh:∀ ε > 0, ∀ N ≥ 0, ∃ n ≥ N, |(if n ≥ 0 then a n.toNat else 0) - L| ≤ εs:Set ℝε:ℝhε:ε > 0hεs:Metric.ball L ε ⊆ sN:ℕn:ℤhn1:n ≥ ↑Nhn2:|(if n ≥ 0 then a n.toNat else 0) - L| ≤ ε / 2hn:n ≥ 0 := tendsto_iff_Tendsto._proof_2 N n hn1⊢ ↑N ≤ n, ?_ ⟩
a:ℕ → ℝL:ℝh:∀ ε > 0, ∀ N ≥ 0, ∃ n ≥ N, |(if n ≥ 0 then a n.toNat else 0) - L| ≤ εs:Set ℝε:ℝhε:ε > 0hεs:Metric.ball L ε ⊆ sN:ℕn:ℤhn1:n ≥ ↑Nhn2:|(if n ≥ 0 then a n.toNat else 0) - L| ≤ ε / 2hn:n ≥ 0 := tendsto_iff_Tendsto._proof_2 N n hn1⊢ a n.toNat ∈ Metric.ball L ε; a:ℕ → ℝL:ℝs:Set ℝε:ℝhεs:Metric.ball L ε ⊆ sN:ℕn:ℤh:∀ (ε : ℝ), 0 < ε → ∀ (N : ℤ), 0 ≤ N → ∃ n, N ≤ n ∧ |(if 0 ≤ n then a n.toNat else 0) - L| ≤ εhε:0 < εhn1:↑N ≤ nhn2:|a n.toNat - L| ≤ ε / 2hn:True⊢ |a n.toNat - L| < ε; All goals completed! 🐙
intro h a:ℕ → ℝL:ℝh:∀ (s : Set ℝ), (∃ ε > 0, Metric.ball L ε ⊆ s) → ∀ (a_2 : ℕ), ∃ b ≥ a_2, a b ∈ sε:ℝ⊢ ε > 0 → ∀ N ≥ 0, ∃ n ≥ N, |(if n ≥ 0 then a n.toNat else 0) - L| ≤ ε a:ℕ → ℝL:ℝh:∀ (s : Set ℝ), (∃ ε > 0, Metric.ball L ε ⊆ s) → ∀ (a_2 : ℕ), ∃ b ≥ a_2, a b ∈ sε:ℝhε:ε > 0⊢ ∀ N ≥ 0, ∃ n ≥ N, |(if n ≥ 0 then a n.toNat else 0) - L| ≤ ε a:ℕ → ℝL:ℝh:∀ (s : Set ℝ), (∃ ε > 0, Metric.ball L ε ⊆ s) → ∀ (a_2 : ℕ), ∃ b ≥ a_2, a b ∈ sε:ℝhε:ε > 0N:ℤ⊢ N ≥ 0 → ∃ n ≥ N, |(if n ≥ 0 then a n.toNat else 0) - L| ≤ ε a:ℕ → ℝL:ℝh:∀ (s : Set ℝ), (∃ ε > 0, Metric.ball L ε ⊆ s) → ∀ (a_2 : ℕ), ∃ b ≥ a_2, a b ∈ sε:ℝhε:ε > 0N:ℤa✝:N ≥ 0⊢ ∃ n ≥ N, |(if n ≥ 0 then a n.toNat else 0) - L| ≤ ε
have ⟨ n, hn1, hn2 ⟩ := h (Metric.ball L ε) ⟨ _, hε, a:ℕ → ℝL:ℝh:∀ (s : Set ℝ), (∃ ε > 0, Metric.ball L ε ⊆ s) → ∀ (a_2 : ℕ), ∃ b ≥ a_2, a b ∈ sε:ℝhε:ε > 0N:ℤa✝:N ≥ 0⊢ Metric.ball L ε ⊆ Metric.ball L ε All goals completed! 🐙 ⟩ N.toNat
have hn : n ≥ 0 := a:ℕ → ℝL:ℝ⊢ (↑a).LimitPoint L ↔ MapClusterPt L atTop a All goals completed! 🐙
refine ⟨ n, a:ℕ → ℝL:ℝh:∀ (s : Set ℝ), (∃ ε > 0, Metric.ball L ε ⊆ s) → ∀ (a_2 : ℕ), ∃ b ≥ a_2, a b ∈ sε:ℝhε:ε > 0N:ℤa✝:N ≥ 0n:ℕhn1:n ≥ N.toNathn2:a n ∈ Metric.ball L εhn:n ≥ 0 := zero_le n⊢ ↑n ≥ N rwa [ge_iff_le, ←Int.toNat_lea:ℕ → ℝL:ℝh:∀ (s : Set ℝ), (∃ ε > 0, Metric.ball L ε ⊆ s) → ∀ (a_2 : ℕ), ∃ b ≥ a_2, a b ∈ sε:ℝhε:ε > 0N:ℤa✝:N ≥ 0n:ℕhn1:n ≥ N.toNathn2:a n ∈ Metric.ball L εhn:n ≥ 0 := zero_le n⊢ N.toNat ≤ n, ?_ ⟩
a:ℕ → ℝL:ℝε:ℝN:ℤn:ℕh:∀ (s : Set ℝ) (x : ℝ), 0 < x → Metric.ball L x ⊆ s → ∀ (a_3 : ℕ), ∃ b, a_3 ≤ b ∧ a b ∈ shε:0 < εa✝:0 ≤ Nhn1:N ≤ ↑nhn2:|a n - L| < εhn:True⊢ |a n - L| ≤ ε; All goals completed! 🐙
Identification with Filter.limsup
theorem Chapter6.Sequence.limsup_eq (a:ℕ → ℝ) :
(a:Sequence).limsup = atTop.limsup (fun n ↦ (a n:EReal)) := a:ℕ → ℝ⊢ (↑a).limsup = Filter.limsup (fun n => ↑(a n)) atTop
simp_rw a:ℕ → ℝ⊢ (↑a).limsup = Filter.limsup (fun n => ↑(a n)) atTopFilter.limsup_eq, eventually_atTop]
All goals completed! 🐙
Identification with Filter.liminf
theorem Chapter6.Sequence.liminf_eq (a:ℕ → ℝ) :
(a:Sequence).liminf = atTop.liminf (fun n ↦ (a n:EReal)) := a:ℕ → ℝ⊢ (↑a).liminf = Filter.liminf (fun n => ↑(a n)) atTop
simp_rw a:ℕ → ℝ⊢ (↑a).liminf = Filter.liminf (fun n => ↑(a n)) atTopFilter.liminf_eq, eventually_atTop]
All goals completed! 🐙
Identification of rpow and Mathlib exponentiation
theorem Chapter6.Real.rpow_eq_rpow {x:ℝ} (hx: x > 0) (α:ℝ) : rpow x α = x^α := x:ℝhx:x > 0α:ℝ⊢ rpow x α = x ^ α
All goals completed! 🐙