-- Mathlib/Analysis/Normed/Ring/SeminormFromConst.lean
theorem seminormFromConst_isPowMul : IsPowMul (seminormFromConst' hf1 hc hpm) := fun x m hm ↦ by
  simp only [seminormFromConst']
  have hlim : Tendsto (fun n ↦ seminormFromConst_seq c f (x ^ m) (m * n)) atTop
      (𝓝 (seminormFromConst' hf1 hc hpm (x ^ m)))

Proof state:
R : Type u_1
inst✝ : CommRing R
c : R
f : RingSeminorm R
hf1 : f 1 ≤ 1
hc : f c ≠ 0
hpm : IsPowMul ⇑f
x : R
m : ℕ
hm : 1 ≤ m
n : ℕ
⊢ ∃ a, n ≤ m * a

Tactic:
use n

Result:
case h
R : Type u_1
inst✝ : CommRing R
c : R
f : RingSeminorm R
hf1 : f 1 ≤ 1
hc : f c ≠ 0
hpm : IsPowMul ⇑f
x : R
m : ℕ
hm : 1 ≤ m
n : ℕ
⊢ n ≤ m * n

Proof state:
R : Type u_1
inst✝ : CommRing R
c : R
f : RingSeminorm R
hf1 : f 1 ≤ 1
hc : f c ≠ 0
hpm : IsPowMul ⇑f
x : R
m : ℕ
hm : 1 ≤ m
hlim : Tendsto (fun n => seminormFromConst_seq c f (x ^ m) (m * n)) atTop (𝓝 (seminormFromConst' hf1 hc hpm (x ^ m)))
⊢ Tendsto (fun n => seminormFromConst_seq c f (x ^ m) (m * n)) atTop (𝓝 (⋯.choose ^ m))

Tactic:
convert (seminormFromConst_isLimit hf1 hc hpm x).pow m using 1

Result:
case h.e'_3
R : Type u_1
inst✝ : CommRing R
c : R
f : RingSeminorm R
hf1 : f 1 ≤ 1
hc : f c ≠ 0
hpm : IsPowMul ⇑f
x : R
m : ℕ
hm : 1 ≤ m
hlim : Tendsto (fun n => seminormFromConst_seq c f (x ^ m) (m * n)) atTop (𝓝 (seminormFromConst' hf1 hc hpm (x ^ m)))
⊢ (fun n => seminormFromConst_seq c f (x ^ m) (m * n)) = fun x_1 => seminormFromConst_seq c f x x_1 ^ m

Proof state:
case h
R : Type u_1
inst✝ : CommRing R
c : R
f : RingSeminorm R
hf1 : f 1 ≤ 1
hc : f c ≠ 0
hpm : IsPowMul ⇑f
x : R
m : ℕ
hm : 1 ≤ m
n : ℕ
⊢ n ≤ m * n

Tactic:
exact le_mul_of_one_le_left' hm

Result:
no goals

Proof state:
R : Type u_1
inst✝ : CommRing R
c : R
f : RingSeminorm R
hf1 : f 1 ≤ 1
hc : f c ≠ 0
hpm : IsPowMul ⇑f
x : R
m : ℕ
hm : 1 ≤ m
⊢ seminormFromConst' hf1 hc hpm (x ^ m) = seminormFromConst' hf1 hc hpm x ^ m

Tactic:
simp only [seminormFromConst']

Result:
R : Type u_1
inst✝ : CommRing R
c : R
f : RingSeminorm R
hf1 : f 1 ≤ 1
hc : f c ≠ 0
hpm : IsPowMul ⇑f
x : R
m : ℕ
hm : 1 ≤ m
⊢ ⋯.choose = ⋯.choose ^ m

Proof state:
R : Type u_1
inst✝ : CommRing R
c : R
f : RingSeminorm R
hf1 : f 1 ≤ 1
hc : f c ≠ 0
hpm : IsPowMul ⇑f
x : R
m : ℕ
hm : 1 ≤ m
⊢ ⋯.choose = ⋯.choose ^ m

Tactic:
have hlim : Tendsto (fun n ↦ seminormFromConst_seq c f (x ^ m) (m * n)) atTop
    (𝓝 (seminormFromConst' hf1 hc hpm (x ^ m))) := by
  apply (seminormFromConst_isLimit hf1 hc hpm (x ^ m)).comp
    (tendsto_atTop_atTop_of_monotone (fun _ _ hnk ↦ mul_le_mul_left' hnk m) _)
  rintro n; use n; exact le_mul_of_one_le_left' hm

Result:
R : Type u_1
inst✝ : CommRing R
c : R
f : RingSeminorm R
hf1 : f 1 ≤ 1
hc : f c ≠ 0
hpm : IsPowMul ⇑f
x : R
m : ℕ
hm : 1 ≤ m
hlim : Tendsto (fun n => seminormFromConst_seq c f (x ^ m) (m * n)) atTop (𝓝 (seminormFromConst' hf1 hc hpm (x ^ m)))
⊢ ⋯.choose = ⋯.choose ^ m

Proof state:
case h.e'_3.h
R : Type u_1
inst✝ : CommRing R
c : R
f : RingSeminorm R
hf1 : f 1 ≤ 1
hc : f c ≠ 0
hpm : IsPowMul ⇑f
x : R
m : ℕ
hm : 1 ≤ m
hlim : Tendsto (fun n => seminormFromConst_seq c f (x ^ m) (m * n)) atTop (𝓝 (seminormFromConst' hf1 hc hpm (x ^ m)))
n : ℕ
⊢ seminormFromConst_seq c f (x ^ m) (m * n) = seminormFromConst_seq c f x n ^ m

Tactic:
simp only [seminormFromConst_seq, div_pow, ← hpm _ hm, ← pow_mul, mul_pow, mul_comm m n]

Result:
no goals

Proof state:
R : Type u_1
inst✝ : CommRing R
c : R
f : RingSeminorm R
hf1 : f 1 ≤ 1
hc : f c ≠ 0
hpm : IsPowMul ⇑f
x : R
m : ℕ
hm : 1 ≤ m
⊢ Tendsto (fun n => seminormFromConst_seq c f (x ^ m) (m * n)) atTop (𝓝 (seminormFromConst' hf1 hc hpm (x ^ m)))

Tactic:
apply (seminormFromConst_isLimit hf1 hc hpm (x ^ m)).comp
  (tendsto_atTop_atTop_of_monotone (fun _ _ hnk ↦ mul_le_mul_left' hnk m) _)

Result:
R : Type u_1
inst✝ : CommRing R
c : R
f : RingSeminorm R
hf1 : f 1 ≤ 1
hc : f c ≠ 0
hpm : IsPowMul ⇑f
x : R
m : ℕ
hm : 1 ≤ m
⊢ ∀ (b : ℕ), ∃ a, b ≤ m * a

Proof state:
case h.e'_3
R : Type u_1
inst✝ : CommRing R
c : R
f : RingSeminorm R
hf1 : f 1 ≤ 1
hc : f c ≠ 0
hpm : IsPowMul ⇑f
x : R
m : ℕ
hm : 1 ≤ m
hlim : Tendsto (fun n => seminormFromConst_seq c f (x ^ m) (m * n)) atTop (𝓝 (seminormFromConst' hf1 hc hpm (x ^ m)))
⊢ (fun n => seminormFromConst_seq c f (x ^ m) (m * n)) = fun x_1 => seminormFromConst_seq c f x x_1 ^ m

Tactic:
ext n

Result:
case h.e'_3.h
R : Type u_1
inst✝ : CommRing R
c : R
f : RingSeminorm R
hf1 : f 1 ≤ 1
hc : f c ≠ 0
hpm : IsPowMul ⇑f
x : R
m : ℕ
hm : 1 ≤ m
hlim : Tendsto (fun n => seminormFromConst_seq c f (x ^ m) (m * n)) atTop (𝓝 (seminormFromConst' hf1 hc hpm (x ^ m)))
n : ℕ
⊢ seminormFromConst_seq c f (x ^ m) (m * n) = seminormFromConst_seq c f x n ^ m

Proof state:
R : Type u_1
inst✝ : CommRing R
c : R
f : RingSeminorm R
hf1 : f 1 ≤ 1
hc : f c ≠ 0
hpm : IsPowMul ⇑f
x : R
m : ℕ
hm : 1 ≤ m
⊢ ∀ (b : ℕ), ∃ a, b ≤ m * a

Tactic:
rintro n

Result:
R : Type u_1
inst✝ : CommRing R
c : R
f : RingSeminorm R
hf1 : f 1 ≤ 1
hc : f c ≠ 0
hpm : IsPowMul ⇑f
x : R
m : ℕ
hm : 1 ≤ m
n : ℕ
⊢ ∃ a, n ≤ m * a

Proof state:
R : Type u_1
inst✝ : CommRing R
c : R
f : RingSeminorm R
hf1 : f 1 ≤ 1
hc : f c ≠ 0
hpm : IsPowMul ⇑f
x : R
m : ℕ
hm : 1 ≤ m
hlim : Tendsto (fun n => seminormFromConst_seq c f (x ^ m) (m * n)) atTop (𝓝 (seminormFromConst' hf1 hc hpm (x ^ m)))
⊢ ⋯.choose = ⋯.choose ^ m

Tactic:
apply tendsto_nhds_unique hlim

Result:
R : Type u_1
inst✝ : CommRing R
c : R
f : RingSeminorm R
hf1 : f 1 ≤ 1
hc : f c ≠ 0
hpm : IsPowMul ⇑f
x : R
m : ℕ
hm : 1 ≤ m
hlim : Tendsto (fun n => seminormFromConst_seq c f (x ^ m) (m * n)) atTop (𝓝 (seminormFromConst' hf1 hc hpm (x ^ m)))
⊢ Tendsto (fun n => seminormFromConst_seq c f (x ^ m) (m * n)) atTop (𝓝 (⋯.choose ^ m))