-- File: optlib/Optlib/Algorithm/GD/GradientDescent.lean
Theorem statement:
theorem extracted_formal_statement_21.{u_1} {E : Type u_1} [inst : NormedAddCommGroup E] [inst_1 : InnerProductSpace ℝ E]
  [inst_2 : CompleteSpace E] {f : E → ℝ} {f' : E → E} {l : NNReal} {a : ℝ} (h₁ : ∀ (x₁ : E), HasGradientAt f (f' x₁) x₁)
  (h₂ : ↑l > 0) (ha₁ : ↑l ≤ 1 / a) (ha₂ : a > 0) (h₃ : LipschitzWith l f') (x : E)
  (h_original_goal : (↑l / 2 * a * a - a) * ‖f' x‖ ^ 2 ≤ -a / 2 * ‖f' x‖ ^ 2) : ↑l / 2 * a * a - a ≤ -a / 2 := sorry

Tactic state before:
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace ℝ E
inst✝ : CompleteSpace E
f : E → ℝ
f' : E → E
l : NNReal
a : ℝ
h₁ : ∀ (x₁ : E), HasGradientAt f (f' x₁) x₁
h₂ : ↑l > 0
ha₁ : ↑l ≤ 1 / a
ha₂ : a > 0
h₃ : LipschitzWith l f'
x : E
⊢ (↑l / 2 * a * a - a) * ‖f' x‖ ^ 2 ≤ -a / 2 * ‖f' x‖ ^ 2

Tactic: apply mul_le_mul_of_nonneg_right

Tactic state after:
[case h
 E : Type u_1
 inst✝² : NormedAddCommGroup E
 inst✝¹ : InnerProductSpace ℝ E
 inst✝ : CompleteSpace E
 f : E → ℝ
 f' : E → E
 l : NNReal
 a : ℝ
 h₁ : ∀ (x₁ : E), HasGradientAt f (f' x₁) x₁
 h₂ : ↑l > 0
 ha₁ : ↑l ≤ 1 / a
 ha₂ : a > 0
 h₃ : LipschitzWith l f'
 x : E
 ⊢ ↑l / 2 * a * a - a ≤ -a / 2,
 case a0
 E : Type u_1
 inst✝² : NormedAddCommGroup E
 inst✝¹ : InnerProductSpace ℝ E
 inst✝ : CompleteSpace E
 f : E → ℝ
 f' : E → E
 l : NNReal
 a : ℝ
 h₁ : ∀ (x₁ : E), HasGradientAt f (f' x₁) x₁
 h₂ : ↑l > 0
 ha₁ : ↑l ≤ 1 / a
 ha₂ : a > 0
 h₃ : LipschitzWith l f'
 x : E
 ⊢ 0 ≤ ‖f' x‖ ^ 2]

Premises used:
mul_le_mul_of_nonneg_right : ∀ {α : Type u_3} {a b c : α} [inst : Mul α] [inst_3 : Zero α] [inst_4 : Preorder α]
  [inst_5 : MulPosMono α], b ≤ c → 0 ≤ a → b * a ≤ c * a