Theorem: cauchySeq_iff_le_tendsto_0
File: Mathlib/Topology/MetricSpace/Basic.lean

tactic: let S N := (fun p : ℕ × ℕ => dist (s p.1) (s p.2)) '' { p | p.1 ≥ N ∧ p.2 ≥ N }
state_before: α : Type u
β : Type v
X : Type ?u.230183
ι : Type ?u.230186
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
s : ℕ → α
hs : CauchySeq s
⊢ ∃ b, (∀ (n : ℕ), 0 ≤ b n) ∧ (∀ (n m N : ℕ), N ≤ n → N ≤ m → dist (s n) (s m) ≤ b N) ∧ Tendsto b atTop (𝓝 0)

tactic: have hS : ∀ N, ∃ x, ∀ y ∈ S N, y ≤ x := by
  rcases cauchySeq_bdd hs with ⟨R, -, hR⟩
  refine' fun N => ⟨R, _⟩
  rintro _ ⟨⟨m, n⟩, _, rfl⟩
  exact le_of_lt (hR m n)
state_before: α : Type u
β : Type v
X : Type ?u.230183
ι : Type ?u.230186
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
s : ℕ → α
hs : CauchySeq s
S : ℕ → Set ℝ := fun N => (fun p => dist (s p.fst) (s p.snd)) '' {p | p.fst ≥ N ∧ p.snd ≥ N}
⊢ ∃ b, (∀ (n : ℕ), 0 ≤ b n) ∧ (∀ (n m N : ℕ), N ≤ n → N ≤ m → dist (s n) (s m) ≤ b N) ∧ Tendsto b atTop (𝓝 0)

tactic: have ub : ∀ m n N, N ≤ m → N ≤ n → dist (s m) (s n) ≤ sSup (S N) := fun m n N hm hn =>
  le_csSup (hS N) ⟨⟨_, _⟩, ⟨hm, hn⟩, rfl⟩
state_before: α : Type u
β : Type v
X : Type ?u.230183
ι : Type ?u.230186
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
s : ℕ → α
hs : CauchySeq s
S : ℕ → Set ℝ := fun N => (fun p => dist (s p.fst) (s p.snd)) '' {p | p.fst ≥ N ∧ p.snd ≥ N}
hS : ∀ (N : ℕ), ∃ x, ∀ (y : ℝ), y ∈ S N → y ≤ x
⊢ ∃ b, (∀ (n : ℕ), 0 ≤ b n) ∧ (∀ (n m N : ℕ), N ≤ n → N ≤ m → dist (s n) (s m) ≤ b N) ∧ Tendsto b atTop (𝓝 0)

tactic: have S0m : ∀ n, (0 : ℝ) ∈ S n := fun n => ⟨⟨n, n⟩, ⟨le_rfl, le_rfl⟩, dist_self _⟩
state_before: α : Type u
β : Type v
X : Type ?u.230183
ι : Type ?u.230186
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
s : ℕ → α
hs : CauchySeq s
S : ℕ → Set ℝ := fun N => (fun p => dist (s p.fst) (s p.snd)) '' {p | p.fst ≥ N ∧ p.snd ≥ N}
hS : ∀ (N : ℕ), ∃ x, ∀ (y : ℝ), y ∈ S N → y ≤ x
ub : ∀ (m n N : ℕ), N ≤ m → N ≤ n → dist (s m) (s n) ≤ sSup (S N)
⊢ ∃ b, (∀ (n : ℕ), 0 ≤ b n) ∧ (∀ (n m N : ℕ), N ≤ n → N ≤ m → dist (s n) (s m) ≤ b N) ∧ Tendsto b atTop (𝓝 0)

tactic: have S0 := fun n => le_csSup (hS n) (S0m n)
state_before: α : Type u
β : Type v
X : Type ?u.230183
ι : Type ?u.230186
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
s : ℕ → α
hs : CauchySeq s
S : ℕ → Set ℝ := fun N => (fun p => dist (s p.fst) (s p.snd)) '' {p | p.fst ≥ N ∧ p.snd ≥ N}
hS : ∀ (N : ℕ), ∃ x, ∀ (y : ℝ), y ∈ S N → y ≤ x
ub : ∀ (m n N : ℕ), N ≤ m → N ≤ n → dist (s m) (s n) ≤ sSup (S N)
S0m : ∀ (n : ℕ), 0 ∈ S n
⊢ ∃ b, (∀ (n : ℕ), 0 ≤ b n) ∧ (∀ (n m N : ℕ), N ≤ n → N ≤ m → dist (s n) (s m) ≤ b N) ∧ Tendsto b atTop (𝓝 0)

