Когда вы хотите доказать что-то о рекурсивно определенной функции, которую вы определили с помощью команды function
, и где рекурсия выходит за рамки примитивной рекурсии, обычно лучше всего использовать правило индукции, которое дает команда function
you:
lemma "i ≤ N ⟹ N * Suc N = 2 * sum i N + i * (i - 1)"
proof (induction i N rule: sum.induct)
case (1 i N)
show ?case
proof (cases "i = N")
case True
thus ?thesis sorry
next
case False
thus ?thesis sorry
qed
Это дает вам доступ к гипотезе индукции как «1.IH».Я также уже добавил различие в регистре, которое вам понадобится.
Обратите внимание, что пакет function
регистрирует определяющее уравнение sum
(sum.simps
) как правило simp
.Это не очень хорошая идея, потому что это может сделать цикл упрощения, так как уравнение не охраняется.Я обычно удаляю уравнение из простого набора и добавляю защищенные версии, чтобы избежать этого:
lemmas [simp del] = sum.simps
lemma sum_simps [simp]: "i > N ⟹ sum i N = 0" "i ≤ N ⟹ sum i N = i + sum (Suc i) N"
by (auto simp: sum.simps)