首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >lambda演算语法树

lambda演算语法树
EN

Stack Overflow用户
提问于 2012-04-23 09:15:23
回答 1查看 1.1K关注 0票数 6

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

另外,有没有人能指出一个解析树的起点,或者一个例子?我还没能找到一个。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-15 23:30:48

一旦定义了函数,您就可以在函数本身上应用参数,从而返回新函数,即所应用参数的结果。

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

代码语言:javascript
复制
\f.\n.\m.if isZero n then m else f (pred n) (succ m)

由于\f是函数的定义,因此您可以将上面的代码编写为:

代码语言:javascript
复制
add = (\n.\m.if (isZero n) then m else add (pred n) (succ m))

和应用程序:

代码语言:javascript
复制
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):

代码语言:javascript
复制
((**\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

稍微解决一下:

代码语言:javascript
复制
(\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

应用第二个参数,并解决:

代码语言:javascript
复制
(**\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;因此,我们求解上面的表达式并得到结果:

代码语言:javascript
复制
(if **(isZero 1)** then 2 else add 0 3)
(if False then 2 else add 0 3)
add 0 3

这与将0应用于函数f,然后将3应用于结果是相同的。上面的表达式可以理解为:"f“is: 0应用于"f",3应用于前一个应用的结果。

但是f以前被定义为:

代码语言:javascript
复制
(\f.\n.\m.if (isZero n) then m else f (pred n) (succ m))

因此,在这种情况下,您将拥有:

代码语言:javascript
复制
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。

作为应用程序过程的一个更直接的示例,考虑定义为(\x.\y.x + y)的函数"sum",(sum 3 2)的结果将是:

代码语言:javascript
复制
(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是一个定点组合器,它允许您在某个点停止迭代,如果您的应用程序返回相同的表达式。

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

代码语言:javascript
复制
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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10273686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档