szer两个基本函数组成了我们要的ne,完美。

如果栗子再复杂一点,我们想要一个加法器add,add(x,=x+怎么用那三种基本函数组合?

也很简单,从具体输入入手:

add(3,2)=sadd(3,1))=ssadd(3,0)))=ss3))

似乎只需要组合多个后继函数就可以了呢。

当然,这里面有一个毛病,在于我们在没有定义好add的前提下,先入为主地认为add(3,0)=3

所以我们不能认为自己就这么简单地构造了add,只能退而求其次地得到以下关系:

add(x,1)=sadd(x,),这个式子是十分严谨的。

更具体地,要想算出add(x,1),就要知道add(x,0)=x,我们称add(x,0)=x为基准条件;add(x,1)=sadd(x,)为递归条件。

看起来就差临门一脚了,只要我们能用三种基本函数构造出add(x,0)=x,就能得到add(x,1),也就能构造出我们想要的加法器。

也很显然,add(x,0)=x=prj11

于是,我们的加法器有了。

这种看起来很像左脚踩右脚登天的构造方式叫做“原始递归”,它的定义是这样的:

小主,这个章节后面还有哦,请点击下一页继续阅读,后面更精彩!

基准函数f:nn—n

递归函数g:nn+2—n

使用f和g的原始递归h=pn(f,g):nn+1—n

对于h:

基准条件:h(x1,xn,0)=f(x1,,xn)

递归条件: h(x1,,xn,1)=g(x1,,xn,h(x1,,xn,)

回到我们的加法器add:

add:n2→n

add(x,=x+p1(f,g)

基准条件:add(x,0)=f(x)=prj11

递归条件:add(x,1)=g(x,add(x,)=sadd(x,),g=s[prj33]

add=p1(prj11,s[prj33])

完美无瑕。

类似地,乘法器t=p1(zer,add·[prj13,prj33])

前继函数,减法器等等基本运算都可以据此定义,只需要prj,zer,s种原始函数和组合·,原始递归p这两种基本操作。所有完全函数都可以据此构造。

那么“偏函数”呢?

构造偏函数还需要额外的一个操作:最小化。

如果我们有一个函数f:nn+1—n (这里代表上标,虽然不好看,但实在是敲得太麻烦没有耐心了),具体的f(a1,an,x),其中a1,an是固定参数,x是可变参数。

那么最小化操作为:μnf:nn—n它会找到给它输入的n个参数里,最小的一个,并输出

比如f(5,,3,2,1,0)=0

如果遇到重复参数,那么就输出第一个最小的。

比如f(5,,3,2,1,1)=1