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.