在可计算性理论中,原始递归函数是一类使用组合和原始递归(如下所述)为主要操作来定义的函数,严格的讲它们是μ-递归函数(也称为部分递归函数)的子集,也叫全函数。原始递归函数是实现可计算性完全形式化的重要组成部分,这些函数在证明理论方面也很重要。
通常在数论中研究的大多数函数都是原始递归的。例如,加法和除法、阶乘和指数函数,以及返回第n个质数的函数都是原始递归的。实值函数的许多近似值也是如此。[1] 事实上,很难设计出一个非原始递归的全递归函数,尽管有些是已知的(如后文中的限制部分)。原始递归函数集在计算复杂性理论被称为PR。
原始递归函数属于数论函数,这些函数是从自然数(非负整数){0,1,2,...}到自然数的函数。这些函数取n个参数代表某个自然数 n,被称为n元。
基本的原始递归函由以下公理给出:
通过这些公理给出的运算,可以得到一些更为复杂的原始递归函数。
举例,我们取 f(x)作为上述定义的S(x),这个f是一元原始递归函数,且g(x)= S(x)也是。因此 h(x)定义为 f(g(x)= S(S(x))也是一个原始一元递归函数。通俗地说, h(x)是将x 变成 x+2的函数。
和
举例,假设 f(x)= P11(x)= x 和 g(x,y,z)= S(P23(x,y,z)= S(y),并且 h(0,x)= x 和 h(S(y),x)= g(y,h(y,x),x)= S(h(y,x)),则有 h(0,1) = 1, h(1,1) = S(h(0,1)) = 2, h(2,1) = S(h(1,1)) = 3。这个h是一个二元原始递归函数,我们可以称二元递归函数h为“加法”。
对上述理论的说明:函数 h 充当从0到第一个参数值的 for 循环的角色。至于函数 h 中的其余参数 ,这里用 xi (i = 1,..., k)表示,是for循环的一组初始条件,它可以在整个计算过程中使用,但不可被随意改变。函数 f 和 g 在定义函数 h 等式的右边,表示执行计算的循环体。函数 f 仅用于执行一次初始计算,循环的后续步骤的计算由函数 g 执行 。g 的第一个参数是For循环的“当前值”,g的第二个参数是由For循环的前一步的结果提供,g 的其余参数是前面提到的for循环的不可变初始条件。它们可被g 用于执行计算,但它们本身不会被 g 改变。
原始递归函数是基本函数,它们是基本函数通过有限次的运算获得的。
映射函数可用于避免上述函数的元数中明显的刚性问题;通过使用具有各种映射函数的组合,可以将一个函数的参数子集传递给另一个函数。例如,如果函数 g 和 h 是二元原始递归函数,那么有:
也是原始递归的。则使用映射函数的一个典型的形式定义是
在某些设置中,考虑原始递归函数是很自然的,这些函数将数字和真值(即t表示真、f 表示假)混合作为输入元组,或者将真值作为输出。[2] 这可以通过以任何固定方式用数字识别真实值来实现。 例如,我们通常将真值 t标识为1,真值 f 标识为0。一旦进行了这种识别,则集合A的特征函数,总是返回到1或0,它就可以被看作是一个谓词,指示数字是否在集合A中。本文的中余下部分将假定使用数字函数对谓词进行标识。
原始递归编程语言的一个例子是一个包含基本算术运算符(例如+和-、条件和比较关系(IF-THEN)、等于(EQUALS)、小于(LESS-THAN))以及诸如基本的for loop的有界循环的语言,其中,对于所有循环(FOR i从1到n,I和n都不能被循环体修改)都有一个已知的或可计算的上限。在原始递归语言中不允许使用更具通用性的控制结构,比如 while循环或IF-THEN plus GOTO。道格拉斯·霍夫斯塔德在哥德尔、埃舍尔、巴赫 中的Bloop就是如此。添加无界循环(WHILE,GOTO)会使语言部分递归,或者全图灵,Floop就是这样,几乎所有现实世界的计算机语言都是这样。
一般来说,纵使所有原始递归函数都停止了,但对于任意计算机程序或图灵机,仍不能分析判断它们也是否停止(停机问题)。这并不是矛盾的,因为原始递归程序是所有可能程序的非任意子集,是专门为可分析而构建的。
大多数在单个变量上使用递归的数论函数都是原始递归的。基本示例包括加法函数和截断减法函数。
直观地说,加法可以用规则进行递归定义:
,
要将它放入严格的原始递归定义中,则可以定义为:
其中,是S(n)是“n的后继函数 ”(即, n+1), P11 是识别函数, P23 是映射函数它可以接受3个参数并返回第二个参数。上面定义的原始递归运算所需要的函数 f 和 g 分别由 P11 和S 和 P23的组合来实现。
因为原始递归函数使用自然数而不是整数,并且自然数在减法下不闭合,因此本文研究了截断减法函数(也称为“适当减法”)。这个有限减法函数子(a, b)或[ b ∸ a],如果这是非负的,则返回 b - a ,否则返回0。
前趋函数 与后继函数的作用相反,并根据规则进行递归定义:
这些规则可以通过原始递归转换为更正式的定义:
有限减法函数可由前趋函数定义,其定义方式类似于由后继函数定义加法的方式:
此处sub(a, b)对应于 b ∸ a;为了简单起见,参数的顺序已经从“标准”定义转换为符合原始递归的要求。这可以很容易地用具有合适映射组合来校正。
指数运算和素性测试是原始递归的。给定原始递归函数 e, f, g,和 h,当 e≤f时,该函数返回 g 的函数值,否则返回 h 的函数值,这样的操作也是原始递归的。
通过使用哥德尔(Gödel)编码,原始递归函数可以扩展到对其他对象(如整数和 有理数)进行运算操作。 如果整数以标准方式被哥德尔数编码,则包括加法、减法和乘法在内的算术运算都是原始递归的。同样,如果有理数用哥德尔数表示,那么该领域所有运算也是原始递归的。
在一阶Peano算法中,有无限个变量(0元符号),除了S、+、*、和≤之外,没有k>0的非逻辑k元符号。因此,为了定义原始递归函数,必须使用哥德尔的以下技巧。
通过使用 序列的哥德尔编码系列,例如 哥德尔β函数,任何数字序列都可以用一个数字编码。因此,这样一个数可以表示原始递归函数,直到给定的n为止。
假设 h 是一元原始递归函数,则有如下定义:
其中C是常数,并且 g 是一个已经定义的函数。
使用哥德尔β函数,对于任何自然数序列(k0,k1,…,kn),存在自然数b和c,使得对于每个i ≤ n,有β(b,c,i) = ki。因此,我们可以使用以下公式来定义 h;更准确地说, m=h(n)是以下内容的简写: 等同于已经定义的函数 g,实际上是一些其他已经定义的公式的简写(如β函数,这里给出了它的公式)。
采用这种算法,对任何k元原始递归函数的扩展都是比较容易的。
通过引入无界搜索算子可以定义更广泛的部分递归函数。使用该运算符可能会导致一个偏函数,即每个参数至多只有一个对应值的关系,但对于任何参数则不一定有一个任何值相对应(请参阅有关域的介绍)。一个等价的定义表明,一个部分递归函数可以由图灵机进行运算,一个完全递归函数是为每个输入定义的部分递归函数。
每个原始递归函数都是完全递归的,但不是所有的完全递归函数都是原始递归的。阿克曼函数 A(m,n)是一个众所周知的完全递归函数(实际上是可证明的完全递归函数)的例子,它不是原始递归函数。使用阿克曼函数将原始递归函数描述为完全递归函数的子集。这个特征表明一个函数是原始递归的,当且仅当存在一个自然数m,使得该函数可以由图灵机计算,该图灵机总是在A(m,n)或更少的步骤内就停止运算,其中 n 就是原始递归函数参数的总和。[3]
原始递归函数的一个重要特性是它们是所有完全递归函数集合的递归可枚举子集(它本身不是递归可枚举的)。这意味着有一个单独的可计算的函数 f(m,n)可以枚举原始递归函数,即:
f 可以通过迭代重复创建原始递归函数的所有可能的方法来显式构造。因此,它是完全可以证明的。人们可以使用对角线化参数证明这一点的论据,f本身不是递归原语:如果是这样的话,h(n)= f(n,n)+1也是如此。但是如果这等同于一些原始递归函数,那么就存在一个 m ,使得对于所有 n 有h(n)= f(m,n),因此有 h(m)= f(m,m),从而导致矛盾。
然而,原始递归函数集不是所有完全递归函数集合的最大递归可枚举子集。例如,可证明的全函数集(在Peano算法中)也是递归可枚举的,因为可以枚举该理论的所有证明。虽然所有的原始递归函数都可证明是完全递归的,但反过来却不是这样。
原始递归函数往往与我们对可计算函数的直觉非常接近。当然,初始函数是可以直观计算的(非常简单),并且创建新的原始递归函数的两个操作也非常简单。然而,原始递归函数集并不包括所有可能的完全可计算函数—这可以从康托对角参数的变体中看出。这个参数提供了一个非原始递归的完全可计算函数,证据如下:
正如本文所述图灵机总是骤停一样,这个参数可以应用于通过这种方式枚举的任何一类可计算(全)函数。但是请意:部分可计算函数(那些不需要为所有参数定义的函数)可以显式枚举,例如通过枚举图灵机进行编码。
全递归但非原始递归函数的其他例子:
在下文中,我们观察到原始递归函数可以有四种类型:
在下文的标记“‘ ”中,例如a’,是表示原始标记“的后继”,通常被认为是“+1”,例如a +1 =def ' a '。函数16-20和#G对于将原始递归谓词表示为哥德尔数的“算术”形式并从中提取对它们有意义的部分。
一些其他形式的递归也定义了实际上是原始递归的函数。这些形式定义可能更容易找到,或者更适合阅读或书写。数值过程递归定义原始递归函数,某些形式的互递归也定义原始递归函数。
在循环编程语言中可以编程的函数也正是原始递归函数,这对这些函数的能力给出了不同的特征描述。与图灵完全语言相比,在LOOP语言中,每个循环运行的次数是在循环开始运行之前就已经被指定。
原始递归函数与数学意义上的有限论密切相关,在数学逻辑中,当需要一个特别的构造系统时,它们可以在多个上下文中值序列用。 原始递归算法 (PRA)是自然数及其原始递归函数的形式公理系统,经常被用于此目的。
PRA算法远没有Peano算法那么强大,这不是一个有限的系统。然而,数论和证明论中的许多结论都可以在PRA中得到证明。例如,哥德尔不完备性定理可以形式化为PRA,给出如下定理:
如果T是一个满足一定假设的算术理论,用哥德尔命题GT,则PRA证明了蕴涵Con(T)→GT。
同样,证明理论中的许多句法都可以在PRA中得到证明,这意味着存在执行相应证明句法转换的原始递归函数。
在证明理论和集合论中,人们对有限一致性证明感兴趣。也就是说,一致性证明本身是有限可接受的。这就证明了T理论的一致性,通过产生原始递归函数来暗示理论S的一致性,该原始递归函数可以将来自S的任何不一致证明转换为来自T的不一致证明。 一致性证明有限的一个充分条件是能够在PRA中将其形式化。例如,通过强制得到的集合论中的许多一致性结果可以从新转化为句法证明,并在PRA中形式化。
^Brainerd and Landweber, 1974.
^Kleene [1952 pp. 226–227].
^This follows from the facts that the functions of this form are the most quickly growing primitive recursive functions, and that a function is primitive recursive if and only if its time complexity is bounded by a primitive recursive function. For the former, see Linz, Peter (2011), An Introduction to Formal Languages and Automata, Jones & Bartlett Publishers, p. 332, ISBN 9781449615529. For the latter, see Moore, Cristopher; Mertens, Stephan (2011), The Nature of Computation, Oxford University Press, p. 287, ISBN 9780191620805.
^Peter Smith (2013). An Introduction to Gödel's Theorems (2nd ed.). Cambridge University Press. pp. 98–99. ISBN 978-1-107-02284-3..
^George Tourlakis (2003). Lectures in Logic and Set Theory: Volume 1, Mathematical Logic. Cambridge University Press. p. 129. ISBN 978-1-139-43942-8..
^Rod Downey, ed. (2014). Turing's Legacy: Developments from Turing's Ideas in Logic. Cambridge University Press. p. 474. ISBN 978-1-107-04348-0..
^Thoralf Skolem (1923) "The foundations of elementary arithmetic" in Jean van Heijenoort, translator and ed. (1967) From Frege to Gödel: A Source Book in Mathematical Logic, 1879-1931. Harvard Univ. Press: 302-33..
暂无