将CFG转换为CNF

时间:2015-10-13 17:35:57

标签: theory context-free-grammar

我还是CFG and CNF的新手,并且有时难以理解这些概念。

我正在尝试将此CFG转换为Chomsky Normal Form:

G: S -> aSbS | bSaS | epsilon

我认为该语言会生成具有相同数量的a和b的所有字符串,即{a^n b^n |n>-0}

但要将其转换为CNF,我已经完成了添加新的启动状态并消除了epsilon-productions:

S_0 -> S | epsilon
S -> aSbS | bSaS | aS | bS | a | b

也许我需要两个非终端(变量)A - > a和B - > b:

S_0 -> S | epsilon
S -> ASBS | BSAS | AS | BS | a | b
A -> a
B -> b

我被困在这里,真的不知道下一步应该是什么。似乎没有单位制作或无用的符号。

2 个答案:

答案 0 :(得分:2)

Chomsky normal定义为具有以下形式的所有作品:
A -> BC(其中A,B和C是任意非终结符号)
A -> a(其中A是任意非终结符和任意终结符)
S -> epsilon
除此之外,起始符号可能永远不会出现在任何作品的右侧。

任何CFG到CNF的一般转换包括4个步骤(Wikipedia使用术语START,TERM,BIN,DEL,UNIT所以让我们使用它们)

操作的顺序可能会有所不同,但这是常用的一般顺序。

START :消除右侧出现的任何开始符号。 这是通过引入新的起始符号S0并添加作品S0 -> S来实现的。

TERM :从右侧超过1个符号的作品中删除所有终端,这就是您要做的事情。

BIN :将所有右侧减少到最多两个符号。这是通过引入新的非终结符来实现的,如下所示: 给定A -> X1,...,Xn我们只是通过引入新的非终结符并将右侧分开以满足要求来减少右侧,如下所示:

A -> X1,..,Xn-2,A1  
A1 -> Xn-1,Xn  

重复此过程,直到右侧长2个符号。

DEL :从右侧消除epsilons(当然是S -> epsilon,如果epsilon是语言的一部分),你已经完成了。

UNIT :删除单位作品(A - > B) 这是通过将单位生产的结果替换为所有可能的产品来实现的。例如

A -> B  
B -> a | X1X2 

会导致B在右侧替换其制作:

A -> a | X1X2 

和B被删除,以及它的制作。

通常这些步骤可以按任意顺序完成,但请注意,在许多情况下,后续步骤的效果可能会破坏先前步骤所满足的条件。

希望这有帮助。

答案 1 :(得分:1)

最终输出:

S -> XY | YX | AS | BS | a | b
A -> a
B -> b
X ->AS
Y ->BS