我必须为>创建一些Lambda函数。 ,<和!=
我不知道如何,有人可以帮助我吗? PS:我们刚开始使用Lambda Calculus,所以请不要假设任何先前的知识。
感谢您的期待!
修改 - 我的意思是Arithmetic in Lambda Calculus
编辑2 - 更准确:寻找教会编码(lambda calculus)来定义< , > , !=
编者注::我认为这是OP试图提出的问题:
我正在尝试使用Church编码在无类型lambda演算中实现以下操作:
GT
或>
)。LT
或<
)。NE
或!=
)。我已经知道如何实现以下内容:
TRUE
或λx.λy.x
)。FALSE
或λx.λy.y
)。AND
或λp.λq.p q p
)。OR
或λp.λq.p p q
)。NOT
或λp.λa.λb.p b a
)。您如何在无类型lambda演算中编写GT
,LT
和NE
函数?
答案 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部分涵盖EQ
和LEQ