Recursion scheme中church数词的递归
根据维基百科的定义,我已经在教堂数字上定义了教堂数字零和其他一些标准函数,如下所示:Recursion scheme中church数词的递归,recursion,scheme,lambda-calculus,church-encoding,Recursion,Scheme,Lambda Calculus,Church Encoding,根据维基百科的定义,我已经在教堂数字上定义了教堂数字零和其他一些标准函数,如下所示: (define n0 (λ (f x) x)) (define newtrue (λ(m n) m)) (define newfalse (λ(m n) n)) (define iszero (λ(m) (m (λ(x) newfalse) newtrue))) (define ifthenelse (λ(a b c) (a b c))) 使用这些,我编写了一个递归循环,如下所示: (
(define n0 (λ (f x) x))
(define newtrue
(λ(m n) m))
(define newfalse
(λ(m n) n))
(define iszero
(λ(m) (m (λ(x) newfalse) newtrue)))
(define ifthenelse
(λ(a b c) (a b c)))
使用这些,我编写了一个递归循环,如下所示:
(((λ(r) (λ(n) (ifthenelse (iszero n) n ((r r) n))))
(λ(r) (λ(n) (ifthenelse (iszero n) n ((r r) n))))) n0)
现在对于如上所述的参数n0
,它应该返回n0
,而不进入递归。但事实并非如此。为什么?
注1:此递归循环适用于普通数字和普通函数:
(((λ(r) (λ(n) (if (= 0 n) n ((r r) n))))
(λ(r) (λ(n) (if (= 0 n) n ((r r) n))))) 0)
这将返回它应该返回的0
注2:函数
如果另一个
,为零
,newtrue
,newfalse
本身也可以正常工作。循环的原因是Scheme中函数的语义总是对其所有参数求值
在第二个示例中:
(((λ(r) (λ(n) (if (= 0 n) n ((r r) n))))
(λ(r) (λ(n) (if (= 0 n) n ((r r) n))))) 0)
您使用的是if
,这是一种特殊形式,如果条件为true,则不计算第三个参数。因此,它计算(=0n)
,并立即返回0
,因为条件是#true
,而不计算第三个参数((r)n)
相反,在第一个示例中:
(((λ(r) (λ(n) (ifthenelse (iszero n) n ((r r) n))))
(λ(r) (λ(n) (ifthenelse (iszero n) n ((r r) n))))) n0)
如果ELSE
是一个函数,那么根据Scheme的求值规则,它的所有参数都会被求值,包括((r)n)
,这会导致一个无休止的循环。你能建议如何让我的如果其他像平常的那样工作吗?Lisp语言的求值规则并不完全等同于lambda演算的Beta约简规则,所以据我所知,你想做的是不可能的。万岁!能够使用scheme的惰性评估功能来完成。非常好!作为你自己问题的答案发布。