[英]Context free grammar for {a*b*c*} - {a^n b^n c^n | n >=0}
我遇到了这个问题。 我相信它告诉我,不能生成甚至包含 # 个 a 的 b 和 c 的字符串。 这是由于减去了第二组。
来自新形成的 CFG 的好字符串应该是类似 aaabbc 或 abbbcc 之类的东西。
所以我试着把问题分成三个部分......
单一状态
a.) S(1) -> aS(1) | a | ^ b.) S(2) -> bS(2) | b | ^ c.) S(3) -> cS(2) | b | ^
两个国家
a.) S(4) -> aS(4)b | S(1) | S(2) b.) S(5) -> bS(5)c | S(2) c.) S(6) -> aS(6)c | S(3) | S(1)
带 AB 状态的状态
a.) S(7) -> S(1) | S(4)S(6) b.) S(8) -> S(2) | S(5)S(6) c.) S(9) -> S(3) | S(6)S(3)
原始开始状态为...
S -> S(7) | S(8) | S(9)
但是我在构建像 aaaabbbcc 这样的字符串时遇到了问题......
我是否错误地形成了 CFG? 我觉得我在正确的轨道上,但现在我很迷茫。
可以使用给定的产生式构造 a^nb^nc^n 语言的上下文无关语法。
S -> aSc | X
X -> BX
X -> null
使用上面的产生式你可以生成一个^nb^nc^n。 假设我们正在生成 a^2 b^2 c^2。 我们将从 S 开始。
= aSc
= aaScc ; aSc
= aaXcc ; S -> X
= aabXcc ; X -> bX
= aabbXcc ; X -> bX
= aabb(null)cc ; X -> null
= aabbcc
这种语言的一个更简单的表达是:
{a n b m c * | n ≠ m } ∪ {a * b n c m | n ≠ m }
(使用上面的Kleene星可能是滥用符号。最初,我用第三个整数变量来写它。但我认为星更清晰。)
现在,{a n b m | n ≠ m } 只是一个n (a + |b + )b n
所以完整的表达式可以写成n (a + |b + )b n c * | a * b n (b + |c + )c n
将所有这些放在一个 CFG 中有点乏味,所以我把它留给了读者。 但这完全是机械的。
从中制作 DFA(或更恰当地说确定性下推自动机)可能会更棘手,因为 CFG 是模棱两可的。 事实上,该语言的每个CFG 都是模棱两可的。 但是制定 NDPA 没有问题。
所以我把问题分成2个子问题
a 的数量与 b 的数量不同。 因此,a 和 c 或 b 和 c 可以相同。
b 的数量与 c 的数量不同。 因此,a 和 b 或 a 和 c 可以相同。
编辑:更正式的如 Rici {a n b m c * | 所述 n ≠ m } ∪ {a * b n c m | n ≠ m }
//a and b is different
S-->XR
//b and c is different
S-->DY
//Genarates a string where a is more than b
X--> aXb | A
A --> aA | a
//Genarates a string where b is more than a
X--> bXa | B
B --> bB | b
//Genarates a string where b is more than c
Y--> bYc | B
B --> bB | b
//Genarates a string where c is more than b
Y--> cYb | C
C --> cC | c
R-->Rc|c|^
D-->Da|a|^
Murdock 上面的答案非常接近,但在某些情况下失败了。 例如,它可以生成 a、b 和 aabcc,但不能生成 c、abbcc 或 bc,即使它应该能够生成。 (JFlap 是一个很棒的软件,我用来在我构建的语法上快速测试不同的字符串,它对形式语言和计算理论中的许多其他概念也很有帮助。)使用 Murdock 的 CFG,字母也可以出现在不同的顺序,但问题陈述强制所有 a 先出现,然后是所有 b,最后是 c。
丹麦人艾哈迈德似乎误解了这个问题,并试图为 a、b 和 c 的数量相等的语言构建一个 CFG。 我的讲师突然说不可能为此构建 CFG。 对于 a = b = c,丹麦语的 CFG 是不正确的,因为它可以通过 S -> X 自行生成一个 'b'; X -> BX; X -> null(还假设大写 B 是终端 b。)
这是我的答案,它添加并调整了 Murdock 的 CFG 的一些组件,使其对问题有效。
S=XR|DY|WR|DZ
X=aXb|A
A=aA|a
W=aWb|B
B=bB|b
Y=bYc|B
Z=bZc|C
C=cC|c
R=Rc|c|epsilon
D=Da|a|epsilon
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.