tactic: refine' ⟨fun N => sSup (S N), S0, ub, Metric.tendsto_atTop.2 fun ε ε0 => _⟩
state_before: α : Type u
β : Type v
X : Type ?u.230183
ι : Type ?u.230186
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
s : ℕ → α
hs : CauchySeq s
S : ℕ → Set ℝ := fun N => (fun p => dist (s p.fst) (s p.snd)) '' {p | p.fst ≥ N ∧ p.snd ≥ N}
hS : ∀ (N : ℕ), ∃ x, ∀ (y : ℝ), y ∈ S N → y ≤ x
ub : ∀ (m n N : ℕ), N ≤ m → N ≤ n → dist (s m) (s n) ≤ sSup (S N)
S0m : ∀ (n : ℕ), 0 ∈ S n
S0 : ∀ (n : ℕ), 0 ≤ sSup (S n)
⊢ ∃ b, (∀ (n : ℕ), 0 ≤ b n) ∧ (∀ (n m N : ℕ), N ≤ n → N ≤ m → dist (s n) (s m) ≤ b N) ∧ Tendsto b atTop (𝓝 0)

tactic: refine' (Metric.cauchySeq_iff.1 hs (ε / 2) (half_pos ε0)).imp fun N hN n hn => _
state_before: α : Type u
β : Type v
X : Type ?u.230183
ι : Type ?u.230186
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
s : ℕ → α
hs : CauchySeq s
S : ℕ → Set ℝ := fun N => (fun p => dist (s p.fst) (s p.snd)) '' {p | p.fst ≥ N ∧ p.snd ≥ N}
hS : ∀ (N : ℕ), ∃ x, ∀ (y : ℝ), y ∈ S N → y ≤ x
ub : ∀ (m n N : ℕ), N ≤ m → N ≤ n → dist (s m) (s n) ≤ sSup (S N)
S0m : ∀ (n : ℕ), 0 ∈ S n
S0 : ∀ (n : ℕ), 0 ≤ sSup (S n)
ε : ℝ
ε0 : ε > 0
⊢ ∃ N, ∀ (n : ℕ), n ≥ N → dist (sSup (S n)) 0 < ε

tactic: rw [Real.dist_0_eq_abs, abs_of_nonneg (S0 n)]
state_before: α : Type u
β : Type v
X : Type ?u.230183
ι : Type ?u.230186
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
s : ℕ → α
hs : CauchySeq s
S : ℕ → Set ℝ := fun N => (fun p => dist (s p.fst) (s p.snd)) '' {p | p.fst ≥ N ∧ p.snd ≥ N}
hS : ∀ (N : ℕ), ∃ x, ∀ (y : ℝ), y ∈ S N → y ≤ x
ub : ∀ (m n N : ℕ), N ≤ m → N ≤ n → dist (s m) (s n) ≤ sSup (S N)
S0m : ∀ (n : ℕ), 0 ∈ S n
S0 : ∀ (n : ℕ), 0 ≤ sSup (S n)
ε : ℝ
ε0 : ε > 0
N : ℕ
hN : ∀ (m : ℕ), m ≥ N → ∀ (n : ℕ), n ≥ N → dist (s m) (s n) < ε / 2
n : ℕ
hn : n ≥ N
⊢ dist (sSup (S n)) 0 < ε

tactic: refine' lt_of_le_of_lt (csSup_le ⟨_, S0m _⟩ _) (half_lt_self ε0)
state_before: α : Type u
β : Type v
X : Type ?u.230183
ι : Type ?u.230186
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
s : ℕ → α
hs : CauchySeq s
S : ℕ → Set ℝ := fun N => (fun p => dist (s p.fst) (s p.snd)) '' {p | p.fst ≥ N ∧ p.snd ≥ N}
hS : ∀ (N : ℕ), ∃ x, ∀ (y : ℝ), y ∈ S N → y ≤ x
ub : ∀ (m n N : ℕ), N ≤ m → N ≤ n → dist (s m) (s n) ≤ sSup (S N)
S0m : ∀ (n : ℕ), 0 ∈ S n
S0 : ∀ (n : ℕ), 0 ≤ sSup (S n)
ε : ℝ
ε0 : ε > 0
N : ℕ
hN : ∀ (m : ℕ), m ≥ N → ∀ (n : ℕ), n ≥ N → dist (s m) (s n) < ε / 2
n : ℕ
hn : n ≥ N
⊢ sSup (S n) < ε

