2012-11-22 2 views
1

저는 함수 프로그래밍, lisp 및 람다 미적분학에 대한 새로운 기능을 제공합니다. 임 일반 Lisp 람다 Calc 스타일로 AND 연산자를 구현하려고.CLAMS의 람다 미적분 및 구현

위키

:

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

I가 0이 있어야합니다 어디에 내 코드에 문제가 있나요? 또는 나는 무엇인가 놓치고 있냐?

덕분에 당신은 당신이하려고하는 것처럼, 당신은이 작업을 수행 할 필요가,이 매개 변수와 함수로 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.pdf을 기반으로 한 and 연산자 λxy.xyF

0123의 구현입니다.
(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