自动机理论、形式语言和计算导论提纲
我真的是覺得這門課太虛了。。這個(gè)總結(jié)基于名教材《自動(dòng)機(jī)理論、語(yǔ)言和計(jì)算導(dǎo)論》(機(jī)械工業(yè)),也可以說是這本書的總結(jié)。由于這門課里很多羅馬字母,打字很困難所以能省略的公式都不寫了,可以算是入門介紹了。這里省略的內(nèi)容,看看書就明白了。
A. 概念入門
1.有窮自動(dòng)機(jī):對(duì)于一個(gè)系統(tǒng),如果說他有有限個(gè)狀態(tài),在這些狀態(tài)間響應(yīng)外部輸入并按照一定規(guī)則切換,又能記憶當(dāng)前狀態(tài),則稱該系統(tǒng)為有窮自動(dòng)機(jī)。比如一個(gè)開關(guān)。有開和關(guān)兩態(tài),如果當(dāng)前態(tài)為開,撥動(dòng)開關(guān)狀態(tài)將成為關(guān),反之亦然。所以開關(guān)是一個(gè)有窮自動(dòng)機(jī)。
2.形式化證明:計(jì)算機(jī)也可以認(rèn)為是復(fù)雜的自動(dòng)機(jī),對(duì)于一個(gè)自動(dòng)機(jī)系統(tǒng)能夠做什么并不顯而易見,比如人們認(rèn)為很多事情是計(jì)算機(jī)無(wú)法實(shí)現(xiàn)的。為了驗(yàn)證這種可能性避免無(wú)用功,引入了形式化證明的概念。包括演繹證明和歸納證明。分別對(duì)應(yīng)我們高中學(xué)過的一般證明和歸納法。技巧包括反證法等等。
3.自動(dòng)機(jī)理論的中心概念:就是字母表,串和語(yǔ)言。顧名思義字母組成串(句子),串組成語(yǔ)言。
看看這些東西覺得這門課真夠虛。。。= =
B.有窮自動(dòng)機(jī)的分類
我們知道有窮自動(dòng)機(jī)之所以有窮,是說其狀態(tài)有限,但是在某個(gè)時(shí)刻自動(dòng)機(jī)能否只處于一個(gè)狀態(tài)來(lái)看,有窮自動(dòng)機(jī)可以分為確定型和非確定型有窮自動(dòng)機(jī)。后者可以利用算法“編譯”成前者。
1.確定型有窮自動(dòng)機(jī)(DFA):有有窮狀態(tài)集合和輸入符號(hào)集合,轉(zhuǎn)移函數(shù),初始狀態(tài),以及一個(gè)終結(jié)狀態(tài)集合。表示為 。DFA的狀態(tài)圖:用箭頭來(lái)表示狀態(tài)間的轉(zhuǎn)換,用圓圈+文字表示狀態(tài),用一個(gè)同心圓表示終結(jié)狀態(tài),用start表示開始狀態(tài)。狀態(tài)表:可以想象。
2.DFA上的語(yǔ)言——正則語(yǔ)言:正則語(yǔ)言定義為讓初始狀態(tài)到達(dá)一個(gè)結(jié)束狀態(tài)的串的集合。
這個(gè)串必須能滿足DFA的轉(zhuǎn)移函數(shù),也就是自動(dòng)機(jī)改變狀態(tài)的那個(gè)規(guī)則。為了讓這個(gè)函數(shù)能夠處理一串輸入,我們假設(shè)xa是一個(gè)以a結(jié)尾的串,并且σ是處理一個(gè)狀態(tài)和一個(gè)輸入的函數(shù),σ0為一個(gè)狀態(tài)和一串輸入的函數(shù),那么σ0(q,xa)=σ(σ0(q,x),a)。如果學(xué)過動(dòng)態(tài)規(guī)劃,這個(gè)和狀態(tài)轉(zhuǎn)移函數(shù)很像,不難理解。如果假設(shè)σ0(q,x)=p,那么相當(dāng)于σ0(q,xa)=σ(p,a),可以用這個(gè)思想逐步分解一個(gè)串輸入。
3.非確定型有窮自動(dòng)機(jī)(NFA):可以說是另一種看事物的角度吧。舉個(gè)例子,要接受所有以01結(jié)尾的字串,用q0表示開始搜索狀態(tài),q1表示找到了一個(gè)0的狀態(tài),q2表示緊接著找到了1(也就是說查找結(jié)束)。對(duì)于q0來(lái)說,如果下一個(gè)符號(hào)是1,他必須返回自身,因?yàn)檫@肯定不是我們要找的01結(jié)尾,如果下一個(gè)是0,他也不一定就是結(jié)尾的那個(gè)0,也可以返回自身,但是畢竟他是0,所以一旦找到一個(gè)0,就是可以進(jìn)入狀態(tài)q1了。也就是說,對(duì)于輸入0來(lái)說,可以處在q0q1兩個(gè)狀態(tài),所以就是NFA了。NFA也可以擴(kuò)展轉(zhuǎn)移函數(shù)σ
4.NFA和DFA的等價(jià)性。任何NFA都可以用DFA描述,但是狀態(tài)可能略多。下面通過一個(gè)例子來(lái)看看怎么轉(zhuǎn)化
?
下面是一個(gè)NFA狀態(tài)表0 1
->p {p,q} {p}
q {r} {r}
r {s} Φ
*s {s} {s}
算法是,初始狀態(tài)為p,他指向兩個(gè)狀態(tài),我們把{p,q}作為一個(gè)狀態(tài)考慮,輸入0的時(shí)候,p->{p,q},q->{r},也就是說{p,q}->{p,q,r},同理輸入1時(shí){p,q}->{p,r}。終結(jié)狀態(tài)是S,
而包含s的狀態(tài)集包括{s},{ps},{pqs},{qs},{rs},{prs},{qrs},{qprs},這些都是DFA的終結(jié)狀態(tài),但是其中很多不可能達(dá)到。
相信大家已經(jīng)知道怎么算了A = {p}; B = {p,q}; C = {p,r}; D = {p,q,r}; E = {p,q,s}; F = {p,q,r,s}; G = {p,r,s}; H = {p,s}.0 1
->A B A
B D C
C E A
D F C
*E F G
*F F G
*G E H
*H E H
?5.帶ε轉(zhuǎn)移的有窮自動(dòng)機(jī)
這種自動(dòng)機(jī)的思想就是允許無(wú)條件狀態(tài)轉(zhuǎn)向。舉例,在一串字符中查找字符串web和ebay,可以將任意字符狀態(tài)定義成q0,將進(jìn)入查找A設(shè)為q1,查找B設(shè)為q2。q0到q1q2是無(wú)條件的帶ε轉(zhuǎn)移,因?yàn)檫@三個(gè)狀態(tài)都沒有觸發(fā)關(guān)鍵字(比如w和e),都是任意字符輸入狀態(tài)。
ε閉包ECLOSE(P)定義為從狀態(tài)P通過ε通路能到達(dá)的所有狀態(tài)(包括P)的集合。從上面的描述可以看出ε轉(zhuǎn)移是可以消去的(比如我們可以不定義q1q2,直接設(shè)置一個(gè)觸發(fā)w的狀態(tài)q3和觸發(fā)e的狀態(tài)q4)。具體的方法看課本P55-56
C.正則表達(dá)式
1. 運(yùn)算符:取并的+運(yùn)算,連接,*是正則表達(dá)式的三種基本運(yùn)算。*代表任意數(shù)量個(gè)他左邊的單位。
比如:字母表{a,b,c}上至少一個(gè)a和至少一個(gè)b的集合:分析一下,如果a在b之前,那么出現(xiàn)第一個(gè)a之前,可以有任意個(gè)c,即為c*,隨后出現(xiàn)1個(gè)a,任意數(shù)量的a或c(或的概念往往通過取并表示),然后出現(xiàn)一個(gè)b,后面的字符串就可以隨便取a或b或c,那么表達(dá)為c*a(a+c)*b(a+b+c)*,類似b在a前面也一樣,最終結(jié)果是c*a(a+c)*b(a+b+c)* + c*b(b+c)*a(a+b+c)*
2.正則表達(dá)式的代數(shù)定律
把這個(gè)放到前面來(lái)會(huì)讓問題更簡(jiǎn)單。除了一些結(jié)合律交換律分配律等等大家可以自己衡量對(duì)錯(cuò)的數(shù)學(xué)定律,此外:
ε稱作單位元,εR=Rε=R. Φ稱作零元。?Φ*R=R*Φ=Φ,Φ+R=R。此外還有冪等律L+L=L,(L*)*=L*, Φ*=ε,ε*=ε
2.將DFA轉(zhuǎn)化為正則表達(dá)式
這個(gè)算法有點(diǎn)惡心所以花點(diǎn)篇幅。把DFA的狀態(tài)用自然數(shù)1~N表示,定義一個(gè)正則表達(dá)式Rij(K),表示DFA中從狀態(tài)i到j(luò)且中間不經(jīng)過大于k的節(jié)點(diǎn)的輸入串,另外i=j的時(shí)候考慮到一個(gè)狀態(tài)的ε轉(zhuǎn)移就是它自身,所以ε也是一個(gè)符合要求的串。拿我們上面用的那個(gè)DFA的圖來(lái)看,R00(0)=ε+b,R01(0)=b。
確定了k=0的情況,就可以用歸納法了。我們來(lái)考慮k時(shí)的情形,所有不經(jīng)過大于k的節(jié)點(diǎn)的路徑中,肯定包括不大于k-1的,因?yàn)椴淮笥趉-1肯定也就不大于k,換個(gè)角度看,這些路徑也根本不經(jīng)過k;那么肯定還包括一些路徑是包括k的,這些路徑在第一次遇到k以前,可以認(rèn)為是Rik(k-1),隨后包括任意數(shù)量的k節(jié)點(diǎn)上的閉包Rkk(k-1),隨后包括從k到j(luò)的一條已經(jīng)沒k了的路徑Rkj(k-1),綜上這種路徑表示為Rij(k)=Rij(k-1)+Rik(k-1)Rkk(k-1)*Rkj(k-1)。這也就是我們要找的計(jì)算任意k的公式。但是這樣帶入后得到的正則表達(dá)式很長(zhǎng),需要化簡(jiǎn)。
最終,DFA對(duì)應(yīng)的正則表達(dá)式是所有以初始狀態(tài)為i,終結(jié)狀態(tài)為j的表達(dá)式的并。
3.消除狀態(tài)簡(jiǎn)化運(yùn)算
對(duì)于任意一個(gè)不是初始狀態(tài)也不是終結(jié)狀態(tài)的狀態(tài),都肯定有一定的前驅(qū)節(jié)點(diǎn)和后繼結(jié)點(diǎn),要消去這個(gè)節(jié)點(diǎn),只需要用適當(dāng)?shù)恼齽t式在它的每個(gè)前驅(qū)和每個(gè)后繼之間做一個(gè)連接就行了。具體的方法在P66-67,很簡(jiǎn)單。
4.正則表達(dá)式轉(zhuǎn)化為自動(dòng)機(jī)(一般是ε-NFA)簡(jiǎn)單地說,正則表達(dá)式有三種微元,分別是R+S型,RS型,R*型,這三種可以轉(zhuǎn)化成三種基本的NFA,任何正則表達(dá)式都能通過三種微元組合成。這三種NFA見課本P70-71
D. 正則語(yǔ)言性質(zhì)
1.正則語(yǔ)言具有封閉性,這和集合上的運(yùn)算封閉性差不多,不多說了。能夠保證正則的運(yùn)算包括:并,連接,閉包,交,補(bǔ),差,反轉(zhuǎn),同態(tài)和逆同態(tài)。同態(tài)就是把輸入串中每一個(gè)輸入都通過一個(gè)函數(shù)轉(zhuǎn)變成另一個(gè)串,該函數(shù)叫做串的同態(tài)。如果一個(gè)語(yǔ)言是正則的,針對(duì)其字母表的同態(tài)也是正則的,這是顯然的,因?yàn)榫褪亲隽藗€(gè)替換而已沒有本質(zhì)變化啊。
2.泵引理:為了驗(yàn)證一個(gè)語(yǔ)言是不是正則的,我們需要使用泵引理,該引理稱,對(duì)于任意一個(gè)正則語(yǔ)言W,一定能把他分解成W=xyz,其中|xyz|>=n,y!=Φ,|xy|<=n,而且xy*z一定也屬于w。下面通過一個(gè)例子說明一下泵引理的用法。
證明{0(m)1(m) | m>=1}不是正則語(yǔ)言,其中0(m)表示0的m次我們假設(shè)這個(gè)語(yǔ)言是正則的,那么由于該語(yǔ)言的長(zhǎng)度至少是2,所以n=2,將該語(yǔ)言分解成三部分,且|xy|<=2,只能令x=y=0,z=0(m-2)1(m),由于xy*z也屬于該正則語(yǔ)言,但是有任意個(gè)y的時(shí)候0的個(gè)數(shù)肯定和1的個(gè)數(shù)不等,也就是說這個(gè)語(yǔ)言不可能屬于{0(m)1(m)}得到矛盾,所以這個(gè)語(yǔ)言不是正則的。
3.測(cè)試正則語(yǔ)言是否為空:可以分別測(cè)試子正則語(yǔ)言是否為空
4.驗(yàn)證正則語(yǔ)言中一對(duì)狀態(tài)是否等價(jià):使用的填表算法是,橫軸為A.....(N-1),縱軸為中間狀態(tài)和接收狀態(tài)B.....N, 建一個(gè)三角形的表。如果A不是接收狀態(tài)但B是,那么{A,B}是一個(gè)可區(qū)分對(duì),在其對(duì)應(yīng)位置畫X,對(duì)于任意一對(duì)狀態(tài){M,N},如果某個(gè)輸入下M指向A,N指向B,那么這一對(duì)狀態(tài)可區(qū)分,可以根據(jù)這個(gè)特點(diǎn)遞歸直到無(wú)法推出更多可區(qū)分狀態(tài)對(duì)為止,那么無(wú)法推出的狀態(tài)對(duì)就是等價(jià)的。
5.自動(dòng)機(jī)最小化:可以想象求出等價(jià)狀態(tài)就是為了消去他們……自動(dòng)機(jī)的最小化要求首先把等價(jià)狀態(tài)作為一個(gè)狀態(tài),然后把從初始狀態(tài)不可達(dá)的狀態(tài)除去,重構(gòu)自動(dòng)機(jī)即可。
E. 上下文無(wú)關(guān)文法和語(yǔ)言
相比前面的內(nèi)容,這一章更虛了……幾乎都是些不用腦子的東西
1. 上下文無(wú)關(guān)語(yǔ)言:可以認(rèn)為是比正則語(yǔ)言更廣泛的一種語(yǔ)言,其“自然的遞歸記號(hào)”稱作文法。這些定義是什么意思無(wú)關(guān)緊要。簡(jiǎn)單地說,文法就是描述語(yǔ)言的方法。而文法包括四個(gè)要素:符號(hào)的有窮集合(這些符號(hào)被稱作終結(jié)符號(hào),類似于英語(yǔ)中的字母),變?cè)挠懈F集合(變?cè)脖环Q作非終結(jié)符或語(yǔ)法范疇,每一個(gè)變?cè)砹艘活惔?#xff0c;也就是一種語(yǔ)言),一個(gè)變?cè)环Q作初始符號(hào),以及一個(gè)規(guī)則(也稱作產(chǎn)生式)的集合。通俗地說,包括字母,語(yǔ)言集,一個(gè)基本語(yǔ)言和一個(gè)語(yǔ)法規(guī)則。文法縮寫式CFG,表達(dá)式是G=(V,T,P,S)。主要的應(yīng)用是CFG描述語(yǔ)言并轉(zhuǎn)化為語(yǔ)法分析器,以及XML等標(biāo)記語(yǔ)言語(yǔ)言結(jié)構(gòu)。下面的例子可以迅速理解這些亂七八糟的東西
習(xí)題 定義一個(gè)CFG,它是一種表達(dá)式,但是運(yùn)算符只有+和*,標(biāo)識(shí)符必須由字母開頭,字母只有a和b,數(shù)字只有0和1。分析:該文法需要兩個(gè)變?cè)?#xff0c;一個(gè)代表了整個(gè)表達(dá)式稱作E(也是一個(gè)初始符號(hào)),一個(gè)代表了其中的標(biāo)識(shí)符稱作I,我們能得到下面的“文法”
E->I //表示表達(dá)式可以由標(biāo)識(shí)符組成
E->E+E //表達(dá)式可以由兩個(gè)表達(dá)式+成
E->E*E //表達(dá)式可以由兩個(gè)表達(dá)式*成
E->(E)
I->a //表達(dá)式可以由a組成
I->b
I->Ia //表達(dá)式可以由I與a連接成
I->Ib
I->I0
I->I1
我們來(lái)看看a*(a+b00)是否屬于這個(gè)語(yǔ)言。E=>E*E=>I*E=>a*E=>a*(E)=>a*(E+E)=>a*(I+I)=>a*(a+I0)=>a*(a+I00)=>a*(a+b00)
可見屬于這個(gè)語(yǔ)言。
上面的文法可以表示為I=>a|b|Ia|Ib|I0|I1 ,E=>I|E+E|E*E|(E),上述驗(yàn)證過程稱作推導(dǎo)。如果每次只替換最左邊的變?cè)?#xff0c;就稱作最左推導(dǎo),反之稱作最右推導(dǎo)。利于該文法在終結(jié)符號(hào)集合上產(chǎn)生的語(yǔ)言稱作上下文無(wú)關(guān)語(yǔ)言(CFL)。由初始符號(hào)得到的表達(dá)式稱作句型,比如E+E就是一個(gè)句型,和最左最右推導(dǎo)融合后還有左句型和右句型的概念。
?2. 語(yǔ)法分析樹:也就是推導(dǎo)的另一種表示法。對(duì)于一個(gè)文法G來(lái)說,語(yǔ)法分析樹滿足每個(gè)內(nèi)部節(jié)點(diǎn)的標(biāo)號(hào)都是V的變?cè)?#xff0c;每個(gè)葉節(jié)點(diǎn)可以是變?cè)?、終結(jié)符或者ε。一個(gè)節(jié)點(diǎn)的所有子節(jié)點(diǎn)按順序排列是這個(gè)節(jié)點(diǎn)對(duì)應(yīng)變?cè)囊粋€(gè)變換。推理和樹的互推非常淺顯,看兩個(gè)例子就明白了。
3. CFG和語(yǔ)言的歧義性:類似于1+2*3中先加還是先乘的問題,一個(gè)串可能有多個(gè)語(yǔ)法生成樹或者對(duì)應(yīng)地,有多個(gè)最左推導(dǎo)或者最右推導(dǎo),那么這個(gè)語(yǔ)言是有歧義的。某些文法無(wú)法消除歧義性,有些則沒有歧義性。一般的文法,消除歧義的方法就是使用優(yōu)先級(jí)和結(jié)合律,比如規(guī)定始終左結(jié)合或者右結(jié)合。對(duì)應(yīng)地,無(wú)歧義文法只有唯一最左或最右推導(dǎo)。
強(qiáng)制優(yōu)先級(jí)是有效的消歧義方法,做法是引入不同的變?cè)?#xff0c;其中因子是不能被相鄰運(yùn)算符打斷的表達(dá)式,屬于因子的包括標(biāo)識(shí)符本身和括號(hào)表達(dá)式。第二,項(xiàng)是不能被低級(jí)運(yùn)算符打斷的表達(dá)式,第三就是普通的表達(dá)式。
由于這一部分很難語(yǔ)言描述,看題目比較容易明白,下面簡(jiǎn)單說幾個(gè)習(xí)題的做法:?
習(xí)題 1.?證明如果一個(gè)串是括號(hào)匹配的,那么他能用文法B->BB|(B)|ε生成。證明:如果串長(zhǎng)度為1,首先他當(dāng)然是括號(hào)匹配的,設(shè)為T,可以用T->TT->Tε生成,假設(shè)成立。
??????????現(xiàn)在假設(shè)串長(zhǎng)度為K成立,設(shè)串為TK,那么K+1時(shí),要想串是括號(hào)匹配的,則他只能是用若干個(gè)匹配串組合即T(K+1)->T(M)T(N)或者組合后加括號(hào),或者添加若干ε,都可以用該文法生成。歸納結(jié)束
2.證明S->aS|aSbS|ε這個(gè)文法是歧義的,即對(duì)串a(chǎn)ab有兩個(gè)語(yǔ)法分析樹,最左最右推導(dǎo)。思考在證明歧義性上面分析樹和最左右推導(dǎo)數(shù)量的等價(jià)性。
證明:最左推導(dǎo):S->aS->aaSbS->aaεbS->aaεbε->aab,??S->aSbS->aaSbS->aaεbε->aab,最右推導(dǎo)和分析樹類似。
如果要制定一個(gè)沒有歧義的文法,因?yàn)樵瓉?lái)文法的問題在于aab=(aa)b或者a(ab),所以需要強(qiáng)制結(jié)合性,這三個(gè)子表達(dá)式我們只能把結(jié)合性考慮在a、b都出現(xiàn)的aSbS上面,令b強(qiáng)制和前面的a結(jié)合就行了。做法是S->aTbS,?T->aTbT|ε
F. 下推自動(dòng)機(jī)
?如同正則語(yǔ)言和有窮自動(dòng)機(jī)等價(jià),上下文無(wú)關(guān)語(yǔ)言和下推自動(dòng)機(jī)(PDA)等價(jià)。下推自動(dòng)機(jī)是附加了堆棧的ε-NFA。簡(jiǎn)單地說,PDA有一個(gè)初始狀態(tài)和初始堆棧符號(hào),之后他接受輸入改變狀態(tài),根據(jù)當(dāng)前輸入和狀態(tài)決定堆棧操作(壓?;蛘邚棾龇?hào)),最終到達(dá)終結(jié)狀態(tài)。公式P=(Q ,Σ, Γ, σ, Q0,Z0, F),分別對(duì)應(yīng)狀態(tài)集合,輸入符號(hào)集合,堆棧字母表,轉(zhuǎn)移函數(shù),初始狀態(tài),初始堆棧符號(hào)和接收狀態(tài)集合。其中σ的自變量是狀態(tài),輸入內(nèi)容和堆棧字母符號(hào)(棧頂),輸出則是新狀態(tài)和堆棧符號(hào)串的對(duì)的有限集合,即σ(q,a,X)={(q' , r), ....}
下推自動(dòng)機(jī)的圖形表示和NFA類似,但是從狀態(tài)p到q的標(biāo)號(hào)a,X/r表示σ(p,a,X)的輸出集合中包含了(q,r)對(duì)。
?PDA的每個(gè)狀態(tài)可以用三個(gè)變量描述,q代表一個(gè)狀態(tài),w是剩余的串,r為堆棧內(nèi)容,(q,w,r)是一個(gè)PDA的瞬時(shí)描述(ID)。定義├符號(hào)是PDA從一個(gè)ID到另一個(gè)ID,用法如(q,aw,xβ)├(p,w,αβ),表示用剩余串的字符a代替了棧頂元素x,思考一下,如果x=ε,這個(gè)式子代表了壓棧操作。
PDA有兩種接受方法,一種是到達(dá)終結(jié)狀態(tài),稱作終結(jié)狀態(tài)方式接受, 一種是空棧方式接受。兩種構(gòu)造方式下,PDA等價(jià)。那么自然,兩種方式可以相互轉(zhuǎn)化。從
終結(jié)狀態(tài)方式轉(zhuǎn)化到空棧,常用的方法是添加一個(gè)棧底標(biāo)記符號(hào)X0,到達(dá)終結(jié)狀態(tài)的時(shí)候,添加一個(gè)轉(zhuǎn)移是從該狀態(tài)的ε輸入,彈出所有元素到空棧。例如σ(q, ε ,Y)={(q,ε)}
從文法到PDA,轉(zhuǎn)化方法是,對(duì)于每一個(gè)變?cè)狝,σ(q, ε, A)={(q,β)|A->β是文法的一個(gè)產(chǎn)生式}, 對(duì)于每一個(gè)終結(jié)符a,σ(q,a,a)={(q, ε)}
從PDA到文法,轉(zhuǎn)化方法是, 首先我們定義一個(gè)符號(hào)S為初始符號(hào),以及所有形式為[pxq]的符號(hào),pq是PDA中的狀態(tài),X則是堆棧中的符號(hào)。
首先對(duì)于每一個(gè)狀態(tài)p,文法G都有產(chǎn)生式S->[q0Z0P], 也就是說初始符號(hào)能夠生成所有從初始ID出發(fā)到達(dá)空棧狀態(tài)的串w。其次,令 σ(q, a, X)包含一個(gè)輸出對(duì)(r,Y1Y2Y3.......YK),那么G應(yīng)該有一個(gè)產(chǎn)生式[qXrk]->a[rY1r1][r1Y2r2]... [r(k-1)Ykrk],思考一下,這代表從狀態(tài)q到達(dá)狀態(tài)r(k)并從棧彈出X的一個(gè)方法是讀入a,之后讀入某些輸入,從棧中依次彈出 Y1Y2Y3.......YK,并轉(zhuǎn)過一些中間狀態(tài)r r1 r2.....r(k-1),最后達(dá)到rk。而r1r2...rk代表狀態(tài)集的每一個(gè)有序序列,比如一個(gè)PDA有pq兩個(gè)狀態(tài),那么按照pq和qp的順序要生成兩次。(我承認(rèn)沒說明白= =)?
習(xí)題把文法S->0S1?|?A,?A->1A0?|?S|?ε轉(zhuǎn)化成空棧方式接受同樣語(yǔ)言的PDA,再把該P(yáng)DA轉(zhuǎn)換成文法。首先σ(q,?ε?,?S)={(q,?0S1),?(q,?A)},?σ(q,?ε,?A)={(q,1A0),?(q,S),?(q,?ε?)}
然后σ(q,?0,?0)={(q,?ε)},?σ(q,?1,?1)={(q,ε)}
這就是我們構(gòu)造出的PDA的轉(zhuǎn)移函數(shù),對(duì)應(yīng)PDA是P=(?{q},?{0,1},?{0,?1,?S,?A},?σ,?q,?S)
下面我們把這個(gè)PDA轉(zhuǎn)成文法
設(shè)置一個(gè)初始狀態(tài)S,那么S->[qSq],?而因?yàn)棣?q,?ε?,?S)={(q,?0S1),?(q,?A)},[qSq]->ε[q0q][qSq][q1q]
[qSq]->ε[qAq],?[qAq]->[q1q][qAq][q0q],?[qAq]->[qSq],?[qAq]->[qεq]
[q0q]->0[qεq]=0,?[q1q]->1[qεq]=1;
簡(jiǎn)化上面的式子,可以看到
[qSq]->0[qSq]1?|?[qAq]?,?[qAq]->1[qAq]0?|?[qSq]?|?ε
用A代替[qAq],?S代替[qSq],可以得到題目中的文法
可以進(jìn)一步感受到文法和PDA的等價(jià)性。
G.CFL的性質(zhì)
1.首先討論所謂CFG的范式,即任何不是ε的CFL都能用只有A->BC或者A->a形式的產(chǎn)生式的CFG產(chǎn)生,其中ABC是變?cè)?#xff0c;a是終結(jié)符,這種形式稱作喬姆斯基范式。為了求出范式,我們要先給出一些定義。首先如果某個(gè)終結(jié)串w有X-*>w(-*>為任意多步數(shù)轉(zhuǎn)化),稱X是產(chǎn)生的。任何終結(jié)符都是產(chǎn)生的。此外,如果對(duì)于某個(gè)串 α和β有S-*>αXβ,稱X是可達(dá)的。
首先去掉無(wú)用符號(hào),做法是去掉非產(chǎn)生符號(hào)和所有包含這些符號(hào)的產(chǎn)生式,之后去除非可達(dá)符號(hào)。而且他們產(chǎn)生的語(yǔ)言是相同的。在這個(gè)過程中有幾點(diǎn)注意事項(xiàng):首先,文法G的終結(jié)符號(hào)集合T中的符號(hào)都是產(chǎn)生的,那么假定一個(gè)產(chǎn)生式A->α,而串α中的符號(hào)都是產(chǎn)生的,那么A也是產(chǎn)生的。通過這種方法得到的符號(hào)集也是這個(gè)文法中全部產(chǎn)生符號(hào)了??梢?#xff0c;尋找產(chǎn)生符號(hào)的過程是自底向上的,同樣,尋找可達(dá)符號(hào)是自頂向下的,而且得到的也是全部可達(dá)符號(hào)。然后去ε產(chǎn)生式?;叵胍幌?ε,它在一個(gè)語(yǔ)言中不是必需的,如果一個(gè)語(yǔ)言有對(duì)應(yīng)的CFG,那么他去掉ε后也有一個(gè)對(duì)應(yīng)的不含ε產(chǎn)生式的CFG,如果CFG有一個(gè)產(chǎn)生式A->w,w中所有符號(hào)都可空或者w就是ε,那么A是可空符號(hào)。構(gòu)造一個(gè)除ε產(chǎn)生式的CFG的方法是,對(duì)于每個(gè)產(chǎn)生式A->BCDEF....,假定其中有m個(gè)可空符號(hào),那么新文法中,這些可空符號(hào)每個(gè)都有存在和不存在兩種可能,共有2m種組合,但是如果這些符號(hào)都可空,他們都不存在的話就是A->,這在新文法中不能出現(xiàn),所以除去這種情況。這樣得到的文法是去ε產(chǎn)生式的。
對(duì)CFG???S->AB,A->aAA|ε,?B->bBB|ε
A,B都能直接生成ε,他們都是可空的,S生成符號(hào)都可空所以S可空?,F(xiàn)在考慮生成式S->AB,A和B存在不存在共4中組合,但是AB都不存在是ε,要去掉,所以新文法中:S->AB|A|B,類似地,A->aAA|aA|a,?B->bBB|bB|b 之后去掉單位產(chǎn)生式,也就是A->B形式的產(chǎn)生式,其中AB必須都是變?cè)H绻鸄-*>B,稱(A,B)為單位對(duì)。對(duì)于任意變?cè)狝, (A,A)是單位對(duì),如果(A,B)是單位對(duì),又有單位產(chǎn)生式B->C,那么(A,C)也是單位對(duì)。通過這個(gè)迭代可以得到所有單位對(duì)。之后對(duì)于每一 對(duì)單位對(duì)(A,B),如果有一個(gè)非單位產(chǎn)生式B->α,就把A->α放到新文法中,這樣得到的新聞法是不包含單位產(chǎn)生式的。首先去掉ε產(chǎn)生式,然后去單位產(chǎn)生式,最后去掉無(wú)用符號(hào)。這個(gè)順序可以保證結(jié)果是喬姆斯基范式(CNF)。但是對(duì)于CNF還有兩個(gè)要求,就是要用變?cè)嫠薪K結(jié)字符,如果有長(zhǎng)度大于2的轉(zhuǎn)化,也要引入新的變?cè)妗?span id="ozvdkddzhkzd" class="cnblogs_code_collapse">例子將文法S->ASB|ε,?A->aAS|a,B->SbS|A|bb轉(zhuǎn)化為CNF
首先去ε產(chǎn)生式,只有S是可空的,那么檢查所有帶S的生成式并改正,為:
S->AB|ASB,?A->aA|aAS|a,B->Sb|bS|SbS|A|bb|b
然后去掉單位產(chǎn)生式,只有(B,A)是一個(gè)單位對(duì),所以其它不變,?B?->?SbS?|?bS?|?Sb?|?b?|?aAS?|?aA?|?a?|?bb
最后檢查無(wú)用符號(hào),結(jié)果是沒有
那么下面引入C->a,D->b
這樣還是有長(zhǎng)度是3的生成式,引入新的變?cè)嫠麄?#xff0c;最后
?????S?->?AE?|?AB
?????A?->?CF?|?CA?|?a
?????B?->?SG?|?DS?|?SD?|?b?|?CF?|?CA?|?a?|?DD
?????C?->?a
?????D?->?b
?????E?->?SB
?????F?->?AS
?????G?->?DS
?2.下面給出CFL的泵引理證明某個(gè)語(yǔ)言不是上下文無(wú)關(guān)的:對(duì)于一個(gè)CFL L,存在常數(shù)n滿足:若L中的串z的長(zhǎng)度>=n,就可以令z=uvwxy, 且:|vwx|<=n, vx!=ε, 對(duì)于所有i>=0,uviwxiy也屬于L。
3. CFL在代入、并、連接、閉包、反轉(zhuǎn)和逆同態(tài)運(yùn)算下都封閉,但是交補(bǔ)運(yùn)算下不封閉,但CFL和正則語(yǔ)言的交依舊是CFL。
4.存在算法可以判斷CFG是否產(chǎn)生至少一個(gè)串,CYK算法可以判定一個(gè)串是否屬于一個(gè)給定的CFL,測(cè)試時(shí)間是O(n3) ,n是串長(zhǎng)度。詳細(xì)算法看課本。有些問題是不可判定的,比如某個(gè)CFG是不是歧義的,是不是固有歧義的,兩個(gè)CFG交是否為空……等等。
?H. 圖靈機(jī)導(dǎo)引
首先要說明的是某些問題是不能判定的。為了證明一個(gè)問題是不是不可判定的,可以對(duì)他進(jìn)行構(gòu)造抽象,再特殊化得到一個(gè)實(shí)例,再對(duì)實(shí)例構(gòu)造……最后對(duì)一個(gè)抽象實(shí)例判定,即所謂歸約技術(shù)。但是有個(gè)更方便簡(jiǎn)單的計(jì)算機(jī)模型就是圖靈機(jī)。簡(jiǎn)單地說(其實(shí)也就是這樣)圖靈機(jī)(TM)由一條劃分成單元的帶子和一個(gè)有窮控制單位組成。 單元上記錄有一個(gè)輸入符號(hào),圖靈機(jī)的一步可以改變狀態(tài)或者在掃描的單元中寫符號(hào)或者移動(dòng)帶頭。沒有輸入的單元用空格填充??崭癫皇禽斎敕?hào),但是是圖靈機(jī)的一個(gè)帶符號(hào)。圖靈機(jī)M=(Q, Σ, Γ, σ ,q0,B,F),分別代表狀態(tài)的有窮集合,輸入符號(hào)集合,帶符號(hào)集合,轉(zhuǎn)移函數(shù),初始狀態(tài),空格和終結(jié)狀態(tài)。其中σ(q,X)=(p,Y,D),表示某個(gè)狀態(tài)q下正在掃描X,轉(zhuǎn)移到狀態(tài)p,在X的位置上寫下Y,并向左或右移(D=L或R).同樣圖靈機(jī)也有ID,是用X1X2...Xi-1qXiXi+1...Xn表示的,其中q是TM的當(dāng)前狀態(tài),而帶頭正在掃描第i個(gè)符號(hào)(Xi),剩下的內(nèi)容表示Xi左邊和右邊空格之內(nèi)的部分。圖靈機(jī)的轉(zhuǎn)移圖上弧標(biāo)記形如0/0->,表示在此狀態(tài)下將0改寫成0,并右移。
同樣圖靈機(jī)也和一種語(yǔ)言等價(jià),即遞歸可枚舉語(yǔ)言(RE)。此外,如果圖靈機(jī)在某狀態(tài)下掃描到一個(gè)未定義的輸入 ,則停機(jī)。為了用圖靈機(jī)生成字符串,比較有用的技巧包括用狀態(tài)存儲(chǔ),多道和子程序。此外還有多帶圖靈機(jī),并可以證明它和單帶圖靈機(jī)等價(jià)。類似DFA和NFA的關(guān)系,也存在非確定圖靈機(jī)(NTM),同樣NTM和TM也能相互轉(zhuǎn)化。對(duì)TM稍作改造可以形成半無(wú)窮帶TM、多堆棧機(jī)器和計(jì)數(shù)器機(jī)器。此外計(jì)算機(jī)和圖靈機(jī)可以互相模擬。
?I. 不可判定性
?圖靈機(jī)接受RE,對(duì)于一個(gè)輸入語(yǔ)言,TM有兩種行為。一種是經(jīng)過狀態(tài)轉(zhuǎn)變最終停機(jī),不管是接收狀態(tài)的停機(jī)還是不接受狀態(tài)停機(jī),這種情形稱作有算法。而另一種就是陷入死循環(huán),這種問題稱作不可判定性問題。首先,對(duì)角化語(yǔ)言非RE:簡(jiǎn)單地說,將一個(gè)圖靈機(jī)進(jìn)行編碼。圖靈機(jī)的狀態(tài)和符號(hào)都可以枚舉成數(shù)字,方向有兩個(gè),轉(zhuǎn)移函數(shù)也就因此可以編碼,從而圖靈機(jī)可以編碼成二進(jìn)制串。而這些二進(jìn)制串也可以枚舉。方法是在串前面加個(gè)1然后轉(zhuǎn)十進(jìn)制,比如串0編碼是第2個(gè)串。之后建表將對(duì)角線取補(bǔ)得到的語(yǔ)言可以確定不被任何圖靈機(jī)接受。對(duì)角化語(yǔ)言Ld是非遞歸可枚舉的。
從前面可以看到,RE也非為遞歸語(yǔ)言和非遞歸語(yǔ)言。遞歸語(yǔ)言的補(bǔ)也遞歸,同樣,語(yǔ)言L和他的補(bǔ)都是RE,那么L遞歸。
對(duì)于每個(gè)TM M和它接受的語(yǔ)言w可以組成有序?qū)?M,w),有序?qū)Φ募袭a(chǎn)生的語(yǔ)言即所謂通用語(yǔ)言Lu,而Lu一定有接受它的圖靈機(jī),即通用圖靈機(jī)。盡管如此,Lu不可判定。
?
-------------------------------------
到此自動(dòng)機(jī)的總結(jié)完成,雖然說不可判定性和難解問題還有一些沒有說,但是貌似考試大綱不包括這些內(nèi)容。下面為了方便有一個(gè)縮略詞表:
?CFG 上下文無(wú)關(guān)文法 CFL 上下文無(wú)關(guān)語(yǔ)言 CNF 合取范式 DFA有窮狀態(tài)自動(dòng)機(jī) DPDA 確定型下推自動(dòng)機(jī) ID 瞬時(shí)描述 NFA 非確定型有窮自動(dòng)機(jī) PDA 下推自動(dòng)機(jī) TM 圖靈機(jī) RE 遞歸可枚舉語(yǔ)言 NTM 非確定圖靈機(jī)
轉(zhuǎn)載于:https://www.cnblogs.com/superx/archive/2010/12/13/1868673.html
總結(jié)
以上是生活随笔為你收集整理的自动机理论、形式语言和计算导论提纲的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端一些面试问题3
- 下一篇: 输入法智能化发展历程