將給定的上下文無關文法轉換為 Chomsky 正規化 (CNF)


問題

將給定的語法轉換為 Chomsky 正規化 (CNF)

S->AAA|B

A->aA|B

B-> ε

解決方案

按照以下步驟將 CFG 轉換為 CNF -

步驟 1 - 消除 ε 生成式

要消除 ε 生成式,必須在所有其他生成式的 RHS 中替換產生 ε 的變數,以移除 ε 生成式。

在所有其他生成式中用 ε 替換 B 得到以下生成式集 -

S-> AAA | ε | B

A->aA | ε | B

在所有其他生成式中用 \epsilon 替換 A 得到以下結果 -

S ->AAA | AA | A | B | ε [分別用 ε 替換 1、2 和 3 個 A]

A->aA | a | B

由於語法生成字串 ε,因此為了使語法保持等價,無法消除剩餘的 ε 生成式。移除最終的 ε 生成式得到一個語法 G',該語法與原始語法 G 具有以下關係 -

L(G') = L(G) -{ ε }

G' 中的生成式如下 -

S -> AAA | AA | A | B

A -> aA | a | B

步驟 2 - 消除單元生成式

消除單元生成式的過程如下 -

選擇一個生成式 A-> B,使得存在非單元生成式 B-> a

對於每個非單元生成式 B-> a,重複以下步驟 -

向語法中新增生成式 A->a。

從語法中消除 A->B。

從語法中消除單元生成式 S-> A,得到以下語法 -

S ->AAA | AA | aA | a | B

A -> aA | a | B

B 沒有生成式,因此無法消除型別 V -> B 的單元生成式。

步驟 3 - 無用符號

B 是一個無用符號,因為它沒有生成式。因此可以移除它。

A-> a 導致生成一個終結符字串,並且它可以從 S 訪問,因此 A 不是無用的

類似地,S 也不無用,因為可以從中生成終結符。

因此,移除無用符號後的結果 CFG 為 -

S->AAA | AA | aA | a

A->aA | a

Chomsky 正規化 (CNF)

要將語法轉換為 Chomsky 正規化,需要將右側有多於兩個元素的所有生成式拆分為兩個或多個生成式,方法是新增更多變數。

右側至少有兩個符號的生成式中的終結符需要替換為變數符號。

新增以下生成式以生成終結符 a -

Z->a

結果語法如下 -

S-> AAA | AA | ZA | a

A-> ZA | a

Z -> a

生成式 S ->AAA 透過新增一個額外的變數 T 進行修改。

這給出了以下語法 -

S -> TA | AA | ZA | a

T ->AA

A -> ZA | a

Z -> a

在上述語法中,所有生成式都為 A -> BC 或 A ->b 的形式。因此,它處於 Chomsky 正規化 (CNF)。

更新於: 2021年6月12日

18K+ 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告