Języki formalne i automaty Ćwiczenia 9 Autor: Marcin Orchel Spis treści Spis treści... 1 Wstęp teoretyczny... 2 Maszyna Mealy'ego... 2 Maszyna Moore'a... 2 Automat ze stosem... 3 Konwersja gramatyki bezkontekstowej do niedeterministycznego automatu ze stosem za pomocą algorytmu LL.... 5 Konwersja gramatyki bezkontekstowej do niedeterministycznego automatu ze stosem za pomocą algorytmu LR.... 6 Konwersja niedeterministycznego automatu ze stosem do gramatyki bezkontekstowej... 7 Maszyna Turinga... 8 Maszyna Turinga z wieloma taśmami... 9 Zadania... 11 Zadania na 3.0... 11 Zadania na 4.0... 11 Zadania na 5.0... 11
Wstęp teoretyczny Maszyna Mealy'ego Maszyna Mealy'ego składa się z: skończonej liczby stanów Q skończonego alfabetu wejściowego Σ, skończonego alfabetu wyjściowego Γ, δ funkcja tranzycji : δ : Q Q ω funkcja wyjściowa ω : Q Γ q 0 stan startowy, q0 Q Różnice między maszyną Mealy'ego a automatem skończonym: nie ma stanów końcowych tranzycje produkują wyjście za pomocą funkcji wyjściowej nie akceptuje ani nie odrzuca słowa wejściowego, zamiast tego generuje słowo wyjściowe nie może mieć stanów niedeterministycznych Przykład maszyny Mealy'ego zamieniającej w słowie binarnym jedynki na zera i odwrotnie. Przykładowo dla wejścia 0110 zostanie wyprodukowane wyjście 1001. Maszyna Moore'a Maszyna Moore'a składa się z: skończonej liczby stanów Q skończonego alfabetu wejściowego Σ,
skończonego alfabetu wyjściowego Γ, δ funkcja tranzycji : δ : Q Q ω funkcja wyjściowa ω : Q Γ q 0 stan startowy, q0 Q Różnice między maszyną Mealy'ego i Moore'a. W maszynie Moore'a funkcja wyjściowa zdefiniowana jest dla stanów a nie dla tranzycji. Różnice między maszyną Moore'a a automatem skończonym: nie ma stanów końcowych stany produkują wyjście za pomocą funkcji wyjściowej nie akceptuje ani nie odrzuca słowa wejściowego, zamiast tego generuje słowo wyjściowe nie może mieć stanów niedeterministycznych Przykład maszyny Moore'a zamieniającej w słowie binarnym jedynki na zera i odwrotnie. Przykładowo dla wejścia 0110 zostanie wyprodukowane wyjście 1001. W tym celu przechodzimy od stanu q0 do stanu q2, następnie do stanu q1, jeszcze raz do stanu q1, i do stanu q2. Automat ze stosem Niedeterministyczny automat ze stosem składa się z: skończonej liczby stanów Q skończonego alfabetu wejściowego Σ, skończonego alfabetu stosowego Γ, δ funkcja tranzycji :
δ : Q Γ skonczone podzbiory Q Γ q 0 stan startowy, q0 Q Z - symbol startowy stosu F zbiór stanów zawarty w Q, zwanych stanami akceptującymi Deterministyczny automat ze stosem różni się tylko tym, że dla danego stanu i symbolu wejściowego istnieje co najwyżej jedna tranzycja oraz wejście nie może być puste. W stanie akceptującym aby zaakceptować dane słowo musi być spełniony dodatkowy warunek, aby stos był pusty lub na stosie znajdował się tylko symbol startowy stosu Z. Przykład. Skonstruujemy deterministyczny automat ze stosem dla języka n n { a b : > 0} L = n Automat będzie kładł na stos symbol a dla każdego a na wejściu, i będzie pobierał ze stosu a dla każdego b na wejściu. Tym sposobem po przeczytaniu słowa tego języka stos będzie zawierał tylko symbol startowy stosu Z. Każda tranzycja posiada 3 wartości. Pierwsza wartość to czytany symbol wejściowy. Druga wartość to słowo, które jest zdejmowane ze stosu. Trzecia wartość to słowo które kładziemy na stos. W stanie q0 na stosie znajduje się tylko symbol startowy stosu Z. Przejście do stanu q1 po przeczytaniu a oznacza zdjęcie ze stosu Z i położenie na stos az. Jest to w zasadzie w tym wypadku to samo co dołożenie na stos a, ale znajduje się tutaj dodatkowa informacja, że na górze stosu musi być Z. Przejście od stanu q1 do q1 po przeczytaniu a oznacza zdjęcie ze stosu a i położenie na stosie aa. Przejście od stanu q1 do stanu q2 po przeczytaniu b oznacza zdjęcie ze stosu a bez dokładania. Przejście ze stanu q2 do stanu q2 oznacza również zdjęcie ze stosu a bez dokładania. Przejście ze stanu q2 do stanu q3 następuje po zdjęciu ze stosu symbol startowego Z i położeniu na stosie tego symbolu. Przejście to nie zmienia stosu, ale zapewnia, że wykonamy to przejście tylko wtedy, gdy na stosie na samej górze będzie znajdował się symbol startowy stosu Z. Gdy dla czytanego symbolu z wejścia oraz aktualnego stosu nie istnieje żadna tranzycja to słowo to nie należy do tego języka. Dla słowa aaabbb otrzymujemy następujące przejścia: q0 q1, stos: az q1 q1, stos: aaz q1 q1, stos: aaaz
q1 q2, stos: aaz q2 q2, stos: az q2 q2, stos: Z q2 q3, stos: Z q3 jest stanem końcowym a więc dane słowo należy do tego języka. Inny przykład automatu ze stosem. Automat ten akceptuje tylko słowo aaa. Konwersja gramatyki bezkontekstowej do niedeterministycznego automatu ze stosem za pomocą algorytmu LL. Mamy daną gramatykę bezkontekstową: S aabb A aac A ε B bb B c Przy parsowaniu LL używany jest stos co było pokazane na zajęciach omawiających algorytm LL. Parsowanie LL składa się z dwóch operacji: ściąganie ze stosu terminala, który odpowiada przeczytanemu terminalowi ze słowa wejściowego, oraz zastępowanie nieterminala, który znajduje się na wierzchołku stosu odpowiednią prawą stroną produkcji. Na samym początku na stos kładziemy symbol startowy gramatyki S. Automat z umieszczaniem na stosie symbolu startowego gramatyki, operacją ściągania ze stosu terminali po przeczytaniu wejścia, oraz akceptacją słowa, gdy na stosie pozostanie symbol początkowy automatu Z wygląda następująco: Pozostało dodać do automatu operację zastępowania nieteterminali:
Konwersja gramatyki bezkontekstowej do niedeterministycznego automatu ze stosem za pomocą algorytmu LR. Mamy daną gramatykę bezkontekstową: S aabb A aac A ε B bb B c Przy parsowaniu LR również używany jest stos co było pokazane na zajęciach omawiających algorytm LR. Parsowanie LR składa się z dwóch operacji: umieszczanie terminala na stosie przeczytanego ze słowa wejściowego oraz redukcja na stosie. Na samym końcu otrzymujemy symbol startowy gramatyki S. Automat z operacją umieszczania terminala na stosie przeczytanego z wejścia, oraz z usuwaniem symbolu startowego gramatyki S na samym końcu wygląda następująco: Pozostało dodać do automatu operację redukcji:
Konwersja niedeterministycznego automatu ze stosem do gramatyki bezkontekstowej Mamy dany automat ze stosem: Algorytm konwersji wymaga aby każda tranzycja zdejmowała dokładnie 1 symbol ze stosu i kładła 0 lub 2 symbole. Może być tylko jeden stan końcowy i każda tranzycja dochodząca do stanu końcowego musi zdejmować ze stosu symbol Z. Każda tranzycja będzie zamieniona na listę produkcji. Na początku zamieńmy wszystkie tranzycje, które nie dokładają nic do stosu, a więc 4 ostatnie tranzycje w naszym przykładzie: (q1aq2) b (q2aq2) b (q2zq2) b (q2zq3) ε Po lewej stronie mamy stan, symbol, który zdejmujemy ze stosu, stan do którego dochodzimy. A po prawej stronie produkcji mamy symbol wejściowy. Ostatecznie po uproszczeniu lista produkcji będzie następująca: (q0zq3) a(q1aq2)(q2zq3) (q1aq2) a(q1aq2)(q2aq2) (q2aq2) b
(q1aq2) b (q2zq3) ε Maszyna Turinga Maszyna Turinga składa się z: zbioru stanów wewnętrznych Q alfabetu wejściowego Σ, skończonego zbioru symboli w alfabecie taśmowym Γ, δ funkcja tranzycji : q 0 stan startowy, q0 Q symbol pusty δ : { L, S R} n Q Γ n podzbior Q Γ n, F zbiór stanów zawarty w Q, zwanych stanami akceptującymi n oznacza liczbę taśm Skonstruujmy przykładowo maszynę Turinga z jedną taśmą dla języka gdzie n 0. L = n n n { a b c } Maszyna Turinga dla tego języka wygląda następująco:
Każda tranzycja składa się z trzech wartości: pierwsza wartość oznacza aktualną wartość pod głowicą maszyny Turinga. Druga wartość oznacza wartość, która zastąpi tą pierwszą na taśmie. Rozmiar wartości w tych dwóch polach wynosi jeden zgodnie z definicją maszyny Turinga. Trzecia wartość mówi o tym, gdzie przesunie się głowica na taśmie po zamianie. R oznacza przesuń o jeden kwadrat do przodu, L przesuń o jeden kwadrat do tył, S - pozostań w tym samym miejscu. Algorytm podany w przykładzie polega na zamianie w każdym kroku po jednym symbolu a,b,c odpowiednio na x,y,z. Jeśli taka zamiana nie jest możliwa oznacza to różną ilość symboli a, b i c. Wyprowadzenie dla słowa abc. Na początku na taśmie zapisane jest słowo abc, głowica wskazuje na symbol a. Zawsze pogrubiony będzie symbol na taśmie na który wskazuje aktualnie głowica. W pierwszym kroku przechodzimy ze stanu q0 do stanu q1. 1. q0, abc 2. q1, xbc 3. q2, xyc 4. q3, xyz 5. q3, xyz 6. q0, xyz 7. q4, xyz 8. q4, xyz 9. q5, xyz 10. q5, xyz 11. q5, xyz 12. q5, xyz 13. q6, xyz Jesteśmy w stanie końcowym q6, a więc dane słowo należy do języka. Maszyna Turinga z wieloma taśmami W maszynie Turinga z wieloma taśmami tranzycje składają się z kilku części, każda część odpowiada jednej taśmie. Części tranzycji zbudowane są tak samo jak tranzycje w maszynie Turinga z jedną taśmą. Odpalenie tranzycji polega na tym, że rozpatrywane są równocześnie wszystkie taśmy. Reprezentacja języka z poprzedniego przykładu dla maszyny Turinga z trzema taśmami wygląda następująco:
Algorytm polega na zapisaniu symboli a na drugą taśmę, symboli b na trzecią taśmę, a następnie poprzez równoczesne przechodzenie przez wszystkie taśmy sprawdzeniu czy jest ta sama liczba symboli a, b i c. Przykładowe wyprowadzenie dla słowa abc. Początkowo na pierwszej taśmie zapisane jest słowo abc, pozostałe taśmy są puste. 1. q0, abc,, 2. q0, abc, a, 3. q1, abc, a, b 4. q2, abc, a, b 5. q2, abc, a, b 6. q3, abc, a, b q3 jest stanem końcowym, a więc słowo należy do tego języka. Stan q4 jest po to aby zaakceptować słowo puste.
Zadania Zadania na 3.0 Zadanie 8.1 ze strony http://kompilatory.agh.edu.pl/pages/ta-zadania/%20zadania08-automaty-zestosem.htm. Zadania na 4.0 Następujący automat ze stosem przekonwertować na gramatykę. Zadania na 5.0 Implementacja automatu ze stosem w Javie dla przykładu 8.1 z zadania na 3.0. Zadanie dodatkowe nieobowiązkowe Implementacja w Javie automatu Mealy'ego i Moore'a dla przykładu 8.1.