10.04.2014 Views

Wykład 6 (2on1) - Instytut Sterowania i Systemów Informatycznych ...

Wykład 6 (2on1) - Instytut Sterowania i Systemów Informatycznych ...

Wykład 6 (2on1) - Instytut Sterowania i Systemów Informatycznych ...

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Automaty (nie)deterministyczne – część I<br />

Notatki<br />

Automaty (nie)deterministyczne – część I<br />

Osoba prowadząca wykład i ćwiczenia: dr inż. Marek Sawerwain<br />

<strong>Instytut</strong> <strong>Sterowania</strong> i <strong>Systemów</strong> <strong>Informatycznych</strong><br />

Uniwersytet Zielonogórski<br />

e-mail : M.Sawerwain@issi.uz.zgora.pl<br />

tel. (praca) : 68 328 2321,<br />

pok. 328a A-2,<br />

ul. prof. Z.Szafrana 2,<br />

65-246 Zielona Góra<br />

Ostatnia zmiana: 03.12.2012<br />

V1.1 – 1/ 55<br />

Automaty (nie)deterministyczne – część I<br />

Spis treści<br />

Notatki<br />

Wprowadzenie<br />

Plan wykładu<br />

Słowa, języki, relacje<br />

Słowa<br />

Język<br />

Relacje<br />

Automaty<br />

Zastosowanie automatów<br />

Funkcja przejścia<br />

Własności automatów<br />

Minimalizacja automatów<br />

Ragel<br />

Możliwości pakietu Ragel<br />

Przykłady zastosowań<br />

A za tydzień na wykładzie<br />

V1.1 – 2/ 55


Automaty (nie)deterministyczne – część I<br />

Wprowadzenie<br />

Plan wykładu<br />

Plan wykładu – spotkania tydzień po tygodniu<br />

Notatki<br />

(1) Informacje o wykładzie, poprawność algorytmów<br />

(2) Poprawność algorytmów – logika Hoarego<br />

(3) Analiza złożoności kodu wysokiego i niskiego poziomu<br />

(4) Modele algorytmiczne – maszyny proste, obwody logiczne<br />

(5) Modele algorytmiczne – maszyna Turinga oraz rachunek-λ<br />

(6) ⇒Automaty (nie)deterministyczne – część I ⇐<br />

(7) Automaty (nie)deterministyczne – część II<br />

(8) Gramatyki – regularne i bezkontekstowe<br />

V1.1 – 3/ 55<br />

Automaty (nie)deterministyczne – część I<br />

Wprowadzenie<br />

Plan wykładu<br />

Plan wykładu – spotkania tydzień po tygodniu<br />

Notatki<br />

(9) Gramatyki i automaty ze stosem<br />

(10) Algorytmy równoległe<br />

(11) Klasy złożoności obliczeniowej<br />

(12) Pamięć logarytmiczna i wielomianowa<br />

(13) Problemy NP-zupełne<br />

(14) Wstęp do obliczeń kwantowych<br />

(15) Wybrane algorytmy kwantowe<br />

V1.1 – 4/ 55


Automaty (nie)deterministyczne – część I<br />

Wprowadzenie<br />

Plan wykładu<br />

Plan wykładu<br />

Notatki<br />

1. Słowa, Języki, Relacje<br />

1.1 podstawowe definicje<br />

1.2 własności relacji<br />

2. Automaty deterministyczne<br />

2.1 budowa automatu deterministycznego<br />

2.2 funkcja przejścia<br />

2.3 automat skończony dla dowolnego języka skończonego<br />

2.4 suma, product i dopełnienie automatu<br />

2.5 minimalizacja automatu<br />

3. Automaty w praktyce<br />

3.1 projekt Ragel<br />

3.2 przykład implementacji automatu<br />

3.3 funkcja atoi<br />

3.4 linia z parametrami<br />

V1.1 – 5/ 55<br />

Automaty (nie)deterministyczne – część I<br />

Wprowadzenie<br />

Plan wykładu<br />

Notatki<br />

Materiały wykorzystane podczas tworzenia tego wykładu, a także przydatne<br />

do dalszych studiów:<br />

1. John E.Hopcroft, Jeffrey D.Ullman: Wprowadzenie do teorii<br />

automatów, języków i obliczeń, Wydawnictwo Naukowe PWN<br />

2003 Wydanie 1 oraz Wydanie 2 z roku 2006,<br />

2. przedmiot Języki automaty i obliczenia z Ważniaka,<br />

3. wykład M.Kubicy, Języki formalne i automaty,<br />

http://www.mimuw.edu.pl/~kubica/aug/index-frames.html,<br />

4. Podręcznik użytkownika pakietu Ragel:<br />

http://www.complang.org/ragel/ragel-guide-6.7.pdf.<br />

V1.1 – 6/ 55


Automaty (nie)deterministyczne – część I<br />

Słowa, języki, relacje<br />

Notatki<br />

Słowa, Języki, Relacje<br />

V1.1 – 7/ 55<br />

Automaty (nie)deterministyczne – część I<br />

Słowa, języki, relacje<br />

Słowa<br />

Notatki<br />

Podstawowe definicja związane z pojęciem słowa oraz języka:<br />

Definicja<br />

Alfabet oznaczony przez Σ, to dowolny niepusty, skończony zbiór. Elementy<br />

alfabetu nazywamy znakami albo symbolami.<br />

Elementy alfabetu to zazwyczaj cyfry i litery, ale mogą to być dowolne inne<br />

symbole.<br />

Definicja<br />

Słowo (lub napis) nad alfabetem Σ, to dowolny skończony ciąg symboli z Σ.<br />

Słowem jest też ciąg/słowo puste oznaczone przez λ bądź ε.<br />

Definicja<br />

Długość słowa oznaczamy przez | · | i jest to liczba symbol słowie.<br />

Przykłady: |abc| = 3 oraz |λ| = 0.<br />

V1.1 – 8/ 55


