import Mathlib
import Optlib


open Set Bornology Filter BigOperators Topology BCD

open BCD

theorem extracted_formal_statement_25.{u_2, u_1} {E : Type u_1} {F : Type u_2} [inst : NormedAddCommGroup E]
  [inst_1 : InnerProductSpace ℝ E] [inst_2 : CompleteSpace E] [inst_3 : NormedAddCommGroup F]
  [inst_4 : InnerProductSpace ℝ F] [inst_5 : CompleteSpace F] {f : E → ℝ} {g : F → ℝ} {H : WithLp 2 (E × F) → ℝ}
  {x0 : E} {y0 : F} {l : NNReal} {alg : BCD f g H l x0 y0} [inst_6 : ProperSpace E] [inst_7 : ProperSpace F] (γ : ℝ)
  (hγ : γ > 1) (ck : ∀ (k : ℕ), alg.c k = 1 / (γ * ↑l)) (dk : ∀ (k : ℕ), alg.d k = 1 / (γ * ↑l))
  (bd : Bornology.IsBounded (z '' univ)) (lbdψ : BddBelow (ψ '' univ)) ⦃z_ : WithLp 2 (E × F)⦄ (ha : z_ ∈ limit_set z)
  (φ : ℕ → ℕ) (monoφ : StrictMono φ) (conv : Tendsto (z ∘ φ) atTop (𝓝 z_)) (ρ : ℝ) (ρpos : ρ > 0)
  (ieq_1 : ∀ (k : ℕ), ∃ dΨ ∈ f_subdifferential ψ (z (k + 1)), ‖dΨ‖ ≤ ρ * ‖z (k + 1) - z k‖) :
  let v := fun q => Classical.choose (ieq_1 (φ (q + 1) - 1));
  (∀ (q : ℕ), φ (q + 1) - 1 + 1 = φ (q + 1)) →
    (∀ (q : ℕ),
        v q ∈ f_subdifferential ψ (alg.x (φ (q + 1)), alg.y (φ (q + 1))) ∧
          ‖v q‖ ≤ ρ * ‖z (φ (q + 1)) - z (φ (q + 1) - 1)‖) →
      ∀ (ε : ℝ),
        0 < ε →
          ∀ (a : ℕ),
            (∀ (b : ℕ), a ≤ b → ‖z (b + 1) - z b‖ < ε / ρ) →
              ∀ (b : ℕ),
                a ≤ b →
                  ρ * ‖z (φ (b + 1)) - z (φ (b + 1) - 1)‖ < ρ * (ε / ρ) →
                    ‖z (φ (b + 1)) - z (φ (b + 1) - 1)‖ < ε / ρ := sorry

Tactic state before:
E : Type u_1
F : Type u_2
inst✝⁷ : NormedAddCommGroup E
inst✝⁶ : InnerProductSpace ℝ E
inst✝⁵ : CompleteSpace E
inst✝⁴ : NormedAddCommGroup F
inst✝³ : InnerProductSpace ℝ F
inst✝² : CompleteSpace F
f : E → ℝ
g : F → ℝ
H : WithLp 2 (E × F) → ℝ
x0 : E
y0 : F
l : NNReal
alg : BCD f g H l x0 y0
inst✝¹ : ProperSpace E
inst✝ : ProperSpace F
γ : ℝ
hγ : γ > 1
ck : ∀ (k : ℕ), alg.c k = 1 / (γ * ↑l)
dk : ∀ (k : ℕ), alg.d k = 1 / (γ * ↑l)
bd : Bornology.IsBounded (z '' univ)
lbdψ : BddBelow (ψ '' univ)
z_ : WithLp 2 (E × F)
ha : z_ ∈ limit_set z
φ : ℕ → ℕ
monoφ : StrictMono φ
conv : Tendsto (z ∘ φ) atTop (𝓝 z_)
ρ : ℝ
ρpos : ρ > 0
ieq✝ : ∀ (k : ℕ), ∃ dΨ ∈ f_subdifferential ψ (z (k + 1)), ‖dΨ‖ ≤ ρ * ‖z (k + 1) - z k‖
v : ℕ → WithLp 2 (E × F) := fun q => Classical.choose ⋯
n : ℕ
subadd : ∀ (q : ℕ), φ (q + 1) - 1 + 1 = φ (q + 1)
key :
  ∀ (q : ℕ),
    v q ∈ f_subdifferential ψ (alg.x (φ (q + 1)), alg.y (φ (q + 1))) ∧ ‖v q‖ ≤ ρ * ‖z (φ (q + 1)) - z (φ (q + 1) - 1)‖
