如何在lambda演算中实现LISP的“EQ”?

时间:2014-01-09 01:49:55

标签: lisp lambda-calculus

我现在正在学习lambda演算并发现它非常漂亮和有趣,但我还没有找到如何实现LISP的EQ原语,它判断两个符号是否相同。

我找到了许多用于实现整数运算(使用Church Numbers)和布尔逻辑的材料,但未能找到EQ的解决方案。我希望EQ能像这样工作(与LISP相同):

(EQ x x) --> True
(EQ x y) --> False
(EQ (x y) (x y)) --> False // return true only for simple symbols, not structures

任何帮助。


更新

我不介意将符号包装到某些上下文中,例如:

(EQ (lambda u . u symbol x) (lambda u . u symbol x)) --> True
(EQ (lambda u . u symbol x) (lambda u . u symbol y)) --> False

我找到了一个可能的解决方案:

如果我们限制有限集中的符号,例如Symbols = {A, B, C},那么我们可以像这样定义EQ

A = λ A B C. A
B = λ A B C. B
C = λ A B C. C
EQ = λ x y. ChurchEQ (x 1 2 3) (y 1 2 3)    // Here 1, 2, 3 should be replaced by Church Numbers

我已经在解释器中测试了这些代码,但它确实有效。

但仍存在一个问题: EQ本身无法放入Symbols

1 个答案:

答案 0 :(得分:4)

无法在lambda演算中为任意项定义一般概念。根据实现,EQ被定义为语法相等(可能高达α等价)或指针相等,它们必须在解释器的实现中定义,而不是在语言本身中定义。

也就是说,有许多特定 lambda表达式(即教堂数字,教堂布尔)的情况,其中有一个定义明确的决策程序,当然在lambda演算中编码,就像它可以用任何语言编码一样。例如布尔值:

T = λ x y. x
F = λ x y. y
not = λ p. p F T
xor = λ p q. p (q F T) q
equ = λ p q. not (xor p q)