Functional programming lambda演算的真-假异或表达式
我试图在lambda演算的上下文中理解xor。我把异或(异或)理解为布尔逻辑运算 和xor的真值表 但是为什么它作为xor b=(a)((b)(false)(true))(b)是真的 从…起 这确实是lambda微积分所期望的。当我看到 真=λab.a 假=λab.bFunctional programming lambda演算的真-假异或表达式,functional-programming,xor,church-encoding,Functional Programming,Xor,Church Encoding,我试图在lambda演算的上下文中理解xor。我把异或(异或)理解为布尔逻辑运算 和xor的真值表 但是为什么它作为xor b=(a)((b)(false)(true))(b)是真的 从…起 这确实是lambda微积分所期望的。当我看到 真=λab.a 假=λab.b 我必须将true和false看作lambda calc true和false,因为在true的情况下,它返回第一个元素。但是,这里的xor也是一个名称,但与布尔逻辑中的xor不同,这理解正确吗?直觉上,我们可以将xor B视为 如
我必须将true和false看作lambda calc true和false,因为在true的情况下,它返回第一个元素。但是,这里的xor也是一个名称,但与布尔逻辑中的xor不同,这理解正确吗?直觉上,我们可以将xor 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 := λp.p false true
not true a b
// b
not false a b
// a
下一步我们可以做if
(注意,这有点傻,因为true
和false
的行为已经像if
)
好的,最后写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
记住如果这里的有点傻,我们可以把它去掉
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或b=(a)((b)(假)(真))(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
以a(b F T)b为例,中间表达式本质上是(不是b),因此a(不是b)b仅在a和b不同时才为真。顺便说一下,我假设真=λab.a假=λab.b与真=(λa.b.)a假=(λa.b.)b后者更像是教科书样式lambda演算逻辑与布尔逻辑相同。在lamba演算中,没有值,只有符号(名称)。TRUE不仅是函数,也是描述它的名称。当计算结果为λab.a时,不重要的是它是一个函数,更重要的是它是一个用符号TRUE描述的函数。另请参见:–所有值都是函数,偶数0:=λf.λx.x
,one:=λf.λx.fx
,two:=λf.λx.f(fx)
,etcreated:–很酷的答案显示了从
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