Аналіз I, Розділ 6, Епілог
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.
Identification with the Cauchy sequence support in Mathlib.Algebra.Order.CauSeq.Basic
theorem Chapter6.Sequence.Cauchy_iff_CauSeq (a: ℕ → ℝ) :
(a:Sequence).isCauchy ↔ IsCauSeq _root_.abs a := a:ℕ → ℝ⊢ { m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.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:ℕ → ℝh:∀ ε > 0, ∃ N, ∀ j ≥ N, ∀ k ≥ N, |a j - a k| ≤ εε:ℝhε:ε > 0⊢ ∃ i, ∀ j ≥ i, |a j - a i| < ε
a:ℕ → ℝε:ℝhε:ε > 0h:∃ N, ∀ j ≥ N, ∀ k ≥ N, |a j - a k| ≤ ε / 2⊢ ∃ i, ∀ j ≥ i, |a j - a i| < ε
a:ℕ → ℝε:ℝhε:ε > 0N:ℕh:∀ j ≥ N, ∀ k ≥ N, |a j - a k| ≤ ε / 2⊢ ∃ i, ∀ j ≥ i, |a j - a i| < ε
a:ℕ → ℝε:ℝhε:ε > 0N:ℕh:∀ j ≥ N, ∀ k ≥ N, |a j - a k| ≤ ε / 2⊢ ∀ j ≥ N, |a j - a N| < ε
a:ℕ → ℝε:ℝhε:ε > 0N:ℕh:∀ j ≥ N, ∀ k ≥ N, |a j - a k| ≤ ε / 2n:ℕhn:n ≥ N⊢ |a n - a N| < ε
a:ℕ → ℝε:ℝhε:ε > 0N:ℕn:ℕhn:n ≥ Nh:|a n - a N| ≤ ε / 2⊢ |a n - a N| < ε
All goals completed! 🐙
a:ℕ → ℝh:∀ ε > 0, ∃ i, ∀ j ≥ i, |a j - a i| < εε:ℝhε:ε > 0⊢ ∃ N, ∀ j ≥ N, ∀ k ≥ N, |a j - a k| ≤ ε
a:ℕ → ℝε:ℝhε:ε > 0h:∃ i, ∀ j ≥ i, |a j - a i| < ε / 2⊢ ∃ N, ∀ j ≥ N, ∀ k ≥ N, |a j - a k| ≤ ε
a:ℕ → ℝε:ℝhε:ε > 0N:ℕh:∀ j ≥ N, |a j - a N| < ε / 2⊢ ∃ N, ∀ j ≥ N, ∀ k ≥ N, |a j - a k| ≤ ε
a:ℕ → ℝε:ℝhε:ε > 0N:ℕh:∀ j ≥ N, |a j - a N| < ε / 2⊢ ∀ j ≥ N, ∀ k ≥ N, |a j - a k| ≤ ε
a:ℕ → ℝε:ℝ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ε:ε > 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| a:ℕ → ℝε:ℝ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 N - a m|; All goals completed! 🐙
_ ≤ ε/2 + ε/2 := a:ℕ → ℝε:ℝ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 a:ℕ → ℝε:ℝ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; a:ℕ → ℝε:ℝhε:ε > 0N:ℕh:∀ j ≥ N, |a j - a N| < ε / 2n:ℕhn:n ≥ Nm:ℕhm:m ≥ N⊢ |a n - a N| < ε / 2a:ℕ → ℝε:ℝhε:ε > 0N:ℕh:∀ j ≥ N, |a j - a N| < ε / 2n:ℕhn:n ≥ Nm:ℕhm:m ≥ N⊢ |a m - a N| < ε / 2; a:ℕ → ℝε:ℝhε:ε > 0N:ℕh:∀ j ≥ N, |a j - a N| < ε / 2n:ℕhn:n ≥ Nm:ℕhm:m ≥ N⊢ |a m - a N| < ε / 2; All goals completed! 🐙
_ = _ := a:ℕ → ℝε:ℝ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:ℕ → ℝ⊢ { m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchy ↔ CauchySeq a
a:ℕ → ℝ⊢ IsCauSeq _root_.abs a ↔ CauchySeq a
All goals completed! 🐙
Identifiction with Filter.Tendsto
theorem Chapter6.Sequence.tendsto_iff_Tendsto (a: ℕ → ℝ) (L:ℝ) :
(a:Sequence).tendsTo L ↔ Filter.Tendsto a Filter.atTop (nhds L) := a:ℕ → ℝL:ℝ⊢ { m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.tendsTo L ↔
Filter.Tendsto a Filter.atTop (nhds L)
a:ℕ → ℝL:ℝ⊢ (∀ ε > 0, ∃ N, ∀ n ≥ N, |{ m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.seq n - L| ≤ ε) ↔
∀ ε > 0, ∃ N, ∀ n ≥ N, dist (a n) L < ε
a:ℕ → ℝL:ℝ⊢ (∀ ε > 0, ∃ N, ∀ n ≥ N, |{ m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.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, |{ m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.seq n - L| ≤ ε
a:ℕ → ℝL:ℝ⊢ (∀ ε > 0, ∃ N, ∀ n ≥ N, |{ m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.seq n - L| ≤ ε) →
∀ ε > 0, ∃ N, ∀ n ≥ N, dist (a n) L < ε a:ℕ → ℝL:ℝh:∀ ε > 0, ∃ N, ∀ n ≥ N, |{ m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.seq n - L| ≤ εε:ℝhε:ε > 0⊢ ∃ N, ∀ n ≥ N, dist (a n) L < ε
a:ℕ → ℝL:ℝε:ℝhε:ε > 0h:∃ N, ∀ n ≥ N, |{ m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.seq n - L| ≤ ε / 2⊢ ∃ N, ∀ n ≥ N, dist (a n) L < ε
a:ℕ → ℝL:ℝε:ℝhε:ε > 0N:ℤhN:∀ n ≥ N, |{ m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.seq n - L| ≤ ε / 2⊢ ∃ N, ∀ n ≥ N, dist (a n) L < ε
a:ℕ → ℝL:ℝε:ℝhε:ε > 0N:ℤhN:∀ n ≥ N, |{ m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.seq n - L| ≤ ε / 2⊢ ∀ n ≥ N.toNat, dist (a n) L < ε
a:ℕ → ℝL:ℝε:ℝhε:ε > 0N:ℤhN:∀ n ≥ N, |{ m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.seq n - L| ≤ ε / 2n:ℕhn:n ≥ N.toNat⊢ dist (a n) L < ε
a:ℕ → ℝL:ℝε:ℝhε:ε > 0N:ℤn:ℕhn:n ≥ N.toNathN:|{ m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.seq ↑n - L| ≤ ε / 2⊢ dist (a n) L < ε
a:ℕ → ℝL:ℝε:ℝhε:ε > 0N:ℤn:ℕhn:n ≥ N.toNathN:|a n - L| ≤ ε / 2⊢ dist (a n) L < ε
a:ℕ → ℝ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ε:ε > 0⊢ ∃ N, ∀ n ≥ N, |{ m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.seq n - L| ≤ ε
a:ℕ → ℝL:ℝε:ℝhε:ε > 0h:∃ N, ∀ n ≥ N, dist (a n) L < ε⊢ ∃ N, ∀ n ≥ N, |{ m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.seq n - L| ≤ ε
a:ℕ → ℝL:ℝε:ℝhε:ε > 0N:ℕhN:∀ n ≥ N, dist (a n) L < ε⊢ ∃ N, ∀ n ≥ N, |{ m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.seq n - L| ≤ ε
a:ℕ → ℝL:ℝε:ℝhε:ε > 0N:ℕhN:∀ n ≥ N, dist (a n) L < ε⊢ ∀ n ≥ ↑N, |{ m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.seq n - L| ≤ ε
a:ℕ → ℝL:ℝε:ℝhε:ε > 0N:ℕhN:∀ n ≥ N, dist (a n) L < εn:ℤhn:n ≥ ↑N⊢ |{ m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.seq n - L| ≤ ε
have hpos : n ≥ 0 := LE.le.trans (a:ℕ → ℝL:ℝε:ℝhε:ε > 0N:ℕhN:∀ n ≥ N, dist (a n) L < εn:ℤhn:n ≥ ↑N⊢ 0 ≤ ↑N All goals completed! 🐙) hn
a:ℕ → ℝL:ℝε:ℝhε:ε > 0N:ℕhN:∀ n ≥ N, dist (a n) L < εn:ℤhn:N ≤ n.toNathpos:n ≥ 0⊢ |{ m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.seq n - L| ≤ ε
a:ℕ → ℝL:ℝε:ℝhε:ε > 0N:ℕn:ℤhn:N ≤ n.toNathpos:n ≥ 0hN:dist (a n.toNat) L < ε⊢ |{ m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.seq n - L| ≤ ε
a:ℕ → ℝL:ℝε:ℝhε:ε > 0N:ℕn:ℤhn:N ≤ n.toNathpos:n ≥ 0hN:dist (a n.toNat) L < ε⊢ dist (a n.toNat) L ≤ ε
All goals completed! 🐙
theorem Chapter6.Sequence.tendsto_iff_Tendsto' (a: Sequence) (L:ℝ) : a.tendsTo L ↔ Filter.Tendsto a.seq Filter.atTop (nhds L) := a:SequenceL:ℝ⊢ a.tendsTo L ↔ Filter.Tendsto a.seq Filter.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:ℝh:∀ ε > 0, ∃ N, ∀ n ≥ N, |a.seq n - L| ≤ εε:ℝhε:ε > 0⊢ ∃ N, ∀ n ≥ N, dist (a.seq n) L < ε
a:SequenceL:ℝε:ℝhε:ε > 0h:∃ N, ∀ n ≥ N, |a.seq n - L| ≤ ε / 2⊢ ∃ N, ∀ n ≥ N, dist (a.seq n) L < ε
a:SequenceL:ℝε:ℝhε:ε > 0N:ℤhN:∀ n ≥ N, |a.seq n - L| ≤ ε / 2⊢ ∃ N, ∀ n ≥ N, dist (a.seq n) L < ε
a:SequenceL:ℝε:ℝhε:ε > 0N:ℤhN:∀ n ≥ N, |a.seq n - L| ≤ ε / 2⊢ ∀ n ≥ N, dist (a.seq n) L < ε
a:SequenceL:ℝε:ℝhε:ε > 0N:ℤhN:∀ n ≥ N, |a.seq n - L| ≤ ε / 2n:ℤhn:n ≥ N⊢ dist (a.seq n) L < ε
a:SequenceL:ℝε:ℝhε:ε > 0N:ℤn:ℤhn:n ≥ NhN:|a.seq n - L| ≤ ε / 2⊢ dist (a.seq n) L < ε
a:SequenceL:ℝε:ℝhε:ε > 0N:ℤn:ℤhn:n ≥ NhN:|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ε:ε > 0⊢ ∃ N, ∀ n ≥ N, |a.seq n - L| ≤ ε
a:SequenceL:ℝε:ℝhε:ε > 0h:∃ N, ∀ n ≥ N, dist (a.seq n) L < ε⊢ ∃ N, ∀ n ≥ N, |a.seq n - L| ≤ ε
a:SequenceL:ℝε:ℝhε:ε > 0N:ℤhN:∀ n ≥ N, dist (a.seq n) L < ε⊢ ∃ N, ∀ n ≥ N, |a.seq n - L| ≤ ε
a:SequenceL:ℝε:ℝhε:ε > 0N:ℤhN:∀ n ≥ N, dist (a.seq n) L < ε⊢ ∀ n ≥ N, |a.seq n - L| ≤ ε
a:SequenceL:ℝε:ℝhε:ε > 0N:ℤhN:∀ n ≥ N, dist (a.seq n) L < εn:ℤhn:n ≥ N⊢ |a.seq n - L| ≤ ε
a:SequenceL:ℝε:ℝhε:ε > 0N:ℤhN:∀ n ≥ N, dist (a.seq n) L < εn:ℤhn:N ≤ n⊢ |a.seq n - L| ≤ ε
a:SequenceL:ℝε:ℝhε:ε > 0N:ℤn:ℤhn:N ≤ nhN:dist (a.seq n) L < ε⊢ |a.seq n - L| ≤ ε
a:SequenceL:ℝε:ℝhε:ε > 0N:ℤn:ℤhn:N ≤ nhN:dist (a.seq n) L < ε⊢ dist (a.seq n) L ≤ ε
All goals completed! 🐙
theorem Chapter6.Sequence.converges_iff_Tendsto (a: ℕ → ℝ) :
(a:Sequence).convergent ↔ ∃ L, Filter.Tendsto a Filter.atTop (nhds L) := a:ℕ → ℝ⊢ { m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.convergent ↔
∃ L, Filter.Tendsto a Filter.atTop (nhds L)
All goals completed! 🐙
theorem Chapter6.Sequence.converges_iff_Tendsto' (a: Sequence) : a.convergent ↔ ∃ L, Filter.Tendsto a.seq Filter.atTop (nhds L) := a:Sequence⊢ a.convergent ↔ ∃ L, Filter.Tendsto a.seq Filter.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, (Cauchy_iff_CauSeq a).mp ha⟩ := a:ℕ → ℝha:{ m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchy⊢ lim { m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ } = CauSeq.lim ⟨a, ⋯⟩
a:ℕ → ℝha:{ m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyh1:Filter.Tendsto (↑⟨a, ⋯⟩) Filter.atTop (nhds (CauSeq.lim ⟨a, ⋯⟩))⊢ lim { m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ } = CauSeq.lim ⟨a, ⋯⟩
a:ℕ → ℝha:{ m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyh1:Filter.Tendsto (↑⟨a, ⋯⟩) Filter.atTop (nhds (CauSeq.lim ⟨a, ⋯⟩))h2:{ m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.tendsTo
(lim { m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ })⊢ lim { m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ } = CauSeq.lim ⟨a, ⋯⟩
a:ℕ → ℝha:{ m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyh1:{ m := 0, seq := fun n => if n ≥ 0 then ↑⟨a, ⋯⟩ n.toNat else 0, vanish := ⋯ }.tendsTo (CauSeq.lim ⟨a, ⋯⟩)h2:{ m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.tendsTo
(lim { m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ })⊢ lim { m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ } = CauSeq.lim ⟨a, ⋯⟩
a:ℕ → ℝha:{ m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyh1:{ m := 0, seq := fun n => if n ≥ 0 then ↑⟨a, ⋯⟩ n.toNat else 0, vanish := ⋯ }.tendsTo (CauSeq.lim ⟨a, ⋯⟩)h2:{ m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.tendsTo
(lim { m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ })h:lim { m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ } ≠ CauSeq.lim ⟨a, ⋯⟩⊢ False
a:ℕ → ℝha:{ m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyh1:{ m := 0, seq := fun n => if n ≥ 0 then ↑⟨a, ⋯⟩ n.toNat else 0, vanish := ⋯ }.tendsTo (CauSeq.lim ⟨a, ⋯⟩)h2:{ m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.tendsTo
(lim { m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ })h:¬({ m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.tendsTo
(lim { m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }) ∧
{ m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.tendsTo (CauSeq.lim ⟨a, ⋯⟩))⊢ False
All goals completed! 🐙
Identification with Bornology.IsBounded
theorem Chapter6.Sequence.isBounded_iff_isBounded_range (a:ℕ → ℝ):
(a:Sequence).isBounded ↔ Bornology.IsBounded (Set.range a) := a:ℕ → ℝ⊢ { m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.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:ℕ → ℝh:∃ 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:ℝ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:ℕ → ℝh:∃ 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:ℕ → ℝ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:ℕ → ℝ⊢ { m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isBounded ↔ Bornology.IsBounded (Set.range a)
a:ℕ → ℝC:ℝh:dist (a 0) (a 0) ≤ C⊢ C ≥ 0
a:ℕ → ℝC:ℝh: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⊢ 0 ≤ C + |a 0| All goals completed! 🐙, ?_ ⟩
a:ℕ → ℝC:ℝh:∀ (a_1 a_2 : ℕ), dist (a a_1) (a a_2) ≤ Cthis:C ≥ 0n:ℤ⊢ |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 ≥ 0n:ℤ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 ≥ 0n:ℤhn:¬n ≥ 0⊢ |if 0 ≤ n then a n.toNat else 0| ≤ C + |a 0|
all_goals a:ℕ → ℝC:ℝh:∀ (a_1 a_2 : ℕ), dist (a a_1) (a a_2) ≤ Cthis:C ≥ 0n:ℤhn:¬n ≥ 0⊢ 0 ≤ C + |a 0|
a:ℕ → ℝC:ℝh:∀ (a_1 a_2 : ℕ), dist (a a_1) (a a_2) ≤ Cthis:C ≥ 0n:ℤ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 ≥ 0n:ℤ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 ≥ 0n:ℤ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 ≥ 0n:ℤhn:n ≥ 0⊢ AddLeftMono ℝ
a:ℕ → ℝC:ℝh:∀ (a_1 a_2 : ℕ), dist (a a_1) (a a_2) ≤ Cthis:C ≥ 0n:ℤhn:n ≥ 0⊢ a n.toNat = a n.toNat - a 0 + a 0 All goals completed! 🐙
All goals completed! 🐙
_ ≤ C + |a 0| := a:ℕ → ℝC:ℝh:∀ (a_1 a_2 : ℕ), dist (a a_1) (a a_2) ≤ Cthis:C ≥ 0n:ℤ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 ≥ 0n:ℤ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 ≥ 0n:ℤ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:ℕ → ℝ⊢ { m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.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:ℕ → ℝ⊢ { m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.inf = sInf (Set.range fun n => ↑(a n)) All goals completed! 🐙
theorem Chapter6.Sequence.bddAbove_iff (a:ℕ → ℝ):
(a:Sequence).bddAbove ↔ BddAbove (Set.range a) := a:ℕ → ℝ⊢ { m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.bddAbove ↔ BddAbove (Set.range a) All goals completed! 🐙
theorem Chapter6.Sequence.bddBelow_iff (a:ℕ → ℝ):
(a:Sequence).bddBelow ↔ BddBelow (Set.range a) := a:ℕ → ℝ⊢ { m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.bddBelow ↔ BddBelow (Set.range a) All goals completed! 🐙
theorem Chapter6.Sequence.Monotone_iff (a:ℕ → ℝ): (a:Sequence).isMonotone ↔ Monotone a := a:ℕ → ℝ⊢ { m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isMonotone ↔ Monotone a All goals completed! 🐙
theorem Chapter6.Sequence.Antitone_iff (a:ℕ → ℝ): (a:Sequence).isAntitone ↔ Antitone a := a:ℕ → ℝ⊢ { m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isAntitone ↔ Antitone a All goals completed! 🐙
Identification with Filter.MapClusterPt
theorem Chapter6.Sequence.limit_point_iff (a:ℕ → ℝ) (L:ℝ) :
(a:Sequence).limit_point L ↔ MapClusterPt L Filter.atTop a := a:ℕ → ℝL:ℝ⊢ { m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.limit_point L ↔ MapClusterPt L Filter.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 ℝhs:∃ ε > 0, Metric.ball L ε ⊆ sN:ℕ⊢ ∃ b ≥ N, a b ∈ s
a:ℕ → ℝL:ℝh:∀ ε > 0, ∀ N ≥ 0, ∃ n ≥ N, |(if n ≥ 0 then a n.toNat else 0) - L| ≤ εs:Set ℝN:ℕε:ℝhε:ε > 0hεs:Metric.ball L ε ⊆ s⊢ ∃ b ≥ N, a b ∈ s
specialize h (ε/2) (half_pos hε) N (a:ℕ → ℝL:ℝh:∀ ε > 0, ∀ N ≥ 0, ∃ n ≥ N, |(if n ≥ 0 then a n.toNat else 0) - L| ≤ εs:Set ℝN:ℕε:ℝhε:ε > 0hεs:Metric.ball L ε ⊆ s⊢ ↑N ≥ 0 All goals completed! 🐙)
a:ℕ → ℝL:ℝs:Set ℝN:ℕε:ℝhε:ε > 0hεs:Metric.ball L ε ⊆ sn:ℤhn1:n ≥ ↑Nhn2:|(if n ≥ 0 then a n.toNat else 0) - L| ≤ ε / 2⊢ ∃ b ≥ N, a b ∈ s
have hn : n ≥ 0 := LE.le.trans (a:ℕ → ℝL:ℝs:Set ℝN:ℕε:ℝhε:ε > 0hεs:Metric.ball L ε ⊆ sn:ℤhn1:n ≥ ↑Nhn2:|(if n ≥ 0 then a n.toNat else 0) - L| ≤ ε / 2⊢ 0 ≤ ↑N All goals completed! 🐙) hn1
a:ℕ → ℝL:ℝs:Set ℝN:ℕε:ℝhε:ε > 0hεs:Metric.ball L ε ⊆ sn:ℤhn1:n ≥ ↑Nhn2:|(if n ≥ 0 then a n.toNat else 0) - L| ≤ ε / 2hn:n ≥ 0⊢ n.toNat ≥ Na:ℕ → ℝL:ℝs:Set ℝN:ℕε:ℝhε:ε > 0hεs:Metric.ball L ε ⊆ sn:ℤhn1:n ≥ ↑Nhn2:|(if n ≥ 0 then a n.toNat else 0) - L| ≤ ε / 2hn:n ≥ 0⊢ a n.toNat ∈ s
a:ℕ → ℝL:ℝs:Set ℝN:ℕε:ℝhε:ε > 0hεs:Metric.ball L ε ⊆ sn:ℤhn1:n ≥ ↑Nhn2:|(if n ≥ 0 then a n.toNat else 0) - L| ≤ ε / 2hn:n ≥ 0⊢ n.toNat ≥ N rwa [ge_iff_le, Int.le_toNat hna:ℕ → ℝL:ℝs:Set ℝN:ℕε:ℝhε:ε > 0hεs:Metric.ball L ε ⊆ sn:ℤhn1:n ≥ ↑Nhn2:|(if n ≥ 0 then a n.toNat else 0) - L| ≤ ε / 2hn:n ≥ 0⊢ ↑N ≤ n
a:ℕ → ℝL:ℝs:Set ℝN:ℕε:ℝhε:ε > 0hεs:Metric.ball L ε ⊆ sn:ℤhn1:n ≥ ↑Nhn2:|(if n ≥ 0 then a n.toNat else 0) - L| ≤ ε / 2hn:n ≥ 0⊢ a n.toNat ∈ Metric.ball L ε
a:ℕ → ℝL:ℝs:Set ℝN:ℕε:ℝhε:ε > 0hεs:Metric.ball L ε ⊆ sn:ℤhn1:n ≥ ↑Nhn:n ≥ 0hn2:|a n.toNat - L| ≤ ε / 2⊢ |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:ℤhN:N ≥ 0⊢ ∃ n ≥ N, |(if n ≥ 0 then a n.toNat else 0) - L| ≤ ε
a:ℕ → ℝL:ℝε:ℝhε:ε > 0N:ℤhN:N ≥ 0h:∃ b ≥ N.toNat, a b ∈ Metric.ball L ε⊢ ∃ n ≥ N, |(if n ≥ 0 then a n.toNat else 0) - L| ≤ ε
a:ℕ → ℝL:ℝε:ℝhε:ε > 0N:ℤhN:N ≥ 0n:ℕhn1:n ≥ N.toNathn2:a n ∈ Metric.ball L ε⊢ ∃ n ≥ N, |(if n ≥ 0 then a n.toNat else 0) - L| ≤ ε
have hn : n ≥ 0 := a:ℕ → ℝL:ℝ⊢ { m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.limit_point L ↔ MapClusterPt L Filter.atTop a All goals completed! 🐙
a:ℕ → ℝL:ℝε:ℝhε:ε > 0N:ℤhN:N ≥ 0n:ℕhn1:n ≥ N.toNathn2:a n ∈ Metric.ball L εhn:n ≥ 0⊢ ↑n ≥ Na:ℕ → ℝL:ℝε:ℝhε:ε > 0N:ℤhN:N ≥ 0n:ℕhn1:n ≥ N.toNathn2:a n ∈ Metric.ball L εhn:n ≥ 0⊢ |(if ↑n ≥ 0 then a (↑n).toNat else 0) - L| ≤ ε
a:ℕ → ℝL:ℝε:ℝhε:ε > 0N:ℤhN:N ≥ 0n:ℕhn1:n ≥ N.toNathn2:a n ∈ Metric.ball L εhn:n ≥ 0⊢ ↑n ≥ N rwa [ge_iff_le, ←Int.toNat_lea:ℕ → ℝL:ℝε:ℝhε:ε > 0N:ℤhN:N ≥ 0n:ℕhn1:n ≥ N.toNathn2:a n ∈ Metric.ball L εhn:n ≥ 0⊢ N.toNat ≤ n
a:ℕ → ℝL:ℝε:ℝhε:ε > 0N:ℤhN:N ≥ 0n:ℕhn1:n ≥ N.toNathn:n ≥ 0hn2:|a n - L| < ε⊢ |a n - L| ≤ ε
All goals completed! 🐙
Identification with Filter.limsup
theorem Chapter6.Sequence.limsup_eq (a:ℕ → ℝ) :
(a:Sequence).limsup = Filter.limsup (fun n ↦ (a n:EReal)) Filter.atTop := a:ℕ → ℝ⊢ { m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.limsup =
Filter.limsup (fun n => ↑(a n)) Filter.atTop
a:ℕ → ℝ⊢ { m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.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 = Filter.liminf (fun n ↦ (a n:EReal)) Filter.atTop := a:ℕ → ℝ⊢ { m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.liminf =
Filter.liminf (fun n => ↑(a n)) Filter.atTop
a:ℕ → ℝ⊢ { m := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.liminf =
sSup {a_1 | ∃ a_2, ∀ b ≥ a_2, a_1 ≤ ↑(a b)}
All goals completed! 🐙