特定语言的无上下文语法

时间:2014-07-01 14:28:44

标签: context-free-grammar

我真的遇到了关于无上下文语法的问题。

我需要为以下语言提供cfg:

L = {w | ∃u,v ∈ {a,b}*,∃x∈{c}*,x≠λ : w = uxv ∧ N_a(u)=N_a(v)}

λ代表空字(因此x应该是长度> = 1)

N_a(u)代表你的一个号码。

我已经坚持这个问题好几个小时了。

我知道这种语言是怎样的。但我无法接受CfG。

如果有人提示,那将是非常好的。

1 个答案:

答案 0 :(得分:1)

所以我们需要uxvuva s和b s的字符串,x是一个字符串cu以及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,其中XY不会生成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的次数。