1

我对函数式编程、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))))))
)

我发现了这两个转换函数:

(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。我的代码有问题吗?还是我错过了什么?

谢谢

4

1 回答 1

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

这是我的实现,基于运营商的原始论文http://www.utdallas.edu/~gupta/courses/apl/lambda.pdfandλxy.xyF

(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
于 2012-11-23T00:41:07.720 回答