我是函数式编程,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.我的代码有问题吗?或者我错过了什么?
由于
答案 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