Języki formalne i automaty Ćwiczenia 7 Autor: Marcin Orchel Spis treści Spis treści... 1 Wstęp teoretyczny... 2 Automaty... 2 Cechy automatów... 4 Łączenie automatów... 4 Konwersja automatu do wyrażenia regularnego... 5 Konwersja wyrażenia regularnego do automatu... 6 Bibliografia... 7 Zadania... 9 Zadania na 3.0... 9 Zadania na 4.0... 9 Zadania na 5.0... 9
Wstęp teoretyczny Automaty Automaty to jeden ze sposobów reprezentacji języka formalnego. Automat składa się z: zbioru stanów Q, alfabetu Σ, δ funkcja tranzycji : q 0 stan startowy, q 0 ϵq δ:q Σ Q F zbiór stanów zawarty w Q, zwanych stanami akceptującymi W przypadku, gdy Q jest skończony, automat nazywa się automatem skończonym. Zbiór wszystkich rozpoznawanych języków przez automat skończony jest dokładnie zbiorem języków generowanych przez gramatyki regularne. Deterministyczny automat skończony (DFA) to taki automat skończony, że dla każdej pary (stan, symbol wejściowy) jest co najwyżej jedna tranzycja. Deterministyczny, zupełny automat skończony (DFA) to taki automat skończony, że dla każdej pary (stan, symbol wejściowy) jest dokładnie jedna tranzycja. Niedeterministyczny automat skończony (NFA) to taki automat skończony, że dla pewnej pary (stan, symbol wejściowy) jest więcej niż jedna tranzycja. Niedeterministyczny automat skończony z ε-tranzycjami (NFA-ε) to niedeterministyczny automat skończony albo automat skończony zawierający co najmniej jedną ε-tranzycję, czyli taką przez którą przechodzimy nie pobierając symbolu z wejścia. Można pokazać, że DFA i NFA są równoważne, to znaczy dla każdego automatu DFA, można skontruować automat NFA i odwrotnie. A więc zarówno automaty NFA jak i DFA rozpoznają języki regularne. Można również wykazać, że NFA-ε jest równoważny DFA i NFA. Sposób sprawdzania czy dane słowo należy do języka generowanego przez automat:
W podanym automacie DFA przykładowo mamy do sprawdzenia słowo aab. Zaczynamy od stanu q0. Bierzemy z bufora wejściowego pierwszy symbol, czyli a, przechodzimy do stanu q1. Później bierzemy kolejny symbol, również a. Przechodzimy ze stanu q1 do stanu q0. Następnie bierzemy symbol b, i pozostajemy w stanie q0. Wyczerpaliśmy wszystkie symbole z wejścia, i jesteśmy ostatecznie w stanie q0. Stan q0 jest stanem akceptującym, a więc słowo należy do tego języka. Można zauważyć, że podany automat akceptuje wszystkie słowa o parzystej liczbie symboli a. Jeśli skończymy sprawdzanie na stanie, który nie jest akceptujący to słowo nie należy do języka. Jeśli na pewnym etapie nie będzie istniała tranzycja dla kolejnego symbolu z wejścia to słowo również nie należy do języka. Podczas sprawdzania słowa można przechodzić przez stan akceptujący, słowo jest akceptowane jedynie, gdy automat jest w stanie akceptującym po przeczytaniu całego słowa. Przykład niedeterministycznego automatu skończonego z ε-tranzycjami: Powyższy automat akceptuje wszystkie słowa, które zawierają parzystą liczbę symboli a lub parzystą liczbę symboli b. Ze stanu q0 możemy przejść zarówno do stanu q1 jak i q3. Przykład konstrukcji automatu z podanego języka formalnego w postaci zbiorowej. L={a m b n :m 0,n>0,n jest nieparzyste }
Cechy automatów Często automaty wykorzystuje się do modelowania różnych procesów, a w szczególności wykorzystuje się następujące koncepcje: 1. Podział procesu na stany, w których może się on znajdować. 2. Zdefiniowanie informacji, która powoduje odpalenie tranzycji i wyznaczenie nowego stanu. Nowy stan jest wyznaczany na podstawie aktualnego stanu i otrzymanej informacji. 3. Proces znajduje się na początku w zdefiniowanym stanie początkowym. Łączenie automatów Jeśli mamy dane dwa automaty i chcemy stworzyć język, który jest unią zbioru słów generowanych przez obydwa automaty, możemy to zrobić tworząc nowy stan, który będzie stanem startowym i prowadząc ε-tranzycje do poprzednich stanów startowych poszczególnych automatów. Przykładowo mamy dane dwa automaty: oraz Po ich połączeniu otrzymamy automat:
Konwersja automatu do wyrażenia regularnego Mamy dany automat: W pierwszym kroku należy sprawdzić czy automat posiada jeden stan końcowy, jeśli posiada ich więcej to należy utworzyć nowy stan końcowy i poprowadzić do niego ε-tranzycje ze stanów końcowych. Ponadto stosujemy zapis łączący tranzycje ze sobą, np. jeśli mamy tranzycje a i b od danego stanu do innego tego samego dla obu tranzycji to obydwie tranzycje zastępujemy jedną o nazwie a+b. Zapis a+b jest równoważny zapisowi a b. W rozważanym przykładzie będzie jedno takie zastąpienie: Następnie należy usunąć wszystkie stany, które nie są stanem początkowym i stanami końcowymi. Podczas usuwania tych stanów należy zmodyfikować zbiór tranzycji nie dochodzących do usuwanych stanów, tak aby realizowały wszystkie ścieżki przechodzące przez usuwany stan. Nowe tranzycje mogą zawierać zamiast pojedynczych symboli słowa wraz ze znakami specjalnymi + oraz *. W tym przykładzie usuwamy stan q2. Po tej operacji otrzymujemy:
Na podstawie tego automatu odczytujemy ostatecznie wyrażenie regularne. Zaczynamy od stanu q0, stosując tranzycję do stanu q0 otrzymujemy wyrażenie regularne a*. Następnie stosujemy tranzycję do stanu q1 i otrzymujemy: a*b. Następnie stosujemy tranzycję do stanu q0: a*b(a+b+(a+b)a). Dotychczasowe postępowanie możemy powtórzyć wiele razy i otrzymujemy (a*b(a+b+(a+b)a))*. Następnie stosujemy tranzycję ze stanu q0 do stanu q0 i otrzymujemy: (a*b(a+b+(a+b)a))*a*. Na końcu przechodzimy do stanu q1. Ostatecznie wyrażenie regularne jest postaci: (a*b(a+b+ (a+b)a))*a*b. Konwersja wyrażenia regularnego do automatu Przykładowo mamy dane wyrażenie regularne: a*b(a+b). Najpierw tworzony jest automat, gdzie jest jedna tranzycja o nazwie będącej tym wyrażeniem: Następnie rozbijamy tę tranzycję biorąc pod uwagę wszystkie konkatenacje. Powstaną 3 nowe tranzycje odpowiadające a*, b oraz a+b. Tworzymy stan początkowy i końcowy i łańcuch pomiędzy nowymi tranzycjami:
Następnie rozbijamy wyrażenie a* oraz wyrażenie a+b: Bibliografia 1. [Online] http://en.wikipedia.org/wiki/automata_theory. 2. [Online] http://www.jflap.org/tutorial/fa/createfa/fa.html. 3. [Online] http://en.wikipedia.org/wiki/automata-based_programming.
Zadania Zadania na 3.0 Zadanie 10.3 ze strony http://kompilatory.agh.edu.pl/pages/ta-zadania/%20zadania10-automatyskonczone.htm. Zadanie 1.1 ze strony http://kompilatory.agh.edu.pl/pages/tk-zadania/%20zadania01-wyrazeniaregularne-automaty-skonczone.htm. Zadania na 4.0 Zamodelować za pomocą diagramu stanów UML przesyłkę towaru pocztą. Zadania na 5.0 Napisać w Javie program, który implementuje za pomocą automatu proces przesyłki towaru.