-- Mathlib/Analysis/Normed/Group/Continuity.lean
theorem controlled_prod_of_mem_closure {s : Subgroup E} (hg : a ∈ closure (s : Set E)) {b : ℕ → ℝ}
    (b_pos : ∀ n, 0 < b n) :
    ∃ v : ℕ → E,
      Tendsto (fun n => ∏ i ∈ range (n + 1), v i) atTop (𝓝 a) ∧
        (∀ n, v n ∈ s) ∧ ‖v 0 / a‖ < b 0 ∧ ∀ n, 0 < n → ‖v n‖ < b n

Proof state:
case intro.intro.intro.intro.intro.refine_1.zero
E : Type u_5
inst✝ : SeminormedCommGroup E
a : E
s : Subgroup E
hg : a ∈ closure ↑s
b : ℕ → ℝ
b_pos : ∀ (n : ℕ), 0 < b n
u : ℕ → E
u_in : ∀ (n : ℕ), u n ∈ s
lim_u : Tendsto u atTop (𝓝 a)
n₀ : ℕ
hn₀ : ∀ n ≥ n₀, ‖u n / a‖ < b 0
z : ℕ → E := fun n => u (n + n₀)
lim_z : Tendsto z atTop (𝓝 a)
mem_𝓤 : ∀ (n : ℕ), {p | ‖p.1 / p.2‖ < b (n + 1)} ∈ 𝓤 E
φ : ℕ → ℕ
φ_extr : StrictMono φ
hφ : ∀ (n : ℕ), ‖z (φ (n + 1)) / z (φ n)‖ < b (n + 1)
w : ℕ → E := z ∘ φ
hw : Tendsto w atTop (𝓝 a)
v : ℕ → E := fun i => if i = 0 then w 0 else w i / w (i - 1)
⊢ v 0 ∈ s

Tactic:
change w 0 ∈ s

Result:
case intro.intro.intro.intro.intro.refine_1.zero
E : Type u_5
inst✝ : SeminormedCommGroup E
a : E
s : Subgroup E
hg : a ∈ closure ↑s
b : ℕ → ℝ
b_pos : ∀ (n : ℕ), 0 < b n
u : ℕ → E
u_in : ∀ (n : ℕ), u n ∈ s
lim_u : Tendsto u atTop (𝓝 a)
n₀ : ℕ
hn₀ : ∀ n ≥ n₀, ‖u n / a‖ < b 0
z : ℕ → E := fun n => u (n + n₀)
lim_z : Tendsto z atTop (𝓝 a)
mem_𝓤 : ∀ (n : ℕ), {p | ‖p.1 / p.2‖ < b (n + 1)} ∈ 𝓤 E
φ : ℕ → ℕ
φ_extr : StrictMono φ
hφ : ∀ (n : ℕ), ‖z (φ (n + 1)) / z (φ n)‖ < b (n + 1)
w : ℕ → E := z ∘ φ
hw : Tendsto w atTop (𝓝 a)
v : ℕ → E := fun i => if i = 0 then w 0 else w i / w (i - 1)
⊢ w 0 ∈ s

Proof state:
case intro.intro.intro.intro.intro.refine_1.succ
E : Type u_5
inst✝ : SeminormedCommGroup E
a : E
s : Subgroup E
hg : a ∈ closure ↑s
b : ℕ → ℝ
b_pos : ∀ (n : ℕ), 0 < b n
u : ℕ → E
u_in : ∀ (n : ℕ), u n ∈ s
lim_u : Tendsto u atTop (𝓝 a)
n₀ : ℕ
hn₀ : ∀ n ≥ n₀, ‖u n / a‖ < b 0
z : ℕ → E := fun n => u (n + n₀)
lim_z : Tendsto z atTop (𝓝 a)
mem_𝓤 : ∀ (n : ℕ), {p | ‖p.1 / p.2‖ < b (n + 1)} ∈ 𝓤 E
φ : ℕ → ℕ
φ_extr : StrictMono φ
hφ : ∀ (n : ℕ), ‖z (φ (n + 1)) / z (φ n)‖ < b (n + 1)
w : ℕ → E := z ∘ φ
hw : Tendsto w atTop (𝓝 a)
v : ℕ → E := fun i => if i = 0 then w 0 else w i / w (i - 1)
n✝ : ℕ
⊢ v (n✝ + 1) ∈ s

