Imports
import Mathlib.Tactic import Mathlib.Algebra.Field.Power

Analysis I, Section 7.2: Infinite series

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:

  • Formal series and their limits.

  • Absolute convergence; basic series laws.

namespace Chapter7open BigOperators

Definition 7.2.1 (Formal infinite series). This is similar to Chapter 6 sequence, but is manipulated differently. As with Chapter 5, we will start series from 0 by default.

@[ext] structure Series where m : seq : vanish : n < m, seq n = 0

Functions from ℕ to ℝ can be thought of as series.

instance Series.instCoe : Coe ( ) Series where coe := fun a { m := 0 seq n := if n 0 then a n.toNat else 0 vanish := a: n < 0, (if n 0 then a n.toNat else 0) = 0 All goals completed! 🐙 }
@[simp] theorem Series.eval_coe (a: ) (n: ) : (a: Series).seq n = a n := a: n:{ m := 0, seq := fun n if n 0 then a n.toNat else 0, vanish := }.seq n = a n All goals completed! 🐙abbrev Series.mk' {m:} (a: { n // n m } ) : Series where m := m seq n := if h : n m then a n, h else 0 vanish := m:a:{ n // n m } n < m, (if h : n m then a n, h else 0) = 0 All goals completed! 🐙theorem Series.eval_mk' {m:} (a : { n // n m } ) {n : } (h:n m) : (Series.mk' a).seq n = a n, h := m:a:{ n // n m } n:h:n m(mk' a).seq n = a n, h All goals completed! 🐙

Definition 7.2.2 (Convergence of series)

noncomputable abbrev Series.partial (s : Series) (N:) : := n Finset.Icc s.m N, s.seq n
theorem Series.partial_succ (s : Series) {N:} (h: N s.m-1) : s.partial (N+1) = s.partial N + s.seq (N+1) := s:SeriesN:h:N s.m - 1s.partial (N + 1) = s.partial N + s.seq (N + 1) s:SeriesN:h:N s.m - 1 n Finset.Icc s.m (N + 1), s.seq n = n Finset.Icc s.m N, s.seq n + s.seq (N + 1) s:SeriesN:h:N s.m - 1 n Finset.Icc s.m (N + 1), s.seq n = s.seq (N + 1) + s.partial N convert Finset.sum_insert (show N+1 Finset.Icc s.m N s:SeriesN:h:N s.m - 1s.partial (N + 1) = s.partial N + s.seq (N + 1) All goals completed! 🐙) s:SeriesN:h:N s.m - 1insert (N + 1) (Finset.Icc s.m N) = Finset.Icc s.m (N + 1); s:SeriesN:h:N s.m - 1s.m N + 1; All goals completed! 🐙theorem Series.partial_of_lt {s : Series} {N:} (h: N < s.m) : s.partial N = 0 := s:SeriesN:h:N < s.ms.partial N = 0 s:SeriesN:h:N < s.m n Finset.Icc s.m N, s.seq n = 0 s:SeriesN:h:N < s.m x Finset.Icc s.m N, s.seq x = 0 intro n s:SeriesN:h:N < s.mn:hn:n Finset.Icc s.m Ns.seq n = 0; s:SeriesN:h:N < s.mn:hn:s.m n n Ns.seq n = 0; All goals completed! 🐙abbrev Series.convergesTo (s : Series) (L:) : Prop := Filter.atTop.Tendsto (s.partial) (nhds L)abbrev Series.converges (s : Series) : Prop := L, s.convergesTo Labbrev Series.diverges (s : Series) : Prop := ¬s.convergesopen Classical in noncomputable abbrev Series.sum (s : Series) : := if h : s.converges then h.choose else 0theorem Series.converges_of_convergesTo {s : Series} {L:} (h: s.convergesTo L) : s.converges := s:SeriesL:h:s.convergesTo Ls.converges All goals completed! 🐙

Remark 7.2.3

theorem Series.sum_of_converges {s : Series} {L:} (h: s.convergesTo L) : s.sum = L := s:SeriesL:h:s.convergesTo Ls.sum = L s:SeriesL:h:s.convergesTo LExists.choose = L All goals completed! 🐙
theorem Series.convergesTo_uniq {s : Series} {L L':} (h: s.convergesTo L) (h': s.convergesTo L') : L = L' := tendsto_nhds_unique h h'theorem Series.convergesTo_sum {s : Series} (h: s.converges) : s.convergesTo s.sum := s:Seriesh:s.convergess.convergesTo s.sum s:Seriesh:s.convergess.convergesTo (Exists.choose ); All goals completed! 🐙

Example 7.2.4

noncomputable abbrev Series.example_7_2_4 := mk' (m := 1) (fun n (2:)^(-n:))
theorem declaration uses `sorry`Series.example_7_2_4a {N:} (hN: N 1) : example_7_2_4.partial N = 1 - (2:)^(-N) := N:hN:N 1example_7_2_4.partial N = 1 - 2 ^ (-N) All goals completed! 🐙theorem declaration uses `sorry`Series.example_7_2_4b : example_7_2_4.convergesTo 1 := example_7_2_4.convergesTo 1 All goals completed! 🐙theorem declaration uses `sorry`Series.example_7_2_4c : example_7_2_4.sum = 1 := example_7_2_4.sum = 1 All goals completed! 🐙noncomputable abbrev Series.example_7_2_4' := mk' (m := 1) (fun n (2:)^(n:))theorem declaration uses `sorry`Series.example_7_2_4'a {N:} (hN: N 1) : example_7_2_4'.partial N = (2:)^(N+1) - 2 := N:hN:N 1example_7_2_4'.partial N = 2 ^ (N + 1) - 2 All goals completed! 🐙theorem declaration uses `sorry`Series.example_7_2_4'b : example_7_2_4'.diverges := example_7_2_4'.diverges All goals completed! 🐙

Proposition 7.2.5 / Exercise 7.2.2

theorem declaration uses `sorry`Series.converges_iff_tail_decay (s:Series) : s.converges ε > 0, N s.m, p N, q N, | n Finset.Icc p q, s.seq n| ε := s:Seriess.converges ε > 0, N s.m, p N, q N, | n Finset.Icc p q, s.seq n| ε All goals completed! 🐙

Corollary 7.2.6 (Zero test) / Exercise 7.2.3

theorem declaration uses `sorry`Series.decay_of_converges {s:Series} (h: s.converges) : Filter.atTop.Tendsto s.seq (nhds 0) := s:Seriesh:s.convergesFilter.Tendsto s.seq Filter.atTop (nhds 0) All goals completed! 🐙
theorem declaration uses `sorry`Series.diverges_of_nodecay {s:Series} (h: ¬ Filter.atTop.Tendsto s.seq (nhds 0)) : s.diverges := s:Seriesh:¬Filter.Tendsto s.seq Filter.atTop (nhds 0)s.diverges All goals completed! 🐙

Example 7.2.7

theorem declaration uses `sorry`Series.example_7_2_7 : ((fun _: (1:)):Series).diverges := { m := 0, seq := fun n if n 0 then (fun x 1) n.toNat else 0, vanish := }.diverges ¬Filter.Tendsto { m := 0, seq := fun n if n 0 then (fun x 1) n.toNat else 0, vanish := }.seq Filter.atTop (nhds 0) All goals completed! 🐙
theorem declaration uses `sorry`Series.example_7_2_7' : ((fun n: (-1:)^n):Series).diverges := { m := 0, seq := fun n if n 0 then (fun n (-1) ^ n) n.toNat else 0, vanish := }.diverges ¬Filter.Tendsto { m := 0, seq := fun n if n 0 then (fun n (-1) ^ n) n.toNat else 0, vanish := }.seq Filter.atTop (nhds 0) All goals completed! 🐙

Definition 7.2.8 (Absolute convergence)

abbrev Series.abs (s:Series) : Series := mk' (m:=s.m) (fun n |s.seq n|)
abbrev Series.absConverges (s:Series) : Prop := s.abs.convergesabbrev Series.condConverges (s:Series) : Prop := s.converges ¬ s.absConverges

Proposition 7.2.9 (Absolute convergence test) / Exercise 7.2.4

theorem declaration uses `sorry`Series.converges_of_absConverges {s:Series} (h : s.absConverges) : s.converges := s:Seriesh:s.absConvergess.converges All goals completed! 🐙
theorem declaration uses `sorry`Series.abs_le {s:Series} (h : s.absConverges) : |s.sum| s.abs.sum := s:Seriesh:s.absConverges|s.sum| s.abs.sum All goals completed! 🐙

Proposition 7.2.12 (Alternating series test)

theorem declaration uses `sorry`Series.converges_of_alternating {m:} {a: { n // n m} } (ha: n, a n 0) (ha': Antitone a) : ((mk' (fun n (-1)^(n:) * a n)).converges Filter.atTop.Tendsto a (nhds 0)) := m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone a(mk' fun n (-1) ^ n * a n).converges Filter.Tendsto a Filter.atTop (nhds 0) -- This proof is written to follow the structure of the original text. m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone a(mk' fun n (-1) ^ n * a n).converges Filter.Tendsto a Filter.atTop (nhds 0)m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone aFilter.Tendsto a Filter.atTop (nhds 0) (mk' fun n (-1) ^ n * a n).converges m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone a(mk' fun n (-1) ^ n * a n).converges Filter.Tendsto a Filter.atTop (nhds 0) m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:(mk' fun n (-1) ^ n * a n).convergesFilter.Tendsto a Filter.atTop (nhds 0); m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto (mk' fun n (-1) ^ n * a n).seq Filter.atTop (nhds 0)Filter.Tendsto a Filter.atTop (nhds 0) m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto (fun b dist ((mk' fun n (-1) ^ n * a n).seq b) 0) Filter.atTop (nhds 0)Filter.Tendsto (fun b dist (a b) 0) Filter.atTop (nhds 0) m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto (fun x dist ((mk' fun n (-1) ^ n * a n).seq x) 0) Filter.atTop (nhds 0)Filter.Tendsto (fun b dist (a b) 0) Filter.atTop (nhds 0) m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto (fun x dist ((mk' fun n (-1) ^ n * a n).seq x) 0) Filter.atTop (nhds 0)n:{ n // n m }dist ((mk' fun n (-1) ^ n * a n).seq n) 0 = dist (a n) 0 All goals completed! 🐙 m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto a Filter.atTop (nhds 0)(mk' fun n (-1) ^ n * a n).converges m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto a Filter.atTop (nhds 0) L, Filter.Tendsto (mk' fun n (-1) ^ n * a n).partial Filter.atTop (nhds L) m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto a Filter.atTop (nhds 0)b:Series := mk' fun n (-1) ^ n * a n L, Filter.Tendsto b.partial Filter.atTop (nhds L) m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto a Filter.atTop (nhds 0)b:Series := mk' fun n (-1) ^ n * a nS: := b.partial L, Filter.Tendsto S Filter.atTop (nhds L) have claim0 {N:} (hN: N m) : S (N+1) = S N + (-1)^(N+1) * a N+1, m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto a Filter.atTop (nhds 0)b:Series := mk' fun n (-1) ^ n * a nS: := b.partialN:hN:N mN + 1 m All goals completed! 🐙 := m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone a(mk' fun n (-1) ^ n * a n).converges Filter.Tendsto a Filter.atTop (nhds 0) m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto a Filter.atTop (nhds 0)b:Series := mk' fun n (-1) ^ n * a nS: := b.partialN:hN:N m(-1) ^ (N + 1) * a N + 1, = b.seq (N + 1)m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto a Filter.atTop (nhds 0)b:Series := mk' fun n (-1) ^ n * a nS: := b.partialN:hN:N mN b.m - 1; m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto a Filter.atTop (nhds 0)b:Series := mk' fun n (-1) ^ n * a nS: := b.partialN:hN:N mN b.m - 1; All goals completed! 🐙 have claim1 {N:} (hN: N m) : S (N+2) = S N + (-1)^(N+1) * (a N+1, m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto a Filter.atTop (nhds 0)b:Series := mk' fun n (-1) ^ n * a nS: := b.partialclaim0: {N : } (hN : N m), S (N + 1) = S N + (-1) ^ (N + 1) * a N + 1, N:hN:N mN + 1 m All goals completed! 🐙 - a N+2, m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto a Filter.atTop (nhds 0)b:Series := mk' fun n (-1) ^ n * a nS: := b.partialclaim0: {N : } (hN : N m), S (N + 1) = S N + (-1) ^ (N + 1) * a N + 1, N:hN:N mN + 2 m All goals completed! 🐙 ) := calc S (N+2) = S N + (-1)^(N+1) * a N+1, m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto a Filter.atTop (nhds 0)b:Series := mk' fun n (-1) ^ n * a nS: := b.partialclaim0: {N : } (hN : N m), S (N + 1) = S N + (-1) ^ (N + 1) * a N + 1, N:hN:N mN + 1 m All goals completed! 🐙 + (-1)^(N+2) * a N+2, m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto a Filter.atTop (nhds 0)b:Series := mk' fun n (-1) ^ n * a nS: := b.partialclaim0: {N : } (hN : N m), S (N + 1) = S N + (-1) ^ (N + 1) * a N + 1, N:hN:N mN + 2 m All goals completed! 🐙 := m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto a Filter.atTop (nhds 0)b:Series := mk' fun n (-1) ^ n * a nS: := b.partialclaim0: {N : } (hN : N m), S (N + 1) = S N + (-1) ^ (N + 1) * a N + 1, N:hN:N mS (N + 2) = S N + (-1) ^ (N + 1) * a N + 1, + (-1) ^ (N + 2) * a N + 2, simp_rw m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto a Filter.atTop (nhds 0)b:Series := mk' fun n (-1) ^ n * a nS: := b.partialclaim0: {N : } (hN : N m), S (N + 1) = S N + (-1) ^ (N + 1) * a N + 1, N:hN:N mS (N + 2) = S N + (-1) ^ (N + 1) * a N + 1, + (-1) ^ (N + 2) * a N + 2, claim0 hN, show N+2=N+1+1 m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto a Filter.atTop (nhds 0)b:Series := mk' fun n (-1) ^ n * a nS: := b.partialclaim0: {N : } (hN : N m), S (N + 1) = S N + (-1) ^ (N + 1) * a N + 1, N:hN:N mS (N + 2) = S N + (-1) ^ (N + 1) * a N + 1, + (-1) ^ (N + 2) * a N + 2, All goals completed! 🐙]; m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto a Filter.atTop (nhds 0)b:Series := mk' fun n (-1) ^ n * a nS: := b.partialclaim0: {N : } (hN : N m), S (N + 1) = S N + (-1) ^ (N + 1) * a N + 1, N:hN:N mN + 1 m; All goals completed! 🐙 _ = S N + (-1)^(N+1) * a N+1, m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto a Filter.atTop (nhds 0)b:Series := mk' fun n (-1) ^ n * a nS: := b.partialclaim0: {N : } (hN : N m), S (N + 1) = S N + (-1) ^ (N + 1) * a N + 1, N:hN:N mN + 1 m All goals completed! 🐙 + (-1) * (-1)^(N+1) * a N+2, m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto a Filter.atTop (nhds 0)b:Series := mk' fun n (-1) ^ n * a nS: := b.partialclaim0: {N : } (hN : N m), S (N + 1) = S N + (-1) ^ (N + 1) * a N + 1, N:hN:N mN + 2 m All goals completed! 🐙 := m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto a Filter.atTop (nhds 0)b:Series := mk' fun n (-1) ^ n * a nS: := b.partialclaim0: {N : } (hN : N m), S (N + 1) = S N + (-1) ^ (N + 1) * a N + 1, N:hN:N mS N + (-1) ^ (N + 1) * a N + 1, + (-1) ^ (N + 2) * a N + 2, = S N + (-1) ^ (N + 1) * a N + 1, + -1 * (-1) ^ (N + 1) * a N + 2, m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto a Filter.atTop (nhds 0)b:Series := mk' fun n (-1) ^ n * a nS: := b.partialclaim0: {N : } (hN : N m), S (N + 1) = S N + (-1) ^ (N + 1) * a N + 1, N:hN:N m(-1) ^ (N + 2) = -1 * (-1) ^ (N + 1); m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto a Filter.atTop (nhds 0)b:Series := mk' fun n (-1) ^ n * a nS: := b.partialclaim0: {N : } (hN : N m), S (N + 1) = S N + (-1) ^ (N + 1) * a N + 1, N:hN:N m(-1) ^ (N + 2) = (-1) ^ (1 + (N + 1))m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto a Filter.atTop (nhds 0)b:Series := mk' fun n (-1) ^ n * a nS: := b.partialclaim0: {N : } (hN : N m), S (N + 1) = S N + (-1) ^ (N + 1) * a N + 1, N:hN:N m-1 0 m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto a Filter.atTop (nhds 0)b:Series := mk' fun n (-1) ^ n * a nS: := b.partialclaim0: {N : } (hN : N m), S (N + 1) = S N + (-1) ^ (N + 1) * a N + 1, N:hN:N m(-1) ^ (N + 2) = (-1) ^ (1 + (N + 1))m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto a Filter.atTop (nhds 0)b:Series := mk' fun n (-1) ^ n * a nS: := b.partialclaim0: {N : } (hN : N m), S (N + 1) = S N + (-1) ^ (N + 1) * a N + 1, N:hN:N m-1 0 All goals completed! 🐙 _ = _ := m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto a Filter.atTop (nhds 0)b:Series := mk' fun n (-1) ^ n * a nS: := b.partialclaim0: {N : } (hN : N m), S (N + 1) = S N + (-1) ^ (N + 1) * a N + 1, N:hN:N mS N + (-1) ^ (N + 1) * a N + 1, + -1 * (-1) ^ (N + 1) * a N + 2, = S N + (-1) ^ (N + 1) * (a N + 1, - a N + 2, ) All goals completed! 🐙 have claim2 {N:} (hN: N m) (h': Odd N) : S (N+2) S N := m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone a(mk' fun n (-1) ^ n * a n).converges Filter.Tendsto a Filter.atTop (nhds 0) m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto a Filter.atTop (nhds 0)b:Series := mk' fun n (-1) ^ n * a nS: := b.partialclaim0: {N : } (hN : N m), S (N + 1) = S N + (-1) ^ (N + 1) * a N + 1, claim1: {N : } (hN : N m), S (N + 2) = S N + (-1) ^ (N + 1) * (a N + 1, - a N + 2, )N:hN:N mh':Odd Na N + 2, a N + 1, ; m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto a Filter.atTop (nhds 0)b:Series := mk' fun n (-1) ^ n * a nS: := b.partialclaim0: {N : } (hN : N m), S (N + 1) = S N + (-1) ^ (N + 1) * a N + 1, claim1: {N : } (hN : N m), S (N + 2) = S N + (-1) ^ (N + 1) * (a N + 1, - a N + 2, )N:hN:N mh':Odd NN + 1, N + 2, ; All goals completed! 🐙 have claim3 {N:} (hN: N m) (h': Even N) : S (N+2) S N := m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone a(mk' fun n (-1) ^ n * a n).converges Filter.Tendsto a Filter.atTop (nhds 0) m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto a Filter.atTop (nhds 0)b:Series := mk' fun n (-1) ^ n * a nS: := b.partialclaim0: {N : } (hN : N m), S (N + 1) = S N + (-1) ^ (N + 1) * a N + 1, claim1: {N : } (hN : N m), S (N + 2) = S N + (-1) ^ (N + 1) * (a N + 1, - a N + 2, )claim2: {N : }, N m Odd N S (N + 2) S NN:hN:N mh':Even Na N + 2, a N + 1, ; m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto a Filter.atTop (nhds 0)b:Series := mk' fun n (-1) ^ n * a nS: := b.partialclaim0: {N : } (hN : N m), S (N + 1) = S N + (-1) ^ (N + 1) * a N + 1, claim1: {N : } (hN : N m), S (N + 2) = S N + (-1) ^ (N + 1) * (a N + 1, - a N + 2, )claim2: {N : }, N m Odd N S (N + 2) S NN:hN:N mh':Even NN + 1, N + 2, ; All goals completed! 🐙 have why1 {N:} (hN: N m) (h': Even N) (k:) : S (N+2*k) S N := m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone a(mk' fun n (-1) ^ n * a n).converges Filter.Tendsto a Filter.atTop (nhds 0) All goals completed! 🐙 have why2 {N:} (hN: N m) (h': Even N) (k:) : S (N+2*k+1) S N - a N+1, m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto a Filter.atTop (nhds 0)b:Series := mk' fun n (-1) ^ n * a nS: := b.partialclaim0: {N : } (hN : N m), S (N + 1) = S N + (-1) ^ (N + 1) * a N + 1, claim1: {N : } (hN : N m), S (N + 2) = S N + (-1) ^ (N + 1) * (a N + 1, - a N + 2, )claim2: {N : }, N m Odd N S (N + 2) S Nclaim3: {N : }, N m Even N S (N + 2) S Nwhy1: {N : }, N m Even N (k : ), S (N + 2 * k) S NN:hN:N mh':Even Nk:N + 1 m All goals completed! 🐙 := m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone a(mk' fun n (-1) ^ n * a n).converges Filter.Tendsto a Filter.atTop (nhds 0) All goals completed! 🐙 have why3 {N:} (hN: N m) (h': Even N) (k:) : S (N+2*k+1) S (N+2*k) := m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone a(mk' fun n (-1) ^ n * a n).converges Filter.Tendsto a Filter.atTop (nhds 0) All goals completed! 🐙 have claim4 {N:} (hN: N m) (h': Even N) (k:) : S N - a N+1, m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto a Filter.atTop (nhds 0)b:Series := mk' fun n (-1) ^ n * a nS: := b.partialclaim0: {N : } (hN : N m), S (N + 1) = S N + (-1) ^ (N + 1) * a N + 1, claim1: {N : } (hN : N m), S (N + 2) = S N + (-1) ^ (N + 1) * (a N + 1, - a N + 2, )claim2: {N : }, N m Odd N S (N + 2) S Nclaim3: {N : }, N m Even N S (N + 2) S Nwhy1: {N : }, N m Even N (k : ), S (N + 2 * k) S Nwhy2: {N : } (hN : N m), Even N (k : ), S (N + 2 * k + 1) S N - a N + 1, why3: {N : }, N m Even N (k : ), S (N + 2 * k + 1) S (N + 2 * k)N:hN:N mh':Even Nk:N + 1 m All goals completed! 🐙 S (N + 2*k + 1) S (N + 2*k + 1) S (N + 2*k) S (N + 2*k) S N := ge_iff_le.mp (why2 hN h' k), why3 hN h' k, why1 hN h' k have why4 {N n:} (hN: N m) (h': Even N) (hn: n N) : S N - a N+1, m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto a Filter.atTop (nhds 0)b:Series := mk' fun n (-1) ^ n * a nS: := b.partialclaim0: {N : } (hN : N m), S (N + 1) = S N + (-1) ^ (N + 1) * a N + 1, claim1: {N : } (hN : N m), S (N + 2) = S N + (-1) ^ (N + 1) * (a N + 1, - a N + 2, )claim2: {N : }, N m Odd N S (N + 2) S Nclaim3: {N : }, N m Even N S (N + 2) S Nwhy1: {N : }, N m Even N (k : ), S (N + 2 * k) S Nwhy2: {N : } (hN : N m), Even N (k : ), S (N + 2 * k + 1) S N - a N + 1, why3: {N : }, N m Even N (k : ), S (N + 2 * k + 1) S (N + 2 * k)claim4: {N : } (hN : N m), Even N (k : ), S N - a N + 1, S (N + 2 * k + 1) S (N + 2 * k + 1) S (N + 2 * k) S (N + 2 * k) S NN:n:hN:N mh':Even Nhn:n NN + 1 m All goals completed! 🐙 S n S n S N := m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone a(mk' fun n (-1) ^ n * a n).converges Filter.Tendsto a Filter.atTop (nhds 0) All goals completed! 🐙 have why5 {ε:} (: ε > 0) : N, n N, m N, |S n - S m| ε := m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone a(mk' fun n (-1) ^ n * a n).converges Filter.Tendsto a Filter.atTop (nhds 0) All goals completed! 🐙 have : CauchySeq S := m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone a(mk' fun n (-1) ^ n * a n).converges Filter.Tendsto a Filter.atTop (nhds 0) m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto a Filter.atTop (nhds 0)b:Series := mk' fun n (-1) ^ n * a nS: := b.partialclaim0: {N : } (hN : N m), S (N + 1) = S N + (-1) ^ (N + 1) * a N + 1, claim1: {N : } (hN : N m), S (N + 2) = S N + (-1) ^ (N + 1) * (a N + 1, - a N + 2, )claim2: {N : }, N m Odd N S (N + 2) S Nclaim3: {N : }, N m Even N S (N + 2) S Nwhy1: {N : }, N m Even N (k : ), S (N + 2 * k) S Nwhy2: {N : } (hN : N m), Even N (k : ), S (N + 2 * k + 1) S N - a N + 1, why3: {N : }, N m Even N (k : ), S (N + 2 * k + 1) S (N + 2 * k)claim4: {N : } (hN : N m), Even N (k : ), S N - a N + 1, S (N + 2 * k + 1) S (N + 2 * k + 1) S (N + 2 * k) S (N + 2 * k) S Nwhy4: {N n : } (hN : N m), Even N n N S N - a N + 1, S n S n S Nwhy5: {ε : }, ε > 0 N, n N, m N, |S n - S m| ε ε > 0, N, n N, dist (S n) (S N) < ε intro ε m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto a Filter.atTop (nhds 0)b:Series := mk' fun n (-1) ^ n * a nS: := b.partialclaim0: {N : } (hN : N m), S (N + 1) = S N + (-1) ^ (N + 1) * a N + 1, claim1: {N : } (hN : N m), S (N + 2) = S N + (-1) ^ (N + 1) * (a N + 1, - a N + 2, )claim2: {N : }, N m Odd N S (N + 2) S Nclaim3: {N : }, N m Even N S (N + 2) S Nwhy1: {N : }, N m Even N (k : ), S (N + 2 * k) S Nwhy2: {N : } (hN : N m), Even N (k : ), S (N + 2 * k + 1) S N - a N + 1, why3: {N : }, N m Even N (k : ), S (N + 2 * k + 1) S (N + 2 * k)claim4: {N : } (hN : N m), Even N (k : ), S N - a N + 1, S (N + 2 * k + 1) S (N + 2 * k + 1) S (N + 2 * k) S (N + 2 * k) S Nwhy4: {N n : } (hN : N m), Even N n N S N - a N + 1, S n S n S Nwhy5: {ε : }, ε > 0 N, n N, m N, |S n - S m| εε::ε > 0 N, n N, dist (S n) (S N) < ε; m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto a Filter.atTop (nhds 0)b:Series := mk' fun n (-1) ^ n * a nS: := b.partialclaim0: {N : } (hN : N m), S (N + 1) = S N + (-1) ^ (N + 1) * a N + 1, claim1: {N : } (hN : N m), S (N + 2) = S N + (-1) ^ (N + 1) * (a N + 1, - a N + 2, )claim2: {N : }, N m Odd N S (N + 2) S Nclaim3: {N : }, N m Even N S (N + 2) S Nwhy1: {N : }, N m Even N (k : ), S (N + 2 * k) S Nwhy2: {N : } (hN : N m), Even N (k : ), S (N + 2 * k + 1) S N - a N + 1, why3: {N : }, N m Even N (k : ), S (N + 2 * k + 1) S (N + 2 * k)claim4: {N : } (hN : N m), Even N (k : ), S N - a N + 1, S (N + 2 * k + 1) S (N + 2 * k + 1) S (N + 2 * k) S (N + 2 * k) S Nwhy4: {N n : } (hN : N m), Even N n N S N - a N + 1, S n S n S Nwhy5: {ε : }, ε > 0 N, n N, m N, |S n - S m| εε::ε > 0N:hN: n N, m N, |S n - S m| ε / 2 N, n N, dist (S n) (S N) < ε; m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto a Filter.atTop (nhds 0)b:Series := mk' fun n (-1) ^ n * a nS: := b.partialclaim0: {N : } (hN : N m), S (N + 1) = S N + (-1) ^ (N + 1) * a N + 1, claim1: {N : } (hN : N m), S (N + 2) = S N + (-1) ^ (N + 1) * (a N + 1, - a N + 2, )claim2: {N : }, N m Odd N S (N + 2) S Nclaim3: {N : }, N m Even N S (N + 2) S Nwhy1: {N : }, N m Even N (k : ), S (N + 2 * k) S Nwhy2: {N : } (hN : N m), Even N (k : ), S (N + 2 * k + 1) S N - a N + 1, why3: {N : }, N m Even N (k : ), S (N + 2 * k + 1) S (N + 2 * k)claim4: {N : } (hN : N m), Even N (k : ), S N - a N + 1, S (N + 2 * k + 1) S (N + 2 * k + 1) S (N + 2 * k) S (N + 2 * k) S Nwhy4: {N n : } (hN : N m), Even N n N S N - a N + 1, S n S n S Nwhy5: {ε : }, ε > 0 N, n N, m N, |S n - S m| εε::ε > 0N:hN: n N, m N, |S n - S m| ε / 2 n N, dist (S n) (S N) < ε intro n m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto a Filter.atTop (nhds 0)b:Series := mk' fun n (-1) ^ n * a nS: := b.partialclaim0: {N : } (hN : N m), S (N + 1) = S N + (-1) ^ (N + 1) * a N + 1, claim1: {N : } (hN : N m), S (N + 2) = S N + (-1) ^ (N + 1) * (a N + 1, - a N + 2, )claim2: {N : }, N m Odd N S (N + 2) S Nclaim3: {N : }, N m Even N S (N + 2) S Nwhy1: {N : }, N m Even N (k : ), S (N + 2 * k) S Nwhy2: {N : } (hN : N m), Even N (k : ), S (N + 2 * k + 1) S N - a N + 1, why3: {N : }, N m Even N (k : ), S (N + 2 * k + 1) S (N + 2 * k)claim4: {N : } (hN : N m), Even N (k : ), S N - a N + 1, S (N + 2 * k + 1) S (N + 2 * k + 1) S (N + 2 * k) S (N + 2 * k) S Nwhy4: {N n : } (hN : N m), Even N n N S N - a N + 1, S n S n S Nwhy5: {ε : }, ε > 0 N, n N, m N, |S n - S m| εε::ε > 0N:hN: n N, m N, |S n - S m| ε / 2n:hn:n Ndist (S n) (S N) < ε; m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto a Filter.atTop (nhds 0)b:Series := mk' fun n (-1) ^ n * a nS: := b.partialclaim0: {N : } (hN : N m), S (N + 1) = S N + (-1) ^ (N + 1) * a N + 1, claim1: {N : } (hN : N m), S (N + 2) = S N + (-1) ^ (N + 1) * (a N + 1, - a N + 2, )claim2: {N : }, N m Odd N S (N + 2) S Nclaim3: {N : }, N m Even N S (N + 2) S Nwhy1: {N : }, N m Even N (k : ), S (N + 2 * k) S Nwhy2: {N : } (hN : N m), Even N (k : ), S (N + 2 * k + 1) S N - a N + 1, why3: {N : }, N m Even N (k : ), S (N + 2 * k + 1) S (N + 2 * k)claim4: {N : } (hN : N m), Even N (k : ), S N - a N + 1, S (N + 2 * k + 1) S (N + 2 * k + 1) S (N + 2 * k) S (N + 2 * k) S Nwhy4: {N n : } (hN : N m), Even N n N S N - a N + 1, S n S n S Nwhy5: {ε : }, ε > 0 N, n N, m N, |S n - S m| εε::ε > 0N:hN: n N, m N, |S n - S m| ε / 2n:hn:n N|S n - S N| < ε; linarith [hN n hn N (m:a:{ n // n m } ha: (n : { n // n m }), a n 0ha':Antitone ah:Filter.Tendsto a Filter.atTop (nhds 0)b:Series := mk' fun n (-1) ^ n * a nS: := b.partialclaim0: {N : } (hN : N m), S (N + 1) = S N + (-1) ^ (N + 1) * a N + 1, claim1: {N : } (hN : N m), S (N + 2) = S N + (-1) ^ (N + 1) * (a N + 1, - a N + 2, )claim2: {N : }, N m Odd N S (N + 2) S Nclaim3: {N : }, N m Even N S (N + 2) S Nwhy1: {N : }, N m Even N (k : ), S (N + 2 * k) S Nwhy2: {N : } (hN : N m), Even N (k : ), S (N + 2 * k + 1) S N - a N + 1, why3: {N : }, N m Even N (k : ), S (N + 2 * k + 1) S (N + 2 * k)claim4: {N : } (hN : N m), Even N (k : ), S N - a N + 1, S (N + 2 * k + 1) S (N + 2 * k + 1) S (N + 2 * k) S (N + 2 * k) S Nwhy4: {N n : } (hN : N m), Even N n N S N - a N + 1, S n S n S Nwhy5: {ε : }, ε > 0 N, n N, m N, |S n - S m| εε::ε > 0N:hN: n N, m N, |S n - S m| ε / 2n:hn:n NN N All goals completed! 🐙)] All goals completed! 🐙

Example 7.2.13

noncomputable abbrev Series.example_7_2_13 : Series := (mk' (m:=1) (fun n (-1:)^(n:) / (n:)))
theorem declaration uses `sorry`Series.example_7_2_13a : example_7_2_13.converges := example_7_2_13.converges All goals completed! 🐙theorem declaration uses `sorry`Series.example_7_2_13b : ¬ example_7_2_13.absConverges := ¬example_7_2_13.absConverges All goals completed! 🐙theorem declaration uses `sorry`Series.example_7_2_13c : example_7_2_13.condConverges := example_7_2_13.condConverges All goals completed! 🐙instance Series.inst_add : Add Series where add a b := { m := min a.m b.m seq n := a.seq n + b.seq n vanish n hn := a:Seriesb:Seriesn:hn:n < min a.m b.ma.seq n + b.seq n = 0 All goals completed! 🐙 }theorem Series.add_coe (a b: ) : (a:Series) + (b:Series) = (fun n a n + b n) := a: b: { m := 0, seq := fun n if n 0 then a n.toNat else 0, vanish := } + { m := 0, seq := fun n if n 0 then b n.toNat else 0, vanish := } = { m := 0, seq := fun n if n 0 then (fun n a n + b n) n.toNat else 0, vanish := } a: b: ({ m := 0, seq := fun n if n 0 then a n.toNat else 0, vanish := } + { m := 0, seq := fun n if n 0 then b n.toNat else 0, vanish := }).m = { m := 0, seq := fun n if n 0 then (fun n a n + b n) n.toNat else 0, vanish := }.ma: b: n:({ m := 0, seq := fun n if n 0 then a n.toNat else 0, vanish := } + { m := 0, seq := fun n if n 0 then b n.toNat else 0, vanish := }).seq n = { m := 0, seq := fun n if n 0 then (fun n a n + b n) n.toNat else 0, vanish := }.seq n; a: b: n:({ m := 0, seq := fun n if n 0 then a n.toNat else 0, vanish := } + { m := 0, seq := fun n if n 0 then b n.toNat else 0, vanish := }).seq n = { m := 0, seq := fun n if n 0 then (fun n a n + b n) n.toNat else 0, vanish := }.seq n a: b: n:{ m := 0, seq := fun n if n 0 then a n.toNat else 0, vanish := }.seq n + { m := 0, seq := fun n if n 0 then b n.toNat else 0, vanish := }.seq n = { m := 0, seq := fun n if n 0 then (fun n a n + b n) n.toNat else 0, vanish := }.seq n a: b: n:h:n 0{ m := 0, seq := fun n if n 0 then a n.toNat else 0, vanish := }.seq n + { m := 0, seq := fun n if n 0 then b n.toNat else 0, vanish := }.seq n = { m := 0, seq := fun n if n 0 then (fun n a n + b n) n.toNat else 0, vanish := }.seq na: b: n:h:¬n 0{ m := 0, seq := fun n if n 0 then a n.toNat else 0, vanish := }.seq n + { m := 0, seq := fun n if n 0 then b n.toNat else 0, vanish := }.seq n = { m := 0, seq := fun n if n 0 then (fun n a n + b n) n.toNat else 0, vanish := }.seq n a: b: n:h:n 0{ m := 0, seq := fun n if n 0 then a n.toNat else 0, vanish := }.seq n + { m := 0, seq := fun n if n 0 then b n.toNat else 0, vanish := }.seq n = { m := 0, seq := fun n if n 0 then (fun n a n + b n) n.toNat else 0, vanish := }.seq na: b: n:h:¬n 0{ m := 0, seq := fun n if n 0 then a n.toNat else 0, vanish := }.seq n + { m := 0, seq := fun n if n 0 then b n.toNat else 0, vanish := }.seq n = { m := 0, seq := fun n if n 0 then (fun n a n + b n) n.toNat else 0, vanish := }.seq n All goals completed! 🐙

Proposition 7.2.14 (a) (Series laws) / Exercise 7.2.5. The convergesTo form can be more convenient for applications.

theorem declaration uses `sorry`Series.convergesTo.add {s t:Series} {L M: } (hs: s.convergesTo L) (ht: t.convergesTo M) : (s + t).convergesTo (L + M) := s:Seriest:SeriesL:M:hs:s.convergesTo Lht:t.convergesTo M(s + t).convergesTo (L + M) All goals completed! 🐙
theorem declaration uses `sorry`Series.add {s t:Series} (hs: s.converges) (ht: t.converges) : (s + t).converges (s+t).sum = s.sum + t.sum := s:Seriest:Serieshs:s.convergesht:t.converges(s + t).converges (s + t).sum = s.sum + t.sum All goals completed! 🐙instance Series.inst.smul : SMul Series where smul c s := { m := s.m seq n := if n s.m then c * s.seq n else 0 vanish := c:s:Series n < s.m, (if n s.m then c * s.seq n else 0) = 0 All goals completed! 🐙 }theorem Series.smul_coe (a: ) (c: ) : (c a:Series) = (fun n c * a n) := a: c:c { m := 0, seq := fun n if n 0 then a n.toNat else 0, vanish := } = { m := 0, seq := fun n if n 0 then (fun n c * a n) n.toNat else 0, vanish := } a: c:(c { m := 0, seq := fun n if n 0 then a n.toNat else 0, vanish := }).m = { m := 0, seq := fun n if n 0 then (fun n c * a n) n.toNat else 0, vanish := }.ma: c:n:(c { m := 0, seq := fun n if n 0 then a n.toNat else 0, vanish := }).seq n = { m := 0, seq := fun n if n 0 then (fun n c * a n) n.toNat else 0, vanish := }.seq n; a: c:n:(c { m := 0, seq := fun n if n 0 then a n.toNat else 0, vanish := }).seq n = { m := 0, seq := fun n if n 0 then (fun n c * a n) n.toNat else 0, vanish := }.seq n a: c:n:h:n 0(c { m := 0, seq := fun n if n 0 then a n.toNat else 0, vanish := }).seq n = { m := 0, seq := fun n if n 0 then (fun n c * a n) n.toNat else 0, vanish := }.seq na: c:n:h:¬n 0(c { m := 0, seq := fun n if n 0 then a n.toNat else 0, vanish := }).seq n = { m := 0, seq := fun n if n 0 then (fun n c * a n) n.toNat else 0, vanish := }.seq n a: c:n:h:n 0(c { m := 0, seq := fun n if n 0 then a n.toNat else 0, vanish := }).seq n = { m := 0, seq := fun n if n 0 then (fun n c * a n) n.toNat else 0, vanish := }.seq na: c:n:h:¬n 0(c { m := 0, seq := fun n if n 0 then a n.toNat else 0, vanish := }).seq n = { m := 0, seq := fun n if n 0 then (fun n c * a n) n.toNat else 0, vanish := }.seq n All goals completed! 🐙

Proposition 7.2.14 (b) (Series laws) / Exercise 7.2.5. The convergesTo form can be more convenient for applications.

theorem declaration uses `sorry`Series.convergesTo.smul {s:Series} {L c: } (hs: s.convergesTo L) : (c s).convergesTo (c * L) := s:SeriesL:c:hs:s.convergesTo L(c s).convergesTo (c * L) All goals completed! 🐙
theorem declaration uses `sorry`Series.smul {c:} {s:Series} (hs: s.converges) : (c s).converges (c s).sum = c * s.sum := c:s:Serieshs:s.converges(c s).converges (c s).sum = c * s.sum All goals completed! 🐙

The corresponding API for subtraction was not in the textbook, but is useful in later sections, so is included here.

instance Series.inst_sub : Sub Series where sub a b := { m := min a.m b.m seq n := a.seq n - b.seq n vanish n hn := a:Seriesb:Seriesn:hn:n < min a.m b.ma.seq n - b.seq n = 0 All goals completed! 🐙 }
theorem Series.sub_coe (a b: ) : (a:Series) - (b:Series) = (fun n a n - b n) := a: b: { m := 0, seq := fun n if n 0 then a n.toNat else 0, vanish := } - { m := 0, seq := fun n if n 0 then b n.toNat else 0, vanish := } = { m := 0, seq := fun n if n 0 then (fun n a n - b n) n.toNat else 0, vanish := } a: b: ({ m := 0, seq := fun n if n 0 then a n.toNat else 0, vanish := } - { m := 0, seq := fun n if n 0 then b n.toNat else 0, vanish := }).m = { m := 0, seq := fun n if n 0 then (fun n a n - b n) n.toNat else 0, vanish := }.ma: b: n:({ m := 0, seq := fun n if n 0 then a n.toNat else 0, vanish := } - { m := 0, seq := fun n if n 0 then b n.toNat else 0, vanish := }).seq n = { m := 0, seq := fun n if n 0 then (fun n a n - b n) n.toNat else 0, vanish := }.seq n; a: b: n:({ m := 0, seq := fun n if n 0 then a n.toNat else 0, vanish := } - { m := 0, seq := fun n if n 0 then b n.toNat else 0, vanish := }).seq n = { m := 0, seq := fun n if n 0 then (fun n a n - b n) n.toNat else 0, vanish := }.seq n a: b: n:{ m := 0, seq := fun n if n 0 then a n.toNat else 0, vanish := }.seq n - { m := 0, seq := fun n if n 0 then b n.toNat else 0, vanish := }.seq n = { m := 0, seq := fun n if n 0 then (fun n a n - b n) n.toNat else 0, vanish := }.seq n a: b: n:h:n 0{ m := 0, seq := fun n if n 0 then a n.toNat else 0, vanish := }.seq n - { m := 0, seq := fun n if n 0 then b n.toNat else 0, vanish := }.seq n = { m := 0, seq := fun n if n 0 then (fun n a n - b n) n.toNat else 0, vanish := }.seq na: b: n:h:¬n 0{ m := 0, seq := fun n if n 0 then a n.toNat else 0, vanish := }.seq n - { m := 0, seq := fun n if n 0 then b n.toNat else 0, vanish := }.seq n = { m := 0, seq := fun n if n 0 then (fun n a n - b n) n.toNat else 0, vanish := }.seq n a: b: n:h:n 0{ m := 0, seq := fun n if n 0 then a n.toNat else 0, vanish := }.seq n - { m := 0, seq := fun n if n 0 then b n.toNat else 0, vanish := }.seq n = { m := 0, seq := fun n if n 0 then (fun n a n - b n) n.toNat else 0, vanish := }.seq na: b: n:h:¬n 0{ m := 0, seq := fun n if n 0 then a n.toNat else 0, vanish := }.seq n - { m := 0, seq := fun n if n 0 then b n.toNat else 0, vanish := }.seq n = { m := 0, seq := fun n if n 0 then (fun n a n - b n) n.toNat else 0, vanish := }.seq n All goals completed! 🐙theorem declaration uses `sorry`Series.convergesTo.sub {s t:Series} {L M: } (hs: s.convergesTo L) (ht: t.convergesTo M) : (s - t).convergesTo (L - M) := s:Seriest:SeriesL:M:hs:s.convergesTo Lht:t.convergesTo M(s - t).convergesTo (L - M) All goals completed! 🐙theorem declaration uses `sorry`Series.sub {s t:Series} (hs: s.converges) (ht: t.converges) : (s - t).converges (s-t).sum = s.sum - t.sum := s:Seriest:Serieshs:s.convergesht:t.converges(s - t).converges (s - t).sum = s.sum - t.sum All goals completed! 🐙abbrev Series.from (s:Series) (m₁:) : Series := mk' (m := max s.m m₁) (fun n s.seq (n:))

Proposition 7.2.14 (c) (Series laws) / Exercise 7.2.5

theorem declaration uses `sorry`Series.converges_from (s:Series) (k:) : s.converges (s.from (s.m+k)).converges := s:Seriesk:s.converges (s.from (s.m + k)).converges All goals completed! 🐙
theorem declaration uses `sorry`Series.sum_from {s:Series} (k:) (h: s.converges) : s.sum = n Finset.Ico s.m (s.m+k), s.seq n + (s.from (s.m+k)).sum := s:Seriesk:h:s.convergess.sum = n Finset.Ico s.m (s.m + k), s.seq n + (s.from (s.m + k)).sum All goals completed! 🐙

Proposition 7.2.14 (d) (Series laws) / Exercise 7.2.5

theorem declaration uses `sorry`Series.shift {s:Series} {x:} (h: s.convergesTo x) (L:) : (mk' (m := s.m + L) (fun n s.seq (n - L))).convergesTo x := s:Seriesx:h:s.convergesTo xL:(mk' fun n s.seq (n - L)).convergesTo x All goals completed! 🐙

Lemma 7.2.15 (telescoping series) / Exercise 7.2.6

theorem declaration uses `sorry`Series.telescope {a: } (ha: Filter.atTop.Tendsto a (nhds 0)) : ((fun n: a n - a (n+1)):Series).convergesTo (a 0) := a: ha:Filter.Tendsto a Filter.atTop (nhds 0){ m := 0, seq := fun n if n 0 then (fun n a n - a (n + 1)) n.toNat else 0, vanish := }.convergesTo (a 0) All goals completed! 🐙
/- Exercise 7.2.1 -/ def declaration uses `sorry`Series.exercise_7_2_1_convergent : Decidable ( (mk' (m := 1) (fun n (-1:)^(n:))).converges ) := Decidable (mk' fun n (-1) ^ n).converges -- The first line of this proof should be `apply isTrue` or `apply isFalse`. All goals completed! 🐙end Chapter7