教会对自然数字的数字编码是否不必要地复杂化?

时间:2012-01-16 00:34:37

标签: language-agnostic sicp lambda-calculus church-encoding

计算机程序的结构和解释我一直在阅读的书通过定义零和增量函数来呈现教会数字

zero: λf. λx. x
increment: λf. λx. f ((n f) x)

这对我来说似乎很复杂,我花了很长时间才弄清楚它并导出一个(λf.λx. f x)和两个(λf.λx. f (f x))。

以这种方式编码数字会不会更简单,零是空的lambda?

zero: λ
increment: λf. λ. f

现在导出一个(λ. λ)和两个(λ. λ. λ)是微不足道的,依此类推。

这似乎是用lambda表示数字的更直接明显和直观的方式。这种方法是否存在一些问题,因此教会数字的工作原理是一个很好的理由?这种方法是否已经得到证实?

2 个答案:

答案 0 :(得分:8)

您的编码(零:λx.x,一个:λx.λx.x,两个:λx.λx.λx.x等)可以很容易地定义增量和减量但除此之外,它变得相当棘手为您的编码开发组合器。例如,您将如何定义isZero

考虑教会编码的直观方式是数字n由迭代n次的动作表示。这样就可以通过使用数字中编码的迭代来轻松开发像plus这样的组合器。不需要花式组合器进行递归。

在Church编码中,每个数字都有相同的接口:它有两个参数。在编码中,每个数字都由它所采用的参数数量来定义,这使得统一操作非常棘手。

编码数字的另一种方法是将数字视为n = 0 | S n,并使用香草编码进行联合。

答案 1 :(得分:0)

建议的数字语法在lambda演算中无效,而教会数字在lambda演算中确实是有效的结构。这就是为什么教会数字就是这样的可能原因 - 数字编码必须遵循lambda演算'definition,这也允许在lambda演算(例如增量)中定义的进一步操作超过编码的数字。