我有以下语法,
S -> Sb
S -> aaSb
S -> b
此语法的典型派生是
S => Sb => [aaSb]b => [aa[b]b]b => aabbb
for n = 1
S => Sb => [aaSb]b => [aa[aaSb]b]b => [aa[aabb]b]b => aaaabbbb
n = 2
编辑:
所以我声称这种语法会产生语言
L = {a^(2n)b^(n+2) : n >= 1}
我非常确定我的 a
是 a^(2n)
,因为之前有两个 a
S
,但是 b
呢?这里没有lambda,所以我的 n
来自 n >= 1
?。
编辑:
b^(n+1)
和 b^(2n+1)
都是错误的假设,因为如果aaaaaabbbbb
语法可以派生字符串n = 3
。
我将 b
修改为 b^(n+2)
。
因此 L
变为 L = {a^(2n)b^(n+2) : n >= 1}
答案 0 :(得分:0)
此语法生成的语言是a^(2n) b^(n+m+1)
,其中n
和m
是自然数。为了说明这一点,(a)我们看到,使用语法的产生式派生的任何字符串都与上述相符,并且(b)可以使用语法的产生式派生出任何与以上相符的字符串。
(a)语法可以并且必须仅使用规则(3)一次。这将使+1
的数量为b
。规则(2)的执行可能会多次发生n
,将2n
a
放在前面,n
b
放在后面,因此2n
和n
项。规则(1)可以执行m
次,因此可以执行多次。
(b)给定自然值a^(2n) b^(n+m+1)
和n
的字符串m
:使用规则(1)等于m
的次数;然后,多次使用规则(2)等于n
;然后,一次用户规则(3)。因此,语法生成字符串。
写相同答案的另一种方法是将a^2n b^m
与m > n
一起使用。
答案 1 :(得分:0)
解决此问题的一种方法是重写语法。请注意,结果1和2均以Sb
结尾,因此我们可以对它们进行左分解:
S -> ASb
S -> b
A ->
A -> aa
从前两个作品中,很容易看到S
产生了A^n b^{n+1} for n >= 0
。
从最后两个作品中,A^n
生成a^{2k} for 0 <= k <= n
。
所以语言是a^{2k} b^{n+1} for n >= 0, 0 <= k <= n
。
或者等效地,让m = n - k
获得a^{2k} b^{k+m+1} for k,m >= 0
。