可计算函数.docx

上传人:b****7 文档编号:9089765 上传时间:2023-02-03 格式:DOCX 页数:35 大小:193.65KB
下载 相关 举报
可计算函数.docx_第1页
第1页 / 共35页
可计算函数.docx_第2页
第2页 / 共35页
可计算函数.docx_第3页
第3页 / 共35页
可计算函数.docx_第4页
第4页 / 共35页
可计算函数.docx_第5页
第5页 / 共35页
点击查看更多>>
下载资源
资源描述

可计算函数.docx

《可计算函数.docx》由会员分享,可在线阅读,更多相关《可计算函数.docx(35页珍藏版)》请在冰豆网上搜索。

可计算函数.docx

可计算函数

13可计算函数

13.1原始递归函数

前面章节的讨论揭示了这样一个事实:

一个能够被精确描述的语言不能保证它能够被图林机识别,类似地,一个能够被精确定义的函数不能保证能够被图林机计算。

我们已经有了不能计算函数的例子,因为根据定义,非递归语言的特征函数是不能计算的。

在本章,我们集中讨论数值函数,有0个或多个非负整数变量,函数值是非负整数,尽力发现一种方法来刻画可计算的函数的特征。

将焦点放在数值函数上并不是象听起来那么受局限,因为我们很快就会找到一个方法将字符串映射到字符串的函数的定义域和值域都转换成整数数值。

回忆从N到N的部分函数f是可计算的条件是存在一个图林机T,使得对每个f定义的n,输入字符串1n,T都能够停机,且停机时输出1f(n),对于没有定义的n,则T不停机。

由于一个图林机至多计算一个函数,因此容易应用10.3节的非构造性论据说明存在许多不可计算函数。

图林机集合是可数的,而从N到N的部分函数集合是不可数的,因此不可计算函数集合一定是不可数的。