Tactic:
apply s.div_mem <;> apply u_in

Result:
no goals

Proof state:
E : Type u_5
inst✝ : SeminormedCommGroup E
a : E
s : Subgroup E
hg : a ∈ closure ↑s
b : ℕ → ℝ
b_pos : ∀ (n : ℕ), 0 < b n
u : ℕ → E
u_in : ∀ (n : ℕ), u n ∈ s
lim_u : Tendsto u atTop (𝓝 a)
⊢ {x | dist x a < b 0} ∈ 𝓝 a

Tactic:
exact Metric.ball_mem_nhds _ (b_pos _)

Result:
no goals

Proof state:
case intro.intro.intro.intro.intro
E : Type u_5
inst✝ : SeminormedCommGroup E
a : E
s : Subgroup E
hg : a ∈ closure ↑s
b : ℕ → ℝ
b_pos : ∀ (n : ℕ), 0 < b n
u : ℕ → E
u_in : ∀ (n : ℕ), u n ∈ s
lim_u : Tendsto u atTop (𝓝 a)
n₀ : ℕ
hn₀ : ∀ n ≥ n₀, ‖u n / a‖ < b 0
z : ℕ → E := fun n => u (n + n₀)
lim_z : Tendsto z atTop (𝓝 a)
mem_𝓤 : ∀ (n : ℕ), {p | ‖p.1 / p.2‖ < b (n + 1)} ∈ 𝓤 E
φ : ℕ → ℕ
φ_extr : StrictMono φ
hφ : ∀ (n : ℕ), ‖z (φ (n + 1)) / z (φ n)‖ < b (n + 1)
w : ℕ → E := z ∘ φ
hw : Tendsto w atTop (𝓝 a)
⊢ ∃ v,
    Tendsto (fun n => ∏ i ∈ range (n + 1), v i) atTop (𝓝 a) ∧
      (∀ (n : ℕ), v n ∈ s) ∧ ‖v 0 / a‖ < b 0 ∧ ∀ (n : ℕ), 0 < n → ‖v n‖ < b n

Tactic:
set v : ℕ → E := fun i => if i = 0 then w 0 else w i / w (i - 1)

Result:
case intro.intro.intro.intro.intro
E : Type u_5
inst✝ : SeminormedCommGroup E
a : E
s : Subgroup E
hg : a ∈ closure ↑s
b : ℕ → ℝ
b_pos : ∀ (n : ℕ), 0 < b n
u : ℕ → E
u_in : ∀ (n : ℕ), u n ∈ s
lim_u : Tendsto u atTop (𝓝 a)
n₀ : ℕ
hn₀ : ∀ n ≥ n₀, ‖u n / a‖ < b 0
z : ℕ → E := fun n => u (n + n₀)
lim_z : Tendsto z atTop (𝓝 a)
mem_𝓤 : ∀ (n : ℕ), {p | ‖p.1 / p.2‖ < b (n + 1)} ∈ 𝓤 E
φ : ℕ → ℕ
φ_extr : StrictMono φ
hφ : ∀ (n : ℕ), ‖z (φ (n + 1)) / z (φ n)‖ < b (n + 1)
w : ℕ → E := z ∘ φ
hw : Tendsto w atTop (𝓝 a)
v : ℕ → E := fun i => if i = 0 then w 0 else w i / w (i - 1)
⊢ ∃ v,
    Tendsto (fun n => ∏ i ∈ range (n + 1), v i) atTop (𝓝 a) ∧
      (∀ (n : ℕ), v n ∈ s) ∧ ‖v 0 / a‖ < b 0 ∧ ∀ (n : ℕ), 0 < n → ‖v n‖ < b n

