定点组合器(Y组合器)的清晰直观的推导?


28

(无类型)lambda演算()中的定点组合器FIX(aka Y组合器)定义为:λ

FIXλf.(λx.f (λy.x x y)) (λx.f (λy.x x y))

我了解它的目的,并且可以很好地跟踪其应用程序的执行。我想了解如何从第一原理中得出FIX

这是我尝试自己导出时所得到的:

  1. FIX是一个函数:FIX λ
  2. FIX使用另一个函数f使其递归:FIX λf.
  3. 函数f的第一个参数是函数f的“名称”,用于打算递归应用程序的地方。因此,f的第一个参数的所有出现f都应由一个函数替换,并且该函数应预期f的其余参数f(假设f带有f一个参数):FIX λf.f (λy.y)

这是我不知道如何在推理中“迈出一步”的地方。小椭圆表示我的FIX缺少了什么(尽管我只能通过将其与“真实” FIX进行比较来知道)。

我已经阅读了Types and Programming Languages(《类型和编程语言》),该书并未尝试直接将其派生,而是将读者引向The Little Schemer进行派生。我也读过,它的“派生”并不是那么有用。而且,它不是直接推导,而是更多地使用非常具体的示例,并且是临时尝试在\ lambda中编写合适的递归函数λ


1
这篇文章可能会有所帮助。总的来说,我认为仅对组合器进行多次迭代并对其进行计算会有助于弄清组合器为何起作用。
Xodarap

2
有几种不同的定点组合器。也许人们只是和组合器一起玩,直到偶然发现它们。
Yuval Filmus 2013年

@YuvalFilmus,这就是我的研究和对这个问题的回答,开始让我思考。但是我仍然认为“看待”逻辑上的组合器是有启发性的,这项技能在例如尝试构建新的组合器时特别有用。
BlueBomber

阅读Daniel P. Friedman撰写的“ The Little Lisper”中的第9章(或“ The Little Schemer”)。
user18199 2014年

2
OP似乎表明他们已经阅读过。
拉斐尔

Answers:


29

我没有在任何地方阅读过此书,但这是我认为可以得出:Y

让我们有一个递归函数,也许是阶乘或类似的东西。非正式地,我们将定义为伪lambda项,其中以其自身的定义出现:fff

f=ff

首先,我们意识到可以将递归调用作为参数分解:

f=(λr.(rr))Mf

现在,如果我们只有一种方法可以将作为自变量传递给我们,则可以定义。当然,这是不可能的,因为我们手头没有。我们手头是。由于包含我们需要定义所有内容,因此我们可以尝试将而不是用作参数,并尝试稍后从其内部重构。我们的第一次尝试如下所示:ffMMfMff

f=(λr.(rr))M(λr.(rr))M

但是,这并不完全正确。之前,得到替代内的。但是现在我们改为通过我们必须以某种方式修复使用所有位置,以便它们从重构。实际上,这一点都不困难:现在我们知道,在任何使用地方,我们都简单地将其替换为。frMMrfMf=MMr(rr)

f=(λr.((rr)(rr)))M(λr.((rr)(rr)))M

这个解决方案很好,但是我们必须更改内部的这不是很方便。我们可以更优雅做到这一点,而无需修改通过引入另一个发送到的论点适用于自身:通过表达为,我们得到MMλMMλx.M(xx)

f=(λx.(λr.(rr))M(xx))(λx.(λr.(rr))M(xx))

这样,当用代替,用代替,的定义等于。这为我们提供了的非递归定义,表示为有效的lambda项!MxMMrff

现在轻松过渡到我们可以使用任意的lambda项代替并对其执行此过程。所以我们可以将出来并定义YMM

Y=λm.(λx.m(xx))(λx.m(xx))

实际上,按照我们的定义,减小到。YMf


注意:我已经推导出了文献中定义的你所描述的组合子是的一个变种用于呼叫按值的语言,有时也被称为。请参阅此Wikipedia文章YYZ


1
您出色的回答给我带来的缺失但似乎显而易见的直觉是,递归函数需要以自身作为参数,因此我们从一个假设开始,即该函数对于某些的形式为。然后,在构造,我们使用以下断言,即定义为在内部对其自身应用某种事物,例如,将应用于在您的答案中,这在定义上等于。迷人!f=X(X)XXfXxxf
BlueBomber

11

正如Yuval指出的那样,不仅有一个定点运算符。有很多。换句话说,定点定理的方程式没有一个答案。因此,您不能从它们派生运算符。

