【发布时间】:2018-11-11 22:25:34
【问题描述】:
我一直在玩 Isabelle 的基本证明示例。
考虑以下简单证明:
lemma
fixes n::nat
shows "n*(n+1) = n^2 + n"
by simp
在我看来,像 Isabelle 这样强大的证明助手应该能够在没有太多指导的情况下证明这个引理。 然而,我惊讶地发现 Isabelle 在这里应用规则 simp 确实失败了(我还尝试了其他“通用”规则,例如 simp_all、auto em>, force, blast 但结果是一样的)。
如果我将最后一行替换为以下内容,则可以解决:
by (simp add: power2_eq_square)
我担心的是,我觉得我不应该告诉系统特定规则 power2_eq_square 来完成这个证明。
玩弄类似的琐碎例子,我发现 simp 能够证明
n*(n+2)=n*n+n*2
但失败了
n*(n+3)=n*n+n*3
最后一个例子得到证明
by (simp add: distrib_left)
为什么我需要在第二个示例中指定 distrib_left 而不是在第一个示例中指定(为什么?),这对我来说完全是个谜。
我给出这些例子并不是为了它们本身,而是主要是为了说明我的主要问题:
有没有办法自动验证常规代数身份,例如 Isabelle 中的上述情况?如果没有,那为什么不呢?有哪些技术障碍?
【问题讨论】:
标签: isabelle