Proof state:
case intro.intro.intro.intro.intro.refine_1
E : Type u_5
inst✝ : SeminormedCommGroup E
a : E
s : Subgroup E
hg : a ∈ closure ↑s
b : ℕ → ℝ
b_pos : ∀ (n : ℕ), 0 < b n
u : ℕ → E
u_in : ∀ (n : ℕ), u n ∈ s
lim_u : Tendsto u atTop (𝓝 a)
n₀ : ℕ
hn₀ : ∀ n ≥ n₀, ‖u n / a‖ < b 0
z : ℕ → E := fun n => u (n + n₀)
lim_z : Tendsto z atTop (𝓝 a)
mem_𝓤 : ∀ (n : ℕ), {p | ‖p.1 / p.2‖ < b (n + 1)} ∈ 𝓤 E
φ : ℕ → ℕ
φ_extr : StrictMono φ
hφ : ∀ (n : ℕ), ‖z (φ (n + 1)) / z (φ n)‖ < b (n + 1)
w : ℕ → E := z ∘ φ
hw : Tendsto w atTop (𝓝 a)
v : ℕ → E := fun i => if i = 0 then w 0 else w i / w (i - 1)
⊢ ∀ (n : ℕ), v n ∈ s

Tactic:
rintro ⟨⟩

Result:
case intro.intro.intro.intro.intro.refine_1.zero
E : Type u_5
inst✝ : SeminormedCommGroup E
a : E
s : Subgroup E
hg : a ∈ closure ↑s
b : ℕ → ℝ
b_pos : ∀ (n : ℕ), 0 < b n
u : ℕ → E
u_in : ∀ (n : ℕ), u n ∈ s
lim_u : Tendsto u atTop (𝓝 a)
n₀ : ℕ
hn₀ : ∀ n ≥ n₀, ‖u n / a‖ < b 0
z : ℕ → E := fun n => u (n + n₀)
lim_z : Tendsto z atTop (𝓝 a)
mem_𝓤 : ∀ (n : ℕ), {p | ‖p.1 / p.2‖ < b (n + 1)} ∈ 𝓤 E
φ : ℕ → ℕ
φ_extr : StrictMono φ
hφ : ∀ (n : ℕ), ‖z (φ (n + 1)) / z (φ n)‖ < b (n + 1)
w : ℕ → E := z ∘ φ
hw : Tendsto w atTop (𝓝 a)
v : ℕ → E := fun i => if i = 0 then w 0 else w i / w (i - 1)
⊢ v 0 ∈ s

case intro.intro.intro.intro.intro.refine_1.succ
E : Type u_5
inst✝ : SeminormedCommGroup E
a : E
s : Subgroup E
hg : a ∈ closure ↑s
b : ℕ → ℝ
b_pos : ∀ (n : ℕ), 0 < b n
u : ℕ → E
u_in : ∀ (n : ℕ), u n ∈ s
lim_u : Tendsto u atTop (𝓝 a)
n₀ : ℕ
hn₀ : ∀ n ≥ n₀, ‖u n / a‖ < b 0
z : ℕ → E := fun n => u (n + n₀)
lim_z : Tendsto z atTop (𝓝 a)
mem_𝓤 : ∀ (n : ℕ), {p | ‖p.1 / p.2‖ < b (n + 1)} ∈ 𝓤 E
φ : ℕ → ℕ
φ_extr : StrictMono φ
hφ : ∀ (n : ℕ), ‖z (φ (n + 1)) / z (φ n)‖ < b (n + 1)
w : ℕ → E := z ∘ φ
hw : Tendsto w atTop (𝓝 a)
v : ℕ → E := fun i => if i = 0 then w 0 else w i / w (i - 1)
n✝ : ℕ
⊢ v (n✝ + 1) ∈ s

