Regex 无限子集的Kleene闭包

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。如您所述,包含长度为素数的所有

设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')*

长度大于或等于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)
如果GCD(Sn)>1,则集合L'中始终存在一个元素,当我们将其添加到集合中时,该元素会降低GCD;否则,集合L'的GCD不能为1。因为第一个元素w1的长度有有限的因子,所以最终集合S的大小是有限的

回到问题上来,对于L的任何子集L',我们可以找到满足GCD(L')=GCD(S)的L'的有限子集S。从集合S,我们可以构造一个具有| S |未知量ai的广义线性丢番图方程:

a1 | w1 |+a2 | w2 |+…+a | S | | w | S | |=c,其中c是非负整数

由于GCD(S)=1,通过递归地将解应用于线性丢番图方程ax+by=c的最简单形式,上述方程为

求解上述广义丢番图方程,c=0到(LCM(S)-1)。解(a1,a2,…,a | S |)可以包含负数。然而,我们可以不断地向方程的两侧添加LCM的倍数,直到所有解只包含非负数

设k为LCM(S)的最小倍数,使得c=k*LCM(S)+q,q=0到(LCM(S)-1)的所有丢番图方程都有非负解。然后我们可以将M定义为k*LCM(S),因为任何长度大于M的字符串都可以分解为S中单词的串联(因此在L')

基于证明的实例计算 假设L'是L中长度为素数的所有字符串的集合

让我们构造集S={a2,a5}。S可以是{a2,a19}或{a5,a23},这并不重要。M的最终值可能不同,但它并不影响(L')*是正则语言这一事实

我们需要解10个方程(分别):

2a1+5a2=0=>(a1,a2)=(0,0)
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进行了一次对话。我在提出问题时遇到了问题。