我正在研究书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)
这是对的吗?请帮我理解。
答案 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技术)。