【发布时间】:2011-02-03 08:19:02
【问题描述】:
为什么我们要把语法转换成乔姆斯基范式?有优势吗?
【问题讨论】:
-
它通常最终成为一项或另一项家庭作业的要求;-)
-
嘿,不。我想到了这个。
标签: grammar chomsky-normal-form
为什么我们要把语法转换成乔姆斯基范式?有优势吗?
【问题讨论】:
标签: grammar chomsky-normal-form
一方面,您可以在乔姆斯基范式语法上使用 CYK 算法
【讨论】:
乔姆斯基范式使多项式时间算法能够决定是否可以通过文法生成字符串。 如果您了解动态规划,该算法将非常巧妙......
如果您的输入 (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] 中有开始符号,那么你接受!
【讨论】:
例如,CNF 中的语法(或更确切地说是其派生树)用于证明上下文无关语言的泵引理。
【讨论】:
使用乔姆斯基范式的优点是:
2.启用解析 PDA 用于解析具有任何语法的单词,这很不方便。范式为我们提供了更多的结构,从而使解析算法更容易。
例如,CYK 算法使用乔姆斯基范式。另一方面,Greibach 范式支持递归下降解析;尽管可能需要回溯,但空间复杂度是线性的。
【讨论】: