TEORETYCZNE PODSTAWY INFORMATYKI: POWTÓRKA CZ. II

Podobne dokumenty
Teoretyczne podstawy informatyki

Wyrażenia regularne.

TEORETYCZNE PODSTAWY INFORMATYKI

Teoretyczne podstawy informatyki

TEORETYCZNE PODSTAWY INFORMATYKI

Teoretyczne podstawy informatyki

Opis wzorców polegający na na wykorzystaniu modelu definicji rekurencyjnych, nazywamy gramatyką bezkontekstową (ang. contex-free grammar).

Teoretyczne podstawy informatyki. Wykład 12: Gramatyki. E. Richter-Was 1

TEORETYCZNE PODSTAWY INFORMATYKI

1 Automaty niedeterministyczne

a) 7 b) 19 c) 21 d) 34

Drzewa spinające MST dla grafów ważonych Maksymalne drzewo spinające Drzewo Steinera. Wykład 6. Drzewa cz. II

Struktury danych i złożoność obliczeniowa Wykład 5. Prof. dr hab. inż. Jan Magott

Porównanie algorytmów wyszukiwania najkrótszych ścieżek międz. grafu. Daniel Golubiewski. 22 listopada Instytut Informatyki

Zofia Kruczkiewicz, Algorytmu i struktury danych, Wykład 14, 1

Grafem nazywamy strukturę G = (V, E): V zbiór węzłów lub wierzchołków, Grafy dzielimy na grafy skierowane i nieskierowane:

Metody Kompilacji Wykład 3

Języki regularne, rozpoznawanie wzorców regularnych, automaty skończone, wyrażenia regularne

AUTOMATY SKOŃCZONE. Automat skończony przedstawiamy formalnie jako uporządkowaną piątkę:

Matematyka dyskretna - 7.Drzewa

Reprezentacje grafów nieskierowanych Reprezentacje grafów skierowanych. Wykład 2. Reprezentacja komputerowa grafów

Grafowy model danych

Algorytmiczna teoria grafów

Teoretyczne podstawy informatyki

Struktury danych i złożoność obliczeniowa Wykład 7. Prof. dr hab. inż. Jan Magott

Grafy (3): drzewa. Wykłady z matematyki dyskretnej dla informatyków i teleinformatyków. UTP Bydgoszcz

Algorytmy Równoległe i Rozproszone Część V - Model PRAM II

Matematyczne Podstawy Informatyki

MATEMATYKA DYSKRETNA - MATERIAŁY DO WYKŁADU GRAFY

Graf. Definicja marca / 1

Matematyczne Podstawy Informatyki

Algorytmy i str ruktury danych. Metody algorytmiczne. Bartman Jacek

Algorytmy grafowe. Wykład 1 Podstawy teorii grafów Reprezentacje grafów. Tomasz Tyksiński CDV

Obliczenia inspirowane Naturą

Języki formalne i automaty Ćwiczenia 9

Matematyka dyskretna

Drzewa. Jeżeli graf G jest lasem, który ma n wierzchołków i k składowych, to G ma n k krawędzi. Własności drzew

Imię, nazwisko, nr indeksu

Języki formalne i automaty Ćwiczenia 7

Maszyna Turinga języki

Teoretyczne podstawy informatyki

Przykłady grafów. Graf prosty, to graf bez pętli i bez krawędzi wielokrotnych.

Teoretyczne podstawy informatyki. Repetytorium: Algorytmy Modele danych Automaty, wyrażenia regularne, gramatyki. Prof. dr hab. Elżbieta Richter-Wąs 1

Ogólne wiadomości o grafach

Algorytmy grafowe. Wykład 2 Przeszukiwanie grafów. Tomasz Tyksiński CDV

Matematyczne Podstawy Informatyki

Złożoność obliczeniowa klasycznych problemów grafowych

KATEDRA INFORMATYKI TECHNICZNEJ. Ćwiczenia laboratoryjne z Logiki Układów Cyfrowych. ćwiczenie 204

Minimalne drzewa rozpinające

Matematyczne Podstawy Informatyki

Sortowanie topologiczne skierowanych grafów acyklicznych

G. Wybrane elementy teorii grafów

ZADANIA Z AUTOMATU SKOŃCZONEGO SPRAWOZDANIE NR 4

Wstęp do programowania. Drzewa. Piotr Chrząstowski-Wachtel

Teoretyczne podstawy informatyki. Repetytorium: Algorytmy Modele danych Automaty, wyrażenia regularne, gramatyki. Prof. dr hab. Elżbieta Richter-Wąs 1

7. Teoria drzew - spinanie i przeszukiwanie

EGZAMIN - Wersja A. ALGORYTMY I STRUKTURY DANYCH Lisek89 opracowanie kartki od Pani dr E. Koszelew

Indukowane Reguły Decyzyjne I. Wykład 3

Złożoność obliczeniowa zadania, zestaw 2

Przykład: Σ = {0, 1} Σ - zbiór wszystkich skończonych ciagów binarnych. L 1 = {0, 00, 000,...,1, 11, 111,... } L 2 = {01, 1010, 001, 11}

złożony ze słów zerojedynkowych o długości co najmniej 3, w których druga i trzecia litera od końca sa

Efektywna analiza składniowa GBK

Gramatyki grafowe. Dla v V, ϕ(v) etykieta v. Klasa grafów nad Σ - G Σ.

Egzamin, AISDI, I termin, 18 czerwca 2015 r.

Matematyczne Podstawy Informatyki

WYŻSZA SZKOŁA INFORMATYKI STOSOWANEJ I ZARZĄDZANIA

Metody Kompilacji Wykład 1 Wstęp

10110 =

Hierarchia Chomsky ego Maszyna Turinga

Analiza semantyczna. Gramatyka atrybutywna

WYŻSZA SZKOŁA INFORMATYKI STOSOWANEJ I ZARZĄDZANIA

Zadanie 1. Czy prawdziwa jest następująca implikacja? Jeśli L A jest językiem regularnym, to regularnym językiem jest też. A = (A, Q, q I, F, δ)

Poprawność semantyczna

Digraf. 13 maja 2017

Wstęp do programowania

Teoretyczne podstawy informatyki

Analiza leksykalna 1. Teoria kompilacji. Dr inż. Janusz Majewski Katedra Informatyki

