我了解一个 教堂数字 $ c_n $看起来像$ lambda s。 lambda z。 s $(... n次...)$ s ; z $。这无非就是“函数$ s $应用于函数$ z $”。

$ mathtt {times} $函数的可能定义是:$ mathtt {times} = lambda m。 lambda n。 lambda s。 m ; (n ; s)$。看着身体,我了解功能背后的逻辑。但是,当我开始评估时,我会卡住。我将以一个示例来说明它:

$$ begin {align*}( lambda m。 lambda n。 。 ( lambda s。 lambda zs ; s ; z); (( lambda s。 ( lambda s。 lambda zs ; s ; z); ( lambda zs ; s ; s ; z) to^*& lambda s。 lambda z。( lambda zs ; s ; s ; z);( lambda zs ; s ; s ; s ; s ; z);

现在,在这种情况下,如果我首先应用$( lambda zs ; s ; s ; z); z $,我将获得所需的结果。但是,如果我应用$( lambda zs ; s ; s ; s ; z);( lambda zs ; s ; s ; s ; s ; z)$首先,因为应用程序是从左边关联的,我的结果错误:

$ lambda s。 lambda z。( lambda zs ; s ; s ; z);( lambda zs ; s ; s ; s ; s ; z); z to lambda s。 lambda z。(s ; s ; s ;( lambda zs ; s ; s ; s ; z))

我不能再减少这一点。我究竟做错了什么?结果应为$ lambda s。 lambda zs ; s ; s ; s ; s ; s ; z $

有帮助吗?

解决方案

我认为您的减少是正确的(尽管我只关注它)。最后,您不能将$( lambdaz。sssz)$应用于$ z $,这在学期中从未出现。 $ lambda z。 ffz $是$ lambda z。 (ff)z $,而不是$ lambda z。 f(fz)$。 lambda-calculus中的函数有一个参数。他们有效 咖喱: :两项函数的功能被实现为一个单词函数,该函数采用第一个参数并返回一个新的单一词汇函数,该函数获取第二个参数并返回结果。

定义教堂数字时,您犯了同样的错误。 $ n $的教堂数字基于构成功能$ n $ times。 “功能$ s $应用于函数$ z $的$ n $ times” $ lambda s。 lambda z。 S(S(…S :Z)…))$。您写的是函数$ s $应用于函数$ s $的$ n-1 $ times,最后是$ z $,这并不是一个有用的术语。

$ 2 times 3 $因此是$( lambda mns。m(ns))( lambda sz。S。S(s :z))( lambda sz。S。S(s(s :z))) $。我会让您检查它的确会减少到$ lambda s z。 s(s(s(s(s :z)))))$。

许可以下: CC-BY-SA归因
不隶属于 cs.stackexchange
scroll top