【发布时间】: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