You can simplify white_wolf's answer a lot by just letting the ring solver do all the heavy lifting before/after getting to the inductive step:
open import Relation.Binary.PropositionalEquality
open import Data.Nat
open ≡-Reasoning
open import Function
sum : ℕ → ℕ
sum 0 = 0
sum (suc n) = (suc n) + sum n
thm : ∀ n → sum n * 2 ≡ n * (suc n)
thm zero = refl
thm (suc n) = cong (suc ∘ suc) $ begin
(n + sum n) * 2 ≡⟨ solve 2 (λ n s → (n :+ s) :* con 2 := n :* con 2 :+ s :* con 2) refl n (sum n) ⟩
n * 2 + sum n * 2 ≡⟨ cong (n * 2 +_) (thm n) ⟩
n * 2 + n * suc n ≡⟨ solve 1 (λ n → n :* con 2 :+ n :* (con 1 :+ n) := n :+ n :* (con 2 :+ n)) refl n ⟩
n + n * suc (suc n) ∎
where import Data.Nat.Properties; open Data.Nat.Properties.SemiringSolver
The redundancy in the polynomial equation passed to solve
can probably be removed with some metaprogramming (by traversing a quotation of the goal), I remember seeing someone doing that but can't remember the reference.