这就像问人们如何得出作为的解。他们不!该方程式没有唯一的解决方案。(x,y)=(0,0)x=y


万一您想知道的是第一个定点定理是如何发现的。让我说,我也想知道当我第一次看到它们时是如何提出定点/递归定理的。看来如此巧妙。特别是可计算性理论形式。与尤瓦尔所说的不同,人们不是在玩耍之前才发现一些东西。这是我发现的:

据我所知,该定理最初是由SC Kleene引起的。Kleene通过挽救Church原始lambda演算不一致的证据,提出了原始不动点定理。教会最初的lambda演算遭受了Russel类型的悖论。改进的λ演算避免了该问题。Kleene研究了不一致的证明,以查看修改后的lambda演算是否会遇到类似的问题,并将不一致的证明转化为修改过的lambda演算的有用定理。通过他关于lambada微积分与其他计算模型(图灵机,递归函数等)的等效性工作,他将其转移到其他计算模型。


如何得出您可能会问的运算符?这是我要牢记的。定点定理是关于删除自引用的。

每个人都知道说谎者悖论:

我是巢穴。

或者以更语言的形式:

这句话是错误的。

现在大多数人认为这句话的问题在于自我参照。它不是!可以消除自我指称(问题在于真理,一种语言通常无法谈论自己句子的真理,请参见塔斯基关于真理定理的不可定义性)。删除自引用的形式如下:

如果您两次编写以下引号,第二次在引号内,则结果为假:“如果您两次编写以下引号,第二次在引号内,则结果为假:”

没有自我参照,我们有关于如何构建句子然后对其进行处理的说明。并且所构造的句子等于指令。请注意,在 -calculus中,我们不需要引号,因为数据和指令之间没有区别。λ

现在,如果我们对此进行分析,则有,其中是构造并对其执行操作的指令。MMMxxx

Mx=f(xx)

所以是,我们有Mλx.f(xx)

MM=(λx.f(xx))(λx.f(xx))

这是针对固定。如果要使其成为运算符,我们只需添加,我们得到:fλfY

Y=λf.(MM)=λf.((λx.f(xx))(λx.f(xx)))

因此,我只是牢记没有自我参照的悖论,这有助于我理解含义。Y


3

所以你需要定义一个定点组合器

fix f = f (fix f)
      = f (f (fix f))
      = f (f (f ... ))

但没有明确的递归。让我们从最简单的不可约组合器开始

omega = (\x. x x) (\x. x x)
      = (\x. x x) (\x. x x)
      = ...

x一个lambda中的反复被第二个lambda替代。简单的alpha转换使此过程更加清晰:

omega =  (\x. x x) (\x. x x)
      =α (\x. x x) (\y. y y)
      =β (\y. y y) (\y. y y)
      =α (\y. y y) (\z. z z)
      =β (\z. z z) (\z. z z)

即,第一个lambda中的变量始终消失。因此,如果我们f在第一个lambda中添加一个

(\x. f (x x)) (\y. y y)

f会卷土重来

f ((\y. y y) (\y. y y))

我们已经omega回来了。现在应该清楚了,如果我们f在第二个lambda中添加,则f将会出现在第一个lambda中,然后它会跳起来:

Y f = (\x. x x)     (\x. f (x x))
      (\x. f (x x)) (\x. f (x x)) -- the classical definition of Y

以来

(\x. s t) z = s ((\x. t) z), if `x' doesn't occur free in `s'

我们可以将表达式重写为

f ((\x. x x) (\x. f (x x))

这只是

f (Y f)

并且我们得到了等式Y f = f (Y f)。所以Y组合器本质上是

  1. 加倍 f
  2. 使第一个f增强
  3. 重复

2

您可能已经看过没有范式的经典方程式示例:

(λx.xx)(λx.xx)(λx.xx)(λx.xx)

对于一般递归,提出了一个类似的方程式:

(A)(λx.R(xx))(λx.R(xx)) R( (λx.R(xx))(λx.R(xx)) )R(R( (λx.R(xx))(λx.R(xx)) ))

(A)是一种在lambda演算(超越原始递归)中编写一般递归方程的方法。那么如何解方程呢?将插入上式中的以得到:Yf=f(Yf)fR

Yf=(λx.f(xx))(λx.f(xx))
Y=λf.(λx.f(xx))(λx.f(xx))
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.