Lambda微积分与LISP中的实现

时间:2012-11-22 20:07:22

标签: lisp lambda-calculus

我是函数式编程,lisp和lambda演算的新手。我试图用Common Lisp Lambda Calc风格实现AND运算符。

来自维基百科:

  

AND:=λp.λq.pqp

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

(defvar TRUE #'(lambda(x)#'(lambda(y)x)))
(defvar FALSE #'(lambda(x)#'(lambda(y)y)))

(defun OPAND (p q)
    #'(lambda(f) 
        #'(lambda(p) #'(lambda(q) (funcall p (funcall q(funcall p))))))
)

我找到了这2个转换函数:

(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))))))

)

如果我这样做:

(church2int FALSE)

我有0.如果我这样做:

(church2int TRUE)

我有

#<FUNCTION :LAMBDA (X) (+ X 1)>

我觉得没关系。但如果我这样做:

 (church2int (OPAND FALSE FALSE))

我有:

#<FUNCTION :LAMBDA (Q) (FUNCALL P (FUNCALL Q (FUNCALL P)))>

我应该拥有0.我的代码有问题吗?或者我错过了什么?

由于

1 个答案:

答案 0 :(得分:2)

如果您想将opand定义为具有2个参数的函数,就像您尝试的那样,您需要这样做:

(defun OPAND (p q)
    (funcall (funcall p q) p) )

然后:

(opand false false)
#<FUNCTION :LAMBDA (X) #'(LAMBDA (Y) Y)> ;; which is FALSE

(opand true true)
#<FUNCTION :LAMBDA (X) #'(LAMBDA (Y) X)> ;; which is TRUE

这是我基于and运算符λxy.xyF的原始论文http://www.utdallas.edu/~gupta/courses/apl/lambda.pdf的实现

(defvar OPAND 
    #'(lambda(x) 
        #'(lambda(y) 
            (funcall (funcall x y) FALSE) ) ) )

如果你这样做

(funcall (funcall opand false) false)
#<FUNCTION :LAMBDA (X) #'(LAMBDA (Y) Y)> ;; which is FALSE

(funcall (funcall opand true) true)
#<FUNCTION :LAMBDA (X) #'(LAMBDA (Y) X)> ;; which is TRUE