1

私は関数型プログラミング、Lisp、ラムダ計算に非常に慣れていません。Common Lisp Lambda Calc スタイルで AND 演算子を実装しようとしています。

ウィキペディアから:

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

0 が必要な場所。コードに何か問題がありますか? または、何か不足していますか?

ありがとう

4

1 に答える 1

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
于 2012-11-23T00:41:07.720 に答える