数理逻辑5 -- 计算理论1

图灵机 Turing Machine

我读此书和做笔记主要出自于好奇心,前三章是为了搞懂神神秘秘的哥德尔不完备定理,顺便学习一阶逻辑的知识。第四章的集合论是为了以后的实分析、测度论、概率和随机过程等夯实基础,同时满足罗素悖论的好奇心。现在第五章,终于见到了自己的老本行,往好奇心方面说是为了弄懂停机问题,往夯实基础方面说是为了后续的复杂度理论和算法设计做准备,至少也要彻底弄懂P=NP究竟是什么问题。

伟大的阿兰图灵提出抽象的计算模型,提供了一种定义“算法”的手段,后人把它称作图灵机。有了图灵机,才能准确定义何为算法,何为“用算法解决某个问题”,甚至定义何为“问题”。计算模型有很多,早期的发展中有丘奇的类型论,这些计算模型后来都被证明是等价的。在这些模型中,图灵机被广泛采用,就像集合论中多采用ZFC作为基础教学一样。虽然教材采用了NBG集合论,但在计算模型上还是采用了图灵机。

图灵机是抽象的计算模型,从数学上讲,一个图灵机就是一个指令的集合。很多CS教材定义图灵机的时候,都说它是一个四元组,里面包含了字符集、状态集。教材在定义上没有那么的严格,而是采用了一种讲故事的方式来定义。

1. 字符集 Alphabet

在图灵机的世界里,一切研究对象都是字符串,CS的术语喜欢称字符(Character),而逻辑学家就喜欢称符号(Symbol)。在这里我们采用教材的讲法,称符号(Symbol),称语言(Language),称字母集(Alphabet),称单词(Word)。

在图灵机的眼里,一切物体都可被抽象成符号串。首先,有一个有限的字母集(finite alphabet) A={a0,a1,...,an} A = { a 0 , a 1 , . . . , a n } 。然后,字母集里的元素称为符号(symbol)。再次,任意有限长的符号串称为单词(word)。

注意,这里的字母集是有限集合。对于无限字母集 {a0,a1,...} { a 0 , a 1 , . . . } ,只要它可列,那么可以等价地用 {b,} { b , ∗ } 来表示,其中任意符号 an a n 用单词 b... b ∗ ∗ ∗ ∗ ∗ . . . ,即一个 b b n n 表示。

如果 P,Q P , Q 是单词,那么 PQ P Q 也是单词,即把 Q Q 写在 P P 的右边。另外,我们用 Pk P k 表示连写 k k 个单词 P P

2. 磁带 Tape

有了符号之后,就需要一个演算符号的地方。在图灵机的世界里,这个演算符号的媒介叫做磁带(Tape)。它是一条一维的无限长的抽象磁带,由格子(cell)组成。在任一时刻,磁带的长度是有限的。当磁头向左或向右移出磁带范围之后,随时可以补充一个格子。

磁带上每个格子可打印一个符号,其中符号 a0 a 0 保留作“空符号”,即当格子上没有符号时,我们也可以说它打印了空符号 a0 a 0

3. 操作 Step

基于上述定义,图灵机是一个抽象机器,它工作于离散时间,有一个“读操作”磁头,在某个时间片段读取磁带当前位置的符号,然后做以下其中之一的操作:
(1) 打印一个新符号,覆盖原有符号
(2) 磁头向右移动一格
(3) 磁头向左移动一格
(4) 停止

除此之外,图灵机还依赖于自身的状态(internal state)。我们假设图灵机的状态集是有限集合,记为 {q0,q1,...,qm} { q 0 , q 1 , . . . , q m } ,其中 q0 q 0 保留作初始状态,图灵机总是从初始状态开始工作。

图灵机的每步操作,若严格地用符号表示,则是以下三种之一:
(1) qjaiakqr q j a i a k q r :当前状态为 qj q j ,读取的当前符号是 ai a i ,把它变成 ak a k ,状态变成 qr q r
(2) qjaiRqr q j a i R q r :当前状态为 qj q j ,读取的当前符号是 ai a i ,磁头向右移动一格,状态变成 qr q r
(3) qjaiLqr q j a i L q r :当前状态为 qj q j ,读取的当前符号是 ai a i ,磁头向左移动一格,状态变成 qr q r

有了上述定义,我们就可以严格定义何为一个“图灵机”。

