证明与程序(或命题与类型)之间有什么区别?


26

鉴于Curry-Howard信函的传播/扩展如此广泛,证明与程序之间(或命题与类型之间)是否有区别?我们真的可以识别它们吗?


1

如果op希望,请在评论中@我,我可以为您迁移它。

2
约翰·克罗斯利(John Crossley)就此写了一篇论文,最近我偶然看到它发表在某处:[证明和程序之间有什么区别?] [ citeseerx.ist.psu.edu/viewdoc / ...-我还没有看过,但是它来推荐...
TJ Ellis

1
@TJ Ellis,感谢您的链接,但经过短暂浏览后,似乎该论文没有回答标题中提出的问题(或者答案是“他们是相同的”)。
max taldykin 2011年

@TJ Ellis,您在reddid / r / compsci上看到它了吗?我做到了;;)@max,我觉得是,这就是为什么我发布这个问题。

Answers:


20

人们日常使用的编程语言不适用于Curry-Howard对应关系,因为他们的类型系统太弱了。要在命令式程序中使用Curry-Howard讲一些有趣的事情,需要一个更复杂的类型系统。本书《适应程序的证明》以综合命令式程序的目的为视角。随着依赖类型变得越来越流行,当然在研究功能语言(AgdaEpigram)中,这种区别变得越来越模糊。当然,您可以在Coq定理证明器(可能还有其他)中进行程序综合/提取,这当然是基于Curry-Howard的。

Curry-Howard对应关系也可以用于证明不完全对应于程序的情况(或者它们不是任何人都可以运行的程序)。其中一个例子是携带证明的授权。命题对应于有关授权谁做某事的陈述。证明提供了命题成立的必要证据,因此允许授权请求。为了对证明进行编码,引入了证明术语(通过Curry-Howard)。证明条款在各方之间发送,以表示授权请求有效性的证明,但它们不视为程序。


1
您应该提到依赖类型的语言,因为在它们之间,证明和命题之间的界线变得模糊。
Ohad Kammar'3

1
确实。让我们不要忘记Coq的程序综合/提取。
戴夫·克拉克

哪个程序对应于形式的非构造性(经典)证明?(假设是一些有趣的可确定的关系,例如,第个TM以步长停止。)(如果答案不是很短,我可以将其作为新问题提出。)Ť È ķk T(e,k)¬k T(e,k)Tek
Kaveh,

1
@Kaveh:确实将此作为一个单独的问题提出。在评论中,您可以说“ Godel-Gentzen翻译是一种连续传递的转换”,但任何隐秘的内容都不适合。:)
Neel Krishnaswami


10

在Coq中,有两种类型(Prop和Set),程序员使用它们来区分什么是不会产生实际代码的证明,以及证明的一部分,这些部分将用于提取正在运行的代码(您的程序)。

对于您提出的问题,如何识别生成机器代码(程序)的含义以及完成命题(或类型)证明的内容,这是一个很好的解决方案。

AFAIK没有自动区分两者的方法。这可能对研究很有趣吗?或者也许有人能够指出这显然是不可能的?

对于依赖类型,不仅在证明和程序之间没有明显的区别,而且在程序和类型之间也没有区别!唯一的区别是类型(或程序)出现的位置,使其成为给定术语的“程序”位置或“类型”位置的一部分。

我希望有一个例子可以使它更清楚:

当您将identity函数与依赖类型一起使用时,您需要传递将与该函数一起使用的类型!该类型正在您的“程序”中用作值!

未键入的Lambda微积分:

id =λx.x

依赖类型:

id:(A:设置)-> A-> A

id =(λA.(λx.x))

如果您正在使用此功能,则可以像以下示例所示进行操作:

id自然1

请注意,作为值传递的“类型”(在本例中为“自然集”)被丢弃,因此永远不会进行计算,但仍在该术语的“程序”部分中。这也是“证明”部分也会发生的情况,它们需要在那里进行术语检查,但在计算过程中将被丢弃。


6

我在这里会说,如果您愿意斜视一下,就可以确定证明和终止程序。

任何终止程序都是您可以接受其输入并产生其输出的证明。这是一种非常基本的暗示证明。

当然,要使这种含意传递的信息比表述明显的含义更有意义,您需要能够证明该程序适用于从某些具有逻辑意义的类中提取的输入的所有实例。(输出也是如此。)

从另一个方向来看,具有有限推理步骤的任何证明都是在某些逻辑系统中操纵对象的符号程序。(如果我们不必过多担心逻辑符号和规则在计算上的含义。)

可以使类型和主张类似地工作。可以为任何类型T分配具有明显真实条件的命题。任何主张都可以转化为证明的类型。x:xT

这非常简单,但是我认为它确实表明了该想法的可靠性。(即使某些人注定不喜欢它; ;-))


很好的答案。

当然,应该假设您的意思是有限证明和终止程序。某些类型的非终止程序可以很好地用作无限证明。这是您需要注意的非生产性非终止程序。
wren romano

我认为这有些棘手,具体取决于您如何定义证明的有限和无限。通常,我们接受的所有证明都是有限的,因为它们必须在有限的时间内说服人类。通过这种方法,依赖于归纳方案的证明(即大多数“无限”证明)仍然是有限的,它们仅具有代表无限但规则计算的符号步骤。我认为我们大多数人都将其视为有效的证明,这是一个真正的无限证明,从字面上看,您必须考虑无限数量的不同事实以进行验证。
马克·哈曼

5

证明无关紧要?

当您编写某些程序时,
会对它的性能,内存消耗等感兴趣。例如,即使它们的实现具有相同的类型(甚至在依赖类型设置中),也最好使用一些巧妙的排序算法来代替冒泡排序。

但是,当您证明某些定理时,仅是您感兴趣的证明的存在。

当然,从美学的角度来看,一些证明更为简单/美丽/启发性等(例如,《书》中的证明)。


4

如果您接受库里-霍华德的对应,那么这个问题主要是一个哲学问题。“证明和程序不同吗?当然。如何?好吧,我们称证明为“证明”,我们称程序为“程序”。”

或者说得更轻松一些,如果证明和程序之间存在同构关系(看起来很明显),那么您的问题是询问是否存在能够区分两者的预言。人类将它们归类为不同(大部分情况下),因此存在这样的预言当然是有争议的。然后,重要的问题变为它们之间是否存在任何有意义的区别,这有待哲学辩论。什么是“证明”?没有什么构成证明的正式定义;这是一个艺术术语,非常类似于Church-Turing论文中的“可有效计算”的概念。因此,“程序”也没有正式定义。

这些是自然语言的单词,用于对数学查询的不同领域进行分类。Curry和Howard观察到的是,这两个不同的领域实际上在研究同一件事。注意这种联系很重要,因为它说这些不同的研究人员应该互相交谈。但是从另一个层面上讲,注意到这种联系就是掩盖它们之间的差异。解决问题时,有时将其视为编程问题会更有益,而有时将其视为逻辑问题会更有益。我认为,这种观点差异是它们之间的重要差异。但是,观点的差异是否构成同一性的差异是一个深刻的哲学问题,至少早在弗雷格的研究中Ueber Sinn和Bedeutung

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.