1

Church Pair Lambda Calc を実装しようとしています。CLIsp を使用したスタイル。

ウィキペディアによると:

pair ≡ λx.λy.λz.z x y

これまでのところ、これは私のコードです:

 (defvar PAIR
         #'(lambda(x)
                 #'(lambda(y)
                         #'(lambda(z)
                                 (funcall (funcall z x) y)))) )

これらは私のFIRSTとSECOND関数です:

(defvar FIRST
        #'(lambda(p)
                (funcall(p TRUE)))
)

(defvar SECOND
        #'(lambda(p)
                (funcall(p FALSE)))
)

この 2 つの関数は Int から ChurchNumber に変換します

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

)

だから、私がすることは次のとおりです。

(setq six (int2church 6))
(setq four (int2church 4))

その後:

(setq P (funcall (funcall PAIR six) four))

そして、私が持っている:

#<FUNCTION :LAMBDA (Y) (FUNCALL (FUNCALL F X) Y)>

だから私がこれを行うと:

(funcall #'FIRST P)

私はこのエラーを持っています:

*** - FIRST: #<FUNCTION :LAMBDA (Y) (FUNCALL (FUNCALL F X) Y)> is not a list

何が間違っているのかわかりません。どんな助けでも大歓迎です。

ありがとう

4

1 に答える 1

3
  1. を使用しています#'FIRST
    つまり、定義した変数ではなく、関数FIRSTを使用しているということです。FIRST(標準ライブラリから)はの別名ですcar。つまり、リストの最初の要素を返します(したがって、リストではないというエラーが表示Pされます)。
    修正:(funcall FIRST P)
    エラーが発生します*** - EVAL: undefined function P

  2. これは、次の定義が原因です。これが意味することFIRST#'(lambda (p) (funcall (p TRUE)))
    単一のパラメーターを持つラムダ関数を返しますp。そのパラメーターは無視されます。代わりに、変数の値を引数としてp渡すグローバル関数を呼び出します。次に、 as(別の)関数の結果を呼び出します。 修正: エラーが発生しますTRUE(p TRUE)p(funcall ...)
    #'(lambda (p) (funcall p TRUE))
    *** - :LAMBDA: variable TRUE has no value

  3. これは、実際にはまだ定義TRUEしていないためですFALSE
    修正:定義TRUEFALSE

于 2012-11-24T02:22:30.763 に答える