【计算理论】正则语言 ( 推广型的非确定性有限自动机 GNFA | 删除状态 | 确定性有限自动机 转为 正则表达式 )
文章目錄
- 一、推廣型的非確定性有限自動機 ( GNFA ) 引入
- 二、推廣型的非確定性有限自動機 ( GNFA ) 刪除狀態
- 三、確定性有限自動機 ( DFA ) 轉為 正則表達式
- 四、確定性有限自動機 ( DFA ) 轉為 正則表達式 ( 1 ) 添加開始狀態 SSS 和結束狀態 TTT
- 五、確定性有限自動機 ( DFA ) 轉為 正則表達式 ( 2 ) 刪除 狀態 222 刪除方法
- 六、確定性有限自動機 ( DFA ) 轉為 正則表達式 ( 2 ) 刪除 狀態 222 信息梳理
- 七、確定性有限自動機 ( DFA ) 轉為 正則表達式 ( 2 ) 刪除 狀態 222 : 111 -> 222 -> 333 生成信息 111 -> 333
- 八、確定性有限自動機 ( DFA ) 轉為 正則表達式 ( 2 ) 刪除 狀態 222 : 333 -> 222 -> 333 生成信息 333 -> 333
- 九、確定性有限自動機 ( DFA ) 轉為 正則表達式 ( 2 ) 刪除 狀態 222 階段性結果
- 十、確定性有限自動機 ( DFA ) 轉為 正則表達式 ( 3 ) 刪除 狀態 111 信息梳理
- 十一、確定性有限自動機 ( DFA ) 轉為 正則表達式 ( 3 ) 刪除 狀態 111 : 333 -> 111 -> 333 生成信息 333 -> 333
- 十二、確定性有限自動機 ( DFA ) 轉為 正則表達式 ( 3 ) 刪除 狀態 111 : SSS -> 111 -> 333 生成信息 SSS -> 333
- 十三、確定性有限自動機 ( DFA ) 轉為 正則表達式 ( 2 ) 刪除 狀態 2,12 , 12,1 階段性結果
- 十四、確定性有限自動機 ( DFA ) 轉為 正則表達式 ( 4 ) 刪除 狀態 333 信息梳理
- 十五、確定性有限自動機 ( DFA ) 轉為 正則表達式 ( 4 ) 刪除 狀態 333 : SSS -> 333 -> TTT 生成信息 SSS -> TTT
- 十六、確定性有限自動機 ( DFA ) 轉為 正則表達式 總結
一、推廣型的非確定性有限自動機 ( GNFA ) 引入
1 . 給定一個自動機 , 必有一個正則表達式可以表示其所識別的語言 ;
2 . 引入 推廣型的非確定性有限自動機 ( GNFA ) : 首先要構造一個推廣的一般型的非確定性有限自動機 , 每次消除一個狀態 , 最后只剩下兩個狀態 , 此時箭頭上的正則表達式就是最終的正則表達式 ;
上述自動機是一個 推廣型的非確定性有限自動機 ( GNFA ) , 箭頭上 不是單個字符 或 空字符 , 而是 正則表達式 ;
3 . 推廣型的非確定性有限自動機 ( GNFA ) 中的推廣的體現 :
① 非確定性有限自動機 ( NFA ) : 箭頭上 只能出現 字符 , 空字符串 , 222 種輸入 , 不能出現其它輸入內容 ;
② 推廣型的非確定性有限自動機 ( GNFA ) : 箭頭上 可以出現 字符 , 空字符串 , 空集 , 正則表達式 , 444 種輸入 ;
4 . 推廣型的非確定性有限自動機 ( GNFA ) 與 非確定性有限自動機 ( NFA ) 是等價的 ;
二、推廣型的非確定性有限自動機 ( GNFA ) 刪除狀態
給定一個 推廣型的非確定性有限自動機 ( GNFA ) , 找到一個正則表達式 , 代表給定自動機的語言 ;
1 . 需求描述 : 上述自動機中 , R1,R2,R3,R4R_1 , R_2, R_3, R_4R1?,R2?,R3?,R4? 都是正則表達式 ;
刪除 q0q_0q0? 狀態 : 目前希望能刪除 自動機中的 q0q_0q0? 狀態 , 刪除 q0q_0q0? 之后 , 會省略一部分語言 , 這里 省略了 R1,R2,R3R_1 , R_2 , R_3R1?,R2?,R3? ;
語言要求 : 將 q0q_0q0? 狀態刪除后 , 不影響整個自動機所接受的語言 , 那么需要將省略的部分語言 , 補充到 R4R_4R4? 中 ;
2 . R1,R2,R3R_1 , R_2 , R_3R1?,R2?,R3? 關系分析 :
① R2R_2R2? 星運算 : R2R_2R2? 是一個循環 , q0q_0q0? 接受 R2R_2R2? 后 , 仍然保持 q0q_0q0? 狀態 , 這里的該循環的正則表達式表示為 (R2)?(R_2)^*(R2?)? ;
② R1R_1R1? 與 (R2)?(R_2)^*(R2?)? 串聯運算 : R1R_1R1? 與 (R2)?(R_2)^*(R2?)? 是串聯關系 , 表示為 R1(R2)?R_1 (R_2)^*R1?(R2?)?
③ 與 R3R_3R3? 的串聯運算 : R1(R2)?R_1 (R_2)^*R1?(R2?)? 與 R3R_3R3? 是串聯關系 , 表示為 R1(R2)?R3R_1 (R_2)^* R_3R1?(R2?)?R3? ;
3 . 并運算 : R1(R2)?R3R_1 (R_2)^* R_3R1?(R2?)?R3? 與 R4R_4R4? 是并集關系 , 都是 qiq_iqi? 到 qjq_jqj? 的輸入的正則表達式 ;
4 . 兩個正則表達式并運算表示為 : (R1(R2)?R3)∪R4( R_1 (R_2)^* R_3 ) \cup R_4(R1?(R2?)?R3?)∪R4?
三、確定性有限自動機 ( DFA ) 轉為 正則表達式
上圖中的自動機是一個 333 個狀態的 確定性有限自動機 ( DFA ) ;
將上述 確定性有限自動機 ( DFA ) 轉為正則表達式 ;
四、確定性有限自動機 ( DFA ) 轉為 正則表達式 ( 1 ) 添加開始狀態 SSS 和結束狀態 TTT
1 . 添加開始和結束狀態 :
① 添加開始狀態 : 添加新的開始狀態 SSS , 使用 ε\varepsilonε 箭頭指向當前 確定性有限自動機 ( DFA ) 的 開始狀態 ;
② 添加結束狀態 : 再次添加一個 接受狀態 , 從 確定性有限自動機 ( DFA ) 的接受狀態 指向該新的結束狀態 , 該新添加的結束狀態 是 接受狀態 ;
2 . 確定性有限自動機 ( DFA ) 轉為 正則表達式 思想 : 逐步刪除 1,2,31,2,31,2,3 狀態 , 每次刪除一個狀態 , 生成新的正則表達式 , 最后就剩下 開始狀態 SSS , 和結束狀態 TTT , 最后剩下的就是 SSS 到 TTT 狀態的正則表達式 , 也是自動機的正則表達式 ;
五、確定性有限自動機 ( DFA ) 轉為 正則表達式 ( 2 ) 刪除 狀態 222 刪除方法
1 . 刪除 222 狀態 :
① 信息抽取轉移 : 找到 與 222 狀態 所有的相關的信息 , 添加到其它的箭頭上 , 如果沒有創建一個新的箭頭 ;
② 222 狀態的輸入和輸出 : 哪些狀態 有箭頭 輸入到 222 狀態 , 222 狀態 有哪些箭頭 輸出到了其它狀態 ;
③ 信息轉移 : 將每個輸入 和 每個輸出的信息全部轉移 , 一條信息也不能遺漏 ;
④ 222 狀態的輸入輸出統計 : 有 333 條輸入 , 222 條輸出 ; 其中有 一條輸入輸出是從 222 狀態輸出指向 它自己 , 共有 444 個箭頭信
息 ; 外部輸入有 2 條 , 外部輸出 有 111 條 , 需要生成的箭頭信息個數是 外部輸入條數×外部輸出條數外部輸入條數 \times 外部輸出條數外部輸入條數×外部輸出條數 ;
2 . 222 狀態的循環 ( 111 輸入 111 輸出 ) : 222 狀態下讀取 bbb , 仍然回到 222 狀態 ; 這 111 個輸入 , 111 個輸出 , 是從 222 狀態輸出到 222 狀態 , 這是一個 星計算 ; 使用 b?b^*b? 表示 ;
六、確定性有限自動機 ( DFA ) 轉為 正則表達式 ( 2 ) 刪除 狀態 222 信息梳理
狀態 222 信息梳理如下 ;
1 . 222 狀態信息輸入 :
SSS 狀態 讀取 ε\varepsilonε 跳轉到 111 狀態 ;
333 狀態 讀取 aaa 跳轉到 111 狀態 ;
2 . 222 狀態信息輸出 :
111 狀態讀取 (ab?a)∪b(ab^*a) \cup b(ab?a)∪b 正則表達式 跳轉到 333 狀態 ;
3 . 箭頭信息生成個數 : 外部輸入有 2 條 , 外部輸出 有 111 條 , 需要生成的箭頭信息條數 :
外部輸入條數×外部輸出條數=2×1=2外部輸入條數 \times 外部輸出條數 = 2 \times 1 = 2外部輸入條數×外部輸出條數=2×1=2
七、確定性有限自動機 ( DFA ) 轉為 正則表達式 ( 2 ) 刪除 狀態 222 : 111 -> 222 -> 333 生成信息 111 -> 333
1 . 111 -> 222 -> 333 狀態跳轉 :
111 狀態讀取 aaa 跳轉到 222 狀態 : 這里是狀態 222 的一條輸入 , 使用 aaa 表示 ;
222 狀態讀取 bbb 跳轉到 222 狀態 : 這是無限的星計算 , 使用 b?b^*b? 表示 ;
222 狀態讀取 aaa 跳轉到 333 狀態 : 這里是狀態 222 的一條輸出 , 使用 aaa 表示 ;
2 . 333 個正則表達式是串聯關系 ;
中間經歷的過程是 111 狀態輸入 aaa 跳轉到 222 狀態 , 222 本身可以有無限個星計算 , 222 狀態輸入 aaa 跳轉到 333 狀態 ;
使用正則表達式表示為 ab?aab^*aab?a ;
4 . 生成箭頭信息 :
111 狀態下 , 讀取 ab?aab^*aab?a 正則表達式 , 可以跳轉到 333 狀態 ;
將 ab?aab^*aab?a 正則表達式 與 111 到 333 跳轉箭頭上的 bbb 進行并計算 , 得到
(ab?a)∪b(ab^*a) \cup b(ab?a)∪b
這是 111 跳轉到 333 的正則表達式 ;
八、確定性有限自動機 ( DFA ) 轉為 正則表達式 ( 2 ) 刪除 狀態 222 : 333 -> 222 -> 333 生成信息 333 -> 333
1 . 333 -> 222 -> 333 狀態跳轉 :
333 狀態讀取 bbb 跳轉到 222 狀態 : 這里是狀態 222 的一條輸入 , 使用 bbb 表示 ;
222 狀態讀取 bbb 跳轉到 222 狀態 : 這是無限的星計算 , 使用 b?b^*b? 表示 ;
222 狀態讀取 aaa 跳轉到 333 狀態 : 這里是狀態 222 的一條輸出 , 使用 aaa 表示 ;
2 . 333 個正則表達式是串聯關系 ;
中間經歷的過程是 333 狀態輸入 bbb 跳轉到 222 狀態 , 222 本身可以有無限個星計算 , 222 狀態輸入 aaa 跳轉到 333 狀態 ;
三者串聯關系 , 使用正則表達式表示為 bb?abb^*abb?a ;
即 333 狀態下 , 讀取 bb?abb^*abb?a 正則表達式 , 可以跳轉到 333 狀態 ;
3 . 生成箭頭信息 :
給 333 狀態添加一個箭頭指向它自身 , 箭頭的接收的正則表達式是
bb?abb^*abb?a
這是 111 跳轉到 333 的正則表達式 ; 表示 333 狀態下接收 bb?abb^*abb?a 正則表達式 , 仍然跳轉到 333 狀態 ;
九、確定性有限自動機 ( DFA ) 轉為 正則表達式 ( 2 ) 刪除 狀態 222 階段性結果
刪除 222 狀態結果 :
十、確定性有限自動機 ( DFA ) 轉為 正則表達式 ( 3 ) 刪除 狀態 111 信息梳理
狀態 111 信息梳理如下 ;
1 . 111 狀態信息輸入 :
SSS 狀態 讀取 ε\varepsilonε 跳轉到 111 狀態 ;
333 狀態 讀取 aaa 跳轉到 111 狀態 ;
2 . 111 狀態信息輸出 :
111 狀態讀取 (ab?a)∪b(ab^*a) \cup b(ab?a)∪b 正則表達式 跳轉到 333 狀態 ;
3 . 箭頭信息生成個數 : 外部輸入有 2 條 , 外部輸出 有 111 條 , 需要生成的箭頭信息條數 :
外部輸入條數×外部輸出條數=2×1=2外部輸入條數 \times 外部輸出條數 = 2 \times 1 = 2外部輸入條數×外部輸出條數=2×1=2
十一、確定性有限自動機 ( DFA ) 轉為 正則表達式 ( 3 ) 刪除 狀態 111 : 333 -> 111 -> 333 生成信息 333 -> 333
1 . 333 -> 111 -> 333 狀態跳轉 :
333 狀態 讀取 aaa 跳轉到 111 狀態 , 正則表達式 表示為 aaa ;
111 狀態 讀取 (ab?a)∪b(ab^*a) \cup b(ab?a)∪b 正則表達式 跳轉到 333 , 正則表達式 表示為 (ab?a)∪b(ab^*a) \cup b(ab?a)∪b ;
2 . 正則表達式 : 上述兩個正則表達式是串聯關系 , 正則表達式表示為 a((ab?a)∪b)a ( (ab^*a) \cup b )a((ab?a)∪b)
3 . 生成新的箭頭信息 :
新增加的 333 狀態下讀取 a((ab?a)∪b)a ( (ab^*a) \cup b )a((ab?a)∪b) 跳轉到 333 ;
與原來的 333 讀取 bb?abb^*abb?a 跳轉到 333 是并聯關系 ,
最終的 333 讀取一個正則表達手 跳轉到 333 狀態 , 的正則表達式為
(a((ab?a)∪b))∪(bb?a)( \quad a \; ( \; (ab^*a) \cup b \; ) \quad ) \cup ( bb^*a )(a((ab?a)∪b))∪(bb?a)
十二、確定性有限自動機 ( DFA ) 轉為 正則表達式 ( 3 ) 刪除 狀態 111 : SSS -> 111 -> 333 生成信息 SSS -> 333
1 . SSS -> 111 -> 333 狀態跳轉 :
SSS 狀態 讀取 ε\varepsilonε 跳轉到 111 狀態 , 正則表達式 表示為 ε\varepsilonε ;
111 狀態 讀取 (ab?a)∪b(ab^*a) \cup b(ab?a)∪b 正則表達式 跳轉到 333 , 正則表達式 表示為 (ab?a)∪b(ab^*a) \cup b(ab?a)∪b ;
上述兩個正則表達式是串聯關系 , 正則表達式表示為 ε∪((ab?a)∪b)\varepsilon \cup ( (ab^*a) \cup b )ε∪((ab?a)∪b) , 其中 ε\varepsilonε 可以省略 , 最終表示為 (ab?a)∪b(ab^*a) \cup b(ab?a)∪b
2 . 新增加 SSS 狀態 到 333 狀態之間的跳轉 : SSS 狀態下讀取 (ab?a)∪b(ab^*a) \cup b(ab?a)∪b 正則表達式 , 跳轉到 333 狀態 ;
十三、確定性有限自動機 ( DFA ) 轉為 正則表達式 ( 2 ) 刪除 狀態 2,12 , 12,1 階段性結果
十四、確定性有限自動機 ( DFA ) 轉為 正則表達式 ( 4 ) 刪除 狀態 333 信息梳理
狀態 333 信息梳理 :
1 . 333 狀態信息輸入 :
SSS 狀態 讀取 (ab?a)∪b(ab^*a) \cup b(ab?a)∪b 跳轉到 333 狀態 ;
333 狀態 讀取 (a((ab?a)∪b))∪(bb?a)( \quad a \; ( \; (ab^*a) \cup b \; ) \quad ) \cup ( bb^*a )(a((ab?a)∪b))∪(bb?a) 跳轉到 333 狀態 ;
2 . 333 狀態信息輸出 :
333 狀態 讀取 (a((ab?a)∪b))∪(bb?a)( \quad a \; ( \; (ab^*a) \cup b \; ) \quad ) \cup ( bb^*a )(a((ab?a)∪b))∪(bb?a) 跳轉到 333 狀態 ;
333 狀態讀取 ε\varepsilonε 正則表達式 跳轉到 TTT 狀態 ;
3 . 箭頭信息生成個數 : 自身循環有一個 , 從 333 狀態 自身輸出到輸入 , 外部輸入有 1 條 , 外部輸出 有 111 條 , 需要生成的箭頭信息條數 :
外部輸入條數×外部輸出條數=1×1=1外部輸入條數 \times 外部輸出條數 = 1 \times 1 = 1外部輸入條數×外部輸出條數=1×1=1
十五、確定性有限自動機 ( DFA ) 轉為 正則表達式 ( 4 ) 刪除 狀態 333 : SSS -> 333 -> TTT 生成信息 SSS -> TTT
1 . SSS -> 333 -> TTT 狀態跳轉 :
SSS 狀態 讀取 (ab?a)∪b(ab^*a) \cup b(ab?a)∪b 跳轉到 333 狀態 ;
333 狀態 讀取 (a((ab?a)∪b))∪(bb?a)( \quad a \; ( \; (ab^*a) \cup b \; ) \quad ) \cup ( bb^*a )(a((ab?a)∪b))∪(bb?a) 跳轉到 333 狀態 , 星計算 , 表示成 (a((ab?a)∪b))∪(bb?a)?( \quad a \; ( \; (ab^*a) \cup b \; ) \quad ) \cup ( bb^*a )^*(a((ab?a)∪b))∪(bb?a)?
333 狀態讀取 ε\varepsilonε 正則表達式 跳轉到 TTT 狀態 ;
上述 333 個正則表達式是串聯關系 , 正則表達式表示為 :
((ab?a)∪b)°((a((ab?a)∪b))∪(bb?a))?( (ab^*a) \cup b ) \circ ( \quad ( \quad a \; ( \; (ab^*a) \cup b \; ) \quad ) \cup ( bb^*a ) \quad )^*((ab?a)∪b)°((a((ab?a)∪b))∪(bb?a))?
2 . 新增加 SSS 狀態 到 TTT 狀態之間的跳轉 : SSS 狀態下讀取 ((ab?a)∪b)°((a((ab?a)∪b))∪(bb?a))?( (ab^*a) \cup b ) \circ ( \quad ( \quad a \; ( \; (ab^*a) \cup b \; ) \quad ) \cup ( bb^*a ) \quad )^*((ab?a)∪b)°((a((ab?a)∪b))∪(bb?a))? 正則表達式 , 跳轉到 TTT 狀態 ;
十六、確定性有限自動機 ( DFA ) 轉為 正則表達式 總結
由上述示例可知 , 任何 確定性有限自動機 都可以轉為 正則表達式 , 非確定性有限自動機 與 確定性有限自動機 又是等價的 , 因此 有限自動機 都可以轉為 正則表達式 ;
總結
以上是生活随笔為你收集整理的【计算理论】正则语言 ( 推广型的非确定性有限自动机 GNFA | 删除状态 | 确定性有限自动机 转为 正则表达式 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【计算理论】正则语言 ( 正则表达式原子
- 下一篇: 【计算理论】Pumping 引理 ( 四