Automaty (nie)deterministyczne – część I<br />

Słowa, języki, relacje<br />

Słowa<br />

Notatki<br />

Definicja<br />

Sklejenie (inne określenie to konkatenacja) słów to słowo z powstałe z<br />

połączenia z dwóch słów x,y: z = x + y, co oznacza że sklejane słowa są<br />

zapisane jedno po drugim.<br />

Przykład: jeśli x = Ala, y = Ma, z = Kota, to zyx = KotaMaAla. Sklejanie<br />

słów jest łączne: x(yz) = (xy)z, oraz λ jest elementem neutralnym operacji<br />

sklejania, tzn. xλ = λx = x.<br />

Definicja<br />

Wyrażenie a n oznacza n-krotne powtórzenie symbolu a.<br />

Jeśli x jest słowem, to x n oznacza n-krotne powtórzenie słowa. Dodatkowo<br />

x 0 = λ, x n+1 = x n x. Przykłady: a 4 = aaaa, a 0 = λ, b n+1 = b n a, x 0 = λ,<br />

x n+1 = x n x, gdzie a,b to symbole natomiast x jest słowem, oraz jeśli<br />

x = kolor, to x 3 = kolorkolorkolor.<br />

V1.1 – 9/ 55<br />

Automaty (nie)deterministyczne – część I<br />

Słowa, języki, relacje<br />

Słowa<br />

Notatki<br />

Definicja<br />

Liczbę wystąpień symbolu a w słowie x oznaczamy przez # a (x).<br />

Podsłowem danego słowa x nazywamy dowolny spójny fragment słowa x,<br />

tzn. y jest podsłowem x jeśli, gdy istnieją takie v i w, że x = vyw.<br />

Definicja<br />

Prefiksem słowa nazywamy dowolny jego początkowy fragment, tzn. x jest<br />

prefiksem y, gdy istnieje takie z, że xz = y. Dodatkowo, jeśli x ≠ λ i x ≠ y,<br />

to x jest właściwym prefiksem y.<br />

Sufiksem słowa x nazywamy dowolny końcowy fragment x, tzn. x jest<br />

sufiksem y, gdy istnieje takie z, że zx = y. I podobnie, gdy x ≠ λ oraz<br />

x ≠ y, to x jest właściwym sufiksem y<br />

Definicja<br />

Przez rev(x) lub ←− x oznaczamy słowo x czytane wspak.<br />

V1.1 – 10/ 55


Automaty (nie)deterministyczne – część I<br />

Słowa, języki, relacje<br />

Język<br />

Notatki<br />

Definicja<br />

Język L, to dowolny zbiór słów nad alfabetem Σ.<br />

Język złożony ze wszystkich możliwych słów nad alfabetem łączenie ze<br />

słowem pustym, będziemy oznaczać przez Σ ⋆ . Podstawowe operacje na<br />

językach są następujące:<br />

◮ ∅ to pusty język, który nie zawiera żadnego słowa,<br />

◮ A ∪ B to suma języków A i B,<br />

◮ A ∩ B to część wspólna (przecięcie) języków A i B,<br />

◮ A \ B to różnica języków A i B.<br />

Przez A oznaczymy dopełnienie języka A, czyli A = Σ ⋆ \ A. Natomiast<br />

AB oznacza konkatenację języków A i B, czyli jest to język zawierający<br />

wszystkie możliwe sklejenia słów z A i słów B, AB = {xy : x ∈ A, y ∈ B}.<br />

V1.1 – 11/ 55<br />

Automaty (nie)deterministyczne – część I<br />

Słowa, języki, relacje<br />

Język<br />

Notatki<br />

Język A n jest określony rekurencyjnie:<br />

◮ A 0 = {λ},<br />

◮ A n+1 = A n A.<br />

Można powiedzieć, że język A n to język zawierający wszystkie możliwe sklejenia<br />

n słów wziętych z A, i dodatkowo słowa to niekoniecznie muszą się<br />

różnić.<br />

Domknięcie Kleene’ego<br />

Domknięcie Kleene’ego języka A, oznaczane jako A ⋆ , to A ⋆ = ⋃ n≥0 An .<br />

Inaczej mówiąc, A ⋆ to język zawierający wszystkie możliwe sklejenia<br />

dowolnej liczby słów należących do A, także ze słowem pustym.<br />

Natomiast przez A + oznaczamy język zawierający wszystkie możliwe sklejenia<br />

dowolnej dodatniej liczby słów należących do A, czyli A + = AA ⋆ , co<br />

oznacza brak słowa pustego.<br />

V1.1 – 12/ 55


Automaty (nie)deterministyczne – część I<br />

Słowa, języki, relacje<br />

Relacje<br />

Notatki<br />

Niech X reprezentuje dowolnym zbiór, a ρ ∈ X × X relację binarną, która<br />

jest określona na tym zbiorze, wtedy:<br />

◮ relacja ρ jest zwrotna, gdy dla każdego x ∈ X zachodzi xρx,<br />

◮ relacja ρ jest symetryczna, gdy dla dowolnych x, y ∈ X , jeśli xρy, to<br />

również yρx,<br />

◮ relacja ρ jest przechodnia, gdy dla dowolnych x, y, z ∈ X , jeżeli<br />

xρy ∧ yρz, to również xρz,<br />

◮ relacja ρ jest antysymetryczna, gdy dla dowolnych x, y ∈ X , jeżeli<br />

xρy ∧ yρx, to również x = y.<br />

Dwie istotne własności:<br />

◮ jeśli ρ jest zwrotna, symetryczna i przechodnia, to ρ jest relacją<br />

równoważności,<br />

◮ jeśli ρ jest zwrotna, przechodnia i antysymetryczna, to ρ jest relacją<br />

częściowego porządku.<br />

V1.1 – 13/ 55<br />

Automaty (nie)deterministyczne – część I<br />

Słowa, języki, relacje<br />

Relacje<br />

Notatki<br />

