我一直在玩Isabelle的基本证据示例。
考虑以下简单证据:
lemma
fixes n::nat
shows "n*(n+1) = n^2 + n"
by simp
在我看来,像伊莎贝尔这样强大的证明助手应该能够在没有太多指导的情况下证明这个引理。 但是,我很惊讶地发现Isabelle实际上未能在此处应用规则 simp (我还尝试了其他“通用”规则,例如 simp_all , auto ,强制, 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?如果没有,那么为什么不呢?有哪些技术障碍?
答案 0 :(得分:2)
每日证明工作确实经常偶然发现»常规代数身份«;但经过一些实践经验,人们通常会发展出如何有效解决这些问题的直觉。多年来我开发的模式,例如:
context semidom
begin
lemma "a * (b ^ 2 + c) + 2 = a * b * b + c * a + 2"
典型的探索性证据始于
apply auto
然后还考虑了关联性和可交换性
apply (auto simp add: ac_simps)
然后应用更多的algebaic规范化规则
apply (auto simp add: algebra_simps)
最后的差距很容易被大锤填补
apply (simp add: power2_eq_square)
之后,证据可以紧凑
by (simp add: algebra_simps power2_eq_square)
答案 1 :(得分:1)
引理
lemma power2_eq_square: "a^2 = a * a"
通常不是一个好的重写规则,因为它很容易炸掉术语的大小。因此,如果没有您告知,基于术语重写的自动化(如simp
)将无法应用此功能。
你想要的是某种证明搜索,Isabelle规定:在编写引理之后,你可以调用sledgehammer
工具,它会很快并快速找到证明为你:
Sledgehammering...
Proof found...
"z3": Try this: by (simp add: power2_eq_square) (1 ms)
"cvc4": Try this: by (simp add: power2_eq_square) (5 ms)