将给定的上下文无关文法转换为 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+ 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告