寻找教会编码(lambda演算)来定义< ,> ,!=

时间:2013-12-11 15:48:23

标签: functional-programming scheme lisp lambda-calculus church-encoding

我必须为>创建一些Lambda函数。 ,<和!=

我不知道如何,有人可以帮助我吗? PS:我们刚开始使用Lambda Calculus,所以请不要假设任何先前的知识。

感谢您的期待!

修改 - 我的意思是Arithmetic in Lambda Calculus

编辑2 - 更准确:寻找教会编码(lambda calculus)来定义< , > , !=


编者注::我认为这是OP试图提出的问题:

我正在尝试使用Church编码在无类型lambda演算中实现以下操作:

  1. 大于(GT>)。
  2. 小于(LT<)。
  3. 不等于(NE!=)。
  4. 我已经知道如何实现以下内容:

    1. 布尔值为true(TRUEλx.λy.x)。
    2. 布尔值false(FALSEλx.λy.y)。
    3. 逻辑和(ANDλp.λq.p q p)。
    4. 逻辑或(ORλp.λq.p p q)。
    5. 不是逻辑(NOTλp.λa.λb.p b a)。
    6. 您如何在无类型lambda演算中编写GTLTNE函数?

3 个答案:

答案 0 :(得分:4)

使用Greg Michaelson的"An Introduction To Functional Programming Through Lambda Calculus"

开始
  

第4.8.3节。比较

     

有许多方法可以定义数字之间的相等性。一   方法是注意两个相等数字之间的差异是   零。但是,如果我们从较小的数字中减去一个数字,我们也会   得到零所以我们需要找到它们之间的绝对差异;该   差异无论比较顺序如何。找到绝对的   两个数字之间的差异,加上第一个之间的差异   第二个和第二个之间的区别:

     

def abs_diff x y = add(sub x y)(sub y x)

     

如果它们都相同则绝对差值将为零   因为从另一个中取出每个的结果将为零。如果   首先是大于第二个,那么绝对差异将是   第一个减去第二个,因为第二个减去第一个   零。同样,如果第二个大于第一个那么   差异将是第二个减去第一个因为第一个减去   第二个是零。

     

因此,我们可以定义:

     

def等于x y = iszero(abs_diff x y)

     

我们也可以使用减法来定义算术不等式。对于   例如,如果减去第二个,则数字大于另一个数字   从第一个开始给出一个非零结果:

     

def greater x y = not(iszero(sub x y))

在后面的练习部分中定义了较少的部分。

  

def less x y =更大的y x

现在使用链接中的书籍找到所有从属函数,您将拥有=,&gt;,&lt;。虽然这本书没有定义!=它应该是显而易见的。

编辑

WillNess的评论

  

4.8.2。减法

     

要找到两个数字之间的差异,请在减少两个数字后找到数字之间的差异。数字和零之间的差异是数字:

     

rec sub x y =
    如果iszero y
    那么x
    else sub(pred x)(pred y)

请注意"Now using the book in the link just find all of the subordinate functions".

我不计划搜索所有从属函数并在此列出它们,因为它们会在这里重新创建许多函数。我已经阅读并完成了本书的部分内容,而且非常全面,我并不缺乏信息。

答案 1 :(得分:1)

您还需要实现自然数。这就是你要编写比较算子的原因,不是吗。

我认为我记得自然数的实现。数字 n 表示为函数 f 和值 x ,并应用 f x

zero = λf . λx . x
succ = λn . λf . λx . n f (f x)

答案 2 :(得分:1)

关于教会编码的维基百科文章有predicates部分涵盖EQLEQ