(注意,存在两个因素导致部分函数集合是不可数的,一是函数的定义域的可能性很多,二是给定定义域的情况下,对应的值域的可能性很多,其中一个因素就足以导致部分函数集合是不可数的。

就像我们给出了非递归语言的例子,我们也给出从N到N的不可计算函数的明确的例子。

我们的第一个例子,也许你已经想到,与图林机和对角参数法有关。

例子13.1(忙碌海狸函数)让我们定义函数b:

NN如下,f(0)=0,对每个n>0,b(n)是定义如下,考虑一个有n个非停机状态,设为Q={q1,...,qn},的图林机,磁带字母表是{0,1}。

因此这样的图林机个数是有限的,现在我们只考虑在输入为1n的情况下停机的图林机。

令b(n)是所有这样的图林机在停机时留在磁带上的最大的1的数目。

b(n)是衡量这类图林机忙碌程度的一个标准。

(某些研究者认为术语“忙碌海狸”来自磁带上的1与海狸布置小树枝类似。

我们利用反证法证明函数b是不可计算的。

假设b是可计算的,那么存在一个图林机Tb计算函数b。

令T=TbT1,其中T1是一个图林机,它的磁带字母表也是{0,1},它在磁带头的初始位置上写上0,然后将磁带头移到右边第一个为0或空符号的格子上,并写上1,将磁带头返回到起始位置,擦掉0,然后停机。

令m是T的状态的数目。

根据函数b的定义,没有一个状态数为m和磁带字母表为{0,1}的图林机在输入字符串为1m的条件下,停机时磁带上的1的数目大于b(m)。

然而前面构造的T,它属于这类图林机,且停机时的输出结果是1b(m)+1,得到矛盾,假设不成立。

一方面,函数b被精确地定义(b(n)是状态数为n,磁带字母表为{0,1}的图林机在输入字符串为1n时,停机后留在磁带上的最大的1的数目),但是它是不可计算的。

另一方面,一个公式,比如

f(n)=|2n+5-(3n+1)8|

定义的函数很明显是可计算的。

这两种形式的定义的区别是一个是语言描述,另一个是数学公式。

考虑函数b2,b2(n)是具有两个状态,磁带字母表是{0,1}的图林机在输入字符串为1n时,停机后输出的最大的1的数目,这也是一个描述性定义,表面上几乎与函数b相同。

但是b2是可计算的(?

)。

b2和f的一个共同特点是都存在一个相应的构造性定义,而前面的证明显示了函数b不具备这样的性质。

判定一个描述定义的函数是否存在相应的构造性定义是很困难的或不可能的。

在本章,我们形式化定义概念“构造性”,因此在这种方法下能够得到定义的函数就恰好是可计算函数。

感觉而言,代数公式定义的函数f是“构造性”的,是因为它是通过在很简单的基本函数(标识函数和常数函数)上施加有限的数学运算得到的。

我们采用同样的方法,除了使用的运算比代数运算,比如加法、乘法等,更通用。

我们从基本函数的精确定义开始,注意所有的初始函数都是全域函数。

定义13.1(初始函数)初始函数定义如下:

1.常量函数:

对于每个k>=0和a>=0,常量函数

定义公式如下

=a,XNk

当k=0时,Nk=,此时X不存在,我们指定

=a。

2.后继函数:

s:

NN定义如下

s(x)=x+1

3.投射函数:

对于每个k>=1且1=

定义如下

=xi

现在,我们准备考虑组合简单函数得到新函数的方法。

我们一开始讨论的两个方法中一个是复合,另一个涉及到一种原始递归。

我们将证明,尽管这些运算足以生成大多数我们熟悉的数值函数,但是我们还需要一个运算得到所有的可计算函数。

函数的复合运算定义在第1章,此处我们引入稍有不同的术语和记号。

为了方便,小写字母表示整数,大写字母表示向量或m元组。

定义13.2(复合)假设f是从Nk到N的部分函数,且对于每个1=

h(X)=f(g1(X),...gk(X)),XNm

h称为由函数f和g1,...,gk复合得到。

函数h可以写成f◦g,如果令g(X)=(g1(X),...,gk(X)),这是一个从Nm到Nk的函数,但由于我们只讨论函数值为单个整数的函数,因此避免这种写法。

注意函数的复合运算的次序是重要的,前面定义中是“函数f和g1,...,gk”复合。

另一个注意的是,为了h(X)(即函数h在X上)被定义,每个gi(X)也需要是被定义的,同时f(g1(X),...,gk(X))也是被定义的。

如果f,g1,...,gk都是全域函数,则h是全域函数。

作为一个熟悉的例子,令Add:

N×NN是通常的加法函数(Add(x,y)=x+y),令f和g是从Nk到N的部分函数,则函数Add(f,g)是Add,f,g复合得到的,通常写成f+g。

定义从N到N的函数f最简单的递归方法是首先定义f(0),然后任给k>=0,利用f(k)定义f(k+1),一个标准的例子是阶乘函数:

0!

=1

(k+1)!

=(k+1)*k!

在递归步骤,f(k+1)的表达式包含k和f(k)。

为了得到更通用的方式,我们用h(k,f(k))代替(k+1)*f(k),其中h是一个有两个变量的函数。

为了将这个方法用于多个变量的函数f,我们仅仅将递归限制在最后一个变量上。

换句话说,我们的递归基础定义的函数是f(x1,...,xn,0),其中x1,...,xn可以任意选择。

如果n=0,这表示定义了一个常数(不是常数函数,没有变量),在n0的通用形式,则定义了一个有着n个变量的函数。

在递归推导部分,利用f(x1,...,xn,k)定义f(x1,...,xn,k+1)。

我们用X表示n元组(x1,...,xn),则更准确地说,f(X,k+1)的定义除了依赖于f(X,k),还依赖于X和k。

因此,有了上面的记号,递归推导部分的通用形式是

f(X,k+1)=h(X,k,f(X,k))

定义13.3(原始递归函数)假设n>=0,且g和h分别是n和n+2个变量的函数。

函数f:

Nn+1N定义如下,

f(X,0)=g(X)

f(X,k+1)=h(X,k,f(X,k))

任给XNn,k>=0。

我们称f是函数g和h通过原始递归运算得到的。

在阶乘函数例子中,n=0,g是一个数值(或没有变量的常数函数)

=1,h(x,y)=(x+1)*y。

显然,如果g和h是全域函数,则f是全域函数,否则如果g在XNn上没有定义,则显然f(X,0)没有定义,f(X,1)=h(X,0,f(X,0))也没有定义,更一般地,对于每个k,f(X,k)都没有定义。

类似地,如果f(X,k)对于某个k没有定义,不妨说k=k0,那么对于每个k>=k0,f(X,k)都没有定义。

等价地说,如果f(X,k1)是定义的,则对于每个k<=k1,f(X,k)都是定义的。

这些观察为后面证明下面的命题提供了帮助:

可计算函数经过原始递归运算生成的新函数仍然是可计算的。

现在,我们有了一些初始函数和两个生成新函数的运算。

虽然我们已经指出了还需要其他运算才能生成所有的可计算函数,但是利用现有工具生成的函数集合是值得形式化和讨论的。

定义13.4(原始递归函数)原始递归函数集合PR定义如下,

1.所有初始函数是PR的一个元素;

2.对于每个k>=0和m>=0,如果f:

NkN和g1,...,gk:

NmN是PR的元素,那么f和g1,...,gk的复合函数f(g1,...,gk)也是PR的一个元素;

3.对于每个n>=0,函数g:

NnN和h:

Nn+2N都是PR的元素,那么g和h的原始递归函数f:

Nn+1N也是PR的一个元素;

4.PR中没有其他函数。

在第2章,我们讨论了这类定义(递归定义)的其他相当的形式化方法。

PR可以描述成包含初始函数且在复合和原始递归运算下封闭的最小函数集合。

原始递归函数另一个更明显的特征(参见例子2.18后面的讨论)是具有一个原始递归推导。

一个函数f具有原始递归推导的含义是存在一个函数序列f0,...,fj,fj=f,且序列中的每个函数fi要么是初始函数,要么由它前面的函数经过复合运算或原始递归运算得到。

例子13.2我们展示从N×N到N的函数Add和Mult,定义的公式如下,

Add(x,y)=x+y

Mult(x,y)=x*y

都是原始递归运算的结果。

现在我们发现函数Add的原始递归推导。

既然Add不是初始函数,而且没有一个明显的方法通过复合运算得到Add,因此我们尝试应用原始递归运算。

如果Add是函数g和h原始递归运算的结果,那么g和h分别是1个变量和3个变量的函数,满足下面的式子,

Add(x,0)=g(x)

Add(x,k+1)=h(x,k,Add(x,k))

容易发现g,由于Add(x,0)=x,而x是初始函数

现在我们希望从x,k,x+k得到Add(x,k+1),我们不直接需要x和k,可以简单地选用x+k的后继,即h(x,k,Add(x,k))应该是s(Add(x,k))。

这意味着h(x1,x2,x3)应该是s(x3),或

因此函数Add的一个推导序列是

f0=

//初始函数

f1=s//初始函数

f2=

//初始函数

f3=s(

)//f1和f2的复合函数

f4=Add//f0和f3的原始递归函数

推导顺序不是唯一的,比如前面三个函数的顺序是不重要的,只要Add在序列的最后,s和

在s(

)之前就可以了。

类似地,我们应用原始递归运算推导Mult。

Mult(x,0)=0

Mult(x,k+1)=x*(k+1)

=Add(x*k,x)

=Add(x,Mult(x,k))

注意,我们尝试用形式h(x,k,Mult(x,k))写出Mult的推导,既然x和Mult(x,k)是3元组(x,k,Mult(x,k))的第一个和第三个元组,我们可以使用函数f=Add(

),它是Add和

的复合函数。

因此函数Mult由函数0(初始函数

)和f经过原始递归运算得到,它也是原始递归函数。

问题:

术语“原始递归函数”的含义有两个1)两个函数的原始递归运算得到的函数2)属于PR集合的函数。

