Lambda演算中的相关性

时间:2010-06-20 20:07:06

标签: lambda-calculus associativity

我正在研究书The Lambda calculus的练习题。我被困的一个问题是证明以下内容: 表明应用程序不是关联的;实际上,x(yz)不等于(xy)z

以下是我迄今为止所做的工作:

Let x = λa.λb. ab
Let y = λb.λc. bc
Let z = λa.λc. ac

(xy)z => ((λa.λb. ab) (λb.λc. bc)) (λa.λc. ac)    
=> (λb. (λb.λc. bc) b) (λa.λc. ac)    
=> (λb.λc. bc) (λa.λc. ac)    
=> (λc. (λa.λc. ac) c)

x(yz) => (λa.λb. ab) ((λb.λc. bc) (λa.λc. ac))    
=> (λb. ((λb.λc. bc) (λa.λc. ac)) b)    
=> (λb. (λc. (λa.λc. ac) c) b)

这是对的吗?请帮我理解。

4 个答案:

答案 0 :(得分:3)

我也认为你的反例是正确的 您可能会得到一个更简单的反例:

  

x =λa.n y z 变量:

     

(xy)z => ((λa.n)y)z => n z
  x(yz)=> (λa.n)(y z)=> Ñ

答案 1 :(得分:1)

这些推导看起来很好,一目了然。

从概念上讲,只要认为x,y和z可以表示任何可计算的函数,显然,其中一些函数不是关联的。比方说,x是'减去2',y是'除以2',z是'双精度'。对于此示例,x(yz)='减去2'和(xy)z ='减去1'。

答案 2 :(得分:1)

似乎没问题,但为简单起见,如何通过矛盾来证明?

假设(xy)z = x(yz),并且让

x = λa.λb. a     # x = const
y = λa. -a       # y = negate
z = 1            # z = 1

并表明((xy)z)0≠(x(yz))0。

答案 3 :(得分:0)

Barendregt提到的这本书是非常正式和精确的(一本好书),所以准确地说出这个练习是很好的。

我想实际的目标是找到x,y和z的实例化 x(y z)减少到布尔值true = \ xy.x和(x y)z减少到布尔值false = \ xy.y

然后,您可以采取例如x = \ z.true和z = I = \ z.z(y任意)。

但是我们怎样才能证明真假不可以假?你没有办法在微积分中证明它,因为你没有否定:你只能证明平等而不是不平等。但是,让我们观察一下,如果true = false,那么所有术语都是相等的。

实际上,对于任何M和N,如果true = false则

                         true M N = false M N

但是真正的M N减少到M,而假M N减少到N,所以

                              M = N

因此,如果true = false,则所有术语都相等,并且微积分将是微不足道的。既然我们找不到lambda演算的琐碎模型,那就没有了 模型可以等同于真与假(更一般地说,可能将术语与不同的正规形式等同起来,这需要我们谈论bohm-out技术)。