Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Isabelle中的代数简化_Isabelle - Fatal编程技术网

Isabelle中的代数简化

Isabelle中的代数简化,isabelle,Isabelle,我一直在玩弄《伊莎贝尔》中的基本证明例子 考虑以下简单的证明: lemma fixes n::nat shows "n*(n+1) = n^2 + n" by simp 在我看来,像伊莎贝尔这样强大的证明助手应该能够在没有太多指导的情况下证明这个引理。 然而,我惊讶地发现Isabelle在这里应用规则simp实际上失败了(我还尝试了其他“通用”规则,如simp_all、auto、force、blast,但结果是一样的) 如果我将最后一行替换为以下内容,则结果是: by

我一直在玩弄《伊莎贝尔》中的基本证明例子

考虑以下简单的证明:

lemma
    fixes n::nat
    shows "n*(n+1) = n^2 + n"
    by simp
在我看来,像伊莎贝尔这样强大的证明助手应该能够在没有太多指导的情况下证明这个引理。 然而,我惊讶地发现Isabelle在这里应用规则simp实际上失败了(我还尝试了其他“通用”规则,如simp_all、auto、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_,而不是在第一个示例中(为什么?)

我举这些例子并不是为了它们本身,而是为了说明我的主要问题:

是否有一种方法可以自动验证常规代数恒等式,如上面在Isabelle中所述?如果没有,那为什么没有呢?技术障碍是什么

引理

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)

日常的证明工作确实经常在»常规代数恒等式«上绊倒;但是经过一些实践经验之后,人们通常会产生一些直觉,知道如何有效地解决这些问题。我多年来形成的一种模式,举例来说:

context semidom
begin

lemma "a * (b ^ 2 + c) + 2 = a * b * b + c * a + 2"
典型的探索性证明始于

  apply auto
然后考虑了结合性和交换性

  apply (auto simp add: ac_simps)
然后应用更多的代数规范化规则

  apply (auto simp add: algebra_simps)
最后一个缺口很容易用大锤填补

  apply (simp add: power2_eq_square)
在那之后,证明可以被压缩

  by (simp add: algebra_simps power2_eq_square)

谢谢你的回答,但这对我没什么帮助。我知道大锤。这就是我知道如何使用power2_eq_square的原因。不幸的是,Sledgehammer只在稍微复杂一点的代数简化上极度失败。不幸的是,Isabelle不是一个计算机代数系统。它是一个通用的定理证明器,虽然它为代数问题提供了一些专门的自动化,但它仍然远远没有Mathematica这样的CAS的能力。当然,改善这种状况是可能的,但这并不像人们想象的那么容易。@ManuelEberl:是的,我担心情况就是这样。不过,我还是不明白为什么。为什么不能有一种“用代数”精神的具体证明方法呢?它应该简单地通过扩展所有内容和收集术语来证明一个恒等式两边的差简化为0。有一种称为“代数”的证明方法可以做到这一点。我认为它使用了格布纳基。但是它不适用于
semidom
类;我想你需要一个戒指。然而,一旦你把除法加入到混合中,事情又变得更复杂了。例如,如果你有类似于
a/(b*c*d*e)=……
的子项是复杂的,你只需将所有项相乘,分母不为零会突然变得更加难以识别。如果你有额外的假设,如
cos x^2+sin x^2=1
,事情会变得更加棘手。我不是这方面的专家,我相信这些程序可以改进,但最终,一个对伊莎贝尔都很了解,也熟悉求解这类方程理论的人必须投入工作,显然目前还没有这样的人,或者对此感兴趣。非常感谢(如果我有声望,我会投赞成票)。你的策略对我来说很有效,但它仍然感觉像是一个解决办法。