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) (𝓝 (∞, 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_1
β : Type u_2
γ : Type u_3
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.1 * p.2) (𝓝 (a, b)) (𝓝 (a * b))
state_after: α : Type u_1
β : Type u_2
γ : Type u_3
a b c d : ℝ≥0∞
r p q : ℝ≥0
x y z ε ε₁ ε₂ : ℝ≥0∞
s : Set ℝ≥0∞
ha : a ≠ 0 ∨ b ≠ ⊤
hb : b ≠ 0 ∨ a ≠ ⊤
ht : ∀ (b : ℝ≥0∞), b ≠ 0 → Tendsto (fun p => p.1 * p.2) (𝓝 (⊤, b)) (𝓝 ⊤)
⊢ Tendsto (fun p => p.1 * p.2) (𝓝 (a, b)) (𝓝 (a * b))

tactic: refine tendsto_nhds_top_iff_nnreal.2 fun n => ?_
state_before: α : Type u_1
β : Type u_2
γ : Type u_3
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.1 * p.2) (𝓝 (⊤, b)) (𝓝 ⊤)
state_after: α : Type u_1
β : Type u_2
γ : Type u_3
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.1 * a.2

tactic: rcases lt_iff_exists_nnreal_btwn.1 (pos_iff_ne_zero.2 hb) with ⟨ε, hε, hεb⟩
state_before: α : Type u_1
β : Type u_2
γ : Type u_3
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.1 * a.2
state_after: case intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
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.1 * a.2

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_1
β : Type u_2
γ : Type u_3
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.1 * a.2
state_after: case intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
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.1 ∧ ↑ε < c.2
⊢ ∀ᶠ (a : ℝ≥0∞ × ℝ≥0∞) in 𝓝 (⊤, b), ↑n < a.1 * a.2

tactic: refine this.mono fun c hc => ?_
state_before: case intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
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.1 ∧ ↑ε < c.2
⊢ ∀ᶠ (a : ℝ≥0∞ × ℝ≥0∞) in 𝓝 (⊤, b), ↑n < a.1 * a.2
state_after: case intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
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.1 ∧ ↑ε < c.2
c : ℝ≥0∞ × ℝ≥0∞
hc : ↑n / ↑ε < c.1 ∧ ↑ε < c.2
⊢ ↑n < c.1 * c.2

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_1
β : Type u_2
γ : Type u_3
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.1 ∧ ↑ε < c.2
c : ℝ≥0∞ × ℝ≥0∞
hc : ↑n / ↑ε < c.1 ∧ ↑ε < c.2
⊢ ↑n < c.1 * c.2
state_after: no goals

tactic: simp only [ne_eq, or_false, not_true_eq_false] at hb
state_before: case top
α : Type u_1
β : Type u_2
γ : Type u_3
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.1 * p.2) (𝓝 (⊤, b)) (𝓝 ⊤)
ha : ⊤ ≠ 0 ∨ b ≠ ⊤
hb : b ≠ 0 ∨ ⊤ ≠ ⊤
⊢ Tendsto (fun p => p.1 * p.2) (𝓝 (⊤, b)) (𝓝 (⊤ * b))
state_after: case top
α : Type u_1
β : Type u_2
γ : Type u_3
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.1 * p.2) (𝓝 (⊤, b)) (𝓝 ⊤)
ha : ⊤ ≠ 0 ∨ b ≠ ⊤
hb : ¬b = 0
⊢ Tendsto (fun p => p.1 * p.2) (𝓝 (⊤, b)) (𝓝 (⊤ * b))

tactic: simp [ht b hb, top_mul hb]
state_before: case top
α : Type u_1
β : Type u_2
γ : Type u_3
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.1 * p.2) (𝓝 (⊤, b)) (𝓝 ⊤)
ha : ⊤ ≠ 0 ∨ b ≠ ⊤
hb : ¬b = 0
⊢ Tendsto (fun p => p.1 * p.2) (𝓝 (⊤, b)) (𝓝 (⊤ * b))
state_after: no goals

tactic: simp only [ne_eq, or_false, not_true_eq_false] at ha
state_before: case coe.top
α : Type u_1
β : Type u_2
γ : Type u_3
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.1 * p.2) (𝓝 (⊤, b)) (𝓝 ⊤)
a : ℝ≥0
ha : ↑a ≠ 0 ∨ ⊤ ≠ ⊤
hb : ⊤ ≠ 0 ∨ ↑a ≠ ⊤
⊢ Tendsto (fun p => p.1 * p.2) (𝓝 (↑a, ⊤)) (𝓝 (↑a * ⊤))
state_after: case coe.top
α : Type u_1
β : Type u_2
γ : Type u_3
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.1 * p.2) (𝓝 (⊤, b)) (𝓝 ⊤)
a : ℝ≥0
hb : ⊤ ≠ 0 ∨ ↑a ≠ ⊤
ha : ¬↑a = 0
⊢ Tendsto (fun p => p.1 * p.2) (𝓝 (↑a, ⊤)) (𝓝 (↑a * ⊤))