Relacja równoważności dzieli zbiór X na rozłączne klasy abstrakcji:<br />

Definicja<br />

Jeśli ρ jest relacją równoważności, x ∈ X , to przez [x] ρ oznaczono klasę<br />

abstrakcji x:<br />

[x] ρ = {y ∈ X : xρy}<br />

Przez X /ρ oznaczono zbiór klas abstrakcji elementów zbioru X :<br />

X /ρ = {[x] ρ : x ∈ X }<br />

V1.1 – 14/ 55


Automaty (nie)deterministyczne – część I<br />

Słowa, języki, relacje<br />

Relacje<br />

Notatki<br />

(a)<br />

(b)<br />

Relacja zwrotna (a) oraz relacja symetryczna (b).<br />

V1.1 – 15/ 55<br />

Automaty (nie)deterministyczne – część I<br />

Słowa, języki, relacje<br />

Relacje<br />

Notatki<br />

(a)<br />

(b)<br />

Relacja antysymetryczna (a) oraz relacja przechodnia (b).<br />

V1.1 – 16/ 55


Automaty (nie)deterministyczne – część I<br />

Słowa, języki, relacje<br />

Relacje<br />

Notatki<br />

Relacja równoważności.<br />

V1.1 – 17/ 55<br />

Automaty (nie)deterministyczne – część I<br />

Słowa, języki, relacje<br />

Relacje<br />

Notatki<br />

Relacja częściowego porządku.<br />

V1.1 – 18/ 55


Automaty (nie)deterministyczne – część I<br />

Słowa, języki, relacje<br />

Relacje<br />

Domknięcie relacji<br />

Niech ρ ⊆ X ×X będzie dowolną relacją binarną. Domknięciem przechodniozwrotnym<br />

relacji ρ nazywamy najmniejszą taką relację ρ ′<br />

⊂ X × X , że:<br />

◮ zawiera relację ρ, ρ ⊆ ρ ′ ,<br />

◮ jest zwrotna i przechodnia.<br />

Notatki<br />

Domknięcie przechodnio-zwrotne.<br />

V1.1 – 19/ 55<br />

Automaty (nie)deterministyczne – część I<br />

Słowa, języki, relacje<br />

Relacje<br />

Domknięcie relacji<br />

Notatki<br />

Definicja domknięcia przechodniego relacji ρ oznaczonego przez ρ p :<br />

◮ jeśli a ρ b to a ρ p b,<br />

◮ jeśli a ρ b i b ρ c, to a ρ p c.<br />

Domknięcie przechodnio zwrotne relacji ρ oznaczono jako ρ ′ , to<br />

ρ p ∪ {xρx | x ∈ X }.<br />

Przykład<br />

Niech ρ = {(1, 2), (2, 2), (2, 3)} oraz X = {1, 2, 3}, to otrzymuje się:<br />

◮ ρ p = {(1, 2), (2, 2), (2, 3), (1, 3)},<br />

◮ ρ ′ = {(1, 1)(1, 2), (1, 3), (2, 2), (2, 3), (3, 3)}.<br />

V1.1 – 20/ 55


Automaty (nie)deterministyczne – część I<br />

Automaty<br />

Zastosowanie automatów<br />

Zastosowanie automatów<br />

Notatki<br />

Automat skończony jest modelem matematycznym systemu o dyskretnych<br />

wejściach i wyjściach. System taki może znajdować się w jednym ze skończonej<br />

liczby stanów (dopuszczalne są także systemy, gdzie automat może<br />

się znajdować w wielu stanach na raz). Stan systemu stanowi podsumowanie<br />

informacji dotyczących poprzednich wejść. Informacja ta jest niezbędna<br />

do określenia zachowania systemu przy następnych wejściach.<br />

Istnieje wiele przykładów zastosowań automatów. Prostym przykładem jest<br />

mechanizm windy. Mechanizm ten nie pamięta wszystkich poprzednich żądań.<br />

Pamiętane jest tylko bieżące piętro, kierunek ruchu (w górę lub w dół)<br />

oraz zbiór żądań do obsłużenia.<br />

V1.1 – 21/ 55<br />

Automaty (nie)deterministyczne – część I<br />

Automaty<br />

Zastosowanie automatów<br />

Zastosowanie automatów<br />

Notatki<br />

Inne przykładowe zastosowania automatów:<br />

◮ oprogramowanie do projektowania obwodów cyfrowych oraz testy<br />

poprawności obwodu,<br />

◮ zastosowanie w kompilatorach jako analizator leksykograficzny, którego<br />

zadaniem jest rozbicie tekstu kodu źródłowego na pojedyncze jednostki<br />

logiczne takie jak identyfikatory, słowa kluczowe czy znaki przestankowe,<br />

◮ skanowanie większych ilości tekstu np.: zbiór stron WWW, celem<br />

odnalezienia wystąpień określonych słów czy całych zwrotów,<br />

◮ weryfikacja systemów o skończonej liczbie stanów jak min. protokoły<br />

komunikacyjne, protokoły bezpieczeństwa związane z wymianą<br />

informacji.<br />

V1.1 – 22/ 55


Automaty (nie)deterministyczne – część I<br />

Automaty<br />

Zastosowanie automatów<br />

Wilk, człowiek, kapusta, rzeka ...<br />

Notatki<br />

start<br />

CWKS-#<br />

K<br />

WS-CK<br />

C<br />

CWS-K<br />

W<br />

S<br />

S-CWK<br />

W-CKS<br />

K<br />

K<br />

CKS-W<br />

CWK-S<br />

S<br />

W<br />

#-CWKS<br />

K<br />

CK-WS<br />

C<br />

K-CWS<br />

V1.1 – 23/ 55<br />

Automaty (nie)deterministyczne – część I<br />

Automaty<br />

Zastosowanie automatów<br />

Odtwarzacz DVD, Bluray, mp3 ...<br />

eject<br />

Notatki<br />

start<br />

empty<br />

insert<br />

eject<br />

stop<br />