Podstawowe pojęcia dotyczące drzew Podstawowe pojęcia dotyczące grafów Przykłady drzew i grafów

Matematyczne Podstawy Informatyki

Wykład 8. Drzewo rozpinające (minimum spanning tree)

Suma dwóch grafów. Zespolenie dwóch grafów

Wykłady z Matematyki Dyskretnej

Kolorowanie wierzchołków Kolorowanie krawędzi Kolorowanie regionów i map. Wykład 8. Kolorowanie

Algorytmy i struktury danych. Drzewa: BST, kopce. Letnie Warsztaty Matematyczno-Informatyczne

Podstawowe własności grafów. Wykład 3. Własności grafów

Matematyka dyskretna. Andrzej Łachwa, UJ, B/14

Minimalizacja automatów niedeterministycznych na słowach skończonych i nieskończonych

Badania operacyjne: Wykład Zastosowanie kolorowania grafów w planowaniu produkcji typu no-idle

Marek Miszczyński KBO UŁ. Wybrane elementy teorii grafów 1

Dopełnienie to można wyrazić w następujący sposób:

Teoria grafów podstawy. Materiały pomocnicze do wykładu. wykładowca: dr Magdalena Kacprzak

Algorytmy i Struktury Danych.

prowadzący dr ADRIAN HORZYK /~horzyk tel.: Konsultacje paw. D-13/325

Teoretyczne podstawy informatyki

Digraf o V wierzchołkach posiada V 2 krawędzi, zatem liczba różnych digrafów o V wierzchołkach wynosi 2 VxV

Języki formalne i automaty Ćwiczenia 2

Teoretyczne podstawy informatyki

Matematyka dyskretna. Andrzej Łachwa, UJ, /14

E: Rekonstrukcja ewolucji. Algorytmy filogenetyczne

Transkrypt:

1 TEORETYCZNE PODSTAWY INFORMATYKI: POWTÓRKA CZ. II 27/01/2014 WFAiS UJ, Informatyka Stosowana I rok studiów, I stopień

Wykład 8 2 Modele danych: grafy Podstawowe pojęcia Grafy wywołań Grafy skierowane i nieskierowane Grafy planarne, kolorowanie grafów Inplementacja grafów Listy sąsiedztwa Macierze sąsiedztwa Składowe spójne, algorytm Kruskala Sortowanie topologiczne Najkrótsze drogi: algorytm Dikstry i Floyda-Warshalla 25/11/2013

Graf 3 Graf to jest relacja binarna. Dla grafów mamy ogromne możliwości wizualizacji jako zbiór punktów (zwanych wierzchołkami) połączonych liniami lub strzałkami (nazwanych krawędziami). Pod tym względem graf stanowi uogólnienie drzewiastego modelu danych. Podobnie jak drzewa, grafy występują w różnych postaciach: grafów skierowanych i nieskierowanych lub etykietowanych i niezaetykietowanych. Grafy są przydatne do analizy szerokiego zakresu problemów: obliczanie odległości, znajdowanie cykliczności w relacjach, reprezentacji struktury programów, reprezentacji relacji binarnych, reprezentacji automatów i układów elektronicznych. Teoria grafów jest dziedziną matematyki zajmującą się właściwościami grafów. 25/11/2013

Implementacje grafów 4 Istnieją dwie standardowe metody reprezentacji grafów. Pierwsza z nich, listy sąsiedztwa (ang. adjacency lists), jest, ogólnie rzecz biorąc, podobna do implementacji relacji binarnych. Druga, macierze sąsiedztwa (ang. adjacency matrices), to nowy sposób reprezentowania relacji binarnych, który jest bardziej odpowiedni dla relacji, w przypadku którym liczba istniejących par stanowi znaczącą część całkowitej liczby par, jakie mogłyby teoretycznie istnieć w danej dziedzinie. 25/11/2013

Listy sąsiedztwa 5 Listy sąsiedztwa zostały posortowane wg. kolejności, ale następniki mogą występować w dowolnej kolejności na odpowiedniej liście sąsiedztwa. 0 1 2 3 4 0 1 2 3 4 0 1 2 3 0 1 4 2 4 1 25/11/2013

Macierz sąsiedztwa 6 Tworzymy dwuwymiarową tablicę; BOOLEAN vertices[max][max]; w której element vertices[u][v] ma wartość TRUE wówczas, gdy istnieje krawędź (u, v), zaś FALSE, w przeciwnym przypadku. 0 1 2 4 3 0 1 2 3 4 0 1 1 1 0 0 1 0 0 0 1 0 2 1 1 0 0 1 3 0 0 1 0 1 4 0 1 0 0 0 25/11/2013

7 Składowa spójna grafu nieskierowanego Każdy graf nieskierowany można podzielić na jedna lub większą liczbę spójnych składowych (ang. connected components). Każda spójna składowa to taki zbiór wierzchołków, że dla każdych dwóch z tych wierzchołków istnieje łącząca je ścieżka. Jeżeli graf składa się z jednej spójnej składowej to mówimy że jest spójny (ang. connected). A 22 60 B 16 D To jest graf spójny C 10 25/11/2013

8 Algorytm wyznaczania spójnych składowych Przeprowadzamy rozumowanie indukcyjne. Podstawa: Graf G o zawiera jedynie wierzchołki grafu G i żadnej jego krawędzi. Każdy wierzchołek stanowi odrębną spójną składową. Indukcja: Zakładamy, że znamy już spójne składowe grafu G i po rozpatrzeniu pierwszych i krawędzi, a obecnie rozpatrujemy (i+1) krawędź {u, v}. jeżeli wierzchołki u, v należą do jednej spójnej składowej to nic się nie zmienia jeżeli do dwóch różnych, to łączymy te dwie spójne składowe w jedną. u x v y 25/11/2013

Minimalne drzewa rozpinające 9 Drzewo rozpinające (ang. spanning tree) grafu nieskierowanego G stanowi zbiór wierzchołków tego grafu wraz z podzbiorem jego krawędzi, takich że: łączą one wszystkie wierzchołki, czyli istnieje droga miedzy dwoma dowolnymi wierzchołkami która składa się tylko z krawędzi drzewa rozpinającego. tworzą one drzewo nie posiadające korzenia, nieuporządkowane. Oznacza to że nie istnieją żadne (proste) cykle. Jeśli graf G stanowi pojedynczą spójną składową to drzewo rozpinające zawsze istnieje. Minimalne drzewo rozpinające (ang. minimal spanning tree) to drzewo rozpinające, w którym suma etykiet jego krawędzi jest najmniejsza ze wszystkich możliwych do utworzenia drzew rozpinających tego grafu. 25/11/2013

