我試圖用clisp Lambda Calc實現一個Division功能。風格CLISP Lambda微積分Div執行
我從this站點讀取的分割的lambda表達式爲:(。λgqabLT AB(PAIR QA)(克(SUCC Q)(SUB AB)b))的
ÿ0
這些真假
(defvar TRUE #'(lambda(x)#'(lambda(y)x)))
(defvar FALSE #'(lambda(x)#'(lambda(y)y)))
這些是int和教會之間的數字轉換功能
(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))))))
)
這是我的IF-THEN-ELSE實施
(defvar IF-THEN-ELSE
#'(lambda(c)
#'(lambda(x)
#'(lambda(y)
#'(lambda(acc1)
#'(lambda (acc2)
(funcall (funcall (funcall (funcall c x) y) acc1) acc2))))))
)
,這是我的div實現
(defvar division
#'(lambda (g)
#'(lambda (q)
#'(lambda (a)
#'(lambda (b)
(funcall (funcall (funcall (funcall (funcall IF-THEN-ELSE LT) a) b)
(funcall (funcall PAIR q)a))
(funcall (funcall g (funcall succ q)) (funcall (funcall sub a)b))
)))))
)
對,SUCC和SUB功能正常工作。我把我的教會人數達到這樣
(set six (int2church 6))
(set two (int2church 2))
然後我做的:
(setq D (funcall (funcall division six) two))
而且我已經有了:
#<FUNCTION :LAMBDA (A)
#'(LAMBDA (B)
(FUNCALL (FUNCALL (FUNCALL (FUNCALL (FUNCALL IF-THEN-ELSE LT) A) B) (FUNCALL (FUNCALL PAR Q) A))
(FUNCALL (FUNCALL G (FUNCALL SUCC Q)) (FUNCALL (FUNCALL SUB A) B))))>
對於我個人理解,這個函數返回一個教會對。如果我嘗試用功能FRST來獲得的第一個元素 (FRST工程確定)是這樣的:
(funcall FRST d)
我有
#<FUNCTION :LAMBDA (B)
(FUNCALL (FUNCALL (FUNCALL (FUNCALL (FUNCALL IF-THEN-ELSE LT) A) B) (FUNCALL (FUNCALL PAR Q) A))
(FUNCALL (FUNCALL G (FUNCALL SUCC Q)) (FUNCALL (FUNCALL SUB A) B)))>
如果我試圖讓與Church2int的int值(Church2int工程確定)是這樣的:
(church2int (funcall frst D))
我有
*** - +:
#<FUNCTION :LAMBDA (N)
#'(LAMBDA (F)
#'(LAMBDA (X)
(FUNCALL (FUNCALL (FUNCALL N #'(LAMBDA (G) #'(LAMBDA (H) (FUNCALL H (FUNCALL G F))))) #'(LAMBDA (U) X)) (LAMBDA (U) U))))>
is not a number
在哪裏我期望能獲得3
我認爲這個問題是在分割功能,在IF-THEN-ELSE後,我試圖改變它一點點(我認爲這是一個嵌套的括號問題),但我有很多錯誤。
任何幫助,將不勝感激
感謝