gpt4 book ai didi

Lisp IF-THEN-ELSE Lambda Calc 实现

转载 作者:太空宇宙 更新时间:2023-11-03 18:54:52 25 4
gpt4 key购买 nike

我做了这个 IF-THEN-ELSE Lambda 微积分代码

(defvar IF-THEN-ELSE
#'(lambda(con)
#'(lambda(x)
#'(lambda(y)
#'(lambda(acc1)
#'(lambda (acc2)
(funcall (funcall (funcall (funcall con x) y) acc1) acc2))))))
)

(defun IF-THEN-ELSEOP(c x y a1 a2)
(funcall (funcall (funcall (funcall (funcall IF-THEN-ELSE c) x) y) a1) a2)
)

还有这个大于或等于运算符

(defvar GEQ
#'(lambda(p)
#'(lambda(q)
(funcall #'LEQOP q p)))
)

LEQOP 是“小于或等于”的函数,它工作正常。所以当我这样调用 IF-THEN-ELSE 时(“六”和“二”是教堂号码)

(if-then-elseop GEQ six two (print "THIS") (print "THAT"))

作为我的输出

"THIS" 
"THAT"
"THIS"

我传递的两个函数都被调用了。我怎样才能避免它以仅作为输出“THIS”?

我使用的每个函数都会发生这种情况,这很麻烦,因为我想在递归调用中使用 IF-THEN-ELSE,因此必须根据 IF-THEN-ELSE eval 调用一个函数。

任何帮助将不胜感激

谢谢。

最佳答案

通过将它们包装在 lambda 中来传递您的 print 语句应该可行,但也许值得解释为什么这是必要的。

您正在实现 lambda 演算。根据定义,微积分中的所有“事物”都是高阶函数。您的 sixtwo 以及您可能定义的任何其他教堂数字也是高阶函数。

IF-THEN-ELSE 是一个 lambda 抽象(也是一个高阶函数,因为它的“参数”也是函数)。所以这是有效的:

(if-then-elseop GEQ six two one two)

其中 onetwo 是教堂号码。通过这样做,您在 lambda 演算中表达了您在普通 lisp 中的表达方式:

(if (>= 6 2) 
1
2)

但我猜你的目标是:

(if (>= 6 2) 
(print "this")
(print "that"))

(稍后会详细介绍为什么乱用 print 可能会分散您的锻炼注意力)

所以“真正的”1 有一个教会编码 one,我假设您已经定义了它。这样,它就可以应用于 lambda 抽象 IF-THEN-ELSE - 以同样的方式

(>= 6 2)

lisp 世界中计算为 TRUE,您的 lambda 演算实现相同,

((GEQ six) two)

将评估为 TRUE 的 lambda 编码,它再次被编码为高阶函数。

(defvar TRUE #'(lambda (x) #'(lambda (y) x)))
(defvar FALSE #'(lambda (x) #'(lambda (y) y)))

因此要记住的规则是,在 lambda 演算中传递和返回的所有内容都是函数:

 0 := λf.λx.x             
1 := λf.λx.f x
2 := λf.λx.f (f x)
3 := λf.λx.f (f (f x))
... and so on

这就是为什么,如果你这样做了:

(if-then-elseop GEQ six two 
#'(lambda () (print "THIS"))
#'(lambda () (print "THAT")))

应该可以。 (有点,提前阅读)

(不过,我会坚持对 IF-THEN-ELSE 的忠实解释:

(defvar IFTHENELSE 
#'(lambda (p)
#'(lambda (a)
#'(lambda (b) (funcall (funcall p a) b)))))

p 是您的条件...)

作为旁注,值得指出的是,引入 print 和其他在 lambda 演算中“做事”的代码可能没有太大帮助——演算不定义 IO,并且仅限于评估 lambda 表达式。 church 编码是一种将数字编码为 lambda 项 的方法;没有简单而有意义的方式来表示一个有副作用的语句,例如作为 lambda 项的 (print "hello")#'(lambda () (print "THIS")) 有效,但作为一项学术练习,最好坚持只评估事物并获得结果。

lisp 本身 怎么样? lisp 中的 if 不是函数,因此 (if cond then-expr else-expr) 以您期望的方式工作(即,只有 then-expr 之一else-expr 实际上会被计算)因为它是一种特殊形式。如果您要定义自己的宏,则需要一个(如@wvxvw 正确建议的那样)。但这是另一个话题。

关于Lisp IF-THEN-ELSE Lambda Calc 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13547640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com