【问题标题】:Is this a regular language?这是普通语言吗?
【发布时间】:2020-01-03 11:12:28
【问题描述】:

这是最初的语法:

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的出现总是偶数,所以这个正则表达式是错误的。考虑到自动机不能计数,我可以断定语言不规则吗?非常感谢!

【问题讨论】:

  • 你的直觉是正确的。决定常规语言的 DFA 不能保留除机器所处状态之外的任何其他数据,因此它只能使用状态“计数”。表达这一点的更正式的方式是抽水引理 (en.wikipedia.org/wiki/Pumping_lemma_for_regular_languages),它可以让您找到您的语言中任意长度的字符串的示例,该示例可以“抽水”到不是您的语言的字符串中。一个很好的示例起始字符串是b^ncb^n,因为无论这个字符串如何被抽取,结果都不是你的语言。
  • @Welbog 谢谢!如果你不介意,你能给我一个简单的非正则语法的例子吗?

标签: grammar context-free-grammar regular-language


【解决方案1】:

这种语言不规则。您可以使用 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

【讨论】:

  • 知道了,谢谢。你的语法和你几天前写给我的很相似。但在我看来,生成正则语言的非正则 CFG 必须非常复杂。
  • @cieco1109 非正则语法不必很复杂就能生成正则语言。我只是想展示即使是非上下文无关的语法也可以生成常规语言。只需使用任何旧的 CFG,您就可以添加一些规则来确保它生成所有字符串的常规语言。 S -> E, E -> 所有字符串。这对于一元字母表尤其容易,例如 E -> aE |空。
猜你喜欢
  • 2013-02-03
  • 2011-08-07
  • 2014-02-25
  • 2012-02-19
  • 1970-01-01
  • 2018-02-22
  • 2010-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多