-- File: optlib/Optlib/Algorithm/GD/GradientDescent.lean
Theorem statement:
theorem extracted_formal_statement_24.{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')
  (h_original_goal : ↑l * a * (a / 2) ≤ 1 * (a / 2)) : ↑l * a ≤ 1 := 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 * a * (a / 2) ≤ 1 * (a / 2)

Tactic: apply mul_le_mul_of_nonneg _ (by linarith) (by positivity) (by linarith)

Tactic state after:
[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 * a ≤ 1]

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