Church Numerals转换为int而没有语言原语

时间:2013-04-03 13:49:27

标签: lisp scheme lambda-calculus

是否可以在不使用add1?

之类的语言原语的情况下将教堂数字转换为整数表示

我遇到的所有例子都使用原语来降级到int

示例:

 plus1 = lambda x: x + 1
 church2int = lambda n: n(plus1)(0)

示例2:

 (define (church-numeral->int cn)
    ((cn add1) 0))

我正在尝试使用微型lisp内部解释器(仅使用John McCarthy的10条规则),并想了解是否可以在不添加原语的情况下完成。

2 个答案:

答案 0 :(得分:2)

整数数字类型不是McCarthy的Lisp基本原语过程列表的一部分 - 在该级别只有函数,不存在其他数据类型。这就是为什么整数需要表示为函数(例如,使用教会数字),如果我们要严格遵守Lisp的这种简约定义。所以答案是没有。您无法转换为尚不存在的数据类型。

现在假设我们在语言中添加整数作为原子(请注意,向语言添加新数据类型超出了所提到的7-10原始过程)。为了简化更多,假设我们只添加一个数字,数字为零 - 那么我们仍然需要add1操作来构建其余的整数,如Peano axioms所示,这需要存在自然数存在的后继运算。同样,我们无法将教会数字转换为整数,而至少将数字0作为原子和add1函数。

答案 1 :(得分:1)

没有。正如您所描述的那样,int是一种原始类型的值,而不是函数。如果没有基元,你就无法操纵这样的int(没有add1,你怎么会从1到达0?)。

然而,你肯定可以在不使用原语的情况下在两种不同的自然数字教会编码之间进行转换,只要你的语言是图灵完整而没有这些原语。