-- Mathlib/Analysis/Calculus/TangentCone.lean
theorem tangentConeAt.lim_zero {α : Type*} (l : Filter α) {c : α → 𝕜} {d : α → E}
    (hc : Tendsto (fun n => ‖c n‖) l atTop) (hd : Tendsto (fun n => c n • d n) l (𝓝 y)) :
    Tendsto d l (𝓝 0)

Proof state:
𝕜 : Type u_1
inst✝² : NontriviallyNormedField 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
y : E
α : Type u_5
l : Filter α
c : α → 𝕜
d : α → E
hc : Tendsto (fun n => ‖c n‖) l atTop
hd : Tendsto (fun n => c n • d n) l (𝓝 y)
A : Tendsto (fun n => ‖c n‖⁻¹) l (𝓝 0)
B : Tendsto (fun n => ‖c n • d n‖) l (𝓝 ‖y‖)
⊢ Tendsto d l (𝓝 0)

Tactic:
have C : Tendsto (fun n => ‖c n‖⁻¹ * ‖c n • d n‖) l (𝓝 (0 * ‖y‖)) := A.mul B

Result:
𝕜 : Type u_1
inst✝² : NontriviallyNormedField 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
y : E
α : Type u_5
l : Filter α
c : α → 𝕜
d : α → E
hc : Tendsto (fun n => ‖c n‖) l atTop
hd : Tendsto (fun n => c n • d n) l (𝓝 y)
A : Tendsto (fun n => ‖c n‖⁻¹) l (𝓝 0)
B : Tendsto (fun n => ‖c n • d n‖) l (𝓝 ‖y‖)
C : Tendsto (fun n => ‖c n‖⁻¹ * ‖c n • d n‖) l (𝓝 (0 * ‖y‖))
⊢ Tendsto d l (𝓝 0)

Proof state:
𝕜 : Type u_1
inst✝² : NontriviallyNormedField 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
y : E
α : Type u_5
l : Filter α
c : α → 𝕜
d : α → E
hc : Tendsto (fun n => ‖c n‖) l atTop
hd : Tendsto (fun n => c n • d n) l (𝓝 y)
A : Tendsto (fun n => ‖c n‖⁻¹) l (𝓝 0)
B : Tendsto (fun n => ‖c n • d n‖) l (𝓝 ‖y‖)
C : Tendsto (fun n => ‖c n‖⁻¹ * ‖c n • d n‖) l (𝓝 0)
⊢ Tendsto d l (𝓝 0)

Tactic:
have : ∀ᶠ n in l, ‖c n‖⁻¹ * ‖c n • d n‖ = ‖d n‖ := by
  refine (eventually_ne_of_tendsto_norm_atTop hc 0).mono fun n hn => ?_
  rw [norm_smul, ← mul_assoc, inv_mul_cancel₀, one_mul]
  rwa [Ne, norm_eq_zero]

Result:
𝕜 : Type u_1
inst✝² : NontriviallyNormedField 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
y : E
α : Type u_5
l : Filter α
c : α → 𝕜
d : α → E
hc : Tendsto (fun n => ‖c n‖) l atTop
hd : Tendsto (fun n => c n • d n) l (𝓝 y)
A : Tendsto (fun n => ‖c n‖⁻¹) l (𝓝 0)
B : Tendsto (fun n => ‖c n • d n‖) l (𝓝 ‖y‖)
C : Tendsto (fun n => ‖c n‖⁻¹ * ‖c n • d n‖) l (𝓝 0)
this : ∀ᶠ (n : α) in l, ‖c n‖⁻¹ * ‖c n • d n‖ = ‖d n‖
⊢ Tendsto d l (𝓝 0)

Proof state:
𝕜 : Type u_1
inst✝² : NontriviallyNormedField 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
y : E
α : Type u_5
l : Filter α
c : α → 𝕜
d : α → E
hc : Tendsto (fun n => ‖c n‖) l atTop
hd : Tendsto (fun n => c n • d n) l (𝓝 y)
A : Tendsto (fun n => ‖c n‖⁻¹) l (𝓝 0)
B : Tendsto (fun n => ‖c n • d n‖) l (𝓝 ‖y‖)
C : Tendsto (fun n => ‖c n‖⁻¹ * ‖c n • d n‖) l (𝓝 0)
this : ∀ᶠ (n : α) in l, ‖c n‖⁻¹ * ‖c n • d n‖ = ‖d n‖
⊢ Tendsto d l (𝓝 0)

