Regex 常规语言(是或否)

Regex 常规语言(是或否),regex,regular-language,automata,Regex,Regular Language,Automata,我的任务是检查这种语言是否正常: L = {w∈{a,b,c}* | where the number of a is less than the number of b+c.} 我既找不到正则表达式,也找不到确定性(或非确定性)有限状态自动机。 另一方面,我没有找到任何方法来证明泵引理定理的对立面 有什么想法吗?免责声明 我知道上面已经贴出了使用泵引理的正式证明。不过,我会选择一个完全非正式的解释,因为我相信在寻求正式解决方案之前,对问题有一些直觉通常会有所帮助 一般直觉 一般来说,当一种语

我的任务是检查这种语言是否正常:

L = {w∈{a,b,c}* | where the number of a is less than the number of b+c.}
我既找不到正则表达式,也找不到确定性(或非确定性)有限状态自动机。 另一方面,我没有找到任何方法来证明泵引理定理的对立面

有什么想法吗?

免责声明 我知道上面已经贴出了使用泵引理的正式证明。不过,我会选择一个完全非正式的解释,因为我相信在寻求正式解决方案之前,对问题有一些直觉通常会有所帮助

一般直觉 一般来说,当一种语言依赖于某种计数时,它应该提醒人们它可能不是规则的。原因是计数可以任意大。您可以在示例中具体看到这一点

为什么它不规则? 想象一下,尝试为您的语言创建DFS。您关心的是
a
的数量与
b
c
的数量之和之间的差异(称之为
D\u abc
)。在DFS中,所有信息都在状态本身中捕获。例如,在读取10个连续的<代码> < <代码>之后,在读取100个连续的<代码> < < /代码>之后,考虑该状态。这两个州必须是不同的。现在,将此参数扩展到任意数量的
a
(或等效于任意
D_abc
),您可以得出结论,您需要无限数量的状态,即语言是不规则的

奖励:为什么它是上下文无关的? 现在,考虑使用下推自动机。PDA允许您使用其(无限)堆栈捕获(无限)计数的困难。在您的示例中,您可以这样做:


  • 如果堆栈为空(即
    D_abc=0
    ),请将遇到的任何符号推到堆栈上(也就是说,如果一个
    a
    出现了
    D\u abc,我想它不是,但我还没有用足够的CS来确定原因。与
    a
    的合法性有关的不是取决于它后面或前面的内容,而是取决于整个字符串中是否有足够的
    b
    s或
    c
    。这不是很正常。我不确定我认为上面等式中的
    E
    应该替换为
    。从我一直在做的谷歌搜索中,它看起来有点像。:)哦,而且它看起来至少是上下文无关的,尽管我似乎不能使它正常。