习题2.1.3
构造接受下述语言的确定型有穷自动机:
(a) {b a w b a w 的前面是一个中每一个:},{*∈}    (b)  }{}
{*
,:w a b w ∈含有子串abab
(c)  {ω∈{a,b}*
:ω不含子串aa 和bb}
(d)  {ω∈{a,b}*:ω中有奇数个a 和偶数个b}    (e)  {ba ab w b a w 和含有字串:},{*∈}
解:(a
pgk
老师的感人故事(b)
(c )
(d)
a 、b
b
a
a
b
a
b
a
b    a    b
b
a
b
a, b
a
a b
b a    a
a
b
b
连静文
(e)
习题3.3.2
构造接受下述语言的下推自动机: (b ){:2}m n a b m n m ≤≤ (c )*{{,}:}R w a b w w ∈=
(d )*{{,}:}w a b w b a ∈中的是的两倍 解:(b )栈的作用是对a 计数,然后将其与b 的个数进行比较,此处的困难在于一个a 可能对应一个b ,也可能对应两个b ,因此我们需要非确定性。 M =∆({s,f,g},{a,b},{a},,s,{f,g}),其中 ∆={((s,a,e),(s,a)),读a 并推入a  ((s,e,e),(f,e)),跳到f 准备读b  f ((,b,a),(f,e)),读b,托出一个a
f g g ((,b,a),(,e)),读b,托出一个a ,跳到,准备再读一个b  g e f ((,b,),(,e))}读b,不托出a
(c) 构造如下自动机M=(K,∑,Γ,Δ,s,F),其中K={s,f},∑={a,b},Γ={a,b},F={f},而Δ是如下七个转移的集合: (1)((s,a,e ),(s,a )) (2)((s,a,e ),(f,e )) (3)((s,b,e ),(s,b )) (4)((s,b,e ),(f,e )) (5)((s,e,e ),(f,e )) (6)((f,a,a ),(f,e )) (7)((f,b,b ),(f,e ))
(d )要考虑两种情形:①栈正在对a 计数;②栈正在对b 计数
若栈正在对a 计数,则每读一个a ,要把两个a 推入栈;每读到一个b ,要把一个a 托出栈 若栈正在对b 计数,则每读到一个b,要把一个b 推入栈;每读到一个a ,要把两个b 托出栈 M={{s,q,f},{a,b},{a,b,
#},△,s,{f}},其中 △={((s,e,e ),(q,#)),      推入#,转到状态q    ((q,a,#),(q,aa#)),            空档,读a ,推入两个a      ((q,a,a ),(q,aaa )),            栈正在对a 计数,读a ,推入两个a    ((q,a,bb ),(q,e )),              栈正在对b 计数,读a,托出两个b    ((q,a,b#),(q,a#)),      栈中只有一个b (和#),读a,栈更新为a#    ((q,b,#),(q,b#)),        空栈,读b ,推入一个b    ((q,b,b ),(q,bb )),      栈正在对b 计数,读b ,推入一个b    ((q,b,a ),(q,e )),        栈正在对a 计数,读b ,托出一个a    ((q,e,#),(f,e ))}        空栈,托出#,转到状态f 习题4.1.1
设}){s,,,,(M h k δ∑=,其中    01K {,,}q q h =,    {,,U }a b ∑=∆,,
0s q =,
并且δ由表4-3给定。
(a )跟踪从格局0(,)q aabbba ∆启动的M 的计算
(b )非形式化描述当在0q 且扫描任意带方格时启动,M 做什么动作。
解:
(a )01(,)(,)M q aabbba q babbba ∆∆
01(,)(,)M M q b abbba q bbbbba ∆∆        01(,)(,)M M q bbbbba q bb abba ∆∆        01(,)(,)M M q bbabba q bba aba ∆∆        01(,)(,)M M q bbaaba q bba a aa ∆∆        01(,)(,)M M q bbaaa a q bba aab ∆∆        0(,U )(,U )M M q bbaaab h bba aab ∆∆
(b )将w 变为w 。(w 表示把w 中的a ,b 互换得到的字符串)
习题4.1.7
设计并完整写出这样的Turing 机,它向右扫描直到发现两个连续的a 为止,然后停机,这台Turing 机的字母表是{a,b,
,  }。
解:M =(k ,∑,δ,s ,{h}),其中k={q 0,q 1,h},∑={a , b ,  ,  },s=q 0, δ如下:
q    σ δ
(q, σ)
吴克羣 吴克
q 0      a  (q1,    ) q 0      b  (q0,    ) q 0      (q0,    ) q 0  (q0,    ) q 1      a  (h, a) q 1      b  (q0,    ) q 1 (q0,    ) q 1
(q0,    )
习题4.2.1
给出计算下列函数的Turing 机(用缩写记号),f 是从*},{b a 里的字符串到*},{b a 里的字符串的函数:R ww w f =)(。 解:
习题4.2.2
经典穿越架空小说
给出判定下列在{a,b}上的语言的Turing 机:
q    σ
(,)q δσ 0q    a            1(,)q b  0q    b
1(,)q a
0q    U                    (,U )h  0q                0(,)q → 1q    a            0(,)q → 1q    b            0(,)q → 1q    U          0(,)q → 1q
1(,)q →
坐飞机什么东西不能带
(a)φ
(b){e}
(c){a}
(d){a}*
解:(a)>n
习题4.2.3
ai文件怎么打开给出判定语言a*ba*b的Turing机:解:
习题4.3.5
给出3带Turing机,当启动时,第一条带上有用“;”分隔的两个二进制整数,计算它们的乘积。
>R1,2 01a2 01R1,3 01a3
;1    1
L3 A1,2 02R2
03
属于(0ٮ1)*。
上图中的A1,2表示加法机子程序:其中w=w1+w2 , w1,w2
01 R︺1,2
00 ٮ2
L1,2 11 左图中的L表示左移一格机
11 与课本定义稍有不同,
01 11
00,0︺
L1,2 01
11
定理  5.3.1
语言H不是递归的;所以,递归语言类是递归可枚举语言类的真子集。
在用来编码Turing机的字母表上定义字符串之间的二元关系R:(u,w) ∈R 当且仅当对某个接受w的Turing 机M,u=”M”。(R是改头换面的H。)现在对每个字符串u 设
R u ={ w:(u,w)∈R }
(这些R u对应于递归可枚举语言),并且考虑R的对角化,即
D={ w:(w,w)不∈R }
(D是非H1 )。根据对角化原理,对所有u, D ≠R u即非H1是与任何递归可枚举语言都不同的语言。
为什么对所有u, D ≠ R u ? 因为正是根据D的构造,D与每个R u(因此与每个递归可枚举语言)至少在一个字符串上,即u上,不同。
例  6.4.1
显然可满足性不属于P。现在让我们证明它属于NP。我们设计在多项式非确定性时间里判定合取范式形式的可满足布尔公式的所有编码的非确定性Turing机M。
M操作如下:在输入w上它首先验证w是否确实是合取范式形式的布尔公式的编码(若不是则它立即拒绝),并且计数在w里出现的变元的个数n。这是容易在多项式时间里完成的,在这个第一阶段的结尾,M的第二条带包含字符串▷I n,其中I与公式中的变元一样多。
然后M进入非确定性阶段,在这个阶段里M在第二条带上把所有I改写成长度为n的丅和丄的序列。究竟是丅和丄的哪个序列?回答是“任意序列,非确定性地”。更精确的回答是“所有序列,每个序列属于非确定性计算树的不同分枝”。容易设计出完成这件工作的非确定型机
(q,I,q,丅),( q,器:仅仅向K添加新状态q,向△添加转移(忽略其余的带,那里没有发生操作)
I,q,丄),(q,丅,q,→), (q,丄,q,→),(q,∪,q,,∪),其中q,是继续计算的状态。
M的最后阶段是确定性的:M把第二条带上{丅,丄}n里德字符串解释成输入公式的真值赋值。然后它逐个访问输入里的每个字句,并验证子句是否含有在这个真值赋值下是丅的文字。若发现所有子句都是丅文字,则M接受。否则,若发现一个不满足的子句,则M拒绝。
容易看出,上面描述的M证明可满足性属于NP。首先,所有计算的长度都有某个小的多项式界限。关键部分是,如果输入是可满足布尔公式的编码,那么M在非确定型计算的某个分枝上“猜测”满足赋值,因此至少有一个接受计算。除此之外,可能有许多拒绝计算。因此输入被接受。如果输入公式是不可满足的或者根本不是公式,那么所有计算最终都拒绝。
例6.4.2
旅行商问题(像在6.2节用给定“预算”B来定义的那样)也属于NP。证明这个结论的非确定型Turing机在第二条带上非确定性写与输入的长度相等的0,1和空格的字符串。然后机器进入确定性阶段,其中它验证写在第二条带上的字符串是否碰巧是整数1,…,n的双射∏的编码,其中n是给定输入里的城市数。双射∏编码成用二进制写的∏(1), ∏(2),…,用空格分隔。若字符串确实是双射的编码,则机器继续确定性地在计算巡回路线的成本,并且与输入里的“预算”B比较。若成本不超过B,则机器接受;在所有其他的最终结局里(若所猜测的字符串不是双射的编码,或者若它表示成本大于B的巡回路线)
这台机器都拒绝。显然字符串属于这台机器所判定的语言当且仅当它编码旅行商问题的“是”实例。
定理7.2.3三元可满足性是NP完全的。
证明:它当然属于NP,因为它是属于NP的问题的特殊情形。
为了证明完全性,我们把可满足性归约到三元可满足性上。这是相当普通类型的归纳,在这里把问题归约到它自身的特殊情形上。通过证明从一般问题的任意实例开始,我们设法消除妨碍这个实例落进特殊情形里的特性,这样的归约就可行了。在目前情况下我们必须证明从任意子句集F出发,如何在多项式时间里得到在每个子句里最多有三个文字的子句集t(F).
归约是简单的。对F里的每个有k>3个文字的子句,比方说
C=(λ1∨λ2∨…λk )
做下列工作:设y1,....,y k-3 是不在布尔公式t(F)的别处出现的新的布尔变元,我们把子句C换成下列子句集:
(λ1∨λ2∨y1 ),(非y1∨λ3∨y 2 ),…,(非y k-3 ∨λk-1∨λk )
我们以这种方式拆碎F的所有“长的”子句,对每个子句使用不同的y i变元集。我们照原样保留“短的”子句。得出的布尔公式就是t(F)。容易看出t可在多项式时间里完成。
我们断言t(F)是可满足的当且仅当F是可满足的。在直观上,把变元y i解释成“文字λi+2 ,…λk 至少有一个为真”,并且把子句(非y i∨λi+2∨y i+1)解释成说“如果y i 为真,那么要么λi+2 为真,要么y i+1为真”。
形式地,假设赋值T满足t(F)。我们证明T也满足F的每个子句。对短的子句这是平凡的;如果T把原来的长子句的所有k个文字都映射成丄,那么y i 变元就无法靠它们自身来满足所有得出的子句:第一个这样的子句迫使y1是丅,第二个迫使y2 是丅,最后倒数第二个子句导致y k-3