是否有"泛型" Isabelle的用户在尝试证明auto
或sledgehammer
不能立即证明的事情时所遵循的非正式算法?如果auto
需要额外的引理,由用户制定成功或者如果使用更好的其他证明方法,那么可以找出一种通用的方法。
一个相关的问题是:是否可以在某处找到一个包含所有证明方法的表格以及应用它们的上下文?当我通过Programming and Proving tutorial阅读时,各种方法的描述(分别是某些方法的变体,例如auto
的许多变体)都散布在文本中,不断让我走返回以及文本和Isabelle代码之间(这也会导致忘记究竟用于什么),这导致工作效率非常低。
答案 0 :(得分:6)
不,没有"泛型"非正式的方式您可以使用try0
尝试所有标准证明方法(例如auto
,blast
,fastforce
,...)和/或sledgehammer
更高级。< / p>
之后,有趣的部分开始了。
对于你的第二个问题:不,没有这样的概述。也许有人应该写一个,但如前所述,你可以简单地使用try0
。
答案 1 :(得分:4)
simp add:
添加)或者规则的某些先决条件无法证明(在这种情况下,添加足够的事实以便可以证明它们,或者自己做在另外的步骤)define x where "x = …"
在Isar中引入本地定义,并使用x_def
展开它们。这使您的目标更小,更清洁,并降低自动化在证明搜索中无用路径的可能性。definition
,并且想展开它以获取证明,则必须使用unfolding foo_def
或simp add: foo_def
自行完成此操作fun
,primrec
,{{ 1}},simp
)除非从simp集中手动删除了等式(simp_all
)。 (force
或auto
)foo.simps
或lemmas [simp del] = foo.simps
来完成。与经典推理相关的任何事物(即一阶逻辑或集合)都需要declare [simp del] foo.simps
。如果您需要重写和经典推理,请尝试simp
或simp_all
。将blast
视为auto
和force
的组合,而auto
就像simp
的“全有或全无”变体,如果它失败了无法完全解决目标。它也比blast
稍微努力一点。force
和auto
的{{1}}和auto
以及add:
的等效del:
/ simp
。但是,经典的reasoners(simp_all
,simp:
,simp del:
等)也接受auto
,auto
,blast
和相应的{ {1}}选项。这些用于声明引入,销毁和删除规则。关于经典推理者的更多信息:
force
形式的规则,只要目标的格式为intro:
,就应该使用该规则,将其替换为dest:
和elim:
del:
形式的规则,只要P ⟹ Q ⟹ R
形式的事实在场地内用新目标替换为目标R
,就应该使用该规则P
{1}}和Q
。P ⟹ Q ⟹ R
(消除存在量词)。这些类似于破坏规则的概括,也允许引入新变量。这些规则经常出现在这种类似的区别中。P
,G
,Q
等使用的经典推理器将使用claset中的规则(即已声明为R ⟹ G
/ {{1}的规则} / thm exE
)在适当的时候自动。如果这样做不会导致证明,自动化将在某个时刻回溯并尝试其他规则。您可以使用auto
代替blast
(类似于其他规则)禁用特定规则的回溯。然后,自动化将尽可能地应用该规则,而不会回头。force
,intro
,dest
对应于应用单个intro / dest / elim规则,适用于单步推理,例如:为了找出为什么自动方法在某一点上无法取得进展。 elim
与intro!:
类似,但会应用迭代给出的规则集,直到不再可能为止。intro:
和rule
偶尔会有用。前者基本上剥离了量词和逻辑连接词(尝试像drule
这样的目标),后者同样试图“清理”目标。 (我忘了它到底做了什么,我只是偶尔使用它,当我觉得它可能有用时)