乔姆斯基的正常形式

时间:2011-02-03 08:19:03

标签: grammar chomsky-normal-form

为什么我们将语法转换为乔姆斯基普通形式?有优势吗?

4 个答案:

答案 0 :(得分:3)

首先,您可以在Chomsky Normal Form语法中使用CYK算法

答案 1 :(得分:1)

例如,CNF(或其衍生树)中的语法用于证明无上下文语言的抽象引理。

答案 2 :(得分:0)

Chomsky普通形式使多项式时间算法能够决定是否可以通过语法生成字符串。 如果您了解动态编程,该算法非常灵活......

如果您输入的长度(I)为n,那么您将采用dd nxn的2d数组(A)。

A [i,j]表示语法G中可以导出子串I(i,j)的所有符号。

所以最后如果A [1,n]包含起始符号(S),则意味着字符串I可以由S导出,这是我们想要检查的内容。

def decide (string s,grammar G):
    //base case
    for i=1 to n:
        N[i,i]=I[i]    //as the substring of length one can be generated by only a
                       terminal.
    //end base case

    //induction
    for s=1 to n:       //length of substring
        for i=1 to n-s-1: //start index of substring
            for j=i to i+s-1:   //something else
                 if there exists a rule A->BC such that B belongs to N[i,j] and C
                 belongs to N[j+1,i+s-1] then add A to N[i,i+s-1]
    //endInduction

    if S belongs to N[1,n] then accept else reject.

我知道索引看起来很疯狂。但基本上这里发生了什么。

- 基本情况非​​常清楚我认为

- 在归纳步骤中,我们为长度小于s的所有解决方案中的长度s子串构建解决方案。

- 你从索引1开始找到长度为5的子串(sub)的解决方案。然后你开始一个循环(其他部分).....它检查是否有规则(A - > BC)使得B和C导出sub的两个连续且不相交的子串,如果是这样,则将所有这样的A加到N [1,6]。

- 最后,如果您在N [1,n]中有开始符号,那么您接受!

答案 3 :(得分:0)

使用乔姆斯基范式的优点是:

  1. 证明简单 我们有许多上下文无关文法的证明,包括可还原性和自动机的等价性。但这些是更简单、更受限制的语法集。因此,范式是有帮助的。 例如,Greibach 范式用于证明每个 CFL(不包含 ε)都有一个 ε-transition-free PDA。

2.启用解析 PDA 用于解析具有任何语法的单词,这是不方便的。范式为我们提供了更多的结构,从而使解析算法更容易。

例如,CYK 算法使用 Chomsky 范式。另一方面,Greibach 范式支持递归下降解析;尽管可能需要回溯,但空间复杂度是线性的。