但是术语“原始递归的”一般指第二种情况的函数。

函数Mult的推导中,许多涉及原始递归函数的论据能够利用下面的通用结果得到简化。

定理13.1f是一个有n个变量的原始递归函数,则

1.对于每个k>=1,任何有n+k个变量的函数g,g由f中引入k个“哑元”变量得到(比如,n=2,k=1,g(x1,x2,x3)=f(x1,x3)),是原始递归函数。

2.每个有n个变量的函数g,g由f改变变量排列顺序得到(比如,n=2,g(x2,x1)=f(x1,x2)),是原始递归函数。

3.对于每个k,1=

4.对于每个k,1=

证明:

上面的各种变化都是下面的通用形式的特例。

g(x1,...,xr)=f(z1,...,zn)

其中,每个zi要么是投射函数,存在某个j,xj=

,要么是常数函数,存在某个a,a=

比如命题1中的函数g可以是

g(x1,x2,x3)=f(

因此,4种情况中的函数g都是f和一些初始函数,

,复合得到的,它们都是原始递归函数。

例子13.3令f是一个有两个变量的函数,定义如下

f(x,y)=yx+xx+x7

此处,我们定义00=1,使得f在全域上都有定义。

为了显示f是原始递归函数,我们首先考察f1,它对应的是f1(x,y)=xy。

定义如下

f1(x,0)=1

f1(x,k+1)=Mult(x,xk)

=Mult(x,f1(x,k))

选取h(x,y,z)=Mult(x,z),利用定理13.1的命题1,知道h是原始递归函数,则f1是1和h的原始递归运算的结果函数,因此是原始递归函数。

根据命题2知道yx是原始递归函数,分别根据命题4和3知道xx、x7是变量为x的原始递归函数,再根据命题1知道它们也是变量为x,y的原始递归函数。

最后

f(x,y)=Add(Add(yx,xx),x7)

它是多个原始递归函数的复合函数,由于复合运算保持原始递归性质,因此f是原始递归的。

例子13.4(前继函数和适当减法函数)适当减法函数Sub(subtraction的缩写)是保证函数值为非负数的减法函数,它是原始递归的。

为了证明这一点,我们从前继函数Pred(predecessor的缩写)开始讨论。

Pred(x)=

因此

Pred(0)=0

Pred(k+1)=k

根据定理13.1的命题1,Pred能够由原始递归函数经过原始递归运算得到。

如果我们定义Sub如下,

Sub(x,y)=

则有

Sub(x,0)=x

Sub(x,k+1)=Pred(Sub(x,k))

因此Sub是原始递归的。

这个运算常常写作“-”,称为适当减法。

虽然我们还没有完成原始递归函数的举例,本节后面证明两个结果,它们共同证明了原始递归函数集是可计算函数集的真子集。

定理13.2每个原始递归函数都是一个全域可计算函数。

证明:

我们定义原始递归函数的递归方法使得结构归纳法是一个证明它们具备某个性质的合适的方法。

我们证明下面三个命题:

1)每个初始函数是一个全域可计算函数;2)任何一个由全域可计算函数经过复合运算得到的函数是全域可计算函数;3)任何一个由全域可计算函数经过原始递归运算得到的函数是全域可计算函数。

