在阅读了之前的答案(好的答案)之后,我想给出我自己对此事的看法,希望它对某人有所帮助(欢迎指正)。我会举个例子。
首先,我想在定义中添加一些括号,让我更清楚地了解一切。让我们将给定的公式重新定义为:
PRED := λn λf λx.(n (λgλh.h (g f)) (λu.x)) (λu.u)
我们还定义三个有助于示例的 Church 数字:
Zero := λfλx.x
One := λfλx. f (Zero f x)
Two := λfλx. f (One f x)
Three := λfλx. f (Two f x)
为了理解它是如何工作的,让我们首先关注公式的这一部分:
n (λgλh.h (g f)) (λu.x)
从这里,我们可以得出以下结论:
n是教会数字,要应用的函数是λgλh.h (g f),起始数据是λu.x
考虑到这一点,让我们尝试一个示例:
PRED Three := λf λx.(Three (λgλh.h (g f)) (λu.x)) (λu.u)
我们首先关注数字的减少(我们之前解释过的部分):
Three (λgλh.h (g f)) (λu.x)
简化为:
(λgλh.h (g f)) (Two (λgλh.h (g f)) (λu.x))
(λgλh.h (g f)) ((λgλh.h (g f)) (One (λgλh.h (g f)) (λu.x)))
(λgλh.h (g f)) ((λgλh.h (g f)) ((λgλh.h (g f)) (Zero (λgλh.h (g f)) (λu.x))))
(λgλh.h (g f)) ((λgλh.h (g f)) ((λgλh.h (g f)) ((λfλx.x) (λgλh.h (g f)) (λu.x)))) -- Here we lose one application of f
(λgλh.h (g f)) ((λgλh.h (g f)) ((λgλh.h (g f)) (λu.x)))
(λgλh.h (g f)) ((λgλh.h (g f)) (λh.h ((λu.x) f)))
(λgλh.h (g f)) ((λgλh.h (g f)) (λh.h x))
(λgλh.h (g f)) (λh.h ((λh.h x) f))
(λgλh.h (g f)) (λh.h (f x))
(λh.h ((λh.h (f x) f)))
结束:
λh.h f (f x)
所以,我们有:
PRED Three := λf λx.(λh.h (f (f x))) (λu.u)
再次减少:
PRED Three := λf λx.((λu.u) (f (f x)))
PRED Three := λf λx.f (f x)
正如您在缩减中看到的那样,由于使用函数的巧妙方式,我们最终减少了一次函数的应用。
使用 add1 作为f 和 0 作为x,我们得到:
PRED Three add1 0 := add1 (add1 0) = 2
希望这会有所帮助。