lambda calculus xor expression by true false

时间:2017-10-17 07:40:56

标签: functional-programming xor church-encoding

我试图在lambda演算的上下文中理解xor。我理解https://en.wikipedia.org/wiki/Exclusive_or中的xor(Exclusive或)作为布尔逻辑运算 和xor的真值表。

但是为什么它是真的如xor b =(a)((b)(false)(true))(b) 来自http://safalra.com/lambda-calculus/boolean-logic/ 这确实是lambda演算所期望的。当我看到 真正=λab.a 假=λab.b 我有点必须看到true和false作为lambda calc true和false,因为它返回第一个元素,如果是true。但是理解这里的xor也是一个名字但是与布尔逻辑中的xor不同是正确的吗?

2 个答案:

答案 0 :(得分:7)

直观地说,我们可以将A XOR B视为

  1. 如果是A,那么 B
  2. 否则,B
  3. ....或某些伪代码:

    func xor (a,b)
      if a then
        return not b
      else
        return b
    

    让我们得到lambda calculusing

    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(请注意,这有点愚蠢,因为truefalse已经表现得像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)

    但是当然引入了额外的自由变量falsetrue - 你可以用一些额外的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
    

答案 1 :(得分:0)

考虑a(b F T)b,中间表达式本质上是(not b),所以a(not b)b仅在a和b不同时才为真。