【问题标题】:Converting grammar to Chomsky Normal Form?将语法转换为乔姆斯基范式?
【发布时间】:2011-11-19 21:20:52
【问题描述】:

将下面的语法转换为乔姆斯基范式。给出所有中间步骤。

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 类型规则。这就是我想出的答案,我需要做进一步的事情还是我做错了什么?

【问题讨论】:

  • 首先要检查的是,你读过Wikipedia吗?
  • 澄清请求:什么是 lambda?是终端符号吗?
  • 是的,为什么?我不知道最后一条规则在说什么。 Lambda 是维基百科中的 Epsilon,它变为 null
  • 维基百科页面上的第 3 条规则说,只允许开始符号扩展为 epsilon。所以你需要处理你的A -> ... | lambda/epsilon
  • 对,你做得对。我的错。

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


【解决方案1】:

维基百科说:

在计算机科学中,如果上下文无关文法的所有产生式规则都为以下形式,则称其为 Chomsky 范式:

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

其中ABC是非终结符,α是终结符,S是开始符号,ε 为空字符串。另外,BC 都不能是开始符号。

继续你的工作:

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

我们完成了。呸!

【讨论】:

  • 那我还需要摆脱 epsilon 吗?我认为添加的规则只是 S -> B 和 B-> H?
  • 很好的解释,你介意扩展一下你对最后两个盒子所做的事情吗?
【解决方案2】:

另一种答案:文法只能产生有限数量的字符串,即 6 个。

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

您现在可以手动将其压缩回乔姆斯基范式。


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

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.

要将此有限集更改为乔姆斯基范式,只需通过蛮力即可,无需任何智能因式分解。首先我们介绍两个终端规则:

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 个字符串都进行了这个过程,生成了很多新的中间变量。

【讨论】:

  • 很好,开箱即用的答案。您能否详细说明您是如何提出这一点的以及如何将其转换为乔姆斯基范式?
  • @MatthiasWeiler 感谢您的建议。已编辑完成。
【解决方案3】:

在不涉及太多理论和证明的情况下(您可以在 Wikipedia 中查看此内容),将上下文无关语法转换为乔姆斯基范式时必须做一些事情,通常必须执行四个范式转换.首先,您需要确定所有可以直接或间接产生空字符串(lambda/epsilon)的变量(无 Lambda 形式)。其次,您需要删除单元制作 - (Unit-Free form)。第三,您需要找到所有有效/有用的变量(有用性)。四、你需要找到所有的可达符号(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  |   })

【讨论】:

    猜你喜欢
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 2016-01-23
    • 2011-02-25
    • 1970-01-01
    相关资源
    最近更新 更多