给定的常规语言是否包含无限的无前缀子集?


11

在有限字母表A单词集合是无前缀如果没有两个不同的话,其中一个是另一个的前缀。

问题是:

检查作为NFA给出的常规语言是否包含无限的无前缀子集的复杂性是什么?

答案(由于米哈伊尔·鲁迪(Mikhail Rudoy),在下面):可以在多项式时间内完成,而且我认为甚至在NL中也可以。

解释米哈伊尔的答案,令为标准形式的输入NFA(无epsilon过渡,修整),令(分别为)是通过将状态作为初始状态并将作为最终状态(分别将状态作为初始值和作为最终状态)获得的语言。对于单词让是通过迭代获得的无限单词。(Σ ,q 0,˚F ,δ )(Σ,q0,F,δ)大号[ p ,- [R ] L[p,r]大号[ p ,- [R ] L[p,R]p p{ - [R } {r}p p- [R Rù uù ωuω ùu

以下是等效的:

  1. 语言包含无限的无前缀子集。L [ q 0,F ]L[q0,F]
  2. ∃ q ∈ Q∃q∈Q,因此不是的前缀。∃ ü ∈ 大号[ q ,q ] ∖ { ε } ∃u∈L[q,q]∖{ε} ∃ v ∈ 大号[ q ,˚F ] ∃v∈L[q,F]v vù ωuω
  3. ∃ q ∈ Q ∃q∈Q 大号[ q ,q ] ≠ { ε } L[q,q]≠{ε} ∀ Ü ∈ 大号[ q ,q ] ∀u∈L[q,q] ∃ v ∈ 大号[ q ,˚F ]∃v∈L[q,F]因此不是前缀。v vü ωuω

证明:

3 2无关紧要。⇒⇒

对于2 1,足以看到对于任何我们都有是的无穷无前缀子集。⇒ ⇒瓦特∈ 大号[ q 0,q ] w∈L[q0,q]瓦特(û | v |)* v w(u|v|)∗v大号[ q 0,˚F ]L[q0,F]

最后,1 3是Mikhail答案中的“正确性”证明。⇒⇒

Answers:


7

您的问题可以在多项式时间内解决。

首先,将给定的NFA转换为具有以下附加属性的等效NFA:

  • 没有ε过渡
  • 从开始状态即可到达所有状态

有用的子程序

假设我们有NFA NN,状态qq和非空字符串ss。下面的子例程将让我们评估以下语句的真值:“ 从状态q到接受状态的N中的N每条路径都对应于一个字符串,该字符串是某些n的字符串s n的前缀。” 此外,该子例程将在多项式时间内运行。qsnn

S|s|+1snn|s|sssss…N′NqÑ “N′′大号(Ñ ”)大号(小号)∩ 大号(Ñ ')使用标准NFA交集结构,其语言为。注意,所有这些构造都是输入大小的多项式。L(N′′)L(S)∩L(N′)

然后只需测试的语言是否为空(可以通过简单的图形搜索在多项式时间内完成)。仅当,换句话说,每个字符串都不在。换句话说,当且仅当仅接受某些作为前缀的字符串时,的语言为空。可以将其改写为我们试图评估的语句:“ 从状态到接受状态的每条路径都对应于作为字符串前缀的字符串Ñ “N′′大号(Ñ ”)= ∅ L(N′′)=∅大号(小号)∩ 大号(Ñ ')= ∅ L(S)∩L(N′)=∅大号(Ñ ')L(N′)大号(小号)L(S)ñ “ N′′ñ ” N′小号ñsn ñ nñ Nq q小号Ñsn Ñ为了一些。”n

主要算法

考虑NFA中处于某种循环状态的状态集。对于每个这样的状态,执行以下操作:qq

令为任何包含简单循环。让是对应于回路串。由于NFA没有ε过渡,因此s不为空。然后将该子例程应用于NFA,状态q和字符串s。如果该子告诉我们,每一条路径起始于q在NFA和接受状态对应的前缀结束小号ñ一些ň然后继续到下一个状态q。否则,输出给定的NFA语言包含无限的无预定义子集。P 2P2 q qs sP 2P2sqsqsnnq

如果我们尝试循环中的每个状态qq且算法从不输出,则输出给定NFA的语言不包含无限无前缀的子集。

正确性(上半场)

首先,假设上述算法断言给定的NFA语言包含无限的无预定义子集。假设在考虑某些循环P 2P2和某些状态q的情况q下选择了此输出。如前所述,ss是对应于P 2P2的字符串。然后,我们根据子程序知道,不是每个路径开始qq在NFA和结束在接受状态对应的前缀小号ñsn一些ñn(因为这是子程序只能输出,这将导致主要算法在那个qq输出)。

令P 3P3为一条由子程序断言存在的路径:从qq到接受状态的路径,以使相应的字符串tt不是任何n的s nsn前缀。n

让P ' 2P′2包括米m的副本P 2P2,其中米m足够大,使得米| s | > | t | m|s|>|t|。由于P 2P2是通过一个循环qq,P ' 2P′2可以被视为从路径qq到qq。对应于串P ' 2点P′2就是小号米sm

令P 1P1为从起始状态到qq的路径(存在,因为从开始就可以到达每个状态),而rr为与该路径相对应的字符串。

然后由以下组成的路径P 1P1,Xx的副本P ' 2P′2,和P 3P3是一个接受计算路径。对应于此路径的字符串是r (s m )x tr(sm)xt。因此,NFA接受形式为r (s m )x t的r(sm)xt每个字符串。这是NFA接受的无限字符串集,我声称这组字符串是无前缀的。特别是,假设r (s m )x tr(sm)xt是r (s m )y t,r(sm)yt其中 y > xy>x。换句话说, tt是(s m )y - x t(sm)y−xt的前缀。由于(s m )y - x(sm)y−x具有长度 m (y - x )| s | ≥ 米| s | > | t | m(y−x)|s|≥m|s|>|t|,这意味着 tt是(s m )y的前缀− x = s m (y − x )(sm)y−x=sm(y−x)。但是,通过子例程的输出,我们知道tt并不是任何n的 s nsn前缀。因此,r( s m )x t不能是r( s m )y t的前缀,并且根据需要,字符串集是无前缀的。nr(sm)xtr(sm)yt

因此,我已经表明,如果主算法输出给定的NFA语言包含无限的无预定义子集,那么实际上就是这种情况。

正确性(下半场)

接下来,我将展示另一半:如果给定的NFA语言包含无限的无预定义子集,则主要算法将输出此事实。

假设给定的NFA语言包含无限的无前缀子集。令AA为与这些字符串相对应的(接受)计算路径的集合。请注意,AA是接受计算路径的无穷集合,其相应的字符串从不互为前缀。

假设如果NFA中存在通过该状态的循环,则该状态在NFA中“循环”,否则为“非循环”。考虑从开始状态到任何循环状态的所有路径,这些路径仅通过非循环状态(它们最终终止的一个循环状态除外)。令PP为这些路径的集合。每个路径p ∈ Pp∈P不能有一个环路然后在该回路中的状态将被循环状态等的pp将通过一个循环的状态。因此,PP中路径的长度在上方受NFA中状态数的限制,因此PP是有限的(例如,如果起始状态是循环状态,则唯一的这种路径是空路径)。

我们可以将AA划分为| P | + 1|P|+1个子集基于AA中的计算路径的开始方式。特别地,对于p ∈ Pp∈P,让甲pAp是集合中的所有计算路径阿A与路径开始pp和让乙B是集合中的所有其他路径的甲A。显然,所有的一pAp S和乙B是不相交的和他们的工会是整套一个A。此外,BB仅包含从不经过循环状态的路径,因此永不循环;因此BB是有限的 然后我们可以得出结论,某些A pAp必须是无限的(否则AA将是有限多个有限集的并集)。

由于A pAp是无限的,因此存在无限多的计算路径,它们的字符串都不是彼此的前缀,它们都接受以pp开头的路径。令qq为在路径pp末尾到达的状态。我们可以得出结论,存在无数个接受路径,称为集合A ′A′,从qq开始,所有路径都对应于彼此不是前缀的字符串。

在主算法期间,我们在状态qq和某些字符串ss上运行子例程。该子例程告诉我们,从qq开始的每个接受路径是否对应于某个字符串,该字符串是某些n的s nsn前缀。如果是这种情况,那么对于各种n,A ′中的所有无限多的接受路径将是s n的前缀,这意味着它们都是彼此的前缀。事实并非如此,因此我们得出结论,当主算法在状态q上运行子例程时nA′snnq,结果是其他可能的结果。但是,这导致主要算法输出NFA的语言包含无限的无前缀子集。

这就证明了正确性的证明。


我不了解循环处理的工作原理,因为给定状态q可以成为(成倍地)许多循环的一部分。当然,如果可以使用其中两个循环中的任何一个来生成非周期序列,那么我们就完成了。q
— japh

循环处理是什么意思?在主算法中,对于每个状态q,您只选择一个遍历q的循环(可能成倍增长的任何循环),然后调用该循环P 2(后缀是在状态q和字符串s上运行子例程,其中s是与P 2关联的字符串)。该子例程实质上处理检查是否可以使用该循环生成非周期性序列。如果是,那么我们就完成了。如果没有(并且每个q都不是),那么您的整个语言就是周期序列的并集,因此我们也可以完成。qqP2qssP2q
— 米哈伊尔·鲁迪

为了使我的问题更清楚,这是一个简单的NFA,具有初始状态q,最终状态T和三个过渡:q a → q,q b → q,q a → T。对于循环一个不会产生无前缀字符串,但对于循环b会。qTq→aqq→bqq→aTab
— japh

其实,对于循环一个不产生无前缀组:一组琴弦一* b 一个全部使用了一个循环。在我的算法中,如果您为q选择的循环是a循环,则该子例程将确定否,并非每个从q开始的接受路径都具有a *形式的字符串,因此主算法将说无限前缀无子集存在。如果算法用于q的循环改为b循环,则子例程确定并非所有从q开始的接受路径都具有形式为b的字符串aa∗baaqaqa∗qbq∗,在这种情况下,算法也具有相同的输出。b∗
— 米哈伊尔·鲁迪

谢谢米哈伊尔!我认为您的回答解决了问题。
— Googlo

2

定义

定义1:设SS为一组单词。我们说,如果有单词u 0,… ,u n,…和v 1,… ,v n,…这样的话,SS很好地是无前缀的(为此答案起名字)。u0,…,un,…v1,…,vn,…

  • 对于每个Ñ ≥ 1n≥1,ù Ñun和v Ñvn是非空的,并与不同的字母开头的;

  • S = { u 0 v 1,… ,u 0 … u n v n + 1,… }S={u0v1,…,u0…unvn+1,…}。

直觉是,您可以将所有这些词放在以下形状的无限根树上(即■根,▲是叶,以及•其余的内部节点),以使SS中的词恰好是路径的标签从根到叶:

   u₀    u₁    u₂
■-----•-----•-----•⋅⋅⋅
      |     |     |
      | v₁  | v₂  | v₃
      |     |     |
      ▲     ▲     ▲

命题1.1:一个很好的无限无前缀集是无前缀的。

命题1.1的证明:假设ü 0 ... ü ñ v ñ + 1u0…unvn+1是一个严格的前缀ü 0 ... ü 中号v 米+ 1u0…umvm+1。有两种情况:

  • 如果n < m,n<m则v n + 1vn+1是u n + 1 … u m v m + 1un+1…umvm+1的前缀。这是不可能的,因为u n + 1un+1和v n + 1vn+1具有不同的首字母。

  • 如果Ñ > 中号n>m然后Ü 中号+ 1 ... Ü ñ v Ñ + 1um+1…unvn+1是前缀v 米+ 1vm+1。这是不可能的,因为Ü 中号+ 1um+1和v 米+ 1vm+1具有不同的第一字母。

命题1.2:一个很好的无限无前缀集合是无限的。

命题1.2的证明:在证明1.1中,我们发现,如果ň ≠ 米n≠m然后ü 0 ... ü ñ v ñ + 1u0…unvn+1和ü 0 ... ü 中号v 米+ 1u0…umvm+1是不是前缀顺序相媲美。因此,它们不相等。


主要证明

命题2:任何无限无前缀集都包含一个不错的无限无前缀集。

命题3:一种语言包含且仅当它包含一个很好的无限无前缀集时,才包含无限无前缀集。

下面的证明。

命题3的证明:⇒⇒通过命题2。⇐⇐通过命题1.1和1.2。

命题4:该组正则语言的很好前缀游离子集(编码为无限字¯ ü 0 ^ v 1&OverBar; Ü 1 ^ v 2&OverBar; Ù 2 ...u0¯¯¯¯¯v1ˆu1¯¯¯¯¯v2ˆu2¯¯¯¯¯…)是ωω -regular(和步琪的大小自动机识别它是NFA的大小的多项式(识别常规语言)。

下面的证明。

定理5:确定NFA描述的常规语言是否包含无限的无前缀子集,可以在NFA大小的时间多项式中完成。

定理5的证明:通过命题3,足以测试它是否包含一个无穷无前缀的子集,这可以在多项式时间内通过构建命题4给出的Büchi自动机并测试其非空性来完成语言(可以按照Büchi自动机的大小以线性方式在时间上完成)。


命题证明2

引理2.1:如果SS是无前缀集合,则w − 1 Sw−1S(对于任何单词ww)也是如此。

证明2.1:根据定义。

引理2.2:令SS为无限个单词。让w ^ := LCP (小号ñ)w:=lcp(Sn)是最长前缀通用于所有单词小号S。SS和w − 1 Sw−1S具有相同的基数。

证明2.2:用f (x )= w x定义f :w - 1 S → S。它由w - 1 S的定义很好地定义,由f的定义是单射的,由w的定义是单射的。

命题2的证明:我们建立ü ñ和v ñ感应上ñ,与归纳假设^ h ñ以下几部分组成:

  • (P 1)对于所有 ķ ∈ { 1 ,... ,Ñ }, ü 0 ... Ü ķ - 1 v ķ ∈ 小号 ;

  • (P 2)对于所有的 ķ ∈ { 1 ,... ,Ñ }, ù ķ和 v ķ是非空的,并与不同的字母开头的;

  • (P 3) S n:= (u 0 … u n )− 1 S是无限的;

  • (P 4)S n中的所有单词没有通用的非空前缀。换句话说:没有字母一个,使得小号ñ ⊆ 一个Σ *。

备注2.3:如果我们有序列验证H n而没有(P 4),则可以修改u n使其也满足(P 4)。确实,用u n lcp (S n)替换u n就足够了。(P 1)不受影响。(P 2)是微不足道的。(P 4)是通过构造。(P 3) 是引理3。

现在,我们通过对n进行归纳来构建序列:

  • 初始化:通过取u 0:= lcp (S )(即,取u 0:= ε并加上注释3.1),H 0为真。

  • 归纳步骤:假设我们有单词u 1,… ,u n和v 1,… ,v n使得H n等于n。我们将建立u n + 1和v n + 1,使H n + 1。

由于小号Ñ是无限的和无前缀(由引理1),它不包含ε使得小号Ñ = ⨆ 一个&Element; Σ(小号Ñ ∩ 一个Σ *)。由于小号ñ是无限的,有一个字母一个,使得小号ñ ∩ 一个Σ *是无限的。由(P 4),有一个字母b不同于一个使得小号Ñ ∩ b Σ∗非空。挑 v Ñ + 1 ∈ 小号Ñ ∩ b Σ *。将 u n + 1设为 a将满足(P 1),(P 2)和(P 3),因此我们应用注释3.1来获得(P 4): u n + 1:= a lcp (a − 1 S n)。

(P 1) Ü 1 ... ü ñ v Ñ + 1 ∈ Ü 1 ... ù Ñ(小号Ñ ∩ b Σ *)⊆ 小号。

(P 2)通过的定义 ü Ñ + 1和 v Ñ + 1。

(P 3) 一- 1小号Ñ是通过定义无限一个,和小号Ñ + 1因此,通过无限引理3。

(P 4)通过的定义 ü Ñ + 1。


命题证明4

命题4的证明:令A = (Q ,→ ,Δ ,q 0,F )为NFA。

这个想法是这样的:我们读u 0,记住我们在哪里,读v 1,在读完u 0之后,回到我们在哪里,读u 1,记住我们在哪里,...我们还记得第一个字母是读每个v n以确保u n以另一个字母开头。

有人告诉我,使用多头自动机可能会更容易,但是我对形式主义并不真正熟悉,因此我仅使用Büchi自动机(只有一个头)来描述它。

我们设置Σ ':= ¯ Σ ⊔ Σ,其中上划线的符号将用于描述û ķ S和符号的帽子为v ķ秒。

我们设置Q ':= Q × ({ ⊥ } ⊔ (Q × Σ )),其中:

  • (q ,⊥ )意味着你正在阅读一些 ü ñ ;

  • (q ,(p ,a ))表示您已经在状态 p下读取了一些 u n,现在您正在读取以 a开头的 v n + 1,一旦完成,您将返回到 p读取不以 a开头的 u n + 1。

我们设定q ' 0:= (q 0,⊥ )通过阅读,因为我们开始ü 0。

我们将F '定义为F × Q × Σ。

过渡集→ '的定义如下:

  • “ û Ñ ”对于每个过渡q 一个→ q ',ADD (q ,⊥ )¯ 一个 → '(q ',⊥ ) ;

  • “ û Ñ到v Ñ + 1 ”对于每个过渡q 一个→ q ',ADD (q ,⊥ )一 → '(q ',(q ,一)) ;

  • “ v Ñ ”对于每个过渡q 一个→ q ',ADD (q ,(p ,一))一 → '(q ',(p ,一)) ;

  • “ v Ñ到û Ñ ”对于每个过渡p 一个→ p ',其中p是最终的,字母b不同于一,添加(q ,(p ,b ))&OverBar; 一个 → '(p ',⊥ ) ;

引理4.1:¯ ü 0 ^ v 1&OverBar; Ü 1 ^ v 2 ... &OverBar; û Ñ ^ v Ñ + 1是由接受阿'为每个IFF Ñ ≥ 1,ù Ñ和v Ñ是非空的,并与不同的字母开头的和每个ñ ≥ 0,ü 0 ... ü ñ v ñ + 1 ∈ 大号(甲)。

引理的证明4.1:留给读者。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.