(未型)lambda cyculus($ lambda $)中的定点组合固定(又称y组合)定义为:

修复$ triangleq lambda f。( lambda x。f〜( lambda y。x〜x〜y)))

我了解其目的,并且可以完全正确地追踪其应用程序的执行; 我想了解如何从第一原则中得出修复.

据我所知,当我尝试得出它时:

  1. 修复是一个函数:修复$ triangleq lambda_ ldots $
  2. FIX带有另一个功能,$ f $,以使其递归:fix $ triangleq lambda f ._ ldots $
  3. 函数$ f $的第一个参数是该函数的“名称”,使用了递归应用程序的位置。因此,第一个参数的所有出现到$ f $都应由一个函数代替,并且该函数应期望其余的$ f $的参数(让我们假设$ f $ ting oste congrang):fix $ triangleq fix lambda f ._ ldots f〜( lambda y。_ ldots y)$

这是我不知道如何在推理中“迈出一步”的地方。小椭圆指示我的修复程序缺少某些东西(尽管我只能通过将其与“真实”修复程序进行比较)。

我已经读过 类型和编程语言, ,这不会试图直接得出它,而是将读者引用 小计划 用于推导。我也读过,它的“推导”并不是那么有帮助。此外,它不再是直接推导,而是使用非常具体的示例和在$ lambda $中编写合适的递归功能的临时尝试。

有帮助吗?

解决方案

我在任何地方都没有读过这篇文章,但这就是我相信$ y $的方式:

让我们拥有递归功能$ f $,也许是阶乘或其他类似的东西。非正式地,我们将$ f $定义为伪lambda术语,其中$ f $以其自身的定义出现:

$$ f = ldots f ldots f ldots $$

首先,我们意识到递归调用可以将其视为参数:

$$ f = UnderBrace {( lambda r。

现在,如果我们只有一种方法将其作为论点将其传递给自己,我们可以定义$ f $。当然,这是不可能的,因为我们没有$ f $。我们手头的是$ m $。由于$ m $包含我们定义$ f $所需的所有内容,因此我们可以尝试将$ m $作为参数传递,而不是$ f $,并尝试从后来内部重建$ f $。我们的第一次尝试看起来像这样:

$ f = usterbrace {( lambda r。 m} $$

但是,这不是完全正确的。之前,$ f $在$ m $内被替换为$ r $。但是现在我们通过$ m $。我们必须以某种方式修复所有使用$ r $的地方,以便它们从$ m $重建$ f $。实际上,这一点都不困难:现在我们知道$ f = mm $,无论我们在任何地方使用$ r $,我们都可以将其替换为$(RR)$。

$ f = Underbrace {( lambda r。 rr) ldots))} _ {m'} $$

该解决方案很好,但是我们必须在内部更改$ m $。这不是很方便。我们可以通过引入另一个$ lambda $来更优雅地做到这一点,而不必修改$ m $,该$ lambda $将其参数适用于自身:通过将$ m'$表示为$ lambda xm(xx)$,我们得到了

$$ f =( lambda x。 usterbrace {( lambda r。 ( ldots r ldots r ldots)} _ {m}(xx))$$

这样,当$ m $代替$ x $时,$ mm $被代替$ r $,从定义上等于$ f $。这为我们提供了$ f $的非收回定义,称为有效的lambda术语!

现在很容易过渡到$ y $。我们可以使用任意的lambda术语,而不是$ m $,并在其上执行此过程。因此,我们可以将$ m $输出并定义

$$ y = lambda m。 ( lambdax。m(xx))( lambda xm(xx))$$

实际上,$ ym $如我们所定义的那样减少到$ f $。


笔记: 我得出了$ y $,因为它在文献中定义了。您所描述的组合器是$ y $的变体 逐个电话 语言,有时也称为$ z $。看 这篇Wikipedia文章.

其他提示

正如Yuval指出的那样,不仅有一个定点操作员。有很多。换句话说,固定点定理的方程式没有一个答案。因此,您无法从他们那里得出操作员。

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


以防您想知道的是如何发现第一个定理定理。让我说,当我第一次看到它们时,我也想知道他们如何提出定理定理。看起来很巧妙。特别是在计算理论形式中。与尤瓦尔(Yuval)所说的不同,人们直到找到东西之前都没有玩过。这是我发现的:

据我所知,该定理最初是由于SC Kleene。克莱恩(Kleene)通过挽救教堂原始兰伯达微积分不一致的证据来提出原始的定义定理。教堂的原始兰伯达微积分遭受了罗素型悖论。修改后的lambda微积分避免了问题。克莱恩(Kleene)研究了不一致的证据,可能是如何查看修改后的lambda演算是否会遭受类似问题的困扰,并将不一致的证据转变为修改后的lambda演算中的有用定理。通过他关于Lambada演算与其他计算模型(图灵机,递归功能等)等效的工作,他将其转移到其他计算模型中。


如何得出您可能会问的操作员?这是我牢记的方式。固定点定理是关于消除自我参考。

每个人都知道骗子悖论:

我是巢穴。

或更语言形式:

这句话是错误的。

现在,大多数人认为这句话的问题是自我参考。它不是!可以消除自我参考(问题是真理,一种语言不能谈论其自身句子的真理,请参阅 塔斯基的真理定理的不确定性)。删除自我参考的形式如下:

如果您两次写下以下报价,第二次引号,则结果句子是错误的:“如果您两次写下以下报价,第二次引号,则结果句子为false:''

没有自我参考,我们有关于如何构造句子然后对其做某事的指示。构造的句子等于指示。请注意,在$ lambda $ -calculus中,我们不需要报价,因为数据和说明之间没有区别。

现在,如果我们分析了这一点,我们有$ mm $,其中$ mx $是构造$ xx $并为此做点事的说明。

$ mx = f(xx)$

因此,$ m $是$ lambda x。 f(xx)$,我们有

$ mm =( lambdax。f(xx))( lambdax。f(xx))$

这是针对固定的$ f $。如果您想成为操作员,我们只会添加$ lambda f $,我们得到$ y $:

$ y = lambda f。 (mm)= lambda f。

因此,我只是记住悖论而没有自我参考,这有助于我了解$ y $的意义。

因此,您需要定义一个固定点组合器

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. 重复

您可能已经看到了方程式的经典示例,没有正常形式:

$$( lambda x.xx)( lambda x.xx) triangleright( lambda x.xx)( lambda x.xx)$$

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

$ begin {array} {rr}&( lambda xr(xx))( lambda xr(xx)) )〜) triangleright&r(r(〜( lambda xr(xx)))( lambda xr(xx)) $$

(一个) 是在lambda演算中编写通用递归方程的一种方法(超出原始递归)。那么您如何求解等式$ yf = f(yf)$?插入上述方程式中的$ r $ in for $ f $以获取:

$$ yf =( lambda xf(xx))( lambda xf(xx))$$ $$ y = lambda f。( lambda xf(xx))( lambda xf(xx))$$

许可以下: CC-BY-SA归因
不隶属于 cs.stackexchange
scroll top