play<br />

stop<br />

play<br />

ffwd<br />

rev<br />

rev<br />

stop play ffwd<br />

play<br />

stop<br />

eject<br />

rev<br />

ffwd<br />

rev<br />

ffwd<br />

eject<br />

V1.1 – 24/ 55


Automaty (nie)deterministyczne – część I<br />

Automaty<br />

Zastosowanie automatów<br />

Deterministyczny automat skończony – definicja<br />

Notatki<br />

Deterministyczny automat skończony (w skrócie DAS lub ang. FDA – finite<br />

deterministic automata) jest zbudowany z następujących elementów:<br />

1. skończonego zbioru stanów, oznaczonych symbolem Q,<br />

2. skończonego zbioru symboli wejściowych (nazywanego także alfabetem),<br />

oznaczonych symbolem Σ,<br />

3. funkcji przejścia, przyjmującej za argument stan oraz symbol wejściowy<br />

a jej wynikiem jest stan, funkcja przejścia będzie oznaczana przez<br />

symbol δ,<br />

4. stanu początkowego, jest to jeden wyróżniony stan z Q np.: q 0 ,<br />

5. zbioru stanów końcowych, gdzie wyróżnia się zbiór stanów<br />

akceptujących F , gdzie F ⊂ Q.<br />

V1.1 – 25/ 55<br />

Automaty (nie)deterministyczne – część I<br />

Automaty<br />

Zastosowanie automatów<br />

DAS – definicja formalna<br />

Notatki<br />

Definicja deterministycznego automatu skończonego<br />

Deterministyczny automat skończony A, to krotka albo prościej następująca<br />

piątka: A = (Q, Σ, δ, q 0 , F ):<br />

◮ Q to skończony zbiór stanów,<br />

◮ Σ to skończony alfabet wejściowy,<br />

◮ δ : Q × Σ → Q, to funkcja przejścia δ(q, a)<br />

◮ s to stan początkowy,<br />

◮ F ⊆ Q to zbiór stanów akceptujących.<br />

Automat i funkcja przejścia określona jako tabela:<br />

δ 0 1<br />

1<br />

0<br />

→ q 0 q 1 q 0<br />

q 0 0 q 1<br />

q<br />

1 q 1 q 1 q 2<br />

2 0, 1<br />

⋆q 2 q 2 q 2<br />

V1.1 – 26/ 55


Automaty (nie)deterministyczne – część I<br />

Automaty<br />

Zastosowanie automatów<br />

Projektowanie automatu<br />

Notatki<br />

Określenie języka C, zawierającego podciąg 01:<br />

C = {x01y | x, y są dowolnymi łańcuchami zer i jedynek}<br />

Przykładami łańcuchów należących do języka C są ciągi: 01, 11010 oraz<br />

100011. Przykładami ciągów nienależących do języka C są ciągi λ (czyli<br />

ciąg pusty), 0 oraz 111000.<br />

Łatwo stwierdzić iż alfabet to tylko dwa znaki Σ = {0, 1}. Istnieje pewien<br />

zbiór stanów Q którego na razie nie precyzujemy, ale już można wyróżnić<br />

stan początkowy q 0 . Automat musi zostać skonstruowany w taki sposób,<br />

aby niejako pamiętał ważne fakty odnośnie tego, co pojawiło się na wejściu.<br />

W przypadku postawionego zadania możemy wyróżnić trzy następujące zdarzenia:<br />

V1.1 – 27/ 55<br />

Automaty (nie)deterministyczne – część I<br />

Automaty<br />

Zastosowanie automatów<br />

Trzy obserwacje<br />

Notatki<br />

1. Czy na wejściu pojawił się podciąg 01? Jeśli tak, to można<br />

zaakceptować dowolny ciąg zer i jedynek, ponieważ ciąg jest zbudowany<br />

zgodnie z językiem L. Oznacza to także że następne stany mogą być<br />

stanami akceptującymi.<br />

2. Jak dotąd podciąg 01 nie pojawił się jeszcze, ale ostatnim widzianym<br />

symbolem było 0, jeśli teraz pojawi się 1, oznaczać to będzie, że pojawił<br />

się podciąg 01 i następne symbole mogą być dowolnym ciągiem zer i<br />

jedynek.<br />

3. Jak dotąd podciąg 01 nie pojawił się jeszcze, co więcej poprzedni<br />

symbol nie został jeszcze podany, bo automat właśnie rozpoczął swoją<br />

pracę bądź ostatnim symbolem była jedynka. W takim przypadku<br />

automat A nie może zaakceptować słowa, dopóki nie pojawi się zero, a<br />

bezpośrednio po zerze jedynka.<br />

V1.1 – 28/ 55


Automaty (nie)deterministyczne – część I<br />

Automaty<br />

Zastosowanie automatów<br />

Notatki<br />

Projektowanie automatu<br />

Wymienione warunki należy przedstawić za pomocą stanów. Warunek (3)<br />

będzie reprezentowany przez stan q 0 . Jest to uzasadnione tym, że jeśli zaczynamy,<br />

to musimy wykryć zero, a następnie jedynkę. Jeśli będąc w stanie<br />

q 0 zobaczymy w pierwszej kolejności jedynkę, to naturalnie nadal musimy<br />

pozostać w stanie q 0 . Zapiszemy to w następujący sposób δ(q 0 , 1) = q 0 .<br />

Będąc w stanie q 0 , gdy napotkamy zero to zaczyna obowiązywać warunek<br />

(2), czyli δ(q 0 , 0) = q 2 . Przybliża nas to do wykrycia, obecności podciągu<br />

01. Pierwsza istotna sytuacja dla stanu q 2 , to wykrycie następującego<br />

symbolu którym jest zero. Jeśli tak jest to, δ(q 2 , 0) = q 2 , co oznacza iż<br />

naturalnie pozostajemy w stanie q 2 . Jednakże jeśli będąc w stanie q 2 , wykryjemy<br />

