我最近开始研究Lambda微积分作为分配的一部分,我的任务是为逻辑运算符>
编写一个函数,我们使用的语法与this video中所示的语法相同。
允许我们使用基本的数学运算(+,-,/,*)和equals运算符(=),如下所示:
λx.λy.(x - y)
λx.λy.(x = y) TRUE FALSE
我发现this website用小于或等于0并将其与零进行比较来解释它,问题在于负数也不同于零。
有没有办法编写像这样的GT运算符一样工作的Lambda Calculus函数?
我尝试将第二个数字减去第一个数字,然后以某种方式将结果除以自身,这样如果1
可以得到>
,如果-1
可以得到<
但是我总是以<
和>
对数字为负或正。
答案 0 :(得分:0)
我能想到的最好的方法是只使用非负整数,或者允许平方根运算符。
如果您没有使用负数,则可以使用递归(使用Y组合器)对以下函数建模(使用Python语法):
def lt(x, y):
if y == 0:
return False
elif x == 0:
return y != 0
else:
return lt(x - 1, y - 1)
由于这还不错,我让您自己弄清楚Y组合器的应用。如果有任何问题,请随时发表评论。
如果您有负数,我能想到的最好的就是这个。我不会使用lambda微积分符号,因此您可以自己转换这些符号:
ABS(x) = if (x == 0) then 0 else sqrt(x * x)
SIGN(x) = ABS(x) / (x + (x == 0))
LT(x, y) = (-1 == SIGN(x - y))
注意:我很自由地让布尔表达式返回整数1
或0
而不是函数TRUE
或FALSE
,如您发布的Collected Lambdas链接中所示。如果存在问题,则可以编写将TRUE
映射到1
并将FALSE
映射到0
的函数。
如果仅查看LT
的最后一个等式,那么很清楚它为什么起作用。您首先计算x - y
。然后,使用该表达式的符号。如果x - y
-1
为真,则x < y
的符号。
对SIGN
的解释是,当x == 0
时,我们将得到表达式0/1
,这是正确的。如果为x != 0
,则将有|x|/x
,根据-1
的符号,它们将是1
或x
。