【问题标题】:chomsky normal form乔姆斯基范式
【发布时间】:2011-02-03 08:19:02
【问题描述】:

为什么我们要把语法转换成乔姆斯基范式?有优势吗?

【问题讨论】:

  • 它通常最终成为一项或另一项家庭作业的要求;-)
  • 嘿,不。我想到了这个。

标签: grammar chomsky-normal-form


【解决方案1】:

一方面,您可以在乔姆斯基范式语法上使用 CYK 算法

【讨论】:

  • 如果你有一个乔姆斯基范式的语法,你能推断出解析给定字符串所需的步骤数吗?
  • @crowso 相信你只能知道解析给定字符串所需步数的上限。
【解决方案2】:

乔姆斯基范式使多项式时间算法能够决定是否可以通过文法生成字符串。 如果您了解动态规划,该算法将非常巧妙......

如果您的输入 (I) 的长度为 n,那么您将采用一个暗 nxn 的二维数组 (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】:

    例如,CNF 中的语法(或更确切地说是其派生树)用于证明上下文无关语言的泵引理。

    【讨论】:

      【解决方案4】:

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

      1. 证明的简单性 我们有很多关于上下文无关文法的证明,包括可约性和自动机等价性。但这些是必须处理的更简单和更受限制的语法集。因此,范式是有帮助的。 例如,Greibach 范式用于表明每个 CFL(不包含 ε)都有一个无 ε 跃迁的 PDA。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-22
        • 1970-01-01
        • 2011-11-19
        • 2012-07-17
        • 1970-01-01
        • 2016-01-23
        • 2011-02-25
        • 2018-11-28
        相关资源
        最近更新 更多