【问题标题】:questions on nfa and dfa关于nfa和dfa的问题
【发布时间】:2010-04-24 02:31:51
【问题描述】:

希望你能帮我解决这个问题......

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

例如。我的问题是哪个正则表达式是等价的?解释... 1.(a+b)**b(a+b)**b(a+b)*

2.ababa*

3.abab(a+b)*

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

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

希望我解释清楚....

【问题讨论】:

    标签: regex dfa nfa


    【解决方案1】:

    首先,关于术语的说明:语言是一组字母表上的字符串。 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' in 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 的任何子字符串要么全部为 a,要么全部为 b,或两者兼有……那么在您“泵送”它之后会发生什么?

    【讨论】:

    • 非常感谢 Jim.... >
    • @Loop:假设一个 DFA 有 n 个状态,但接受具有任意长字符串的语言。那么 DFA 必须有一个循环,并且该循环有 n 个或更少的状态转换。因此,任何围绕该循环获取 DFA 的输入字符串都有一个可以“泵送”(重复)任意次数且仍被 DFA 接受的子字符串。
    【解决方案2】:

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

    要表明一种语言不在某个类中,您通常会使用抽水引理。

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

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

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

    【讨论】:

      【解决方案3】:

      如果您被要求证明某些语言不被 DFA/NFA 接受,您几乎总是必须申请pumping lemma,即used exactly for that purpose

      【讨论】:

      • 嗨……没有任何更简单或简短的方法来表明 DFA/NFA 接受了吗?
      • @Loop:显示一种语言被接受和显示它不能被接受是两种不同的问题。 a^nb^n 问题的意图肯定是您使用了抽水引理。
      猜你喜欢
      • 2011-01-02
      • 1970-01-01
      • 2012-07-18
      • 2010-11-23
      • 2020-03-23
      • 2011-05-07
      • 2013-07-04
      • 2011-08-16
      • 2013-01-28
      相关资源
      最近更新 更多