lambda演算的语法树

时间:2012-04-23 01:15:23

标签: lambda lambda-calculus

我正在试图弄清楚如何为下面的表达式绘制语法树。首先,这究竟是怎么表现的?看起来它需要1和2作为参数,如果n为0,它将只返回m

<code>Add</code> definition

此外,有人可以指出一个开始解析树,或一个例子?我找不到一个。

1 个答案:

答案 0 :(得分:3)

一旦定义了函数,就可以对函数本身进行参数的应用,然后返回新函数,应用args的结果。

我不确定您使用哪种语言编写代码,但应用程序会产生类似的结果:

\f.\n.\m.if isZero n then m else f (pred n) (succ m)

由于\f是函数的定义,因此可以将上面的内容写为:

add = (\n.\m.if (isZero n) then m else add (pred n) (succ m))

申请表:

add = (\n.\m.if (isZero n) then m else add (pred n) (succ m))
add 1 2
(\n.\m.if (isZero n) then m else add (pred n) (succ m)) 1 2

用最里面的参数替换最外面的变量(在这种情况下,n乘以1):

((**\n**.\m.if (isZero n) then m else f (pred **n**) (succ m)) **1**) 2
(\m.if (isZero 1) then m else add (pred 1) (succ m)) 2

稍微解决一下:

(\m.if (isZero 1) then m else add **(pred 1)** (succ m)) 2
(\m.if (isZero 1) then m else add 0 (succ m)) 2

应用第二个参数,然后解析:

(**\m**.if (isZero 1) then **m** else add 0 (succ **m**)) **2**
(if (isZero 1) then 2 else add 0 (succ 2))
(if (isZero 1) then 2 else add 0 **(succ 2)**)
(if (isZero 1) then 2 else add 0 3)

我们知道(isZero 1)是假的;所以,我们解决了上面的表达式并得到了结果:

(if **(isZero 1)** then 2 else add 0 3)
(if False then 2 else add 0 3)
add 0 3

将0应用于函数f,然后将3应用于结果。 上面的表达式可以理解为:“f”是:0应用于“f”,3应用于前一个应用程序的结果。

但是f以前被定义为:

(\f.\n.\m.if (isZero n) then m else f (pred n) (succ m))

所以,在这种情况下,你有:

add = (\f.\n.\m.if (isZero n) then m else f (pred n) (succ m))

add 0 3 = \n.\m.if (isZero n) then m else add (pred n) (succ m)) 0 3
    = **\n**.\m.if (isZero **n**) then m else add (pred **n**) (succ m)) **0** 3
    = \m.if (isZero 0) then m else add (pred 0) (succ m)) 3
    = **\m**.if (isZero 0) then **m** else add (pred 0) (succ **m**)) **3**
    = if (isZero 0) then 3 else add (pred 0) (succ 3))
    = if **(isZero 0)** then 3 else add (pred 0) (succ 3))
    = if True then 3 else add (pred 0) (succ 3))
    = 3

在语法树中,您只需显示扩展,即可达到结果3.

作为应用程序过程的一个更简单的例子,考虑函数“sum”,定义为(\ x。\ y.x + y),(sum 3 2)的结果将是:

(sum 3 2)
((sum 3) 2)
(((sum) 3) 2)
(((\x.\y.x + y) 3) 2)
((\y.3 + y) 2)
(3 + 2)
5

对于解决表达方式的顺序没有任何限制;事实证明,lambda演算具有与所用缩减次序相同的结果。 See ref

正如Giorgio所指出的那样,Y是一个定点组合子,如果你的应用程序返回到同一个表达式,它允许你停止在某一点迭代。

由于应用程序需要有限次数的迭代,解决方案将是相同的,只需注意固定指针组合标记:

Y = (\f.\n.\m.if (isZero n) then m else f (pred n) (succ m))
Y add = (\f.\n.\m.if (isZero n) then m else f (pred n) (succ m)) add
Y add = (**\f**.\n.\m.if (isZero n) then m else **f** (pred n) (succ m)) **add**
Y add = \n.\m.if (isZero n) then m else add (pred n) (succ m)

Y add 0 3 = \n.\m.if (isZero n) then m else add (pred n) (succ m)) 0 3
    = **\n**.\m.if (isZero **n**) then m else add (pred **n**) (succ m)) **0** 3
    = \m.if (isZero 0) then m else add (pred 0) (succ m)) 3
    = **\m**.if (isZero 0) then **m** else add (pred 0) (succ **m**)) **3**
    = if (isZero 0) then 3 else add (pred 0) (succ 3))
    = if **(isZero 0)** then 3 else add (pred 0) (succ 3))
    = if True then 3 else add (pred 0) (succ 3))
    = 3

参考fixed point combinator