伊莎贝尔:大锤发现了一个证据,但它失败了

时间:2013-06-13 16:02:12

标签: isabelle theorem-proving

我经常遇到sledgehammer找到证据的问题,但是当我插入它时,它不会终止。我猜sledgehammer是伊莎贝尔最重要的部分之一,但如果证明失败就会变得很烦人。

Sledgehammer tutorial中, 关于“为什么梅蒂斯无法重建证据?”中有一小章。

它列出:

  1. 尝试使用isar_proofs选项获取逐步Isar证明的位置 每一步都由metis完成。由于步骤相当小, metis更有可能重播它们。
  2. 尝试smt证明方法,而不是metis。它通常更强, 但你需要让Z3可以重播证明,信任 SMT求解器,或使用证书。
  3. 尝试blastauto证明方法,传递必要的事实 通过unfoldingusingintro:elim:dest:simp:, 合适的。
  4. 问题在于第一个选项使证明更加冗长,并且还涉及手动干预。 第二种选择很少奏效。

    那么第三种选择呢?是否有任何易于遵循的启发式方法可以申请?

    unfoldingusing之间有什么区别?还有关于如何使用失败的intro:证明中的elim:dest:metis的最佳做法吗?

    部分示例

    proof- 
      have "(det (?lm)) = (det (transpose ?lm))" by (smt det_transpose) 
      then have "(det (?lm)) = [...][not shown]"
        unfolding det_transpose transpose_mat_factor_col by auto
      then show ?thesis [...][not shown]
    qed
    

    我想摆脱证明的第一行,因为这条线似乎微不足道。如果我删除了第一行,sledgehammer仍会找到证据,但发现证明失败(不会终止)。

3 个答案:

答案 0 :(得分:8)

关于你的陈述大锤是伊莎贝尔最重要的部分之一: 你永远不需要大锤才能成功获得证据。但当然大锤非常方便,可以省去很多繁琐的推理。因此,对于那些没有花费多年时间使用它的人来说,Isabelle更有用,这绝对是一个非常重要的部分(即使是那些大锤每天都能提高效率)。

来到你的问题

  

尝试blastauto证明方法,通过unfolding传递必要的事实,   视情况而定usingintro:elim:dest:simp:
  [...]
  那么[this]选项呢?是否有任何易于遵循的启发式方法可以申请?

确实有:

unfolding:这个(递归地)展开方程式,即它与apply (simp only: ...)非常相似。启发式是,当你没有得到simp: ...尝试unfolding ...的预期结果时(可能是其他方程干扰的情况)。

using:这用于向当前子目标添加其他假设。启发式是,只要事实不适合下面的某个模式,请尝试using

intro::这用于介绍规则,即,只要满足某些假设,就可以引入某些连词(或更常见的常数)。
示例: A ==> B ==> A & B(引入的常量为(&))。

elim::这用于消除规则,即,从存在某个连接词(或更常见的常量)的形式,某些事实可以作为附加假设得出结论。
示例: A & B ==> (A ==> B ==> P) ==> P(其中取消了常量(&),有利于明确地将AB作为假设)。请注意结论的一般形式(与主要前提A & B无关),这对于不松散可证明性很重要(另见dest:)。

dest::这用于销毁规则,即从存在某个常量的形式,可以直接得出一些事实。
示例: A & B ==> B(请注意,A保留的信息在结论中丢失,与elim:示例不同。)