定义5.1.1(图灵机):一个图灵机包含了一个有限子母集 A={a0,a1,...,an} A = { a 0 , a 1 , . . . , a n } ,一个有限状态集 Q={q0,q1,...,qm} Q = { q 0 , q 1 , . . . , q m } ,以及一个有限四元组指令集合 F F ,其中每个四元组都符合(1) qjaiakqr q j a i a k q r ;(2) qjaiRqr q j a i R q r ;(3) qjaiLqr q j a i L q r 三种形式的其中一种,并且指令集 F F 的任意两个四元组(指令)的前两个符号都不一样。

上述定义的最后一句话是说,任意两个指令不能产生歧义,即相同的状态下若读取的当前符号也相同,那么只能有一个操作。还需注意的是,指令集 F F 肯定是有限的。

有了图灵机,接下来就要定义何为”计算”。简单来说,一个“计算”就是一个有限指令序列。若严格定义,首先我们要定义何为一个磁带描述(tape description)。

定义5.1.2(磁带描述):我们说,图灵机 F F 的一个磁带描述(tape description)是指一个单词,它满足以下三个条件:
(1) 除了一个符号以外,其它所有符号都是磁带符号 aiA a i ∈ A
(2) 那个非磁带符号是状态符号 qjQ q j ∈ Q
(3) qj q j 不在最后的位置

一个磁带描述给出了图灵机当前的工作状态。从左往右读的话,那些磁带符号表示了磁带当前的符号序列,而状态符号 qj q j 表示了图灵机当前的状态 qj q j ,并且给出了当前磁头的位置,即紧接着 qj q j 右边的符号是磁头读取的符号。比如,磁带描述 a2a0q1a0a1a1 a 2 a 0 q 1 a 0 a 1 a 1 ,表示当前磁带的符号序列是 a2a0a0a1a1 a 2 a 0 a 0 a 1 a 1 ,图灵机状态是 q1 q 1 ,磁头位置在第二个 a0 a 0 上。

我们说,图灵机 F F 从一个磁带描述 α α 移动到另一个磁带描述 β β ,记作 αFβ α ↪ F β ,当且仅当,以下任一情况为真( P,Q P , Q 表示任意长度的字母集 A A 的单词):
(1) α α 形如 PqjaiQ P q j a i Q β β 形如 PqrakQ P q r a k Q ,并且 qjaiakqrF q j a i a k q r ∈ F ,即这个四元组是一条指令;
(2) α α 形如 PasqjaiQ P a s q j a i Q β β 形如 PqrasaiQ P q r a s a i Q ,并且 qjaiLqr q j a i L q r 是指令;
(3) α α 形如 qjaiQ q j a i Q β β 形如 qra0aiQ q r a 0 a i Q ,并且 qjaiLqr q j a i L q r 是指令;
(4) α α 形如 PqjaiakQ P q j a i a k Q β β 形如 PaiqrakQ P a i q r a k Q ,并且 qjaiRqr q j a i R q r 是指令;
(5) α α 形如 Pqjai P q j a i β β 形如 Paiqra0 P a i q r a 0 ,并且 qjaiRqr q j a i R q r 是指令

注意,上面(3)、(5)分别对应磁头在最左和最后的情况,这时向左和向右移动后,磁带自动写入一个空字符 a0 a 0

对于一个磁带描述 α α ,若不存在磁带描述 β β ,使得 αFβ α ↪ F β 的话,那么图灵机就停了下来。此时, qjai q j a i α α 中,但却没有指令以 qjai q j a i 作开头。

定义5.1.3(计算):我们说,一个计算(computation),是指一个磁带描述的有限序列 α0,...,αk(k0) α 0 , . . . , α k ( k ≥ 0 ) ,使得以下条件成立:
(1) α0 α 0 是初始磁带描述,即 α0 α 0 中包含的状态符号是 q0 q 0
(2) aiFai+10ik a i ↪ F a i + 1 , 0 ≤ i ≤ k
(3) F F ak a k 时停止;

我们说,一个计算 a0,...,ak a 0 , . . . , a k ,从 a0 a 0 开始,到 ak a k 停止。如果存在一个以 a0 a 0 为始的图灵机 F F ,我们就说 F F 适用于 a0 a 0

定义5.1.4(算法):我们说,一个由图灵机 F F 确定而出的算法(Algorithm),记为 AlgF A l g F 满足以下条件:对于字母集 A A 中任意两个单词 P P Q Q AlgF(P)=Q A l g F ( P ) = Q 成立,当且仅当,存在 F F 的一个计算,它始于磁带描述 q0P q 0 P ,终于磁带描述 R1qjR2 R 1 q j R 2 ,其中 Q=R1R2 Q = R 1 R 2

