lambda演算的语法树

lambda演算的语法树,lambda,lambda-calculus,Lambda,Lambda Calculus,我想知道如何为下面的表达式绘制语法树。首先,这到底是怎么回事?它似乎将1和2作为参数,如果n为0,它将只返回m 添加定义“> 还有,有人能指出解析树的起点吗,或者举个例子吗?我还没有找到。一旦定义了函数,就可以在函数本身上应用参数,从而返回新函数和应用参数的结果 我不确定您使用哪种语言编写代码,但应用程序会产生如下结果: \f.\n.\m.if isZero n then m else f (pred n) (succ m) 由于\f是函数的定义,您可以将上述内容写成: add = (\n.\

我想知道如何为下面的表达式绘制语法树。首先,这到底是怎么回事?它似乎将1和2作为参数,如果
n
为0,它将只返回
m

添加定义“>


还有,有人能指出解析树的起点吗,或者举个例子吗?我还没有找到。一旦定义了函数,就可以在函数本身上应用参数,从而返回新函数和应用参数的结果

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

\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):

稍微解决一下:

(\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)为false;因此,我们求解上述表达式并得到结果:

(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演算被证明具有相同的结果,无论使用的约化的顺序如何。

正如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

参考。

考虑一下
else
分支。它进行递归调用,其中一个参数递增,另一个参数递减,最终递减的参数将变为零——假设初始调用为正参数。感谢sarnold,什么在递增,什么在递减这里,
predn
在做递减(
preducer
),而
succim
在做递增(
subducer
)。
Y
不应该是/a固定点组合器吗?
Y=λf·(λx·f(x))(λx·f(x))
是的,
Y
是一个定点组合器;我修改了应用程序,初始方程解了;我将在应用程序中添加
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