Jak przekonwertować NFA z nakładającymi się cyklami na wyrażenie regularne?


11

Jeśli dobrze rozumiem, NFA mają taką samą moc ekspresji jak wyrażenia regularne. Często odczytywanie równoważnych wyrażeń regularnych z NFA jest łatwe: przekładasz cykle na gwiazdy, skrzyżowania jako alternatywy i tak dalej. Ale co zrobić w tym przypadku:

wprowadź opis zdjęcia tutaj
[ źródło ]

Nakładające się cykle utrudniają zobaczenie, co akceptuje ten automat (pod względem wyrażeń regularnych). Czy jest jakiś podstęp?


2
Byłoby dobrze, gdybyś mógł wskazać na diagramie, jakie są początkowe i końcowe stany: mała strzałka do stanu początkowego i podwójne kółko jako stan końcowy. Trudno też wiedzieć, gdzie się mylicie, jeśli nie dajecie żadnych wskazówek, co próbowaliście.
Dave Clarke

Być może ten dokument może ci pomóc: jasno wyjaśnia, jak przekonwertować NFA na RE.
Vor

1
Dlaczego to jest trudne? Czy wypróbowałeś jeden z algorytmów kanonicznych? Jaki jest najlepszy ansatz, jaki możesz zrobić?
Raphael

3
Zredagowałem, aby pytanie (imho) było interesujące i dobre dla tej witryny. Zobacz historię zmian, aby sformułować opinię.
Raphael

1
Mam gotową odpowiedź, która przekształca twoje NFA w wyrażenie regularne, ale usunąłem ją: odpowiedź Raphaela daje ci metodę, którą musisz zrobić sam (daje również link do przykładu), więc możesz poćwiczyć, jeśli chcieć. Jeśli nadal chcesz moje rozwiązanie, cofnę usunięcie mojej odpowiedzi.
Alex ten Brink

Odpowiedzi:


5

Zamiast „czytać” powinieneś zastosować jedną z kilku kanonicznych metod, aby to zrobić. Zdecydowanie najpiękniejszy, jaki widziałem, to taki, który wyraża automat jako układ równań (zwykłych) języków, które można rozwiązać. Jest to szczególnie miłe, ponieważ wydaje się przynosić bardziej zwięzłe wyrażenia niż inne metody.

Napisałem ten dokument wyjaśniający metodę dla studentów zeszłego lata. Odnosi się bezpośrednio do konkretnego wykładu; wspomniane odniesienie jest typową definicją wyrażeń regularnych. Zawiera dowód Lemmy Ardena (potrzebny wynik); brakuje jednego dla poprawności metody. Jak dowiedziałem się o tym na wykładzie, niestety nie mam odniesienia.

W skrócie: dla każdego stanu utwórz równanieqja

Qja=qjazaqjotzaQjot{{ε}, qjafa, jeszcze

gdzie jest zbiorem stanów końcowych, a q i a q j oznacza przejście z q i na q j oznaczone jako . Jeśli czytasz jako + lub (w zależności od definicji wyrażenia regularnego), zobaczysz, że jest to równanie wyrażeń regularnych.faqjazaqjotqjaqjotza+

Rozwiązywanie go (używając Arden lematu ) daje jedno wyrażenie regularne dla każdego stanu, który opisuje dokładnie te słowa, które mogą być zaakceptowane począwszy q í ; dlatego Q 0 (jeśli q 0 jest stanem początkowym) jest pożądanym wyrażeniem.QjaqjaQ0q0

Zastosowanie do danego automatu pozostawia się jako ćwiczenie; pełny przykład znajduje się w powyższym połączonym dokumencie .

Zobacz także tutaj, gdzie zamieściłem podobną odpowiedź.


1
Zobacz to pytanie odniesienia dla innych ogólnych metod.
Raphael

3

Gdyby istniał tylko łańcuch stanów bez pętli, czy wiedziałbyś, co robić?

Gdyby istniała prosta pętla bez nakładających się rozgałęzień, czy wiesz, co robić?

(Jeśli odpowiedź brzmi „nie”, najpierw pomyśl o tych przypadkach).

Pomysł polega na stopniowym przekształcaniu automatu w formę, w której można dostrzec te wzorce: łańcuchy, pętle i rozbieżne ścieżki, które zbiegają się na końcu (co prowadzi do naprzemienności). Na każdym etapie transformacji upewnij się, że przekształcony automat nadal rozpoznaje ten sam język.

Należy pamiętać, że jest to non -deterministic automatem. Ten, który opublikowałeś, jest zdeterminowany, ale nie musi tak pozostać, kiedy go przekształcisz.

q2)q1faq2)solq3)q4q2)q5q4jotq5solq3)

q3),q4,q5q3)q3)(hjotsol)

Sprawdź, które stany są ostateczne. Pomoże to nie martwić się o to na początku i utworzyć jedną dużą pętlę, a następnie powielić części, które kończą się w połowie pętli.

To niekoniecznie jest najbardziej wydajna technika lub ta, która generuje najprostsze wyrażenie regularne, ale jest prosta.


3

Podział q_1


A to odpowiada na pytanie, w jaki sposób?
Raphael

1
Jeśli przepisujesz maszynę stanu w ten sposób, odczytywanie równoważnego wyrażenia regularnego jest teraz banalne.
Jukka Suomela

1
Może powinieneś to uwzględnić w tekście odpowiedzi. Czy to zawsze działa?
Raphael

@Raphael: Działa w tym przypadku. :) Ogólna idea tej sztuczki jest następująca: stworzyliśmy cykle „odpowiednio zagnieżdżone”. Oznacza to, że nie mamy struktury cyklu, [(])ale [()].
Jukka Suomela
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.