Minimalne drzewa rozpinające 10 A A 28 24 28 C 15 B D C B D 20 12 11 20 12 11 E 13 F E 13 F Graf nieskierowany Drzewo rozpinające 25/11/2013

Algorytm Kruskala 11 Istnieje wiele algorytmów do znajdowania minimalnego drzewa rozpinającego. Jeden z nich to algorytm Kruskala, który stanowi proste rozszerzenie algorytmu znajdowania spójnych składowych. Wymagane zmiany to: należy rozpatrywać krawędzie w kolejności zgodnej z rosnącą wartością ich etykiet, należy dołączyć krawędź do drzewa rozpinającego tylko w takim wypadku gdy jej końce należą do dwóch różnych spójnych składowych. 25/11/2013

Algorytm Kruskala 12 C 20 15 28 B 12 E A 13 24 D 11 F C 15 (4) A 24 (5) B D 12 (2) 11 (1) E 13 (3) F Graf nieskierowany Minimalne drzewo rozpinające (w nawiasach podano kolejność dodawanych krawędzi) 25/11/2013

Algorytm Kruskala 13 Algorytm Kruskala jest dobrym przykładem algorytmu zachłannego (ang. greedy algorithm), w przypadku którego podejmowany jest szereg decyzji, z których każdą stanowi wybranie opcji najlepszej w danym momencie. Lokalnie podejmowane decyzje polegają w tym przypadku na wyborze krawędzi dodawanej do formowanego drzewa rozpinającego. Za każdym razem wybierana jest krawędź o najmniejsze wartości etykiety, która nie narusza definicji drzewa rozpinającego, zabraniającej utworzenia cyklu. Dla algorytmu Kruskala można wykazać, ze jego rezultat jest optymalny globalnie, to znaczy że daje on w wyniku drzewo rozpinające o minimalnej wadze. Czas wykonania algorytmu jest O(m log m) gdzie m to jest większa z wartości liczby wierzchołków i liczby krawędzi. 25/11/2013

Algorytm przeszukiwania w głąb 14 Jest to podstawowa metoda badania grafów skierowanych. Bardzo podobna do stosowanych dla drzew, w których startuje się od korzenia i rekurencyjnie bada wierzchołki potomne każdego odwiedzonego wierzchołka. Trudność polega na tym ze w grafie mogą pojawiać się cykle Należy wobec tego znaczyć wierzchołki już odwiedzone i nie wracać więcej do takich wierzchołków. Z uwagi na fakt, że w celu uniknięcia dwukrotnego odwiedzenia tego samego wierzchołka jest on odpowiednio oznaczany, graf w trakcie jego badania zachowuje się podobnie do drzewa. W rzeczywistości można narysować drzewo, którego krawędzie rodzic-potomek będą niektórymi krawędziami przeszukiwanego grafu G. Takie drzewo nosi nazwę drzewa przeszukiwania w głąb (ang. depth-first-search) dla danego grafu. 25/11/2013

Algorytm przeszukiwania w głąb 15 a b d c e f Graf skierowany Jedno z możliwych drzew przeszukiwania Las przeszukiwania: dwa drzewa o korzeniach a, d b a d c e f b a d c e f Las przeszukiwania w głąb. 25/11/2013

Drzewo przeszukiwania w głąb 16 5 a 6 krawędź wsteczna b d 4 1 c e f 2 3 Po (podczas) konstruowaniu drzewa przeszukiwania w głąb można ponumerować jego wierzchołki w kolejności wstecznej (ang. post-order). 25/11/2013

Znajdowanie spójnych składowych 17 Do znajdowania spójnych składowych możemy użyć algorytmu poszukiwania w głąb. Traktujemy graf nieskierowany jako graf skierowany, w którym każda krawędź nieskierowana została zastąpiona dwiema krawędziami skierowanymi wiodącymi w obu kierunkach. Do reprezentacji grafu używamy list sąsiedztwa. Tworzymy las przeszukiwania w głąb grafu skierowanego. Każde drzewo w tym lesie odpowiada jednej składowej spójności grafu nieskierowanego. Czas wykonania algorytmu O(m) przy użyciu struktury drzewiastej czas wykonania wynosi O(m log n). 25/11/2013

Algorytm Dikstry 18 Szukamy najkrótszej drogi pomiędzy dwoma wierzchołkami Rozpatrujemy graf G (skierowany lub nieskierowany), w którym wszystkie krawędzie zaetykietowano wartościami reprezentującymi ich długości. Długość (ang. distance) danej drogi stanowi wartość sumy etykiet związanych z nią krawędzi. Minimalna odległość z wierzchołka u do wierzchołka v to minimalna długość którejś z dróg od u do v. 25/11/2013

Algorytm Dikstry 19 Traktujemy wierzchołek s jako wierzchołek źródłowy. Na etapie pośrednim wykonywania algorytmu w grafie G istnieją tzw. wierzchołki ustalone (ang. settled), tzn. takie dla których znane są odległości minimalne. W szczególności zbiór takich wierzchołków zawiera również wierzchołek s. Dla nieustalonego wierzchołka v należy zapamiętać długość najkrótszej drogi specjalnej (ang. special path) czyli takiej która rozpoczyna się w wierzchołku źródłowym, wiedzie przez ustalone wierzchołki, i na ostatnim etapie przechodzi z obszaru ustalonego do wierzchołka v. s Graf G v droga specjalna 25/11/2013

20 Algorytmy znajdowania najkrótszych dróg Jeśli potrzebne jest poznanie minimalnych odległości miedzy wszystkimi parami wierzchołków w grafie o n wierzchołkach, które posiadają etykiety o wartościach nieujemnych, można uruchomić algorytm Dijkstry dla każdego z n wierzchołków jako wierzchołka źródłowego. Czas wykonania algorytmu Dijkstry wynosi O(m log n ), gdzie m oznacza większą wartość z liczby wierzchołków i liczby krawędzi. Znalezienie w ten sposób minimalnych odległości miedzy wszystkimi parami wierzchołków zajmuje czas rzędu O(m n log n). Jeśli m jest bliskie swojej maksymalnej wartości m n 2 to można skorzystać z implementacji algorytmu Dijkstry który działa w czasie O(n 2 ). Wykonanie go n razy daje czas rzędu O(n 3 ). 25/11/2013

