coq(或一般)中的定理是否可以在不使用先前已证明的引理的情况下得到证实?

时间:2016-03-16 01:15:33

标签: logic coq proof

鉴于coq中的证明只是高度复杂的函数,可以用各种方式构建,似乎有意义的是,每个定理都存在一个coq证明,既不涉及先前已证实的定理,也不会{{1语句。

例如,证明自然数加法的交换性很简单,没有任何引理,即使它可以通过引理更简单:

//
//  Use this file to import your target's public headers that you would like to expose to Swift.
//
#import "ClassIWantToTest.h"
#import "ClassIWantToTest+Internals.h"

但是当我尝试为乘法的交换性做同样的事情时,我不可避免地遇到需要关于加法的事实的情况。

assert

为什么?

2 个答案:

答案 0 :(得分:4)

Coq的逻辑享有cut-elimination,这意味着任何涉及中间引理的证明(即带有β重新索引的lambda项)都可以通过约简算法转换为直接证明(即一个术语)正常形式)。

然而,这可能是以指数性爆炸为代价的:例如:减少power 2 100(如应用于power2的函数100将从大小为{{1}的术语开始生成大小为2 ^ 100的字词})。

如果您正在尝试编写校对搜索算法,您可能需要查看聚焦。鉴于你似乎想要专注于归纳证明,你可能想看看Boyer&摩尔的证明。

答案 1 :(得分:1)

当然,只要有这样一个证据证明你留下的目标m + (n + m * n) = n + (m + m * n),就有一个没有引理或断言的证据。这是一个,虽然它不是很清楚:

remember (m*n) as o.
clear.
generalize dependent o.
generalize dependent m.
induction n; simpl; try reflexivity.
simpl.
intros m o.
rewrite <- (IHn m o).
remember (n+o) as p.
clear.
generalize dependent p.
induction m; simpl; try reflexivity.
intros p; rewrite (IHm p).
reflexivity.

你为什么“需要”一个引理的问题可以从另一个角度看待:

看看这个乘法交换性的证明。它的一个证明是关于加法的这个有趣的事实,你可以在不改变值的情况下改变括号。这似乎在其他证明中显示出来了!也许这个事实对于打包一个名字是有用的。然后我们可以一遍又一遍地参考它,读者会明白我们在谈论什么,每次都不需要新的证明。

让我们称辅助事实为“引理”。我们将调用它的过程并给它命名为“重构”。