jfi*_*isk 6 lambda lambda-calculus
我想弄清楚如何为下面的表达式绘制语法树.首先,这究竟是怎么表现的?看起来它需要1和2作为参数,如果n是0,它将只返回m.

此外,有人可以指出一个开始解析树,或一个例子?我找不到一个.
定义函数后,您可以在函数本身上应用参数,从而返回新函数,即所应用参数的结果。
我不确定您使用哪种语言编写该代码,但应用程序会产生类似以下结果:
\f.\n.\m.if isZero n then m else f (pred n) (succ m)
Run Code Online (Sandbox Code Playgroud)
由于\f是函数的定义,因此可以将上面的内容写为:
add = (\n.\m.if (isZero n) then m else add (pred n) (succ m))
Run Code Online (Sandbox Code Playgroud)
以及应用:
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
Run Code Online (Sandbox Code Playgroud)
用最里面的参数替换最外面的变量(在本例中,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
Run Code Online (Sandbox Code Playgroud)
稍微解决一下:
(\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
Run Code Online (Sandbox Code Playgroud)
应用第二个参数,并解决:
(**\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)
Run Code Online (Sandbox Code Playgroud)
我们知道 (isZero 1) 是假的;因此,我们求解上述表达式并得到结果:
(if **(isZero 1)** then 2 else add 0 3)
(if False then 2 else add 0 3)
add 0 3
Run Code Online (Sandbox Code Playgroud)
这与将 0 应用于函数 f,然后将 3 应用于结果相同。上面的表达式可以读作:“f”是:0应用于“f”,3应用于前一应用的结果。
但 f 以前被定义为:
(\f.\n.\m.if (isZero n) then m else f (pred n) (succ m))
Run Code Online (Sandbox Code Playgroud)
所以,在这种情况下,你会:
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
Run Code Online (Sandbox Code Playgroud)
在语法树中,您只需显示扩展即可达到结果 3。
作为应用程序过程的一个更直接的示例,考虑函数“sum”,定义为 (\x.\yx + 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
Run Code Online (Sandbox Code Playgroud)
求解表达式的顺序没有限制;事实证明,无论所使用的约简顺序如何,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
Run Code Online (Sandbox Code Playgroud)
参考定点组合器。
| 归档时间: |
|
| 查看次数: |
956 次 |
| 最近记录: |