2012-11-22 5 views
1

Je suis très nouveau avec la programmation fonctionnelle, le lisp et le calcul lambda. Im essayant d'implémenter l'opérateur AND avec le style Common Lisp Lambda Calc.Lambda Calculus ET Implémentation dans CLISP

de Wikipédia:

ET: = λp.λq.pqp

Jusqu'à présent, voici mon code:

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

Je trouve cette 2 fonctions de conversion:

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

) 

Si je fais:

(church2int FALSE) 

J'ai 0. Si je fais ceci:

(church2int TRUE) 

J'ai

#<FUNCTION :LAMBDA (X) (+ X 1)> 

Ce que je pense qu'il est ok. Mais si je fais ceci:

(church2int (OPAND FALSE FALSE)) 

J'ai:

#<FUNCTION :LAMBDA (Q) (FUNCALL P (FUNCALL Q (FUNCALL P)))> 

Là où je devrais avoir 0. Y at-il quelque chose de mal avec mon code? Ou est-ce que je manque quelque chose?

Merci

Répondre

2

Si vous souhaitez définir opand en fonction de 2 paramètres, comme vous essayez de, vous devez faire ceci:

(defun OPAND (p q) 
    (funcall (funcall p q) p)) 

puis:

(opand false false) 
#<FUNCTION :LAMBDA (X) #'(LAMBDA (Y) Y)> ;; which is FALSE 

(opand true true) 
#<FUNCTION :LAMBDA (X) #'(LAMBDA (Y) X)> ;; which is TRUE 

Ceci est ma mise en œuvre, basée sur le papier original http://www.utdallas.edu/~gupta/courses/apl/lambda.pdf, de l'opérateur andλxy.xyF

(defvar OPAND 
    #'(lambda(x) 
     #'(lambda(y) 
      (funcall (funcall x y) FALSE)))) 

Et si vous

(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