【问题标题】:Minimum pumping length for the following regular languages以下常规语言的最小抽吸长度
【发布时间】:2016-01-06 19:15:43
【问题描述】:
以下语言的最小抽吸长度是多少?
- 空洞的语言
(01)*
10(11*0)*0
1011
-
011你0*1*
这是我的解决方案。如果我错了,请纠正我。
- p = 0,因为该语言没有可泵送的字符串
- p = 2 因为
01 是可以抽出的最短字符串
- p = 5 因为
10100 是可以抽出的最短字符串
- p = 0,因为无法抽出绳子
- p = 1 因为字符串
0 可以被抽出
我不确定我的答案,因此感谢您的帮助。非常感谢!
【问题讨论】:
标签:
computer-science
regular-language
computation-theory
compiler-theory
【解决方案1】:
根据Patrick87,最小泵送长度定义为您可以在最小化的 DFA 中进行的最大转换次数,而无需两次访问某个状态。然后该过程变成将您的正则表达式转换为 NFA,将 NFA 转换为 DFA,最小化 DFA 并计算沿有向边的最长路径,而无需两次访问相同的状态。有关这种转换和最小化的介绍,请参阅 Torben Mogensen 的免费书籍 Basics of Compiler Design 第 2.6、2.8 章。
根据这个定义,
- p = 0,因为空语言的最小化 DFA 中没有转换。
- p = 1。
(01)* 的最小化 DFA 有两种状态,您只能进行一次转换,而不会进入初始的接受状态。
- p = 3。
10(11*0)*0 的最小化 DFA 将具有必须访问两次才能使子表达式 (11*0)* 成为派生的一部分的状态。
- p = 4。
1011 的最小化 DFA 恰好有 4 条边且没有递归。
- p = 1。语言
011 是语言0*1* 的子集,所以011 U 0*1* = 0*1*。而且由于0 或1 都不能被抽取,因此只能跟随一个非递归边缘。
【解决方案2】:
我认为西蒙的回答可能有点不对劲。实际上,您确实需要在某个地方进行循环。抽水引理要求识别字符串所采用的路径包括一个循环(这是抽水引理的“xyz”的“y”)。我们可以根据需要多次执行此循环,从而抽出字符串。
- 这应该是 1。最小泵送长度必须始终大于 0,即使语言中没有字符串也是如此。
- 这应该是 2。如果 p = 1,我们不能抽 01(因为 y 必须等于 0,而 001 不在语言中)。
- 这应该是 5。
- 这也应该是 5。如果我们设置 p=4,那么我们声称“1011”是可泵送的(事实并非如此,因为它是语言中唯一的字符串)。
- p = 1。