我们前面观察到,初始函数都是全域函数,并且全域函数经过复合运算和原始递归运算得到的函数仍然是全域函数。

现在我们将讨论集中到可计算性的证明上。

显然所有的初始函数都是可计算的。

为了证明简洁,我们省略一些细节,证明一个简单的情况。

h:

NmN由f:

N2N和g1,g2:

NmN复合而成,如果f,g1,g2是可计算函数,则h也是可计算函数。

这个结论甚至在这些函数是部分函数的条件下也成立。

而且这个结论容易推广到f是k个变量的函数的情况。

令Tf,T1,T2分别是计算f,g1,g2的图林机,我们将构造一个计算h的图林机Th。

为了简化记号,我们用X表示m元组(x1,...,xm),用1X表示字符串

图林机Th的输入字符串是1X,它使用这个字符串两次,一次用于计算每个gi,因此复制字符串得到

1X1X

执行T1得到

然后再复制一份1X,然后执行T2得到

此时删除初始输入字符串,然后在

上执行Tf,得到希望的结果。

对于每个可能的X的值,如果gi(X)是未定义的,或者gi(X)是定义的,但f(g1(X),g2(X))是未定义的,都将导致Th无法停机。

因此Th计算h。

作为证明的最后一步,假设g:

NnN和h:

