Theory of Computation Chapter 3, 4 - Regular Language
(請搭配達叔的投影片一起服用)
正規語言 (Regular Language), 又稱正則語言,是滿足下述相互等價的一組條件的一類形式語言:
- 可以被確定有限狀態自動機 (DFA) 辨識
- 可以被非確定有限狀態自動機 (NFA) 辨識
- 可以用正規表示式 (Regular Expression) 描述
- 可以用正規文法 (Regular Grammar) 生成
(以上摘自正規語言 - 維基百科)
Regular Expression
如何描述一個語言
- 如果是有限集的語言,可以用窮舉法,如
- 無窮集的語言,則可以用描述法,如
- 由於語言是一個集合,因此將多個語言用集合運算子進行運算後的結果也是一個語言,如
正規表達式 (Regular Expression)
- 是一種基於集合運算子進行擴充的語言描述方法
- 基本定義如下,給定一個字母表
- , , 和 皆為描述這個語言的原生正規表達式 (primitive regular expressions)
- 如果 和 皆為正規表達式,則以下算式也都會是正規表達式
- 一串字串是一個正規表達式,若且唯若該字串可以由有限個原生表達式和上述的運算子組成
- 舉例
, 用來描述
- 要注意的事
- 正規表達式並不是一種語言,而是一個描述語言的工具
- 對於一個語言 , 我們不能說 , 但可以說這個 能夠用 描述
Connection Between REs and Regular Languages
正規表達式描述的語言
- 對於所有的原生正規表達式,他們所接受的語言定義為
- 對於正規表達式 和 , 他們之間的運算子規則定義為
- 給定兩個正規表達式 和 , 如果 , 則我們說 和 是等價的
克萊尼定理 (Kleene Theorem)
- 正規表達式可以描述的語言集合,就是正規語言
- 克萊尼定理 (Kleene Theorem): 由於正規表達式和有限自動機所能夠描述 / 接受的語言集合是一樣的,因此可以說正規表達式等價於有限自動機
- 對於每一個正規語言,都存在一條正規表達式可以描述他;對於每一個正規表達式,都存在其可以描述的一個正規語言
- 透過證明「正規表達式可描述的語言等同於正規語言」,可以證明克來尼定理
Image Not Showing
Possible Reasons
- The image file may be corrupted
- The server hosting the image is unavailable
- The image path is incorrect
- The image format is not supported
Learn More →
Figure 1. 原生正規表達式可以很簡單的畫出對應的NFA
Image Not Showing
Possible Reasons
- The image file may be corrupted
- The server hosting the image is unavailable
- The image path is incorrect
- The image format is not supported
Learn More →
Figure 2. 運算子的 NFA
Image Not Showing
Possible Reasons
- The image file may be corrupted
- The server hosting the image is unavailable
- The image path is incorrect
- The image format is not supported
Learn More →
Figure 3. 運算子的 NFA
Image Not Showing
Possible Reasons
- The image file may be corrupted
- The server hosting the image is unavailable
- The image path is incorrect
- The image format is not supported
Learn More →
Figure 4. 運算子的 NFA
- 證明「正規表達式可描述的語言 正規語言」
- 如果針對每一個正規表達式所描述的語言,我們都能夠建立一個可以接受該語言的有限自動機的話,就能證明正規表達式所描述的語言包含於正規語言
- 對於原生正規表達式,其描述的語言可以簡單的畫出 Fig. 1 中的 NFA
- 對於正規表達式當中所有的運算子,他們的規則都可以用 Fig. 2-4 的 NFA 表達( 運算子不用 NFA 也可以得知)
- 透過這些 NFA, 我們可以將正規表達式當中的每一個運算都畫出來,並且組合在一起,得到最後只有一個終止狀態的 NFA
- 由於所有的正規表達式都可以做這樣的轉換(所有的正規表達式都有一個對應的 NFA),所以正規表達式可以描述的語言包含於正規語言
- 同時我們也得知,在這些運算子之下,正規語言會形成一個閉包 (Closure)
Image Not Showing
Possible Reasons
- The image file may be corrupted
- The server hosting the image is unavailable
- The image path is incorrect
- The image format is not supported
Learn More →
Figure 5. 這張圖的正規表達式為
- 證明「正規語言 正規表達式可描述的語言」
- 泛化狀態轉移圖 (Generalized Transition Graphs, GTG), 是一個狀態轉移圖,其每一個有向邊都是一條正規表達式
- 每一個 NFA 都可以透過合併轉移函式和合併狀態的方式轉換成一個 GTG。 當一個 NFA 被化簡為只有起始狀態和終止狀態的 GTG 後,就可以簡單的得到與該 NFA 等價的正規表達式
- 值得注意的是,當我們要將 NFA 轉換成 Complete GTG (所有的邊都填上的 GTG) 時
- 由於 NFA 允許轉移函式的輸出為空集合,因此在轉換成 GTG 時需要補上一個 的自環,而我們額外定義
- 由於 NFA 原本的轉移函式中,可能會有一個狀態無法走到另一個狀態,在無法連通的狀態之間,也需要補上 的路徑,而我們額外定義 ,
- 由於每一個 NFA 都可以透過 GTG 轉換得到一條對應的正規表達式,因此正規語言包含於正規表達式可以接受的語言
- 由於兩個集合互相包含對方,證明兩個集合相等,所以正規語言等於正規表達式可描述的語言
Regular Grammars
形式文法(Grammars)
- 可以表示為一個四元組
- 是非終結符號 / 變數 (variables) 的有限集
- 是終止符號 (terminals) 的有限集
- 是起始符號 (start variable),
- 是產生式規則 (production rules) 的有限集
- 給定一個形式文法 , 根據以上定義,其可以產生的語言為
- 如果 , 則序列 為 的推導 (derivation)
- 其中 (在代換的途中還有變數沒被換掉的狀態)稱為句型 (sentential form)
- 線性文法 (Linear Grammar) 為形式文法的子集,其所有的產生是規則的右手邊最多只包含一個變數
- 右線性文法 (Right-Linear Grammar), 為線性文法當中,所有規則右手邊中唯一的變數都在最右邊的文法
- 左線性文法 (Left-Linear Grammar), 為線性文法當中,所有規則右手邊中唯一的變數都在最左邊的文法
- 左線性文法和右線性文法都屬於正規文法 (Regular Grammar)
正規文法與正規語言
- 正規文法產生的語言集合,就是正規語言
- 證明「正規文法可產生的語言 正規語言」
- 如果是右線性文法,可以透過以下映射將文法轉換成有限自動機
- 將每一個變數都視為狀態,起始符號視為起始狀態,終止符號視為終止狀態
- 將每一條產生式規則都視為是一個轉移函式,如 可以視為
- 從起始符號開始,將所有的產生式規則都視為轉移函式畫為狀態機,直到連接終止符號為止
- 得到一個等價於該文法的 NFA
- 如果是左線性文法,則透過以下映射
- 將每一個變數都視為狀態,起始符號視為終止狀態,終止符號視為起始狀態
- 將每一條產生式規則都視為是一個反向的轉移函式,如 可以視為
- 從終止符號開始,將所有的產生式規則都視為轉移函式畫為狀態機,直到連起始符號為止
- 由於起始狀態只能有一個,所以在多個起始狀態前多加一個起始狀態,並且用空字串轉移連接到原本的多個起始狀態,得到一個等價於該文法的 NFA
- 由於所有的正規文法都可以透過以上映射得到等價的 NFA,所以正規文法產生的語言包含於正規語言
- 證明「正規語言 正規文法可產生的語言」
- 由於有限狀態機當中的每個元素都可以對應正規文法中的某些元素(如上方證明所述),所以可以透過反向映射的方式,用跟上方相似的步驟,將有限狀態機以一個正規文法描述(敘述略)
- 由於所有的正規語言都對應到一個有限狀態機,而每一個有限狀態機都可以轉換為正規文法,所以正規語言包含於正規文法所產生的語言
- 兩個集合互相包含對方,證明兩個集合相等,所以正規語言等於正規文法可產生的語言
Closure Properties of Regular Languages
略。
Elementary Questions about Regular Languages
- 目前為止我們已經學過了幾種正規語言的標準表達方式 (Standard Representation),包含:
- 確定有限狀態自動機 (DFA)
- 非確定有限狀態自動機 (NFA)
- 正規表示式 (Regular Expression)
- 正規文法 (Regular Grammar)
- 當我們說有一個正規語言 , 這表示 一定是以上述幾個方法之一來描述的
Some Questions about Regular Language
- 給定一個正規語言 和一個字串 , 我們怎麼確認 ? (Membership Question)
- 畫出一個可以接受 的 DFA, 然後看看 能不能被該 DFA 接受。若能,則 屬於 , 反之則否
- 給定一個正規語言 , 我們怎麼確認 是空集合 ()?
- 畫出一個可以接受 的 DFA, 然後看看起始狀態是否有路徑可以走到終止狀態。若有,則 非空集合,反之則是空集合
- 給定一個正規語言 , 我們怎麼確認 是有限集合 (finite set)?
- 畫出一個可以接受 的 DFA, 然後看看從起始狀態走到終點狀態的路徑中有沒有環的存在。若有,則 不是有限集合,反之則是有限集合
- 給定兩個正規語言 和 , 我們怎麼確認 ?
Identifying Nonregular Languages
Image Not Showing
Possible Reasons
- The image file may be corrupted
- The server hosting the image is unavailable
- The image path is incorrect
- The image format is not supported
Learn More →
Figure 6. 有限語言 正規語言 非正規語言
有些語言並不屬於正規語言的集合,我們該如何證明一個語言 不是正規語言呢?我們或許可以證明沒有任何一個 DFA 可以接受這個語言,但是窮舉出所有的 DFA 並不是一件容易的事(是做不到的事),所以我們需要用到一個工具 —— 泵引理 (Pumping Lemma)。
Pigeonhole Principle
參考離散數學。
簡單來說,如果有 隻鴿子要裝進 個鴿籠,當 時,必定會有某個籠子裡至少有兩隻鴿子。
Pigeonhole Principle and DFAs
Image Not Showing
Possible Reasons
- The image file may be corrupted
- The server hosting the image is unavailable
- The image path is incorrect
- The image format is not supported
Learn More →
Figure 7. 鴿籠定理與 DFA
對於任意一個有 個狀態的 DFA , 如果有一個字串 , 其中 , 則 在 當中所經過的路徑,必定有其中一個狀態 被重複走過了至少兩次,如 Fig. 7 所示。

