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 ...
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( ¶ms );<br />
for ( a = 1; a < argc; a++ )<br />
params_execute( ¶ms, argv[a], strlen(argv[a])+1 );<br />
if ( params_finish( ¶ms ) != 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