直观地,我们可以将 A XOR B 视为
- 如果是A,那么不是B
- 否则,B
....或在一些伪代码中:
func xor (a,b)
if a then
return not b
else
return b
让我们进行 lambda 计算
true := λa.λb.a
false := λa.λb.b
true a b
// a
false a b
// b
接下来我们会做not
not := λp.p false true
not true a b
// b
not false a b
// a
我们可以做if
下一步(注意,这有点愚蠢,因为true
并且false
已经表现得像if
)
if := λp.λa.λb.p a b
if true a b
// a
if false a b
// b
好的,最后写xor
xor := λa.λb.if a (not b) b
(xor true true) a b
// b
(xor true false) a b
// a
(xor false true) a b
// a
(xor false false) a b
// b
记住if
这里有点笨,我们可以删除它
xor := λa.λb.a (not b) b
现在,如果我们想用纯 lambda 编写它,只需将其替换为not
它的定义
xor := λa.λb.a (not b) b
->β [ not := λp.p false true ]
xor := λa.λb.a ((λp.p false true) b) b
->β [ p := b ]
xor := λa.λb.a (b false true) b
此时,您可以看到我们从您的问题中得到了定义
a xor b = (a)((b)(false)(true))(b)
但当然,这引入了额外的自由变量false
,并且true
您可以用一些额外的 beta 减少来替换这些变量
xor := λa.λb.a (b false true) b
->β [ false := (λa.λb.b) ]
xor := λa.λb.a (b (λa.λb.b) true) b
->β [ true := (λa.λb.a) ]
// pure lambda definition
xor := λa.λb.a (b (λa.λb.b) (λa.λb.a)) b