如何快速转换为Chomsky Normal Form?

时间:2017-10-23 03:12:28

标签: context-free-grammar regular-language context-free-language chomsky-normal-form chomsky-hierarchy

所以我知道这个基本的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分钟。有没有人知道做这样的事情的任何技巧或捷径更快?

感谢。

1 个答案:

答案 0 :(得分:2)

您可以使用一些策略来缩短获得答案的时间。首先,您可能尝试直接理解语法的语言,而不是转换给定的语法,在CNF中为同一种语言写下新的语法。我不知道这对于给出的示例特别有用,但它可能很有用,特别是如果 - 在测试中 - 您将语法识别为与已知语言相对应,或者语言是否已命名或以其他方式描述。< / p>

否则,我会在尝试删除ε之前寻找简化语法的方法。这一步增加了你的语法大小,你希望尽可能晚地完成,以避免在早期考虑更大的语法。在这个例子中,这有一些非常重要的回报。

首先,查看每个符号是否会导致语言中的字符串。这应该很快。消除任何不符号的符号,因为它们甚至可能无用。

  1. 如果非终端导致一串终端,则可能有用。
  2. 如果非终端导致一串终端和可能有用的非终端,则可能有用。
  3. 对于你的语法:

    • Y -> cba因此Y可能有用
    • X -> bT -> babc因此T可能有用
    • WV不会带来任何有用的内容;他们只得到包括他们自己或彼此在内的字符串,并且没有一个被证明是有用的。这些符号以及包含它们的任何作品都可以立即丢弃。
    • 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)开始,添加一次派生两个的新符号。为了节省时间,只需从左到右工作。我们看到BSCABCTAXAXUTAXU。我们可以添加G → BSH -> ABI → TAJ → 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分钟)?那有点紧张。键入解释肯定花了我更长的时间。跨越符号和制作应该很快,但添加制作意味着将它们写下来,这需要一些时间。