Proof state:
E : Type u_5
inst✝ : SeminormedCommGroup E
a : E
s : Subgroup E
hg : a ∈ closure ↑s
b : ℕ → ℝ
b_pos : ∀ (n : ℕ), 0 < b n
u : ℕ → E
u_in : ∀ (n : ℕ), u n ∈ s
lim_u : Tendsto u atTop (𝓝 a)
⊢ {x | ‖x / a‖ < b 0} ∈ 𝓝 a

Tactic:
simp_rw [← dist_eq_norm_div]

Result:
E : Type u_5
inst✝ : SeminormedCommGroup E
a : E
s : Subgroup E
hg : a ∈ closure ↑s
b : ℕ → ℝ
b_pos : ∀ (n : ℕ), 0 < b n
u : ℕ → E
u_in : ∀ (n : ℕ), u n ∈ s
lim_u : Tendsto u atTop (𝓝 a)
⊢ {x | dist x a < b 0} ∈ 𝓝 a

Proof state:
case intro.intro
E : Type u_5
inst✝ : SeminormedCommGroup E
a : E
s : Subgroup E
hg : a ∈ closure ↑s
b : ℕ → ℝ
b_pos : ∀ (n : ℕ), 0 < b n
u : ℕ → E
u_in : ∀ (n : ℕ), u n ∈ s
lim_u : Tendsto u atTop (𝓝 a)
⊢ ∃ v,
    Tendsto (fun n => ∏ i ∈ range (n + 1), v i) atTop (𝓝 a) ∧
      (∀ (n : ℕ), v n ∈ s) ∧ ‖v 0 / a‖ < b 0 ∧ ∀ (n : ℕ), 0 < n → ‖v n‖ < b n

Tactic:
obtain ⟨n₀, hn₀⟩ : ∃ n₀, ∀ n ≥ n₀, ‖u n / a‖ < b 0 :=
  haveI : { x | ‖x / a‖ < b 0 } ∈ 𝓝 a := by
    simp_rw [← dist_eq_norm_div]
    exact Metric.ball_mem_nhds _ (b_pos _)
  Filter.tendsto_atTop'.mp lim_u _ this

Result:
case intro.intro.intro
E : Type u_5
inst✝ : SeminormedCommGroup E
a : E
s : Subgroup E
hg : a ∈ closure ↑s
b : ℕ → ℝ
b_pos : ∀ (n : ℕ), 0 < b n
u : ℕ → E
u_in : ∀ (n : ℕ), u n ∈ s
lim_u : Tendsto u atTop (𝓝 a)
n₀ : ℕ
hn₀ : ∀ n ≥ n₀, ‖u n / a‖ < b 0
⊢ ∃ v,
    Tendsto (fun n => ∏ i ∈ range (n + 1), v i) atTop (𝓝 a) ∧
      (∀ (n : ℕ), v n ∈ s) ∧ ‖v 0 / a‖ < b 0 ∧ ∀ (n : ℕ), 0 < n → ‖v n‖ < b n

Proof state:
E : Type u_5
inst✝ : SeminormedCommGroup E
a : E
s : Subgroup E
hg : a ∈ closure ↑s
b : ℕ → ℝ
b_pos : ∀ (n : ℕ), 0 < b n
u : ℕ → E
u_in : ∀ (n : ℕ), u n ∈ s
lim_u : Tendsto u atTop (𝓝 a)
n₀ : ℕ
hn₀ : ∀ n ≥ n₀, ‖u n / a‖ < b 0
z : ℕ → E := fun n => u (n + n₀)
lim_z : Tendsto z atTop (𝓝 a)
n : ℕ
⊢ {p | ‖p.1 / p.2‖ < b (n + 1)} ∈ 𝓤 E

Tactic:
simpa [← dist_eq_norm_div] using Metric.dist_mem_uniformity (b_pos <| n + 1)

Result:
no goals