Twój problem można rozwiązać w czasie wielomianowym.
Na początek przekonwertuj podany NFA na równoważny NFA z następującymi dodatkowymi właściwościami:
- Nie ma przejść epsilon
- Wszystkie stany są osiągalne od stanu początkowego
Pomocny podprogram
Załóżmy, że mamy NFA NN , stan qq i niepusty ciąg ss . Poniższy podprogram pozwoli nam ocenić wartość prawdy następującego wyrażenia: „każda ścieżka w NN od stanu qq do stanu akceptacji odpowiada ciągowi, który jest prefiksem ciągu s nsn dla niektórych nn .” Ponadto ten podprogram będzie działał w czasie wielomianowym.
Najpierw zbuduj NFA SS z | s | + 1|s|+1 stanów, które akceptuje wszystkie ciągi, które nie są prefiksy s nsn dla dowolnego nn ( | s ||s| nie akceptują stany w pętli, aby śledzić, gdzie w „wzór” na s s s s s ...sssss… jesteśmy tak daleko, i jeden akceptuje stan, jeśli już odeszliśmy od tego wzoru). Następnie skonstruuj NFA N ',N′ który jest dokładnie jak N,N ale ma qq jako stan początkowy. Na koniec skonstruuj ostateczną NFA N ″N′′którego językiem jest przy użyciu standardowej konstrukcji skrzyżowania NFA. Zauważ, że wszystkie te konstrukcje są wielomianowe pod względem wielkości danych wejściowych.L(N″)L(N′′)L(S)∩L(N′)L(S)∩L(N′)
Następnie po prostu sprawdź, czy język jest pusty (co można zrobić w czasie wielomianowym za pomocą prostego wyszukiwania grafowego). wtedy i tylko wtedy, gdy , lub innymi słowy, każdy łańcuch w nie jest w L ( S ) . Innymi słowy, język N ″ jest pusty wtedy i tylko wtedy, gdy N ′ akceptuje tylko ciągi znaków, które są prefiksami s n dla niektórych n . Można to przeformułować jako dokładnie stwierdzenie, które próbowaliśmy ocenić: „każda ścieżka w N od stanu qN ″N′′ L ( N ″ ) = ∅ L(N′′)=∅L ( S ) ∩ L ( N ′ ) = ∅ L(S)∩L(N′)=∅L ( N ′ )L(N′)L(S)N′′N′snnNqstan akceptacji odpowiada ciągowi, który jest przedrostkiem ciągu s nsn dla niektórych nn . "
Główny algorytm
Rozważ zestaw stanów w NFA, które są w jakiejś pętli. Dla każdego takiego stanu qq wykonaj następujące czynności:
Niech P 2P2 będzie dowolną prostą pętlą zawierającą qq . Niech as jako ciąg odpowiadający pętli P 2P2 . Ponieważ NFA nie ma przejść epsilon, ss nie jest pusty. Następnie zastosuj podprogram do NFA, stan qq i łańcuch ss . Jeśli podprogram mówi nam, że każda ścieżka rozpoczynająca się od qq w NFA i kończąca się na stanie akceptacji odpowiada prefiksowi s nsn dla niektórych n,n to przechodzi do następnego stanu qq . W przeciwnym razie wyjdź, że dany język NFA zawiera nieskończony podzbiór wolny od prefiksów.
Jeśli spróbujemy każdego stanu q,q który jest w pętli, a algorytm nigdy nie wyprowadza danych wyjściowych, oznacza to, że język danego NFA nie zawiera nieskończonego podzbioru wolnego od prefiksów.
Prawidłowość (pierwsza połowa)
Po pierwsze, załóżmy, że powyższy algorytm stwierdza, że dany język NFA zawiera nieskończony podzbiór wolny od prefiksów. Powiedzmy, że ta moc została wybrana przy rozpatrywaniu trochę pętli P 2P2 i niektóre państwa qq . Tak jak poprzednio, as jest łańcuchem odpowiadające P 2P2 . Następnie wiemy zgodnie z podprogramem, że nie każda ścieżka rozpoczynająca się od qq w NFA i kończąca się na stanie akceptacji odpowiada przedrostkowi s nsn dla niektórych nn (ponieważ jest to jedyne wyjście podprogramu, które prowadzi do głównego algorytmu wyjście w tym qq ).
Niech P 3P3 będzie ścieżką, której istnienie jest zapewnione przez podprogram: ścieżka od qq do stanu akceptacji, tak że odpowiadający ciąg tt nie jest przedrostkiem s nsn dla żadnego nn .
Niech P ′ 2P′2 składa się z mm kopii P 2,P2 gdzie mm jest wystarczająco duży, aby m | s | > | t | m|s|>|t|. Ponieważ P 2P2 jest pętli Pq , P ' 2P′2 mogą być traktowane jako tor z Qq na Pq . Ciąg odpowiadający P ′ 2P′2 to s msm
Niech P 1P1 będzie ścieżką od stanu początkowego do qq (która istnieje, ponieważ każdy stan jest osiągalny od początku) i niech rr będzie łańcuchem odpowiadającym tej ścieżce.
Zatem ścieżka składająca się z P 1P1 , xx kopii P ′ 2P′2 i P 3P3 jest ścieżką obliczeń akceptujących. Ciąg odpowiadający tej ścieżce to r ( s m ) x tr(sm)xt . Zatem NFA akceptuje każdy ciąg postaci r ( s m ) x tr(sm)xt . Jest to nieskończony zestaw ciągów akceptowanych przez NFA i twierdzę, że ten zestaw ciągów nie zawiera prefiksów. W szczególności załóżmy, że r ( s m ) x tr(sm)xt jest przedrostkiem r (y m ) r tr(sm)yt z y > xy>x . Innymi słowy, tt jest prefiksem ( s m ) y - x t(sm)y−xt . Ponieważ ( s m ) y - x(sm)y−x ma długość m ( y - x ) | s | ≥ m | s | > | t | m(y−x)|s|≥m|s|>|t|oznacza to, że tt jest prefiksem ( s m ) y- x = s m ( y - x )(sm)y−x=sm(y−x) . Ale wiemy na podstawie wyniku podprogramu, żettnie jest przedrostkiem s nsn dla żadnegonn. Zatemr( s m ) x tr(sm)xtnie może być prefiksemr( s m ) y tr(sm)yt, a zgodnie z potrzebami zestaw ciągów znaków nie zawiera prefiksu.
Dlatego pokazałem, że jeśli główny algorytm wypisuje, że język danego NFA zawiera nieskończony podzbiór wolny od prefiksów, to w rzeczywistości tak jest.
Prawidłowość (druga połowa)
Następnie pokażę drugą połowę: jeśli język danego NFA zawiera nieskończony podzbiór wolny od prefiksów, to główny algorytm wypisze ten fakt.
Załóżmy, że dany język NFA zawiera nieskończony podzbiór bez prefiksów. Niech AA będzie zbiorem (akceptujących) ścieżek obliczeniowych odpowiadających tym ciągom. Zauważ, że AA jest nieskończonym zestawem akceptujących ścieżek obliczeniowych, których odpowiadające ciągi nigdy nie są przedrostkami.
Powiedz, że stan „zapętla się” w NFA, jeśli istnieje pętla w NFA przez ten stan, a w przeciwnym razie „nie zapętla”. Rozważ wszystkie ścieżki od stanu początkowego do dowolnego stanu zapętlenia, które przechodzą tylko przez stany niepętlowe (z wyjątkiem jednego stanu zapętlenia, w którym się kończą). Niech PP będzie zbiorem tych ścieżek. Każda ścieżka p ∈ Pp∈P nie może mieć pętli, ponieważ wówczas stany w tej pętli byłyby stanami pętli, a zatem pp przechodziłoby przez stan pętli. Tak więc długości ścieżek w PP są ograniczone przez liczbę stanów w NFA, a zatem PP jest skończone (na przykład, jeśli stan początkowy jest stanem zapętlonym, wówczas jedyną taką ścieżką jest pusta ścieżka).
Możemy podzielić AA na | P | + 1|P|+1 podzestawy na podstawie tego, jak zaczynają się ścieżki obliczeniowe w A. AW szczególności, w przypadku p ∈ Pp∈P , niech P jest zbiorem wszystkich ścieżek obliczeń w A, które zaczynają się od ścieżki P i pozwolić B jest zbiorem wszystkich innych ścieżek A . Oczywiście, wszystkie P S i B są rozłączne i ich suma jest cały zestaw . Ponadto B.ApApBAApBABzawiera tylko ścieżki, które nigdy nie przechodzą przez stan zapętlenia, a zatem nigdy nie zapętlają; zatem BB jest skończone. Możemy zatem dojść do wniosku, że niektóre A pAp muszą być nieskończone (w przeciwnym razie AA byłby związkiem skończonych wielu zbiorów skończonych).
Ponieważ A pAp jest nieskończone, istnieje nieskończenie wiele ścieżek obliczeniowych, z których żaden łańcuch nie jest przedrostkiem, które akceptują ścieżki zaczynające się od pp . Niech qq będzie stanem osiągniętym na końcu ścieżki pp . Możemy dojść do wniosku, że istnieje nieskończenie wiele ścieżek akceptujących, nazwijmy ten zestaw A ′A′ , zaczynając od qq wszystkie, które odpowiadają ciągom znaków, które nie są przedrostkami.
Podczas głównego algorytmu uruchamiamy podprogram w stanie qq i niektórych ciągach ss . Ten podprogram mówi nam, czy każda akceptowalna ścieżka rozpoczynająca się od qq odpowiada ciągowi, który jest prefiksem s nsn dla niektórych nn . Gdyby tak było, wszystkie nieskończenie wiele ścieżek akceptujących w A 'A′ byłyby prefiksami s nsn dla różnych nn , co oznaczałoby, że wszystkie one są przedrostkami siebie. Tak nie jest, więc dochodzimy do wniosku, że gdy główny algorytm uruchamia podprogram w stanie qq, wynikiem jest inny możliwy wynik. To jednak prowadzi główny algorytm do wyjścia, że język NFA zawiera nieskończony podzbiór wolny od prefiksów.
To kończy dowód poprawności.
Definicje
Definicja 1 : Niech SS będzie zbiorem słów. Mówimy, że SS jest ładnie nieskończenie wolny od przedrostka (wymyślona nazwa na potrzeby tej odpowiedzi), jeśli istnieją słowa u 0 , … , u n , …u0,…,un,… i v 1 , … , v n , …v1,…,vn,… takie, że:
Dla każdego n ≥ 1n≥1 , u nun i v nvn są niepuste i zaczynają się od odrębnych liter;
S = { u 0 v 1 , … , u 0 … u n v n + 1 , … }S={u0v1,…,u0…unvn+1,…} .
Intuicja polega na tym, że możesz umieścić wszystkie te słowa na nieskończonym ukorzenionym drzewie (S są dokładnie etykietami ścieżek od korzenia do liścia:
■
jest to korzeń,▲
są liście i•
pozostałe są wewnętrzne węzły) o następującym kształcie, tak że słowa w STwierdzenie 1.1 : Ładnie nieskończony zbiór bez prefiksów jest bez prefiksów.
Dowód zdania 1.1 : Załóżmy, że u 0 … u n v n + 1u0…unvn+1 jest ścisłym przedrostkiem u 0 … u m v m + 1u0…umvm+1 . Istnieją dwa przypadki:
Jeśli n < m,n<m to v n + 1vn+1 jest prefiksem u n + 1 … u m v m + 1un+1…umvm+1 . Jest to niemożliwe, ponieważ u n + 1un+1 i v n + 1vn+1 mają wyraźne pierwsze litery.
Jeśli n > m,n>m to u m + 1 … u n v n + 1um+1…unvn+1 jest prefiksem v m + 1vm+1 . Jest to niemożliwe, ponieważ u m + 1um+1 i v m + 1vm+1 mają wyraźne pierwsze litery.
Twierdzenie 1.2 : Ładnie nieskończony zbiór bez prefiksów jest nieskończony.
Dowód tezy 1,2 W dowód 1.1, wykazano, że jeśli n ≠ mn≠m wówczas U 0 ... u n v n + 1u0…unvn+1 i U 0 ... U m v m + 1u0…umvm+1 nie są porównywalne w celu prefiks. Dlatego nie są równi.
Główny dowód
Twierdzenie 2 : Dowolny nieskończony zbiór bez prefiksów zawiera niezły nieskończony zbiór bez prefiksów.
Twierdzenie 3 : Język zawiera nieskończony zbiór bez prefiksów tylko wtedy, gdy zawiera ładnie nieskończony zbiór bez prefiksów.
Dowód poniżej.
Dowód zdania 3 : ⇒⇒ według zdania 2. ⇐⇐ według zdań 1.1 i 1.2.
Twierdzenie 4 : Zbiór ładnie pozbawionych prefiksów podzbiorów języka regularnego (zakodowanych jako nieskończone słowo ¯ u 0 ^ v 1 ¯ u 1 ^ v 2 ¯ u 2 …u0¯¯¯¯¯v1ˆu1¯¯¯¯¯v2ˆu2¯¯¯¯¯… ) jest ω-ω nieregularny (i ma rozmiar Büchi automat rozpoznający to wielomian wielkości NFA rozpoznającej zwykły język).
Dowód poniżej.
Twierdzenie 5 : Podejmowanie decyzji, czy zwykły język opisany przez NFA zawiera nieskończony podzbiór wolny od prefiksów, można wykonać wielomianem czasowym wielkości NFA.
Dowód twierdzenia 5 : Według twierdzenia 3 wystarczy sprawdzić, czy zawiera on ładnie nieskończony podzbiór wolny od prefiksów, co można zrobić w czasie wielomianowym, budując automat Büchi podany w twierdzeniu 4 i testując niepustość jego język (który można wykonać w czasie liniowo w rozmiarze automatu Büchi).
Dowód propozycji 2
Lemat 2.1 : Jeśli SS jest zbiorem bez prefiksów, to także w - 1 Sw−1S (dla dowolnego słowa ww ).
Dowód 2.1 : Z definicji.
Lemat 2.2 : Niech SS będzie nieskończonym zestawem słów. Niech w : = LCP ( S n )w:=lcp(Sn) najdłuższa prefiks wspólne dla wszystkich słów SS . SS i w - 1 Sw−1S mają tego samego kardynała.
Dowód 2.2 : Zdefiniuj f : w - 1 S → Sf:w−1S→S przez f ( x ) = w xf(x)=wx . Jest dobrze zdefiniowany przez definicję w - 1 Sw−1S , iniekcyjny z definicji ff i przymiotnikowy z definicji ww .
Dowód tezy 2 Budujemy U nun i v nvn przez indukcję nn , z założenia indukcyjnego H nHn składa się z następujących części:
(P1)(P1) For all k∈{1,…,n}k∈{1,…,n} , u0…uk−1vk∈Su0…uk−1vk∈S ;
(P2)(P2) For all k∈{1,…,n}k∈{1,…,n} , ukuk and vkvk are non-empty and start with distinct letters;
(P3)(P3) Sn:=(u0…un)−1SSn:=(u0…un)−1S is infinite;
(P4)(P4) There is no non-empty prefix common to all words in SnSn . In other words: There is no letter aa such that Sn⊆aΣ∗Sn⊆aΣ∗ .
Remark 2.3: If we have sequences that verify HnHn without (P4)(P4) , we can modify unun to make them to also satisfy (P4). Indeed, it suffices to replace un by unlcp(Sn). (P1) is unaffected. (P2) is trivial. (P4) is by construction. (P3) is by lemma 3.
We now build the sequences by induction on n:
Initialization: H0 is true by taking u0:=lcp(S) (i.e. by taking u0:=ε and applying remark 3.1).
Induction step: Suppose that we have words u1,…,un and v1,…,vn such that Hn for some n. We will build un+1 and vn+1 such that Hn+1.
Since Sn is infinite and prefix-free (by lemma 1), it does not contain ε so that Sn=⨆a∈Σ(Sn∩aΣ∗). Since Sn is infinite, there is a letter a such that Sn∩aΣ∗ is infinite. By (P4), there is a letter b distinct from a such that Sn∩bΣ∗ is non-empty. Pick vn+1∈Sn∩bΣ∗. Taking un+1 to be a would satisfy (P1), (P2) and (P3) so we apply remark 3.1 to get (P4): un+1:=alcp(a−1Sn).
(P1) u1…unvn+1∈u1…un(Sn∩bΣ∗)⊆S.
(P2) By definition of un+1 and vn+1.
(P3) a−1Sn is infinite by definition of a, and Sn+1 is therefore infinite by lemma 3.
(P4) By definition of un+1.
Proof of proposition 4
Proof of proposition 4: Let A=(Q,→,Δ,q0,F) be a NFA.
The idea is the following: we read u0, remember where we are, read v1, backtrack to where we were after reading u0, read u1, remember where we are, ... We also remember the first letter that was read in each vn to ensure that un starts with another letter.
I've been told that this could be easier with multi-head automata but I'm not really familiar with the formalism so I'll just describe it using a Büchi automaton (with only one head).
We set Σ′:=¯Σ⊔ˆΣ, where the overlined symbols will be used to describes the uks and the symbols with hats for the vks.
We set Q′:=Q×({⊥}⊔(Q×Σ)), where:
(q,⊥) means that you are reading some un;
(q,(p,a)) means that you finished reading some un in the state p, that you are now reading vn+1 that starts with an a, and that once you are done, you will go back to p to read a un+1 that does not start with a.
We set q′0:=(q0,⊥) because we start by reading u0.
We define F′ as F×Q×Σ.
The set of transitions →′ is defined as follows:
"un" For each transition qa→q′, add (q,⊥)¯a→′(q′,⊥);
"un to vn+1" For each transition qa→q′, add (q,⊥)ˆa→′(q′,(q,a));
"vn" For each transition qa→q′, add (q,(p,a))ˆa→′(q′,(p,a));
"vn to un" For each transition pa→p′ where p is final and letter b distinct from a, add (q,(p,b))¯a→′(p′,⊥);
Lemma 4.1: ¯u0^v1¯u1^v2…¯un^vn+1 is accepted by A′ iff for each n≥1, un and vn are non-empty and start with distinct letters, and for each n≥0, u0…unvn+1∈L(A).
Proof of lemma 4.1: Left to the reader.
źródło