Я очень новичок в функциональном программировании, lisp и лямбда-исчислении. Im пытается реализовать оператор AND с использованием Common Lisp Lambda Calc style.Lambda Calculus AND Implementation в CLISP
Материал из Википедии:
И: = λ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. Есть ли что-то случилось с моим кодом? Или я чего-то не хватает?
Благодаря