zero to wiedząc iż pojawiło się już zero to uzyskaliśmy informację o<br />

tym, że wystąpił pod ciąg 01. Przechodzimy do stanu q 1 , oznaczający stan<br />

akceptujący, δ(q 2 , 1) = q 1 .<br />

V1.1 – 29/ 55<br />

Automaty (nie)deterministyczne – część I<br />

Automaty<br />

Zastosowanie automatów<br />

Projektowanie automatu<br />

Stan q 1 może przyjmować, zero bądź jedynkę w dowolnej kolejności ponieważ<br />

już wcześniej udało nam się stwierdzić obecność 01. Funkcja przejścia<br />

posiada postać δ(q 1 , 0) = q 1 oraz δ(q 1 , 1) = q 1 .<br />

Zbierając uzyskane informacje, formalnie automat A zdefiniujemy w<br />

następujący sposób:<br />

Notatki<br />

A DAS = {q 0 , q 1 , q 2 }, {0, 1}, δ, q 0 , {q 1 }<br />

A funkcja przejścia jest następująca:<br />

0 1<br />

→ q 0 q 2 q 0<br />

⋆q 1 q 1 q 1<br />

V1.1 – 30/ 55


Automaty (nie)deterministyczne – część I<br />

Automaty<br />

Funkcja przejścia<br />

Funkcja przejścia<br />

Przydatne jest aby funkcję δ określoną na stanie i pojedynczym symbolu,<br />

rozszerzyć tak aby określa działanie automatu dla słów.<br />

Rozszerzona funkcja przejścia – oznaczona jako ˆδ albo δ ⋆<br />

Rozszerzona funkcja przejścia δ ⋆ : Q × Σ ⋆ → Q jest zdefiniowana w<br />

następujący sposób:<br />

◮ δ ⋆ (q, λ) = q,<br />

◮ δ ⋆ (q, xa) = δ(δ ⋆ (q, x), a).<br />

gdzie a to symbol, natomiast x słowo.<br />

Automat akceptuje słowo x ⇔ δ ⋆ (q, x) ∈ F , co pozwala określić język<br />

akceptowalny przez automat A.<br />

Akceptowany język<br />

Język L akceptowany przez automat A, to:<br />

Notatki<br />

L(A) = {x ∈ Σ ⋆ : δ ⋆ (q, x) ∈ F }.<br />

V1.1 – 31/ 55<br />

Automaty (nie)deterministyczne – część I<br />

Automaty<br />

Własności automatów<br />

O możliwości budowy automatu<br />

Notatki<br />

Własność<br />

Każdy język skończony jest akceptowany przez pewien deterministyczny<br />

automat skończony.<br />

Szkic dowodu, z użyciem prefiksów. Niech L będzie skończonym językiem. Wszystkie<br />

słowa z L mają skończoną liczbę prefiksów. Stanami automatu akceptującego L będą<br />

wspomniane prefiksy, oraz jeden dodatkowy stan, który będziemy nazywać „śmietnikiem”<br />

i będziet ostan nieakceptujący. Po wczytaniu dowolnego słowa, jeżeli jest ono prefiksem<br />

pewnego słowa z L, nasz automat A będzie dokładnie w takim stanie jak to słowo.<br />

Natomiast po wczytaniu słowa, które nie jest prefiksem żadnego słowa z A automat<br />

przejdzie do śmietnika.<br />

Stan początkowy to λ. Jeśli x i xa są prefiksami pewnego słowa z L, to δ(q, a) = xa,<br />

w przeciwnym przypadku: δ(q, a) = śmietnik. Stany akceptujące to te prefiksy, które<br />

należą do L.<br />

W oczywisty sposób, język akceptowany przez automat A to L. Natomiast dzięki temu,<br />

że słowa z L mają skończoną liczbę prefiksów, jest to poprawny automat skończony.<br />

Za wykładem: M.Kubicy, Języki formalne i automaty.<br />

V1.1 – 32/ 55


Automaty (nie)deterministyczne – część I<br />

Automaty<br />

Własności automatów<br />

Przykład<br />

Notatki<br />

Dla języka L 1 = {ab, aba, abb, baa}, zbiór prefiksów jest następujący:<br />

{λ, a, b, ab, ba, aba, abb, baa}<br />

aba<br />

aba<br />

a<br />

ab<br />

b<br />

b<br />

a<br />

a a<br />

a,b<br />

a,b<br />

abb<br />

λ<br />

b<br />

b<br />

b<br />

a<br />

b<br />

a,b<br />

ba<br />

a<br />

baa<br />

a b<br />

→ λ a b<br />

a ∅ ab<br />

b ba ∅<br />

⋆ ab aba abb<br />

ba baa ∅<br />

⋆ aba ∅ ∅<br />

⋆ abb ∅ ∅<br />

⋆ baa ∅ ∅<br />

∅ ∅ ∅<br />

a,b<br />

V1.1 – 33/ 55<br />

Automaty (nie)deterministyczne – część I<br />

Automaty<br />

Własności automatów<br />

Dopełnienie, produkt i suma automatów<br />

Twierdzenie<br />

Niech L 1 i L 2 będą językami (alfabet Σ wspólny dla obu języków)<br />

akceptowanymi odpowiednio przez automaty deterministyczne<br />

A 1 = (Q 1 , Σ, δ 1 , q 1 , F 1 ) i A 2 = (Q 2 , Σ, δ 2 , q 2 , F 2 ), oraz L(A 1 ) = L 1 ,<br />

L(A 2 ) = L 2 . Następujące języki są również akceptowane przez pewne<br />

deterministyczne automaty skończone:<br />

◮ L 1 ,<br />

◮ L 1 ∩ L 2 ,<br />

◮ L 1 ∪ L 2 .<br />

Notatki<br />

Dowód dla dopełnienia: Niech A ′ 1 = (Q 1, Σ, δ 1 , q 1 , Q \ F 1 ), toteż<br />

