我需要为每个示例提供上下文无关的语法:
L1 = {a^hb^ka^mb^n : h + k = m + n}
L2 = {a^ib^ja^k : (i = j and k >= 0) or (i >= 0 and j > k)}
我已经完成了许多简单的示例,并且提高了从语法生成CFG的技能。我通常从解决最简单的情况开始,然后从那里开始。但是,我对于从哪里可以找到这些问题的解决方案感到困惑。
答案 0 :(得分:0)
对于第一个,想象从外部向内剥离符号。我们开始剥离a和b对:
S -> aSb
如果我们先剥掉所有东西,就需要进入新的状态。否则,如果我们首先剥离所有b,则需要进入新的状态;否则,如果我们同时剥离两个,我们可以切换到剥离反向对:
S -> aSb
S -> aXa | bYb
S -> bZa
如果我们最终执行S-> aXa,则需要用尽左侧的a以便接受。否则,我们可以继续从两端剥离a:
S -> aSb | aXa | bYb | bZa
X -> aXa | bZa
与Y类似:
S -> aSb | aXa | bYb | bZa
X -> aXa | bZa
Y -> bYb | bZa
现在,对于Z,我们只需要确保我们以空字符串结尾:
S -> aSb | aXa | bYb | bZa
X -> aXa | bZa
Y -> bYb | bZa
Z -> bZa | e
如何证明这一点是正确的?首先,争辩说这只会产生该语言的字符串。这里的一个证明想法是要注意,最后一个产生式是Z-> e,到那时为止,我们一直在它的两边都添加相同数量的符号。同样,在左侧,我们只能在a之后添加b,而在右侧,我们只能在b之后添加a。然后,说这会产生该语言的所有字符串。这里的一个证明思想是描述在一般情况下如何导出a ^ h b ^ k a ^ m b ^ n。分别考虑h
对于第二个,您的第一步应该是将其拆分为两种语言并摆脱歧义:
L2 = A union B
A = {a^ib^ja^k : (i = j and k >= 0)}
B = {a^ib^ja^k : (i >= 0 and j > k)}
现在,找到A的语法:
A -> Aa | A'
A' -> aA'b | e
接下来,找到B的语法:
B -> aB | B'
B' -> bB'a | b
然后,编写S将S连接到A或B的语法:
S -> A | B
A -> Aa | A'
A' -> aA'b | e
B -> aB | B'
B' -> bB'a | b
这证明留作练习。