1
我對函數式編程,lisp和lambda微積分很新穎。我試圖用Common Lisp Lambda Calc風格實現AND運算符。Lambda微積分與CLISP中的實現
維基百科:
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是不是有什麼錯我的代碼?或者我錯過了什麼?
感謝