import Mathlib
import Optlib


open Set Bornology Filter BigOperators Topology BCD

open BCD

theorem extracted_formal_statement_8.{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} (γ : ℝ) (hγ : γ > 1) (ck : ∀ (k : ℕ), alg.c k = 1 / (γ * ↑l))
  (dk : ∀ (k : ℕ), alg.d k = 1 / (γ * ↑l)) :
  let ρ₁ := (γ - 1) * ↑l;
  (∀ (y : F), LipschitzWith l (grad_fst H y)) →
    (∀ (x : E), LipschitzWith l (grad_snd H x)) →
      ∀ (k : ℕ),
        H (alg.x (k + 1), alg.y k) + f (alg.x (k + 1)) ≤
            H (alg.x k, alg.y k) + f (alg.x k) - 1 / 2 * (γ - 1) * ↑l * ‖alg.x (k + 1) - alg.x k‖ ^ 2 →
          H (alg.x (k + 1), alg.y (k + 1)) + g (alg.y (k + 1)) ≤
              H (alg.x (k + 1), alg.y k) + g (alg.y k) - 1 / 2 * (γ - 1) * ↑l * ‖alg.y (k + 1) - alg.y k‖ ^ 2 →
            (∀ (k : ℕ), ψ (z k) = H (alg.x k, alg.y k) + f (alg.x k) + g (alg.y k)) →
              1 / 2 * ρ₁ * (‖alg.x (k + 1) - alg.x k‖ ^ 2 + ‖alg.y (k + 1) - alg.y k‖ ^ 2) =
                  (γ - 1) * ↑l / 2 * ‖z (k + 1) - z k‖ ^ 2 →
                1 / 2 * ((γ - 1) * ↑l) * (‖alg.x (k + 1) - alg.x k‖ ^ 2 + ‖alg.y (k + 1) - alg.y k‖ ^ 2) =
                  (γ - 1) * ↑l / 2 *
                    (‖((WithLp.equiv 2 (E × F)).symm (alg.x (k + 1), alg.y (k + 1))).1 -
                            ((WithLp.equiv 2 (E × F)).symm (alg.x k, alg.y k)).1‖ ^
                        2 +
                      ‖((WithLp.equiv 2 (E × F)).symm (alg.x (k + 1), alg.y (k + 1))).2 -
                            ((WithLp.equiv 2 (E × F)).symm (alg.x k, alg.y k)).2‖ ^
                        2) := 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
γ : ℝ
hγ : γ > 1
ck : ∀ (k : ℕ), alg.c k = 1 / (γ * ↑l)
dk : ∀ (k : ℕ), alg.d k = 1 / (γ * ↑l)
ρ₁ : ℝ := (γ - 1) * ↑l
l1 : ∀ (y : F), LipschitzWith l (grad_fst H y)
l2 : ∀ (x : E), LipschitzWith l (grad_snd H x)
k : ℕ
hHf :
  H (alg.x (k + 1), alg.y k) + f (alg.x (k + 1)) ≤
    H (alg.x k, alg.y k) + f (alg.x k) - 1 / 2 * (γ - 1) * ↑l * ‖alg.x (k + 1) - alg.x k‖ ^ 2
hHg :
  H (alg.x (k + 1), alg.y (k + 1)) + g (alg.y (k + 1)) ≤
    H (alg.x (k + 1), alg.y k) + g (alg.y k) - 1 / 2 * (γ - 1) * ↑l * ‖alg.y (k + 1) - alg.y k‖ ^ 2
eq : ∀ (k : ℕ), ψ (z k) = H (alg.x k, alg.y k) + f (alg.x k) + g (alg.y k)
⊢ 1 / 2 * ρ₁ * (‖alg.x (k + 1) - alg.x k‖ ^ 2 + ‖alg.y (k + 1) - alg.y k‖ ^ 2) =
    (γ - 1) * ↑l / 2 * ‖z (k + 1) - z k‖ ^ 2

Tactic:
simp only [WithLp.prod_norm_sq_eq_of_L2]
    rw [Prod.fst_sub, Prod.snd_sub, BCD.z, BCD.z]
    unfold ρ₁

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
 γ : ℝ
 hγ : γ > 1
 ck : ∀ (k : ℕ), alg.c k = 1 / (γ * ↑l)
 dk : ∀ (k : ℕ), alg.d k = 1 / (γ * ↑l)
 ρ₁ : ℝ := (γ - 1) * ↑l
 l1 : ∀ (y : F), LipschitzWith l (grad_fst H y)
 l2 : ∀ (x : E), LipschitzWith l (grad_snd H x)
 k : ℕ
 hHf :
   H (alg.x (k + 1), alg.y k) + f (alg.x (k + 1)) ≤
     H (alg.x k, alg.y k) + f (alg.x k) - 1 / 2 * (γ - 1) * ↑l * ‖alg.x (k + 1) - alg.x k‖ ^ 2
 hHg :
   H (alg.x (k + 1), alg.y (k + 1)) + g (alg.y (k + 1)) ≤
     H (alg.x (k + 1), alg.y k) + g (alg.y k) - 1 / 2 * (γ - 1) * ↑l * ‖alg.y (k + 1) - alg.y k‖ ^ 2
 eq : ∀ (k : ℕ), ψ (z k) = H (alg.x k, alg.y k) + f (alg.x k) + g (alg.y k)
 ⊢ 1 / 2 * ((γ - 1) * ↑l) * (‖alg.x (k + 1) - alg.x k‖ ^ 2 + ‖alg.y (k + 1) - alg.y k‖ ^ 2) =
     (γ - 1) * ↑l / 2 *
       (‖((WithLp.equiv 2 (E × F)).symm (alg.x (k + 1), alg.y (k + 1))).1 -
               ((WithLp.equiv 2 (E × F)).symm (alg.x k, alg.y k)).1‖ ^
           2 +
         ‖((WithLp.equiv 2 (E × F)).symm (alg.x (k + 1), alg.y (k + 1))).2 -
               ((WithLp.equiv 2 (E × F)).symm (alg.x k, alg.y k)).2‖ ^
           2)]