减少WHNF中的lambda表达式

时间:2016-06-20 09:48:53

标签: haskell lazy-evaluation lambda-calculus weak-head-normal-form

我必须将以下lambda-expression缩减为WHNF,但我不太清楚如何做到这一点:

(λx y. x 3) (+ 4) (+ 6 7)

那么,我该怎么做?呼叫减少名称?

WHNF中的这个表达式(其他例子)(λz x. (λx. x) z) x了吗?

1 个答案:

答案 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) xx也绑定λ。但是我们可以先做一些重命名: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中,所以我们停止。