simp::这用于简化规则,即(条件)方程式,它们总是从左到右应用(因此有时添加{{1}有用事实上,为了从右到左应用它,但要注意不确定,因为很容易以这种方式引入循环推导。)

说完这些之后,通常只有经验可以让你决定哪种方式最好在证明中使用给定的事实。当我得到[symmetric]的证据时,我通常所做的事情在Isar中太慢了,就是检查所发现的证据使用的事实。然后按上面的方式对它们进行分类,适当地调用sledgehammer,如果这不能完全解决目标,再次应用auto(希望这次提供“更简单”的证明)。

答案 1 :(得分:3)

你问了很多问题,但我会把你的头衔和第二段视为你主要投诉的实质内容,我最终会给出一个冗长的答案,可以用以下的方式总结,

  • 大锤是三管齐下的武器库的一部分,
  • 你变得更有经验,永无止境的实验,以及试验和错误是启发式,
  • 没有使用Sledgehammer返回的许多证据是使用Sledgehammer的重要部分,
  • minimizepreplay_timeout选项可以通过自动播放校样来节省您一些时间和挫折,这可以为您提供时间信息,有时还会显示找到的校样将会失败。

从第二段开始,您说:

  

我常常遇到Sledgehammer找到证据的问题。但后来我尝试了,但证明并没有终止。我想Sledgehammer是Isabelle最重要的部分之一,......

大锤很重要,但我认为它是三管齐下的武器库的一部分,其中三部分将是:

  1. 使用自然扣除的详细证明步骤。
  2. 自动校对方法,例如autosimprule等。其中很大一部分就是创建自己的simp重写规则,并学习如何使用rule定理和无数其他自动证明方法。
  3. 大锤调用自动定理证明(ATPs)。使用经验的步骤1和2,用于设置Sledgehammer。经验非常重要。您可以使用auto来简化事情,以便Sledgehammer成功,但您可能不会使用auto,因为它会将公式扩展到Sledgehammer无法成功的地方。
  4.   

    ......但如果证明失败,那就很烦人了。

    所以在这里,你的期望和我对大锤的期望分歧。这些天,如果我生气,我会生气,我将不得不工作超过30秒来证明一个定理。如果我对特定的大锤证明失败感到非常失望,那是因为我一直试图证明一个定理几个小时或几天没有成功。

    使用Sledgehammer不要找到证据,但要找到好的证据

    自动化有时可以减轻挫败感。点击Sledgehammer证明,只是发现它失败了,这将是令人沮丧的。这是我目前使用Sledgehammer的方式,除非我开始急需证明:

    sledgehammer_params[minimize=smart,preplay_timeout=10,timeout=60,verbose=true,
                        max_relevant=smart,provers="
      remote_vampire  metis  remote_satallax  z3_tptp  remote_e
      remote_e_tofof  spass  remote_e_sine    e        z3       yices
    "]
    

    选项minimize=smartpreplay_timeout=10与Sledgehammer在找到它们后播放校样有关。没有使用Sledgehammer发现的许多证据是使用Sledgehammer的重要部分,证明回放是剔除证据的重要部分。

    我自己,我不会处理不会终止的Sledgehammer证据,但这可能是因为我有选择性地开始。

    我对Sledgehammer证明的第一个标准是它速度相当快,所以当Sledgehammer报告它发现了一个长达3秒以上的证据时,我甚至都不会尝试使用它,除非我不顾一切地想知道一个定理是否可以证明。

    对我来说使用Sledgehammer通常是这样的:

    • 陈述一个定理,看看我是否幸运大锤。
    • 如果Sledgehammer给我一个30毫秒或更短的证明,那么我认为这是一个很好的证明,但我仍然试验try和第9.4.4节,第208页的自动证明方法, of isar-ref.pdf。很多时候我可以得到一个不到5毫秒的证明。
    • metis总时间超过100毫秒的证明,我愿意工作30分钟或更长时间来尝试获得更快的证据。
    • metis 200毫秒到500毫秒的证明,我会尝试我所知道的所有尝试并将其降低到100毫秒以下,这很多时候意味着转换为详细的证明。
    • smtmetis超过1秒的证明我只考虑作为临时证据。
    • 输出面板中的一个证据表明Sledgehammer报告的时间超过3秒,我通常都不会尝试,因为即使它最终工作,我也不得不去找另一个工作无论如何都要证明,所以我宁愿花时间在前面试图找到一个好的证明。

    选项3启发式

    你说,

      

    那么第三种选择呢?是否有任何易于遵循的启发式方法可以申请?

    启发式是:

    • "酌情",

    也就是说,启发式是"使用Sledgehammer作为三管齐下的武器库的一部分"。

    启发式也是"阅读大量的教程和文档,以便你有很多其他东西可以用于Sledgehammer"。大锤是强大的,但它不是无限强大的,对于某些定理,你可以使用你自己的simp规则在{0}中用apply(simp)apply(auto)来证明大锤永远不会证明。

    对于我自己来说,我有大约150到200个定理,所以"酌情"对我来说有更多的意义,它曾经有过。基本上,您尝试按照需要设置的方式设置Sledgehammer。

    需要设置大锤的方式有时意味着首先运行autosimp,但有时不会,因为多次运行autosimp将毁灭大锤失败。

    但有时候,你甚至不想要大锤的metis证明,除非作为初步证明,直到你能找到更好的证据,对我来说,这通常意味着使用自动更快的证明证明方法。

    我对大锤没有任何权威,但似乎大锤擅长匹配旧定理的假设和结论,假设和结论被用于新定理。它不擅长的是通过使用simpauto来证明我已经大大扩展的公式。

    我继续使用以Sledgehammer为中心的冗长启发式:

    • 使用Sledgehammer来启动证明过程,通过向Sledgehammer证明一些你不知道如何证明的定理。
    • 将等效的定理转换为simp重写规则,以便与simpautofastforce等自动校对方法一起使用,如第9章所述tutorial.pdf。
    • 将一些定理用于条件重写规则,以便与introrule一起使用。
    • 最后两个步骤用于完全解决证明步骤或用于设置Sledgehammer"视情况而定#34;。无论你知道多少,大锤永远不会停止使用,当你不了解它时,大锤非常有用,但仅靠大锤并不是成功之路。
    • 如果Sledgehammer无法证明一个定理,那么可以采用详细的证据,从一个简单的详细证据开始。有时,将if-and-only-if分解为两个条件允许Sledgehammer轻松证明这两个条件,当它无法证明if-and-only-if时。
    • 在你证明了很多东西之后,回过头来优化你的证明。有时,根据您创建的所有重写规则,simpauto将神奇地证明事物,并且您将摆脱大锤为您找到的一些metis证明。有时,您会使用Sledgehammer找到metis证明更快的证据。

    使用此命令优化时间:

    ML_command "Toplevel.timing := true"
    

    还有另一篇SO帖子提供了更多细节。

答案 2 :(得分:1)

我可以回答您的问题“unfoldingusing之间有什么区别?”。粗略地说,它就是这样的。

假设引理foo的格式为x = a+b+c。如果你写

unfolding foo

在您的证明中,x的所有匹配项都将替换为a+b+c。另一方面,如果你写

using foo

然后x=a+b+c将添加到您的假设列表中。