【計算理論】正則語言 ( 推廣型的非確定性有限自動機 GNFA | 刪除狀態 | 確定性有限自動機 轉爲 正則表達式 )

文章目錄





推廣型的非確定性有限自動機 ( GNFA ) 引入



1 . 給定一個自動機 , 必有一個正則表達式可以表示其所識別的語言 ;


2 . 引入 推廣型的非確定性有限自動機 ( GNFA ) : 首先要構造一個推廣的一般型的非確定性有限自動機 , 每次消除一個狀態 , 最後只剩下兩個狀態 , 此時箭頭上的正則表達式就是最終的正則表達式 ;

在這裏插入圖片描述

上述自動機是一個 推廣型的非確定性有限自動機 ( GNFA ) , 箭頭上 不是單個字符 或 空字符 , 而是 正則表達式 ;



3 . 推廣型的非確定性有限自動機 ( GNFA ) 中的推廣的體現 :


① 非確定性有限自動機 ( NFA ) : 箭頭上 只能出現 字符 , 空字符串 , 22 種輸入 , 不能出現其它輸入內容 ;

② 推廣型的非確定性有限自動機 ( GNFA ) : 箭頭上 可以出現 字符 , 空字符串 , 空集 , 正則表達式 , 44 種輸入 ;


4 . 推廣型的非確定性有限自動機 ( GNFA ) 與 非確定性有限自動機 ( NFA ) 是等價的 ;





推廣型的非確定性有限自動機 ( GNFA ) 刪除狀態



給定一個 推廣型的非確定性有限自動機 ( GNFA ) , 找到一個正則表達式 , 代表給定自動機的語言 ;

在這裏插入圖片描述

1 . 需求描述 : 上述自動機中 , R1,R2,R3,R4R_1 , R_2, R_3, R_4 都是正則表達式 ;


刪除 q0q_0 狀態 : 目前希望能刪除 自動機中的 q0q_0 狀態 , 刪除 q0q_0 之後 , 會省略一部分語言 , 這裏 省略了 R1,R2,R3R_1 , R_2 , R_3 ;

語言要求 : q0q_0 狀態刪除後 , 不影響整個自動機所接受的語言 , 那麼需要將省略的部分語言 , 補充到 R4R_4 中 ;



2 . R1,R2,R3R_1 , R_2 , R_3 關係分析 :


R2R_2 星運算 : R2R_2 是一個循環 , q0q_0 接受 R2R_2 後 , 仍然保持 q0q_0 狀態 , 這裏的該循環的正則表達式表示爲 (R2)(R_2)^* ;

R1R_1(R2)(R_2)^* 串聯運算 : R1R_1(R2)(R_2)^* 是串聯關係 , 表示爲 R1(R2)R_1 (R_2)^*

③ 與 R3R_3 的串聯運算 : R1(R2)R_1 (R_2)^*R3R_3 是串聯關係 , 表示爲 R1(R2)R3R_1 (R_2)^* R_3 ;


3 . 並運算 : R1(R2)R3R_1 (R_2)^* R_3R4R_4 是並集關係 , 都是 qiq_iqjq_j 的輸入的正則表達式 ;


4 . 兩個正則表達式並運算表示爲 : (R1(R2)R3)R4( R_1 (R_2)^* R_3 ) \cup R_4

在這裏插入圖片描述





確定性有限自動機 ( DFA ) 轉爲 正則表達式



在這裏插入圖片描述

上圖中的自動機是一個 33 個狀態的 確定性有限自動機 ( DFA ) ;


將上述 確定性有限自動機 ( DFA ) 轉爲正則表達式 ;





確定性有限自動機 ( DFA ) 轉爲 正則表達式 ( 1 ) 添加開始狀態 SS 和結束狀態 TT



1 . 添加開始和結束狀態 :


① 添加開始狀態 : 添加新的開始狀態 SS , 使用 ε\varepsilon 箭頭指向當前 確定性有限自動機 ( DFA ) 的 開始狀態 ;

在這裏插入圖片描述


