利用子集法,可以將NFA轉化為與之等價的DFA。
記狀態機$A$為 $$A = ( V,\sum,\delta,V_{N},V_{T} )$$
$\epsilon \_CLOSURE$的求法
假設我們要構造狀態$I$的$\epsilon$_閉包,即$\epsilon \_CLOSURE(I)$。
基礎:$I \in \epsilon \_CLOSURE(I)$。
歸納:如果$s_i \in \epsilon \_CLOSURE(I)$,且存在$\delta(s_i,\epsilon) = s_j$,則$s_j \in \_CLOSURE(I)$。
子集法確定化NFA的步驟
(1)構造一張轉換表,其第一列為狀態子集$I$,對不同的$a \ (a \in \sum)$ 在表單中設一列$I_{a}$。
(2)表的第一行第一列其狀態子集$I$為$\epsilon \_CLOSURE(V_{T})$,其中$V_{T}$為初始狀態。
(3)根據第一列中的$I$,為每一個$a$求其$I_{a}$,並記入對應的$I_{a}$列中,並且對該狀態子集求$\epsilon \_CLOSURE$,如果此$I_{a}$不同與第一列中已存在的所有狀態子集$I$,則將其記入到空行的第一列。
(4)重復步驟(3),直到每個$I$及$a$,均已求得$I_{a}$,並且無新的狀態子集$I_{a}$加入第一列為止。
(5)重新命名第一列的每一個狀態子集,則轉換為新的狀態轉移矩陣。
下面是一個NFA,並且將NFA轉為DFA

下面是轉化過程

對第一列進行編號,形成新的DFA狀態,然后根據上面的狀態轉移矩陣畫圖。

為什么子集構造法是正確的
由這里可知,DFA識別字符串返回的是一個狀態,而NFA識別字符串是返回一個狀態集合。
由上面的步驟可知,子集構造法是將NFA識別的狀態集合作為DFA的一個狀態,所以NFA能識別的字符串,DFA照樣能夠識別,所以子集構造法是行之有效的。
下面給出形式化的證明
對於字符串$w$
要證明的只是對於$\delta_{D}(\epsilon\_CLOSURE(V_{T}),w) = \delta_{N}(V_{T},w)$
$\delta_{D}$是DFA的轉移函數 , $ \delta_{N}$是NFA的轉移函數
即從初始狀態開始,對於任意的字符串$w$,它們識別的情況是一樣的。
基礎:設$|w|=0$,即$w=\epsilon$,那么可知,$\delta_{D}(\epsilon\_CLOSURE(V_{T}),\epsilon) 和 \delta_{N}(V_{T},\epsilon)$都是$\epsilon\_CLOSURE(V_{T})$。
歸納:設$w$的長度為$n+1$,假設命題對長度$n$成立。把$w$分解成$w=xa$。$a$是字符串w的最后一個字符
那么根據假設, 有 $\delta_{D}(\epsilon\_CLOSURE(V_{T}),x) = \delta_{N}(V_{T},x)$。設這兩個狀態集合都是$\{ p_1,p_2,...,p_k \}$
那么NFA識別字符串$w$所得到的狀態集合是$$\delta_{N}(V_T,w) = \bigcup_{i=1}^{k} \delta_N(p_i,a)$$
而DFA識別字符串$w$所得到的狀態集合是$$\delta_D({p_1,p_2,...,p_k},a)=\bigcup_{i=1}^{k}\delta_D(p_i,a)$$
可知$$\delta_D({p_1,p_2,...,p_k},a)= \bigcup_{i=1}^{k} \delta_N(p_i,a)$$
所以,$$\delta_D({p_1,p_2,...,p_k},a) = \bigcup_{i=1}^{k} \delta_N(p_i,a)$$
所以得到了$L(D)=L(N)$的證明。
