我需要一个能产生除回文之外的字符串的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
这两个不相同吗?由于后者更直观,为什么不使用它?
答案 0 :(得分:5)
该语法中T
的定义确实似乎是不必要的并发症。 T
可以生成a
和b
的任意字符串,因此更简单的定义也同样好。
由于写书的香肠工厂性质,我只能猜测这些作品是按原样给出的。
原始错误答案:
它们不等同,因为X
本身不能是<epsilon>
,而T
不是a
和b
的任意组合。 T
只能扩展到回文(包括空回文,单个字符或具有不成对中心字符的回文)。
如果X
可能为空,那么T
可以扩展为任何内容,但不能。{/ p>
注
这个答案是基于这样的假设,即作者对制作T -> XTX
的意图是替换中的两个相同的非终端必须代表相同的字符串。由于我没有要查看的文本,我不知道这个假设是否有充分根据,除非它是由问题本身激发的。如果在其他地方不是这种情况,那么这个假设可能是作者的错误。我认为,一般来说,这种要求不适用于无上下文的语法。
正确的作品将是:
R -> aRa | bRb | S
S -> aTb | bTa
T -> aTa | bTb | a | b | <epsilon>
答案 1 :(得分:4)
确保您的语法仅生成非回文的最佳方法如下: 定义:
观察者非Pal = {a,b} * - Pal
Pal的语法知道如下:
{a,b} *的语法可以写成如下:
现在构建非Pal的语法,观察以下内容:
结合所有这些信息,非Pal的语法将是:
我希望这能澄清事情
答案 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
它可以产生所有非回文