【问题标题】:Lambda Calculus CONS Pair implementation with LispLambda Calculus CONS Pair 与 Lisp 的实现
【发布时间】:2012-11-24 02:03:05
【问题描述】:

我正在尝试实现 Church Pair Lambda Calc。使用 CLisp 的样式。

根据维基百科:

pair ≡ λx.λy.λz.z x y

到目前为止,这是我的代码:

 (defvar PAIR
         #'(lambda(x)
                 #'(lambda(y)
                         #'(lambda(z)
                                 (funcall (funcall z x) y)))) )

这些是我的第一个和第二个函数:

(defvar FIRST
        #'(lambda(p)
                (funcall(p TRUE)))
)

(defvar SECOND
        #'(lambda(p)
                (funcall(p FALSE)))
)

这 2 个函数从 Int 转换为 ChurchNumber

(defun church2int(numchurch)
    (funcall (funcall numchurch #'(lambda (x) (+ x 1))) 0)
)

(defun int2church(n)
    (cond
        ((= n 0) #'(lambda(f) #'(lambda(x)x)))
        (t #'(lambda(f) #'(lambda(x) (funcall f
            (funcall(funcall(int2church (- n 1))f)x))))))

)

所以,我要做的是:

(setq six (int2church 6))
(setq four (int2church 4))

然后:

(setq P (funcall (funcall PAIR six) four))

我已经得到了:

#<FUNCTION :LAMBDA (Y) (FUNCALL (FUNCALL F X) Y)>

如果我这样做:

(funcall #'FIRST P)

我遇到了这个错误:

*** - FIRST: #<FUNCTION :LAMBDA (Y) (FUNCALL (FUNCALL F X) Y)> is not a list

我看不出我做错了什么。任何帮助将不胜感激。

谢谢

【问题讨论】:

    标签: lisp lambda-calculus


    【解决方案1】:
    1. 您正在使用#'FIRST
      这意味着它首先使用函数,而不是您定义的变量。 FIRST(来自标准库)是 car 的另一个名称,即它返回列表的第一个元素(因此错误提示 P 不是列表)。
      修复:(funcall FIRST P)
      这将导致错误*** - EVAL: undefined function P

    2. 这是由您对FIRST的定义引起的:#'(lambda (p) (funcall (p TRUE)))
      这意味着:返回一个带有单个参数p 的 lambda 函数。该参数被忽略。相反,调用全局函数p,将变量TRUE 的值作为参数传递:(p TRUE)。然后将p 的结果调用为(另一个)函数:(funcall ...)
      修复:#'(lambda (p) (funcall p TRUE))
      这将导致错误*** - :LAMBDA: variable TRUE has no value

    3. 那是因为您还没有真正定义 TRUEFALSE
      修复:定义 TRUEFALSE

    【讨论】:

    • 谢谢,我忘记在帖子中包含 TRUE 和 FALSE 定义,但它们已在我的代码中实现
    • 特殊答案! (......这就是为什么,女士们,先生们,Scheme 是一个 Lisp-1。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多