我正在参加有限自动机课程。我正在为期中考试做准备而且在为特定语言创建语法时遇到了麻烦。虽然我发现简单的非常直观,但当它们变得更加复杂时,我似乎不知道从哪里开始。例如:
L = {w E {a,b,c} *:nb(w)!= na(w)+ nc(w)}
答案是:
S→S1 | S2
S1→bS3 | S3b | S3bS3
S3→S0 | S1
S2→XS4 | S4X | S4XS4
S4→S | S2
S0→bS0XS0 | XS0bS0 | Ë
X→a | ç
如果有人能就我所涉及的思维过程给我一点指导,我们将不胜感激。
答案 0 :(得分:2)
您列出的语言不清楚。我假设w E {a,b,c}*
表示w ε {a,b,c}*
而nb(w) != na(w) + nc(w)
表示该语言中的所有字符串都有一个b不等于a的数量和c的数量之和。 / p>
如果是这种情况,您必须考虑语言中所有字符串的特征,以及将字符串排除在此语言之外的所有特征。
这种语言接受字符串,其中b的数量= / = a的数量+ c的数量。我们可以将这种语言重新表述为接受字符串的语言:
号码a
的+号码c
> b
的数量
要么
号码a
的号码c
< b
的号码
这解释了第一个S - > S1 | S2
S1确保至少有1 b
(S3),然后强制b
与[{1}}和a
相同的c
s(S0)或更多b
比a
和c
更高(S1)。 S1规则的最终结果是一个字符串,b
比a
和c
更多a
。
S2确保c
和/或b
比a
更多。{}}它通过强制c
或a
(X),然后允许等量c
个/ a
(S0)或更多{{1}来实现此目的}} / c
比b
更快(再次是S2)。
这是针对您的示例的,但您可以看到创建此语法的思维过程如何:
a
's / c
>或< b
s)b
的>而不是a
的/ c
强制至少一个b
)然后展开字符串以包含所有可能的a
个/ c
和b
'或更少a
个/ { c
比b
更长。 问题是您需要确保生成语言中的每个字符串,并且不生成语言中没有的所有字符串。 (重读这个,直到它的含义陷入其中)