以下常规语言的最小抽水长度

时间:2015-10-09 00:36:07

标签: computer-science regular-language computation-theory compiler-theory

以下语言的最小抽水长度是多少?

  1. 空语
  2. (01)*
  3. 10(11*0)*0
  4. 1011
  5. 011 U 0*1*
  6. 以下是我的解决方案。如果我错了,请纠正我。

    1. p = 0,因为该语言没有可抽空的字符串
    2. p = 2因为01是可以抽取的最短字符串
    3. p = 5因为10100是可以抽取的最短字符串
    4. p = 0因为字符串无法抽水
    5. p = 1,因为可以抽取字符串0
    6. 我不确定我的答案,所以任何帮助都表示赞赏。非常感谢!

2 个答案:

答案 0 :(得分:5)

我认为西蒙的答案可能有些偏差。事实上,你需要在某个地方采取循环。泵浦引理要求识别弦的路径包括一个循环(这是泵浦引理的' y' xyz')。我们可以根据需要多次进行这个循环,这可以抽出绳子。

  1. 这应该是1.即使该语言中没有字符串,最小抽吸长度也必须始终大于0。
  2. 这应该是2.如果p = 1,我们就不能抽01(因为y必须等于0,001不在语言中)。
  3. 这应该是5。
  4. 这也应该是5.如果我们设置p = 4,那么我们声称" 1011"是可抽吸的(它不是,因为它是语言中唯一的字符串)。
  5. p = 1。

答案 1 :(得分:4)

根据Patrick87,最小抽吸长度定义为在没有访问某个州两次的情况下,您可以在最小化DFA中进行的最大过渡次数。然后,该过程将您的正则表达式转换为NFA,将NFA转换为DFA,最小化DFA并计算沿有向边的最长路径,而不会两次访问相同的状态。有关此转换和最小化的介绍,请参阅Torben Mogensen的免费书籍,Basics of Compiler Design章节2.6,2.8。

根据这个定义,

  1. p = 0,因为空语言的最小化DFA没有转换。
  2. p = 1. (01)*的最小化DFA有两种状态,您只能进行一次转换而不会在最初的接受状态结束。
  3. p = 3. 10(11*0)*0的最小化DFA将具有必须访问两次的状态,以使子表达式(11*0)*成为派生的一部分。
  4. p = 4. 1011的最小化DFA恰好有4条边,没有递归。
  5. p = 1.语言011是语言0*1*的子集,因此011 U 0*1* = 0*1*。由于01都不能被抽取,因此只能跟随一个非递归边缘。
  6. Minimized DFAs for 2, 3, 4 and 5.