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

如何在lambda演算中实现LISP的EQ?,lisp,lambda-calculus,Lisp,Lambda Calculus,我最近在学习lambda微积分,发现它非常漂亮和有趣,但我还没有发现如何实现LISP的EQ原语,它判断两个符号是否相同 我已经找到了许多使用Church数和布尔逻辑实现整数算术的材料,但没有找到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

我最近在学习lambda微积分,发现它非常漂亮和有趣,但我还没有发现如何实现LISP的EQ原语,它判断两个符号是否相同

我已经找到了许多使用Church数和布尔逻辑实现整数算术的材料,但没有找到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
我找到了一个可能的解决方案:

如果我们限制有限集合中的符号,例如,符号={a,B,C},那么我们可以定义如下等式:

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
我已经在一个解释器中测试了这些代码,它是有效的


但有一个问题仍然存在:等式本身不能被放入符号中。

在lambda演算中,没有办法为任意项定义一个通用的相等概念。根据实现的不同,EQ被定义为语法相等(可能高达α-相等)或指针相等,必须在解释器的实现中定义,而不是在语言本身中定义

这就是说,在许多特定的lambda表达式的情况下,例如church数字、church boolean,其中有一个定义良好的判定过程,用于确定等式,这当然可以在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)

在lambda演算中,没有办法为任意项定义一个通用的相等概念。根据实现的不同,EQ被定义为语法相等(可能高达α-相等)或指针相等,必须在解释器的实现中定义,而不是在语言本身中定义

这就是说,在许多特定的lambda表达式的情况下,例如church数字、church boolean,其中有一个定义良好的判定过程,用于确定等式,这当然可以在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)

是的,我知道这些布尔人很管用,但是情商呢?我不介意在某些上下文中包装符号,例如EQ symbol x symbol x.@SaltyEgg LC本身没有符号,根据定义,它只处理值。您也不能在lambda演算本身中定义自由变量和绑定变量的概念。这都是你如何在计算机中实现它的一部分,或者在你使用铅笔和纸时在你的头脑中实现它。@从理论上讲,我可以使用LC实现LISP,但我不知道如何实现,尤其是EQ。我找到了测试教堂数相等的示例,但我不知道如何将符号或字符串转换成教堂的数字。@SaltyEgg相反;您可以在LISP中实现LC。作为LISP一部分的EQ不可还原为LC。LC中没有EQ,因为EQ是指针相等,LC中没有指针。@SaltyEgg问自己如何用图灵机定义EQ,这同样没有意义。我不知道你在想什么,但我猜你误解了一些你听说的关于抽象图灵机和抽象LC可计算等价性的存在性证明,并试图将这个假设属性应用到股票硬件上的具体实现中,这会导致你对LC中可以写什么和不能写什么的错误假设。是的,我知道这些布尔人能行,但情商呢?我不介意在某些上下文中包装符号,例如EQ symbol x symbol x.@SaltyEgg LC本身没有符号,根据定义,它只处理值。您也不能在lambda演算本身中定义自由变量和绑定变量的概念。这都是你如何在计算机中实现它的一部分,或者在你使用铅笔和纸时在你的头脑中实现它。@从理论上讲,我可以使用LC实现LISP,但我不知道如何实现,尤其是EQ。我找到了测试教堂数相等的示例,但我不知道如何将符号或字符串转换成教堂的数字。@SaltyEgg相反;您可以在LISP中实现LC。作为LISP一部分的EQ不可还原为LC。LC中没有EQ,因为EQ是指针相等,LC中没有指针。@SaltyEgg问自己如何用图灵机定义EQ,这同样没有意义。我不知道你在想什么,但我的猜测是,你误解了你所听到的关于抽象图灵机和抽象LC的可计算等价性的一些存在性证明,并且试图将这个假设属性应用到股票硬件上的具体实现中,这会导致你对LC中可以写什么和不能写什么的错误假设。那么会发生什么呢lambda符号。符号1的计算结果是什么?λy.λx.中的等式λu.uxλu.uy应该是什么?那么lambda符号的计算结果是什么。符号1计算为?以及λy.λx.内的等式λu.uxλu.uy应计算为什么?