Algorytm Floyda-Warshalla 21 Podstawa algorytmu jest działanie polegające na rozpatrywaniu po kolei każdego wierzchołka grafu jako elementu centralnego (ang. pivot). Kiedy wierzchołek u jest elementem centralnym, staramy się wykorzystać fakt, że u jest wierzchołkiem pośrednim między wszystkimi parami wierzchołków. Dla każdej pary wierzchołków, na przykład v i w, jeśli suma etykiet krawędzi (v, u) oraz (u, w) (na rysunku d+e), jest mniejsza od bieżąco rozpatrywanej etykiety f krawędzi wiodącej od v do w, to wartość f jest zastępowana wartością d+e. 0 1 v d u f e 0 1 w n-1 n-1 25/11/2013

Podsumowanie 22 PROBLEM ALGORYTM(Y) CZAS WYKONANIA Minimalne drzewo rozpinające Algorytm Kruskala O(m log n) Znajdowanie cykli Przeszukiwanie w głąb O(m) Uporządkowanie topologiczne Przeszukiwanie w głąb O(m) Osiągalność w przypadku Przeszukiwanie w głąb O(m) pojedynczego źródła Spójne składowe Przeszukiwanie w głąb O(m) Najkrótsza droga Algorytm Dijskry O(m log n) dla pojedyncz. źródła Najkrótsza droga dla Algorytm Dijskry O(m n log n) wszystkich par Algorytm Floyda O(n 3 ) 25/11/2013

Wykład 10, part I 23 Wzorce, automaty Definicja Grafy reprezentujące maszyny stanów Symulacje automatów Automaty deterministyczne Automaty niedeterministyczne Przejście do automatu deterministycznego Minimalizacja automatów 16/12/2013

Wzorce i automaty 24 Problematyka wzorców stanowi bardzo rozwiniętą dziedzinę wiedzy. Nosi ona nazwę teorii automatów lub teorii języków, a jej podstawowe definicje i techniki stanowią istotną część informatyki. Poznamy trzy równoważne opisy wzorców: oparty na teorii grafów, polegać będzie na wykorzystaniu ścieżek w grafie szczególnego rodzaju który nazwiemy automatem. o charakterze algebraicznym, wykorzystujący notacje wyrażeń regularnych. oparty o wykorzystanie definicji rekurencyjnych, nazwany gramatyką bezkontekstową. 16/12/2013

Automat rozpoznający ciągi liter 25 Stany programu są reprezentowane za pomocą grafu skierowanego, którego krawędzie etykietuje się zbiorami znaków. Krawędzie takie nazywa się przejściami (ang. transition). Niektóre wierzchołki są zaznaczone jako stany końcowe (ang. accepting states). Osiągnięcie takiego stanu oznacza znalezienie poszukiwanego wzorca i jego akceptację. Jeden z wierzchołków jest zawsze określany jako stan początkowy (ang. start state) stan w którym następuje rozpoczęcie procesu rozpoznawania wzorca. Wierzchołek taki oznacza się przez umieszczenie prowadzącej do niego strzałki która nie pochodzi od innego wierzchołka. Graf posiadający opisywaną postać nosi nazwę automatu skończonego (ang. finite automaton) lub po prostu automatu. L - a L - e L - i L - o L - u start 0 a 1 e 2 i 3 o 4 u 5 16/12/2013

Automat rozpoznający ciągi liter 26 Stany programu są reprezentowane za pomocą grafu skierowanego, którego krawędzie etykietuje się zbiorami znaków. Krawędzie takie nazywa się przejściami (ang. transition). Niektóre wierzchołki są zaznaczone jako stany końcowe (ang. accepting states). Osiągnięcie takiego stanu oznacza znalezienie poszukiwanego wzorca i jego akceptację. Jeden z wierzchołków jest zawsze określany jako stan początkowy (ang. start state) stan w którym następuje rozpoczęcie procesu rozpoznawania wzorca. Wierzchołek taki oznacza się przez umieszczenie prowadzącej do niego strzałki która nie pochodzi od innego wierzchołka. Graf posiadający opisywaną postać nosi nazwę automatu skończonego (ang. finite automaton) lub po prostu automatu. L - a L - e L - i L - o L - u start 0 a 1 e 2 i 3 o 4 u 5 16/12/2013

Filtr odbijający 27 Automat pobiera ciąg zer i jedynek. Celem jego jest wygładzenie ciągu przez traktowanie pojedynczego symbolu 0, który jest otoczony dwoma symbolami 1 jako szumu i zastąpienie go symbolem 1. W podobny sposób jest traktowany symbol 1 gdy jest otoczony dwoma symbolami 0 zastępujemy go symbolem 0. Stanem początkowym jest a. Stanami końcowymi (akceptującymi) są c i d. b 0 1 start a 0 1 d 1 0 c 1 Wejście Stan Wyjście a 0 0 a 0 1 b 0 0 a 0 1 b 0 1 c 1 0 d 1 1 c 1 16/12/2013

Automaty deterministyczne 28 Można z łatwością przerobić automat deterministyczny na program. Dla każdego stanu tworzy się fragment kodu. Kod stanu s bada znak wejściowy i określa, które (o ile jakiekolwiek) przejście ze stanu s powinno zostać wybrane. Jeżeli zostanie wybrane przejście ze stanu s do stanu t, to kod napisany dla stanu s musi uwzględniać przekazanie sterowania do kodu stanu t, np. przy użyciu instrukcji go to. 16/12/2013

Automaty niedeterministyczne 29 Automaty niedeterministyczne (ang. nondeterministic) mogą (ale nie muszą) posiadać dwa (lub więcej) przejścia z danego stanu zawierające ten sam symbol. Warto zauważyć, że automat deterministyczny jest równocześnie automatem niedeterministycznym, który nie posiada wielu przejść dla jednego symbolu. Automaty niedeterministyczne nie mogą być bezpośrednio implementowane za pomocą programów, ale stanowią przydatne pojęcie abstrakcyjne. 16/12/2013

