【问题标题】:Syntax tree for lambda calculuslambda 演算的语法树
【发布时间】:2012-04-23 01:15:23
【问题描述】:

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

另外,有人可以指出解析树的起点或示例吗?我还没找到。

【问题讨论】:

  • 同时考虑else 分支.. 它进行递归调用,其中一个参数递增,另一个参数递减,最终递减的参数将变为零——假设初始调用是有积极的论据。
  • 谢谢 sarnold,什么是递增的,什么是递减的?
  • pred n 正在递减 (predecessor),succ m 正在递增 (successor)。

标签: lambda lambda-calculus


【解决方案1】:

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

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

\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

求解表达式的顺序没有限制; λ演算被证明具有相同的结果,无论使用的归约顺序如何。 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

【讨论】:

  • 不应该 Y 是 / 一个固定点组合器吗? Y = λf·(λx·f (x x)) (λx·f (x x))
  • 是的,Y 是一个定点组合器;我已经修改了应用程序,并且初始方程解决了;我将在应用程序中添加Y,但是一旦函数不发散,结果将是相同的。谢谢你的评论!最好的问候!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-07
  • 1970-01-01
  • 2016-08-16
  • 2015-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多