我经常遇到sledgehammer
找到证据的问题,但是当我插入它时,它不会终止。我猜sledgehammer
是伊莎贝尔最重要的部分之一,但如果证明失败就会变得很烦人。
在Sledgehammer tutorial中, 关于“为什么梅蒂斯无法重建证据?”中有一小章。
它列出:
isar_proofs
选项获取逐步Isar证明的位置
每一步都由metis
完成。由于步骤相当小,
metis
更有可能重播它们。smt
证明方法,而不是metis
。它通常更强,
但你需要让Z3可以重播证明,信任
SMT求解器,或使用证书。blast
或auto
证明方法,传递必要的事实
通过unfolding
,using
,intro:
,elim:
,dest:
或simp:
,
合适的。问题在于第一个选项使证明更加冗长,并且还涉及手动干预。 第二种选择很少奏效。
那么第三种选择呢?是否有任何易于遵循的启发式方法可以申请?
unfolding
和using
之间有什么区别?还有关于如何使用失败的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
仍会找到证据,但发现证明失败(不会终止)。
答案 0 :(得分:8)
关于你的陈述大锤是伊莎贝尔最重要的部分之一: 你永远不需要大锤才能成功获得证据。但当然大锤非常方便,可以省去很多繁琐的推理。因此,对于那些没有花费多年时间使用它的人来说,Isabelle更有用,这绝对是一个非常重要的部分(即使是那些大锤每天都能提高效率)。
来到你的问题
尝试
blast
或auto
证明方法,通过unfolding
传递必要的事实, 视情况而定using
,intro:
,elim:
,dest:
或simp:
。
[...]
那么[this]选项呢?是否有任何易于遵循的启发式方法可以申请?
确实有:
unfolding
:这个(递归地)展开方程式,即它与apply (simp only: ...)
非常相似。启发式是,当你没有得到simp: ...
尝试unfolding ...
的预期结果时(可能是其他方程干扰的情况)。
using
:这用于向当前子目标添加其他假设。启发式是,只要事实不适合下面的某个模式,请尝试using
。
intro:
:这用于介绍规则,即,只要满足某些假设,就可以引入某些连词(或更常见的常数)。
示例: A ==> B ==> A & B
(引入的常量为(&)
)。
elim:
:这用于消除规则,即,从存在某个连接词(或更常见的常量)的形式,某些事实可以作为附加假设得出结论。
示例: A & B ==> (A ==> B ==> P) ==> P
(其中取消了常量(&)
,有利于明确地将A
和B
作为假设)。请注意结论的一般形式(与主要前提A & B
无关),这对于不松散可证明性很重要(另见dest:
)。
dest:
:这用于销毁规则,即从存在某个常量的形式,可以直接得出一些事实。
示例: A & B ==> B
(请注意,A
保留的信息在结论中丢失,与elim:
示例不同。)
simp:
:这用于简化规则,即(条件)方程式,它们总是从左到右应用(因此有时添加{{1}有用事实上,为了从右到左应用它,但要注意不确定,因为很容易以这种方式引入循环推导。)
说完这些之后,通常只有经验可以让你决定哪种方式最好在证明中使用给定的事实。当我得到[symmetric]
的证据时,我通常所做的事情在Isar中太慢了,就是检查所发现的证据使用的事实。然后按上面的方式对它们进行分类,适当地调用sledgehammer
,如果这不能完全解决目标,再次应用auto
(希望这次提供“更简单”的证明)。
答案 1 :(得分:3)
你问了很多问题,但我会把你的头衔和第二段视为你主要投诉的实质内容,我最终会给出一个冗长的答案,可以用以下的方式总结,
minimize
和preplay_timeout
选项可以通过自动播放校样来节省您一些时间和挫折,这可以为您提供时间信息,有时还会显示找到的校样将会失败。从第二段开始,您说:
我常常遇到Sledgehammer找到证据的问题。但后来我尝试了,但证明并没有终止。我想Sledgehammer是Isabelle最重要的部分之一,......
大锤很重要,但我认为它是三管齐下的武器库的一部分,其中三部分将是:
auto
,simp
,rule
等。其中很大一部分就是创建自己的simp
重写规则,并学习如何使用rule
定理和无数其他自动证明方法。auto
来简化事情,以便Sledgehammer成功,但您可能不会使用auto
,因为它会将公式扩展到Sledgehammer无法成功的地方。......但如果证明失败,那就很烦人了。
所以在这里,你的期望和我对大锤的期望分歧。这些天,如果我生气,我会生气,我将不得不工作超过30秒来证明一个定理。如果我对特定的大锤证明失败感到非常失望,那是因为我一直试图证明一个定理几个小时或几天没有成功。
自动化有时可以减轻挫败感。点击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=smart
和preplay_timeout=10
与Sledgehammer在找到它们后播放校样有关。没有使用Sledgehammer发现的许多证据是使用Sledgehammer的重要部分,证明回放是剔除证据的重要部分。
我自己,我不会处理不会终止的Sledgehammer证据,但这可能是因为我有选择性地开始。
我对Sledgehammer证明的第一个标准是它速度相当快,所以当Sledgehammer报告它发现了一个长达3秒以上的证据时,我甚至都不会尝试使用它,除非我不顾一切地想知道一个定理是否可以证明。
对我来说使用Sledgehammer通常是这样的:
try
和第9.4.4节,第208页的自动证明方法, of isar-ref.pdf。很多时候我可以得到一个不到5毫秒的证明。metis
总时间超过100毫秒的证明,我愿意工作30分钟或更长时间来尝试获得更快的证据。metis
200毫秒到500毫秒的证明,我会尝试我所知道的所有尝试并将其降低到100毫秒以下,这很多时候意味着转换为详细的证明。smt
或metis
超过1秒的证明我只考虑作为临时证据。你说,
那么第三种选择呢?是否有任何易于遵循的启发式方法可以申请?
启发式是:
也就是说,启发式是"使用Sledgehammer作为三管齐下的武器库的一部分"。
启发式也是"阅读大量的教程和文档,以便你有很多其他东西可以用于Sledgehammer"。大锤是强大的,但它不是无限强大的,对于某些定理,你可以使用你自己的simp
规则在{0}中用apply(simp)
或apply(auto)
来证明大锤永远不会证明。
对于我自己来说,我有大约150到200个定理,所以"酌情"对我来说有更多的意义,它曾经有过。基本上,您尝试按照需要设置的方式设置Sledgehammer。
需要设置大锤的方式有时意味着首先运行auto
或simp
,但有时不会,因为多次运行auto
或simp
将毁灭大锤失败。
但有时候,你甚至不想要大锤的metis
证明,除非作为初步证明,直到你能找到更好的证据,对我来说,这通常意味着使用自动更快的证明证明方法。
我对大锤没有任何权威,但似乎大锤擅长匹配旧定理的假设和结论,假设和结论被用于新定理。它不擅长的是通过使用simp
和auto
来证明我已经大大扩展的公式。
我继续使用以Sledgehammer为中心的冗长启发式:
simp
重写规则,以便与simp
,auto
,fastforce
等自动校对方法一起使用,如第9章所述tutorial.pdf。intro
和rule
一起使用。simp
和auto
将神奇地证明事物,并且您将摆脱大锤为您找到的一些metis
证明。有时,您会使用Sledgehammer找到metis
证明更快的证据。使用此命令优化时间:
ML_command "Toplevel.timing := true"
还有另一篇SO帖子提供了更多细节。
答案 2 :(得分:1)
我可以回答您的问题“unfolding
和using
之间有什么区别?”。粗略地说,它就是这样的。
假设引理foo
的格式为x = a+b+c
。如果你写
unfolding foo
在您的证明中,x
的所有匹配项都将替换为a+b+c
。另一方面,如果你写
using foo
然后x=a+b+c
将添加到您的假设列表中。