【发布时间】:2021-11-05 17:46:06
【问题描述】:
这是一个平凡的函数和一个引理:
fun count_from where
"count_from y 0 = []"
| "count_from y (Suc x) = y # count_from (Suc y) x"
lemma "count_from 3 5 = [3,4,5,6,7]"
这只是一个例子。真正的功能更复杂。
您能否建议如何证明这样的引理?
我使用尾递归重新定义了函数,并证明了引理如下:
fun count_from2 where
"count_from2 y 0 ys = ys"
| "count_from2 y (Suc x) ys = count_from2 (Suc y) x (ys @ [y])"
lemma "count_from2 3 5 [] = xs ⟹ xs = [3,4,5,6,7]"
apply (erule count_from2.elims)
apply simp
apply (drule_tac s="xs" in sym)
apply (erule count_from2.elims)
apply simp
apply (drule_tac s="xs" in sym)
apply (erule count_from2.elims)
apply simp
apply (drule_tac s="xs" in sym)
apply (erule count_from2.elims)
by auto
这肯定不是一个合适的解决方案。
我有几个问题:
- 是否首选使用尾递归定义函数?它通常会简化定理证明吗?
- 为什么不能应用函数简化规则(
count_from.simps或count_from2.simps)? - 我应该定义一个引入规则来证明第一个引理吗?
- 是否可以应用函数归纳规则来证明这样的引理?
【问题讨论】:
标签: isabelle