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
a:ℕ → ℝ⊢ (∀ ε > 0, ∃ N, ∀ j ≥ N, ∀ k ≥ N, |a j - a k| ≤ ε) ↔ ∀ ε > 0, ∃ i, ∀ j ≥ i, |a j - a i| < ε
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| ≤ ε 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| < ε 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! 🐙)]
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| ≤ ε 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 < ε; 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| ≤ ε; 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| ≤ ε 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) All goals completed! 🐙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) All goals completed! 🐙
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:?_mvar.37089 := CauSeq.tendsto_limit ⟨_fvar.37083, (Chapter6.Sequence.isCauchy_iff_isCauSeq _fvar.37083).mp _fvar.37084⟩⊢ lim ↑a = CauSeq.lim ⟨a, ⋯⟩
a:ℕ → ℝha:(↑a).IsCauchyh1:?_mvar.37089 := CauSeq.tendsto_limit ⟨_fvar.37083, (Chapter6.Sequence.isCauchy_iff_isCauSeq _fvar.37083).mp _fvar.37084⟩h2:?_mvar.37497 := Chapter6.Sequence.lim_def ((Chapter6.Sequence.Cauchy_iff_convergent ↑_fvar.37083).mp _fvar.37084)⊢ 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; 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:_fvar.61970 ≥ 0 :=
Eq.mpr (id ge_iff_le._simp_1)
(Eq.mp (congrArg (fun x => x ≤ _fvar.61970) (dist_self (@_fvar.40435 0))) (@_fvar.61971 0 0))⊢ 0 ≤ C + |a 0| All goals completed! 🐙, ?_ ⟩
a:ℕ → ℝC:ℝh:∀ (a_1 a_2 : ℕ), dist (a a_1) (a a_2) ≤ Cthis:_fvar.61970 ≥ 0 := ?_mvar.62136n:ℤ⊢ |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:_fvar.61970 ≥ 0 := ?_mvar.62136n:ℤ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:_fvar.61970 ≥ 0 := ?_mvar.62136n:ℤ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:_fvar.61970 ≥ 0 := ?_mvar.62136n:ℤ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:_fvar.61970 ≥ 0 := ?_mvar.62136n:ℤ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:_fvar.61970 ≥ 0 := ?_mvar.62136n:ℤhn:¬n ≥ 0⊢ 0 ≤ C + |a 0|
a:ℕ → ℝC:ℝh:∀ (a_1 a_2 : ℕ), dist (a a_1) (a a_2) ≤ Cthis:_fvar.61970 ≥ 0 := ?_mvar.62136n:ℤ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:_fvar.61970 ≥ 0 :=
Eq.mpr (id ge_iff_le._simp_1)
(Eq.mp (congrArg (fun x => x ≤ _fvar.61970) (dist_self (@_fvar.40435 0))) (@_fvar.61971 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:_fvar.61970 ≥ 0 :=
Eq.mpr (id ge_iff_le._simp_1)
(Eq.mp (congrArg (fun x => x ≤ _fvar.61970) (dist_self (@_fvar.40435 0))) (@_fvar.61971 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:_fvar.61970 ≥ 0 :=
Eq.mpr (id ge_iff_le._simp_1)
(Eq.mp (congrArg (fun x => x ≤ _fvar.61970) (dist_self (@_fvar.40435 0))) (@_fvar.61971 0 0))n:ℤhn:n ≥ 0⊢ AddLeftMono ℝ; a:ℕ → ℝC:ℝh:∀ (a_1 a_2 : ℕ), dist (a a_1) (a a_2) ≤ Cthis:_fvar.61970 ≥ 0 :=
Eq.mpr (id ge_iff_le._simp_1)
(Eq.mp (congrArg (fun x => x ≤ _fvar.61970) (dist_self (@_fvar.40435 0))) (@_fvar.61971 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:_fvar.61970 ≥ 0 :=
Eq.mpr (id ge_iff_le._simp_1)
(Eq.mp (congrArg (fun x => x ≤ _fvar.61970) (dist_self (@_fvar.40435 0))) (@_fvar.61971 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:_fvar.61970 ≥ 0 :=
Eq.mpr (id ge_iff_le._simp_1)
(Eq.mp (congrArg (fun x => x ≤ _fvar.61970) (dist_self (@_fvar.40435 0))) (@_fvar.61971 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:_fvar.61970 ≥ 0 :=
Eq.mpr (id ge_iff_le._simp_1)
(Eq.mp (congrArg (fun x => x ≤ _fvar.61970) (dist_self (@_fvar.40435 0))) (@_fvar.61971 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
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_2 : ℕ), ∃ b ≥ a_2, a b ∈ s
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 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:_fvar.87001 ≥ 0 :=
Chapter6.Sequence.limit_point_iff._proof_5 _fvar.84983 _fvar.84984 _fvar.86552 _fvar.86555 _fvar.86606 _fvar.86607
_fvar.86608 _fvar.86702 _fvar.87001 _fvar.87002 _fvar.87003⊢ 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:_fvar.87001 ≥ 0 :=
Chapter6.Sequence.limit_point_iff._proof_5 _fvar.84983 _fvar.84984 _fvar.86552 _fvar.86555 _fvar.86606 _fvar.86607
_fvar.86608 _fvar.86702 _fvar.87001 _fvar.87002 _fvar.87003⊢ ↑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:_fvar.87001 ≥ 0 := ?_mvar.89751⊢ 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! 🐙
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:_fvar.116180 ≥ 0 := zero_le _fvar.116180⊢ ↑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:_fvar.116180 ≥ 0 := zero_le _fvar.116180⊢ 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
a:ℕ → ℝ⊢ (↑a).limsup = sInf {a_1 | ∃ a_2, ∀ b ≥ a_2, ↑(a b) ≤ a_1}
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
a:ℕ → ℝ⊢ (↑a).liminf = sSup {a_1 | ∃ a_2, ∀ b ≥ a_2, a_1 ≤ ↑(a b)}
All goals completed! 🐙
Identification of rpow and Mathlib exponentiation
theorem Chapter6.Real.rpow_eq_rpow (x:ℝ) (α:ℝ) : rpow x α = x^α := x:ℝα:ℝ⊢ rpow x α = x ^ α
All goals completed! 🐙