句法模式識別(二)-正規文法、上下文無關文法

正規文法的特性

1.所有長度有限的語言都是正規的。

2.用正規文法當然能產生無限長串,其中週期重複部分的長度不大於非終止符的長度。

舉個例子


在此規則之下,能生成句子

其中週期重複部分爲ab,這個例子的非終止符的元素個數爲2,故滿足2不大於2.

 

自嵌入特性

我們把上下文無關文法中的正規文法去掉,剩下的那部分我們叫做真正的上下文無關文法

自嵌入特性是區分真正的上下文無關文法與正規文法的判定標準

即一個真正的上下文無關文法一定具有自嵌入特性,正規文法具有非自嵌入特性。亦即非自嵌入的上下文無關文法是正規文法,上下文無關文法就蛻化了。

 

 

什麼是自嵌入特性?

自嵌入顧名思義,就是能夠自己嵌入自己


當然必須保證vx不能是空串

 

uvwxy定理

這是一個用以判定上下文無關文法和正規文法的條件。

就是說,當這個文法滿足自嵌入條件,表示出來就是


那麼,可以得到


其中vx的重複次數相同且爲非空串時,則這個文法肯定就是真正的上下文無關文法。因爲這種週期形式是正規文法所不具有的。比如這種


就是必須要用真正的上下文無關文法。

 

下面介紹上下文無關文法的等價文法

不同的上下文無關文法,它們生成的語言有可能是等價的,這樣就涉及到一個最優文法的問題。那麼最優是什麼?最有就是高效、沒有冗餘和浪費。

 

粗略說有2種冗餘,而且只有非終止符能夠冗餘。終止符總是有用的啦。

其一是浪費環節。

浪費環節是說由單個非終止符傳遞到了單個的非終止符,比如


這種形式意味着B是多此一舉的,還不如直接A到C呢。

 

其二是無用環節。

細分又有2類。通俗說

1.無尾的無用非終止符

所謂無尾,就是咱用了這個終止符,話根本都沒法結束。有頭無尾。

A根本沒法最後變成常量(終止符)。

不存在x使得

 

2.無頭的無用非終止符

所謂無頭,就是這句話根本就不可能從這個非終止符開始。有尾無頭。

從起始符開始根本找不到含有A的句子。

從起始符S開始,不存在

 

首先介紹如何消去浪費環節。

消去浪費環節包括2個部分。

其一消去。

其二修正。

 

消去過程

這個過程用遞歸算法來實現。

就是要求出所有非終止符各自對應能到達的所有非終止符集合

 

舉個例子就好了


現在消去浪費環節,先考慮S,

發現S能在一步之內的非終止符只有A

在K1(S)集合中再次出發,在一步之內能走到的新非終止符只有B

再往後沒有新的非終止符了。

同理考察A,A在一步之內能到達的非終止符只有B了,記

再考察B,B根本就沒有能在一步之內能到達的新終止符。

 

於是這對應的3個集合就求完了


 

修正過程

修正過程就按照上面的消去過程打補丁就好了,因爲要消去一堆連接,舊橋拆了總得重新修吧。還是上面那個例子,先把之前的生成關係畫出來,如圖1黑線所示。


圖1

現在考慮A,根據集合,我們要去掉A到B的連接

那麼就得補上S到b、A到b、S到aS、A到aS,黃線代表。

 

然後再考慮S,要去掉S到A

那麼就得補上S到BAb,綠線代表。

 

注意:現在雖然看起來文法規則比以前更麻煩了,但是,實際生成句子的過程卻變得簡單了許多,所以簡化沒簡化還是要看療效。

 

下面介紹消去無用的終止符

消去無用終止符的思路就是,找出所有有用的非終止符,那麼剩下的自然就是沒有用的了。

 

消去無尾非終止符

找出所有的有尾非終止符集合,定義爲J(G)

方法是


這個表達式很清晰,還是舉個例子,反而繞口,但還是舉吧



這個表達式其實是一步步找到那些最終的到達終止符的非終止符

首先J0(G)爲空集。則J1(G)爲所有能一步走到以終止符爲尾的非終止符,即A

繼續,J2(G)是J1(G)並上所有能在一步之內到以J1(G)或者其他終止符爲尾的非終止符。

好繞口。。。其實就是{S,A}

再往下就找不到了。不過現在忽然發現,B呢?怎麼沒看到B的影子。

這就說明B就是無尾的無用非終止符

 

去掉所有跟B有過關係的生成關係就好,現在是新的生成關係


 

再說說消去無頭非終止符

也是隻要找出所有有頭的非終止符就好,剩下自然就無頭了

用表達式表示是這樣的


這個表達式的意義其實就是從起始符,回溯一步步展開,希望能找到句子的頭部。

 

還是舉個例子


展開起始符S,發現S能到aAA,因此R1(S)={S,A}

A繼續展開,發現A能到aCA,因此R2(S)={S,A,C}

搞定,又發現原來B是無頭的非終止符,趕緊刪掉與它有關係的所有表達關係就好了,不再贅述。

 

上下文無關文法的2中標準型

1.C(Chomsky)標準型


舉一個例子立即就知道怎麼把隨便一個上下文無關文本變成C標準型了:


 

2.G(Greibach)標準型


這個嚴格的轉化方法有點畸形,就暫時不展開了。簡單情況用湊的就好了。


歡迎參與討論並關注本博客微博以及知乎個人主頁後續內容繼續更新哦~

轉載請您尊重作者的勞動,完整保留上述文字以及本文鏈接,謝謝您的支持!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章