Automaty niedeterministyczne 30 {, x, } s {, x, } t u W momencie podjęcia próby symulacji automatu niedeterministycznego w przypadku ciągu wejściowego składającego się ze znaków a 1,a 2,, a k może okazać się, że ten sam ciąg etykietuje wiele ścieżek. Wygodnie jest przyjąć, że automat niedeterministyczny akceptuje taki ciąg wejściowy, jeżeli co najmniej jedna z etykietowanych ścieżek prowadzi do stanu akceptującego. niedeterminizm = przypadkowość 16/12/2013

Jak zastąpić automat niedeterministyczny deterministycznym? 31 Automat niedeterministyczny zastępujemy deterministycznym przez skonstruowanie równoważnego automatu deterministycznego. Technika ta nosi nazwę konstrukcji podzbiorów (ang. subset construction). 16/12/2013

Konstrukcja automatu deterministycznego D 32 L 0 m 1 a 2 n 3 Niedeterministyczny automat rozpoznający ciąg znaków kończący się sekwencja man. Rozpoczynamy od zbioru {0}, który jest stanem początkowym automatu D. start L-m {0} m {0,1} Stan {0} i jego przejścia Dla dowolnej litery oprócz m ze stanu 0 następuje przejście do stanu 0, w przypadku m następuje przejście do stanu 0 lub 1. Automat D potrzebuje stanu {0}, który już posiada oraz stanu {0,1} który należy dodać. 16/12/2013

Automat deterministyczny D 33 L - m m m m start {0} m {0,1} a {0,2} n {0,3} L - m - a L - m - n L - m Konstrukcje automatu można uznać za skończoną. Przejścia ze stanu {0,3} nie prowadza do żadnego stanu automatu D którego jeszcze nie sprawdziliśmy. Stan {0} oznacza że odczytany ciąg nie kończy się żadnym przedrostkiem wyrazu man, stan {0,1} że kończy się sekwencją m, stan {0,2} że kończy się sekwencją ma, stan {0,3} że kończy się sekwencja man. 16/12/2013

Minimalizacja automatów 34 Jednym z zagadnień dotyczących automatów jest kwestia określenia minimalnej liczby stanów wymaganych do wykonania danego zadania. Posiadając pewien automat możemy zadać pytanie czy istnieje równoważny automat posiadający mniejszą liczbę stanów, a jeśli tak, jaka jest najmniejsza liczba stanów dowolnego automatu równoważnego. Dla automatów deterministycznych zawsze istnieje pewien unikatowy automat deterministyczny o minimalnej liczbie stanów, równoważny z danym automatem. Dowodzimy przez pokazanie że nie ma stanów nierównoważnych. Nie istnieje podobna teoria w sytuacji automatów niedeterministycznych. Nierównoważność dwóch stanów: Podstawa: Jeżeli stan s jest stanem akceptującym, a stan t nie jest stanem akceptującym (lub odwrotnie), to s i t nie są równoważne. Indukcja: Jeżeli istnieje pewien symbol wejściowy x, taki, że ze stanów s i t następują przejścia względem tego symbolu do dwóch różnych stanów, o których wiadomo że nie są równoważne, to stany s i t nie są równoważne. 16/12/2013

Wykład 10, part II 35 Wyrażenia regularne Definicja Operatory Prawa algebraiczne Od wyrażeń do automatów z e- przejściami Eliminacja e-przejść Od automatów do wyrażeń Eliminacja stanów Redukcja zupełna automatów 16/12/2013

Wyrażenia regularne 36 Wyrażenia regularne (ang. regular expressions) stanowią algebraiczny sposób definiowania wzorców. Wyrażenia regularne stanowią analogię do algebry wyrażeń arytmetycznych oraz do algebry relacyjnej. Zbiór wzorców które można wyrazić w ramach algebry wyrażeń regularnych odpowiada dokładnie zbiorowi wzorców, które można opisać za pomocą automatów. 16/12/2013

Operatory wyrażeń regularnych 37 Suma: Symbol sumy (ang. union) oznacza się za pomocą symbolu. Jeżeli R i S są dwoma wyrażeniami regularnymi, to R S oznacza sumę języków określanych przez R i S. To znaczy L(R S) = L(R) L(S). L(R) i L(S) są zbiorami ciągów znakowych, notacja sumowania jest uzasadniona. Złożenie: Operator złożenia (ang. concatenation) nie jest reprezentowany przez żaden odrębny symbol. Jeżeli R i S są wyrażeniami regularnymi to RS oznacza ich złożenie. L(RS), czyli język określony przez RS, jest tworzony z języków L(R) i L(S) w sposób następujący: Dla każdego ciągu znakowego r należącego do L(R) oraz każdego ciągu znakowego s należącego do L(S), ciąg rs, czyli złożenie ciągów r i s, należy do L(RS). Złożenie dwóch list takich jak ciągi znaków, jest wykonywane przez pobranie po kolei elementów pierwszej z nich i uzupełnienie ich po kolei elementami drugiej listy. 16/12/2013

Operatory wyrażeń regularnych 38 Domknięcie: Operator domknięcia (ang. closure), jest to operator jednoargumentowy przyrostkowy. Domknięcie oznacza się za pomocą symbolu *, tzn. R* oznacza domkniecie wyrażenia regularnego R. Operator domknięcia ma najwyższy priorytet. Efekt działania operatora domknięcia można zdefiniować jako określenie występowania zera lub większej liczby wystąpień ciągów znaków w R. 16/12/2013

Kolejność operatorów wyrażeń 39 regularnych Istnieje określona kolejność wykonywania trzech działań wyrażeń regularnych: sumy, złożenia oraz domknięcia. Kolejność ta jest następująca: 1. Domknięcie (najwyższy priorytet) 2. Złożenie 3. Suma (najniższy priorytet) Przykład: a bc*d = (a ( b (c*) ) d ) 16/12/2013

40 Od wyrażeń regularnych do automatów z epsilon przejściami Twierdzenie S(n): Jeżeli R jest wyrażeniem regularnym o n wystąpieniach operatorów i braku zmiennych jako operatorów niepodzielnych, to istnieje automat A z e-przejściami, który akceptuje ciągi znaków należące do języka L(R) i żadne inne. Ponadto automat A: posiada tylko jeden stan akceptujący, nie posiada krawędzi wiodących do jego stanu początkowego, nie posiada krawędzi wychodzących z jego stanu akceptującego. 16/12/2013

