繁体   English   中英

{a*b*c*} 的上下文无关文法 - {a^nb^nc^n | n >=0}

[英]Context free grammar for {a*b*c*} - {a^n b^n c^n | n >=0}

我遇到了这个问题。 我相信它告诉我,不能生成甚至包含 # 个 a 的 b 和 c 的字符串。 这是由于减去了第二组。

来自新形成的 CFG 的好字符串应该是类似 aaabbc 或 abbbcc 之类的东西。

所以我试着把问题分成三个部分......

  1. 单一状态

    a.) S(1) -> aS(1) | a | ^ b.) S(2) -> bS(2) | b | ^ c.) S(3) -> cS(2) | b | ^
  2. 两个国家

    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)
  3. 带 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 * | nm } ∪ {a * b n c m | nm }

(使用上面的Kleene星可能是滥用符号。最初,我用第三个整数变量来写它。但我认为星更清晰。)

现在,{a n b m | nm } 只是一个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 * | 所述 nm } ∪ {a * b n c m | nm }

//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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM