我必须将以下lambda-expression缩减为WHNF,但我不太清楚如何做到这一点:
(λx y. x 3) (+ 4) (+ 6 7)
那么,我该怎么做?呼叫减少名称?
WHNF中的这个表达式(其他例子)(λz x. (λx. x) z) x
了吗?
答案 0 :(得分:6)
WHNF(弱头普通形式)表示您有一个值(例如整数)或表达式(λx . e(x))
,其中e(x)
是一个表达式,可能包含对{的引用{1}},所以基本上你有结果是一个函数。
在您的情况下,您拥有的表达式包含一些需要减少的应用程序:
x
请注意,在这种情况下,(λx . λy. x 3) (+ 4) (+ 6 7) = (λy . (+ 4) 3) (+ 6 7)
= (+ 4) 3
= 7
不会出现在函数体中,因此在缩小过程中y
“会消失”。
不,+ 6 7
在WHNF中不,因为“顶级运算符”仍然是一个应用程序。请注意,这种情况下的减少有点棘手,因为外部有一个自由变量(λz x. (λx. x) z) x
,x
也绑定λ
。但是我们可以先做一些重命名:x
然后执行缩减:(λz k. (λt. t) z) x
现在这是WHNF。请注意,我们不会减少应用(λk. (λt. t) x)
,因为它位于(λt. t) x
内。
要检查表达式是否在WHNF中,您必须将其视为语法树。让我们考虑上面的两个例子,让我们用λ
明确表示应用程序。请注意,应用$
等同于f x y
。
在第一种情况下,表达式为:
(f x) y
正如您所看到的树的根是 |
+-------------$-----------+
| |
+---- $ ---- +---(+)---+
| | | |
λx λt 6 7
| |
λy +-(+)-+
| | |
+---$---+ t 4
| |
x 3
,因此我们必须执行该应用程序。为了做到这一点,我们必须首先减少左侧,这也是$
,所以必须首先减少左侧,获得:
$
现在左侧我们有一个 |
+-------------$-----------+
| |
| +---(+)---+
| | |
| 6 7
|
λy
|
+---$---+
| |
λt 3
|
+-(+)-+
| |
t 4
,因此我们可以减少最外层的应用λ
:
$
现在根仍然是 |
+---$---+
| |
λt 3
|
+-(+)-+
| |
t 4
,所以我们也必须减少那个:
$
根是 |
+-(+)-+
| |
3 4
,所以我们再次减少获得:
+
现在我们已经完成了。
在第二种情况下,我们将表达式|
7
变为树:
(λz . λk. ((λt. t) z)) x
根再次是 |
+-------$-----------------+
| |
λz x
|
λk
|
+----$----+
| |
λt z
|
t
,所以我们必须减少它:
$
现在我们有一棵树,其根是 λk
|
+----$----+
| |
λt x
|
t
,这意味着表达式在WHNF中,所以我们停止。