Functional programming lambda演算的真-假异或表达式

Functional 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视为 如

我试图在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视为

  • 如果是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 := λ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