Figure 8. 一個長度為 4 的 DFA
- 例如: 對於 Fig. 8 中的 DFA 來說, , , 等字串因為長度小於該 DFA 的狀態數量,所以不一定有重複走過的狀態。但是像 , , 這些字串,其長度已經大於或等於該 DFA 的狀態數量了,所以在 DFA 消化他的過程當中,必定會有至少一個狀態被走過了兩次
Pumping Lemma
- 定義: 給定一個無限正規語言 , 必定存在一個整數 (代表可以接受 的 DFA 的狀態數量),對於任意字串 且 , 可以表示為 , 其中 且 , 使得
- 應用: 可以搭配反證法來證明某語言不是正規語言。證明過程如下:
- 假設給定的語言為正規語言,故滿足 pumping lemma (需要完整寫出上面這一段)
- 舉出任意一個字串 , 此字串必須要滿足 且 , 所以通常會將 用在該字串的參數當中
- 將 拆解成 三段,其中 且 , 注意 的選擇務必滿足這些條件
- 證明至少有一個 不屬於
- 由於 4. 違反了 pumping lemma, 跟「給定的語言是正規語言」的假設矛盾,故給定的語言並非正規語言
- Pumping lemma 常見的誤用
- 用 Pumping lemma 證明某語言是正規語言
- 就算一個語言符合 pumping lemma, 也不能保證他一定是正規語言。 符合 pumping lemma 是正規語言的充份條件,而不是必要條件
- 在 2. 時舉出了一個不在 當中的字串
- 例:
- 並不是一個好的選項,因為 不一定是質數
- , 其中 是一個比 大的質數,才是正確的挑法
- 對於 分解做出過度假設
- 例:
- 令 , 其中 是一個奇數。這是一個不對的假設,因為這樣沒有考慮到 是偶數時的狀況