930 likes | 1.17k Views
计算理论. 第 6 章 可计算性理论的高级专题. REVIEW(20110328). 可归约性. 核心 : 利用已有的 不可判定 问题 , 证明其它问题 不可判定 . 问题 : E TM , EQ TM , 波斯特对应问题 (PCP), 与线性界限自动机有关的问题 , 等 . 技巧 : 模拟 + 归约 一般归约 , 映射 归约 , 利用计算历史归约. REVIEW(20110328). 核心 : 利用已有 不可判定 问题 , 证明其它问题 不可判定 . 归约 : 将求问题 B 的解转化为求问题 A 的解 .
E N D
计算理论 第6章 可计算性理论的高级专题
REVIEW(20110328) • 可归约性 核心: 利用已有的不可判定问题, 证明其它问题不可判定. 问题: ETM , EQTM , 波斯特对应问题(PCP), 与线性界限自动机有关的问题, 等. 技巧: 模拟+归约 一般归约, 映射归约, 利用计算历史归约.
REVIEW(20110328) 核心: 利用已有不可判定问题, 证明其它问题不可判定. 归约: 将求问题B的解转化为求问题A的解. 若A有解, 则B有解. 即 若B无解, 则A无解. 归约
输入w 一 般 归 约 转换 f(w) Ac/Rej R Ac/Rej 转换 输入w 转换 f(w) 映 射 归 约 R Ac/Rej 如何证明“若A可判定, 则B可判定” 根据A的判定器R, 构造B的判定器: 归约过程 w*, wB f(w)A.
可计算函数与映射归约 定义称函数f:**是一个可计算函数, 若有某判定器M使得, 在输入w上, M停机时, 带上串为f(w). 整数上所有通常的算术运算都是可计算函数. 定义 称语言A可以映射归约到语言B, 如果存在可计算函数f:**使得, w*, wA f(w)B. 记做 A m B . 称映射f为A到B的归约.
w f(w) T R Ac/Rej 应用映射归约的基本原理 定义: 称AmB, 若有可计算函数f:**使得, w*,wA f(w)B. 定理: 若 A m B且 B可判定, 则 A可判定. 证明:设R判定B, f是A到B归约,令T如右图, 即 T=“对输入w:1) 计算f(w). 2) 在f(w)上运行M. 3) 若R接受,则接受; 若R拒绝, 则拒绝.” f可计算 + R是判定器 T是判定器 w*,wA f(w)B T接受w wA f(w)B T拒绝w, L(T)=A. 推论: 若 AmB 且 A不可判定, 则 B不可判定.
ATM到HALTTM的一般归约 HALTTM={<M,w>|M是一个TM,且对输入w停机} 目标:若HALTTM可判定, 则ATM可判定. (方法?) 若HALTTM有判定器R, 则如下S判定ATM , S=“对输入<M,w>,M是TM,w是串: 1) 在<M,w>上运行R. 2) 若R拒绝,则拒绝; 3) 若R接受,则在w上模拟M,直到它停机. 4) 若M接受,则接受;若M拒绝,则拒绝.” 推论: HALTTM不可判定.
ATM到HALTTM的映射归约 • 对M,w, 构造映射g(<M,w>)=<FM,w>, 其中 • FM = “对于输入x, • 1) 在x上运行M. • 2) 若M接受, 则接受;若M拒绝, 则一直左移.” • M,w, <M,w>ATM g(<M,w>)HALTTM. • 若HALTTM有判定器H, 则下面的S判定ATM. • S = “对输入<M,w>, 1) 计算g(<M,w>). • 2) 在g(<M,w>)上运行H. • 3) 若H接受, 则接受; 若H拒绝, 则拒绝.”
可计算函数举例1 设M是图灵机, FM=“对于输入x, 1) 在x上运行M. 2) 若M接受, 则接受; 若M拒绝, 则左移.” T=“对输入<M,w>, 1) 构造<FM>. 2) 输出<FM,w>.” • f1(<M,w>) = <FM,w> 是可计算函数. • M,w, <M,w>ATM f1(<M,w>)HALTTM. • ATM m HALTTM .
ATM到ETM的一般归约 ETM = {<M>|M是一个TM,且L(M)=} 目标:若ETM可判定, 则ATM可判定. 方法? 若ETM有判定器R, 则如下S判定ATM , S=“对输入<M,w>, 1) 构造<AM,w> (只是写下一个字符串), AM,w=‘对输入x, a)若xw,则拒绝; b)否则输出M(w).’ 2) 在输入<AM,w>上运行R. 3) 如果R接受,则拒绝;如果R拒绝,则接受.” 推论: ETM不可判定.
{w}, 若M接受w; L(AM,w)= , 若M不接受w. AM,w的特点 将串<M,w>对应到串<AM,w>, 记为f2(<M,w>) AM,w=“对于输入x, 1)如果xw,则拒绝. 2)如果x=w,则在w上运行M.若M接受,则接受.” M,w, <M,w>ATM f(<M,w>)ETM
可计算函数举例2 设M是图灵机, w是串. AM,w=“对于输入x, 1)如果xw,则拒绝. 2)如果x=w,则在x上运行M. 若M接受, 则接受.” F=“对输入<M,w>, 1) 构造<AM,w>. 2) 输出<AM,w>.” • f2(<M,w>) = <AM,w> 是可计算函数. • M,w, <M,w>ATM f2(<M,w>)ETM. • ATM m ETMc.
可计算函数举例3 设M是图灵机, w是串. RM,w=“对于输入x, 1) 若x=0n1n对某n>0, 则接受. 2) 在w上运行M. 若M接受w, 则接受x.” • f3(<M,w>)=<RM,w>是可计算函数. • L(RM,w) = * (正则) , 若M接受w; • = {0n1n|n0}(非正则), 若M不接受w. • 令REG={<M>|M是TM, L(M)是正则语言}. • M,w, <M,w>ATM f3(<M,w>)REG.
映射归约 定义 称语言A可以映射归约到语言B, 如果存在可计算函数f:**使得, w*, wA f(w)B. 记做 A m B . 称映射f为A到B的归约. ATM m HALTTM. ATM m ETM的补 . ATM m REG.
ATMm HALTTM 定义: 称AmB, 若有可计算函数f:**使得, w*,wA f(w)B. 设M是图灵机, FM=“对于输入x, 1) 在x上运行M. 2) 若M接受, 则接受;若M拒绝, 则左移.” • f1(<M,w>) = <FM,w> 是可计算函数. • M,w, <M,w>ATM f1(<M,w>)HALTTM.
ATMm ETM的补 定义: 称AmB, 若有可计算函数f:**使得, w*,wA f(w)B. 设M是图灵机, w是串. AM,w=“对于输入x, 1)如果xw,则拒绝. 2)如果x=w,则在x上运行M. 若M接受, 则接受.” • f2(<M,w>) = <AM,w> 是可计算函数. • L(AM,w) = {w}, 若M接受w = , 若M不接受w. • M,w, <M,w>ATM f2(<M,w>)ETM.
ATMm REG 定义: 称AmB, 若有可计算函数f:**使得, w*,wA f(w)B. 设M是图灵机, w是串. RM,w=“对于输入x, 1) 若x=0n1n对某n>0, 则接受. 2) 在w上运行M. 若M接受w, 则接受x.” • f3(<M,w>) = <RM,w> 是可计算函数. • L(RM,w) = * (正则) , 若M接受w; • = {0n1n|n0}(非正则), 若M不接受w. • M,w, <M,w>ATM f3(<M,w>)REG.
映射归约应用举例 定理 若 A m B 且B可判定,则A可判定. 推论 若AmB且A不可判定, 则B不可判定. ATM m HALTTM HALTTM不可判定 ATM m REG REG不可判定 ATM m ETM的补 ETM的补不可判定 ETM不可判定
线性界限自动机(LBA) • LBA是一种受到限制的图灵机. • 它不允许其读写头离开包含输入的带区域. • 如果此机器试图将读写头移出输入区域的两端, 则读写头就待在原地不动. 通过增大工作字母表 可使存储能力线性增长. 尽管LBA的存储受到限制,它仍然十分强大. 前面所构造的判定器都直接或间接是LBA. 存在不能被LBA判定的可判定语言(第9章).
状态 … w1 w2 w3 … wn LBA的格局总数 引理 对于LBA M, 若|Q|=q,||=g,输入串长为n, 则M的格局总数是qngn. 不同字符串数为gn, 读写头有n个不同位置, 共有q种不同状态.
定理 ALBA是可判定的 ALBA={<M,w>|M是LBA,w是串,M接受w} 对比: ATM是不可判定的? 证明: T = “对于输入<M,w>,其中M是LBA,w是串, 1) 在w上模拟M qngn步, 或者直到M停机. 2) 若M停机,则当M接受时接受, 当M拒绝时拒绝; 若M还没有停机, 则拒绝.”
接受计算历史 • 设M是一个TM, C1,C2,…,Ck是M上的格局序列, • 称C1,C2,…,Ck是M在串w上的接受计算历史,若 • a) C1是M在w上的起始格局(q0w). • b) Ci产生Ci+1(满足M的转移函数). • c) Ck是接受格局. • 类似,可以定义M在w上的拒绝计算历史. • 若M接受w, 则M在w上有唯一的接受计算历史; • 若M在w上运行最终进入拒绝状态, 则… • 若M在w上不停机, 则…
L(BM,w)= 定理 ELBA不可判定 设M是TM, w是串, 如下构造LBA BM,w: BM,w =“输入<C1,C2,…,Ck>,其中Ci是M上的格局, 1)检查C1,…,Ck是否是M在w上的接受历史. 2)若是, 则接受;否, 则拒绝.” {<M在w上的 接受计算历史>}, 若M接受w; , 若M不接受w. M,w, <M,w>ATM <BM,w>ELBA. ATM m ELBA的补 ELBA的补不可判定.
DFA CFG BM,w? M,w, 可否构造DFA或CFG BM,w使得 L(BM,w)={<M在w上的接受历史>}, 若M接受w; = , 若M不接受w. 如果可以构造这样的BM,w, 则由类似推理可得: ATM无判定器 EDFA和ECFG无判定器,矛盾. 所以不可能构造这样的DFA或CFG BM,w. 但是我们可以考虑一个相反的问题.
*-{<M在w上的 接受历史>}, 若M接受w; L(PM,w)= *, 若M不接受w. 定理: ALLCFG不可判定 可以构造一个PDA PM,w, 使得 ALLCFG= {<G>|G是CFG,L(G)=*} M,w, <M,w>ATM <PM,w>ALLCFG. ATM m ALLCFG的补 ALLCFG不可判定.
PDA PM,w的构造 PM,w接受 (1) 不是格局序列C1,C2,…,Ck的编码. (2) C1不是起始格局. (3) Ck不是一个接受格局. (4) 某个Ci不产生Ci+1. (4)的说明, 编码:#C1#C2R#C3#C4R#… #Ck# 执行方式:扫描,直到它非确定性地到达某个#后, 将Ci或CiR推入栈,再弹出与Ci+1R或Ci+1比较, 除了读写头附近位置外,它们应该相同, 读写头附近位置的更改应由M的转移函数决定. 如果发现不匹配, PM,w就接受.
m与 补运算 • 定理 若AmB且B图灵可识别,则A图灵可识别. • 其证明与可判定性类似,只是将M,N改为识别器. • 推论 若AmB且A非图灵可识别,则B非图灵可识别. • AmB AcmBc. • (ATM)c非图灵可识别 • ATM m B Bc非图灵可识别 • ATM m Bc B 非图灵可识别
EQTM非图灵可识别 定理 EQTM既非图灵可识别,也非补图灵可识别. 证明: 一. ATMm(EQTM)c,即EQTM非图灵可识别 F=“对于输入<M,w>,其中M是TM,w是串: 1)构造下列两个机器Ml和M2. M1 = ‘对于任何输入: a.拒绝.’ M2 = ‘对于任何输入: a. 在w上运行M, 若M接受,则接受.’ 2)输出<M1,M2>.” M,w, <M,w>ATM <M1,M2>EQTM.
(EQTM)c非图灵可识别 二. ATMmEQTM, 即(EQTM)c非图灵可识别 F=“对于输入<M,w>,其中M是TM,w是串: 1)构造下列两个机器Ml和M2. M1^= ‘对于任何输入: a.接受.’ M2 = ‘对于任何输入: a.在w上运行M, 若M接受, 则接受.’ 2)输出<M1^,M2>.” M,w, <M,w>ATM <M1^,M2>EQTM.
主要内容 6.1 递归定理 6.1.1 自引用 6.1.2 递归定理的术语 6.1.3 应用 6.2 逻辑理论的可判定性 6.2.1 一个可判定的理论 6.2.2 一个不可判定的理论 6.3 图灵可归约性 6.4 信息的定义 6.4.1 极小长度的描述 6.4.2 定义的优化 6.4.3 不可压缩的串和随机性
递归定理 Undecidability –至此, 我们已经充分使用了接受问题的不可判定性 We proved the undecidability of ATM by making explicit the self-reference paradox: 采用了自引用,类似悖论的技巧 S = { <M> | TMs M that do not accept <M> }关键技术 Self-Reference: P accepts <P>.
Self-Reference What happens if a computer program M tries toanswer questions about itself <M>? 程序自己分析自己的源程序会出什么结果? Sometimes this is perfectly okay:- How big is <M>?- Is <M> a proper TM? Other questions lead to paradoxes:有时似是而非- Does <M> halt or not?如停机 - Is there a smaller program M’ that is equivalent? <M>是M的描述(可理解为源程序或编码
1) Bla-bla-bla; 2) Look at M = ; 3) More Bla-bla-bla; 4) Do something weird 1) Bla-bla-bla;(平凡) 2) Look at M = ; 3) More Bla-bla-bla; 4) Do something weird(奇怪 动作) M = M = 1) Bla-bla-bla; 2) Look at M = ; 3) More Bla-bla-bla; 4) Do something weird M = Avoiding Paradoxes? 递归 在这里调用自己 paradox 是错误理解的问题。 自引用的 TM 不能考虑自己的编码? Question: How is it possible to have the structure: How can we havethe completedescription of M inside M itself?
递归 的 第一种意义, 自己调用自己 • 从前有个庙,庙里有个老和尚,老和尚给小和尚讲故事,讲的故事是:”从前有个庙,庙里有个老和尚,老和尚给小和尚讲故事,讲的故事是……” Void story ( ) { printf(“从前有个庙,庙里有个老和尚,老和尚给小和尚讲故事,讲的故事是:”); story( ); } 毛病,没有递归深度控制,栈溢出时死机 镜子里面照镜子,电影里面放电影,故事里面讲故事 更新奇的是:
递归的 第一种意义, 自己调用自己 • 从前有个庙,庙里有个老和尚,老和尚给小和尚讲故事,讲的故事是:”从前有个庙,庙里有个老和尚,老和尚给小和尚讲故事,讲的故事是……” Void story ( ) { printf(“从前有个庙,庙里有个老和尚,老和尚给小和尚讲故事,讲的故事是:\r\n”); story( ); } 毛病,没有递归深度控制,栈溢出时死机 镜子里面照镜子,电影里面放电影,故事里面讲故事 更新奇的是:
递归 自己调用自己 • 从前有个庙,庙里有个老和尚,老和尚给小和尚讲故事,讲的故事是:”从前有个庙,庙里有个老和尚,老和尚给小和尚讲故事,讲的故事是……” Void story ( ) { printf(“从前有个庙,庙里有个老和尚,老和尚给小和尚讲故事,讲的故事是:\r\n”); story( ); } 毛病,没有递归深度控制,栈溢出时死机 镜子里面照镜子,电影里面放电影,故事里面讲故事,庄生梦蝶,梦里面做梦,更新奇的是:
递归 自己调用自己 • 庄生梦蝶 的IT新分析 • 庄子梦中化为蝴蝶, 梦醒之后糊蝶复化为庄周。庄子问道,到底是蝴蝶化为庄周, 还是庄周化为蝴蝶. (还在做梦) • 如果是:庄子梦中化为蝴蝶,蝴蝶做梦化为庄子, • 则是 梦里面做梦,递归梦
递归 的另一层意义: 自我繁殖 例1 Nitice ( ) { Printf(“通知:今天下午开会 请互相转告”);} 要点: 执行程序 必须 复制程序, 例2 传销式信件( ) { 收到本邮件的人必须给 你的上家 寄信片;//传销获利; 必须复制10份 散发给你的朋友; 否则…. } ( 效果:浪费大量网络资源) 例3 计算机病毒
M Printing M 打印自己的源程序 问题:可自我描述(繁殖)TM是否合法的图灵机? 可自我描述(繁殖)程序是否合法的程序? 本节拟证明, 满足一定规范的 自调用或自描述程序 是可以写 出来的,是合法的, 从数学本质上看,是正确的, 不是诡辩,不是悖论。 而且用途广泛 第一个实现递归的语言是什么语言? Algol60? 在这以前, 理论上已经描述递归是可能的。实现中 又发现了用栈的技巧等等
M Printing M 打印自己源程序 Attempt to describe a program that prints itself: M = print(“print(“print(“print … The Droste effect forces M to be infinite. 首递归 不可行 见不到输出.. 打印下面语句两个副本,第二次加引号: consider the following high-level program: print_twice_2nd_time_with_(“_“): (“print_twice_2nd_time_with_(“_“):”) … So it is possible to have such a TM M.The Recursion Theorem makes this explicit.
M Printing M 打印自己源程序 错误方法:Attempt to describe a program that prints itself: M = print(“print(“print(“print … The Droste effect forces M to be infinite. 正确方法 打印下面语句两个副本,第二次加引号: consider the following high-level program: print_twice_2nd_time_with_(“_“): (“print_twice_2nd_time_with_(“_“):”) … So it is possible to have such a TM M.The Recursion Theorem makes this explicit.
The Recursion Theorem 为定理6.2(递归的可行性)作准备 The recursion theorem in CS shows how we candeal with the Droste/self-reference effect for TMs. 递归的可行性 The key idea is to split the TM into two parts:1) a string that describes 2nd part of program 获得描述自己的串 (稍难) 2) a program that prints the string ‘smart’ 打印指定的串 (不难) How to construct a program <SELF> that prints itself…且看 下面细细道来
The Recursion Theorem 为定理6.2(递归的可行性)作准备 The recursion theorem in CS shows how we candeal with the Droste/self-reference effect for TMs. 递归的可行性 The key idea is to split the TM into two parts:1) a string that describes 2nd part of program 获得自己的第二部分源程序 串 (稍难) 2) a program that prints the string ‘smart’ 打印一个任意的指定的串 (不难) How to construct a program <SELF> that prints itself…且看 下面细细道来
A Simple Lemma Lemma 6.1 that prints w. The function q(w) = <Pw> is TM computable. 打印指定串的程序的源程序(解释执行的)是 可以用程序产生的 证明 程序 Pw(x) {x[0]=0; printf(w);} //总是打印外部串W q:Σ* Σ*, 使得q(w)=“ Pw(x) {x[0]=0; printf(w);}” 造计算q的TM Q (C程序)如下: Q(w ) { char *p=q(w);//函数值是一个源程序串的指针 printf(p); } } 下页是书上的证明
A Simple Lemma cp137 Lemma 6.1: Let w be an input string, and let Pwbe a TM that prints w. The function q(w) = <Pw> is TM computable. 打印指定串的程序的源程序是 可以用程序产生的 打印过程Pw(x) 的源程序 证明 程序Pw(x) {x[0]=0; printf(w);} //总是打印外部串W q:Σ* Σ*, 使得q(w)=“ Pw(x) {x[0]=0; printf(w);}” 造计算q的TM Q (C程序)如下: Q(w ) { char *p=q(w); //函数值是指向打印过程源程序的指针 printf(p); } } 下页是书上的证明
A Simple Lemma , cp137 书上的证明 Lemma 6.1: Let w be an input string, and let Pwbe a TM that prints w. The function q(w) = <Pw> is TM computable. 打印指定串的程序的源程序是 可以用程序产生的 Proof: Consider the TM (on input w):1) Construct TM Pw: 1) erase input 2) write w and halt 2) Output <Pw>
利用引理,造一个能打印自己源程序的程序The Program <SELF> = <AB> ep201 cp137 输入TM , 输出:源程序串 用C语言描述 库函数 B(<M>) { Get_source_as( <M>,P<M>);//反编译 printf(“%s%s”,P<M>,<M>); } main(char argv[] , int argc ) // 输入w 为 argv[1]=w { char *A=<B>;//B的源程序,如用argv[0]即EXE名,复制串 B(<A>); } 下页是书上的证明
§6.1.1 自引用 本节从制造一个图灵机开始,此图灵机忽略输入,且打印出它自己的描述。称之为SELF。 存在可计算函数 q: * *,对任意串w, q(w)是 图灵机Pw的描述,Pw打印出w,然后停机。 引理 6.1 • 证明: 一旦懂得这个引理的叙述,证明就容易。显然,可以任取一个字符串w,然后从它构造一个图灵机,使得此图灵机将w内装在一个表中,这样,当此图灵机开始运行后,它只要简单输出w即可。下列TM Q 计算q(w): • Q = “对于输入串w: 1)构造下列图灵机Pw: • Pw = “对于任意输入: • a)抹去输入。 • b)在带上写下w • c)停机。” • 2)输出< Pw >。”
§6.1.1 自引用 • SELF有两个部分,A,B。将A和B想象成两个分离过程,它们一起组成SELF.我们希望SELF打印出<SELF>=<AB> • A任务是打印出B的描述。B的任务是打印出A的描述。 A B (=P<B>) SELF的控制器 … 图6-1 SELF的示意图,一个打印它自己的描述的TM
§6.1.1 自引用 SELF的构造 • A部分首先运行,再根据完成情况将控制传给B。A的任务是打印出B的描述。B的任务是打印出A的描述。 • 先构造A部分 • 使用机器P<B>来定义A,其中P<B>用函数q在<B>处的值q(<B>)描述,这样,A部分是一个打印出<B>的图灵机。A的描述依赖于是否已经有了B的描述,所以在构造出B之前,无法完成A的描述。 • 对于B部分:从A产生的输出来计算A、 • 如果B能够得到<B>,就能应用q来得到<A>。但B如何得到<B>?当A结束时,它被留在带上。所以B只要看着带子就能得到<B>。计算q(<B>)=<A>之后,B将之加到带的前面。然后将A和B组合成一个机器并在带上写下它的描述<AB>=<SELF>。