Lambda演算 - 评估这些惰性参数

时间:2016-08-20 20:15:57

标签: computer-science lambda-calculus computer-science-theory

我正在阅读有关lambda演算的内容。从第2.1节末尾http://www.toves.org/books/lambda/

开始
(λx.(λx.λy.x × y) 3 ((λz.x + z) 2)) 1   ⇒   (λx.λy.x × y) 3 ((λz.x + z) 2)   where x = 1
⇒   (λy.x × y) ((λz.x + z) 2)   where x = 3
⇒   x × y   where x = 3 and y = (λz.x + z) 2
⇒   x × y   where x = 3 and y = x + z and z = 2
⇒   x × y   where x = 3 and y = 5 and z = 2
⇒   15

它说

  

事实上,y应该达到值3而不是5   第一次beta减少应该将1插入到表达式中的x位置。   因此,惰性参数必须保留当前变量   每次减少的上下文,在这种情况下记住x = 3   在表达式λy.x×y内,但保持x = 1的事实   在表达之外。

但我对beta减少期间的操作顺序感到困惑。不幸的是,解释是模棱两可的。它们可能意味着x应该在(λx.λy.x×y)内,然后y = 3,因为这是传入的下一个参数,x已经设置(感觉不对),或者我们在下面的路线:

我们同意吗? (λx。(λx.λy.x×y)3((λz.x+ z)2))1
是相同的 (λx。(λt.λy.t×y)3((λz。 x + z)2))1

x绑定在这里?不应该是1?

这意味着当我们减少这个: (λt.λy.t×y)3((λz.1+ z)2))x = 1 (λy.3×y)((λz.1+ z)2))x = 1,t = 3 3×((λz.1+ z)2))x = 1,t = 3,y =((λz.1+ z)2)) 3×((λz.1+ z)2))x = 1,t = 3,y =((λz.1+ z)2)),z = 2 3×(1 + 2)x = 1,t = 3,y =((λz.1+ z)2)),z = 2 3 x 3 = 9

这是对的吗?还是我错误地减少了?

2 个答案:

答案 0 :(得分:2)

在表达式

(λx.(λx.λy.x × y) 3 ((λz.x + z) 2)) 1

你正确地改写为

(λx.(λt.λy.t × y) 3 ((λz.x + z) 2)) 1

x变量与外部lambda抽象λx绑定 实际上,术语(λx.λy.x × y) 3的减少不可能改变术语(λz.x + z),因为它在redex树的另一个分支中。

这本书明确指出15是错误的结果

给出的示例是反例,如果懒惰评估被天真地实施,会发生什么。

懒惰的评估在理论上是由normal order实现的,但这只是一个理论上的结构,有一些实际的缺点。
因此,使用 call-by-need 等策略。

本书只是想展示所述评估策略的可能,抽象的实现。

作为参考,这里使用表达式的正常顺序完全减少。

(\x.(\x.\y.x * y) 3 ((\z.x + z) 2)) 1


          ()
         /  \
       \x    1
        | 
       ()
      /   \
    ()     ()
   /  \   /  \
 \x    3 \z   2
  |       |
 \y       +
  |      x z
  *
 x y



---------------------------------------

(\x.\y.x * y) 3 ((\z.1 + z) 2)


       ()
      /   \
    ()     ()
   /  \   /  \
 \x    3 \z   2
  |       |
 \y       +
  |      1 z
  *
 x y


---------------------------------------


\y.3 * y ((\z.1 + z) 2)


       ()
      /   \
    .'     ()
   /      /  \
 \y      \z   2
  |       |
  *       +
 3 y     1 z

---------------------------------------


3 * ((\z.1 + z) 2)


     *
   /  \
  3   ()
     /  \
    \z   2
     |
     +
    1 z


---------------------------------------


3 * (1 + 2)


     *
   /  \
  3   1 + 2

---------------------------------------

3 * 3

  *
 / \
3   3

---------------------------------------

9 

答案 1 :(得分:2)

@MargaretBloom's tree visualization is awesome, and yes, the book is just demonstrating a potential pitfall.

I'll provide this as just another way to see the reductions.

(λx.(λx.λy.x × y) 3 ((λz.x + z) 2)) 1   →β x + z [x := 1]
(λx.(λx.λy.x × y) 3 ((λz.1 + z) 2)) 1
(λx.λy.x × y) 3 ((λz.1 + z) 2)          →β x × y [x := 3]
(λx.λy.3 × y) 3 ((λz.1 + z) 2)
(λy.3 × y) ((λz.1 + z) 2)               →β 3 × y [y := ((λz.1 + z) 2)]
(λy.3 × ((λz.1 + z) 2)) ((λz.1 + z) 2)
3 × ((λz.1 + z) 2)                      →β 1 + z [z := 2]
3 × ((λz.1 + 2) 2)
3 × (1 + 2)                             →β 1 + 2 [ 1 + 2 := 3 ]
3 × 3                                   →β 3 × 3 [ 3 × 3 := 9 ]
9