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