关于nfa和dfa的问题

时间:2010-04-24 02:31:52

标签: regex dfa nfa

希望你帮我这个......

我有一个主要问题是'如何判断NFA和/或DFA是否接受正则表达式?

例如。我的问题是哪个正则表达式是等价的?说明... 1.(A + B)** B(A + B)** B(A + B)*

2.A BA BA *

3.A BA B(A + B)*

我们是否必须绘制NFA和DFA,然后通过最小化算法找到?如果我们这样做,那么我们如何知道NFA / DFA接受哪个正则表达式,以便我们可以从答案开始?它太混乱......

第二个是一个非常相似的问题,这个问题要求我证明DFA不接受语言(a ^ nb ^ n | n> 1} ... grrrrr ...我怎么知道这个?(BTW这是一组所有字符串,其中a的数字后跟相同数量的b)....

我希望我能清楚地解释......

3 个答案:

答案 0 :(得分:3)

首先,关于术语的说明:语言是一些字母表上的一组字符串。 DFA和NFA识别常规语言,而不是常规表达式。可能有几个正则表达式定义相同的语言。对于两种语言L1和L2,如果L1的每个成员都是L2的成员,反之亦然,则L1和L2是等价的。

关于您的第一个问题,语言L1包含{a,b}上的所有字符串,至少两个'b'。语言L2由{a,b}上的所有字符串组成,完全两个'b'。 字符串“abbb”是L1和L3的元素,但不是L2。离开L1和L3 比较。 L1的任何元素S必须包含至少两个'b'。让前两个'b' 在S中匹配表达式E3中的两个显式'b';然后,其他组件a*a*(a+b)*始终可以匹配,S必须在L3中。因此L1是L3的子集。 类似地,L3的任何元素S必须包含至少两个'b'。让那些匹配表达式E1中的两个显式'b';其他组件(a+b)*(a+b)*(a+b)*也会 有比赛,S也在L1。所以L1是L3的子集,L3是L1的子集,所以 L1和L3必须相同。

关于第二个问题:使用pumping lemma。假设你有一个接受该语言的DFA ...表明它也必须接受不在语言中的字符串,因此不存在这样的DFA。让S成为语言中的任何字符串... S的任何子字符串都要包含所有的字符串,所有的字符串,或者两者都有......所以在“抽”它之后会发生什么?

答案 1 :(得分:2)

NFA和DFA接受等效(常规)语言,因此表明语言是常规语言的一种方法是为其创建NFA或DFA。

为了表明某种语言不属于某一类,通常会使用抽取引理。

维基百科有一个非常相似的例子,除了n> = 0;不过,我不会为你完成你的作业。

http://en.wikipedia.org/wiki/Pumping_lemma_for_regular_languages

要确定两个正则表达式是否不相等,请创建一个被一个接受但被另一个拒绝的字符串。

答案 2 :(得分:0)

如果要求您显示DFA / NFA不接受某种语言,则几乎总是必须应用pumping lemma used exactly for that purpose