② 添加結束狀態 : 再次添加一個 接受狀態 , 從 確定性有限自動機 ( DFA ) 的接受狀態 指向該新的結束狀態 , 該新添加的結束狀態 是 接受狀態 ;

在這裏插入圖片描述


2 . 確定性有限自動機 ( DFA ) 轉爲 正則表達式 思想 : 逐步刪除 1,2,31,2,3 狀態 , 每次刪除一個狀態 , 生成新的正則表達式 , 最後就剩下 開始狀態 SS , 和結束狀態 TT , 最後剩下的就是 SSTT 狀態的正則表達式 , 也是自動機的正則表達式 ;





確定性有限自動機 ( DFA ) 轉爲 正則表達式 ( 2 ) 刪除 狀態 22 刪除方法



1 . 刪除 22 狀態 :


① 信息抽取轉移 : 找到 與 22 狀態 所有的相關的信息 , 添加到其它的箭頭上 , 如果沒有創建一個新的箭頭 ;

22 狀態的輸入和輸出 : 哪些狀態 有箭頭 輸入到 22 狀態 , 22 狀態 有哪些箭頭 輸出到了其它狀態 ;

③ 信息轉移 : 將每個輸入 和 每個輸出的信息全部轉移 , 一條信息也不能遺漏 ;

22 狀態的輸入輸出統計 : 33 條輸入 , 22 條輸出 ; 其中有 一條輸入輸出是從 22 狀態輸出指向 它自己 , 共有 44 個箭頭信
息 ; 外部輸入有 2 條 , 外部輸出 有 11 條 , 需要生成的箭頭信息個數是 ×外部輸入條數 \times 外部輸出條數 ;


2 . 22 狀態的循環 ( 11 輸入 11 輸出 ) : 22 狀態下讀取 bb , 仍然回到 22 狀態 ; 這 11 個輸入 , 11 個輸出 , 是從 22 狀態輸出到 22 狀態 , 這是一個 星計算 ; 使用 bb^* 表示 ;





確定性有限自動機 ( DFA ) 轉爲 正則表達式 ( 2 ) 刪除 狀態 22 信息梳理



狀態 22 信息梳理如下 ;


1 . 22 狀態信息輸入 :


SS 狀態 讀取 ε\varepsilon 跳轉到 11 狀態 ;

33 狀態 讀取 aa 跳轉到 11 狀態 ;


2 . 22 狀態信息輸出 :

11 狀態讀取 (aba)b(ab^*a) \cup b 正則表達式 跳轉到 33 狀態 ;


3 . 箭頭信息生成個數 : 外部輸入有 2 條 , 外部輸出 有 11 條 , 需要生成的箭頭信息條數 :

×=2×1=2外部輸入條數 \times 外部輸出條數 = 2 \times 1 = 2





確定性有限自動機 ( DFA ) 轉爲 正則表達式 ( 2 ) 刪除 狀態 22 : 11 -> 22 -> 33 生成信息 11 -> 33



1 . 11 -> 22 -> 33 狀態跳轉 :


11 狀態讀取 aa 跳轉到 22 狀態 : 這裏是狀態 22 的一條輸入 , 使用 aa 表示 ;

22 狀態讀取 bb 跳轉到 22 狀態 : 這是無限的星計算 , 使用 bb^* 表示 ;

22 狀態讀取 aa 跳轉到 33 狀態 : 這裏是狀態 22 的一條輸出 , 使用 aa 表示 ;


2 . 33 個正則表達式是串聯關係 ;


中間經歷的過程是 11 狀態輸入 aa 跳轉到 22 狀態 , 22 本身可以有無限個星計算 , 22 狀態輸入 aa 跳轉到 33 狀態 ;

使用正則表達式表示爲 abaab^*a ;


4 . 生成箭頭信息 :


11 狀態下 , 讀取 abaab^*a 正則表達式 , 可以跳轉到 33 狀態 ;

abaab^*a 正則表達式 與 1133 跳轉箭頭上的 bb 進行並計算 , 得到

(aba)b(ab^*a) \cup b

這是 11 跳轉到 33 的正則表達式 ;

