Abh*_*hav 8 context-free-grammar computation-theory
我需要一个CFG,它会生成除了回文之外的字符串.已提供解决方案,如下所示.(计算理论导论 - Sipser)
R -> XRX | S
S -> aTb | bTa
T -> XTX | X | <epsilon>
X -> a | b
Run Code Online (Sandbox Code Playgroud)
我对这个语法的工作方式有了一般的了解.它要求插入一个子串,该子串在其两半上通过生产具有相应的不相等的字母S -> aTb | bTa,从而确保永远不会产生回文.
我将按照我的理解写下前两部作品的语义,
S 生成不能成为回文的字符串,因为它们的第一个和最后一个字母不相等R由至少一个S作为子串组成,确保它永远不是回文.我不完全理解第三个产品的语义,即.
T -> XTX | X | <epsilon>
X -> a | b
Run Code Online (Sandbox Code Playgroud)
我看到它的方式,T可以生成a和b的任意组合,即{a,b}*.为什么它不会像
T -> XT | <epsilon>
X -> a | b
Run Code Online (Sandbox Code Playgroud)
这不是两个相同的?由于后者更直观,为什么不使用它?
小智 6
确保您的语法仅生成非回文的最佳方法如下: 定义:
观察者非 Pal = {a, b}* - Pal
Pal 的语法如下:
{a, b}* 的语法可以写成如下:
现在要构建非 Pal 的语法,请注意以下几点:
结合所有这些信息,非 Pal 的语法将是:
我希望这能澄清事情
该T语法中的定义确实似乎是不必要的并发症.T可以生成任何as和bs的字符串,因此更简单的定义也同样好.
由于写书的香肠工厂特性,我只能猜测这些作品是按原样给出的.
原始的错误答案:
他们是不等价的,因为X它本身不能<epsilon>,而T不是任意组合a和b.T只能扩展到回文结构(包括空回文,单个字符或具有不成对中心字符的回文).
如果X可能是空的,那么T可以扩展到任何东西,但它不能.
注意
这个答案是基于这样的假设:作者的制作意图T -> XTX是替换中的两个相同的非终端必须代表相同的字符串.由于我没有要查看的文本,我不知道这个假设是否有充分根据,除非它是由问题本身激发的.如果在其他地方不是这种情况,那么这个假设可能是作者的错误.我认为,一般来说,这种要求不适用于无上下文的语法.
正确的作品将是:
R -> aRa | bRb | S
S -> aTb | bTa
T -> aTa | bTb | a | b | <epsilon>
Run Code Online (Sandbox Code Playgroud)
我认为这本书的结构显示出一些对称性,以便更好地阅读。
这意味着它首先构造任何东西T。然后有一个包装器S,这样它就不再是回文S,然后在它上面构建所有东西。
后者可能看起来很直观。但是,如果您考虑回文的定义或构造,您可能会明白为什么以这种方式编写是有意义的。
如果你有一个回文,你会构造这样的东西
T -> aTa | 结核病 | 一个 | 乙| 厄普西隆
如果我们想违反构造,我们只需要确保有一层看起来像这样(我使用T作为一层,S作为T之后的一步)
S -> aTb
而其他层我们一般不关心
S-> aTa | aTb | βTa | 结核杆菌
这样就形成了内层(T)和外层(R)以及违反回文结构的层(S)。即使认为T看似多余,但它却形成了与R类似的结构,从而表达了结构的意图。