Nn+2N是可计算的,f由g和h经过原始递归运算得到。

令Tg和Th分别是计算g和h的图林机,我们构造计算f的图林机Tf。

Tf的磁带初始内容是

它的缩写形式是

正如前面说明,X表示(x1,...,xm)。

如果f(X,xn+1)是定义的,Tf工作步骤如下。

首先,决定xn+1是否是0,如果是,Tf磁带头回到0号格子,执行Tg,然后停机。

如果xn+1不是0,那么存在k>=0,磁带内容是

此时,Tf计算f(X,0),然后利用这个结果计算f(X,1),然后f(X,2),直到利用f(X,k)计算f(X,k+1)。

为了完成这系列计算,先准备磁带内容如下

#1X1k1X1k-1...111X101X

由于f(X,0)=g(X),先执行Tg,然后移动磁带头得到

#1X1k1X1k-1...111X101f(X,0)

现在Tf开始循环处理,每次处理都是执行Th并且移动磁带头,第一趟处理后,既然f(X,1)=h(X,0,f(X,0)),磁带内容变成

#1X1k1X1k-1...1X111f(X,1)

然后可以计算f(X,2)了。

循环处理结束后,得到

#1X1k1f(X,k)

此时将0号格子的#改成,再执行一次Th得到希望的结果。

从定义13.3后面的讨论,我们知道如果f(X,k+1)是定义的,上面计算过程的每一步都能成功进行。

如果f(X,k+1)是未定义的,那么或者Tg在1X上的处理不能导致停机,或者对于某个i,0=

因此Tf在输入字符串1X1k+1上停机当且仅当f(X,k+1)是定义的。

定理13.3存在一个从N到N的全域可计算函数,它不是原始递归函数。

证明:

我们非严格证明上面定理。

我们描述一个不是原始递归的函数,并且根据Church-Turing论题说明它是可计算的。

我们从修改字母表开始,它包含我们描述数值函数需要的所有的符号。

任何一个原始递归函数都可以用一个原始递归推导来说明,即可以用上的一个字符串说明。

每个函数可能有多个不同的推导不会影响这个表示(即可能多个字符串表示同一个函数)。

余下的证明依赖于下面的命题:

给定*中的一个字符串,存在一个算法判定这个字符串是否表示了某个单变量函数的原始递归推导。

尽管详细描述这个算法很繁琐,但是从直观上容易感觉是存在的。

我们用对角参数法来证明。

首先在*上定义一个顺序,不妨选规范顺序(先根据长度排序,然后根据字母排序)。

现在定义函数f:

NN如下。

对每个i,按序检查*上的每个字符串,抛掉那些不能表示某个从N到N的函数的原始递归推导的字符串,直到发现第i个表示那样的推导的字符串。

设被推导的函数是fi,令

f(i)=fi(i)+1

显然函数f是全域的。

一方面,由于我们描述了一个发现fi的推导的算法,且这个推导构成了计算f(i)的算法,因此f是可计算的。

另一方面,f不是原始递归的,因为每个单变量的原始递归函数都是某个fi,而且无论i是什么值,都有f(i)fi(i),因此f不会是fi。

存在更方便的方法定义全域、可计算的、非原始递归函数。

其中最著名的方法是Ackermann函数,它的定义涉及一种递归,因此它显然是可计算的,但是它的增长速度比任何一个原始递归函数都要快。

Hennie在1977年讨论了这种函数。

(加入张立昂35页Ackermann函数内容)

13.2原始递归谓词和一些限制运算

上一节中有几个函数,比如Pred和Sub,是分情况定义的。

这两个函数比较简单,因此容易发现它们直接的原始递归推导。

