所以我知道这个基本的4步方法。删除epsilons,然后变量小于2,依此类推。但是,对于我们在测试中必须要做的问题,这种方式需要太长时间。
这是一个例子:
将此无上下文语法转换为等效的Chomsky普通形式语法。
请记住从语法中删除所有无用的符号。
S→TaXU | STUVWXY
T→UU | abc
U→bSc | ε
V→aV | Wb
W→cW | Va
X→bT | Tc
Y→cba | ε
这是关于测试的6个问题中的1个。我们有50分钟完成整个测试。我可以做到这一点,但每次我需要30-40分钟。有没有人知道做这样的事情的任何技巧或捷径更快?
感谢。
答案 0 :(得分:2)
您可以使用一些策略来缩短获得答案的时间。首先,您可能尝试直接理解语法的语言,而不是转换给定的语法,在CNF中为同一种语言写下新的语法。我不知道这对于给出的示例特别有用,但它可能很有用,特别是如果 - 在测试中 - 您将语法识别为与已知语言相对应,或者语言是否已命名或以其他方式描述。< / p>
否则,我会在尝试删除ε之前寻找简化语法的方法。这一步增加了你的语法大小,你希望尽可能晚地完成,以避免在早期考虑更大的语法。在这个例子中,这有一些非常重要的回报。
首先,查看每个符号是否会导致语言中的字符串。这应该很快。消除任何不符号的符号,因为它们甚至可能无用。
对于你的语法:
Y -> cba
因此Y
可能有用X -> bT -> babc
因此T
可能有用W
和V
不会带来任何有用的内容;他们只得到包括他们自己或彼此在内的字符串,并且没有一个被证明是有用的。这些符号以及包含它们的任何作品都可以立即丢弃。U -> e
因此U
可能有用。T -> abc
因此T
可能有用S -> TaXU -> abcaXU -> abcabTU -> abcababcU -> abcababc
因此S
可能有用(太糟糕!)这已经让我们受益匪浅。考虑新的语法:
S → TaXU
T → UU | abc
U → bSc | ε
X → bT | Tc
Y → cba | ε
接下来,查找除S以外的任何非终结符号,这些符号不会出现在剩余的作品中。我们可以很快发现在这个新语法中无法从Y
访问S
,并且可以将其删除以获取:
S → TaXU
T → UU | abc
U → bSc | ε
X → bT | Tc
有可能重复上述步骤以继续删除无用的非终结符号和制作。我认为剩下的一切都很有用。
现在我们可以取消ε
。这样做的标准方法是添加使用ε
代替U
的作品。我们有两个使用U和三个新作品的作品。我们的新语法看起来像这样:
S → TaXU | TaX
T → UU | U | abc | ε
U → bSc
X → bT | Tc
重复T
:
S → TaXU | aXU | TaX | aX
T → UU | U | abc
U → bSc
X → bT | Tc | b | c
我们只有一个产品将一个非终结转换为另一个,我们可以通过替换消除它:
S → TaXU | aXU | TaX | aX
T → UU | bSc | abc
U → bSc
X → bT | Tc | b | c
现在,剩下的东西不应该花太长时间 - 我们已经过了最困难的部分,即消除空白制作和制作单一的非终结者。现在,我们只需要介绍终端符号以及终端和非终端字符串的产品。我建议你从较短的琴弦开始,然后继续前进。
我们看到一些终端符号出现在非终结符号旁边,但不能这样,所以你总是可以为它们添加新的非终结符号:
S → TAXU | AXU | TAX | AX
T → UU | BSC | ABC
U → BSC
X → BT | TC | b | c
A → a
B → b
C → c
现在,从最短的字符串(长度> 2)开始,添加一次派生两个的新符号。为了节省时间,只需从左到右工作。我们看到BSC
,ABC
,TAX
,AXU
和TAXU
。我们可以添加G → BS
,H -> AB
,I → TA
,J → XU
并获取:
S → IJ | AJ | IX | AX
T → UU | GC | HC
U → GC
G → BS
H → AB
I → TA
J → XU
X → BT | TC | b | c
A → a
B → b
C → c
现在,这需要8分钟,你必须在测试情况下解决问题(6个问题,50分钟)?那有点紧张。键入解释肯定花了我更长的时间。跨越符号和制作应该很快,但添加制作意味着将它们写下来,这需要一些时间。