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的惰性评估功能来完成。非常好!作为你自己问题的答案发布。