Votre problème peut être résolu en temps polynomial.
Pour commencer, convertissez le NFA donné en NFA équivalent avec les propriétés supplémentaires suivantes:
- Il n'y a pas de transitions epsilon
- Tous les états sont accessibles depuis l'état de départ
Sous-programme utile
Supposons que nous ayons un NFA NN , un état qq et une chaîne non vide ss . Le sous-programme suivant nous permettra d'évaluer la valeur de vérité de l'énoncé suivant: "chaque chemin dans NN de l'état qq à un état d'acceptation correspond à une chaîne qui est un préfixe de la chaîne s nsn pour certains nn ." De plus, ce sous-programme s'exécutera en temps polynomial.
Construisez d'abord le NFA SS avec | s | + 1| s | +1 états qui accepte toutes les chaînes qui ne sont pas des préfixes de s nsn pour tout nn ( | s || s | états non acceptés dans une boucle pour garder une trace de l'endroit où dans le "modèle" de s s s s s ...s s s s s … nous sommes jusqu'à présent, et on accepte l'état car si nous avons déjà dévié de ce modèle). Ensuite, construisons le NFA N 'N′ qui est exactement comme NN mais a qq comme état de départ. Enfin, construisez un NFA final N ″N′ ′dont le langage L ( N ″ )L (N′′) est L ( S ) ∩ L ( N ′ ) enL(S) ∩ L (N′) utilisant la construction d'intersection NFA standard. Notez que toutes ces constructions sont polynomiales dans la taille de l'entrée.
Ensuite, testez simplement si la langue de N "N′ ′ est vide (ce qui peut être fait en temps polynomial avec une simple recherche de graphe). L ( N ″ ) = ∅L ( N′ ′) = ∅ si et seulement si L ( S ) ∩ L ( N ′ ) = ∅L (S)∩L(N′)=∅ , ou en d'autres termes chaque chaîne dans L ( N ′ )L(N′) n'est pas dans L ( S )L(S) . En d'autres termes, le langage de N "N′′ est vide si et seulement si N 'N′accepte uniquement les chaînes qui sont des préfixes de s nsn pour certains nn . Cela peut être reformulé exactement comme l'énoncé que nous essayions d'évaluer: "chaque chemin dans NN de l'état qq à un état d'acceptation correspond à une chaîne qui est un préfixe de la chaîne s nsn pour certains nn ."
Algorithme principal
Considérez l'ensemble des états de la NFA qui sont dans une boucle. Pour chacun de ces états, qq , procédez comme suit:
Soit P 2P2 toute boucle simple contenant qq . Soit ss la chaîne correspondant à la boucle P 2P2 . Puisque le NFA n'a pas de transitions epsilon, ss n'est pas vide. Appliquez ensuite le sous-programme au NFA, l'état qq et la chaîne ss . Si le sous-programme nous dit que chaque chemin commençant à qq dans le NFA et se terminant à un état d'acceptation correspond à un préfixe de s nsn pour certains n,n alors passez à l'état suivant qq . Sinon, affichez que le langage NFA donné contient un sous-ensemble infini sans préfex.
Si nous essayons chaque état qq qui est dans une boucle et que l'algorithme ne sort jamais, alors sortez que le langage NFA donné ne contient pas un sous-ensemble infini sans préfex.
Exactitude (première moitié)
Supposons d'abord que l'algorithme ci-dessus affirme que le langage du NFA donné contient un sous-ensemble infini sans préfex. Disons que cette sortie a été sélectionnée en considérant une boucle P 2P2 et un état qq . Comme précédemment, ss est la chaîne correspondant à P 2P2 . Ensuite, nous savons selon le sous-programme que tous les chemins commençant à qq dans le NFA et se terminant à un état d'acceptation correspondent à un préfixe de s nsn pour certains nn (car c'est la seule sortie du sous-programme qui conduirait à l'algorithme principal sortie à ce qq ).
Soit P 3P3 un chemin dont l'existence est affirmée par le sous-programme: un chemin de qq à un état accepté tel que la chaîne correspondante tt n'est pas un préfixe de s nsn pour tout nn .
Soit P ′ 2P′2 constitué de mm copies de P 2P2 où mm est suffisamment grand pour que m | s | > | t | m|s|>|t|. Puisque P 2P2 est une boucle passant par qq , P ' 2P′2 peut être traité comme un chemin de qq à qq . La chaîne correspondant à P ′ 2P′2 est s msm
Soit P 1P1 un chemin depuis l'état de départ vers qq (qui existe puisque chaque état est accessible depuis le début) et soit rr la chaîne correspondant à ce chemin.
Alors le chemin consistant en P 1P1 , xx copies de P ' 2P′2 et P 3P3 est un chemin de calcul acceptant. La chaîne correspondant à ce chemin est r ( s m ) x tr(sm)xt . Ainsi, le NFA accepte chaque chaîne de la forme r ( s m ) x tr(sm)xt . Il s'agit d'un ensemble infini de chaînes acceptées par la NFA, et je prétends que cet ensemble de chaînes est sans préfixe. En particulier, supposons que r ( s m ) x tr(sm)xt est un préfixe de r (s m ) y tr(sm)yt avec y > xy>x . En d'autres termes, tt est un préfixe de ( s m ) y - x t(sm)y−xt . Puisque ( s m ) y - x(sm)y−x a une longueur m ( y - x ) | s | ≥ m | s | > | t | m(y−x)|s|≥m|s|>|t|, cela implique que tt est un préfixe de ( s m ) y- x = s m ( y - x )(sm)y−x=sm(y−x) . Mais nous savons par la sortie du sous-programme quettn'est pas un préfixe de s nsn pour toutnn. Ainsi,r( s m ) x tr(sm)xtne peut pas être un préfixe der( s m ) y tr(sm)yt, et comme souhaité, l'ensemble de chaînes est sans préfixe.
Ainsi, j'ai montré que si l'algorithme principal sort que le langage du NFA donné contient un sous-ensemble infini sans préfex, alors c'est en fait le cas.
Exactitude (deuxième moitié)
Ensuite, je montrerai l'autre moitié: si le langage du NFA donné contient un sous-ensemble sans préfixe infini, l'algorithme principal affichera ce fait.
Supposons que la langue du NFA donné contienne un sous-ensemble infini sans préfixe. Soit AA l'ensemble des chemins de calcul (accepteurs) correspondant à ces chaînes. Notez que AA est un ensemble infini de chemins de calcul acceptables dont les chaînes correspondantes ne sont jamais des préfixes les uns des autres.
Disons qu'un état "boucle" dans le NFA s'il existe une boucle dans le NFA à travers cet état et "ne boucle pas" sinon. Tenez compte de tous les chemins allant de l'état de début à tout état en boucle qui passent uniquement par des états sans boucle (à l'exception de l'état en boucle où ils finissent). Soit PP l'ensemble de ces chemins. Chaque chemin p ∈ Pp∈P ne peut pas avoir de boucle car alors les états de cette boucle seraient des états de boucle et donc pp passerait par un état de boucle. Ainsi, les longueurs de chemins dans PP sont limitées au-dessus par le nombre d'états dans le NFA et donc PP est fini (par exemple, si l'état de départ est un état en boucle, alors le seul chemin de ce type est le chemin vide).
Nous pouvons partitionner AA en | P | + 1|P|+1 sous-ensembles en fonction de la façon dont les chemins de calcul dans AA commencent. En particulier, pour p ∈ Pp∈P , que A pAp l'ensemble de tous les chemins de calcul dans AA qui commencent par chemin pp et laisser BB l'ensemble de tous les autres chemins dans AA . De toute évidence, tous les A pAp s et BB sont disjoints et leur union est l'ensemble complet AA . De plus, BBcontient uniquement des chemins qui ne passent jamais par un état de boucle, et donc jamais en boucle; ainsi BB est fini. On peut alors conclure que certains A pAp doivent être infinis (sinon AA serait une union de plusieurs ensembles finis).
Puisque A pAp est infini, il existe une infinité de chemins de calcul, dont aucune chaîne n'est un préfixe l'un de l'autre, qui acceptent des chemins commençant par pp . Soit qq l'état atteint à la fin du chemin pp . On peut conclure qu'il existe une infinité de chemins accepteurs, appelons cet ensemble A 'A′ , en commençant par qq qui correspondent tous à des chaînes qui ne sont pas des préfixes les uns des autres.
Pendant l'algorithme principal, nous exécutons le sous-programme sur l'état qq et certaines chaînes ss . Ce sous-programme nous indique si chaque chemin d'acceptation commençant à qq correspond à une chaîne qui est un préfixe de s nsn pour certains nn . Si tel était le cas, alors tous les infiniment de chemins accepteurs dans A 'A′ seraient des préfixes de s nsn pour divers nn , ce qui impliquerait qu'ils sont tous des préfixes les uns des autres. Ce n'est pas le cas, nous concluons donc que lorsque l'algorithme principal exécute le sous-programme sur l'état qq, le résultat est l'autre résultat possible. Ceci, cependant, conduit l'algorithme principal à indiquer que le langage NFA contient un sous-ensemble infini sans préfixe.
Ceci conclut la preuve d'exactitude.
Définitions
Définition 1 : Soit SS un ensemble de mots. On dit que SS est joliment infini sans préfixe (nom composé aux fins de cette réponse) s'il y a les mots u 0 , … , u n , …u0,…,un,… et v 1 , … , v n , …v1,…,vn,… tels que:
Pour chaque n ≥ 1n≥1 , u nun et v n nevn sont pas vides et commencent par des lettres distinctes;
S = { u 0 v 1 , … , u 0 … u n v n + 1 , … }S={u0v1,…,u0…unvn+1,…} .
L'intuition est que vous pouvez mettre tous ces mots sur un arbre enraciné à l'infini (leS sont exactement les étiquettes des chemins de la racine à la feuille:
■
est la racine, les▲
feuilles et les•
nœuds intérieurs restants) de la forme suivante de telle sorte que les mots en SProposition 1.1 : Un ensemble sans préfixe bien infini est sans préfixe.
Preuve de la proposition 1.1 : Supposons que u 0 … u n v n + 1u0…unvn+1 est un préfixe strict de u 0 … u m v m + 1u0…umvm+1 . Il y a deux cas:
Si n < m,n<m alors v n + 1vn+1 est un préfixe de u n + 1 … u m v m + 1un+1…umvm+1 . Ceci est impossible car u n + 1un+1 et v n + 1vn+1 ont des premières lettres distinctes.
Si n > m,n>m alors u m + 1 … u n v n + 1um+1…unvn+1 est un préfixe de v m + 1vm+1 . Cela est impossible car u m + 1um+1 et v m + 1vm+1 ont des premières lettres distinctes.
Proposition 1.2 : Un ensemble sans préfixe bien infini est infini.
Preuve de la proposition 1.2 : Dans la preuve 1.1, nous avons montré que si n ≠ mn≠m alors u 0 … u n v n + 1u0…unvn+1 et u 0 … u m v m + 1u0…umvm+1 ne sont pas comparables pour l'ordre des préfixes. Ils ne sont donc pas égaux.
Preuve principale
Proposition 2 : Tout ensemble sans préfixe infini contient un bel ensemble sans préfixe infini.
Proposition 3 : Un langage contient un ensemble sans préfixe infini si et seulement s'il contient un ensemble sans préfixe bien infini.
Preuve ci-dessous.
Preuve de la proposition 3 : ⇒⇒ par la proposition 2. ⇐⇐ par les propositions 1.1 et 1.2.
Proposition 4 : L'ensemble des sous-ensembles sans préfixe d'une langue régulière (codés comme un mot infini ¯ u 0 ^ v 1 ¯ u 1 ^ v 2 ¯ u 2 …u0¯¯¯¯¯v1ˆu1¯¯¯¯¯v2ˆu2¯¯¯¯¯… ) est ω-ω régulier (et la taille des Büchi automate le reconnaissant est polynomial dans la taille du NFA reconnaissant le langage régulier).
Preuve ci-dessous.
Théorème 5 : décider si un langage régulier décrit par un NFA contient un sous-ensemble infini sans préfixe peut être fait en polynôme temporel de la taille du NFA.
Preuve du théorème 5 : Par la proposition 3, il suffit de tester s'il contient un sous-ensemble sans préfixe bien infini, ce qui peut être fait en temps polynomial en construisant l'automate Büchi donné par la proposition 4 et en testant la non-vacuité de son langue (ce qui peut être fait en temps linéaire de la taille de l'automate Büchi).
Preuve de la proposition 2
Lemme 2.1 : Si SS est un ensemble sans préfixe, il en est de même de w - 1 Sw−1S (pour tout mot ww ).
Preuve 2.1 : Par définition.
Lemme 2.2 : Soit SS un ensemble infini de mots. Laissez w : = lcp ( S n )w:=lcp(Sn) soit le plus long préfixe commun à tous les mots SS . SS et w - 1 Sw−1S ont le même cardinal.
Preuve 2.2 : Définissez f : w - 1 S → Sf:w−1S→S par f ( x ) = w xf(x)=wx . Elle est bien définie par la définition de w - 1 Sw−1S , injective par définition de ff et surjective par définition de ww .
Preuve de la proposition 2 : On construit u nun et v nvn par induction sur nn , avec l'hypothèse d'induction H nHn composée des parties suivantes:
( P 1 )(P1) Pour tout k ∈ { 1 , … , n }k∈{1,…,n} , u 0 … u k - 1 v k ∈ Su0…uk−1vk∈S ;
( P 2 )(P2) Pour tout k ∈ { 1 , … , n }k∈{1,…,n} , u kuk et v kvk sont non vides et commencent par des lettres distinctes;
( P 3 )(P3) S n : = ( u 0 … u n ) - 1 SSn:=(u0…un)−1S est infini;
( P 4 )(P4) Il n'y a pas de préfixe non vide commun à tous les mots dans S nSn . En d'autres termes: il n'y a pas de lettre aa telle que S n ⊆ a Σ ∗Sn⊆aΣ∗ .
Remarque 2.3 : Si nous avons des séquences qui vérifient H nHn sans ( P 4 )(P4) , nous pouvons modifier u nun pour les faire satisfaire également ( P 4 )(P4) . En effet, il suffit de remplacer u nun par u n lcp ( S n )unlcp(Sn) . ( P 1 )(P1) n'est pas affecté. ( P 2 )(P2) est trivial. ( P 4 )(P4) est par construction. ( P 3 )(P3) est par le lemme 3.
Nous construisons maintenant les séquences par induction sur nn :
Initialisation: H 0H0 est vrai en prenant u 0 : = lcp ( S )u0:=lcp(S) (c'est-à-dire en prenant u 0 : = εu0:=ε et en appliquant la remarque 3.1).
Étape d'induction: Supposons que nous ayons les mots u 1 , … , u nu1,…,un et v 1 , … , v nv1,…,vn tels que H nHn pour certains nn . Nous allons construire u n + 1un+1 et v n + 1vn+1 tels que H n + 1Hn+1 .
Puisque S nSn est infini et sans préfixe (par le lemme 1), il ne contient pas ε deε sorte que S n = ⨆ a ∈ Σ ( S n ∩ a Σ ∗ )Sn=⨆a∈Σ(Sn∩aΣ∗) . Puisque S n est infini, il existe une lettre a telle que S n ∩ a Σ ∗ est infinie. Par ( P 4 ) , il y a une lettre b distincte de a telle que S n ∩ b Σ∗ n'est pas vide. Sélectionnez v n + 1 ∈ S n ∩ b Σ ∗ . Prendre u n + 1 pour être un satisferait ( P 1 ) , ( P 2 ) et ( P 3 ) donc on applique la remarque 3.1 pour obtenir ( P 4 ) : u n + 1 : = a lcp ( a - 1 S n) .
( P 1 ) u 1 ... u n v n + 1 ∈ u 1 ... u n ( S n ∩ b Σ * ) ⊆ S .
( P 2 ) Par définition de u n + 1 et v n + 1 .
( P 3 ) a - 1 S n est infini par définition de a , et S n + 1 est donc infini par lemme 3.
( P 4 ) Par définition de u n + 1 .
Preuve de proposition 4
Preuve de la proposition 4 : Soit A = ( Q , → , Δ , q 0 , F ) un NFA.
L'idée est la suivante: on lit u 0 , on se rappelle où on est, on lit v 1 , on revient en arrière où on était après avoir lu u 0 , on lit u 1 , on se rappelle où on est, ... On se souvient aussi de la première lettre qui était lisez chaque v n pour vous assurer que u n commence par une autre lettre.
On m'a dit que cela pourrait être plus facile avec des automates à têtes multiples, mais je ne connais pas vraiment le formalisme, je vais donc le décrire en utilisant un automate Büchi (avec une seule tête).
On pose Σ ′ : = ¯ Σ ⊔ Σ , où les symboles surlignés seront utilisés pour le décrituks et les symboles avecchapeaux pour lesvks.
On pose Q ′ : = Q × ( { ⊥ } ⊔ ( Q × Σ ) ) , où:
( q , ⊥ ) signifie que vous lisez des u n ;
( q , ( p , a ) ) signifie que vous avez fini de lire certains u n dans l'état p , que vous lisez maintenant v n + 1 qui commence par un a , et qu'une fois que vous avez terminé, vous reviendrez à p pour lire un u n + 1 qui ne commence pas par a .
Nous fixons q ′ 0 : = ( q 0 , ⊥ ) car on commence par lire u 0 .
Nous définissons F ′ comme F × Q × Σ .
L'ensemble des transitions → ′ est défini comme suit:
" u n " Pour chaque transition q a → q ′ , ajoutez ( q , ⊥ ) ¯ a → ′ ( q ′ , ⊥ ) ;
" U n à v n + 1 " pour chaque transition q a → q ' , add ( q , ⊥ ) une→'(q',(q,a));
" V n " Pour chaque transition q a → q ' , add ( q , ( p , a ) ) une→'(q',(p,a));
" v n à u n " Pour chaque transition p a → p ′ où p est final et la lettre b distincte de a , ajoutez ( q , ( p , b ) ) ¯ a →′(p′,⊥);
Lemme 4.1 : ¯ u 0 ^ v 1 ¯ u 1 ^ v 2 ... ¯ u n ^ v n + 1 est acceptée par A ' ssi pour chaque n ≥ 1 , u n et v n sont non-vide et de commencer avec des lettres distinctes , et pour chaque n ≥ 0 , u 0 … u n v n + 1 ∈ L ( A) .
Preuve du lemme 4.1 : laissée au lecteur.
la source