L(A ′ 1 ) = {x ∈ Σ⋆ : δ ⋆ (q 1 , x) ∈ Q \ F 1 }<br />

= {x ∈ Σ ⋆ : δ ⋆ (q 1 , x) /∈ F 1 }<br />

= Σ ⋆ \ {x ∈ Σ ⋆ : δ ⋆ (q 1 , x) /∈ F 1 }<br />

= Σ ⋆ \ L(L 1 ) = Σ ⋆ \ L 1 = L 1 .<br />

V1.1 – 34/ 55


Automaty (nie)deterministyczne – część I<br />

Automaty<br />

Własności automatów<br />

Dopełnienie, produkt i suma automatów<br />

Notatki<br />

Dowód dla produktu automatów:<br />

Niech A 3 = (Q 1 × Q 2 , Σ, δ 3 , (q 1 , q 2 ), F 1 × F 2 ), co pociąga za sobą<br />

konieczność iż zachodzi δ 3 ((q 1 , q 2 ), a) = (δ 3 (q 1 , a), δ 3 (q 2 , a)), gdzie a to<br />

symbol. Wykorzystując indukcję po długości słowa x, należy wykazać że<br />

zachodzi δ3 ⋆((p, q), x) = (δ⋆ 3 (p, x), δ⋆ 3 (q, x)), gdzie x to słowo. Co pozwala<br />

uzyskać że<br />

L(A 3 ) = {x ∈ Σ ⋆ : δ3 ⋆((q 1, q 2 ), x) ∈ F 1 × F 2 }<br />

= {x ∈ Σ ⋆ : (δ1 ⋆(q 1, x), δ2 ⋆(q 2, x)) ∈ F 1 × F 2 }<br />

= {x ∈ Σ ⋆ : δ1 ⋆(q 1, x) ∈ F 1 ∧ δ2 ⋆(q 2, x) ∈ F 2 }<br />

= {x ∈ Σ ⋆ : δ1 ⋆(q 1, x) ∈ F 1 } ∩ {x ∈ Σ ⋆ : δ2 ⋆(q 2, x) ∈ F 2 }<br />

= L(A 1 ) ∩ L(A 2 ) = L 1 ∩ L 2<br />

Dowód dla sumy automatów, sprowadza się do wykorzystania praw de<br />

Morgana: L 1 ∪ L 2 = L 1 ∩ L 2<br />

V1.1 – 36/ 55<br />

V1.1 – 35/ 55<br />

Automaty (nie)deterministyczne – część I<br />

Automaty<br />

Własności automatów<br />

Przykład<br />

Notatki<br />

Produkt automatów akceptujących parzystą liczbę symboli b oraz parzystę<br />

liczbę symboli a:<br />

a<br />

p<br />

b<br />

b<br />

a<br />

q<br />

pr<br />

b<br />

b<br />

qr<br />

a<br />

a<br />

a<br />

a<br />

b<br />

a<br />

b<br />

b<br />

r<br />

a<br />

s<br />

ps<br />

b<br />

qs<br />

a b<br />

→ ⋆ p p q<br />

q q p<br />

a b<br />

→ r s r<br />

⋆ s r s<br />

a b<br />

→ pr ps qr<br />

qr qs pr<br />

⋆ ps pr qs<br />

qs qr ps


Automaty (nie)deterministyczne – część I<br />

Automaty<br />

Minimalizacja automatów<br />

Minimalizacja automatów<br />

Notatki<br />

Dlaczego warto minimalizować automaty, podczas projektowania automatu<br />

dla konkretnego rozwiązania można otrzymać kilka projektów. Najczęściej<br />

wybiera się projekt najmniejszy, który działa na najmniejszej możliwej liczbie<br />

stanów.<br />

Działanie „na oko”, celem wyboru najmniejszego automatu, jest raczej<br />

możliwe tylko dla małych przypadków. Minimalizacja automatu pozwala też<br />

na łatwą ocenę jaki język jest akceptowany przez automat.<br />

Ważny fakt<br />

Do każdego deterministycznego automatu skończonego zawsze istnieje<br />

jednoznaczny automat minimalny, który akceptuje ten sam język.<br />

V1.1 – 37/ 55<br />

Automaty (nie)deterministyczne – część I<br />

Automaty<br />

Minimalizacja automatów<br />

Minimalizacja automatów – „przykład na oko”<br />

Notatki<br />

Minimalizacja następującego automatu deterministycznego?<br />

p<br />

a<br />

a,b<br />

a<br />

r<br />

b<br />

a,b<br />

s<br />

b<br />

a<br />

b<br />

t<br />

q<br />

Jaki język akceptuje ten automat?<br />

V1.1 – 38/ 55


Automaty (nie)deterministyczne – część I<br />

Automaty<br />

Minimalizacja automatów<br />

Minimalizacja automatów – „przykład na oko”<br />

Notatki<br />

Usunięcie stanów nieosiągalnych, daje następujący automat:<br />

a<br />

a<br />

r<br />

b<br />

a,b<br />

s<br />

b<br />

a<br />

b<br />

t<br />

q<br />

V1.1 – 39/ 55<br />

Automaty (nie)deterministyczne – część I<br />

Automaty<br />

Minimalizacja automatów<br />

Minimalizacja automatów – „przykład na oko” i wnioski<br />

Notatki<br />

Analiza stanów q oraz r pozwala je połączyć w jeden stan:<br />

a,b<br />

a<br />

b<br />

a,b<br />

s<br />

r<br />

t<br />

W algorytm minimalizacji można wyróżnić dwie fazy:<br />

1. usunięcia stanów nieosiągalnych,<br />

2. wyznaczenia relacji równoważności ≈ i połączenia ze sobą stanów<br />

równoważnych.<br />

Definicja<br />

Dwa stany p i q są sobie równoważne, gdy:<br />

∀ x∈Σ ⋆δ ⋆ (p, x) ∈ F ⇔ δ ⋆ (q, x) ∈ F .<br />

V1.1 – 40/ 55


