2012-11-24 32 views
1

我正在嘗試實施教會對Lambda Calc。風格與CLisp。Lambda微積分CONS對利用Lisp實現

維基百科據:

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

到目前爲止,這是我的代碼:

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

這是我的第一和第二功能:

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

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

這兩個功能的轉換Int to 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 

我看不到我在做什麼錯。任何幫助,將不勝感激。

感謝

回答

2
  1. 您使用#'FIRST
    這意味着它首先使用函數而不是您定義的變量。 FIRST(來自標準庫)是car的另一個名稱,即它返回列表的第一個元素(因此錯誤是因爲P不是列表)。
    修復:#'(lambda (p) (funcall (p TRUE)))
    這意味着:返回lambda函數與單個參數p(funcall FIRST P)
    這將導致錯誤*** - EVAL: undefined function P

  2. 這是由您的FIRST定義造成的。該參數被忽略。請改爲將全局函數p作爲參數傳遞變量TRUE的值:(p TRUE)。然後調用p的結果作爲(另一個)函數:(funcall ...)
    修復:#'(lambda (p) (funcall p TRUE))
    這將導致錯誤*** - :LAMBDA: variable TRUE has no value

  3. 那是因爲你還沒有真正定義TRUEFALSE呢。
    修復:定義TRUEFALSE

+0

謝謝,我忘了在帖子中包含TRUE和FALSE的定義,但它們是在我的代碼中實現的 – Ivan