如何将CYK算法应用于此CFG?

时间:2013-11-25 14:39:49

标签: algorithm theory context-free-grammar automata

让CFG G成为:

S −→ AB|BA|AC|BD|EE
A −→ a
B −→ b
C −→ EB
D −→ EA
E −→ AB|BA|AC|BD|EE

如何使用CYK算法确定字符串aabbab是否属于该语言的一部分?

这是我在笔记中的伪代码:

  for i in 1 .. n
     V[i,1] = { A | A -> x[i] }
  for j in 2..n
     for i in 1 .. n-j+1
        {
          V[i,j] = phi
          for k in 1 .. j-1
             V[i,j] = V[i,j] union { A | A -> BC where B in V[i,k]
                                                 and   C in V[i+k,j-k]}
        }

但我不明白答案是如何形成颠倒的三角形。

例如,

V[i,j]               i
         1(b)   2(a)   3(a)   4(b)   5(a)

      1  B      A,C    A,C    B      A,C

      2  S,A    B      S,C    S,A
  j
      3  phi    B      B

      4  phi    S,A,C

      5  S,A,C
         ^
         |_ accept

1 个答案:

答案 0 :(得分:0)

伪代码[*]描述了如何应用算法来创建图表。

[i, j]对是指输入的子字符串,从i符号开始,并扩展为j个符号。因此,[2, 3]指的是3个符号的子字符串,从符号2开始。如果您的输入为baaba,则[2, 3]指的是中间的aab。 (索引是从1开始的,而不是从0开始的。)

图表形成一个三角形,因为您的子字符串不能长于输入。如果输入的长度为5个符号,那么您可以使用[1, 5]中的值,但不能使用[2, 5],因为它不再引用子字符串。所以每一行比它之前的行短一个盒子,形成三角形。

V[i, j]是指图表中的一个方框。每个框都是可能产生[i, j]描述的子字符串的非终端集。

该算法依赖于Chomsky Normal Form中的语法。在CNF中,每个产品的右侧是一个终端符号或两个非终端符号。 (还有另一种算法可以将无上下文语法转换为CNF。)

基本上,您从输入的所有1个符号子串开始。伪代码中的第一个循环填充图表的顶行(j == 1)。它查看语法中的所有产品,如果产品的右侧对应于该符号,则该产品左侧的非终端将添加到集合V[i, 1]中。 (您的示例似乎在第一行中有一些虚假条目。{A, C}集应该只是{A}。)

然后算法继续执行其余行,查找可以生成相应子字符串的所有可能产生。对于将当前子字符串拆分为两种的每种可能方式,它会查找相应的生产。这包括在前一行的某些方框中组合成对的非终端,并检查是否有任何产生该对的产品,从而为该方框构建一组非终端。

如果最后一行中的框以包含开始符号的集合结束,则输入根据语法有效。直观地说,它表示起始符号是一个有效的产品,用于使子串从第一个符号开始并继续整个长度。

[*]看起来问题中显示的伪代码包含一些转录错误。您需要咨询权威来源以获取正确的详细信息。