将Lambda项简化为标准格式

时间:2018-09-20 02:38:48

标签: lambda-calculus

我刚刚了解了lambda演算,但在尝试减少演算时遇到了问题

    (λx. (λy. y x) (λz. x z)) (λy. y y)

还原为正常形式。我进入(λy. y (λy. y y) (λz. (λy. y y) z),然后迷路了。我不知道从这里去哪里,甚至是正确的。

1 个答案:

答案 0 :(得分:2)

(λx. (λy. y x) (λz. x z)) (λy. y y)

正如@ymonad所指出的,y参数之一需要重命名以避免捕获(将恰好共享相同名称的不同变量合并)。在这里,我将后一个实例重命名(使用α -equivalence):

(λx. (λy. y x) (λz. x z)) (λm. m m)

下一步是β -reduce。在此表达式中,我们可以在以下两个位置之一进行操作:我们可以减少最外部的应用程序(λx)或内部的应用程序(λy)。我要进行后者,主要是随心所欲/因为我想了一点,并认为它将导致较短的中间表达式:

(λx. (λz. x z) x) (λm. m m)

还有更多的β还原操作。同样,我将选择内部表达式,因为我可以看到它的去向,但是在这种情况下实际上并不重要,无论如何,我都会得到相同的最终答案:

(λx. x x) (λm. m m)

旁注:这两个lambda表达式(也称为“模仿鸟”(根据Raymond Smullyan))实际上是α等效的,整个表达式是(众所周知的) Ω组合器。但是,如果我们忽略所有这些,然后应用另一个β -reduction:

(λm. m m) (λm. m m)

啊,那仍然是β可还原的。还是?此表达式α等效于前一个表达式。哦,亲爱的,我们似乎发现自己陷入了无限循环,这在图灵完备(或者我们应该说拉姆达完备)语言中总是可能发生的。有人可能将此表示为我们的原始表达式,等于“ bottom”(在Haskell看来),用denoted表示:

(λx. (λy. y x) (λz. x z)) (λy. y y) = ⊥

这是一个错误吗?好吧,一些好的液相色谱理论要知道:

  • 如果表达式具有β-正态形式,则无论还原顺序如何,它都将是相同的β-正态形式被用来达到它,并且
  • 如果表达式具有β正常形式,则可以保证正常顺序求值。

那么什么是正常订单?简而言之,它是β-在每个步骤中减少最外面的表达。让这个表情再旋转一次!

(λx. (λy. y x) (λz. x z)) (λm. m m)
(λy. y (λm. m m)) (λz. (λm. m m) z)
(λz. (λm. m m) z) (λm. m m)
(λm. m m) (λm. m m)

该死。看起来该表达式没有正常形式-它发散(不会终止)。