如何管理所有各种证明方法

时间:2017-02-19 12:07:24

标签: isabelle

是否有"泛型" Isabelle的用户在尝试证明autosledgehammer不能立即证明的事情时所遵循的非正式算法?如果auto需要额外的引理,由用户制定成功或者如果使用更好的其他证明方法,那么可以找出一种通用的方法。

一个相关的问题是:是否可以在某处找到一个包含所有证明方法的表格以及应用它们的上下文?当我通过Programming and Proving tutorial阅读时,各种方法的描述(分别是某些方法的变体,例如auto的许多变体)都散布在文本中,不断让我走返回以及文本和Isabelle代码之间(这也会导致忘记究竟用于什么),这导致工作效率非常低。

2 个答案:

答案 0 :(得分:6)

不,没有&#34;泛型&#34;非正式的方式您可以使用try0尝试所有标准证明方法(例如autoblastfastforce,...)和/或sledgehammer更高级。< / p>

之后,有趣的部分开始了。

  • 这个定理可以用更简单的助手引理来显示吗?您可以使用命令&#34;抱歉&#34;假设引理是真的。
  • 我如何在一张纸上证明这一点?然后尝试在Isabelle中做这个证明。
  • 寻求帮助:)很多人在堆栈溢出,freenode上的#isabelle和Isabelle邮件列表等着你的问题。

对于你的第二个问题:不,没有这样的概述。也许有人应该写一个,但如前所述,你可以简单地使用try0

答案 1 :(得分:4)

ammbauer的回答已经涵盖了很多重要的内容,但是这里有一些可能对你有帮助的事情:

  • 当自动化卡在某一点时,请查看可用的前提和当时的目标。您希望系统在那时做什么样的简化?为什么不这样做?也许相应的规则不在simp集中(用simp add:添加)或者规则的某些先决条件无法证明(在这种情况下,添加足够的事实以便可以证明它们,或者自己做在另外的步骤)
  • Isar样张很好。如果您有一些复杂的目标,请尝试将其分解为Isar中的较小步骤。如果你有更大的辅助事实,甚至可能更普遍的兴趣,尝试将它们作为辅助引理拉出来。也许你甚至可以将它们概括一点。有时甚至可以简化证明。
  • 同样的道理:太多的信息会让你和伊莎贝尔感到困惑。您可以使用define x where "x = …"在Isar中引入本地定义,并使用x_def展开它们。这使您的目标更小,更清洁,并降低自动化在证明搜索中无用路径的可能性。
  • Isabelle不会自动展开定义,因此,如果您有definition,并且想展开它以获取证明,则必须使用unfolding foo_defsimp add: foo_def自行完成此操作
  • 使用简化器(funprimrec,{{ 1}},simp)除非从simp集中手动删除了等式(simp_all)。 (forceauto
  • 不同的证明方法擅长于不同的事物,并且需要一些经验才能知道在什么情况下使用什么方法。作为一般规则,任何只需要重写/简化的内容都应该使用foo.simpslemmas [simp del] = foo.simps来完成。与经典推理相关的任何事物(即一阶逻辑或集合)都需要declare [simp del] foo.simps。如果您需要重写和经典推理,请尝试simpsimp_all。将blast视为autoforce的组合,而auto就像simp的“全有或全无”变体,如果它失败了无法完全解决目标。它也比blast稍微努力一点。
  • 大多数证明方法都可以选择。您可能已经知道forceauto的{​​{1}}和auto以及add:的等效del: / simp。但是,经典的reasoners(simp_allsimp:simp del:等)也接受autoautoblast和相应的{ {1}}选项。这些用于声明引入,销毁和删除规则。

关于经典推理者的更多信息:

  • 引言规则是force形式的规则,只要目标的格式为intro:,就应该使用该规则,将其替换为dest:elim:
  • 销毁规则是del:形式的规则,只要P ⟹ Q ⟹ R形式的事实在场地内用新目标替换为目标R,就应该使用该规则P {1}}和Q
  • 消除规则类似P ⟹ Q ⟹ R(消除存在量词)。这些类似于破坏规则的概括,也允许引入新变量。这些规则经常出现在这种类似的区别中。
  • PGQ等使用的经典推理器将使用claset中的规则(即已声明为R ⟹ G / {{1}的规则} / thm exE)在适当的时候自动。如果这样做不会导致证明,自动化将在某个时刻回溯并尝试其他规则。您可以使用auto代替blast(类似于其他规则)禁用特定规则的回溯。然后,自动化将尽可能地应用该规则,而不会回头。
  • 基本证明方法forceintrodest对应于应用单个intro / dest / elim规则,适用于单步推理,例如:为了找出为什么自动方法在某一点上无法取得进展。 elimintro!:类似,但会应用迭代给出的规则集,直到不再可能为止。
  • intro:rule偶尔会有用。前者基本上剥离了量词和逻辑连接词(尝试像drule这样的目标),后者同样试图“清理”目标。 (我忘了它到底做了什么,我只是偶尔使用它,当我觉得它可能有用时)