将语法转换为乔姆斯基范式?

时间:2011-09-19 00:14:40

标签: grammar context-free-grammar chomsky-normal-form

将下面的语法转换为Chomsky Normal Form。给出所有中间步骤。

S -> AB | aB
A -> aab|lambda
B -> bbA

好的,我做的第一件事是添加一个新的开始变量S0

现在我有了

S0 -> S
S -> AB | aB
A -> aab|lambda
B -> bbA

然后我删除了所有lambda规则:

S0 -> S
S -> AB | aB | B
A -> aab
B -> bbA | bb

然后我检查了不存在的S->SA->B类型规则。这就是我提出的答案,我是否需要做更多的事情或者我做错了什么?

3 个答案:

答案 0 :(得分:20)

维基百科说:

  

在计算机科学中,如果所有的生产规则都是以下形式,则无语境语法被称为乔姆斯基正规形式:

     
      
  • A - > BC
  •   
  • A - > α,或
  •   
  • S - > ε
  •   
     

其中 A B C 是非终结符号,α是终端符号, S 是开始符号,ε是空字符串。此外, B C 都不是起始符号。

继续你的工作:

S0 -> S
S -> AB | aB | B
A -> aab
B -> bbA | bb

不是使用|来表示不同的选择,而是将规则拆分为多个规则。

S0 -> S
S -> AB
S -> aB
S -> B
A -> aab
B -> bbA
B -> bb

创建新规则Y -> aZ -> b因为我们很快就会需要它们。

S0 -> S
S -> AB
S -> aB
S -> B
A -> aab
B -> bbA
B -> bb
Y -> a
Z -> b

S -> aB的格式不是S -> BC,因为a是终端。因此,将a更改为Y

S0 -> S
S -> AB
S -> YB
S -> B
A -> aab
B -> bbA
B -> bb
Y -> a
Z -> b

B -> bb规则执行相同的操作:

S0 -> S
S -> AB
S -> YB
S -> B
A -> aab
B -> bbA
B -> ZZ
Y -> a
Z -> b

对于A -> aab,创建C -> YY;对于B -> bbA,请创建D -> ZZ

S0 -> S
S -> AB
S -> YB
S -> B
A -> CZ
C -> YY
B -> DA
D -> ZZ
B -> ZZ
Y -> a
Z -> b

对于S -> B,请复制右侧发生S并且内联规则的一条规则:

S0 -> B
S0 -> S
S -> AB
S -> YB
A -> CZ
C -> YY
B -> DA
D -> ZZ
B -> ZZ
Y -> a
Z -> b

通过将右侧加入其他规则的左侧来处理规则S0 -> BS0 -> S。此外,删除孤立规则(LHS符号永远不会在RHS上使用):

S0 -> DA
S0 -> ZZ
S0 -> AB
S0 -> YB
A -> CZ
C -> YY
B -> DA
D -> ZZ
B -> ZZ
Y -> a
Z -> b

我们已经完成了。呼!

答案 1 :(得分:5)

没有太多的理论和证据(你可以在维基百科中看到这个),在将无上下文语法转换为乔姆斯基范式时,你必须做的一些事情,你通常必须执行四个正常形式的转换。首先,您需要识别可以直接或间接产生空字符串(lambda / epsilon)的所有变量 - (Lambda-Free形式)。其次,你需要删除单位制作 - (无单位形式)。第三,你需要找到所有有用/有用的变量(实用性)。四,你需要找到所有可到达的符号(Reachable)。在每一步,您可能会或可能不会有新的语法。所以对于你的问题,这就是我想出来的......


无上下文语法

G(Variables = { A B S }
Start = S 
Alphabet = { a b lamda}

Production Rules = { 
S  ->  |  AB  |  aB  |  
A  ->  |  aab  |  lamda  |  
B  ->  |  bbA  |   } )

删除lambda / epsilon

ERRASABLE(G) = { A }

G(Variables = { A S B }
Start = S
Alphabet = { a b }

Production Rules = { 
S  ->  |  AB  |  aB  |  B  | 
B  ->  |  bbA  |  bb  |   } )

删除单位产品

UNIT(A) { A }
UNIT(B) { B }
UNIT(S) { B S }
G (Variables = { A B S }
Start = S 
Alphabet = { a b }

Production Rules = { 
S  ->  |  AB  |  aB  |  bb  |  bbA  |  
A  ->  |  aab  |  
B  ->  |  bbA  |  bb  |   })

确定实时符号

LIVE(G) = { b A B S a }

G(Variables = { A B S }
Start = S
Alphabet = { a b }

Production Rules = { 
S  ->  |  AB  |  aB  |  bb  |  bbA  |  
A  ->  |  aab  |  
B  ->  |  bbA  |  bb  |   })

删除无法访问的

REACHABLE (G) = { b A B S a }
G(Variables = { A B S }
Start = S 
Alphabet = { a b }

Production Rules = { 
S  ->  |  AB  |  aB  |  bb  |  bbA  |  
A  ->  |  aab  |  
B  ->  |  bbA  |  bb  |   })

用实心非终结符号替换所有混合字符串

G( Variables = { A S B R I }
Start = S
Alphabet = { a b }

Production Rules = { 
S  ->  |  AB  |  RB  |  II  |  IIA  |  
A  ->  |  RRI  |  
B  ->  |  IIA  |  II  |  
R  ->  |  a  |  
I  ->  |  b  |   })

乔姆斯基师范式

G( Variables = { V A B S R L I Z }
Start = S 
Alphabet = { a b }

Production Rules = { 
S  ->  |  AB  |  RB  |  II  |  IV  |  
A  ->  |  RL  |  
B  ->  |  IZ  |  II  |  
R  ->  |  a  |  
I  ->  |  b  |  
L  ->  |  RI  |  
Z  ->  |  IA  |  
V  ->  |  IA  |   })

答案 2 :(得分:1)

替代答案:语法只能生成有限数量的字符串,即6。

 S -> aabbbaab | aabbb | bbaab | bb | abbaab | abb.

您现在可以手动将其浓缩回Chomsky Normal Form。


通过替换,我们可以找到所有生成的字符串的集合。你的初始规则:

S -> AB | aB.
A -> aab | lambda.
B -> bbA.

首先拆分S规则:

S -> AB.
S -> aB.

现在用A和B扩展代替:

S -> AB
  -> (aab | lambda) bbA
  -> (aab | lambda) bb (aab | lambda).
S -> aB
  -> abbA
  -> abb (aab | lambda).

再次展开这些以获得:

S -> aabbbaab.
S -> aabbb.
S -> bbaab.
S -> bb.
S -> abbaab.
S -> abb.

要将此有限集更改为Chomsky Normal Form,只需通过强力执行即可,无需任何智能因子。首先,我们介绍两个终端规则:

X -> a.
Y -> b.

现在对于每个字符串,我们使用带有终端变量的第一个字母和带有新变量的剩余字母。例如,像这样:

S -> aabbb. (initial rule, not in Chomsky Normal Form)

S -> XC, where X->a and C->abbb.
C -> XD, where X->a and D->bbb.
D -> YE, where Y->b and E->bb.
E -> YY, where Y->b and Y->b.

我们只对所有6个字符串进行此过程,生成许多新的中间变量。