Tactic:
have D : Tendsto (fun n => ‖d n‖) l (𝓝 0) := Tendsto.congr' this C

Result:
𝕜 : Type u_1
inst✝² : NontriviallyNormedField 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
y : E
α : Type u_5
l : Filter α
c : α → 𝕜
d : α → E
hc : Tendsto (fun n => ‖c n‖) l atTop
hd : Tendsto (fun n => c n • d n) l (𝓝 y)
A : Tendsto (fun n => ‖c n‖⁻¹) l (𝓝 0)
B : Tendsto (fun n => ‖c n • d n‖) l (𝓝 ‖y‖)
C : Tendsto (fun n => ‖c n‖⁻¹ * ‖c n • d n‖) l (𝓝 0)
this : ∀ᶠ (n : α) in l, ‖c n‖⁻¹ * ‖c n • d n‖ = ‖d n‖
D : Tendsto (fun n => ‖d n‖) l (𝓝 0)
⊢ Tendsto d l (𝓝 0)

Proof state:
𝕜 : Type u_1
inst✝² : NontriviallyNormedField 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
y : E
α : Type u_5
l : Filter α
c : α → 𝕜
d : α → E
hc : Tendsto (fun n => ‖c n‖) l atTop
hd : Tendsto (fun n => c n • d n) l (𝓝 y)
A : Tendsto (fun n => ‖c n‖⁻¹) l (𝓝 0)
B : Tendsto (fun n => ‖c n • d n‖) l (𝓝 ‖y‖)
C : Tendsto (fun n => ‖c n‖⁻¹ * ‖c n • d n‖) l (𝓝 0)
⊢ ∀ᶠ (n : α) in l, ‖c n‖⁻¹ * ‖c n • d n‖ = ‖d n‖

Tactic:
refine (eventually_ne_of_tendsto_norm_atTop hc 0).mono fun n hn => ?_

Result:
𝕜 : Type u_1
inst✝² : NontriviallyNormedField 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
y : E
α : Type u_5
l : Filter α
c : α → 𝕜
d : α → E
hc : Tendsto (fun n => ‖c n‖) l atTop
hd : Tendsto (fun n => c n • d n) l (𝓝 y)
A : Tendsto (fun n => ‖c n‖⁻¹) l (𝓝 0)
B : Tendsto (fun n => ‖c n • d n‖) l (𝓝 ‖y‖)
C : Tendsto (fun n => ‖c n‖⁻¹ * ‖c n • d n‖) l (𝓝 0)
n : α
hn : c n ≠ 0
⊢ ‖c n‖⁻¹ * ‖c n • d n‖ = ‖d n‖

Proof state:
𝕜 : Type u_1
inst✝² : NontriviallyNormedField 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
y : E
α : Type u_5
l : Filter α
c : α → 𝕜
d : α → E
hc : Tendsto (fun n => ‖c n‖) l atTop
hd : Tendsto (fun n => c n • d n) l (𝓝 y)
A : Tendsto (fun n => ‖c n‖⁻¹) l (𝓝 0)
B : Tendsto (fun n => ‖c n • d n‖) l (𝓝 ‖y‖)
C : Tendsto (fun n => ‖c n‖⁻¹ * ‖c n • d n‖) l (𝓝 (0 * ‖y‖))
⊢ Tendsto d l (𝓝 0)

Tactic:
rw [zero_mul] at C

Result:
𝕜 : Type u_1
inst✝² : NontriviallyNormedField 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
y : E
α : Type u_5
l : Filter α
c : α → 𝕜
d : α → E
hc : Tendsto (fun n => ‖c n‖) l atTop
hd : Tendsto (fun n => c n • d n) l (𝓝 y)
A : Tendsto (fun n => ‖c n‖⁻¹) l (𝓝 0)
B : Tendsto (fun n => ‖c n • d n‖) l (𝓝 ‖y‖)
C : Tendsto (fun n => ‖c n‖⁻¹ * ‖c n • d n‖) l (𝓝 0)
⊢ Tendsto d l (𝓝 0)