ε : ℝ
epos : 0 < ε
a : ℕ
ieq : ∀ (b : ℕ), a ≤ b → ‖z (b + 1) - z b‖ < ε / ρ
b : ℕ
aleb : a ≤ b
⊢ ρ * ‖z (φ (b + 1)) - z (φ (b + 1) - 1)‖ < ρ * (ε / ρ)

Tactic:
apply (mul_lt_mul_left ρpos).mpr
    have : ‖alg.z (φ (b + 1) - 1 + 1) - alg.z (φ (b + 1) - 1)‖ < ε / ρ :=
  by
  apply ieq; apply aleb.trans
  exact Nat.sub_le_sub_right (StrictMono_nat φ monoφ (b + 1)) 1
    simp [subadd b] at this

Tactic state after:
[E : Type u_1
 F : Type u_2
 inst✝⁷ : NormedAddCommGroup E
 inst✝⁶ : InnerProductSpace ℝ E
 inst✝⁵ : CompleteSpace E
 inst✝⁴ : NormedAddCommGroup F
 inst✝³ : InnerProductSpace ℝ F
 inst✝² : CompleteSpace F
 f : E → ℝ
 g : F → ℝ
 H : WithLp 2 (E × F) → ℝ
 x0 : E
 y0 : F
 l : NNReal
 alg : BCD f g H l x0 y0
 inst✝¹ : ProperSpace E
 inst✝ : ProperSpace F
 γ : ℝ
 hγ : γ > 1
 ck : ∀ (k : ℕ), alg.c k = 1 / (γ * ↑l)
 dk : ∀ (k : ℕ), alg.d k = 1 / (γ * ↑l)
 bd : Bornology.IsBounded (z '' univ)
 lbdψ : BddBelow (ψ '' univ)
 z_ : WithLp 2 (E × F)
 ha : z_ ∈ limit_set z
 φ : ℕ → ℕ
 monoφ : StrictMono φ
 conv : Tendsto (z ∘ φ) atTop (𝓝 z_)
 ρ : ℝ
 ρpos : ρ > 0
 ieq✝ : ∀ (k : ℕ), ∃ dΨ ∈ f_subdifferential ψ (z (k + 1)), ‖dΨ‖ ≤ ρ * ‖z (k + 1) - z k‖
 v : ℕ → WithLp 2 (E × F) := fun q => Classical.choose ⋯
 n : ℕ
 subadd : ∀ (q : ℕ), φ (q + 1) - 1 + 1 = φ (q + 1)
 key :
   ∀ (q : ℕ),
     v q ∈ f_subdifferential ψ (alg.x (φ (q + 1)), alg.y (φ (q + 1))) ∧ ‖v q‖ ≤ ρ * ‖z (φ (q + 1)) - z (φ (q + 1) - 1)‖
 ε : ℝ
 epos : 0 < ε
 a : ℕ
 ieq : ∀ (b : ℕ), a ≤ b → ‖z (b + 1) - z b‖ < ε / ρ
 b : ℕ
 aleb : a ≤ b
 this : ‖z (φ (b + 1)) - z (φ (b + 1) - 1)‖ < ε / ρ
 ⊢ ‖z (φ (b + 1)) - z (φ (b + 1) - 1)‖ < ε / ρ]