非回文的上下文无关语法

时间:2011-06-27 15:23:25

标签: context-free-grammar computation-theory

我需要一个能产生除回文之外的字符串的CFG。已提供解决方案,如下所示。(计算理论导论 - Sipser)

R -> XRX | S
S -> aTb | bTa
T -> XTX | X | <epsilon>
X -> a | b

我对这个语法的工作方式有了一般的了解。它要求插入一个子串,该子串在其两半上通过生成S -> aTb | bTa具有相应的不相等的字母,从而确保永远不会生成回文。

我会记下前两部作品的语义,正如我所理解的那样,

  • S生成不能成为回文的字符串,因为它们的第一个和最后一个字母不相等
  • R包含至少一个S作为子字符串,确保它永远不会成为回文。

我并不完全理解第三次制作的语义,即

   T -> XTX | X | <epsilon>
   X -> a | b

我看到它的方式,T可以生成a和b的任意组合,即{a,b} *。为什么它不会像

那样
T -> XT | <epsilon>
X -> a | b

这两个不相同吗?由于后者更直观,为什么不使用它?

5 个答案:

答案 0 :(得分:5)

该语法中T的定义确实似乎是不必要的并发症。 T可以生成ab的任意字符串,因此更简单的定义也同样好。

由于写书的香肠工厂性质,我只能猜测这些作品是按原样给出的。

原始错误答案:

它们不等同,因为X本身不能是<epsilon>,而T不是ab的任意组合。 T只能扩展到回文(包括空回文,单个字符或具有不成对中心字符的回文)。

如果X可能为空,那么T可以扩展为任何内容,但不能。{/ p>

这个答案是基于这样的假设,即作者对制作T -> XTX的意图是替换中的两个相同的非终端必须代表相同的字符串。由于我没有要查看的文本,我不知道这个假设是否有充分根据,除非它是由问题本身激发的。如果在其他地方不是这种情况,那么这个假设可能是作者的错误。我认为,一般来说,这种要求不适用于无上下文的语法。

正确的作品将是:

R -> aRa | bRb | S
S -> aTb | bTa
T -> aTa | bTb | a | b | <epsilon>

答案 1 :(得分:4)

确保您的语法仅生成非回文的最佳方法如下: 定义:

  • Pal - 回文语言
  • {a,b} * - 包含字母表上所有字符串的语言{a, B}
  • 非Pal - 所有不是回文的字符串的语言(即 不在Pal)

观察者非Pal = {a,b} * - Pal

Pal的语法知道如下:

  • S - &gt; lambda | a | b | aSa | BSB

{a,b} *的语法可以写成如下:

  • S - &gt; lambda | Sa |锑

现在构建非Pal的语法,观察以下内容:

  • 如果x是非Pal的元素,则:
    • axa是非Pal的元素
    • bxb是非Pal
    • 的元素
  • 如果y是{a,b} *的元素,那么:
    • ayb是非Pal
    • 的元素
    • bya是非Pal的元素

结合所有这些信息,非Pal的语法将是:

  • S - &gt; aSa | bSb | aAb | BAA
  • A - &gt; lambda | Aa |抗体

我希望这能澄清事情

答案 2 :(得分:3)

我认为这本书的结构显示出一些对称性,以便更好地阅读。

这意味着它首先构造任何东西,T。然后有一个包装器S,因此它不再是一个回文S,然后在它上面构建所有东西。

后者似乎很直观。但是,如果你想到回文的定义或构造,你可能会理解为什么这样写作是有意义的。

如果你有回文,你可以构建这样的东西

  

T - &gt; aTa | bTb | a | b |小量

如果我们想要违反构造,我们只需要确保有一个层看起来像这样(我使用T作为一个层而S用于T之后的一步)

  

S - &gt; ATB

其他层我们一般不在乎

  

S - &gt; aTa | aTb | bTa | BTB

因此形成内层(T)和外层(R)以及违反回文结构(S)的层。即使认为T似乎是多余的,但它形成了类似R的结构,从而表达了构造的意图。

答案 3 :(得分:2)

我发现非回文的这个定义非常直观。我假设作者 从回文定义开始

R -> aRa | bRb | a | b | <epsilon>

现在问,这个定义如何“毁了”。

也就是说,他展开了三次定义,在aRa | bRb之间交换了一个aRb | bRa,并将剩余的作品推广到(a|b)R(a|b)

答案 4 :(得分:0)

任何非回文可沿中间分开, 这样x(k)!= x(k + n)

n =长度的一半 x(i)=第i个位置的字符

记住一个简单的解决方案就是

R  -> aRa | bRb | T
T  -> aSb | bSa
S  -> aRa | bRb | a | b | T | episoln

它可以产生所有非回文