【问题标题】:Converting a CFG to CNF将 CFG 转换为 CNF
【发布时间】:2021-12-08 17:36:13
【问题描述】:

我正在尝试将 CFG 转换为 CNF,但我不确定将什么标识为“变量”。问题来了:

S -> aA | ABa 
A -> AA | a  
B -> AbA | bb 

我已经添加了一个新的开始变量来制作它

S' -> S  
S -> aA | ABa 
A -> AA | a  
B -> AbA | bb 

那么,单位生产去除后,就是:

S' -> aA | ABa 
S -> aA | ABa 
A -> AA | a  
B -> AbA | bb

我知道下一步是更改任何具有超过 2 个变量的产品,但 ABa 是三个变量吗?或者是两个变量和一个终端?

如果它是两个变量和一个终端,为了最终简化它,我可以创建这样的东西吗:

S' -> aA | Xa  
S -> aA | Xa  
A -> AA | a  
B -> Yb | bb  
X -> AB
Y -> AA 

谢谢!

【问题讨论】:

  • 我敢肯定,无论是谁设置了这个问题,都会使用大写字母是非终结符(“语法变量”)而小写字母是终结符的约定。我也很确定他们在某处提到了这个事实。 (很明显,没有扩展 a 的生产,对吧?这就是为什么你在删除单元生产时没有删除 A->a。)

标签: context-free-grammar automata computation-theory chomsky-normal-form


【解决方案1】:

乔姆斯基范式中的文法有以下产生式:

A → BC, or
A → a,  or
S → ε,

它由符号组成(aA...)。这些符号分为两组:终端符号(如ab,小写字母,都是字母表的一部分)和非终端符号(如AB,大写字母)。该语法还具有产生式(如S → a)和起始符号(非终结符)S

你从这个语法开始(不需要新的开始规则):

S → aA | ABa
A → AA | a
B → AbA | bb 

将串联分离成它们自己的产生式:

S → aA 
S → ABa
A → AA
A → a
B → AbA
B → bb 

将所有终端符号移动到它们自己的非终端符号中(aC(但将 a 保留在 A 中,因为它在 CNF 中已经有效)和 bD ):

S → CA 
S → ABC
A → AA
A → a
B → ADA
B → DD
C → a
D → b

把右边有两个以上非终结符的地方分开:

S → CA 
S → AE
A → AA
A → a
B → AF
B → DD
C → a
D → b
E → BC
F → DA

那么你就完成了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-18
    • 1970-01-01
    • 2020-05-26
    • 1970-01-01
    相关资源
    最近更新 更多