我现在正在学习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
。
答案 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)