将下面的语法转换为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->S
和A->B
类型规则。这就是我提出的答案,我是否需要做更多的事情或者我做错了什么?
答案 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 -> a
和Z -> 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 -> B
和S0 -> 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个字符串进行此过程,生成许多新的中间变量。