2012-11-22 2 views
1

Я очень новичок в функциональном программировании, 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. Есть ли что-то случилось с моим кодом? Или я чего-то не хватает?

Благодаря

ответ

2

Если вы хотите определить 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

(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 

 Смежные вопросы

  • Нет связанных вопросов^_^