溶解lambda演算

时间:2017-01-26 09:21:05

标签: haskell lambda-calculus

我有以下lambda演算:

(λx. + (- x 1)) 9 3

正确的beta降低是:

+ (- 9 1) 3

我犯了一个错误,取而代之的是9号:

+ (- 3 1) 9

我得到了同样的结果。

我没有意识到这是错的,直到将它与解决方案进行比较。

我必须采取最接近的替代,在这种情况下是9吗?

2 个答案:

答案 0 :(得分:7)

你在这个算术例子中得到相同答案的事实是由算术而不是lambda演算引起的巧合。

如果你写了更多的空格来使术语结构更清晰,那么就会更容易看出发生了什么

(\x. + (- x 1)) 9 3

表示用无偿的额外括号显示解析树,

((\x. (+ (- x 1))) 9) 3

因为应用程序与左侧相关联(“而不是像我们六十年代所做的那样” - Roger Hindley)。

所以,3是在错误的地方替换x。我们只有

( (\x. (+ (- x 1))) 9 ) 3
  =
(+ (- 9 1)) 3
  =
(+ 8) 3
  =
11

答案 1 :(得分:1)

是的,你总是需要将lambda应用到它的“第一个”(最左边)参数。

理论上,没有多个参数这样的东西,只有一个参数的应用。尽管如此,写作仍然很常见 f M N O重复申请(((f M) N) O)。请注意f如何将M作为其参数。

在一般情况下,如果您以不同的顺序执行申请,则不会得到相同的结果。你的例子只是一个事件。