Grammar 这是一种常规语言吗?

Grammar 这是一种常规语言吗?,grammar,context-free-grammar,regular-language,Grammar,Context Free Grammar,Regular Language,这是初始语法: S → ε | c | bSb | aAa A → aSa | bAb 由此产生的一些词语是: baabaabbbbaabaab bcb baabaacaabaab bbaabcbaabb ababbaba bbbb ababbcbbaba baabcbaab aaaacaaaa aacaa baaaaaacaaaaaab bbbbaacaabbbb abaaabbaaaba abbbaaacaaabbba 起初我编写了这个正则表达式(a | b)*c?(a | b)*,但后

这是初始语法:

S → ε | c | bSb | aAa
A → aSa | bAb
由此产生的一些词语是:

baabaabbbbaabaab
bcb
baabaacaabaab
bbaabcbaabb
ababbaba
bbbb
ababbcbbaba
baabcbaab
aaaacaaaa
aacaa
baaaaaacaaaaaab
bbbbaacaabbbb
abaaabbaaaba
abbbaaacaaabbba

起初我编写了这个正则表达式
(a | b)*c?(a | b)*
,但后来我注意到a和b的出现总是偶数,所以这个正则表达式是错误的。考虑到自动机不能计数,我能得出语言不规则的结论吗?多谢各位

这种语言不规则。你可以用Myhill-Nerode定理证明如下。考虑前缀<代码> b^ n c<代码>。可以附加到此字符串以获得语法语言中的字符串的最短字符串是
b^n
;不能向
b^n c
追加较短的字符串以获取该语言中的字符串。想象一下,语言是规则的。然后,在处理前缀
b^n c
之后,DFA必须具有到长度
n
的接受状态的最短路径。但是
n
是一个任意的自然数,DFA必须有一些固定不变的状态数。这是一个矛盾,所以我们的语言没有DFA,也不规则

非正规语法产生正规语言的一个例子如下:

S -> aSa | aS | A | e
aSSaa -> Saa
A -> AA | ASA | aSaSA
SAS -> ASASSASaaSa

这不是常规的,它甚至不是上下文无关的。但是它生成了a的所有字符串的常规语言,
a*
,这是因为它只生成了
S->aS | e

你的直觉是正确的。决定正则语言的DFAs不能保存机器处于何种状态以外的任何其他数据,因此它只能使用状态“计数”。一种更正式的表达方式是pumping引理(),它可以让您找到语言中任意长度的字符串的示例,该字符串可以“pumping”到语言中没有的字符串中。一个很好的起始字符串示例是
b^ncb^n
,因为无论如何抽取此字符串,结果都不是您的语言。@Welbog谢谢!如果你不介意的话,你能给我举一个简单的非正规语法的例子来产生正规语言吗?明白了,谢谢。你的语法和你几天前给我写的语法很相似。但在我看来,生成正规语言的非正规CFG必须相当复杂。@cieco1109生成正规语言的非正规语法不一定复杂。我只是想说明,即使是非上下文无关的语法也可以生成常规语言。只要使用任何旧的CFG,您就可以添加一些规则,以确保它生成所有字符串的常规语言。S->E,E->所有字符串。这对于一元字母表尤其容易,例如e->aE | empty。