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

Algorithm 如何将CYK算法应用于此CFG?,algorithm,theory,context-free-grammar,automata,Algorithm,Theory,Context Free Grammar,Automata,让我们这样说: 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

让我们这样说:

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

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

[i,j]对指的是输入的一个子串,该子串从第i个符号开始,扩展为j个符号。所以[2,3]指的是一个3符号的子串,从符号2开始。如果你的输入是BABA,那么[2, 3 ]是指中间的AAB。索引是基于1的,而不是基于0的

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

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

该算法依赖于乔姆斯基范式的语法。在CNF中,每个产品的右侧是一个终端符号或两个非终端符号。还有另一种算法可以将上下文无关语法转换为CNF

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

然后,该算法遍历其余的行,查找可以生成相应子字符串的所有可能的结果。对于将当前子字符串一分为二的每种可能方式,它都会查找相应的产品。这涉及到组合前一行中某些框中的非端子对,并检查是否存在产生该对的产品,从而为该框构建一组非端子

如果最后一行中的框以包含开始符号的集合结尾,则根据语法,输入是有效的。直观地说,开始符号是生成从第一个符号开始并持续整个长度的子字符串的有效产品

[*]问题中显示的伪代码似乎包含一些转录错误。您需要咨询权威人士以获得正确的详细信息