测试任意证明是否为圆形?


13

我当时在考虑证明,然后遇到了一个有趣的观察。因此,证明与通过Curry-Howard同构的程序等效,而圆形证明对应于无限递归。但是从暂停问题中我们知道,在一般测试中,任意程序是否会永久递归是不确定的。用柯里·霍华德(Curry-Howard)表示,这是否意味着没有“证明检查器”可以确定证明是否使用循环推理?

我一直认为,证明应该由容易检查的步骤(与推理规则的应用相对应)组成,检查所有步骤可以使您确信结论是正确的。但是现在我在想:也许实际上不可能编写这样的证明检查器,因为没有办法解决暂停问题并检测循环推理?

Answers:


15

绝大多数的证明系统不允许无限的圆形证明,但是它们通过使它们的语言非图灵完整来实现。

在普通的函数式语言中,使程序永久运行的唯一方法是使用递归,从理论上讲,通常我们将递归视为组合器,该程序的类型为:也就是说,它需要一个函数来调用其他“自我”参数,然后将其转换为单个递归函数。一个a a aYa.(aa)a

现在,将Curry-Howard同构应用于此:我们现在有一个证明,对于任何命题,如果本身暗含,那么我们可以证明。我们可以用这种方式证明一切!一个一个aaa

这里的关键是Y组合器内置于一种语言中,被视为公理。因此,如果您不想让它引起问题,就把它当作一个公理来摆脱吧!

因此,大多数正式的证明系统都要求您的递归具有良好的基础。他们只接受可以证明将停止的功能。结果,他们拒绝了某些暂停的程序,但是他们无法证明这一点。

Coq用相当有限的方式做到这一点:它只要求任何递归函数都具有一个参数,其中任何递归调用仅使用该参数的严格较小版本。Agda做了类似的事情,但是花哨的检查更多了以接受更多程序。


1
Coq是否排除您可以证明的一些合理定理?还是总的检查器过于保守时总有变通办法?(我认为基于依赖类型理论的其他证明助手的答案是相同的吗?)
炉灶

1
@boyers FWIW,在Coq中,如果总体检查器失败,则可以使用FunctionProgram Fixpoint构造证明某些功能是合计的。一个简单的示例是列表上的合并排序功能。需要手动证明​​我们将列表(长度> 1)分成严格较小的子列表。
安东·特鲁诺夫

@boyers是的,根据哥德尔的第一个定理,您必须在Coq中证明某些事情。在实践中很少遇到它们,但是总是有一个对角线的论点:Coq不能证明Coq本身,它只能证明一个子集(一个很大的子集,介意包括所有功能,但是递归的下限较低它可以处理)。我记得读过Coq的理论等同于Peano公理,再加上一定的大序数的存在(因此,假设更大序数的证明不适合),但是我现在找不到参考。
吉尔(Gilles)'所以

@AntonTrunov在这种情况下,Program诸如此类是一个红色鲱鱼。他们不会改变理论。他们要做的是使用语法糖在证明中使用量度:您不必推理您感兴趣的对象变小,而是增加了一个间接级别:计算其他一些对象变小(例如,某个大小)并证明它变小。参见Wf图书馆。
吉尔(Gilles)'所以

@Gilles我以为上下文是实用的(具体的)方面,就像Coq的启发式方法失败时一样。链接将不胜感激。
安东·特鲁诺夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.