希望你帮我这个......
我有一个主要问题是'如何判断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)....
我希望我能清楚地解释......
答案 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。