我真的遇到了关于无上下文语法的问题。
我需要为以下语言提供cfg:
L = {w | ∃u,v ∈ {a,b}*,∃x∈{c}*,x≠λ : w = uxv ∧ N_a(u)=N_a(v)}
λ代表空字(因此x应该是长度> = 1)
N_a(u)代表你的一个号码。
我已经坚持这个问题好几个小时了。
我知道这种语言是怎样的。但我无法接受CfG。
如果有人提示,那将是非常好的。
答案 0 :(得分:1)
所以我们需要uxv
,u
和v
是a
s和b
s的字符串,x
是一个字符串c
和u
以及v
具有相同数量的a
s?
当你试图找出某种语言的语法时,有必要考虑一些你可以想象在语言中的最短词,以及你可以用什么规则来制作更大的词。这些最短的字符串和规则将成为你语法的产物。
问题:这种语言中最短的字符串是什么?
答案:c
。
问题:在语言中给定一个字符串x
,我们怎样才能在语言中获得更长的字符串?
答:我们可以在a
的正面和背面添加相同数量x
s的字符串。
这些是足够的提示开始。我们可以从粗略的想法开始:
S := C | ASA
C := c | cC
现在,诀窍是找出A的制作,它将为我们提供语言中的所有字符串,但只给我们语言中的字符串。假设A的产生可以产生具有不同数量的a
s的字符串;这会破坏我们的语法,因为你可以在前面放置少于a
s而不是在后面,得到一个不在语言中的字符串。这意味着无论我们为A添加什么产品,我们都应该只获得包含一些固定数量的a
s的字符串。另外,我们想要选择一些a
s,这样,通过将它们放在线性组合中,我们可以在最终字符串中获得所有a
个数,即通过附加许多As,我们应该能够获得任意数量的a
s。说服自己,A的产品生成的a
个数的单个值的唯一合理选择是一(1)。这表示A := XaY
,其中X
和Y
不会生成a
。
我们还必须在任何位置允许任意数量的b
s在我们的字符串中。这部分实际上很简单 - 我们可以B = (empty) | bB
获取任意数量的b
。由于A
只生成一个a
,因此我们可以将A := BaB
作为我们的作品,以便A
生成b*ab*
。我们的语法现在是:
S := C | ASA
A := BaB
B := (empty) | bB
C := c | cC
此接受的语言如下:(b*ab*)^n c+ (b*ab*)^n
表示任何非负n
。在此,n
是在导出字符串时应用规则S := ASA
的次数。