Podstawa 41 Jeżeli n=0, to R musi być operandem niepodzielnym, którym jest, e lub x dla pewnego symbolu x. Dla owych trzech przypadków można zaprojektować 2-stanowy automat, spełniający wymagania twierdzenia S(0). start start start e x Automat dla Automat dla e Automat dla x Automaty dla przypadków bazowych. Każdy spełnia warunki 1, 2, 3 (patrz poprzednia strona). 16/12/2013

Indukcja 42 Zakładamy teraz, ze S(i) jest prawdziwe dla wszystkich i n. To znaczy, że dla każdego wyrażenia regularnego R o maksymalnie n wystąpieniach istnieje automat spełniający warunek hipotezy indukcyjnej i akceptujący wszystkie ciągi znaków języka L(R) i żadnych innych. Zajmiemy się tylko najbardziej zewnętrznym operatorem w R, co oznacza, że wyrażenie R może mieć tylko formę R1 R2, R1 R2, R1* w zależności od tego czy ostatni użyty operator był operatorem sumy, złożenia lub domknięcia. Wyrażenie R1, R2 nie mogą posiadać więcej niż n operatorów. 16/12/2013

Przypadek 1: R = R1 R2 43 Przechodzimy krawędzią zaetykietowaną symbolem e do stanu początkowego automatu dla R1 lub automatu dla R2. Następnie przechodzimy do stanu akceptującego tego automatu, a później przejściem e do stanu akceptującego automatu R. e Dla R1 e e Dla R2 e 16/12/2013

Przypadek 2: R = R1 R2 44 Automat posiada jako swój stan początkowy stan początkowy automatu dla wyrażenia R1, a jako swój stan akceptujący stan akceptujący dla wyrażenia R2. Dodajemy także e - przejście ze stanu akceptującego automatu dla wyrażenia R1 do stanu początkowego automatu dla wyrażenia R2. Stan akceptujący pierwszego automatu przestaje być stanem akceptującym, a stan początkowy drugiego automatu przestaje być stanem początkowym w skonstruowanym automacie. start Dla R1 e Dla R2 16/12/2013

Przypadek 3: R = R1* 45 Do automatu dla wyrażenia R1 dodajemy nowy stan początkowy i akceptujący. Stan początkowy posiada e przejście do stanu akceptującego (a więc akceptowany jest ciąg e) oraz do stanu początkowego automatu dla wyrażenia R1. Stan akceptujący automatu dla wyrażenia R1 otrzymuje e-przejście z powrotem do swojego stanu początkowego oraz do stanu akceptującego automatu dla wyrażenia R. Stan początkowy i akceptujący automatu dla wyrażenia R1 nie są stanami początkowym i akceptującym konstruowanego automatu. Etykiety ścieżek odpowiadają ciągom należącym do języka L(R1*) czyli L(R). e start e Dla R1 e e 16/12/2013

Eliminacja epsilon-przejść 46 Jeżeli stanem bieżącym jest dowolny stan s automatu z e- przejściami, oznacza to że jednocześnie stanem bieżącym jest dowolny stan, do którego można się dostać z s w wyniku przejścia ścieżki zawierającej krawędzie zaetykietowane symbolem e. Wynika to z faktu, że bez względu na to, jaki ciąg etykietuje wybraną ścieżkę prowadzącą do s, ten sam ciąg będzie także stanowił etykietę ścieżki rozszerzonej o e-przejścia. e 1 a 2 e 0 e e b 4 5 e e 6 7 c 8 e e 9 Automat z e-przejściami dla wyrażenia a bc* e 3 16/12/2013

Eliminacja epsilon-przejść 47 e 1 a 2 e 0 e e b 4 5 e e 6 7 c 8 e e 9 Automat z e-przejściami dla wyrażenia a bc* e 3 2 a start 0 b c 5 8 c Automat skonstruowany na podstawie eliminacji e - przejść. Automat akceptuje wszystkie ciągi języka L (a bc*). 16/12/2013

Eliminajca epsilon-przejść 48 e 1 a 2 e 0 e e b 4 5 e e 6 7 c 8 e e 9 Automat z e-przejściami dla wyrażenia a bc* e 3 start 0 a b 2 5 c Prostsza wersja automatu dla języka L (a bc*). Wykorzystano obserwacje ze stany (5) i (8) są równoważne i mogą zostać połączone. 16/12/2013

Od automatów do wyrażeń regularnych 49 a b a b c 0 1 2 Ścieżka z wyrażeniami regularnymi jako etykietami. Etykieta ścieżki należy do wyrażeń regularnych utworzonych w wyniku złożeń. 16/12/2013

Konstrukcja eliminacji stanów 50 Kluczowym etapem konwersji z postaci automatu na wyrażenie regularne jest eliminacja stanów. Chcemy wyeliminować stan u, ale chcemy zachować etykiety krawędzi występujące w postaci wyrażeń regularnych, tak aby zbiór etykiet ścieżek miedzy dowolnymi pozostałymi stanami nie uległ zmianie. Poprzedniki stanu u to s 1, s 2,..., s n zaś następniki stanu u to t 1, t 2,..., t m (mogą też istnieć stany wspólne). 16/12/2013

Konstrukcja eliminacji stanów 51 Zbiór ciągów znaków etykietujących ścieżki wiodące z wierzchołków s i do wierzchołka u, włącznie z ścieżkami biegnącymi kilkakrotnie wokół pętli u u, oraz z wierzchołka u do wierzchołka t j, jest opisany za pomocą wyrażenia regularnego S i U* T j. Po eliminacji wierzchołka u należy zastąpić etykietę R ij, 51 s 1 s 2 s n S 1 S 2 S n R 11 u T 1 T m T 2 t 1 t 2 t m czyli etykietę krawędzi s i t j przez etykietę R ij Si U* T j. 16/12/2013

Konstrukcja eliminacji stanów 52 b 0 1 start a 1 0 d 1 0 c Automat skończony filtra odbijającego. 0 1 0 start a 11 0 10 d 0 1 c 1 Automat skończony filtra odbijającego po wyeliminowaniu stanu b. 16/12/2013

Redukcja zupełna automatu 53 S start s Automat zredukowany do dwóch stanów. Wyrażenie regularne: S*U(T VS*U)* V U t T start s S Automat posiadający jedynie stan początkowy. Wyrażenie regularne: S* 16/12/2013