Automaty (nie)deterministyczne – część I<br />

Automaty<br />

Minimalizacja automatów<br />

Notatki<br />

Algorytm minimalizacji znajduje wszystkie pary nierównoważnych sobie<br />

stanów. Co oznacza, że pozostałe pary stanów są sobie równoważne i można<br />

je ze sobą połączyć.<br />

Definicja<br />

Jeśli stany p i q nie są sobie równoważne, to istnieje rozróżniające je słowo x,<br />

takie iż:<br />

δ ⋆ (p, x) ∈ F δ ⋆ (q, x) ∈ F .<br />

Ogólna zasada polega na tym, iż zakłada się, że wszystkie stany można<br />

skleić ze sobą. Następnie sukcesywnie wyznaczane są pary stanów nie<br />

równoważnych, w kolejności uwzględniającej rosnącą długości najkrótszych<br />

rozróżniających je słów.<br />

V1.1 – 41/ 55<br />

Automaty (nie)deterministyczne – część I<br />

Automaty<br />

Minimalizacja automatów<br />

Algorytm minimalizacji automatu<br />

Notatki<br />

Poszczególne kroki algorytmu minimalizacji:<br />

(I) tworzona jest tablica wartości logicznych T p,q indeksowaną<br />

nieuporządkowanymi parami {p, q} stanów p, q ∈ Q. Na początku<br />

zakłada się, że T p,q = true dla wszystkich p, q ∈ Q,<br />

(II) dla wszystkich par stanów {p, q}, takich że p ∈ F i q /∈ F zaznaczamy<br />

T p,q = false (jeśli p jest akceptujący, a q nie jest, to te stany są<br />

rozróżniane przez słowo puste λ),<br />

(III) dla wszystkich par stanów {p, q} oraz znaków a ∈ Σ takich, że<br />

T δ(p,a),δ(q,a) = false, zaznaczamy również T p, q = false.<br />

(IV) jeśli w kroku (III) zmieniona została choćby jedną wartość tablicy T z<br />

true na false, to krok (III) należy powtarzać tak długo, aż nie będzie on<br />

powodował żadnych nowym zmian w tablicy T .<br />

V1.1 – 42/ 55


Automaty (nie)deterministyczne – część I<br />

Automaty<br />

Minimalizacja automatów<br />

Minimalizacja – przykład<br />

Notatki<br />

Minimalizacja następującego automatu:<br />

s<br />

a<br />

p<br />

a<br />

b<br />

b<br />

b<br />

b<br />

a<br />

p<br />

F<br />

T<br />

F<br />

q<br />

F<br />

T<br />

r<br />

F<br />

s<br />

r<br />

a<br />

q<br />

Wartości z tabeli T wskazują że należy połączyć stany s i q oraz p oraz r, co<br />

pozwala na podanie poniższego automatu:<br />

s,q<br />

a,b<br />

a,b<br />

p,r<br />

V1.1 – 43/ 55<br />

Automaty (nie)deterministyczne – część I<br />

Automaty<br />

Minimalizacja automatów<br />

Minimalizacja – przykład<br />

Minimalizacja następującego automatu:<br />

q 1<br />

0<br />

1<br />

q 2 q<br />

0 1 3<br />

0<br />

q 4<br />

1<br />

0<br />

0<br />

1 1 0<br />

q 5 q 6 q 7 q 8<br />

1<br />

0<br />

0<br />

1<br />

1<br />

q2 F<br />

q 3 F F<br />

q 4 F F F<br />

q 5 T F F F<br />

q 6 F F F T F<br />

q 7 F F F F F F<br />

q 8 F T F F F F F<br />

q 1 q 2 q 3 q 4 q 5 q 6 q 7<br />

Notatki<br />

Wartości z tabeli T wskazują że należy<br />

połączyć stany q 1 i q 5 , q 2 i q 8 oraz q 4 i q 6 , co<br />

pozwala na podanie poniższego automatu:<br />

1<br />

q 1, q 5<br />

1<br />

0<br />

0 1<br />

0<br />

1 q 2, q 8<br />

0 q 7<br />

1<br />

q 3 0<br />

q 4, q 6<br />

V1.1 – 44/ 55


Automaty (nie)deterministyczne – część I<br />

Ragel<br />

Notatki<br />

Automaty i pakiet<br />

Ragel State Machine Compiler<br />

V1.1 – 45/ 55<br />

Automaty (nie)deterministyczne – część I<br />

Ragel<br />

Możliwości pakietu Ragel<br />

Czas na trochę praktyki: Ragel State Machine Compiler<br />

Ragel to pakiet do kompilacji tzw. maszyn stanu, czyli również automatów.<br />

Pakiet jest dostępny pod adresem: http://www.complang.org/ragel/.<br />

Współpracuje z wieloma językami programowania: C, C++, Objective-C, D,<br />

Java, Ruby, co ważne nie są wymagane żadne dodatkowe pakiety.<br />

Zastosowania to min.:<br />

◮ implementacja protokołów,<br />

◮ analiza danych,<br />

◮ analiza leksykalna języków programowania,<br />

◮ weryfikacja danych wprowadzanych przez użytkownika.<br />

Notatki<br />

Maszyna stanu jest opisana przez:<br />

◮ operatory języka regularnego,<br />

◮ diagramy przejścia,<br />

◮ skanery,<br />

◮ oraz metody łączące powyższe podejścia.<br />

V1.1 – 46/ 55


Automaty (nie)deterministyczne – część I<br />

Ragel<br />

Przykłady zastosowań<br />

Automat dla języka L = (a|b) ⋆ bb<br />

Implementacja funkcji do rozpoznawania języka L = (a|b) ⋆ bb, w notacji<br />

Ragel zapiszemy to jako [ab]*[b][b].<br />

Początek:<br />

Notatki<br />

#include <br />

#include <br />

%%{<br />

}%%<br />

machine lang;<br />

main :=<br />

( [ab]*[b][b] )<br />

