本文主要介紹一下編譯原理中的子集構(gòu)造法的數(shù)學(xué)依據(jù)。
龍書(shū)中并沒(méi)有給出證明,我們?cè)谶@里補(bǔ)上。
網(wǎng)上雖然有一些證明,但大多數(shù)不是很細(xì),這里給出一個(gè)詳細(xì)的證明
NFA的形式化定義如下:
為一個(gè)5元組
其中是所有狀態(tài)的集合,
是符號(hào)集合,
是一個(gè)映射:
(其中
表示
的所有子集的集合,對(duì)于該映射的像為空集的情形,把對(duì)應(yīng)原像從定義域中排除,從而使得該映射的定義域?yàn)?img class="math-inline" src="https://math.jianshu.com/math?formula=K%5Ctimes%20%5Csigma" alt="K\times \sigma" mathimg="1">的子集,這一點(diǎn)后文中保持一致并且不再說(shuō)明)
為初始狀態(tài)集合
是終止?fàn)顟B(tài)集合
DFA為NFA的特例,滿足以下兩個(gè)額外條件:
1,只包含一個(gè)元素
2, 的任意象 都最多只包含一個(gè)元素
以上形式化定義十分抽象,但其實(shí)NFA只不過(guò)表達(dá)了一個(gè)無(wú)重邊的有向圖,對(duì)應(yīng)圖的節(jié)點(diǎn),
對(duì)應(yīng)圖的邊上的符號(hào),若
則表示,
到
中每個(gè)元素都有一條有向邊,且這些邊上的符號(hào)為
,
和
僅僅是
的特殊子集
子集構(gòu)造法主要是把一個(gè)轉(zhuǎn)化為一個(gè)
,為了給出其形式化描述,我們先給出以下定義:
1,給定
給定任意子集,以及任意一個(gè)符號(hào)
令
待構(gòu)建的DFA記為:
則有 ,
,
注意,根據(jù)的定義,其象最多只能包含一個(gè)元素,對(duì)于只包含一個(gè)元素的集合,我們這個(gè)元素替代,而對(duì)于不包含任何元素的集合,我們可以把其原像從定義域中排除;則上式可以簡(jiǎn)寫(xiě)為:
但是這個(gè)映射的定義域并非
而是其 子集。
簡(jiǎn)單來(lái)說(shuō),的狀態(tài)是 原始
的狀態(tài)集合,其映射
把某個(gè)狀態(tài)
和 某個(gè)符號(hào)
映射為唯一的狀態(tài)
,但是有些映射的像為空(這些映射的原像將被我們從定義域
中排除)
有了以上鋪墊,我們用偽代碼的形式,形式化的描述子集構(gòu)造法:
0,初始5元組中所有集合為空集,的定義域?yàn)榭占?br>
1取定
并將其添加到
,并令
為未標(biāo)定態(tài)
2,
K'
s
標(biāo)定
(若(s,c)不在定義域,則continue)
(箭頭這里表示添加的意思,同時(shí)令該t為未標(biāo)定態(tài))
在
的定義域中添加
,并令
以上算法確定了除了之外的所有元素,之后我們把
中所有包含位于
中元素的的對(duì)象取出組成一個(gè)集合,設(shè)為
至此我們按照算法完全構(gòu)建了
下面我們來(lái)做最關(guān)鍵的一步,證明以下兩點(diǎn):
1,子集構(gòu)造法生成的圖 確實(shí)滿足應(yīng)該滿足的性質(zhì)
2, 該DFA和原始NFA表達(dá)相同的語(yǔ)言
證明:
1, 應(yīng)該滿足的性質(zhì)為:
1-1,只包含一個(gè)元素
1-2, 的任意象 都最多只包含一個(gè)元素
根據(jù)我們的構(gòu)建算法,中只包含
,因此1成立,且由于
是單值映射,顯然2成立
2,該DFA和原始NFA表達(dá)相同的語(yǔ)言
2-1
首先證明原始NFA的語(yǔ)言包含于DFA
我們把形如:
的關(guān)系簡(jiǎn)稱(chēng)為“包含鏈”,當(dāng)時(shí),
對(duì)于NFA表達(dá)的語(yǔ)言中的任意一條語(yǔ)句,,顯然必然存在滿足上述條件的包含鏈
對(duì)于這樣一條語(yǔ)句,我們考慮DFA構(gòu)造方法,
有
會(huì)被執(zhí)行一次標(biāo)定,之后對(duì)于符號(hào)
,將執(zhí)行
以及
由 ,
, 推出
并且將有: 我們?cè)O(shè)
;
則會(huì)被執(zhí)行一次標(biāo)定,之后對(duì)于符號(hào)
將執(zhí)行
任意
以及
由,推出
并且將有: 令
;
.......,最終得到:
而這等價(jià)于是說(shuō):屬于 該DFA的語(yǔ)言。
從最初選擇的語(yǔ)句的任意性,證明完畢
2-2 其次證明DFA的語(yǔ)言不會(huì)超過(guò)NFA的語(yǔ)言,
DFA表達(dá)的語(yǔ)言中任意語(yǔ)句: 根據(jù)DFA映射特性,存在唯一的
滿足以下條件:
1)
我們考慮其中任意一個(gè)片段:
根據(jù)構(gòu)造算法,
將被執(zhí)行一次,之后不會(huì)再被修改
這意味著中任意元素
都,存在
中至少一個(gè)元素
使得
利用這個(gè)關(guān)系,我們不難推導(dǎo)出,存在元素:
滿足
結(jié)合
這對(duì)應(yīng)著NFA中的一條語(yǔ)句
證明完畢