在這裏插入圖片描述





確定性有限自動機 ( DFA ) 轉爲 正則表達式 ( 2 ) 刪除 狀態 22 : 33 -> 22 -> 33 生成信息 33 -> 33



1 . 33 -> 22 -> 33 狀態跳轉 :


33 狀態讀取 bb 跳轉到 22 狀態 : 這裏是狀態 22 的一條輸入 , 使用 bb 表示 ;

22 狀態讀取 bb 跳轉到 22 狀態 : 這是無限的星計算 , 使用 bb^* 表示 ;

22 狀態讀取 aa 跳轉到 33 狀態 : 這裏是狀態 22 的一條輸出 , 使用 aa 表示 ;


2 . 33 個正則表達式是串聯關係 ;


中間經歷的過程是 33 狀態輸入 bb 跳轉到 22 狀態 , 22 本身可以有無限個星計算 , 22 狀態輸入 aa 跳轉到 33 狀態 ;

三者串聯關係 , 使用正則表達式表示爲 bbabb^*a ;

33 狀態下 , 讀取 bbabb^*a 正則表達式 , 可以跳轉到 33 狀態 ;


3 . 生成箭頭信息 :


33 狀態添加一個箭頭指向它自身 , 箭頭的接收的正則表達式是

bbabb^*a

這是 11 跳轉到 33 的正則表達式 ; 表示 33 狀態下接收 bbabb^*a 正則表達式 , 仍然跳轉到 33 狀態 ;

在這裏插入圖片描述





確定性有限自動機 ( DFA ) 轉爲 正則表達式 ( 2 ) 刪除 狀態 22 階段性結果



刪除 22 狀態結果 :

在這裏插入圖片描述





確定性有限自動機 ( DFA ) 轉爲 正則表達式 ( 3 ) 刪除 狀態 11 信息梳理



狀態 11 信息梳理如下 ;


1 . 11 狀態信息輸入 :


SS 狀態 讀取 ε\varepsilon 跳轉到 11 狀態 ;

33 狀態 讀取 aa 跳轉到 11 狀態 ;


2 . 11 狀態信息輸出 :

11 狀態讀取 (aba)b(ab^*a) \cup b 正則表達式 跳轉到 33 狀態 ;


3 . 箭頭信息生成個數 : 外部輸入有 2 條 , 外部輸出 有 11 條 , 需要生成的箭頭信息條數 :

×=2×1=2外部輸入條數 \times 外部輸出條數 = 2 \times 1 = 2





確定性有限自動機 ( DFA ) 轉爲 正則表達式 ( 3 ) 刪除 狀態 11 : 33 -> 11 -> 33 生成信息 33 -> 33



1 . 33 -> 11 -> 33 狀態跳轉 :


33 狀態 讀取 aa 跳轉到 11 狀態 , 正則表達式 表示爲 aa ;

11 狀態 讀取 (aba)b(ab^*a) \cup b 正則表達式 跳轉到 33 , 正則表達式 表示爲 (aba)b(ab^*a) \cup b ;


2 . 正則表達式 : 上述兩個正則表達式是串聯關係 , 正則表達式表示爲 a((aba)b)a ( (ab^*a) \cup b )


3 . 生成新的箭頭信息 :


新增加的 33 狀態下讀取 a((aba)b)a ( (ab^*a) \cup b ) 跳轉到 33 ;

與原來的 33 讀取 bbabb^*a 跳轉到 33 是並聯關係 ,

最終的 33 讀取一個正則表達手 跳轉到 33 狀態 , 的正則表達式爲

(a  (  (aba)b  ))(bba) ( \quad a \; ( \; (ab^*a) \cup b \; ) \quad ) \cup ( bb^*a )

在這裏插入圖片描述





確定性有限自動機 ( DFA ) 轉爲 正則表達式 ( 3 ) 刪除 狀態 11 : SS -> 11 -> 33 生成信息 SS -> 33



1 . SS -> 11 -> 33 狀態跳轉 :


SS 狀態 讀取 ε\varepsilon 跳轉到 11 狀態 , 正則表達式 表示爲 ε\varepsilon ;