0 @{ val = 1; };<br />

%% write data;<br />

Wyrażenia objęte ciągiem %%{ oraz }%% są przetwarzane przez pakiet<br />

Ragel.<br />

V1.1 – 47/ 55<br />

Automaty (nie)deterministyczne – część I<br />

Ragel<br />

Przykłady zastosowań<br />

Automat dla języka L = (a|b) ⋆ bb<br />

Notatki<br />

Postać funkcji main:<br />

int main( int argc, char **argv )<br />

{<br />

int cs, val = 0;<br />

if ( argc > 1 )<br />

{<br />

char *p = argv[1];<br />

char *pe = p + strlen(p) + 1;<br />

%% write init;<br />

%% write exec;<br />

}<br />

printf("result = %i\n", val );<br />

}<br />

return 0;<br />

V1.1 – 48/ 55


Automaty (nie)deterministyczne – część I<br />

Ragel<br />

Przykłady zastosowań<br />

Funkcja typu atoi<br />

Implementacja funkcji atoi, czyli funkcji która zamienia liczbę zapisaną jako<br />

tekst na wartość np.: int (w przykładzie będzie to long long).<br />

Początek:<br />

Notatki<br />

#include <br />

#include <br />

#include <br />

%%{<br />

}%%<br />

machine atoi;<br />

write data;<br />

Wyrażenia objęte za %%{ oraz }%% są przetwarzane przez pakiet Ragel.<br />

Przykład pochodzi ze strony projektu Ragel.<br />

V1.1 – 49/ 55<br />

Automaty (nie)deterministyczne – część I<br />

Ragel<br />

Przykłady zastosowań<br />

Funkcja atoi<br />

long long atoi( char *str ) {<br />

char *p = str, *pe = str + strlen( str );<br />

int cs;<br />

long long val = 0;<br />

bool neg = false;<br />

Notatki<br />

%%{<br />

action see_neg {<br />

neg = true;<br />

}<br />

action add_digit {<br />

val = val * 10 + (fc - ’0’);<br />

}<br />

Przykład pochodzi ze strony projektu Ragel.<br />

V1.1 – 50/ 55


Automaty (nie)deterministyczne – część I<br />

Ragel<br />

Przykłady zastosowań<br />

Funkcja atoi<br />

Notatki<br />

main :=<br />

( ’-’@see_neg | ’+’ )? ( digit @add_digit )+<br />

’\n’;<br />

write init;<br />

write exec;<br />

}%%<br />

if ( neg )<br />

val = -1 * val;<br />

if ( cs < atoi_first_final )<br />

fprintf( stderr, "atoi: there was an error\n" );<br />

};<br />

return val;<br />

Przykład pochodzi ze strony projektu Ragel.<br />

V1.1 – 51/ 55<br />

Automaty (nie)deterministyczne – część I<br />

Ragel<br />

Przykłady zastosowań<br />

Funkcja atoi – funkcja main<br />

Notatki<br />

#define BUFSIZE 1024<br />

int main()<br />

{<br />

char buf[BUFSIZE];<br />

while ( fgets( buf, sizeof(buf), stdin ) != 0 ) {<br />

long long value = atoi( buf );<br />

printf( "%lld\n", value );<br />

}<br />

return 0;<br />

}<br />

Przykład pochodzi ze strony projektu Ragel.<br />

V1.1 – 52/ 55


Automaty (nie)deterministyczne – część I<br />

Ragel<br />

Przykłady zastosowań<br />

Obsługa parametrów z linii komend<br />

Analiza parametrów przekazanych przez linię poleceń:<br />

Notatki<br />

./prog -M 0 --output /dev/xVideo0.<br />

Definicja poszczególnych parametrów obsługiwanych w programie:<br />

string = [^\0]+ >clear $append %term;<br />

help = ( ’-h’ | ’-H’ | ’-?’ | ’--help’ ) 0 @help;<br />

version = ( ’-v’ | ’--version’ ) 0 @version;<br />

output = ’-o’ 0? string 0 @output;<br />

spec = ’-S’ 0? string 0 @spec;<br />

mach = ’-M’ 0? string 0 @mach;<br />

main := (<br />

help |<br />

version |<br />

output |<br />

spec |<br />

mach<br />

)*;<br />

V1.1 – 53/ 55<br />

Przykład pochodzi ze strony projektu Ragel.<br />

Automaty (nie)deterministyczne – część I<br />

Ragel<br />

Przykłady zastosowań<br />

Obsługa parametrów z linii komend<br />

Podjęcie akcji po wykryciu polecenia:<br />

action clear { fsm->buflen = 0; }<br />

action help { printf("help\n"); }<br />

action version { printf("version\n"); }<br />

action output { printf("output: \"%s\"\n", fsm->buffer); }<br />

action spec { printf("spec: \"%s\"\n", fsm->buffer); }<br />

action mach { printf("machine: \"%s\"\n", fsm->buffer); }<br />

Postać funkcji main:<br />

int main( int argc, char **argv ) {<br />

int a; struct params params;<br />

Notatki<br />

params_init( &params );<br />

for ( a = 1; a < argc; a++ )<br />

params_execute( &params, argv[a], strlen(argv[a])+1 );<br />

if ( params_finish( &params ) != 1 )<br />

fprintf( stderr, "params: error processing arguments\n" );<br />

}<br />

return 0;<br />

V1.1 – 54/ 55


Automaty (nie)deterministyczne – część I<br />

A za tydzień na wykładzie<br />

W następnym tygodniu między innymi<br />

Notatki<br />

1. Automaty niedeterministyczne<br />

2. Automaty z przejściami ε<br />

3. Automat potęgowy (konwersja automatu niedeterministycznego na deterministyczny)<br />

4. Języki regularne<br />

5. Regexy w praktyce<br />

6. Więcej przykładów dla Ragel<br />

Dziękuje za uwagę!!!<br />

V1.1 – 55/ 55<br />

Notatki

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!