Coq中的“详细”汽车

时间:2013-02-17 02:13:33

标签: coq verbose

我正在学习Coq和我正在学习的书,(CPDT)在证明中大量使用auto

因为我正在学习,所以我认为确切地看到auto在幕后做什么可能会有所帮助(早期越少越好)。有没有办法强制它显示它用于计算证据的确切策略或技术?

如果没有,是否有一个地方详细说明了auto的作用?

1 个答案:

答案 0 :(得分:14)

通过多种方式可以了解幕后发生的事情。

TLDR:将info放在你的策略之前,或在调用策略之前和之后使用Show Proof.并发现差异。


要查看特定策略调用的作用,您可以使用info作为前缀,以便显示已采取的特定证明步骤。

(这可能会被Coq 8.4打破,我看到他们提供了某些策略的info_个版本,如果需要,请阅读错误消息。)

这可能是你想要的初学者水平,它已经非常简洁了。


另一种查看证明当前内容的方法是使用命令Show Proof.。它将向您显示当前构建的带孔的术语,并显示您当前目标应填充的孔。

这可能更高级,特别是如果您使用inductioninversion这样的策略,因为正在构建的术语将会相当复杂,并且需要您了解其基本性质诱导方案或依赖模式匹配(CPDT应该尽快教你)。


使用Qed.(或Defined.)完成校对后,您还可以要求查看使用Print term.构建的字词term定理/术语的名称。

这通常是一个庞大而丑陋的术语,需要一些培训才能阅读这些术语。特别是,如果该术语是通过使用强大的策略(例如omegacrush等)构建的,那么它可能是不可读的。你基本上只使用它来扫描你感兴趣的术语的某个特定位置。如果它长度超过10行,甚至不用这么粗糙的格式来阅读它! :)


使用前面的所有内容,您可以事先使用Set Printing All.,以便Coq打印所有内容的展开的显式版本。它还是冗长的,但是当你想知道隐式参数的值是什么时,它会有所帮助。

这些都是我能想到的最好的东西,但可能会有更多。


至于策略的作用,通常最好的答案可以在文档中找到:

http://coq.inria.fr/distrib/V8.4/refman/Reference-Manual011.html#@tactic155

基本上,auto尝试使用提供的所有提示(取决于您使用的数据库),并解决您将目标组合到一定深度(您可以指定)的目标。默认情况下,数据库为core,深度为5

更多信息可以在这里找到:

http://coq.inria.fr/distrib/V8.4/refman/Reference-Manual011.html#Hints-databases