import Mathlib
import Optlib


open Set

theorem extracted_formal_statement_3.{u_1} {E : Type u_1} [inst : NormedAddCommGroup E] [inst_1 : InnerProductSpace ℝ E]
  [inst_2 : CompleteSpace E] [inst_3 : ProperSpace E] {x₀ : E} {f : E → ℝ} {f' : E → E} {h : E → ℝ}
  {alg : proximal_gradient_method f h f' x₀} (th : ContinuousOn (proximal_gradient_method.t f h f' x₀ • h) univ)
  (th' : ConvexOn ℝ univ (proximal_gradient_method.t f h f' x₀ • h)) :
  let Gt := fun x =>
    (1 / proximal_gradient_method.t f h f' x₀) •
      (x -
        prox_point_c' (proximal_gradient_method.t f h f' x₀ • h) (x - proximal_gradient_method.t f h f' x₀ • f' x) th
          th');
  ∀ (z : E),
    z - proximal_gradient_method.t f h f' x₀ • Gt z =
        prox_point_c' (proximal_gradient_method.t f h f' x₀ • h) (z - proximal_gradient_method.t f h f' x₀ • f' z) th
          th' →
      prox_prop (proximal_gradient_method.t f h f' x₀ • h) (z - proximal_gradient_method.t f h f' x₀ • f' z)
          (z - proximal_gradient_method.t f h f' x₀ • Gt z) →
        Gt z - f' z ∈ SubderivAt h (z - proximal_gradient_method.t f h f' x₀ • Gt z) →
          0 < proximal_gradient_method.t f h f' x₀ := sorry

Tactic state before:
E : Type u_1
inst✝³ : NormedAddCommGroup E
inst✝² : InnerProductSpace ℝ E
inst✝¹ : CompleteSpace E
inst✝ : ProperSpace E
x₀ : E
f : E → ℝ
f' : E → E
h : E → ℝ
alg : proximal_gradient_method f h f' x₀
k : ℕ+
th : ContinuousOn (proximal_gradient_method.t f h f' x₀ • h) univ
th' : ConvexOn ℝ univ (proximal_gradient_method.t f h f' x₀ • h)
Gt : E → E :=
  fun x =>
    (1 / proximal_gradient_method.t f h f' x₀) •
      (x -
        prox_point_c' (proximal_gradient_method.t f h f' x₀ • h) (x - proximal_gradient_method.t f h f' x₀ • f' x) th
          th')
φ : E → ℝ := fun x => f x + h x
z : E
eq1 :
  z - proximal_gradient_method.t f h f' x₀ • Gt z =
    prox_point_c' (proximal_gradient_method.t f h f' x₀ • h) (z - proximal_gradient_method.t f h f' x₀ • f' z) th th'
eq2 :
  prox_prop (proximal_gradient_method.t f h f' x₀ • h) (z - proximal_gradient_method.t f h f' x₀ • f' z)
    (z - proximal_gradient_method.t f h f' x₀ • Gt z)
⊢ Gt z - f' z ∈ SubderivAt h (z - proximal_gradient_method.t f h f' x₀ • Gt z)

Tactic:
rw [prox_iff_subderiv_smul, sub_sub_sub_comm, sub_sub_eq_add_sub] at eq2
    rw [sub_self, zero_add, ← smul_sub, smul_smul _ alg.t _] at eq2
    rw [one_div_mul_cancel, one_smul] at eq2
    exact eq2
    linarith [alg.tpos]

Tactic state after:
[case hfun
 E : Type u_1
 inst✝³ : NormedAddCommGroup E
 inst✝² : InnerProductSpace ℝ E
 inst✝¹ : CompleteSpace E
 inst✝ : ProperSpace E
 x₀ : E
 f : E → ℝ
 f' : E → E
 h : E → ℝ
 alg : proximal_gradient_method f h f' x₀
 k : ℕ+
 th : ContinuousOn (proximal_gradient_method.t f h f' x₀ • h) univ
 th' : ConvexOn ℝ univ (proximal_gradient_method.t f h f' x₀ • h)
 Gt : E → E :=
   fun x =>
     (1 / proximal_gradient_method.t f h f' x₀) •
       (x -
         prox_point_c' (proximal_gradient_method.t f h f' x₀ • h) (x - proximal_gradient_method.t f h f' x₀ • f' x) th
           th')
 φ : E → ℝ := fun x => f x + h x
 z : E
 eq1 :
   z - proximal_gradient_method.t f h f' x₀ • Gt z =
     prox_point_c' (proximal_gradient_method.t f h f' x₀ • h) (z - proximal_gradient_method.t f h f' x₀ • f' z) th th'
 eq2 :
   prox_prop (proximal_gradient_method.t f h f' x₀ • h) (z - proximal_gradient_method.t f h f' x₀ • f' z)
     (z - proximal_gradient_method.t f h f' x₀ • Gt z)
 ⊢ ConvexOn ℝ univ h,
 case ht
 E : Type u_1
 inst✝³ : NormedAddCommGroup E
 inst✝² : InnerProductSpace ℝ E
 inst✝¹ : CompleteSpace E
 inst✝ : ProperSpace E
 x₀ : E
 f : E → ℝ
 f' : E → E
 h : E → ℝ
 alg : proximal_gradient_method f h f' x₀
 k : ℕ+
 th : ContinuousOn (proximal_gradient_method.t f h f' x₀ • h) univ
 th' : ConvexOn ℝ univ (proximal_gradient_method.t f h f' x₀ • h)
 Gt : E → E :=
   fun x =>
     (1 / proximal_gradient_method.t f h f' x₀) •
       (x -
         prox_point_c' (proximal_gradient_method.t f h f' x₀ • h) (x - proximal_gradient_method.t f h f' x₀ • f' x) th
           th')
 φ : E → ℝ := fun x => f x + h x
 z : E
 eq1 :
   z - proximal_gradient_method.t f h f' x₀ • Gt z =
     prox_point_c' (proximal_gradient_method.t f h f' x₀ • h) (z - proximal_gradient_method.t f h f' x₀ • f' z) th th'
 eq2 :
   prox_prop (proximal_gradient_method.t f h f' x₀ • h) (z - proximal_gradient_method.t f h f' x₀ • f' z)
     (z - proximal_gradient_method.t f h f' x₀ • Gt z)
 ⊢ 0 < proximal_gradient_method.t f h f' x₀]