2012-11-22 90 views
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是不是有什麼錯我的代碼?或者我錯過了什麼?

感謝

回答

2

如果要定義opand作爲函數有兩個參數,就像你正在嘗試,你需要這樣做:

(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