首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Lisp实现Lambda演算对对

用Lisp实现Lambda演算对对
EN

Stack Overflow用户
提问于 2012-11-24 02:03:05
回答 1查看 747关注 0票数 1

我在试着实现一对教会伙伴兰博达加州大学。CLisp风格。

根据维基百科:

双≡λx.λy.λZ.Z x y

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

代码语言:javascript
复制
 (defvar PAIR
         #'(lambda(x)
                 #'(lambda(y)
                         #'(lambda(z)
                                 (funcall (funcall z x) y)))) )

以下是我的第一和第二项职能:

代码语言:javascript
复制
(defvar FIRST
        #'(lambda(p)
                (funcall(p TRUE)))
)

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

这两个函数从Int转换为ChurchNumber

代码语言:javascript
复制
(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))))))

)

所以我要做的是:

代码语言:javascript
复制
(setq six (int2church 6))
(setq four (int2church 4))

然后:

代码语言:javascript
复制
(setq P (funcall (funcall PAIR six) four))

我得到了:

代码语言:javascript
复制
#<FUNCTION :LAMBDA (Y) (FUNCALL (FUNCALL F X) Y)>

所以如果我这么做

代码语言:javascript
复制
(funcall #'FIRST P)

我得到了这个错误:

代码语言:javascript
复制
*** - FIRST: #<FUNCTION :LAMBDA (Y) (FUNCALL (FUNCALL F X) Y)> is not a list

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

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-24 02:22:30

  1. 你在使用#'FIRST。 这意味着它首先使用的是函数,而不是您定义的变量。FIRST (来自标准库)是car的另一个名称,即它返回列表的第一个元素(因此错误抱怨P不是列表)。 Fix:(funcall FIRST P) 这将导致错误*** - EVAL: undefined function P
  2. 这是由您对FIRST#'(lambda (p) (funcall (p TRUE)))的定义造成的。 这意味着:返回一个具有单个参数p的lambda函数。该参数将被忽略。相反,调用全局函数p,将变量TRUE的值作为参数:(p TRUE)传递。然后将p的结果调用为(另一个)函数:(funcall ...)。 Fix:#'(lambda (p) (funcall p TRUE)) 这将导致错误*** - :LAMBDA: variable TRUE has no value
  3. 这是因为您还没有真正定义TRUEFALSE。 Fix:定义TRUEFALSE
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13537622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档