Y组合器如何举例说明“ Lambda演算不一致”?


44

定点组合器的Wikipedia页面上,写着相当神秘的文字

Y组合器是导致Lambda微积分不一致的一个示例。因此,应该怀疑。但是,仅在数学逻辑中定义时考虑Y组合器是安全的。

我读过某种间谍小说吗?“ -calculus”是“不一致的”并且应该“被怀疑”的说法在世界上意味着什么?λ


3
FWIW,该段落自2014年1月起出现在Wikipedia文章中,当时该文章是在对整篇文章的大规模重写中引入的。
Ilmari Karonen

Answers:


51

它的灵感来自真实的事件,但是它的表述方式几乎是不可识别的,“应该被怀疑”是胡说八道。

一致性在逻辑上有一个精确的含义:一致性理论是不能证明所有陈述的理论。在经典逻辑中,这等效于没有矛盾,即,当且仅当存在陈述使得该理论证明及其否定,理论才是不一致。AA¬A

那么,对于lambda微积分意味着什么呢?没有。λ演算是一种重写系统,而不是逻辑理论。

可以查看与逻辑有关的λ演算。将变量视为表示证明中的假设,将lambda抽象视为某个假设(由变量表示)下的证明,并将其用作条件证明和假设的证明。然后,β规则对应于通过应用“ 模式”(一种逻辑的基本原理)简化证明。

但是,这仅在条件证明与正确假设的证明相结合时才有效。如果您有一个假设的条件证明,并且您也有的证明,则不能将它们组合在一起。如果要对lambda演算进行这种解释,则需要添加一个约束,该约束仅将正确假设的证明应用于条件证明。这称为类型系统,约束条件是键入规则,该规则表示将参数传递给函数时,参数的类型必须与函数的参数类型匹配。n=3n=2

柯里-霍华德同构之间是平行类型结石和证明系统。

  • 类型对应于逻辑语句;
  • 术语对应于证明;
  • 居住类型(即存在该类型术语的类型)对应于真实的陈述(即存在该陈述的证据的陈述);
  • 程序评估(即Beta之类的规则)对应于证明的转换(最好将正确的证明转换为正确的证明)。

具有定点组合符(例如的类型化演算允许构建任何类型的项(尝试评估),因此,如果通过Curry-Howard对应关系进行逻辑解释,则会得出不一致的理论。请参阅Y组合器是否与Curry-Howard对应矛盾?更多细节。YY(λx.x)

这对于纯lambda演算(即没有类型的lambda演算)没有意义。

在许多类型的计算中,无法定义定点组合器。这些类型的演算就其逻辑解释而言很有用,但不能作为图灵完备的编程语言的基础。在某些类型的计算中,可以定义一个定点组合器。这些类型的演算可以用作图灵完备的编程语言的基础,但对于它们的逻辑解释而言却不是。

结论:

  • λ演算不是“不一致的”,该概念不适用。
  • 一个类型化演算指派一个类型,每学期的λ不一致。有些类型的lambda结石就是这样,其他一些使某些术语无法键入并且是一致的。
  • 类型化的Lambda演算不是Lambda演算的唯一理由,甚至不一致的类型的Lambda演算也是非常有用的工具—只是为了证明事实。

2
哇,我要在这里拆开很多东西。感谢您的详细解释。我将需要一些时间来尝试全部完成。
Ben I.

4
从技术上讲,将未类型化视为un i输入,您可以在未类型化lambda演算和逻辑之间进行CH对应。这只是一个非常非常无聊的逻辑(而且肯定是不一致的)。像NuPRL这样的证明助手会使水有些浑浊。NuPRL的目标语言包含未类型化的lambda演算,您可以轻松定义Y组合器。NuPRL分割事物的方式有所不同,因此它具有类型细化系统而不是类型系统,并且练习不是产生类型良好的术语,而是产生类型派生。
德里克·埃尔金斯

是我一个人,还是在未类型化的lambda演算上强加“作为类型的命题”范式很奇怪?我一直看到人们通过引入特定对象作为布尔值true和来谈论无类型Lambda演算中的逻辑false,而命题就是具有布尔值输出的事物。(并且仅在它确实输出布尔值的事物领域被认为是命题)。

琐碎的(证明每个陈述)并包含矛盾是两个不同的属性。尽管它们在经典逻辑中是等效的,但对于超一致逻辑,系统可能是不一致且非平凡的。
塔米尔(Taemyr),

1
对于基于λ微积分的逻辑,“不一致”是指“将每种类型分配给某个术语”,而不是“将每种类型分配给每个术语”(尽管前者接在后者之后);有很多基于λ演算的语言对应于不一致的逻辑,但是并不是每个λ演算项都是可键入的。
乔纳森·

6

我想在@Giles说的内容中添加一个。

咖喱霍华德对应使得之间的并联组术语(更具体地,所述类型的组术语)和证明系统。λλ

例如,输入(其中表示“从到函数”),它对应于逻辑语句。函数具有,对应于。通过某种意义上的函数“模式匹配”,我们可以将任何lambda-演算类型转换为逻辑重言式。λx.λy.xa(ba)ababa(ba)λx.λy.xy(ab)(ab)(ab)(ab)

当我们考虑定义为的Y组合器时,就会出现问题。之所以出现这个问题,是因为我们希望Y组合器作为“定点”组合器具有类型(因为它需要将函数从类型转换为相同类型,并找到一个固定的-指向该函数(具有该类型)。将其转换为逻辑语句将产生。这是一个矛盾:λf.(λx.f(xx))(λx.f(xx))(aa)a(aa)a

(aa)aaa(¬a¬a)(¬a)¬a¬a

在类型系统中接受导致类型系统不一致。这意味着我们可以(aa)a

  • 禁止在类型系统中输入的类型(这使您可以简单地键入 -calculus),或者(aa)aλ
  • 作为逻辑推论系统,类型系统是不一致的。

1
CH将类型与命题相关,将程序与证明相关,甚至将归约与证明转换相关。这不仅仅是关于类型。其次,只有居住类型对应于重言式。是一种(多态)lambda演算类型,即使没有条件存在也是如此。假设您指的是类的类型,那么接受此类类型就很好了,问题在于该类型是否具有居住者。相反,我们可以在STLC中添加原始术语,这将使相应的逻辑不一致,而无需扩展类型系统。a,b.aba.(aa)a
德里克·埃尔金斯

@DerekElkins,什么样的原始术语?另外,如果我理解正确,这只是假设(a-> a)-> a总是有人居住,这会导致不一致?那么,与要求终止证明的编程语言之间就不会再有矛盾了吗?还是在无类型或Hindley-Milner型lambda演算中存在任何其他不一致的原因?
Hibou57

1
@ Hibou57基本术语,即常量,例如fix。您可以断言每种类型都有一个常数。就CH而言,这已经给您带来了一个不一致的系统,因为这意味着每种类型都被。您还可以添加 -rules来进行计算,这将使具有自然数的STLC变成图灵完备的系统,但是您不必添加这些计算规则,并且系统仍然会不一致。fixAAfix(λx.x)δfix
Derek Elkins
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.