Regex 无限子集的Kleene闭包
设L={an | n>=0},其中且对于所有n>=1 因此,L由所有长度的a序列组成,包括一个序列 长度为0。设L2是L的任意无限子集。我需要证明,总是存在一个DFA来识别(L2)* 如果L2是一个有限子集,这是非常明显的,因为L2将是DFA,因此通过kleene闭包,L2*将被DFA识别。但对于无限子集,我无法得到它,因为L2可能不表示为DFA,因为字符串的长度为素数。 虽然存在一个DFA来描述所有字符串an,n>=0的集合L,但不能保证L的所有子集都存在DFA。如您所述,包含长度为素数的所有字符串的L子集是一个示例,其中DFA描述的语言不存在 正确的方法是直接证明(L’)*是L的任何子集L’的正则语言 定义 让我们定义GCD(K)=GCDw∈ K、 | w |>0(| w |),其中K是L的任何非空子集。我们现在可以将语言K中所有非空单词长度的最大公约数称为GCD(K)。这个定义适用于L的有限子集和无限子集 类似地,我们可以定义LCM(K)=LCMw∈ K、 | w |>0(| w |),其中K是L的任何非空和有限子集 证明 我们将试图证明当GCD(L')=1时,存在一个数字M,使得所有字符串an,n>=M都属于语言(L')*。这导致(L')*成为正则语言,因为我们可以构造以下形式的正则表达式: 长度小于M且属于(L')*Regex 无限子集的Kleene闭包,regex,automata,dfa,automata-theory,kleene-star,Regex,Automata,Dfa,Automata Theory,Kleene Star,设L={an | n>=0},其中且对于所有n>=1 因此,L由所有长度的a序列组成,包括一个序列 长度为0。设L2是L的任意无限子集。我需要证明,总是存在一个DFA来识别(L2)* 如果L2是一个有限子集,这是非常明显的,因为L2将是DFA,因此通过kleene闭包,L2*将被DFA识别。但对于无限子集,我无法得到它,因为L2可能不表示为DFA,因为字符串的长度为素数。 虽然存在一个DFA来描述所有字符串an,n>=0的集合L,但不能保证L的所有子集都存在DFA。如您所述,包含长度为素数的所有
或
长度大于或等于M的所有字符串 上面的正则表达式有一个对应的DFA,它有M+1个状态 当GCD(L')>1时,我们可以通过将子集L'中的所有单词“除以”GCD(L')将问题简化为GCD=1的情况
如果GCD(L')=1(集互素),则存在L'的有限子集S,其中S中所有字符串长度的GCD也是1 我们可以通过构造来证明上述索赔
- 从L',|w1 |>0中选取任意元素w1,并构造集S1={w1}
- 如果GCD(Sn)=1,则Sn是我们要查找的集合
- 如果GCD(Sn)>1,则从L'中选取元素wn+1,并构造集Sn+1={wn+1}∪ Sn,因此
GCD(Sn+1)
2a1+5a2=1=>(a1,a2)=(3,-1)
2a1+5a2=2=>(a1,a2)=(1,0)
2a1+5a2=3=>(a1,a2)=(-1,1)
2a1+5a2=4=>(a1,a2)=(2,0)
2a1+5a2=5=>(a1,a2)=(0,1)
2a1+5a2=6=>(a1,a2)=(3,0)
2a1+5a2=7=>(a1,a2)=(1,1)
2a1+5a2=8=>(a1,a2)=(4,0)
2a1+5a2=9=>(a1,a2)=(2,1) 添加一个LCM(2,5)=10。请注意,由于LCM的特性,我们可以直接修改解决方案,而无需再次求解: 2a1+(5a2+10)=1+10=>(a1,a2)=(3,1)
(2a1+10)+5a2=3+10=>(a1,a2)=(4,1) 因为所有的解都是非负的,我们只加一个LCM(2,5),M=10 (L')*的正则表达式可以构造为: a2+a4+a5+a6+a7+a8+a9+a10a*
正则表达式不是很紧凑,但这里我们不关心它。为了证明,我们只需要知道存在一个数M,因此对于所有n>=M,an属于(L')*,这意味着存在有限个状态,并且可以构造DFA。除了CS理论之外,这与编程有什么关系?为什么它被标记为regex?这是家庭作业吗?哪里提到了编程?也许我错了,但我认为关于CS理论的一般问题在这里。然而,若你们试图用一个程序来证明某件事,那个么这肯定是个话题。但我会让其他人决定的。@Ranveer你能停止编辑这篇文章吗?你一再把这个问题说得毫无意义。实际上这是最后一件事。我与OP进行了一次对话。我在提出问题时遇到了问题。