tactic: rintro _ ⟨⟨m', n'⟩, ⟨hm', hn'⟩, rfl⟩
state_before: α : Type u
β : Type v
X : Type ?u.230183
ι : Type ?u.230186
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
s : ℕ → α
hs : CauchySeq s
S : ℕ → Set ℝ := fun N => (fun p => dist (s p.fst) (s p.snd)) '' {p | p.fst ≥ N ∧ p.snd ≥ N}
hS : ∀ (N : ℕ), ∃ x, ∀ (y : ℝ), y ∈ S N → y ≤ x
ub : ∀ (m n N : ℕ), N ≤ m → N ≤ n → dist (s m) (s n) ≤ sSup (S N)
S0m : ∀ (n : ℕ), 0 ∈ S n
S0 : ∀ (n : ℕ), 0 ≤ sSup (S n)
ε : ℝ
ε0 : ε > 0
N : ℕ
hN : ∀ (m : ℕ), m ≥ N → ∀ (n : ℕ), n ≥ N → dist (s m) (s n) < ε / 2
n : ℕ
hn : n ≥ N
⊢ ∀ (b : ℝ), b ∈ S n → b ≤ ε / 2

tactic: exact le_of_lt (hN _ (le_trans hn hm') _ (le_trans hn hn'))
state_before: case intro.mk.intro.intro
α : Type u
β : Type v
X : Type ?u.230183
ι : Type ?u.230186
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
s : ℕ → α
hs : CauchySeq s
S : ℕ → Set ℝ := fun N => (fun p => dist (s p.fst) (s p.snd)) '' {p | p.fst ≥ N ∧ p.snd ≥ N}
hS : ∀ (N : ℕ), ∃ x, ∀ (y : ℝ), y ∈ S N → y ≤ x
ub : ∀ (m n N : ℕ), N ≤ m → N ≤ n → dist (s m) (s n) ≤ sSup (S N)
S0m : ∀ (n : ℕ), 0 ∈ S n
S0 : ∀ (n : ℕ), 0 ≤ sSup (S n)
ε : ℝ
ε0 : ε > 0
N : ℕ
hN : ∀ (m : ℕ), m ≥ N → ∀ (n : ℕ), n ≥ N → dist (s m) (s n) < ε / 2
n : ℕ
hn : n ≥ N
m' n' : ℕ
hm' : (m', n').fst ≥ n
hn' : (m', n').snd ≥ n
⊢ (fun p => dist (s p.fst) (s p.snd)) (m', n') ≤ ε / 2

tactic: rcases cauchySeq_bdd hs with ⟨R, -, hR⟩
state_before: α : Type u
β : Type v
X : Type ?u.230183
ι : Type ?u.230186
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
s : ℕ → α
hs : CauchySeq s
S : ℕ → Set ℝ := fun N => (fun p => dist (s p.fst) (s p.snd)) '' {p | p.fst ≥ N ∧ p.snd ≥ N}
⊢ ∀ (N : ℕ), ∃ x, ∀ (y : ℝ), y ∈ S N → y ≤ x

tactic: refine' fun N => ⟨R, _⟩
state_before: case intro.intro
α : Type u
β : Type v
X : Type ?u.230183
ι : Type ?u.230186
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
s : ℕ → α
hs : CauchySeq s
S : ℕ → Set ℝ := fun N => (fun p => dist (s p.fst) (s p.snd)) '' {p | p.fst ≥ N ∧ p.snd ≥ N}
R : ℝ
hR : ∀ (m n : ℕ), dist (s m) (s n) < R
⊢ ∀ (N : ℕ), ∃ x, ∀ (y : ℝ), y ∈ S N → y ≤ x

tactic: rintro _ ⟨⟨m, n⟩, _, rfl⟩
state_before: case intro.intro
α : Type u
β : Type v
X : Type ?u.230183
ι : Type ?u.230186
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
s : ℕ → α
hs : CauchySeq s
S : ℕ → Set ℝ := fun N => (fun p => dist (s p.fst) (s p.snd)) '' {p | p.fst ≥ N ∧ p.snd ≥ N}
R : ℝ
hR : ∀ (m n : ℕ), dist (s m) (s n) < R
N : ℕ
⊢ ∀ (y : ℝ), y ∈ S N → y ≤ R

tactic: exact le_of_lt (hR m n)
state_before: case intro.intro.intro.mk.intro
α : Type u
β : Type v
X : Type ?u.230183
ι : Type ?u.230186
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
s : ℕ → α
hs : CauchySeq s
S : ℕ → Set ℝ := fun N => (fun p => dist (s p.fst) (s p.snd)) '' {p | p.fst ≥ N ∧ p.snd ≥ N}
R : ℝ
hR : ∀ (m n : ℕ), dist (s m) (s n) < R
N m n : ℕ
left✝ : (m, n) ∈ {p | p.fst ≥ N ∧ p.snd ≥ N}
⊢ (fun p => dist (s p.fst) (s p.snd)) (m, n) ≤ R