注意, AlgF A l g F 可对某些单词 P,Q P , Q 没有定义,我们定义的是 AlgF(P)=Q A l g F ( P ) = Q ,而不是所谓的通用的 AlgF A l g F 。图灵机确定而出的算法,称为图灵机算法(Turing algorithm)。

数论函数的图灵机算法

我们来看看如何用图灵机实现一些基本的数论函数,例如零函数 Z(x)=0 Z ( x ) = 0 ,后继函数 N(x)x+1 N ( x ) x + 1 ,等等。

为了方便,教材里用 B B 表示空字符 a0 a 0 ,用 | | 表示符号 a1 a 1 。对于自然数 k k ,要表示它可用 k k 个连续的字符 | | 表示,但为了方便,我们写作 |k+1 | k + 1 ,其中 | | 表示 0 0 。然后,n元组 (k1,k2,...kn) ( k 1 , k 2 , . . . k n ) 可用 k1Bk2B...Bkn k 1 B k 2 B . . . B k n 表示(其中每个 ki k i 都要变成 |i+1 | i + 1 )。

我们说,一个图灵机 F F 计算了某个部分函数(partial function) fF,1 f F , 1 (即只对某些自然数有定义),使得 fF,1(k)=m f F , 1 ( k ) = m ,当且仅当, AlgF(k) A l g F ( k ) 有定义,并且 AlgF(k)=E1mE2 A l g F ( k ) = E 1 m E 2 ,其中 E1,E2 E 1 , E 2 是空字符 B B 组成的任意有限长(可能长度为0)符号串。

函数 fF,1 f F , 1 称为图灵可计算(Turing-computable)。因此,一个一元部分函数(one-place partial function) f f 是图灵可计算,当且仅当,存在一个图灵机 F F ,使得 f=fF,1 f = f F , 1

类似的,我们可定义n元函数的图灵可计算。

例1:考虑字符集 {B,|} { B , | } ,要计算后继函数 N(x)=x+1 N ( x ) = x + 1 ,可实现一个图灵机 F F ,它包含如下两条指令:

q0|Lq1,q1B|q2 q 0 | L q 1 , q 1 B | q 2
。因此,存在一个计算 q0kq1Bkq2(k+1) q 0 k ↪ q 1 B k ↪ q 2 ( k + 1 ) ,它计算了后继函数。

例2:要计算零函数 Z(x)=0 Z ( x ) = 0 ,可实现图灵机:

q0|Bq1,q1BRq0,q0B|q2 q 0 | B q 1 , q 1 B R q 0 , q 0 B | q 2
。因此,给定一个自然数 k k ,它先把每个符号 | | 变成 B B ,然后右移一格,再把 | | 变成 B B ,直到右移遇见 B B ,然后把 B B 变成 | | ,状态变成 q2 q 2 ,停下来,磁带最后的符号串是 B...B| B . . . B | ,即表示自然数 0 0

例3:对于投影函数 U(x1,x2)=x2 U ( x 1 , x 2 ) = x 2 ,可实现图灵机:

q0|Bq1,q1BRq0,q0BRq2 q 0 | B q 1 , q 1 B R q 0 , q 0 B R q 2
。因此,对于自然数 k1,k2 k 1 , k 2 ,它的磁带表示是 |||||B||||| | | | | | B | | | | | ,从左往右依次把 | | 变成 B B ,然后遇见 B B 就右移一格,状态变成 q2 q 2 ,然后停下来。

最后,我们来看一个简单的引理,加深对图灵机的印象。

引理5.1.1:若一个函数 f f 是图灵可计算,那么它可被无数个不同的图灵机计算。
证明:如果 f f 能被图灵机 F0 F 0 计算,记这个图灵机的状态集为 Q0={q1,q2,...,qm} Q 0 = { q 1 , q 2 , . . . , q m } 。因此,存在一个 F0 F 0 的计算,它终于某个磁带描述 qsaj q s a j 。那么,存在图灵机 Fi,i1 F i , i ≥ 1 ,使得状态集为 Qi={q1,...,qm,qm+1,...,qm+i} Q i = { q 1 , . . . , q m , q m + 1 , . . . , q m + i } ,并且指令集中相较于 F0 F 0 ,增加了指令 qsajRqm+i q s a j R q m + i 。说白了,就是我们总能给出一个新的图灵机,它状态比之前的多一个,之前停止的地方右移一格,状态由 qs q s 变成这个新增的状态 qm+i q m + i 。显然,这样的图灵机有无穷多个。

你可能感兴趣的:(数理逻辑5 -- 计算理论1)