Аналіз I, Глава 5.3
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:
-
Notion of a formal limit of a Cauchy sequence
-
Construction of a real number type
Chapter5.Real
-
Basic arithmetic operations and properties
namespace Chapter5
A class of Cauchy sequences that start at zero
@[ext]
class CauchySequence extends Sequence where
zero : n₀ = 0
cauchy : toSequence.isCauchy
theorem CauchySequence.ext' {a b: CauchySequence} (h: a.seq = b.seq) : a = b := a:CauchySequenceb:CauchySequenceh:toSequence.seq = toSequence.seq⊢ a = b
a:CauchySequenceb:CauchySequenceh:toSequence.seq = toSequence.seq⊢ toSequence.n₀ = toSequence.n₀a:CauchySequenceb:CauchySequenceh:toSequence.seq = toSequence.seq⊢ toSequence.seq = toSequence.seq
a:CauchySequenceb:CauchySequenceh:toSequence.seq = toSequence.seq⊢ toSequence.n₀ = toSequence.n₀ All goals completed! 🐙
All goals completed! 🐙
A sequence starting at zero that is Cauchy, can be viewed as a Cauchy sequence.
abbrev CauchySequence.mk' {a:ℕ → ℚ} (ha: (a:Sequence).isCauchy) : CauchySequence where
n₀ := 0
seq := (a:Sequence).seq
vanish := a:ℕ → ℚha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchy⊢ ∀ n < 0, (fun n => if n ≥ 0 then a n.toNat else 0) n = 0
a:ℕ → ℚha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyn:ℤhn:n < 0⊢ (fun n => if n ≥ 0 then a n.toNat else 0) n = 0
All goals completed! 🐙
zero := rfl
cauchy := ha
@[simp]
theorem CauchySequence.coe_eq {a:ℕ → ℚ} (ha: (a:Sequence).isCauchy) :
(mk' ha).toSequence = (a:Sequence) := a:ℕ → ℚha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchy⊢ toSequence = { n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ } All goals completed! 🐙
instance CauchySequence.instCoeFun : CoeFun CauchySequence (fun _ ↦ ℕ → ℚ) where
coe := fun a n ↦ a.toSequence (n:ℤ)
@[simp]
theorem CauchySequence.coe_to_sequence (a: CauchySequence) :
((a:ℕ → ℚ):Sequence) = a.toSequence := a:CauchySequence⊢ { n₀ := 0, seq := fun n => if n ≥ 0 then (fun n => toSequence.seq ↑n) n.toNat else 0, vanish := ⋯ } = toSequence
a:CauchySequence⊢ { n₀ := 0, seq := fun n => if n ≥ 0 then (fun n => toSequence.seq ↑n) n.toNat else 0, vanish := ⋯ }.n₀ = toSequence.n₀a:CauchySequence⊢ { n₀ := 0, seq := fun n => if n ≥ 0 then (fun n => toSequence.seq ↑n) n.toNat else 0, vanish := ⋯ }.seq = toSequence.seq
a:CauchySequence⊢ { n₀ := 0, seq := fun n => if n ≥ 0 then (fun n => toSequence.seq ↑n) n.toNat else 0, vanish := ⋯ }.n₀ = toSequence.n₀ All goals completed! 🐙
a:CauchySequencen:ℤ⊢ { n₀ := 0, seq := fun n => if n ≥ 0 then (fun n => toSequence.seq ↑n) n.toNat else 0, vanish := ⋯ }.seq n =
toSequence.seq n
a:CauchySequencen:ℤh:n ≥ 0⊢ { n₀ := 0, seq := fun n => if n ≥ 0 then (fun n => toSequence.seq ↑n) n.toNat else 0, vanish := ⋯ }.seq n =
toSequence.seq na:CauchySequencen:ℤh:¬n ≥ 0⊢ { n₀ := 0, seq := fun n => if n ≥ 0 then (fun n => toSequence.seq ↑n) n.toNat else 0, vanish := ⋯ }.seq n =
toSequence.seq n
all_goals a:CauchySequencen:ℤh:¬n ≥ 0⊢ 0 = toSequence.seq n
a:CauchySequencen:ℤh:¬n ≥ 0⊢ n < toSequence.n₀
a:CauchySequencen:ℤh:¬n ≥ 0⊢ n < 0
All goals completed! 🐙
@[simp]
theorem CauchySequence.coe_coe {a:ℕ → ℚ} (ha: (a:Sequence).isCauchy) : mk' ha = a := a:ℕ → ℚha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchy⊢ (fun n => toSequence.seq ↑n) = a All goals completed! 🐙
Твердження 5.3.3 / Вправа 5.3.1
theorem Sequence.equiv_trans {a b c:ℕ → ℚ} (hab: Sequence.equiv a b) (hbc: Sequence.equiv b c) :
Sequence.equiv a c := a:ℕ → ℚb:ℕ → ℚc:ℕ → ℚhab:equiv a bhbc:equiv b c⊢ equiv a c All goals completed! 🐙
Твердження 5.3.3 / Вправа 5.3.1
instance CauchySequence.instSetoid : Setoid CauchySequence where
r := fun a b ↦ Sequence.equiv a b
iseqv := {
refl := sorry
symm := sorry
trans := sorry
}
theorem CauchySequence.equiv_iff (a b: CauchySequence) : a ≈ b ↔ Sequence.equiv a b := a:CauchySequenceb:CauchySequence⊢ a ≈ b ↔ Sequence.equiv (fun n => toSequence.seq ↑n) fun n => toSequence.seq ↑n All goals completed! 🐙
Every constant sequence is Cauchy
theorem Sequence.isCauchy_of_const (a:ℚ) : ((fun n:ℕ ↦ a):Sequence).isCauchy := a:ℚ⊢ { n₀ := 0, seq := fun n => if n ≥ 0 then (fun n => a) n.toNat else 0, vanish := ⋯ }.isCauchy All goals completed! 🐙
instance CauchySequence.instZero : Zero CauchySequence where
zero := CauchySequence.mk' (a := fun _: ℕ ↦ 0) (Sequence.isCauchy_of_const (0:ℚ))
abbrev Real := Quotient CauchySequence.instSetoid
open Classical in
/--
It is convenient in Lean to assign the "dummy" value of 0 to `LIM a` when `a` is not Cauchy.
This requires Classical logic, because the property of being Cauchy is not computable or
decidable.
-/
noncomputable abbrev LIM (a:ℕ → ℚ) : Real :=
Quotient.mk _ (if h : (a:Sequence).isCauchy then CauchySequence.mk' h else (0:CauchySequence))
theorem LIM_def {a:ℕ → ℚ} (ha: (a:Sequence).isCauchy) :
LIM a = Quotient.mk _ (CauchySequence.mk' ha) := a:ℕ → ℚha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchy⊢ LIM a = ⟦CauchySequence.mk' ha⟧
All goals completed! 🐙
Визначення 5.3.1 (Real numbers)
theorem Real.eq_lim (x:Real) : ∃ (a:ℕ → ℚ), (a:Sequence).isCauchy ∧ x = LIM a := x:Real⊢ ∃ a, { n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchy ∧ x = LIM a
-- I had a lot of trouble with this proof; perhaps there is a more idiomatic way to proceed
x:Real⊢ ∀ (a : CauchySequence),
∃ a_1,
{ n₀ := 0, seq := fun n => if n ≥ 0 then a_1 n.toNat else 0, vanish := ⋯ }.isCauchy ∧
Quot.mk (⇑CauchySequence.instSetoid) a = LIM a_1; x:Reala:CauchySequence⊢ ∃ a_1,
{ n₀ := 0, seq := fun n => if n ≥ 0 then a_1 n.toNat else 0, vanish := ⋯ }.isCauchy ∧
Quot.mk (⇑CauchySequence.instSetoid) a = LIM a_1
x:Reala:CauchySequencea':ℕ → ℚ := fun n => CauchySequence.toSequence.seq ↑n⊢ ∃ a_1,
{ n₀ := 0, seq := fun n => if n ≥ 0 then a_1 n.toNat else 0, vanish := ⋯ }.isCauchy ∧
Quot.mk (⇑CauchySequence.instSetoid) a = LIM a_1; x:Reala:CauchySequencea':ℕ → ℚ := fun n => CauchySequence.toSequence.seq ↑n⊢ { n₀ := 0, seq := fun n => if n ≥ 0 then a' n.toNat else 0, vanish := ⋯ }.isCauchy ∧
Quot.mk (⇑CauchySequence.instSetoid) a = LIM a'
x:Reala:CauchySequencea':ℕ → ℚ := fun n => CauchySequence.toSequence.seq ↑ns:Sequence := { n₀ := 0, seq := fun n => if n ≥ 0 then a' n.toNat else 0, vanish := ⋯ }⊢ s.isCauchy ∧ Quot.mk (⇑CauchySequence.instSetoid) a = LIM a'
x:Reala:CauchySequencea':ℕ → ℚ := fun n => CauchySequence.toSequence.seq ↑ns:Sequence := { n₀ := 0, seq := fun n => if n ≥ 0 then a' n.toNat else 0, vanish := ⋯ }this:s = CauchySequence.toSequence⊢ s.isCauchy ∧ Quot.mk (⇑CauchySequence.instSetoid) a = LIM a'
x:Reala:CauchySequencea':ℕ → ℚ := fun n => CauchySequence.toSequence.seq ↑ns:Sequence := { n₀ := 0, seq := fun n => if n ≥ 0 then a' n.toNat else 0, vanish := ⋯ }this:s = CauchySequence.toSequence⊢ CauchySequence.toSequence.isCauchy ∧ Quot.mk (⇑CauchySequence.instSetoid) a = LIM a'
x:Reala:CauchySequencea':ℕ → ℚ := fun n => CauchySequence.toSequence.seq ↑ns:Sequence := { n₀ := 0, seq := fun n => if n ≥ 0 then a' n.toNat else 0, vanish := ⋯ }this:s = CauchySequence.toSequence⊢ Quot.mk (⇑CauchySequence.instSetoid) a = LIM a'
x:Reala:CauchySequencea':ℕ → ℚ := fun n => CauchySequence.toSequence.seq ↑ns:Sequence := { n₀ := 0, seq := fun n => if n ≥ 0 then a' n.toNat else 0, vanish := ⋯ }this:s = CauchySequence.toSequence⊢ a =
if h : { n₀ := 0, seq := fun n => if n ≥ 0 then a' n.toNat else 0, vanish := ⋯ }.isCauchy then CauchySequence.mk' h
else 0
x:Reala:CauchySequencea':ℕ → ℚ := fun n => CauchySequence.toSequence.seq ↑ns:Sequence := { n₀ := 0, seq := fun n => if n ≥ 0 then a' n.toNat else 0, vanish := ⋯ }this:s = CauchySequence.toSequence⊢ a = CauchySequence.mk' ⋯x:Reala:CauchySequencea':ℕ → ℚ := fun n => CauchySequence.toSequence.seq ↑ns:Sequence := { n₀ := 0, seq := fun n => if n ≥ 0 then a' n.toNat else 0, vanish := ⋯ }this:s = CauchySequence.toSequence⊢ Decidable CauchySequence.toSequence.isCauchy
x:Reala:CauchySequencea':ℕ → ℚ := fun n => CauchySequence.toSequence.seq ↑ns:Sequence := { n₀ := 0, seq := fun n => if n ≥ 0 then a' n.toNat else 0, vanish := ⋯ }this:s = CauchySequence.toSequence⊢ a = CauchySequence.mk' ⋯ x:Reala:CauchySequencea':ℕ → ℚ := fun n => CauchySequence.toSequence.seq ↑ns:Sequence := { n₀ := 0, seq := fun n => if n ≥ 0 then a' n.toNat else 0, vanish := ⋯ }this:s = CauchySequence.toSequence⊢ CauchySequence.toSequence.seq = CauchySequence.toSequence.seq
x:Reala:CauchySequencea':ℕ → ℚ := fun n => CauchySequence.toSequence.seq ↑ns:Sequence := { n₀ := 0, seq := fun n => if n ≥ 0 then a' n.toNat else 0, vanish := ⋯ }this:s = CauchySequence.toSequence⊢ CauchySequence.toSequence.seq = s.seq
All goals completed! 🐙
classical
All goals completed! 🐙
Визначення 5.3.1 (Real numbers)
theorem Real.LIM_eq_LIM {a b:ℕ → ℚ} (ha: (a:Sequence).isCauchy) (hb: (b:Sequence).isCauchy) :
LIM a = LIM b ↔ Sequence.equiv a b := a:ℕ → ℚb:ℕ → ℚha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchy⊢ LIM a = LIM b ↔ Sequence.equiv a b
a:ℕ → ℚb:ℕ → ℚha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchy⊢ LIM a = LIM b → Sequence.equiv a ba:ℕ → ℚb:ℕ → ℚha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchy⊢ Sequence.equiv a b → LIM a = LIM b
a:ℕ → ℚb:ℕ → ℚha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchy⊢ LIM a = LIM b → Sequence.equiv a b a:ℕ → ℚb:ℕ → ℚha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyh:LIM a = LIM b⊢ Sequence.equiv a b
a:ℕ → ℚb:ℕ → ℚha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyh:(if h : { n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchy then CauchySequence.mk' h
else 0) ≈
if h : { n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchy then CauchySequence.mk' h
else 0⊢ Sequence.equiv a b
rwa [dif_pos ha, dif_pos hb, CauchySequence.equiv_iffa:ℕ → ℚb:ℕ → ℚha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyh:Sequence.equiv (fun n => CauchySequence.toSequence.seq ↑n) fun n => CauchySequence.toSequence.seq ↑n⊢ Sequence.equiv a b at h
a:ℕ → ℚb:ℕ → ℚha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyh:Sequence.equiv a b⊢ LIM a = LIM b
a:ℕ → ℚb:ℕ → ℚha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyh:Sequence.equiv a b⊢ (if h : { n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchy then CauchySequence.mk' h
else 0) ≈
if h : { n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchy then CauchySequence.mk' h
else 0
rwa [dif_pos ha, dif_pos hb, CauchySequence.equiv_iffa:ℕ → ℚb:ℕ → ℚha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyh:Sequence.equiv a b⊢ Sequence.equiv (fun n => CauchySequence.toSequence.seq ↑n) fun n => CauchySequence.toSequence.seq ↑n
Lemma 5.3.6 (Sum of Cauchy sequences is Cauchy)
theorem Sequence.add_cauchy {a b:ℕ → ℚ} (ha: (a:Sequence).isCauchy) (hb: (b:Sequence).isCauchy) :
(a + b:Sequence).isCauchy := a:ℕ → ℚb:ℕ → ℚha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchy⊢ { n₀ := 0, seq := fun n => if n ≥ 0 then (a + b) n.toNat else 0, vanish := ⋯ }.isCauchy
-- цей доказ написан так, щоб співпадати із структурою орігінального тексту.
a:ℕ → ℚb:ℕ → ℚha:∀ ε > 0, ε.eventuallySteady { n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }hb:∀ ε > 0, ε.eventuallySteady { n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }⊢ ∀ ε > 0, ε.eventuallySteady { n₀ := 0, seq := fun n => if n ≥ 0 then (a + b) n.toNat else 0, vanish := ⋯ }
a:ℕ → ℚb:ℕ → ℚha:∀ ε > 0, ε.eventuallySteady { n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }hb:∀ ε > 0, ε.eventuallySteady { n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }ε:ℚhε:ε > 0⊢ ε.eventuallySteady { n₀ := 0, seq := fun n => if n ≥ 0 then (a + b) n.toNat else 0, vanish := ⋯ }
have : ε/2 > 0 := a:ℕ → ℚb:ℕ → ℚha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchy⊢ { n₀ := 0, seq := fun n => if n ≥ 0 then (a + b) n.toNat else 0, vanish := ⋯ }.isCauchy All goals completed! 🐙
a:ℕ → ℚb:ℕ → ℚhb:∀ ε > 0, ε.eventuallySteady { n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }ε:ℚhε:ε > 0this:ε / 2 > 0ha:(ε / 2).eventuallySteady { n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }⊢ ε.eventuallySteady { n₀ := 0, seq := fun n => if n ≥ 0 then (a + b) n.toNat else 0, vanish := ⋯ }
a:ℕ → ℚb:ℕ → ℚε:ℚhε:ε > 0this:ε / 2 > 0ha:(ε / 2).eventuallySteady { n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }hb:(ε / 2).eventuallySteady { n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }⊢ ε.eventuallySteady { n₀ := 0, seq := fun n => if n ≥ 0 then (a + b) n.toNat else 0, vanish := ⋯ }
a:ℕ → ℚb:ℕ → ℚε:ℚhε:ε > 0this:ε / 2 > 0ha:∃ N ≥ { n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.n₀,
(ε / 2).steady ({ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.from N)hb:∃ N ≥ { n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.n₀,
(ε / 2).steady ({ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.from N)⊢ ∃ N ≥ { n₀ := 0, seq := fun n => if n ≥ 0 then (a + b) n.toNat else 0, vanish := ⋯ }.n₀,
ε.steady ({ n₀ := 0, seq := fun n => if n ≥ 0 then (a + b) n.toNat else 0, vanish := ⋯ }.from N)
a:ℕ → ℚb:ℕ → ℚε:ℚhε:ε > 0this:ε / 2 > 0hb:∃ N ≥ { n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.n₀,
(ε / 2).steady ({ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.from N)N:ℤhN:N ≥ { n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.n₀hha:(ε / 2).steady ({ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.from N)⊢ ∃ N ≥ { n₀ := 0, seq := fun n => if n ≥ 0 then (a + b) n.toNat else 0, vanish := ⋯ }.n₀,
ε.steady ({ n₀ := 0, seq := fun n => if n ≥ 0 then (a + b) n.toNat else 0, vanish := ⋯ }.from N)
a:ℕ → ℚb:ℕ → ℚε:ℚhε:ε > 0this:ε / 2 > 0N:ℤhN:N ≥ { n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.n₀hha:(ε / 2).steady ({ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.from N)M:ℤhM:M ≥ { n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.n₀hhb:(ε / 2).steady ({ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.from M)⊢ ∃ N ≥ { n₀ := 0, seq := fun n => if n ≥ 0 then (a + b) n.toNat else 0, vanish := ⋯ }.n₀,
ε.steady ({ n₀ := 0, seq := fun n => if n ≥ 0 then (a + b) n.toNat else 0, vanish := ⋯ }.from N)
a:ℕ → ℚb:ℕ → ℚε:ℚhε:ε > 0this:ε / 2 > 0N:ℤhN:N ≥ { n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.n₀hha:(ε / 2).steady ({ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.from N)M:ℤhM:M ≥ { n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.n₀hhb:(ε / 2).steady ({ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.from M)⊢ max N M ≥ { n₀ := 0, seq := fun n => if n ≥ 0 then (a + b) n.toNat else 0, vanish := ⋯ }.n₀ ∧
ε.steady ({ n₀ := 0, seq := fun n => if n ≥ 0 then (a + b) n.toNat else 0, vanish := ⋯ }.from (max N M))
a:ℕ → ℚb:ℕ → ℚε:ℚhε:ε > 0this:ε / 2 > 0N:ℤhha:(ε / 2).steady ({ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.from N)M:ℤhhb:(ε / 2).steady ({ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.from M)hN:0 ≤ NhM:0 ≤ M⊢ (0 ≤ N ∨ 0 ≤ M) ∧
ε.steady ({ n₀ := 0, seq := fun n => if 0 ≤ n then a n.toNat + b n.toNat else 0, vanish := ⋯ }.from (max N M))
a:ℕ → ℚb:ℕ → ℚε:ℚhε:ε > 0this:ε / 2 > 0N:ℤM:ℤhN:0 ≤ NhM:0 ≤ Mhha:∀ (n : ℤ),
N ≤ n →
∀ (m : ℤ),
N ≤ m →
(ε / 2).close (if N ≤ n then if 0 ≤ n then a n.toNat else 0 else 0)
(if N ≤ m then if 0 ≤ m then a m.toNat else 0 else 0)hhb:∀ (n : ℤ),
0 ≤ n →
M ≤ n →
∀ (m : ℤ),
0 ≤ m →
M ≤ m →
(ε / 2).close (if 0 ≤ n ∧ M ≤ n then if 0 ≤ n then b n.toNat else 0 else 0)
(if 0 ≤ m ∧ M ≤ m then if 0 ≤ m then b m.toNat else 0 else 0)⊢ ∀ (n : ℤ),
N ≤ n →
M ≤ n →
∀ (m : ℤ),
N ≤ m →
M ≤ m →
ε.close (if N ≤ n ∧ M ≤ n then if 0 ≤ n then a n.toNat + b n.toNat else 0 else 0)
(if N ≤ m ∧ M ≤ m then if 0 ≤ m then a m.toNat + b m.toNat else 0 else 0)
a:ℕ → ℚb:ℕ → ℚε:ℚhε:ε > 0this:ε / 2 > 0N:ℤM:ℤhN:0 ≤ NhM:0 ≤ Mhha:∀ (n : ℤ),
N ≤ n →
∀ (m : ℤ),
N ≤ m →
(ε / 2).close (if N ≤ n then if 0 ≤ n then a n.toNat else 0 else 0)
(if N ≤ m then if 0 ≤ m then a m.toNat else 0 else 0)hhb:∀ (n : ℤ),
0 ≤ n →
M ≤ n →
∀ (m : ℤ),
0 ≤ m →
M ≤ m →
(ε / 2).close (if 0 ≤ n ∧ M ≤ n then if 0 ≤ n then b n.toNat else 0 else 0)
(if 0 ≤ m ∧ M ≤ m then if 0 ≤ m then b m.toNat else 0 else 0)n:ℤhnN:N ≤ nhnM:M ≤ nm:ℤhmN:N ≤ mhmM:M ≤ m⊢ ε.close (if N ≤ n ∧ M ≤ n then if 0 ≤ n then a n.toNat + b n.toNat else 0 else 0)
(if N ≤ m ∧ M ≤ m then if 0 ≤ m then a m.toNat + b m.toNat else 0 else 0)
a:ℕ → ℚb:ℕ → ℚε:ℚhε:ε > 0this:ε / 2 > 0N:ℤM:ℤhN:0 ≤ NhM:0 ≤ Mhha:∀ (n : ℤ),
N ≤ n →
∀ (m : ℤ),
N ≤ m →
(ε / 2).close (if N ≤ n then if 0 ≤ n then a n.toNat else 0 else 0)
(if N ≤ m then if 0 ≤ m then a m.toNat else 0 else 0)hhb:∀ (n : ℤ),
0 ≤ n →
M ≤ n →
∀ (m : ℤ),
0 ≤ m →
M ≤ m →
(ε / 2).close (if 0 ≤ n ∧ M ≤ n then if 0 ≤ n then b n.toNat else 0 else 0)
(if 0 ≤ m ∧ M ≤ m then if 0 ≤ m then b m.toNat else 0 else 0)n:ℤhnN:N ≤ nhnM:M ≤ nm:ℤhmN:N ≤ mhmM:M ≤ mhn:0 ≤ n⊢ ε.close (if N ≤ n ∧ M ≤ n then if 0 ≤ n then a n.toNat + b n.toNat else 0 else 0)
(if N ≤ m ∧ M ≤ m then if 0 ≤ m then a m.toNat + b m.toNat else 0 else 0)
a:ℕ → ℚb:ℕ → ℚε:ℚhε:ε > 0this:ε / 2 > 0N:ℤM:ℤhN:0 ≤ NhM:0 ≤ Mhha:∀ (n : ℤ),
N ≤ n →
∀ (m : ℤ),
N ≤ m →
(ε / 2).close (if N ≤ n then if 0 ≤ n then a n.toNat else 0 else 0)
(if N ≤ m then if 0 ≤ m then a m.toNat else 0 else 0)hhb:∀ (n : ℤ),
0 ≤ n →
M ≤ n →
∀ (m : ℤ),
0 ≤ m →
M ≤ m →
(ε / 2).close (if 0 ≤ n ∧ M ≤ n then if 0 ≤ n then b n.toNat else 0 else 0)
(if 0 ≤ m ∧ M ≤ m then if 0 ≤ m then b m.toNat else 0 else 0)n:ℤhnN:N ≤ nhnM:M ≤ nm:ℤhmN:N ≤ mhmM:M ≤ mhn:0 ≤ nhm:0 ≤ m⊢ ε.close (if N ≤ n ∧ M ≤ n then if 0 ≤ n then a n.toNat + b n.toNat else 0 else 0)
(if N ≤ m ∧ M ≤ m then if 0 ≤ m then a m.toNat + b m.toNat else 0 else 0)
a:ℕ → ℚb:ℕ → ℚε:ℚhε:ε > 0this:ε / 2 > 0N:ℤM:ℤhN:0 ≤ NhM:0 ≤ Mhhb:∀ (n : ℤ),
0 ≤ n →
M ≤ n →
∀ (m : ℤ),
0 ≤ m →
M ≤ m →
(ε / 2).close (if 0 ≤ n ∧ M ≤ n then if 0 ≤ n then b n.toNat else 0 else 0)
(if 0 ≤ m ∧ M ≤ m then if 0 ≤ m then b m.toNat else 0 else 0)n:ℤhnN:N ≤ nhnM:M ≤ nm:ℤhmN:N ≤ mhmM:M ≤ mhn:0 ≤ nhm:0 ≤ mhha:(ε / 2).close (if N ≤ n then if 0 ≤ n then a n.toNat else 0 else 0)
(if N ≤ m then if 0 ≤ m then a m.toNat else 0 else 0)⊢ ε.close (if N ≤ n ∧ M ≤ n then if 0 ≤ n then a n.toNat + b n.toNat else 0 else 0)
(if N ≤ m ∧ M ≤ m then if 0 ≤ m then a m.toNat + b m.toNat else 0 else 0)
a:ℕ → ℚb:ℕ → ℚε:ℚhε:ε > 0this:ε / 2 > 0N:ℤM:ℤhN:0 ≤ NhM:0 ≤ Mn:ℤhnN:N ≤ nhnM:M ≤ nm:ℤhmN:N ≤ mhmM:M ≤ mhn:0 ≤ nhm:0 ≤ mhha:(ε / 2).close (if N ≤ n then if 0 ≤ n then a n.toNat else 0 else 0)
(if N ≤ m then if 0 ≤ m then a m.toNat else 0 else 0)hhb:(ε / 2).close (if 0 ≤ n ∧ M ≤ n then if 0 ≤ n then b n.toNat else 0 else 0)
(if 0 ≤ m ∧ M ≤ m then if 0 ≤ m then b m.toNat else 0 else 0)⊢ ε.close (if N ≤ n ∧ M ≤ n then if 0 ≤ n then a n.toNat + b n.toNat else 0 else 0)
(if N ≤ m ∧ M ≤ m then if 0 ≤ m then a m.toNat + b m.toNat else 0 else 0)
a:ℕ → ℚb:ℕ → ℚε:ℚhε:ε > 0this:ε / 2 > 0N:ℤM:ℤhN:0 ≤ NhM:0 ≤ Mn:ℤhnN:N ≤ nhnM:M ≤ nm:ℤhmN:N ≤ mhmM:M ≤ mhn:0 ≤ nhm:0 ≤ mhha:(ε / 2).close (a n.toNat) (a m.toNat)hhb:(ε / 2).close (b n.toNat) (b m.toNat)⊢ ε.close (a n.toNat + b n.toNat) (a m.toNat + b m.toNat)
a:ℕ → ℚb:ℕ → ℚε:ℚhε:ε > 0this:ε / 2 > 0N:ℤM:ℤhN:0 ≤ NhM:0 ≤ Mn:ℤhnN:N ≤ nhnM:M ≤ nm:ℤhmN:N ≤ mhmM:M ≤ mhn:0 ≤ nhm:0 ≤ mhha:(ε / 2).close (a n.toNat) (a m.toNat)hhb:(ε / 2).close (b n.toNat) (b m.toNat)⊢ ε = ε / 2 + ε / 2
All goals completed! 🐙
Lemma 5.3.7 (Sum of equivalent sequences is equivalent)
theorem Sequence.add_equiv_left {a a':ℕ → ℚ} (b:ℕ → ℚ) (haa': Sequence.equiv a a') :
Sequence.equiv (a + b) (a' + b) := a:ℕ → ℚa':ℕ → ℚb:ℕ → ℚhaa':equiv a a'⊢ equiv (a + b) (a' + b)
-- цей доказ написан так, щоб співпадати із структурою орігінального тексту.
a:ℕ → ℚa':ℕ → ℚb:ℕ → ℚhaa':∀ ε > 0,
ε.eventually_close { n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }
{ n₀ := 0, seq := fun n => if n ≥ 0 then a' n.toNat else 0, vanish := ⋯ }⊢ ∀ ε > 0,
ε.eventually_close { n₀ := 0, seq := fun n => if n ≥ 0 then (a + b) n.toNat else 0, vanish := ⋯ }
{ n₀ := 0, seq := fun n => if n ≥ 0 then (a' + b) n.toNat else 0, vanish := ⋯ }
a:ℕ → ℚa':ℕ → ℚb:ℕ → ℚhaa':∀ ε > 0,
ε.eventually_close { n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }
{ n₀ := 0, seq := fun n => if n ≥ 0 then a' n.toNat else 0, vanish := ⋯ }ε:ℚhε:ε > 0⊢ ε.eventually_close { n₀ := 0, seq := fun n => if n ≥ 0 then (a + b) n.toNat else 0, vanish := ⋯ }
{ n₀ := 0, seq := fun n => if n ≥ 0 then (a' + b) n.toNat else 0, vanish := ⋯ }
a:ℕ → ℚa':ℕ → ℚb:ℕ → ℚε:ℚhε:ε > 0haa':ε.eventually_close { n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }
{ n₀ := 0, seq := fun n => if n ≥ 0 then a' n.toNat else 0, vanish := ⋯ }⊢ ε.eventually_close { n₀ := 0, seq := fun n => if n ≥ 0 then (a + b) n.toNat else 0, vanish := ⋯ }
{ n₀ := 0, seq := fun n => if n ≥ 0 then (a' + b) n.toNat else 0, vanish := ⋯ }
a:ℕ → ℚa':ℕ → ℚb:ℕ → ℚε:ℚhε:ε > 0haa':∃ N,
ε.close_seq ({ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.from N)
({ n₀ := 0, seq := fun n => if n ≥ 0 then a' n.toNat else 0, vanish := ⋯ }.from N)⊢ ∃ N,
ε.close_seq ({ n₀ := 0, seq := fun n => if n ≥ 0 then (a + b) n.toNat else 0, vanish := ⋯ }.from N)
({ n₀ := 0, seq := fun n => if n ≥ 0 then (a' + b) n.toNat else 0, vanish := ⋯ }.from N)
a:ℕ → ℚa':ℕ → ℚb:ℕ → ℚε:ℚhε:ε > 0N:ℤhaa':ε.close_seq ({ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.from N)
({ n₀ := 0, seq := fun n => if n ≥ 0 then a' n.toNat else 0, vanish := ⋯ }.from N)⊢ ∃ N,
ε.close_seq ({ n₀ := 0, seq := fun n => if n ≥ 0 then (a + b) n.toNat else 0, vanish := ⋯ }.from N)
({ n₀ := 0, seq := fun n => if n ≥ 0 then (a' + b) n.toNat else 0, vanish := ⋯ }.from N)
a:ℕ → ℚa':ℕ → ℚb:ℕ → ℚε:ℚhε:ε > 0N:ℤhaa':ε.close_seq ({ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.from N)
({ n₀ := 0, seq := fun n => if n ≥ 0 then a' n.toNat else 0, vanish := ⋯ }.from N)⊢ ε.close_seq ({ n₀ := 0, seq := fun n => if n ≥ 0 then (a + b) n.toNat else 0, vanish := ⋯ }.from N)
({ n₀ := 0, seq := fun n => if n ≥ 0 then (a' + b) n.toNat else 0, vanish := ⋯ }.from N)
a:ℕ → ℚa':ℕ → ℚb:ℕ → ℚε:ℚhε:ε > 0N:ℤhaa':∀ n ≥ ({ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.from N).n₀,
n ≥ ({ n₀ := 0, seq := fun n => if n ≥ 0 then a' n.toNat else 0, vanish := ⋯ }.from N).n₀ →
ε.close (({ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.from N).seq n)
(({ n₀ := 0, seq := fun n => if n ≥ 0 then a' n.toNat else 0, vanish := ⋯ }.from N).seq n)⊢ ∀ n ≥ ({ n₀ := 0, seq := fun n => if n ≥ 0 then (a + b) n.toNat else 0, vanish := ⋯ }.from N).n₀,
n ≥ ({ n₀ := 0, seq := fun n => if n ≥ 0 then (a' + b) n.toNat else 0, vanish := ⋯ }.from N).n₀ →
ε.close (({ n₀ := 0, seq := fun n => if n ≥ 0 then (a + b) n.toNat else 0, vanish := ⋯ }.from N).seq n)
(({ n₀ := 0, seq := fun n => if n ≥ 0 then (a' + b) n.toNat else 0, vanish := ⋯ }.from N).seq n)
a:ℕ → ℚa':ℕ → ℚb:ℕ → ℚε:ℚhε:ε > 0N:ℤhaa':∀ (n : ℤ),
0 ≤ n →
N ≤ n →
0 ≤ n →
N ≤ n →
ε.close (if 0 ≤ n ∧ N ≤ n then if 0 ≤ n then a n.toNat else 0 else 0)
(if 0 ≤ n ∧ N ≤ n then if 0 ≤ n then a' n.toNat else 0 else 0)⊢ ∀ (n : ℤ),
0 ≤ n →
N ≤ n →
0 ≤ n →
N ≤ n →
ε.close (if 0 ≤ n ∧ N ≤ n then if 0 ≤ n then a n.toNat + b n.toNat else 0 else 0)
(if 0 ≤ n ∧ N ≤ n then if 0 ≤ n then a' n.toNat + b n.toNat else 0 else 0)
a:ℕ → ℚa':ℕ → ℚb:ℕ → ℚε:ℚhε:ε > 0N:ℤhaa':∀ (n : ℤ),
0 ≤ n →
N ≤ n →
0 ≤ n →
N ≤ n →
ε.close (if 0 ≤ n ∧ N ≤ n then if 0 ≤ n then a n.toNat else 0 else 0)
(if 0 ≤ n ∧ N ≤ n then if 0 ≤ n then a' n.toNat else 0 else 0)n:ℤhn:0 ≤ nhN:N ≤ na✝¹:0 ≤ na✝:N ≤ n⊢ ε.close (if 0 ≤ n ∧ N ≤ n then if 0 ≤ n then a n.toNat + b n.toNat else 0 else 0)
(if 0 ≤ n ∧ N ≤ n then if 0 ≤ n then a' n.toNat + b n.toNat else 0 else 0)
a:ℕ → ℚa':ℕ → ℚb:ℕ → ℚε:ℚhε:ε > 0N:ℤn:ℤhn:0 ≤ nhN:N ≤ na✝¹:0 ≤ na✝:N ≤ nhaa':ε.close (if 0 ≤ n ∧ N ≤ n then if 0 ≤ n then a n.toNat else 0 else 0)
(if 0 ≤ n ∧ N ≤ n then if 0 ≤ n then a' n.toNat else 0 else 0)⊢ ε.close (if 0 ≤ n ∧ N ≤ n then if 0 ≤ n then a n.toNat + b n.toNat else 0 else 0)
(if 0 ≤ n ∧ N ≤ n then if 0 ≤ n then a' n.toNat + b n.toNat else 0 else 0)
a:ℕ → ℚa':ℕ → ℚb:ℕ → ℚε:ℚhε:ε > 0N:ℤn:ℤhn:0 ≤ nhN:N ≤ na✝¹:0 ≤ na✝:N ≤ nhaa':ε.close (a n.toNat) (a' n.toNat)⊢ ε.close (a n.toNat + b n.toNat) (a' n.toNat + b n.toNat)
a:ℕ → ℚa':ℕ → ℚb:ℕ → ℚε:ℚhε:ε > 0N:ℤn:ℤhn:0 ≤ nhN:N ≤ na✝¹:0 ≤ na✝:N ≤ nhaa':ε.close (a n.toNat) (a' n.toNat)⊢ ε = ε + 0
All goals completed! 🐙
Lemma 5.3.7 (Sum of equivalent sequences is equivalent)
theorem Sequence.add_equiv_right {b b':ℕ → ℚ} (a:ℕ → ℚ) (hbb': Sequence.equiv b b') :
Sequence.equiv (a + b) (a + b') := b:ℕ → ℚb':ℕ → ℚa:ℕ → ℚhbb':equiv b b'⊢ equiv (a + b) (a + b')
b:ℕ → ℚb':ℕ → ℚa:ℕ → ℚhbb':equiv b b'⊢ equiv (b + a) (b' + a)
All goals completed! 🐙
Lemma 5.3.7 (Sum of equivalent sequences is equivalent)
theorem Sequence.add_equiv {a b a' b':ℕ → ℚ} (haa': Sequence.equiv a a')
(hbb': Sequence.equiv b b') :
Sequence.equiv (a + b) (a' + b') :=
equiv_trans (add_equiv_left b haa') (add_equiv_right a' hbb')
Визначення 5.3.4 (Addition of reals)
noncomputable instance Real.add_inst : Add Real where
add := fun x y ↦
Quotient.liftOn₂ x y (fun a b ↦ LIM (a + b)) (x:Realy:Real⊢ ∀ (a₁ b₁ a₂ b₂ : CauchySequence),
a₁ ≈ a₂ →
b₁ ≈ b₂ →
(fun a b => LIM ((fun n => CauchySequence.toSequence.seq ↑n) + fun n => CauchySequence.toSequence.seq ↑n)) a₁ b₁ =
(fun a b => LIM ((fun n => CauchySequence.toSequence.seq ↑n) + fun n => CauchySequence.toSequence.seq ↑n)) a₂ b₂
x:Realy:Reala:CauchySequenceb:CauchySequencea':CauchySequenceb':CauchySequencehaa':a ≈ a'hbb':b ≈ b'⊢ (fun a b => LIM ((fun n => CauchySequence.toSequence.seq ↑n) + fun n => CauchySequence.toSequence.seq ↑n)) a b =
(fun a b => LIM ((fun n => CauchySequence.toSequence.seq ↑n) + fun n => CauchySequence.toSequence.seq ↑n)) a' b'
x:Realy:Reala:CauchySequenceb:CauchySequencea':CauchySequenceb':CauchySequencehaa':a ≈ a'hbb':b ≈ b'⊢ LIM ((fun n => CauchySequence.toSequence.seq ↑n) + fun n => CauchySequence.toSequence.seq ↑n) =
LIM ((fun n => CauchySequence.toSequence.seq ↑n) + fun n => CauchySequence.toSequence.seq ↑n)
x:Realy:Reala:CauchySequenceb:CauchySequencea':CauchySequenceb':CauchySequencehaa':a ≈ a'hbb':b ≈ b'⊢ Sequence.equiv ((fun n => CauchySequence.toSequence.seq ↑n) + fun n => CauchySequence.toSequence.seq ↑n)
((fun n => CauchySequence.toSequence.seq ↑n) + fun n => CauchySequence.toSequence.seq ↑n)x:Realy:Reala:CauchySequenceb:CauchySequencea':CauchySequenceb':CauchySequencehaa':a ≈ a'hbb':b ≈ b'⊢ { n₀ := 0,
seq := fun n =>
if n ≥ 0 then ((fun n => CauchySequence.toSequence.seq ↑n) + fun n => CauchySequence.toSequence.seq ↑n) n.toNat
else 0,
vanish := ⋯ }.isCauchyx:Realy:Reala:CauchySequenceb:CauchySequencea':CauchySequenceb':CauchySequencehaa':a ≈ a'hbb':b ≈ b'⊢ { n₀ := 0,
seq := fun n =>
if n ≥ 0 then ((fun n => CauchySequence.toSequence.seq ↑n) + fun n => CauchySequence.toSequence.seq ↑n) n.toNat
else 0,
vanish := ⋯ }.isCauchy
x:Realy:Reala:CauchySequenceb:CauchySequencea':CauchySequenceb':CauchySequencehaa':a ≈ a'hbb':b ≈ b'⊢ Sequence.equiv ((fun n => CauchySequence.toSequence.seq ↑n) + fun n => CauchySequence.toSequence.seq ↑n)
((fun n => CauchySequence.toSequence.seq ↑n) + fun n => CauchySequence.toSequence.seq ↑n) All goals completed! 🐙
all_goals x:Realy:Reala:CauchySequenceb:CauchySequencea':CauchySequenceb':CauchySequencehaa':a ≈ a'hbb':b ≈ b'⊢ { n₀ := 0, seq := fun n => if n ≥ 0 then CauchySequence.toSequence.seq ↑n.toNat else 0, vanish := ⋯ }.isCauchyx:Realy:Reala:CauchySequenceb:CauchySequencea':CauchySequenceb':CauchySequencehaa':a ≈ a'hbb':b ≈ b'⊢ { n₀ := 0, seq := fun n => if n ≥ 0 then CauchySequence.toSequence.seq ↑n.toNat else 0, vanish := ⋯ }.isCauchy
all_goals x:Realy:Reala:CauchySequenceb:CauchySequencea':CauchySequenceb':CauchySequencehaa':a ≈ a'hbb':b ≈ b'⊢ CauchySequence.toSequence.isCauchy
x:Realy:Reala:CauchySequenceb:CauchySequencea':CauchySequenceb':CauchySequencehaa':a ≈ a'hbb':b ≈ b'⊢ CauchySequence.toSequence.isCauchy All goals completed! 🐙
x:Realy:Reala:CauchySequenceb:CauchySequencea':CauchySequenceb':CauchySequencehaa':a ≈ a'hbb':b ≈ b'⊢ CauchySequence.toSequence.isCauchy All goals completed! 🐙
x:Realy:Reala:CauchySequenceb:CauchySequencea':CauchySequenceb':CauchySequencehaa':a ≈ a'hbb':b ≈ b'⊢ CauchySequence.toSequence.isCauchy All goals completed! 🐙
All goals completed! 🐙
)
Визначення 5.3.4 (Addition of reals)
theorem Real.add_of_LIM {a b:ℕ → ℚ} (ha: (a:Sequence).isCauchy) (hb: (b:Sequence).isCauchy) :
LIM a + LIM b = LIM (a + b) := a:ℕ → ℚb:ℕ → ℚha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchy⊢ LIM a + LIM b = LIM (a + b)
a:ℕ → ℚb:ℕ → ℚha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyhab:{ n₀ := 0, seq := fun n => if n ≥ 0 then (a + b) n.toNat else 0, vanish := ⋯ }.isCauchy⊢ LIM a + LIM b = LIM (a + b)
a:ℕ → ℚb:ℕ → ℚha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyhab:{ n₀ := 0, seq := fun n => if n ≥ 0 then (a + b) n.toNat else 0, vanish := ⋯ }.isCauchy⊢ ⟦CauchySequence.mk' ha⟧ + ⟦CauchySequence.mk' hb⟧ = ⟦CauchySequence.mk' hab⟧
a:ℕ → ℚb:ℕ → ℚha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyhab:{ n₀ := 0, seq := fun n => if n ≥ 0 then (a + b) n.toNat else 0, vanish := ⋯ }.isCauchy⊢ CauchySequence.mk' hab =
if h :
{ n₀ := 0,
seq := fun n =>
if n ≥ 0 then
((fun n => CauchySequence.toSequence.seq ↑n) + fun n => CauchySequence.toSequence.seq ↑n) n.toNat
else 0,
vanish := ⋯ }.isCauchy then
CauchySequence.mk' h
else 0
All goals completed! 🐙
Твердження 5.3.10 (Product of Cauchy sequences is Cauchy)
theorem Sequence.mul_cauchy {a b:ℕ → ℚ} (ha: (a:Sequence).isCauchy) (hb: (b:Sequence).isCauchy) :
(a * b:Sequence).isCauchy := a:ℕ → ℚb:ℕ → ℚha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchy⊢ { n₀ := 0, seq := fun n => if n ≥ 0 then (a * b) n.toNat else 0, vanish := ⋯ }.isCauchy
All goals completed! 🐙
Твердження 5.3.10 (Product of equivalent sequences is equivalent) / Вправа 5.3.2
theorem Sequence.mul_equiv_left {a a':ℕ → ℚ} (b:ℕ → ℚ) (haa': Sequence.equiv a a') :
Sequence.equiv (a * b) (a' * b) := a:ℕ → ℚa':ℕ → ℚb:ℕ → ℚhaa':equiv a a'⊢ equiv (a * b) (a' * b)
All goals completed! 🐙
Proposition 5.3.10 (Product of equivalent sequences is equivalent) / Вправа 5.3.2
theorem Sequence.mul_equiv_right {b b':ℕ → ℚ} (a:ℕ → ℚ) (hbb': Sequence.equiv b b') :
Sequence.equiv (a * b) (a * b') := b:ℕ → ℚb':ℕ → ℚa:ℕ → ℚhbb':equiv b b'⊢ equiv (a * b) (a * b')
b:ℕ → ℚb':ℕ → ℚa:ℕ → ℚhbb':equiv b b'⊢ equiv (b * a) (b' * a)
All goals completed! 🐙
Proposition 5.3.10 (Product of equivalent sequences is equivalent) / Вправа 5.3.2
theorem Sequence.mul_equiv {a b a' b':ℕ → ℚ} (haa': Sequence.equiv a a')
(hbb': Sequence.equiv b b') :
Sequence.equiv (a * b) (a' * b') :=
equiv_trans (mul_equiv_left b haa') (mul_equiv_right a' hbb')
Визначення 5.3.9 (Product of reals)
noncomputable instance Real.mul_inst : Mul Real where
mul := fun x y ↦
Quotient.liftOn₂ x y (fun a b ↦ LIM (a * b)) (x:Realy:Real⊢ ∀ (a₁ b₁ a₂ b₂ : CauchySequence),
a₁ ≈ a₂ →
b₁ ≈ b₂ →
(fun a b => LIM ((fun n => CauchySequence.toSequence.seq ↑n) * fun n => CauchySequence.toSequence.seq ↑n)) a₁ b₁ =
(fun a b => LIM ((fun n => CauchySequence.toSequence.seq ↑n) * fun n => CauchySequence.toSequence.seq ↑n)) a₂ b₂
x:Realy:Reala:CauchySequenceb:CauchySequencea':CauchySequenceb':CauchySequencehaa':a ≈ a'hbb':b ≈ b'⊢ (fun a b => LIM ((fun n => CauchySequence.toSequence.seq ↑n) * fun n => CauchySequence.toSequence.seq ↑n)) a b =
(fun a b => LIM ((fun n => CauchySequence.toSequence.seq ↑n) * fun n => CauchySequence.toSequence.seq ↑n)) a' b'
x:Realy:Reala:CauchySequenceb:CauchySequencea':CauchySequenceb':CauchySequencehaa':a ≈ a'hbb':b ≈ b'⊢ LIM ((fun n => CauchySequence.toSequence.seq ↑n) * fun n => CauchySequence.toSequence.seq ↑n) =
LIM ((fun n => CauchySequence.toSequence.seq ↑n) * fun n => CauchySequence.toSequence.seq ↑n)
x:Realy:Reala:CauchySequenceb:CauchySequencea':CauchySequenceb':CauchySequencehaa':a ≈ a'hbb':b ≈ b'⊢ Sequence.equiv ((fun n => CauchySequence.toSequence.seq ↑n) * fun n => CauchySequence.toSequence.seq ↑n)
((fun n => CauchySequence.toSequence.seq ↑n) * fun n => CauchySequence.toSequence.seq ↑n)x:Realy:Reala:CauchySequenceb:CauchySequencea':CauchySequenceb':CauchySequencehaa':a ≈ a'hbb':b ≈ b'⊢ { n₀ := 0,
seq := fun n =>
if n ≥ 0 then ((fun n => CauchySequence.toSequence.seq ↑n) * fun n => CauchySequence.toSequence.seq ↑n) n.toNat
else 0,
vanish := ⋯ }.isCauchyx:Realy:Reala:CauchySequenceb:CauchySequencea':CauchySequenceb':CauchySequencehaa':a ≈ a'hbb':b ≈ b'⊢ { n₀ := 0,
seq := fun n =>
if n ≥ 0 then ((fun n => CauchySequence.toSequence.seq ↑n) * fun n => CauchySequence.toSequence.seq ↑n) n.toNat
else 0,
vanish := ⋯ }.isCauchy
x:Realy:Reala:CauchySequenceb:CauchySequencea':CauchySequenceb':CauchySequencehaa':a ≈ a'hbb':b ≈ b'⊢ Sequence.equiv ((fun n => CauchySequence.toSequence.seq ↑n) * fun n => CauchySequence.toSequence.seq ↑n)
((fun n => CauchySequence.toSequence.seq ↑n) * fun n => CauchySequence.toSequence.seq ↑n) All goals completed! 🐙
all_goals x:Realy:Reala:CauchySequenceb:CauchySequencea':CauchySequenceb':CauchySequencehaa':a ≈ a'hbb':b ≈ b'⊢ { n₀ := 0, seq := fun n => if n ≥ 0 then CauchySequence.toSequence.seq ↑n.toNat else 0, vanish := ⋯ }.isCauchyx:Realy:Reala:CauchySequenceb:CauchySequencea':CauchySequenceb':CauchySequencehaa':a ≈ a'hbb':b ≈ b'⊢ { n₀ := 0, seq := fun n => if n ≥ 0 then CauchySequence.toSequence.seq ↑n.toNat else 0, vanish := ⋯ }.isCauchy
all_goals x:Realy:Reala:CauchySequenceb:CauchySequencea':CauchySequenceb':CauchySequencehaa':a ≈ a'hbb':b ≈ b'⊢ CauchySequence.toSequence.isCauchy
x:Realy:Reala:CauchySequenceb:CauchySequencea':CauchySequenceb':CauchySequencehaa':a ≈ a'hbb':b ≈ b'⊢ CauchySequence.toSequence.isCauchy All goals completed! 🐙
x:Realy:Reala:CauchySequenceb:CauchySequencea':CauchySequenceb':CauchySequencehaa':a ≈ a'hbb':b ≈ b'⊢ CauchySequence.toSequence.isCauchy All goals completed! 🐙
x:Realy:Reala:CauchySequenceb:CauchySequencea':CauchySequenceb':CauchySequencehaa':a ≈ a'hbb':b ≈ b'⊢ CauchySequence.toSequence.isCauchy All goals completed! 🐙
All goals completed! 🐙
)
theorem Real.mul_of_LIM {a b:ℕ → ℚ} (ha: (a:Sequence).isCauchy) (hb: (b:Sequence).isCauchy) :
LIM a * LIM b = LIM (a * b) := a:ℕ → ℚb:ℕ → ℚha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchy⊢ LIM a * LIM b = LIM (a * b)
a:ℕ → ℚb:ℕ → ℚha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyhab:{ n₀ := 0, seq := fun n => if n ≥ 0 then (a * b) n.toNat else 0, vanish := ⋯ }.isCauchy⊢ LIM a * LIM b = LIM (a * b)
a:ℕ → ℚb:ℕ → ℚha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyhab:{ n₀ := 0, seq := fun n => if n ≥ 0 then (a * b) n.toNat else 0, vanish := ⋯ }.isCauchy⊢ ⟦CauchySequence.mk' ha⟧ * ⟦CauchySequence.mk' hb⟧ = ⟦CauchySequence.mk' hab⟧
a:ℕ → ℚb:ℕ → ℚha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyhab:{ n₀ := 0, seq := fun n => if n ≥ 0 then (a * b) n.toNat else 0, vanish := ⋯ }.isCauchy⊢ CauchySequence.mk' hab =
if h :
{ n₀ := 0,
seq := fun n =>
if n ≥ 0 then
((fun n => CauchySequence.toSequence.seq ↑n) * fun n => CauchySequence.toSequence.seq ↑n) n.toNat
else 0,
vanish := ⋯ }.isCauchy then
CauchySequence.mk' h
else 0
All goals completed! 🐙
instance Real.instRatCast : RatCast Real where
ratCast := fun q ↦
Quotient.mk _ (CauchySequence.mk' (a := fun _ ↦ q) (Sequence.isCauchy_of_const q))
theorem Real.ratCast_def (q:ℚ) : (q:Real) = LIM (fun _ ↦ q) := q:ℚ⊢ ↑q = LIM fun x => q
q:ℚ⊢ ↑q = ⟦CauchySequence.mk' ?m.297489⟧q:ℚ⊢ { n₀ := 0, seq := fun n => if n ≥ 0 then q else 0, vanish := ⋯ }.isCauchy
All goals completed! 🐙
Вправа 5.3.3
@[simp]
theorem Real.ratCast_inj (q r:ℚ) : (q:Real) = (r:Real) ↔ q = r := q:ℚr:ℚ⊢ ↑q = ↑r ↔ q = r
All goals completed! 🐙
instance Real.instOfNat {n:ℕ} : OfNat Real n where
ofNat := ((n:ℚ):Real)
instance Real.instNatCast : NatCast Real where
natCast n := ((n:ℚ):Real)
@[simp]
theorem Real.LIM_zero : LIM (fun _ ↦ (0:ℚ)) = 0 := ⊢ (LIM fun x => 0) = 0
⊢ ↑0 = 0
All goals completed! 🐙
instance Real.instIntCast : IntCast Real where
intCast n := ((n:ℚ):Real)
theorem Real.add_of_ratCast (a b:ℚ) : (a:Real) + (b:Real) = (a+b:ℚ) := a:ℚb:ℚ⊢ ↑a + ↑b = ↑(a + b) All goals completed! 🐙
theorem Real.mul_of_ratCast (a b:ℚ) : (a:Real) * (b:Real) = (a*b:ℚ) := a:ℚb:ℚ⊢ ↑a * ↑b = ↑(a * b) All goals completed! 🐙
noncomputable instance Real.instNeg : Neg Real where
neg := fun x ↦ ((-1:ℚ):Real) * x
theorem Real.neg_of_ratCast (a:ℚ) : -(a:Real) = (-a:ℚ) := a:ℚ⊢ -↑a = ↑(-a) All goals completed! 🐙
It may be possible to omit the Cauchy sequence hypothesis here.
theorem Real.neg_of_LIM (a:ℕ → ℚ) (ha: (a:Sequence).isCauchy) : -LIM a = LIM (-a) := a:ℕ → ℚha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchy⊢ -LIM a = LIM (-a) All goals completed! 🐙
theorem Real.neg_of_cauchy (a:ℕ → ℚ) (ha: (a:Sequence).isCauchy) :
((-a:ℕ → ℚ):Sequence).isCauchy := a:ℕ → ℚha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchy⊢ { n₀ := 0, seq := fun n => if n ≥ 0 then (-a) n.toNat else 0, vanish := ⋯ }.isCauchy All goals completed! 🐙
Твердження 5.3.11
noncomputable instance Real.addGroup_inst : AddGroup Real :=
AddGroup.ofLeftAxioms (⊢ ∀ (a b c : Real), a + b + c = a + (b + c) All goals completed! 🐙) (⊢ ∀ (a : Real), 0 + a = a All goals completed! 🐙) (⊢ ∀ (a : Real), -a + a = 0 All goals completed! 🐙)
theorem Real.sub_eq_add_neg (x y:Real) : x - y = x + (-y) := rfl
theorem Real.sub_of_cauchy {a b:ℕ → ℚ} (ha: (a:Sequence).isCauchy) (hb: (b:Sequence).isCauchy) :
((a-b:ℕ → ℚ):Sequence).isCauchy := a:ℕ → ℚb:ℕ → ℚha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchy⊢ { n₀ := 0, seq := fun n => if n ≥ 0 then (a - b) n.toNat else 0, vanish := ⋯ }.isCauchy All goals completed! 🐙
theorem Real.sub_of_LIM {a b:ℕ → ℚ} (ha: (a:Sequence).isCauchy) (hb: (b:Sequence).isCauchy) :
LIM a - LIM b = LIM (a - b) := a:ℕ → ℚb:ℕ → ℚha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchy⊢ LIM a - LIM b = LIM (a - b) All goals completed! 🐙
theorem Real.sub_of_ratCast (a b:ℚ) : (a:Real) - (b:Real) = (a-b:ℚ) := a:ℚb:ℚ⊢ ↑a - ↑b = ↑(a - b) All goals completed! 🐙
Твердження 5.3.12 (laws of algebra)
noncomputable instance Real.instAddCommGroup : AddCommGroup Real where
add_comm := ⊢ ∀ (a b : Real), a + b = b + a All goals completed! 🐙
Твердження 5.3.12 (laws of algebra)
noncomputable instance Real.instCommMonoid : CommMonoid Real where
mul_comm := ⊢ ∀ (a b : Real), a * b = b * a All goals completed! 🐙
mul_assoc := ⊢ ∀ (a b c : Real), a * b * c = a * (b * c) All goals completed! 🐙
one_mul := ⊢ ∀ (a : Real), 1 * a = a All goals completed! 🐙
mul_one := ⊢ ∀ (a : Real), a * 1 = a All goals completed! 🐙
Твердження 5.3.12 (laws of algebra)
noncomputable instance Real.instCommRing : CommRing Real where
left_distrib := ⊢ ∀ (a b c : Real), a * (b + c) = a * b + a * c All goals completed! 🐙
right_distrib := ⊢ ∀ (a b c : Real), (a + b) * c = a * c + b * c All goals completed! 🐙
zero_mul := ⊢ ∀ (a : Real), 0 * a = 0 All goals completed! 🐙
mul_zero := ⊢ ∀ (a : Real), a * 0 = 0 All goals completed! 🐙
mul_assoc := ⊢ ∀ (a b c : Real), a * b * c = a * (b * c) All goals completed! 🐙
natCast_succ := ⊢ ∀ (n : ℕ), ↑(n + 1) = ↑n + 1 All goals completed! 🐙
intCast_negSucc := ⊢ ∀ (n : ℕ), IntCast.intCast (Int.negSucc n) = -↑(n + 1) All goals completed! 🐙
abbrev Real.ratCast_hom : ℚ →+* Real where
toFun := RatCast.ratCast
map_zero' := ⊢ RatCast.ratCast 0 = 0 All goals completed! 🐙
map_one' := ⊢ RatCast.ratCast 1 = 1 All goals completed! 🐙
map_add' := ⊢ ∀ (x y : ℚ), RatCast.ratCast (x + y) = RatCast.ratCast x + RatCast.ratCast y All goals completed! 🐙
map_mul' := ⊢ ∀ (x y : ℚ), RatCast.ratCast (x * y) = RatCast.ratCast x * RatCast.ratCast y All goals completed! 🐙
Визначення 5.3.12 (sequences bounded away from zero). Sequences are indexed to start from zero as this is more convenient for Mathlib purposes.
abbrev bounded_away_zero (a:ℕ → ℚ) : Prop :=
∃ (c:ℚ), c > 0 ∧ ∀ n, |a n| ≥ c
theorem bounded_away_zero_def (a:ℕ → ℚ) : bounded_away_zero a ↔
∃ (c:ℚ), c > 0 ∧ ∀ n, |a n| ≥ c := a:ℕ → ℚ⊢ bounded_away_zero a ↔ ∃ c > 0, ∀ (n : ℕ), |a n| ≥ c All goals completed! 🐙
Приклади 5.3.13
example : bounded_away_zero (fun n ↦ (-1)^n) := ⊢ bounded_away_zero fun n => (-1) ^ n All goals completed! 🐙
Приклади 5.3.13
example : ¬ bounded_away_zero (fun n ↦ 10^(-(n:ℤ)-1)) := ⊢ ¬bounded_away_zero fun n => 10 ^ (-↑n - 1) All goals completed! 🐙
Приклади 5.3.13
example : ¬ bounded_away_zero (fun n ↦ 1 - 10^(-(n:ℤ))) := ⊢ ¬bounded_away_zero fun n => 1 - 10 ^ (-↑n) All goals completed! 🐙
Приклади 5.3.13
example : bounded_away_zero (fun n ↦ 10^(n+1)) := ⊢ bounded_away_zero fun n => 10 ^ (n + 1) All goals completed! 🐙
Приклади 5.3.13
example : ((fun (n:ℕ) ↦ (10:ℚ)^(n+1)):Sequence).isBounded := ⊢ { n₀ := 0, seq := fun n => if n ≥ 0 then (fun n => 10 ^ (n + 1)) n.toNat else 0, vanish := ⋯ }.isBounded All goals completed! 🐙
Лема 5.3.14
theorem Real.bounded_away_zero_of_nonzero {x:Real} (hx: x ≠ 0) :
∃ a:ℕ → ℚ, (a:Sequence).isCauchy ∧ bounded_away_zero a ∧ x = LIM a := x:Realhx:x ≠ 0⊢ ∃ a, { n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchy ∧ bounded_away_zero a ∧ x = LIM a
-- цей доказ написан так, щоб співпадати із структурою орігінального тексту.
b:ℕ → ℚhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyhx:LIM b ≠ 0⊢ ∃ a,
{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchy ∧
bounded_away_zero a ∧ LIM b = LIM a
b:ℕ → ℚhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyhx:¬LIM b = LIM fun x => 0⊢ ∃ a,
{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchy ∧
bounded_away_zero a ∧ LIM b = LIM a
b:ℕ → ℚhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyhx:¬∀ ε > 0, ∃ N, ∀ n ≥ N, |b n - 0| ≤ ε⊢ ∃ a,
{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchy ∧
bounded_away_zero a ∧ LIM b = LIM a
b:ℕ → ℚhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyhx:∃ x, 0 < x ∧ ∀ (x_1 : ℕ), ∃ x_2, x_1 ≤ x_2 ∧ x < |b x_2|⊢ ∃ a,
{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchy ∧
bounded_away_zero a ∧ LIM b = LIM a
b:ℕ → ℚhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyε:ℚhε:0 < εhx:∀ (x : ℕ), ∃ x_1, x ≤ x_1 ∧ ε < |b x_1|⊢ ∃ a,
{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchy ∧
bounded_away_zero a ∧ LIM b = LIM a
b:ℕ → ℚhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyε:ℚhε:0 < εhx:∀ (x : ℕ), ∃ x_1, x ≤ x_1 ∧ ε < |b x_1|hb':∃ N, ∀ j ≥ N, ∀ k ≥ N, Section_4_3.dist (b j) (b k) ≤ ε / 2⊢ ∃ a,
{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchy ∧
bounded_away_zero a ∧ LIM b = LIM a
b:ℕ → ℚhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyε:ℚhε:0 < εhx:∀ (x : ℕ), ∃ x_1, x ≤ x_1 ∧ ε < |b x_1|N:ℕhb':∀ j ≥ N, ∀ k ≥ N, Section_4_3.dist (b j) (b k) ≤ ε / 2⊢ ∃ a,
{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchy ∧
bounded_away_zero a ∧ LIM b = LIM a
b:ℕ → ℚhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyε:ℚhε:0 < εhx✝:∀ (x : ℕ), ∃ x_1, x ≤ x_1 ∧ ε < |b x_1|N:ℕhb':∀ j ≥ N, ∀ k ≥ N, Section_4_3.dist (b j) (b k) ≤ ε / 2n₀:ℕhn₀:N ≤ n₀hx:ε < |b n₀|⊢ ∃ a,
{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchy ∧
bounded_away_zero a ∧ LIM b = LIM a
have how : ∀ j ≥ N, |b j| ≥ ε/2 := x:Realhx:x ≠ 0⊢ ∃ a, { n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchy ∧ bounded_away_zero a ∧ x = LIM a All goals completed! 🐙
b:ℕ → ℚhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyε:ℚhε:0 < εhx✝:∀ (x : ℕ), ∃ x_1, x ≤ x_1 ∧ ε < |b x_1|N:ℕhb':∀ j ≥ N, ∀ k ≥ N, Section_4_3.dist (b j) (b k) ≤ ε / 2n₀:ℕhn₀:N ≤ n₀hx:ε < |b n₀|how:∀ j ≥ N, |b j| ≥ ε / 2a:ℕ → ℚ := fun n => if n < n₀ then ε / 2 else b n⊢ ∃ a,
{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchy ∧
bounded_away_zero a ∧ LIM b = LIM a
have not_hard : Sequence.equiv a b := x:Realhx:x ≠ 0⊢ ∃ a, { n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchy ∧ bounded_away_zero a ∧ x = LIM a All goals completed! 🐙
b:ℕ → ℚhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyε:ℚhε:0 < εhx✝:∀ (x : ℕ), ∃ x_1, x ≤ x_1 ∧ ε < |b x_1|N:ℕhb':∀ j ≥ N, ∀ k ≥ N, Section_4_3.dist (b j) (b k) ≤ ε / 2n₀:ℕhn₀:N ≤ n₀hx:ε < |b n₀|how:∀ j ≥ N, |b j| ≥ ε / 2a:ℕ → ℚ := fun n => if n < n₀ then ε / 2 else b nnot_hard:Sequence.equiv a bha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchy⊢ ∃ a,
{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchy ∧
bounded_away_zero a ∧ LIM b = LIM a
b:ℕ → ℚhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyε:ℚhε:0 < εhx✝:∀ (x : ℕ), ∃ x_1, x ≤ x_1 ∧ ε < |b x_1|N:ℕhb':∀ j ≥ N, ∀ k ≥ N, Section_4_3.dist (b j) (b k) ≤ ε / 2n₀:ℕhn₀:N ≤ n₀hx:ε < |b n₀|how:∀ j ≥ N, |b j| ≥ ε / 2a:ℕ → ℚ := fun n => if n < n₀ then ε / 2 else b nnot_hard:Sequence.equiv a bha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchy⊢ bounded_away_zero ab:ℕ → ℚhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyε:ℚhε:0 < εhx✝:∀ (x : ℕ), ∃ x_1, x ≤ x_1 ∧ ε < |b x_1|N:ℕhb':∀ j ≥ N, ∀ k ≥ N, Section_4_3.dist (b j) (b k) ≤ ε / 2n₀:ℕhn₀:N ≤ n₀hx:ε < |b n₀|how:∀ j ≥ N, |b j| ≥ ε / 2a:ℕ → ℚ := fun n => if n < n₀ then ε / 2 else b nnot_hard:Sequence.equiv a bha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchy⊢ LIM b = LIM a
b:ℕ → ℚhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyε:ℚhε:0 < εhx✝:∀ (x : ℕ), ∃ x_1, x ≤ x_1 ∧ ε < |b x_1|N:ℕhb':∀ j ≥ N, ∀ k ≥ N, Section_4_3.dist (b j) (b k) ≤ ε / 2n₀:ℕhn₀:N ≤ n₀hx:ε < |b n₀|how:∀ j ≥ N, |b j| ≥ ε / 2a:ℕ → ℚ := fun n => if n < n₀ then ε / 2 else b nnot_hard:Sequence.equiv a bha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchy⊢ bounded_away_zero a b:ℕ → ℚhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyε:ℚhε:0 < εhx✝:∀ (x : ℕ), ∃ x_1, x ≤ x_1 ∧ ε < |b x_1|N:ℕhb':∀ j ≥ N, ∀ k ≥ N, Section_4_3.dist (b j) (b k) ≤ ε / 2n₀:ℕhn₀:N ≤ n₀hx:ε < |b n₀|how:∀ j ≥ N, |b j| ≥ ε / 2a:ℕ → ℚ := fun n => if n < n₀ then ε / 2 else b nnot_hard:Sequence.equiv a bha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchy⊢ ∃ c > 0, ∀ (n : ℕ), |a n| ≥ c
b:ℕ → ℚhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyε:ℚhε:0 < εhx✝:∀ (x : ℕ), ∃ x_1, x ≤ x_1 ∧ ε < |b x_1|N:ℕhb':∀ j ≥ N, ∀ k ≥ N, Section_4_3.dist (b j) (b k) ≤ ε / 2n₀:ℕhn₀:N ≤ n₀hx:ε < |b n₀|how:∀ j ≥ N, |b j| ≥ ε / 2a:ℕ → ℚ := fun n => if n < n₀ then ε / 2 else b nnot_hard:Sequence.equiv a bha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchy⊢ ∀ (n : ℕ), |a n| ≥ ε / 2
b:ℕ → ℚhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyε:ℚhε:0 < εhx✝:∀ (x : ℕ), ∃ x_1, x ≤ x_1 ∧ ε < |b x_1|N:ℕhb':∀ j ≥ N, ∀ k ≥ N, Section_4_3.dist (b j) (b k) ≤ ε / 2n₀:ℕhn₀:N ≤ n₀hx:ε < |b n₀|how:∀ j ≥ N, |b j| ≥ ε / 2a:ℕ → ℚ := fun n => if n < n₀ then ε / 2 else b nnot_hard:Sequence.equiv a bha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyn:ℕ⊢ |a n| ≥ ε / 2
b:ℕ → ℚhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyε:ℚhε:0 < εhx✝:∀ (x : ℕ), ∃ x_1, x ≤ x_1 ∧ ε < |b x_1|N:ℕhb':∀ j ≥ N, ∀ k ≥ N, Section_4_3.dist (b j) (b k) ≤ ε / 2n₀:ℕhn₀:N ≤ n₀hx:ε < |b n₀|how:∀ j ≥ N, |b j| ≥ ε / 2a:ℕ → ℚ := fun n => if n < n₀ then ε / 2 else b nnot_hard:Sequence.equiv a bha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyn:ℕhn:n < n₀⊢ |a n| ≥ ε / 2b:ℕ → ℚhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyε:ℚhε:0 < εhx✝:∀ (x : ℕ), ∃ x_1, x ≤ x_1 ∧ ε < |b x_1|N:ℕhb':∀ j ≥ N, ∀ k ≥ N, Section_4_3.dist (b j) (b k) ≤ ε / 2n₀:ℕhn₀:N ≤ n₀hx:ε < |b n₀|how:∀ j ≥ N, |b j| ≥ ε / 2a:ℕ → ℚ := fun n => if n < n₀ then ε / 2 else b nnot_hard:Sequence.equiv a bha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyn:ℕhn:¬n < n₀⊢ |a n| ≥ ε / 2
all_goals b:ℕ → ℚhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyε:ℚhε:0 < εhx✝:∀ (x : ℕ), ∃ x_1, x ≤ x_1 ∧ ε < |b x_1|N:ℕhb':∀ j ≥ N, ∀ k ≥ N, Section_4_3.dist (b j) (b k) ≤ ε / 2n₀:ℕhn₀:N ≤ n₀hx:ε < |b n₀|how:∀ j ≥ N, |b j| ≥ ε / 2a:ℕ → ℚ := fun n => if n < n₀ then ε / 2 else b nnot_hard:Sequence.equiv a bha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyn:ℕhn:¬n < n₀⊢ ε / 2 ≤ |b n|
b:ℕ → ℚhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyε:ℚhε:0 < εhx✝:∀ (x : ℕ), ∃ x_1, x ≤ x_1 ∧ ε < |b x_1|N:ℕhb':∀ j ≥ N, ∀ k ≥ N, Section_4_3.dist (b j) (b k) ≤ ε / 2n₀:ℕhn₀:N ≤ n₀hx:ε < |b n₀|how:∀ j ≥ N, |b j| ≥ ε / 2a:ℕ → ℚ := fun n => if n < n₀ then ε / 2 else b nnot_hard:Sequence.equiv a bha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyn:ℕhn:n < n₀⊢ ε / 2 ≤ |ε / 2| All goals completed! 🐙
b:ℕ → ℚhb:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyε:ℚhε:0 < εhx✝:∀ (x : ℕ), ∃ x_1, x ≤ x_1 ∧ ε < |b x_1|N:ℕhb':∀ j ≥ N, ∀ k ≥ N, Section_4_3.dist (b j) (b k) ≤ ε / 2n₀:ℕhn₀:N ≤ n₀hx:ε < |b n₀|how:∀ j ≥ N, |b j| ≥ ε / 2a:ℕ → ℚ := fun n => if n < n₀ then ε / 2 else b nnot_hard:Sequence.equiv a bha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyn:ℕhn:¬n < n₀⊢ n ≥ N
All goals completed! 🐙
All goals completed! 🐙
This result was not explicitly stated in the text, but is needed in the theory. It's a good exercise, so I'm setting it as such.
theorem Real.lim_of_bounded_away_zero {a:ℕ → ℚ} (ha: bounded_away_zero a)
(ha_cauchy: (a:Sequence).isCauchy) :
LIM a ≠ 0 := a:ℕ → ℚha:bounded_away_zero aha_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchy⊢ LIM a ≠ 0 All goals completed! 🐙
theorem Real.bounded_away_zero_nonzero {a:ℕ → ℚ} (ha: bounded_away_zero a) (n: ℕ) : a n ≠ 0 := a:ℕ → ℚha:bounded_away_zero an:ℕ⊢ a n ≠ 0
a:ℕ → ℚn:ℕc:ℚhc:c > 0ha:∀ (n : ℕ), |a n| ≥ c⊢ a n ≠ 0
a:ℕ → ℚn:ℕc:ℚhc:c > 0ha:|a n| ≥ c⊢ a n ≠ 0; a:ℕ → ℚn:ℕc:ℚhc:c > 0ha:a n = 0⊢ |a n| < c; All goals completed! 🐙
Лема 5.3.15
theorem Real.inv_of_bounded_away_zero_cauchy {a:ℕ → ℚ} (ha: bounded_away_zero a)
(ha_cauchy: (a:Sequence).isCauchy) :
((a⁻¹:ℕ → ℚ):Sequence).isCauchy := a:ℕ → ℚha:bounded_away_zero aha_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchy⊢ { n₀ := 0, seq := fun n => if n ≥ 0 then a⁻¹ n.toNat else 0, vanish := ⋯ }.isCauchy
-- цей доказ написан так, щоб співпадати із структурою орігінального тексту.
a:ℕ → ℚha:bounded_away_zero aha_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyha':∀ (n : ℕ), a n ≠ 0⊢ { n₀ := 0, seq := fun n => if n ≥ 0 then a⁻¹ n.toNat else 0, vanish := ⋯ }.isCauchy
a:ℕ → ℚha:∃ c > 0, ∀ (n : ℕ), |a n| ≥ cha_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyha':∀ (n : ℕ), a n ≠ 0⊢ { n₀ := 0, seq := fun n => if n ≥ 0 then a⁻¹ n.toNat else 0, vanish := ⋯ }.isCauchy
a:ℕ → ℚha_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyha':∀ (n : ℕ), a n ≠ 0c:ℚhc:c > 0ha:∀ (n : ℕ), |a n| ≥ c⊢ { n₀ := 0, seq := fun n => if n ≥ 0 then a⁻¹ n.toNat else 0, vanish := ⋯ }.isCauchy
a:ℕ → ℚha':∀ (n : ℕ), a n ≠ 0c:ℚhc:c > 0ha:∀ (n : ℕ), |a n| ≥ cha_cauchy:∀ ε > 0, ∃ N, ∀ j ≥ N, ∀ k ≥ N, |a j - a k| ≤ ε⊢ ∀ ε > 0, ∃ N, ∀ j ≥ N, ∀ k ≥ N, |a⁻¹ j - a⁻¹ k| ≤ ε
a:ℕ → ℚha':∀ (n : ℕ), a n ≠ 0c:ℚhc:c > 0ha:∀ (n : ℕ), |a n| ≥ cha_cauchy:∀ ε > 0, ∃ N, ∀ j ≥ N, ∀ k ≥ N, |a j - a k| ≤ εε:ℚhε:ε > 0⊢ ∃ N, ∀ j ≥ N, ∀ k ≥ N, |a⁻¹ j - a⁻¹ k| ≤ ε
specialize ha_cauchy (c^2 * ε) (a:ℕ → ℚha':∀ (n : ℕ), a n ≠ 0c:ℚhc:c > 0ha:∀ (n : ℕ), |a n| ≥ cha_cauchy:∀ ε > 0, ∃ N, ∀ j ≥ N, ∀ k ≥ N, |a j - a k| ≤ εε:ℚhε:ε > 0⊢ c ^ 2 * ε > 0 All goals completed! 🐙)
a:ℕ → ℚha':∀ (n : ℕ), a n ≠ 0c:ℚhc:c > 0ha:∀ (n : ℕ), |a n| ≥ cε:ℚhε:ε > 0N:ℕha_cauchy:∀ j ≥ N, ∀ k ≥ N, |a j - a k| ≤ c ^ 2 * ε⊢ ∃ N, ∀ j ≥ N, ∀ k ≥ N, |a⁻¹ j - a⁻¹ k| ≤ ε
a:ℕ → ℚha':∀ (n : ℕ), a n ≠ 0c:ℚhc:c > 0ha:∀ (n : ℕ), |a n| ≥ cε:ℚhε:ε > 0N:ℕha_cauchy:∀ j ≥ N, ∀ k ≥ N, |a j - a k| ≤ c ^ 2 * ε⊢ ∀ j ≥ N, ∀ k ≥ N, |a⁻¹ j - a⁻¹ k| ≤ ε
a:ℕ → ℚha':∀ (n : ℕ), a n ≠ 0c:ℚhc:c > 0ha:∀ (n : ℕ), |a n| ≥ cε:ℚhε:ε > 0N:ℕha_cauchy:∀ j ≥ N, ∀ k ≥ N, |a j - a k| ≤ c ^ 2 * εn:ℕhn:n ≥ Nm:ℕhm:m ≥ N⊢ |a⁻¹ n - a⁻¹ m| ≤ ε
a:ℕ → ℚha':∀ (n : ℕ), a n ≠ 0c:ℚhc:c > 0ha:∀ (n : ℕ), |a n| ≥ cε:ℚhε:ε > 0N:ℕn:ℕhn:n ≥ Nm:ℕhm:m ≥ Nha_cauchy:|a n - a m| ≤ c ^ 2 * ε⊢ |a⁻¹ n - a⁻¹ m| ≤ ε
calc
_ = |(a m - a n) / (a m * a n)| := a:ℕ → ℚha':∀ (n : ℕ), a n ≠ 0c:ℚhc:c > 0ha:∀ (n : ℕ), |a n| ≥ cε:ℚhε:ε > 0N:ℕn:ℕhn:n ≥ Nm:ℕhm:m ≥ Nha_cauchy:|a n - a m| ≤ c ^ 2 * ε⊢ |a⁻¹ n - a⁻¹ m| = |(a m - a n) / (a m * a n)|
a:ℕ → ℚha':∀ (n : ℕ), a n ≠ 0c:ℚhc:c > 0ha:∀ (n : ℕ), |a n| ≥ cε:ℚhε:ε > 0N:ℕn:ℕhn:n ≥ Nm:ℕhm:m ≥ Nha_cauchy:|a n - a m| ≤ c ^ 2 * ε⊢ a⁻¹ n - a⁻¹ m = (a m - a n) / (a m * a n)
a:ℕ → ℚha':∀ (n : ℕ), a n ≠ 0c:ℚhc:c > 0ha:∀ (n : ℕ), |a n| ≥ cε:ℚhε:ε > 0N:ℕn:ℕhn:n ≥ Nm:ℕhm:m ≥ Nha_cauchy:|a n - a m| ≤ c ^ 2 * ε⊢ a m * a n = a n * a m ∨ a m - a n = 0
All goals completed! 🐙
_ ≤ |a m - a n| / c^2 := a:ℕ → ℚha':∀ (n : ℕ), a n ≠ 0c:ℚhc:c > 0ha:∀ (n : ℕ), |a n| ≥ cε:ℚhε:ε > 0N:ℕn:ℕhn:n ≥ Nm:ℕhm:m ≥ Nha_cauchy:|a n - a m| ≤ c ^ 2 * ε⊢ |(a m - a n) / (a m * a n)| ≤ |a m - a n| / c ^ 2
a:ℕ → ℚha':∀ (n : ℕ), a n ≠ 0c:ℚhc:c > 0ha:∀ (n : ℕ), |a n| ≥ cε:ℚhε:ε > 0N:ℕn:ℕhn:n ≥ Nm:ℕhm:m ≥ Nha_cauchy:|a n - a m| ≤ c ^ 2 * ε⊢ |a m - a n| / (|a m| * |a n|) ≤ |a m - a n| / (c * c)
a:ℕ → ℚha':∀ (n : ℕ), a n ≠ 0c:ℚhc:c > 0ha:∀ (n : ℕ), |a n| ≥ cε:ℚhε:ε > 0N:ℕn:ℕhn:n ≥ Nm:ℕhm:m ≥ Nha_cauchy:|a n - a m| ≤ c ^ 2 * ε⊢ c ≤ |a m|a:ℕ → ℚha':∀ (n : ℕ), a n ≠ 0c:ℚhc:c > 0ha:∀ (n : ℕ), |a n| ≥ cε:ℚhε:ε > 0N:ℕn:ℕhn:n ≥ Nm:ℕhm:m ≥ Nha_cauchy:|a n - a m| ≤ c ^ 2 * ε⊢ c ≤ |a n|
a:ℕ → ℚha':∀ (n : ℕ), a n ≠ 0c:ℚhc:c > 0ha:∀ (n : ℕ), |a n| ≥ cε:ℚhε:ε > 0N:ℕn:ℕhn:n ≥ Nm:ℕhm:m ≥ Nha_cauchy:|a n - a m| ≤ c ^ 2 * ε⊢ c ≤ |a m| All goals completed! 🐙
All goals completed! 🐙
_ = |a n - a m| / c^2 := a:ℕ → ℚha':∀ (n : ℕ), a n ≠ 0c:ℚhc:c > 0ha:∀ (n : ℕ), |a n| ≥ cε:ℚhε:ε > 0N:ℕn:ℕhn:n ≥ Nm:ℕhm:m ≥ Nha_cauchy:|a n - a m| ≤ c ^ 2 * ε⊢ |a m - a n| / c ^ 2 = |a n - a m| / c ^ 2
All goals completed! 🐙
_ ≤ (c^2 * ε) / c^2 := a:ℕ → ℚha':∀ (n : ℕ), a n ≠ 0c:ℚhc:c > 0ha:∀ (n : ℕ), |a n| ≥ cε:ℚhε:ε > 0N:ℕn:ℕhn:n ≥ Nm:ℕhm:m ≥ Nha_cauchy:|a n - a m| ≤ c ^ 2 * ε⊢ |a n - a m| / c ^ 2 ≤ c ^ 2 * ε / c ^ 2
All goals completed! 🐙
_ = ε := a:ℕ → ℚha':∀ (n : ℕ), a n ≠ 0c:ℚhc:c > 0ha:∀ (n : ℕ), |a n| ≥ cε:ℚhε:ε > 0N:ℕn:ℕhn:n ≥ Nm:ℕhm:m ≥ Nha_cauchy:|a n - a m| ≤ c ^ 2 * ε⊢ c ^ 2 * ε / c ^ 2 = ε
All goals completed! 🐙
Лема 5.3.17 (Reciprocation is well-defined)
theorem Real.inv_of_equiv {a b:ℕ → ℚ} (ha: bounded_away_zero a)
(ha_cauchy: (a:Sequence).isCauchy) (hb: bounded_away_zero b)
(hb_cauchy: (b:Sequence).isCauchy) (hlim: LIM a = LIM b) :
LIM a⁻¹ = LIM b⁻¹ := a:ℕ → ℚb:ℕ → ℚha:bounded_away_zero aha_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyhb:bounded_away_zero bhb_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyhlim:LIM a = LIM b⊢ LIM a⁻¹ = LIM b⁻¹
-- цей доказ написан так, щоб співпадати із структурою орігінального тексту.
a:ℕ → ℚb:ℕ → ℚha:bounded_away_zero aha_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyhb:bounded_away_zero bhb_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyhlim:LIM a = LIM bP:Real := LIM a⁻¹ * LIM a * LIM b⁻¹⊢ LIM a⁻¹ = LIM b⁻¹
a:ℕ → ℚb:ℕ → ℚha:bounded_away_zero aha_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyhb:bounded_away_zero bhb_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyhlim:LIM a = LIM bP:Real := LIM a⁻¹ * LIM a * LIM b⁻¹ha':∀ (n : ℕ), a n ≠ 0⊢ LIM a⁻¹ = LIM b⁻¹
a:ℕ → ℚb:ℕ → ℚha:bounded_away_zero aha_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyhb:bounded_away_zero bhb_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyhlim:LIM a = LIM bP:Real := LIM a⁻¹ * LIM a * LIM b⁻¹ha':∀ (n : ℕ), a n ≠ 0hb':∀ (n : ℕ), b n ≠ 0⊢ LIM a⁻¹ = LIM b⁻¹
a:ℕ → ℚb:ℕ → ℚha:bounded_away_zero aha_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyhb:bounded_away_zero bhb_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyhlim:LIM a = LIM bP:Real := LIM a⁻¹ * LIM a * LIM b⁻¹ha':∀ (n : ℕ), a n ≠ 0hb':∀ (n : ℕ), b n ≠ 0hainv_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then a⁻¹ n.toNat else 0, vanish := ⋯ }.isCauchy⊢ LIM a⁻¹ = LIM b⁻¹
a:ℕ → ℚb:ℕ → ℚha:bounded_away_zero aha_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyhb:bounded_away_zero bhb_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyhlim:LIM a = LIM bP:Real := LIM a⁻¹ * LIM a * LIM b⁻¹ha':∀ (n : ℕ), a n ≠ 0hb':∀ (n : ℕ), b n ≠ 0hainv_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then a⁻¹ n.toNat else 0, vanish := ⋯ }.isCauchyhbinv_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then b⁻¹ n.toNat else 0, vanish := ⋯ }.isCauchy⊢ LIM a⁻¹ = LIM b⁻¹
a:ℕ → ℚb:ℕ → ℚha:bounded_away_zero aha_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyhb:bounded_away_zero bhb_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyhlim:LIM a = LIM bP:Real := LIM a⁻¹ * LIM a * LIM b⁻¹ha':∀ (n : ℕ), a n ≠ 0hb':∀ (n : ℕ), b n ≠ 0hainv_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then a⁻¹ n.toNat else 0, vanish := ⋯ }.isCauchyhbinv_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then b⁻¹ n.toNat else 0, vanish := ⋯ }.isCauchyhaainv_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then (a⁻¹ * a) n.toNat else 0, vanish := ⋯ }.isCauchy⊢ LIM a⁻¹ = LIM b⁻¹
a:ℕ → ℚb:ℕ → ℚha:bounded_away_zero aha_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyhb:bounded_away_zero bhb_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyhlim:LIM a = LIM bP:Real := LIM a⁻¹ * LIM a * LIM b⁻¹ha':∀ (n : ℕ), a n ≠ 0hb':∀ (n : ℕ), b n ≠ 0hainv_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then a⁻¹ n.toNat else 0, vanish := ⋯ }.isCauchyhbinv_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then b⁻¹ n.toNat else 0, vanish := ⋯ }.isCauchyhaainv_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then (a⁻¹ * a) n.toNat else 0, vanish := ⋯ }.isCauchyhabinv_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then (a⁻¹ * b) n.toNat else 0, vanish := ⋯ }.isCauchy⊢ LIM a⁻¹ = LIM b⁻¹
have claim1 : P = LIM b⁻¹ := a:ℕ → ℚb:ℕ → ℚha:bounded_away_zero aha_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyhb:bounded_away_zero bhb_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyhlim:LIM a = LIM b⊢ LIM a⁻¹ = LIM b⁻¹
a:ℕ → ℚb:ℕ → ℚha:bounded_away_zero aha_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyhb:bounded_away_zero bhb_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyhlim:LIM a = LIM bP:Real := LIM a⁻¹ * LIM a * LIM b⁻¹ha':∀ (n : ℕ), a n ≠ 0hb':∀ (n : ℕ), b n ≠ 0hainv_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then a⁻¹ n.toNat else 0, vanish := ⋯ }.isCauchyhbinv_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then b⁻¹ n.toNat else 0, vanish := ⋯ }.isCauchyhaainv_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then (a⁻¹ * a) n.toNat else 0, vanish := ⋯ }.isCauchyhabinv_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then (a⁻¹ * b) n.toNat else 0, vanish := ⋯ }.isCauchy⊢ LIM a⁻¹ * LIM a * LIM b⁻¹ = LIM b⁻¹
a:ℕ → ℚb:ℕ → ℚha:bounded_away_zero aha_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyhb:bounded_away_zero bhb_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyhlim:LIM a = LIM bP:Real := LIM a⁻¹ * LIM a * LIM b⁻¹ha':∀ (n : ℕ), a n ≠ 0hb':∀ (n : ℕ), b n ≠ 0hainv_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then a⁻¹ n.toNat else 0, vanish := ⋯ }.isCauchyhbinv_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then b⁻¹ n.toNat else 0, vanish := ⋯ }.isCauchyhaainv_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then (a⁻¹ * a) n.toNat else 0, vanish := ⋯ }.isCauchyhabinv_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then (a⁻¹ * b) n.toNat else 0, vanish := ⋯ }.isCauchy⊢ LIM (a⁻¹ * a * b⁻¹) = LIM b⁻¹
a:ℕ → ℚb:ℕ → ℚha:bounded_away_zero aha_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyhb:bounded_away_zero bhb_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyhlim:LIM a = LIM bP:Real := LIM a⁻¹ * LIM a * LIM b⁻¹ha':∀ (n : ℕ), a n ≠ 0hb':∀ (n : ℕ), b n ≠ 0hainv_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then a⁻¹ n.toNat else 0, vanish := ⋯ }.isCauchyhbinv_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then b⁻¹ n.toNat else 0, vanish := ⋯ }.isCauchyhaainv_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then (a⁻¹ * a) n.toNat else 0, vanish := ⋯ }.isCauchyhabinv_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then (a⁻¹ * b) n.toNat else 0, vanish := ⋯ }.isCauchyn:ℕ⊢ (a⁻¹ * a * b⁻¹) n = b⁻¹ n
All goals completed! 🐙
have claim2 : P = LIM a⁻¹ := a:ℕ → ℚb:ℕ → ℚha:bounded_away_zero aha_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyhb:bounded_away_zero bhb_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyhlim:LIM a = LIM b⊢ LIM a⁻¹ = LIM b⁻¹
a:ℕ → ℚb:ℕ → ℚha:bounded_away_zero aha_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyhb:bounded_away_zero bhb_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyhlim:LIM a = LIM bP:Real := LIM a⁻¹ * LIM a * LIM b⁻¹ha':∀ (n : ℕ), a n ≠ 0hb':∀ (n : ℕ), b n ≠ 0hainv_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then a⁻¹ n.toNat else 0, vanish := ⋯ }.isCauchyhbinv_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then b⁻¹ n.toNat else 0, vanish := ⋯ }.isCauchyhaainv_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then (a⁻¹ * a) n.toNat else 0, vanish := ⋯ }.isCauchyhabinv_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then (a⁻¹ * b) n.toNat else 0, vanish := ⋯ }.isCauchyclaim1:P = LIM b⁻¹⊢ LIM a⁻¹ * LIM a * LIM b⁻¹ = LIM a⁻¹
a:ℕ → ℚb:ℕ → ℚha:bounded_away_zero aha_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyhb:bounded_away_zero bhb_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyhlim:LIM a = LIM bP:Real := LIM a⁻¹ * LIM a * LIM b⁻¹ha':∀ (n : ℕ), a n ≠ 0hb':∀ (n : ℕ), b n ≠ 0hainv_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then a⁻¹ n.toNat else 0, vanish := ⋯ }.isCauchyhbinv_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then b⁻¹ n.toNat else 0, vanish := ⋯ }.isCauchyhaainv_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then (a⁻¹ * a) n.toNat else 0, vanish := ⋯ }.isCauchyhabinv_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then (a⁻¹ * b) n.toNat else 0, vanish := ⋯ }.isCauchyclaim1:P = LIM b⁻¹⊢ LIM (a⁻¹ * b * b⁻¹) = LIM a⁻¹
a:ℕ → ℚb:ℕ → ℚha:bounded_away_zero aha_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyhb:bounded_away_zero bhb_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isCauchyhlim:LIM a = LIM bP:Real := LIM a⁻¹ * LIM a * LIM b⁻¹ha':∀ (n : ℕ), a n ≠ 0hb':∀ (n : ℕ), b n ≠ 0hainv_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then a⁻¹ n.toNat else 0, vanish := ⋯ }.isCauchyhbinv_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then b⁻¹ n.toNat else 0, vanish := ⋯ }.isCauchyhaainv_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then (a⁻¹ * a) n.toNat else 0, vanish := ⋯ }.isCauchyhabinv_cauchy:{ n₀ := 0, seq := fun n => if n ≥ 0 then (a⁻¹ * b) n.toNat else 0, vanish := ⋯ }.isCauchyclaim1:P = LIM b⁻¹n:ℕ⊢ (a⁻¹ * b * b⁻¹) n = a⁻¹ n
All goals completed! 🐙
All goals completed! 🐙
open Classical in
/--
Визначення 5.3.16 (Reciprocation of real numbers). Requires classical logic because we need to
assign a "junk" value to the inverse of 0.
-/
noncomputable instance Real.instInv : Inv Real where
inv x := if h: x ≠ 0 then LIM (bounded_away_zero_of_nonzero h).choose⁻¹ else 0
theorem Real.inv_def {a:ℕ → ℚ} (h: bounded_away_zero a) (hc: (a:Sequence).isCauchy) :
(LIM a)⁻¹ = LIM a⁻¹ := a:ℕ → ℚh:bounded_away_zero ahc:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchy⊢ (LIM a)⁻¹ = LIM a⁻¹
a:ℕ → ℚh:bounded_away_zero ahc:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyx:Real := LIM a⊢ x⁻¹ = LIM a⁻¹
a:ℕ → ℚh:bounded_away_zero ahc:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyx:Real := LIM ahx:x ≠ 0⊢ x⁻¹ = LIM a⁻¹
a:ℕ → ℚh:bounded_away_zero ahc:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyx:Real := LIM ahx:x ≠ 0hb:∃ a, { n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchy ∧ bounded_away_zero a ∧ x = LIM a := bounded_away_zero_of_nonzero hx⊢ x⁻¹ = LIM a⁻¹
a:ℕ → ℚh:bounded_away_zero ahc:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchyx:Real := LIM ahx:x ≠ 0hb:∃ a, { n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isCauchy ∧ bounded_away_zero a ∧ x = LIM a := bounded_away_zero_of_nonzero hx⊢ LIM ⋯.choose⁻¹ = LIM a⁻¹
All goals completed! 🐙
@[simp]
theorem Real.inv_zero : (0:Real)⁻¹ = 0 := ⊢ 0⁻¹ = 0
All goals completed! 🐙
theorem Real.self_mul_inv {x:Real} (hx: x ≠ 0) : x * x⁻¹ = 1 := x:Realhx:x ≠ 0⊢ x * x⁻¹ = 1
All goals completed! 🐙
theorem Real.inv_mul_self {x:Real} (hx: x ≠ 0) : x * x⁻¹ = 1 := x:Realhx:x ≠ 0⊢ x * x⁻¹ = 1
All goals completed! 🐙
theorem Real.inv_of_ratCast (q:ℚ) : (q:Real)⁻¹ = (q⁻¹:ℚ) := q:ℚ⊢ (↑q)⁻¹ = ↑q⁻¹
All goals completed! 🐙
Default definition of division
noncomputable instance Real.instDivInvMonoid : DivInvMonoid Real where
theorem Real.div_eq (x y:Real) : x/y = x * y⁻¹ := x:Realy:Real⊢ x / y = x * y⁻¹ All goals completed! 🐙
noncomputable instance Real.instField : Field Real where
exists_pair_ne := ⊢ ∃ x y, x ≠ y All goals completed! 🐙
mul_inv_cancel := ⊢ ∀ (a : Real), a ≠ 0 → a * a⁻¹ = 1 All goals completed! 🐙
inv_zero := ⊢ 0⁻¹ = 0 All goals completed! 🐙
ratCast_def := ⊢ ∀ (q : ℚ), ↑q = ↑q.num / ↑q.den All goals completed! 🐙
qsmul := _
nnqsmul := _
theorem Real.mul_right_cancel₀ {x y z:Real} (hz: z ≠ 0) (h: x * z = y * z) : x = y := x:Realy:Realz:Realhz:z ≠ 0h:x * z = y * z⊢ x = y All goals completed! 🐙
theorem Real.mul_right_nocancel : ¬ ∀ (x y z:Real), (hz: z = 0) → (x * z = y * z) → x = y := ⊢ ¬∀ (x y z : Real), z = 0 → x * z = y * z → x = y
All goals completed! 🐙
Вправа 5.3.4
theorem Real.equiv_of_bounded {a b:ℕ → ℚ} (ha: (a:Sequence).isBounded) (hab: Sequence.equiv a b) :
(b:Sequence).isBounded := a:ℕ → ℚb:ℕ → ℚha:{ n₀ := 0, seq := fun n => if n ≥ 0 then a n.toNat else 0, vanish := ⋯ }.isBoundedhab:Sequence.equiv a b⊢ { n₀ := 0, seq := fun n => if n ≥ 0 then b n.toNat else 0, vanish := ⋯ }.isBounded All goals completed! 🐙
Вправа 5.3.5
theorem Real.Cauchy_of_harmonic : ((fun n ↦ 1/((n:ℚ)+1): ℕ → ℚ):Sequence).isCauchy := ⊢ { n₀ := 0, seq := fun n => if n ≥ 0 then (fun n => 1 / (↑n + 1)) n.toNat else 0, vanish := ⋯ }.isCauchy All goals completed! 🐙
Вправа 5.3.5
theorem Real.LIM_of_harmonic : LIM (fun n ↦ 1/((n:ℚ)+1)) = 0 := ⊢ (LIM fun n => 1 / (↑n + 1)) = 0 All goals completed! 🐙
end Chapter5