4

我一直在阅读的《计算机程序的结构和解释》一书通过定义零和增量函数来介绍 Church 数字

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 表示数字的一种更直接、更直观的方式。这种方法是否存在问题,因此有充分的理由说明教堂数字以它们的方式工作吗?这种方法是否已经得到证实?

4

2 回答 2

8

您的编码(零:λx.x、一:λx.λx.x、二:λx.λx.λx.x等)使定义增量和减量变得容易,但除此之外,为您的编码开发组合器变得非常棘手。例如,你会如何定义isZero

考虑 Church 编码的一种直观方式是,数字n由迭代n次数的动作表示。这使得开发组合器变得很容易,就像plus只使用数字中编码的迭代一样。递归不需要花哨的组合器。

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

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

于 2012-01-16T11:10:32.783 回答
0

建议的数字语法在 lambda 演算中无效,而 Church 数字在 lambda 演算中确实是有效的结构。因此,这可能是 Church 数字如此的一个原因——数字编码必须遵守 lambda 演算的定义,同时还允许在 lambda 演算中定义的进一步操作(例如,增量)对编码的数字进行操作.

于 2012-01-16T01:03:01.620 回答