Wykład 11 54 Gramatyki Gramatyki bezkontekstowe Język gramatyk Drzewa rozbioru Niejednoznaczność gramatyk Analiza składniowa i konstrukcja drzew rozbioru Gramatyki a wyrażenia regularne 13/01/2014

Opis wzorców 55 Opis wzorców polegający na wykorzystaniu modelu definicji rekurencyjnych, nazywamy gramatyką bezkontekstową (ang. contex-free grammar). Jednym z ważnych zastosowań gramatyk są specyfikacje języków programowania. Gramatyki stanowią zwięzłą notacje opisu ich składni. Istnieje możliwość mechanicznego przekonwertowania gramatyki typowego języka programowania na analizator składniowy (ang. parser), który stanowi jeden z kluczowych elementów kompilatora takiego języka. Analizator składniowy pozwala na zidentyfikowanie struktury programu źródłowego, często w postaci drzewa wyrażeń dla każdej instrukcji programu. 13/01/2014

Gramatyki bezkontekstowe 56 Wyrażenia arytmetyczne można w naturalny sposób zdefiniować rekurencyjnie. Weźmy pod uwagę wyrażenia arytmetyczne zawierające: (a) Cztery operatory dwuargumentowe +, -, *, / (b) Nawiasy służące do grupowania podwyrażeń (c) Operandy które są liczbami Tradycyjna definicja takich wyrażeń stanowi indukcje: 13/01/2014

Gramatyka składa się z jednej lub większej liczby produkcji (ang. productions). Każda produkcja składa się z trzech części: (1) Części nagłówkowej (ang. head), która jest kategoria syntaktyczna umieszczona po lewej stronie strzałki (2) Metasymbolu (np. strzałki) (3) Części zasadniczej (ang. body) <Cyfra> 0 1 2 3 4 5 6 7 8 9 <Liczba> <Cyfra> <Liczba> <Liczba> <Cyfra> <Wyrażenie> <Liczba> <Wyrażenie> ( < Wyrażenie> ) <Wyrażenie> <Wyrażenie> + <Wyrażenie> <Wyrażenie> <Wyrażenie> - <Wyrażenie> <Wyrażenie> <Wyrażenie> * <Wyrażenie> <Wyrażenie> <Wyrażenie> / <Wyrażenie> Gramatyka wyrażeń w której liczby zdefiniowano przy pomocy konstrukcji gramatycznych. 57

<Cyfra> 0 1 2 3 4 5 6 7 8 9 <Liczba> <Cyfra> <Liczba> <Liczba> <Cyfra> <Wyrażenie> <Liczba> <Wyrażenie> ( < Wyrażenie> ) <Wyrażenie> <Wyrażenie> + <Wyrażenie> <Wyrażenie> <Wyrażenie> - <Wyrażenie> <Wyrażenie> <Wyrażenie> * <Wyrażenie> <Wyrażenie> <Wyrażenie> / <Wyrażenie> < W > < W > < W > < L > < C > 3 * ( ) < W > < W > < L > + < W > < L > Drzewo rozbioru dla ciągu znaków 3 * (2 + 14) przy użyciu gramatyki zdefiniowanej powyżej. < C > 2 < L > < C > < C > 4 1 58

drzewo rozbioru < W > < W > < W > < L > < C > 3 * ( ) < W > < W > < L > + < W > < L > drzewo wyrażeń 3 * ( + ) < C > < L > < C > 2 14 2 < C > 4 1 59

Niejednoznaczność i projektowanie gramatyk Rozpatrzmy gramatykę zbilansowanych nawiasów. Chcemy utworzyć drzewo rozbioru dla ciągu znaków ( ) ( ) ( ). Można utworzyć dwa takie drzewa. <Z> <Z> e <Z> (<Z>) <Z> <Z> <Z> <Z> <Z> <Z> <Z> <Z> <Z> <Z> ( <Z> ) ( <Z> ) <Z> <Z> ( <Z> ) ( <Z> ) e e ( <Z> ) ( <Z> ) e e e e Gramatyka w której istnieją dwa lub więcej drzewa rozbioru o tym samym wyniku oraz tej samej kategorii syntaktycznej etykietującej korzeń jest nazywana gramatyka niejednoznaczna. (ang. ambigous). Wystarczy żeby istniał choć jeden taki ciąg który jest niejednoznaczny. 60

Rozpatrzmy inną gramatykę zbilansowanych nawiasów. Chcemy utworzyć drzewo rozbioru dla ciągu znaków ( ) ( ) ( ). Można utworzyć tylko jedno takie drzewo. <Z> e <Z> (<Z>) <Z> <Z> ( <Z> ) e <Z> ( <Z> ) Gramatyka, która nie jest niejednoznaczna nosi nazwę jednoznacznej (ang. unambigous). W przypadku takiej gramatyki dla każdego ciągu s oraz kategorii syntaktycznej <S> istnieje co najwyżej jedno drzewo rozbioru z wynikiem s oraz korzeniem zaetykietowanym przez <S>. <Z> e ( <Z> ) e <Z> e 61

Niejednoznaczność gramatyk wyrażeń może być poważnym problemem. Niektóre drzewa rozbioru mogą dawać złe wartości dla wyrażeń. Dwa drzewa rozbioru dla wyrażenia: 1-2+3 <W> <W> <W> + <W> <W> - <W> <W> - <W> <L> <L> <W> + <W> <L> <L> <C> <C> <L> <L> <C> <C> 3 1 <C> <C> 1 2 Poprawne drzewo rozbioru 1-2+3 = 2 2 Niepoprawne drzewo rozbioru 1-2+3=-4 3 62

Jednoznaczne gramatyki wyrażeń Konstrukcja jednoznacznej gramatyki polega na zdefiniowaniu trzech kategorii syntaktycznych o następującym znaczeniu: <Czynnik> - generuje wyrażenia, które nie mogą zostać rozdzielone, to znaczy czynnik jest albo pojedynczym operandem, albo dowolnym wyrażeniem umieszczonym w nawiasie. < Składnik> - generuje iloczyn lub iloraz czynników. Pojedynczy czynnik jest składnikiem, a więc stanowi ciąg czynników rozdzielonych operatorami * lub /. Przykładami składników są 12 lub 12/3*45. <Wyrażenie> - generuje różnicę lub sumę jednego lub większej liczby składników. Pojedynczy składnik jest wyrażeniem, a więc stanowi sekwencję składników rozdzielonych operatorami + lub -. Przykładami wyrażeń są 12, 12/3*45 lub 12+3*45-6. (1) <W> <W> + <S> <W> - <S> <S> (2) <S> <S> * <Cz> <S> / <Cz> <Cz> (3) <Cz> ( <W> ) <L> (4) <L > <L><C> <C> (5) <C> 0 1... 9 gramatyka jednoznaczna wyrażeń arytmetycznych 63