然而,对于任意一个分情况定义的函数f

f(X)=

我们希望发现通用的原则,使得能够根据函数fi(X)和条件Pi(X)的性质得到f的一些结论。

条件P的值依赖于变量XNn,要么是true,要么是false,称为谓词,更精确的说,条件P是n位谓词,是从Nn到{true,false}的部分函数。

显然P也表示了一个集合,与谓词P紧密相关的是它的特征函数xp:

Nn{0,1},定义如下

xp(X)=

既然xp是一个数值函数,那么我们在13.1节讨论的函数的性质都适合于xp,同样也适合于P。

特别地,如果xp是可计算的,则P也是可计算的,如果xp是原始递归的,P也是原始递归的,称为原始递归谓词。

当我们说语言L的特征函数xL是可计算的,意味着我们能够判定给定的字符串是否属于L。

当我们说xp是可计算的,含义相似于前面,即存在一个算法判定给定X是否满足P,或P(X)是否为真。

谓词取真或假,因此可以对谓词施加逻辑运算(与)(或)(非)。

比如(P1P2)(X)为真当且仅当P1(X)和P2(X)都为真。

显然这些逻辑运算保持了谓词的原始递归性。

定理13.4如果P1和P2是n位原始递归谓词,那么谓词P1P2,P1P2,P1也是原始递归谓词。

证明:

上面的结论来自下面三个等式,而这三个等式是显然成立的。

*

+

-

=1-

注意此处的减法是例子13.4引入的适当减法。

例子13.5(关系谓词)关系谓词属于最简单的谓词,关系谓词有LT,EQ,GT,LE,GE,NE。

LT(x,y)为真当且仅当x

其他5个关系谓词的定义正如它的名字表示的含义。

这些谓词都是原始递归的,为了证明这个结论,我们先引入单变量函数Sg,

Sg(0)=0

Sg(k+1)=1

函数Sg的含义是如果变量值为0,则函数值为0,否则为1。

显然Sg是一个原始递归函数。

现在我们有

xLT(x,y)=Sg(y-x)

既然x0,因此上式成立。

这个等式显示了xLT是两个原始递归函数的复合函数,因此xLT是原始递归的。

类似得到谓词EQ的特征函数xEQ的表达式

xEQ(x,y)=1-(Sg(x-y)+Sg(y-x))

注意如果x

虽然其他4个关系谓词可以构造上面类似的表达式,但我们可以使用可简单的形式,

LE=LTEQ

GT=LE

GE=LT

NE=EQ

根据定理13.4,逻辑运算保持原始递归性,因此上面的4个谓词都是原始递归的。

如果P是一个n位谓词并且有函数f1,...,fn:

NkN,我们可以得到一个k位谓词Q=P(f1,...,fn),显然Q的特征函数xQ是xP和f1,...,fn的复合函数,因此,如果P是原始递归谓词,所有的fi是原始递归函数,则Q是原始递归的。

将这个通用事实与定理13.4组合考虑,我们发现只要基本组件是原始递归的,任意一个通过关系运算和逻辑运算构造的复杂谓词都是原始递归的,比如

(f1=(3f2)2(f3

现在我们可以回去考虑分情况定义的函数是原始递归函数的条件。

定理13.5假设f1,...,fk是从Nm到N的原始递归函数,P1,...,Pk是n位原始递归谓词,并且对于每个XNn,有且只有一个Pi(X),1=

f(X)=

证明:

条件“在任何情况下,只有一个谓词为真”是为了保证函数f无歧义。

它隐含了对于每个X,只有一个

为1,其他都是0。

因此有

f=f1*

+...+fk*

即f是等式右面所有函数的复合函数,因此如果右面的函数都是原始递归函数,则f是原始递归函数。

例子13.6(模和商函数)对于自然数x和y(y>0),记号Div(x,y)和Mod(x,y)分别表示x除以y的整数商和余数。

比如,Div(8,5)=1,Mod(8,5)=3,Mod(12,4)=0。

由于除数不能为0,因

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1