鉴于Curry-Howard信函的传播/扩展如此广泛,证明与程序之间(或命题与类型之间)是否有区别?我们真的可以识别它们吗?
鉴于Curry-Howard信函的传播/扩展如此广泛,证明与程序之间(或命题与类型之间)是否有区别?我们真的可以识别它们吗?
Answers:
人们日常使用的编程语言不适用于Curry-Howard对应关系,因为他们的类型系统太弱了。要在命令式程序中使用Curry-Howard讲一些有趣的事情,需要一个更复杂的类型系统。本书《适应程序的证明》以综合命令式程序的目的为视角。随着依赖类型变得越来越流行,当然在研究功能语言(Agda,Epigram)中,这种区别变得越来越模糊。当然,您可以在Coq定理证明器(可能还有其他)中进行程序综合/提取,这当然是基于Curry-Howard的。
Curry-Howard对应关系也可以用于证明不完全对应于程序的情况(或者它们不是任何人都可以运行的程序)。其中一个例子是携带证明的授权。命题对应于有关授权谁做某事的陈述。证明提供了命题成立的必要证据,因此允许授权请求。为了对证明进行编码,引入了证明术语(通过Curry-Howard)。证明条款在各方之间发送,以表示授权请求有效性的证明,但它们不视为程序。
在Coq中,有两种类型(Prop和Set),程序员使用它们来区分什么是不会产生实际代码的证明,以及证明的一部分,这些部分将用于提取正在运行的代码(您的程序)。
对于您提出的问题,如何识别生成机器代码(程序)的含义以及完成命题(或类型)证明的内容,这是一个很好的解决方案。
AFAIK没有自动区分两者的方法。这可能对研究很有趣吗?或者也许有人能够指出这显然是不可能的?
对于依赖类型,不仅在证明和程序之间没有明显的区别,而且在程序和类型之间也没有区别!唯一的区别是类型(或程序)出现的位置,使其成为给定术语的“程序”位置或“类型”位置的一部分。
我希望有一个例子可以使它更清楚:
当您将identity函数与依赖类型一起使用时,您需要传递将与该函数一起使用的类型!该类型正在您的“程序”中用作值!
未键入的Lambda微积分:
id =
依赖类型:
id:(A:设置)-> A-> A
id =
如果您正在使用此功能,则可以像以下示例所示进行操作:
id自然1
请注意,作为值传递的“类型”(在本例中为“自然集”)被丢弃,因此永远不会进行计算,但仍在该术语的“程序”部分中。这也是“证明”部分也会发生的情况,它们需要在那里进行术语检查,但在计算过程中将被丢弃。
我在这里会说,如果您愿意斜视一下,就可以确定证明和终止程序。
任何终止程序都是您可以接受其输入并产生其输出的证明。这是一种非常基本的暗示证明。
当然,要使这种含意传递的信息比表述明显的含义更有意义,您需要能够证明该程序适用于从某些具有逻辑意义的类中提取的输入的所有实例。(输出也是如此。)
从另一个方向来看,具有有限推理步骤的任何证明都是在某些逻辑系统中操纵对象的符号程序。(如果我们不必过多担心逻辑符号和规则在计算上的含义。)
可以使类型和主张类似地工作。可以为任何类型T分配具有明显真实条件的命题。任何主张都可以转化为证明的类型。
这非常简单,但是我认为它确实表明了该想法的可靠性。(即使某些人注定不喜欢它; ;-))
如果您接受库里-霍华德的对应,那么这个问题主要是一个哲学问题。“证明和程序不同吗?当然。如何?好吧,我们称证明为“证明”,我们称程序为“程序”。”
或者说得更轻松一些,如果证明和程序之间存在同构关系(看起来很明显),那么您的问题是询问是否存在能够区分两者的预言。人类将它们归类为不同(大部分情况下),因此存在这样的预言当然是有争议的。然后,重要的问题变为它们之间是否存在任何有意义的区别,这有待哲学辩论。什么是“证明”?没有什么构成证明的正式定义;这是一个艺术术语,非常类似于Church-Turing论文中的“可有效计算”的概念。因此,“程序”也没有正式定义。
这些是自然语言的单词,用于对数学查询的不同领域进行分类。Curry和Howard观察到的是,这两个不同的领域实际上在研究同一件事。注意这种联系很重要,因为它说这些不同的研究人员应该互相交谈。但是从另一个层面上讲,注意到这种联系就是掩盖它们之间的差异。解决问题时,有时将其视为编程问题会更有益,而有时将其视为逻辑问题会更有益。我认为,这种观点差异是它们之间的重要差异。但是,观点的差异是否构成同一性的差异是一个深刻的哲学问题,至少早在弗雷格的研究中Ueber Sinn和Bedeutung。