<W> Poprawne drzewo rozbioru 1 + 2 * 3 <W> + <S> <W> <W> - <S> <Cz> <W> + <S> <S> <Cz> <Cz> <L> <L> <C> <S> <Cz> <S> <Cz> * <Cz> <L> <L> <C> 3 <L> <L> <C> <C> 1 2 Poprawne drzewo rozbioru 1 2 + 3 <C> 1 <C> 2 3 64

Rozróżnienie miedzy wyrażeniami, składnikami i czynnikami wymusza poprawne grupowanie wyrażeń na różnych poziomach pierwszeństwa działań. Gramatyki przypominają wyrażenia regularne tym, że obie notacje opisują języki, ale nie definiują bezpośrednio algorytmu określania, czy dany ciąg znaków należy do definiowanego języka. W przypadku wyrażeń regularnych pokazaliśmy jak można konwertować wyrażenia regularne najpierw na automat niedeterministyczny, a potem na automat deterministyczny. Ten drugi można bezpośrednio implementować jako program. Analogiczny proces można opisać w przypadku gramatyk. Konwersja gramatyki na automat deterministyczny jest niemożliwa. Istnieje możliwość przekonwertowania gramatyki na program, który podobnie jak automat odczytuje dane wejściowe i określa czy dany ciąg wejściowy należy do języka gramatyki. Najważniejsza z takich technik nosi nazwę rozbioru lewostronnego (ang. LR parsing). 65

Produkcje definiujące cześć instrukcji języka C <Instrukcja> while (warunek) <Instrukcja> <Instrukcja> if (warunek) <Instrukcja> <Instrukcja> if (warunek) <Instrukcja> else <Instrukcja> <Instrukcja> {<ListaInstr>}; <Instrukcja> prostainstr; <ListaInstr> e <ListaInstr> <ListaInstr> <Instrukcja> Można opisywać gramatycznie strukturę przebiegu sterowania występującą w językach takich jak C. Załóżmy istnienie abstrakcyjnych symboli terminalnych warunek oraz instrprosta. Pierwszy z nich oznacza wyrażenie warunkowe i można go zastąpić kategorią syntaktyczna <Warunek>. Symbol terminalny instrprosta określa instrukcję nie zawierającą zagnieżdżonych struktur sterujących, takich jak instrukcja przypisania, wywołania funkcji, odczytu, zapisu i skoku. Można zastąpić symbol terminalny kategorią syntaktyczną oraz rozszerzającymi ją produkcjami. Jako kategorii syntaktycznej instrukcji języka C będziemy używać kategorii <Instrukcja>. 66

Jednym z metodycznych sposobów zaimplementowania takiej definicji jest wykonanie sekwencyjnego przebiegu przez produkcję gramatyki. W każdym przebiegu następuje uaktualnienie języka każdej kategorii syntaktycznej przy użyciu reguły indukcyjnej na wszystkie możliwe sposoby, tzn. dla każdego Xi będącego kategorią syntaktyczną wybieramy ciągi znaków ze zbioru L(<Xi>) na wszystkie możliwe sposoby. (1) <Instrukcja> while (warunek) <Instrukcja> (2) <Instrukcja> {<ListaInstr>}; (3) <Instrukcja> prostainstr; (4) <ListaInstr> <ListaInstr> <Instrukcja> (5) <ListaInstr> e Uproszczona gramatyka instrukcji <I> w c <I> <I> {<L>} <I> s; <L> <L> <I> <L> e Uproszczona notacja 67

<I> Pełne drzewo rozbioru dla analizy składniowej dla ciągu: {w c s ; s ; } ENDM { <D> <I> <D> w c <I> <I> <D> s ; s ; } 68

Konstrukcja gramatyki dla wyrażenia regularnego: a bc* 1. Tworzymy kategorie syntaktyczne dla trzech symboli, które pojawiają się w tym wyrażeniu: < A > a < B > b < C > c 2. Tworzymy gramatykę dla c*: < D > < C > < D > e Wówczas L(<D>) = L(<C>))* = c* 3. Tworzymy gramatykę dla bc*: < E > < B > < D > 4. Tworzymy gramatykę dla całego wyrażenia regularnego a bc*: < F > < A > < E > końcowa postać gramatyki <F> <A> <E> <E> <B> <D> <D> <C> <D> e <A> a <B > b <C> c 69

Język posiadający gramatykę ale nie posiadający wyrażenia regularnego Język E będzie zbiorem znaków składających się z jednego lub większej liczby symboli 0, po których występuje ta sama liczba symboli 1, to znaczy: E = { 01, 0011, 000111,...} W celu opisania ciągów znaków języka E można użyć przydatnej notacji opartej na wykładnikach. Niech s n, gdzie s jest ciągiem znaków, zaś n liczba całkowitą, oznacza ss...s (n razy), to znaczy s złożone ze sobą n razy. Wówczas: E = {0 1 1 1, 0 2 1 2, 0 3 1 3,...} lub E = {0 n 1 n n 1} Język E można zapisać za pomocą gramatyki: < S > 0 < S > 1 < S > 0 1 Ponieważ nie istnieją żadne inne ciągi znaków możliwe do utworzenia na podstawie tych dwóch produkcji, E = L(<S>). 70

Posumowanie Gramatyka bezkontekstowa wykorzystuje model funkcji rekurencyjnych. Jednym z ważnych zastosowań gramatyk są specyfikacje języków programowania. Gramatyki stanowią zwięzłą notacje opisu ich składni. Drzewa analizy składniowej (drzewa rozbioru) stanowią formę reprezentacji, która przedstawia strukturę ciągu znaków zgodną z daną gramatyką. Niejednoznaczność to problem, który pojawia się w sytuacji gdy ciąg znaków posiada dwa lub więcej odrębnych drzew analizy składniowej, przez co nie posiada unikatowej struktury zgodnie z daną gramatyką 71