让{a b}为字母集,为:
编写正则表达式1)a的数量和b的数量都是奇数的所有单词的语言;
2)长度为奇数且包含子串ab的所有单词的语言。
另外,如果可能的话,请帮助我找到两个不同的表达方式,以帮助我加深对如何解决这些问题的理解。
答案 0 :(得分:3)
对于第一个,你可以构建一个简单的4状态DFA来识别语言。然后,您可以使用从Kleene定理中可恢复的算法(他所说的由FA识别的所有语言都由RE生成的部分)来获得可以工作的RE ......或者只是从图中推断出来。
对于第二个,你知道(ab)是RE的一部分;现在,您需要考虑所有可以为此(正面或背面)添加奇数个字符的独特方式,并将所有这些可能性与+连接以获得简单,正确的RE。
我认为没有人特别喜欢给你答案的想法。
编辑:
所以现在已经过了一段时间,我将通过第一个答案来向感兴趣的读者展示如何做到这一点。
我们的第一个FA就是:
Q s f(Q, s)
-- - -------
EE a OE
EE b EO
OE a EE
OE b OO
EO a OO
EO b EE
OO a EO
OO b OE
我们将从中删除状态并用正则表达式替换s以覆盖该状态。我们从一个简单的开始...让我们摆脱OE。这是表...
Q regex f(Q, s)
-- ---------------------- -------
EE aa EE
EE ab OO
EE b EO
EO a OO
EO b EE
OO a EO
OO ba EE
OO bb OO
在继续之前说服自己这是正确的。接下来,我们摆脱了EO:
Q regex f(Q, s)
-- ---------------------- -------
EE aa+bb EE
EE ab+ba OO
OO ab+ba EE
OO aa+bb OO
为了使下一步更简单,我们引入了一个新的起始集X和一个新的接受状态Y; OO不再接受了。我们消除了对OO的需求:
Q regex f(Q, s)
-- ---------------------------- -------
X empty EE
EE aa+bb+(ab+ba)(aa+bb)*(ab+ba) EE
EE (ab+ba)(aa+bb)* Y
因此,最终的正则表达式是
(aa+bb+(ab+ba)(aa+bb)*(ab+ba))*(ab+ba)(aa+bb)*
我们可以开始尝试列出这个生成的最小字符串,就像一个基本的健全性检查:{ab,ba,aaab,aaba,bbab,bbba,abaa,abbb,baaa,babb,...}看起来很好我!
每一步的减少规则都可以正式化,或者你可以只是应用谨慎的推理来确保你得到正确的东西。检查Kleene定理的证明以进行仔细分析。此外,马丁的形式语言简介或其他东西有很好的使用这种算法的例子。