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


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 0F ]L[q0,F]
  2. q QqQ,因此不是的前缀。ü 大号[ q q ] { ε } uL[q,q]{ε} v 大号[ q ˚F ] vL[q,F]v vù ωuω
  3. q Q qQ 大号[ q q ] { ε } L[q,q]{ε} Ü 大号[ q q ] uL[q,q] v 大号[ q ˚F ]vL[q,F]因此不是前缀。v vü ωuω

证明:

3 2无关紧要。

对于2 1,足以看到对于任何我们都有是的无穷无前缀子集。瓦特大号[ q 0q ] wL[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|sssssNNqÑ 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不是任何ns nsn前缀。n

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

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

然后由以下组成的路径P 1P1Xx的副本P ' 2P2,和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)xtr s m y t,r(sm)yt其中 y > xy>x。换句话说, tts m y - x t(sm)yxt的前缀。由于s m y - x(sm)yx具有长度 m y - x | s | | s | > | t | m(yx)|s|m|s|>|t|,这意味着 tts m y的前缀x = s m y x (sm)yx=sm(yx)。但是,通过子例程的输出,我们知道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 PpP不能有一个环路然后在该回路中的状态将被循环状态等的pp将通过一个循环的状态。因此,PP中路径的长度在上方受NFA中状态数的限制,因此PP是有限的(例如,如果起始状态是循环状态,则唯一的这种路径是空路径)。

我们可以将AA划分为| P | + 1|P|+1个子集基于AA中的计算路径开始方式。特别地,对于p PpP,让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开始的每个接受路径是否对应于某个字符串,该字符串是某些ns nsn前缀。如果是这种情况,那么对于各种nA ′中的所有无限多的接受路径将是s n的前缀,这意味着它们都是彼此的前缀。事实并非如此,因此我们得出结论,当主算法在状态q上运行子例程时nAsnnq,结果是其他可能的结果。但是,这导致主要算法输出NFA的语言包含无限的无前缀子集。

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


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

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

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

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

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

2

定义

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

  • 对于每个Ñ 1n1ù Ñunv Ñvn是非空的,并与不同的字母开头的;

  • S = { u 0 v 1u 0u n v n + 1}S={u0v1,,u0unvn+1,}

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

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

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

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

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

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

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

命题1.2的证明:在证明1.1中,我们发现,如果ň nm然后ü 0 ... ü ñ v ñ + 1u0unvn+1ü 0 ... ü 中号v + 1u0umvm+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 Sw1S(对于任何单词ww)也是如此。

证明2.1:根据定义。

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

证明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 0u n 1 S是无限的;

  • P 4S 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 1u nv 1v n使得H n等于n。我们将建立u n + 1v n + 1,使H n + 1

由于小号Ñ是无限的和无前缀(由引理1),它不包含ε使得小号Ñ = 一个&Element; Σ小号Ñ一个Σ *。由于小号ñ是无限的,有一个字母一个,使得小号ñ一个Σ *是无限的。由P 4,有一个字母b不同于一个使得小号Ñb Σ非空。挑 v Ñ + 1小号Ñb Σ *。将 u n + 1设为 a将满足P 1P 2P 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 0F 为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.