鉴于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
为什么?
答案 0 :(得分:4)
Coq的逻辑享有cut-elimination,这意味着任何涉及中间引理的证明(即带有β重新索引的lambda项)都可以通过约简算法转换为直接证明(即一个术语)正常形式)。
然而,这可能是以指数性爆炸为代价的:例如:减少power 2 100
(如应用于power
和2
的函数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.
你为什么“需要”一个引理的问题可以从另一个角度看待:
看看这个乘法交换性的证明。它的一个证明是关于加法的这个有趣的事实,你可以在不改变值的情况下改变括号。这似乎在其他证明中显示出来了!也许这个事实对于打包一个名字是有用的。然后我们可以一遍又一遍地参考它,读者会明白我们在谈论什么,每次都不需要新的证明。
让我们称辅助事实为“引理”。我们将调用它的过程并给它命名为“重构”。