Proof state:
𝕜 : Type u_1
inst✝² : NontriviallyNormedField 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
y : E
α : Type u_5
l : Filter α
c : α → 𝕜
d : α → E
hc : Tendsto (fun n => ‖c n‖) l atTop
hd : Tendsto (fun n => c n • d n) l (𝓝 y)
A : Tendsto (fun n => ‖c n‖⁻¹) l (𝓝 0)
B : Tendsto (fun n => ‖c n • d n‖) l (𝓝 ‖y‖)
C : Tendsto (fun n => ‖c n‖⁻¹ * ‖c n • d n‖) l (𝓝 0)
n : α
hn : c n ≠ 0
⊢ ‖c n‖⁻¹ * ‖c n • d n‖ = ‖d n‖

Tactic:
rw [norm_smul, ← mul_assoc, inv_mul_cancel₀, one_mul]

Result:
𝕜 : Type u_1
inst✝² : NontriviallyNormedField 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
y : E
α : Type u_5
l : Filter α
c : α → 𝕜
d : α → E
hc : Tendsto (fun n => ‖c n‖) l atTop
hd : Tendsto (fun n => c n • d n) l (𝓝 y)
A : Tendsto (fun n => ‖c n‖⁻¹) l (𝓝 0)
B : Tendsto (fun n => ‖c n • d n‖) l (𝓝 ‖y‖)
C : Tendsto (fun n => ‖c n‖⁻¹ * ‖c n • d n‖) l (𝓝 0)
n : α
hn : c n ≠ 0
⊢ ‖c n‖ ≠ 0

Proof state:
𝕜 : Type u_1
inst✝² : NontriviallyNormedField 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
y : E
α : Type u_5
l : Filter α
c : α → 𝕜
d : α → E
hc : Tendsto (fun n => ‖c n‖) l atTop
hd : Tendsto (fun n => c n • d n) l (𝓝 y)
A : Tendsto (fun n => ‖c n‖⁻¹) l (𝓝 0)
B : Tendsto (fun n => ‖c n • d n‖) l (𝓝 ‖y‖)
C : Tendsto (fun n => ‖c n‖⁻¹ * ‖c n • d n‖) l (𝓝 0)
n : α
hn : c n ≠ 0
⊢ ‖c n‖ ≠ 0

Tactic:
rwa [Ne, norm_eq_zero]

Result:
no goals

Proof state:
𝕜 : Type u_1
inst✝² : NontriviallyNormedField 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
y : E
α : Type u_5
l : Filter α
c : α → 𝕜
d : α → E
hc : Tendsto (fun n => ‖c n‖) l atTop
hd : Tendsto (fun n => c n • d n) l (𝓝 y)
⊢ Tendsto d l (𝓝 0)

Tactic:
have A : Tendsto (fun n => ‖c n‖⁻¹) l (𝓝 0) := tendsto_inv_atTop_zero.comp hc

Result:
𝕜 : Type u_1
inst✝² : NontriviallyNormedField 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
y : E
α : Type u_5
l : Filter α
c : α → 𝕜
d : α → E
hc : Tendsto (fun n => ‖c n‖) l atTop
hd : Tendsto (fun n => c n • d n) l (𝓝 y)
A : Tendsto (fun n => ‖c n‖⁻¹) l (𝓝 0)
⊢ Tendsto d l (𝓝 0)

Proof state:
𝕜 : Type u_1
inst✝² : NontriviallyNormedField 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
y : E
α : Type u_5
l : Filter α
c : α → 𝕜
d : α → E
hc : Tendsto (fun n => ‖c n‖) l atTop
hd : Tendsto (fun n => c n • d n) l (𝓝 y)
A : Tendsto (fun n => ‖c n‖⁻¹) l (𝓝 0)
⊢ Tendsto d l (𝓝 0)

Tactic:
have B : Tendsto (fun n => ‖c n • d n‖) l (𝓝 ‖y‖) := (continuous_norm.tendsto _).comp hd

Result:
𝕜 : Type u_1
inst✝² : NontriviallyNormedField 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
y : E
α : Type u_5
l : Filter α
c : α → 𝕜
d : α → E
hc : Tendsto (fun n => ‖c n‖) l atTop
hd : Tendsto (fun n => c n • d n) l (𝓝 y)
A : Tendsto (fun n => ‖c n‖⁻¹) l (𝓝 0)
B : Tendsto (fun n => ‖c n • d n‖) l (𝓝 ‖y‖)
⊢ Tendsto d l (𝓝 0)