11 狀態 讀取 (aba)b(ab^*a) \cup b 正則表達式 跳轉到 33 , 正則表達式 表示爲 (aba)b(ab^*a) \cup b ;


上述兩個正則表達式是串聯關係 , 正則表達式表示爲 ε((aba)b)\varepsilon \cup ( (ab^*a) \cup b ) , 其中 ε\varepsilon 可以省略 , 最終表示爲 (aba)b(ab^*a) \cup b


2 . 新增加 SS 狀態 到 33 狀態之間的跳轉 : SS 狀態下讀取 (aba)b(ab^*a) \cup b 正則表達式 , 跳轉到 33 狀態 ;

在這裏插入圖片描述





確定性有限自動機 ( DFA ) 轉爲 正則表達式 ( 2 ) 刪除 狀態 2,12 , 1 階段性結果



在這裏插入圖片描述





確定性有限自動機 ( DFA ) 轉爲 正則表達式 ( 4 ) 刪除 狀態 33 信息梳理



狀態 33 信息梳理 :


1 . 33 狀態信息輸入 :


SS 狀態 讀取 (aba)b(ab^*a) \cup b 跳轉到 33 狀態 ;

33 狀態 讀取 (a  (  (aba)b  ))(bba)( \quad a \; ( \; (ab^*a) \cup b \; ) \quad ) \cup ( bb^*a ) 跳轉到 33 狀態 ;


2 . 33 狀態信息輸出 :


33 狀態 讀取 (a  (  (aba)b  ))(bba)( \quad a \; ( \; (ab^*a) \cup b \; ) \quad ) \cup ( bb^*a ) 跳轉到 33 狀態 ;

33 狀態讀取 ε\varepsilon 正則表達式 跳轉到 TT 狀態 ;


3 . 箭頭信息生成個數 : 自身循環有一個 , 從 33 狀態 自身輸出到輸入 , 外部輸入有 1 條 , 外部輸出 有 11 條 , 需要生成的箭頭信息條數 :

×=1×1=1外部輸入條數 \times 外部輸出條數 = 1 \times 1 = 1





確定性有限自動機 ( DFA ) 轉爲 正則表達式 ( 4 ) 刪除 狀態 33 : SS -> 33 -> TT 生成信息 SS -> TT



1 . SS -> 33 -> TT 狀態跳轉 :


SS 狀態 讀取 (aba)b(ab^*a) \cup b 跳轉到 33 狀態 ;

33 狀態 讀取 (a  (  (aba)b  ))(bba)( \quad a \; ( \; (ab^*a) \cup b \; ) \quad ) \cup ( bb^*a ) 跳轉到 33 狀態 , 星計算 , 表示成 (a  (  (aba)b  ))(bba)( \quad a \; ( \; (ab^*a) \cup b \; ) \quad ) \cup ( bb^*a )^*

33 狀態讀取 ε\varepsilon 正則表達式 跳轉到 TT 狀態 ;


上述 33 個正則表達式是串聯關係 , 正則表達式表示爲 :

((aba)b)((a  (  (aba)b  ))(bba))( (ab^*a) \cup b ) \circ ( \quad ( \quad a \; ( \; (ab^*a) \cup b \; ) \quad ) \cup ( bb^*a ) \quad )^*


2 . 新增加 SS 狀態 到 TT 狀態之間的跳轉 : SS 狀態下讀取 ((aba)b)((a  (  (aba)b  ))(bba))( (ab^*a) \cup b ) \circ ( \quad ( \quad a \; ( \; (ab^*a) \cup b \; ) \quad ) \cup ( bb^*a ) \quad )^* 正則表達式 , 跳轉到 TT 狀態 ;

在這裏插入圖片描述





確定性有限自動機 ( DFA ) 轉爲 正則表達式 總結



由上述示例可知 , 任何 確定性有限自動機 都可以轉爲 正則表達式 , 非確定性有限自動機 與 確定性有限自動機 又是等價的 , 因此 有限自動機 都可以轉爲 正則表達式 ;

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