Вы можете сильно упростить ответ white_wolf, просто разрешив кольцу решать всю тяжелую работу до / после перехода к индуктивному шагу:
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
Избыточность в полиномиальном уравнении, переданная в solve
вероятно, может быть удален с помощью некоторого метапрограммирования (путем обхода цитаты из цели), я помню, как кто-то делал это, но не помнил ссылку.