【发布时间】:2012-11-24 21:19:39
【问题描述】:
我正在尝试使用 clisp Lambda Calc 实现除法函数。风格
我从this 网站读到,除法的 lambda 表达式是:
Y (λgqab.LT a b (PAIR q a) (g (SUCC q) (SUB a b) b)) 0
这些是正确的和错误的
(defvar TRUE #'(lambda(x)#'(lambda(y)x)))
(defvar FALSE #'(lambda(x)#'(lambda(y)y)))
这些是 Int 和 Church 数字之间的转换函数
(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))
)))))
)
PAIR、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 可以正常工作):
(函数调用第一个 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 个
我认为问题出在 DIVISION 函数中,在 IF-THEN-ELSE 之后,我尝试稍微更改它(我认为这是一个嵌套括号问题)但我得到了很多错误。
任何帮助将不胜感激
谢谢
【问题讨论】:
标签: lisp common-lisp lambda-calculus