Theorem: ENNReal.tendsto_mul
File: Mathlib/Topology/Instances/ENNReal.lean

tactic: have ht : ∀ b : ℝ≥0∞, b ≠ 0 →
    Tendsto (fun p : ℝ≥0∞ × ℝ≥0∞ => p.1 * p.2) (𝓝 ((⊤ : ℝ≥0∞), b)) (𝓝 ⊤) := fun b hb => by
  refine' tendsto_nhds_top_iff_nnreal.2 fun n => _
  rcases lt_iff_exists_nnreal_btwn.1 (pos_iff_ne_zero.2 hb) with ⟨ε, hε, hεb⟩
  have : ∀ᶠ c : ℝ≥0∞ × ℝ≥0∞ in 𝓝 (∞, b), ↑n / ↑ε < c.1 ∧ ↑ε < c.2 :=
    (lt_mem_nhds <| div_lt_top coe_ne_top hε.ne').prod_nhds (lt_mem_nhds hεb)
  refine' this.mono fun c hc => _
  exact (ENNReal.div_mul_cancel hε.ne' coe_ne_top).symm.trans_lt (mul_lt_mul hc.1 hc.2)
state_before: α : Type ?u.89302
β : Type ?u.89305
γ : Type ?u.89308
a b c d : ℝ≥0∞
r p q : ℝ≥0
x y z ε ε₁ ε₂ : ℝ≥0∞
s : Set ℝ≥0∞
ha : a ≠ 0 ∨ b ≠ ⊤
hb : b ≠ 0 ∨ a ≠ ⊤
⊢ Tendsto (fun p => p.fst * p.snd) (𝓝 (a, b)) (𝓝 (a * b))

tactic: refine' tendsto_nhds_top_iff_nnreal.2 fun n => _
state_before: α : Type ?u.89302
β : Type ?u.89305
γ : Type ?u.89308
a b✝ c d : ℝ≥0∞
r p q : ℝ≥0
x y z ε ε₁ ε₂ : ℝ≥0∞
s : Set ℝ≥0∞
ha : a ≠ 0 ∨ b✝ ≠ ⊤
hb✝ : b✝ ≠ 0 ∨ a ≠ ⊤
b : ℝ≥0∞
hb : b ≠ 0
⊢ Tendsto (fun p => p.fst * p.snd) (𝓝 (⊤, b)) (𝓝 ⊤)

tactic: rcases lt_iff_exists_nnreal_btwn.1 (pos_iff_ne_zero.2 hb) with ⟨ε, hε, hεb⟩
state_before: α : Type ?u.89302
β : Type ?u.89305
γ : Type ?u.89308
a b✝ c d : ℝ≥0∞
r p q : ℝ≥0
x y z ε ε₁ ε₂ : ℝ≥0∞
s : Set ℝ≥0∞
ha : a ≠ 0 ∨ b✝ ≠ ⊤
hb✝ : b✝ ≠ 0 ∨ a ≠ ⊤
b : ℝ≥0∞
hb : b ≠ 0
n : ℝ≥0
⊢ ∀ᶠ (a : ℝ≥0∞ × ℝ≥0∞) in 𝓝 (⊤, b), ↑n < a.fst * a.snd

tactic: have : ∀ᶠ c : ℝ≥0∞ × ℝ≥0∞ in 𝓝 (∞, b), ↑n / ↑ε < c.1 ∧ ↑ε < c.2 :=
  (lt_mem_nhds <| div_lt_top coe_ne_top hε.ne').prod_nhds (lt_mem_nhds hεb)
state_before: case intro.intro
α : Type ?u.89302
β : Type ?u.89305
γ : Type ?u.89308
a b✝ c d : ℝ≥0∞
r p q : ℝ≥0
x y z ε✝ ε₁ ε₂ : ℝ≥0∞
s : Set ℝ≥0∞
ha : a ≠ 0 ∨ b✝ ≠ ⊤
hb✝ : b✝ ≠ 0 ∨ a ≠ ⊤
b : ℝ≥0∞
hb : b ≠ 0
n ε : ℝ≥0
hε : 0 < ↑ε
hεb : ↑ε < b
⊢ ∀ᶠ (a : ℝ≥0∞ × ℝ≥0∞) in 𝓝 (⊤, b), ↑n < a.fst * a.snd

tactic: refine' this.mono fun c hc => _
state_before: case intro.intro
α : Type ?u.89302
β : Type ?u.89305
γ : Type ?u.89308
a b✝ c d : ℝ≥0∞
r p q : ℝ≥0
x y z ε✝ ε₁ ε₂ : ℝ≥0∞
s : Set ℝ≥0∞
ha : a ≠ 0 ∨ b✝ ≠ ⊤
hb✝ : b✝ ≠ 0 ∨ a ≠ ⊤
b : ℝ≥0∞
hb : b ≠ 0
n ε : ℝ≥0
hε : 0 < ↑ε
hεb : ↑ε < b
this : ∀ᶠ (c : ℝ≥0∞ × ℝ≥0∞) in 𝓝 (⊤, b), ↑n / ↑ε < c.fst ∧ ↑ε < c.snd
⊢ ∀ᶠ (a : ℝ≥0∞ × ℝ≥0∞) in 𝓝 (⊤, b), ↑n < a.fst * a.snd

tactic: exact (ENNReal.div_mul_cancel hε.ne' coe_ne_top).symm.trans_lt (mul_lt_mul hc.1 hc.2)
state_before: case intro.intro
α : Type ?u.89302
β : Type ?u.89305
γ : Type ?u.89308
a b✝ c✝ d : ℝ≥0∞
r p q : ℝ≥0
x y z ε✝ ε₁ ε₂ : ℝ≥0∞
s : Set ℝ≥0∞
ha : a ≠ 0 ∨ b✝ ≠ ⊤
hb✝ : b✝ ≠ 0 ∨ a ≠ ⊤
b : ℝ≥0∞
hb : b ≠ 0
n ε : ℝ≥0
hε : 0 < ↑ε
hεb : ↑ε < b
this : ∀ᶠ (c : ℝ≥0∞ × ℝ≥0∞) in 𝓝 (⊤, b), ↑n / ↑ε < c.fst ∧ ↑ε < c.snd
c : ℝ≥0∞ × ℝ≥0∞
hc : ↑n / ↑ε < c.fst ∧ ↑ε < c.snd
⊢ ↑n < c.fst * c.snd

tactic: simp only [ne_eq, or_false] at hb
state_before: case top
α : Type ?u.89302
β : Type ?u.89305
γ : Type ?u.89308
a b c d : ℝ≥0∞
r p q : ℝ≥0
x y z ε ε₁ ε₂ : ℝ≥0∞
s : Set ℝ≥0∞
ht : ∀ (b : ℝ≥0∞), b ≠ 0 → Tendsto (fun p => p.fst * p.snd) (𝓝 (⊤, b)) (𝓝 ⊤)
ha : ⊤ ≠ 0 ∨ b ≠ ⊤
hb : b ≠ 0 ∨ ⊤ ≠ ⊤
⊢ Tendsto (fun p => p.fst * p.snd) (𝓝 (⊤, b)) (𝓝 (⊤ * b))

tactic: simp [ht b hb, top_mul hb]
state_before: case top
α : Type ?u.89302
β : Type ?u.89305
γ : Type ?u.89308
a b c d : ℝ≥0∞
r p q : ℝ≥0
x y z ε ε₁ ε₂ : ℝ≥0∞
s : Set ℝ≥0∞
ht : ∀ (b : ℝ≥0∞), b ≠ 0 → Tendsto (fun p => p.fst * p.snd) (𝓝 (⊤, b)) (𝓝 ⊤)
ha : ⊤ ≠ 0 ∨ b ≠ ⊤
hb : ¬b = 0
⊢ Tendsto (fun p => p.fst * p.snd) (𝓝 (⊤, b)) (𝓝 (⊤ * b))

tactic: simp only [ne_eq, or_false] at ha
state_before: case coe.top
α : Type ?u.89302
β : Type ?u.89305
γ : Type ?u.89308
a✝ b c d : ℝ≥0∞
r p q : ℝ≥0
x y z ε ε₁ ε₂ : ℝ≥0∞
s : Set ℝ≥0∞
ht : ∀ (b : ℝ≥0∞), b ≠ 0 → Tendsto (fun p => p.fst * p.snd) (𝓝 (⊤, b)) (𝓝 ⊤)
a : ℝ≥0
ha : ↑a ≠ 0 ∨ ⊤ ≠ ⊤
hb : ⊤ ≠ 0 ∨ ↑a ≠ ⊤
⊢ Tendsto (fun p => p.fst * p.snd) (𝓝 (↑a, ⊤)) (𝓝 (↑a * ⊤))