Teoretická informatika Ladislav Lhotka lhotka@cesnet.cz 2011-12
Zdroje LINZ, P. Formal Languages and Automata, Fourth Edition. Sudbury: Jones and Bartlett, 2006, 415+xiii s. ISBN 07-63-73798-4. CHYTIL, M. Automaty a gramatiky. Praha: SNTL, 1984, 336 s. MELICHAR, B. Jazyky a překlady. Skriptum FEL ČVUT, 2. vydání. Praha: Nakladatelství ČVUT, 2003. 263 s. ISBN 80-01-02776-7. MELICHAR, B. ET AL. Jazyky a překlady: Cvičení. Skriptum FEL ČVUT. Praha: Nakladatelství ČVUT, 2004. 214 s. ISBN 80-01-03031-8. http://moodle.prf.jcu.cz 2
Použité partie z matematiky Konečná matematika, i když často pracujeme s nekonečnými množinami. Výsledky budeme často formulovat formou matematických tvrzení (vět), důkazy ale budou téměř ve všech případech konstruktivní. Často bude použita matematická indukce. množiny relace funkce orientované grafy 3
Množiny prázdná množina, podmnožina A B, vlastní podmnožina A B, průnik A B, sjednocení A B, rozdíl A B, doplněk A. Potenční množina (množina všech podmnožin) množiny A: A počet prvků množiny A Kartézský součin De Morganovy vzorce: 2 A = { B B A }. A B = { (x, y) x X, y Y }. A B = A B, A B = A B. 4
Relace Relace mezi množinami A a B je každá podmnožina kartézského součinu A B. Pokud je A = B relace na množině A. Důležité vlastnosti relací (R je relace na množině A): 1. reflexivita x A : (x, x) R. 2. symetrie x, y A : (x, y) R (y, x) R. 3. tranzitivita x, y, z A : (x, y) R (y, z) R (x, z) R. Reflexivní, symetrická a tranzitivní relace ekvivalence (x y). 5
Funkce Funkce je speciálním případem relace. f: A B, y = f(x) y je obrazem prvku x, x je vzorem prvku y. Parciální funkce: není definováno pro všechna x A Totální funkce: je definováno pro všechna x A Prostá (injektivní) funkce: x x f(x) f(x ) Funkce na množinu B (surjektivní ): Ke každému y B najdeme jeho vzor x A, tj. y = f(x) pro nějaké x A. Bijektivní funkce (bijekce): prostá a na 6
Orientovaný graf Orientovaný graf sestává z neprázdné množiny vrcholů či uzlů libovolně pospojovaných orientovanými hranami. a B b A a C a b a D b b Orientovanou hranu chápeme jako uspořádanou dvojici vrcholů. Cesta délky n (z v 1 do v n+1 ): konečná posloupnost hran (v 1, v 2 ), (v 2, v 3 ),..., (v n, v n+1 ). Cesta se nazývá jednoduchá, když se na ní žádný uzel neopakuje. Kružnice (cyklus) cesta, která se vrací do stejného uzlu. 7
Strom kořen list výška = 3 8
Tři hlavní pojmy Jazyk Gramatika Automat 9
Abeceda, znaky, řetězy Σ abeceda, neprázdná konečná množina znaků (symbolů). Ze znaků sestavujeme konečné posloupnosti řetězy. Příklad: Je-li Σ = {a, b}, pak u = abba a v = aaabba jsou řetězy nad abecedou Σ. u délka řetězu u (počet znaků). Řeckým písmenem λ se označuje prázdný řetěz; λ = 0. Σ... množina všech řetězů nad abecedou Σ. Σ + = Σ {λ}. Σ i Σ + jsou nekonečné množiny, protože délka řetězu není omezena. Podřetěz je řetěz, který je celý obsažen v jiném řetězu. Speciálně, pokud w = vu, označujeme v jako prefix a u jako sufix. 10
Operace s řetězy u = a 1 a 2... a n, v = b 1 b 2... b m jsou řetězy. Zřetězení: uv = a 1 a 2... a n b 1 b 2... b m. Obrácení (reverze): u R = a n a n 1... a 1. Zřejmě platí: λw = wλ = w, uv = u + v, u R = u. Dále značíme: w 2 = ww, w 3 = www, obecně w n = ww w (n-krát), a definujeme w 0 = λ. 11
Jazyk Velmi obecná definice: Jazykem nad abecedou Σ nazveme libovolnou podmnožinu L Σ. Příklady: pro Σ = {a, b} L 1 = {λ, a, aa, b} (konečný) L 2 = { a n b n n 0 } (nekonečný) Řetěz w L nazýváme větou jazyka L. 12
Operace s jazyky Jazyky jsou množiny, můžeme tedy použít množinové operace: L 1 L 2, L 1 L 2, L = Σ L. Zobecnění operací s řetězy: 1. Zřetězení: L 1 L 2 = { uv u L 1, v L 2 } 2. Reverze: L R = { u R u L } 3. Opakování: L n = LL L (n-krát), L 0 = {λ}. (Kleeneův) uzávěr jazyka L: Pozitivní uzávěr jazyka L: L = L 0 L 1 L 2... L + = L 1 L 2 L 3... 13
Příklad 1 Pro L = { a n b n n 0 } snadno odvodíme, že L 2 = { a n b n a m b m n 0, m 0 }, L R = { b n a n n 0 }. Podobně jednoduchý zápis např. pro doplněk L ale nedostaneme. Potřebujeme proto lepší formální nástroje pro reprezentaci jazyků než je množinový zápis. 14
Gramatika Gramatiky podobně jako v přirozených jazycích určují které věty do jazyka patří a které ne. věta holá podmět přísudek podmět λ zájmeno podstatné jméno přísudek sloveso Definice 1 Gramatika G je definována jako uspořádaná čtveřice kde G = (V, T, S, P), V je neprázdná konečná množina proměnných, T je konečná množina koncových (terminálních) symbolů, S V je speciální proměnná zvaná počáteční (startovní) proměnná, P je konečná množina přepisovacích pravidel (produkcí). 15
Přepisovací pravidla Přepisovací pravidla se zapisují stylem x y, kde x (V T) + a y (V T). Používají se takto: Máme-li řetěz w ve tvaru w = uxv, říkáme, že produkce x y je aplikovatelná na w a w můžeme přepsat na nový řetěz z = uyv. V takovém případě říkáme, že řetěz z lze přímo odvodit z w. Zápis: w z. Pokud má gramatika více produkcí, můžeme pro přepis v každém kroku použít kteroukoli z nich (nedeterminismus!). Posloupnost odvození w 1 w 2 w n znamená, že w n lze odvodit z w 1. Zápis: w 1 wn. 16
Jazyk generovaný gramatikou Množina všech řetězů, které lze odvodit z počáteční proměnné. Definice 2 Nechť G = (V, T, S, P) je gramatika. Množinu L(G) = { w T S w } nazýváme jazykem generovaným gramatikou G. Je-li w L(G), pak S w 1 w 2 w nazýváme odvozením (derivací) věty w pomocí gramatiky G. Mezistupně S, w 1, w 2 atd. se nazývají větné formy tohoto odvození. Pro mnohé jazyky lze najít více gramatik, které je generují. Pokud tedy máme dvě gramatiky G 1 a G 2 takové, že L(G 1 ) = L(G 2 ), říkáme, že tyto gramatiky jsou ekvivalentní. 17
Příklad 2 Uvažujme gramatiku G = ({S}, {a, b}, S, P) s těmito přepisovacími pravidly: S asb, Jaký jazyk generuje? S λ. Zkrácený zápis: Pravidla se shodnou levou stranou se zapisují dohromady, pravé strany se oddělují svislou čarou. Produkce z příkladu 2 tedy můžeme zapsat takto: S asb λ. 18
Automat Abstraktní model konkrétního algoritmu nebo celého digitálního počítače. Vstupní data Řídící jednotka Pamět 19
Vlastnosti automatu Vstupní soubor na začátku obsahuje řetěz znaků z nějaké abecedy, automat jej může pouze sekvenčně číst od prvního znaku k poslednímu (a rozpozná konec vstupu). Paměť může mít různé vlastnosti a nemusí být vůbec přítomna. Automat z ní může číst a do ní zapisovat (měnit obsah). Paměťové buňky (obvykle bez omezení počtu) obsahují znaky z nějaké abecedy, která nemusí být stejná jako vstupní abeceda. Řídící jednotka má konečný počet vnitřních stavů a zařízení pro vstup a výstup. Automat pracuje v diskrétních krocích. V každém kroku je automat v nějakém vnitřním stavu a čte znak ze vstupního souboru. Postup výpočtu je určen přechodovou funkcí, která na základě aktuálního stavu, čteného vstupního symbolu a obsahu paměti určí nový stav řídící jednotky. Konfigurace automatu je dána vnitřním stavem řídící jednotky, a obsahy dosud nepřečtené části vstupního souboru a paměti. Přechod od jedné konfigurace k jiné se někdy nazývá tah automatu. 20
Deterministický a nedeterministický automat Deterministický následující tah je vždy jednoznačně určen aktuální konfigurací. Nedeterministický některé konfigurace umožňují více různých tahů. Vztah mezi deterministickými a nedeterministickými verzemi automatů tvoří důležitou součást teorie automatů. 21
Příklad 3 Identifikátor v jazyku C se tvoří podle těchto dvou pravidel: 1. Identifikátor je posloupnost písmen, číslic a podtržítka. 2. Na začátku musí být písmeno nebo podtržítko. Gramatika: identifikátor písmeno zbytek zbytek zbytek písmeno zbytek číslice zbytek písmeno a b... z A B... Z číslice 0 1 2 3 4 5 6 7 8 9 zbytek λ Automat: písmeno nebo 1 2 písmeno, číslice nebo 22
Konečný automat Vstupní data 1 0 1 1 0 Řídící jednotka 1 q 2 1 q 0 0 q 1 0 Konečný automat čte sekvenčně znaky vstupního řetězu, podle přečteného znaku a aktuálního stavu řídící jednotky přechází do nového stavu. Konečný automat nemá žádnou paměť. 23
Deterministický konečný automat Definice 3 Deterministickým konečným automatem (DFA) nazýváme uspořádanou pětici M = (Q, Σ, δ, q 0, F), kde Q je neprázdná konečná množina zvaná množina vnitřních stavů, Σ je konečná množina zvaná vstupní abeceda, δ: Q Σ Q je totální funkce zvaná přechodová funkce, q 0 Q je počáteční stav, F Q je množina koncových stavů (cílová množina) 24
Činnost konečného automatu 1. Na počátku je automat v počátečním stavu q 0 a na začátku vstupního souboru (čte první symbol vstupního řetězu). 2. V každém kroku se přečte jeden symbol v pořadí ze vstupního souboru a podle tohoto symbolu a aktuálního vnitřního stavu přejde automat do nového vnitřního stavu. 3. Pokud je automat na konci vstupního souboru a nachází se v koncovém stavu, je vstupní řetěz přijat, v opačném případě (tj. když automat je v jiném než koncovém stavu) je vstupní řetěz odmítnut. Automat, který pouze přijímá anebo odmítá vstupní řetězec, se někdy také nazývá akceptér. 25
Přechodový graf Každý stav DFA je reprezentován jedním vrcholem grafu, pro každý vstupní symbol vychází z každého vrcholu právě jedna hrana označená příslušným vstupním symbolem. Hrana (q i, q j ) označená symbolem a Σ se v přechodovém grafu nachází právě tehdy, když δ(q i, a) = q j. q 0 q počáteční stav je označen šipkou, koncový stav je označen dvojitým kroužkem. 26
Příklad 4 M = ({q 0, q 1, q 2 }, {0, 1}, δ, q 0, {q 1 }), přechodová funkce δ je definována tímto výčtem: δ(q 0, 0) = q 0, δ(q 0, 1) = q 1, δ(q 1, 0) = q 0, δ(q 1, 1) = q 2, δ(q 2, 0) = q 2, δ(q 2, 1) = q 1. 0 0 1 0 q 0 q 1 q 2 1 1 27
Rozšířená přechodová funkce δ δ : Q Σ Q Druhým argumentem je řetěz, a hodnotou δ (q, w) je stav, do něhož se automat dostane (ve více krocích) ze stavu q přečtením řetězu w. Formální definice pro všechna q Q, w Σ, a Σ je funkce δ definována tímto rekurzivním předpisem: δ (q, λ) = q, δ (q, wa) = δ(δ (q, w), a). Speciálně pro v = 1 platí δ (q, v) = δ(q, v) pro všechna q. 28
Jazyk přijímaný konečným automatem Množina všech řetězů, které daný konečný automat přijímá. Definice 4 Jazykem přijímaným (rozpoznávaným) deterministickým konečným automatem M = (Q, Σ, δ, q 0, F) je množina L(M) = { w Σ δ (q 0, w) F }. Funkce δ i δ jsou totální, to znamená, že každý řetěz w Σ patří buď do L(M) anebo do L(M) = { w Σ δ (q 0, w) / F }. 29
Příklad 5 Deterministický konečný automat M: a a,b q 0 b q 1 a,b q 2 30
Příklad 5 Deterministický konečný automat M: a a,b q 0 b q 1 a,b q 2 L(M) = { a n b n 0 }. Přechodová tabulka: a b q 0 q 0 q 1 q 1 q 2 q 2 q 2 q 2 q 2 31
Vztah mezi DFA a přechodovým grafem Věta 1 Nechť M = (Q, Σ, δ, q 0, F) je deterministický konečný automat a G M jemu odpovídající přechodový graf. Potom pro každé q 1, q 2 Q a w Σ je δ (q 1, w) = q 2 právě tehdy, když v grafu G M existuje orientovaná cesta z vrcholu q 1 do q 2, jejíž hrany jsou postupně označeny všemi symboly řetězu w. 32
Regulární jazyk Uvažujeme-li všechny možné DFA, tvoří jimi přijímané jazyky určitou třídu jazyků se specifickými vlastnostmi. Definice 5 Jazyk L se nazývá regulární, pokud existuje takový deterministický konečný automat M, že platí L = L(M). 33
Nedeterministický konečný automat Definice 6 Nedeterministickým konečným automatem (NFA) nazýváme uspořádanou pětici M = (Q, Σ, δ, q 0, F), kde Q, Σ, q 0 a F jsou definovány stejně jako u DFA, liší se pouze předpis pro přechodovou funkci: Rozdíly: δ: Q (Σ {λ}) 2 Q. 1. NFA může mít pro daný stav a vstupní symbol na výběr několik možných tahů. 2. Druhým argumentem přechodové funkce může být λ, tj. δ(q i, λ) = q j. NFA tedy může přejít do nového stavu, aniž by zkonzumoval vstupní symbol. 3. Hodnotou přechodové funkce může být prázdná množina, tj. δ(q i, a) =. Pro takovou dvojici q i a a tedy není definován žádný přechod. V přechodovém grafu takové hrany vynecháváme. 34
Jak NFA rozpoznává řetězy? Vstupní řetěz je přijat nedeterministickým konečným automatem právě tehdy, když existuje nějaká posloupnost možných tahů, které načtou celý vstupní řetěz, přivedou NFA do některého koncového stavu. Pokud žádná taková posloupnost neexistuje, vstupní řetěz je odmítnut. 35
Příklad 6 (a) a q 1 a q 2 a q 3 q 0 a a q 4 q 5 a (b) 0 q 0 1 q 1 0,1 q 2 λ 36
Rozšířená přechodová funkce Hodnotami jsou množiny stavů: δ (q i, w) = Q j Q. Definice 7 Pro daný nedeterministický konečný automat M definujeme rozšířenou přechodovou funkci δ : Q Σ 2 Q takto: Pro každé dva stavy q i a q j a řetěz w Σ je q j δ (q i, w) právě tehdy, když v přechodovém grafu existuje cesta z q i do q j označkovaná symboly řetězu w (popřípadě s vloženým λ-přechody). Existenci cesty můžeme zjistit v konečném počtu kroků, jen musíme dát pozor na cykly označkované samými λ. 37
Jazyk přijímaný NFA Definice 8 Jazyk L přijímaný nedeterministickým konečným automatem M = (Q, Σ, δ, q 0, F) je množina všech řetězů přijímaných tímto automatem, tedy L(M) = { w Σ δ (q 0, w) F }. Je to tedy množina všech řetězů w takových, že pro ně existuje v přechodovém grafu cesta označkovaná symboly řetězu w a vedoucí z počátečního vrcholu do některého koncového vrcholu. 38
K čemu je nedeterminismus? 1. Pro některé jazyky (viz třeba příklad 6 (a)) se snáze najde NFA než DFA. 2. V gramatikách se nedeterminismus (alternativy) vyskytuje často, například podmět podstatné jméno zájmeno. 3. Mnohé vlastnosti jazyků a teoretické výsledky se snáze ukazují pro NFA než pro DFA. 4. V některých algoritmech (např. hry) je mnohdy více možností postupu, přitom ale není dopředu jasné, která je správná. Při praktické realizaci se využívá backtracking, NFA ale modeluje procházení všech variant zároveň. 39
Ekvivalence konečných automatů Definice 9 Řekneme, že dva konečné automaty M 1 a M 2 jsou ekvivalentní, pokud oba přijímají stejný jazyk, tj. L(M 1 ) = L(M 2 ). Příklad 7: Následující automat je ekvivalentní automatu z příkladu 2.3 (b). Oba přijímají jazyk { (10) n n 0 }. 0,1 0 q 0 1 q 1 1 q 2 0 40
Příklad 8 a 0 λ 1 a a λ a b 4 b b 2 a 3 a,b 41
Příklad 9 Najděte ekvivalentní DFA k tomuto NFA: b q 0 a q 1 λ q 2 a 42
Výsledek: b {q 0 } {q 1,q 2 } a a b a,b 43
Ekvivalence tříd NFA a DFA Věta 2 Nechť L je jazyk přijímaný nedeterministickým konečným automatem M N = (Q N, Σ, δ N, q 0, F N ). Potom existuje deterministický konečný automat M D = (Q D, Σ, δ D, {q 0 }, F D ) takový, že L = L(M D ). Přímý důsledek: Každý jazyk rozpoznávaný NFA je regulární. 44
Procedura NFA DFA Vytvoř graf G D s jediným (počátečním) vrcholem označeným {q 0 }. Pokud M N přijímá λ, označ {q 0 } také jako koncový vrchol. Opakuj následující kroky i iv tak dlouho, dokud chybí některá z hran: (i) Vezmi libovolný vrchol {q i, q j,..., q k } jemuž chybí výstupní hrana pro nějaké a Σ. (ii) Urči δ N (q i, a), δ N (q j, a),..., δ N (q k, a). Nechť δ N(q i, a) δ N(q j, a) δ N(q k, a) = {q l, q m,..., q n }. (iii) Vytvoř nový vrchol grafu G D označený {q l, q m,..., q n }, pokud ještě neexistuje. (iv) Přidej do grafu G D hranu z {q i, q j,..., q k } do {q l, q m,..., q n } a označ ji symbolem a. Každý vrchol grafu G D jehož označení obsahuje aspoň jeden q f F N označ jako koncový vrchol. 45
Regulární výrazy Pomocí symbolů abecedy Σ, závorek a operátorů + (sjednocení), (zřetězení) a (uzávěr) můžeme definovat složitější jazyky jako kombinace jednodušších. Regulární výraz Jazyk a {a} a + b + c {a, b, c} (a + (b c)) {λ, a, bc, aa, abc, bca, bcbc, aaa, aabc,...} 46
Definice 10 Nechť Σ je abeceda. Potom 1., λ, a a (pro každé a Σ) jsou regulární výrazy říkáme jim primitivní regulární výrazy. 2. Jsou-li r 1 a r 2 regulární výrazy, pak jsou jimi také r 1 + r 2, r 1 r 2, r 1 a (r 1). 3. Řetěz je regulárním výrazem právě tehdy, když je možno jej odvodit z primitivních regulárních výrazů konečným počtem použití pravidel uvedených v bodu 2. Příklad: (a + b c) (c + ) je regulární výraz nad abecedou Σ = {a, b, c}. 47
Jazyk reprezentovaný regulárním výrazem Definice 11 Jazyk L(r) reprezentovaný regulárním výrazem r je definován následujícími pravidly: 1. Regulární výraz označuje prázdný jazyk. 2. Regulární výraz λ označuje jazyk {λ}. 3. Pro každé a Σ označuje regulární výraz a jednoprvkový jazyk {a}. 4. Jsou-li r 1 a r 2 regulární výrazy, pak L(r 1 + r 2 ) = L(r 1 ) L(r 2 ), L(r 1 r 2 ) = L(r 1 )L(r 2 ), L((r 1 )) = L(r 1 ), L(r 1) = (L(r 1 )). 48
Priorita operací, zjednodušení Abychom nemuseli používat příliš závorek, definujeme prioritu operací: má nejvyšší prioritu, má vyšší prioritu než +. Například a + b c tedy znamená totéž jako a + (b (c) ). Další zjednodušující konvence: operátor vynecháváme, takže ab = a b. Příklad 10: Je-li Σ = {0, 1}, najděte regulární výraz pro jazyk, v němž každý řetěz má v sobě alespoň jeden pár po sobě jdoucích nul. [Výsledek: (0 + 1) 00(0 + 1) ] 49
Regulární výrazy reprezentují regulární jazyky Věta 3 Pro každý regulární výraz r existuje nedeterministický konečný automat, který přijímá jazyk L(r). Jinými slovy, L(r) je regulární jazyk. Znázornění NFA pro libovolný regulární výraz r : M(r) Automaty pro primitivní regulární výrazy λ a q 0 q 1 q 0 λ q 1 q 0 a q 1 50
Automat pro alternativu r 1 + r 2 M(r 1 ) λ λ λ M(r 2 ) λ 51
Automat pro zřetězení r 1 r 2 M(r 1 ) M(r 2 ) λ λ λ 52
Automat pro uzávěr r λ λ M(r) λ λ 53
Zobecněný přechodový graf Dále budeme chtít k danému NFA M zkonstruovat regulární výraz r takový, že L(M) = L(r). Půjde v podstatě o obrácení postupu konstrukce v důkazu věty 3: automaty, které reprezentují primitivní regulární výrazy, budeme postupně agregovat. Zobecněný přechodový graf (GTG, generalized transition graph) má hrany označené regulárními výrazy. Například: a a+b c Přechodový graf NFA můžeme považovat za GTG. Pro zjednodušení teoretických úvah budeme vždy pracovat s plnými GTG, které mají pro každou uspořádanou dvojici vrcholů právě jednu hranu. (Počet hran v úplném grafu s n vrcholy je n 2.) 54
Příklad 11 b b q 1 q 1 a c d a c d q 0 q 2 q 0 q 2 55
Obecný dvoustavový automat odpovídá regulárnímu výrazu r 1 r 4 r 3 q 0 q 1 r 2 r = r 1r 2 (r 4 + r 3 r 1r 2 ) 56
Příklad 12 f q 1 b a c d q 0 e i h q 2 g 57
Příklad 12 f q 1 b a c d e+af b g+df c i+df b q 0 q 2 i h+af c q 0 q 2 e h g 58
Procedura NFA RE Začni s NFA se stavy q 0, q 1,...,q n a jediným koncovým stavem q n. Převeď NFA na úplný zobecněný přechodový graf, v němž je mezi každými dvěma vrcholy q i a q j právě jedna hrana označená r ij. Má-li graf pouze dva vrcholy (tj. n = 1), výstupem algoritmu je regulární výraz r = r 00r 01 (r 11 + r 10 r 00r 01 ). Má-li graf pouze tři vrcholy (tj. n = 2), zaveď nové označení všech hran mezi vrcholy q i a q i, kde i = 0, 2 a j = 0, 2: r ij + r i1 r 11r 1j. Potom zruš vrchol q 1 se všemi jeho hranami a jdi na. Má-li graf čtyři nebo více vrcholů (tj. n 3), zvol k likvidaci libovolný vrchol q k, kde 0 < k < n: Pro všechny dvojice stavů (q i, q j ), kde i k a j k, aplikuj postup z kroku a podle nového počtu vrcholů pak buď přejdi na nebo opakuj. 59
Zjednodušování regulárních výrazů V průběhu celého algoritmu je možné a vhodné při každé agregaci regulárních výrazů v krocích použít zjednodušující vzorce r + = r, r =, rλ = r, = λ. 60
Formulace výsledku Věta 4 Je-li L regulární jazyk, pak existuje regulární výraz r takový, že L = L(r). Věty 3 a 4 tedy říkají, že třída jazyků definovaných regulárním výrazem je shodná s třídou regulárních jazyků. 61
Příklad 13 Najděte regulární výraz pro jazyk L nad abecedou Σ = {a, b} obsahující slova se sudým počtem symbolů a a lichým počtem symbolů b. LS SS a a b b b b a a LL SL 62
aa SS b b ba ab a a LL bb SL 63
aa SS b b ba ab a a LL bb SL aa+ab(bb) ba SS b+a(bb) ba b+ab(bb) a SL a(bb) a 64
aa SS b b ba ab a a LL bb SL aa+ab(bb) ba SS b+a(bb) ba b+ab(bb) a SL a(bb) a (aa + ab(bb) ba) (b + ab(bb) a) (a(bb) a + (b + a(bb) ba)(aa + ab(bb) ba) (b + ab(bb) a)) 65
Shrnutí Věta 5 Pro každý regulární jazyk L existuje regulární výraz r takový, že L = L(r). 66
Gramatika Definice 12 Gramatika G je definována jako uspořádaná čtveřice kde G = (V, T, S, P), V je neprázdná konečná množina proměnných, T je konečná množina koncových (terminálních) symbolů, S V je speciální symbol zvaný počáteční (startovní) proměnná, P je konečná množina přepisovacích pravidel (produkcí). 67
Přepisovací pravidla Přepisovací pravidla se zapisují stylem x y, kde x (V T) + a y (V T). Používají se takto: Máme-li řetěz w ve tvaru w = uxv, říkáme, že produkce x y je aplikovatelná na w a w můžeme přepsat na nový řetěz z = uyv. V takovém případě říkáme, že řetěz z lze přímo odvodit z w. Zápis: w z. Pokud má gramatika více produkcí, můžeme pro přepis v každém kroku použít kteroukoli z nich (nedeterminismus!). Posloupnost odvození w 1 w 2 w n znamená, že w n lze odvodit z w 1. Zápis: w 1 wn. 68
Jazyk generovaný gramatikou Množina všech řetězů, které lze odvodit z počáteční proměnné. Definice 13 Nechť G = (V, T, S, P) je gramatika. Množinu L(G) = { w T S w } nazýváme jazykem generovaným gramatikou G. Je-li w L(G), pak S w 1 w 2 w nazýváme odvozením (derivací) věty w pomocí gramatiky G. Mezistupně S, w 1, w 2 atd. se nazývají větné formy tohoto odvození. Pro mnohé jazyky lze najít více gramatik, které je generují. Pokud tedy máme dvě gramatiky G 1 a G 2 takové, že L(G 1 ) = L(G 2 ), říkáme, že tyto gramatiky jsou ekvivalentní. 69
Regulární gramatiky Třetí způsob reprezentace regulárních jazyků. Definice 14 1. Gramatika G = (V, T, S, P) se nazývá pravá lineární, pokud jsou všechny její produkce v jednom z následujících dvou tvarů: kde A, B V a x T. A xb, A x. 2. Gramatika se nazývá levá lineární, pokud jsou všechny její produkce v jednom z následujících dvou tvarů: A Bx, A x. 3. Gramatika se nazývá regulární, pokud je buď pravá lineární nebo levá lineární. 70
Příklad 14 Gramatika G 1 = ({S}, {a, b}, S, P 1 ), kde P 1 obsahuje jedinou produkci S abs a, je pravá lineární. Gramatika G 2 = ({S, S 1, S 2 }, {a, b}, S, P 2 ) s produkcemi S S 1 ab, S 1 S 1 ab S 2, S 2 a, je levá lineární. 71
Příklad 15 Gramatika G = ({S, A, B}, {a, b}, S, P) s produkcemi není regulární. S A, A ab λ, B Ab, Takováto gramatika se nazývá lineární na pravé straně všech produkcí se může vyskytovat nejvýše jedna proměnná, ale může být kdekoli. 72
Regulární gramatiky a regulární jazyky Věta 6 Nechť G = (V, T, S, P) je pravá lineární gramatika. Potom L(G) je regulární jazyk. Zkonstruujeme NFA, který bude simulovat odvozování věty v gramatice. A ab A a B 73
Příklad 16 Zkonstruujte konečný automat přijímající jazyk generovaný gramatikou V 0 av 1, V 1 abv 0 b, kde V 0 je počáteční proměnná. 74
Příklad 16 Zkonstruujte konečný automat přijímající jazyk generovaný gramatikou V 0 av 1, V 1 abv 0 b, kde V 0 je počáteční proměnná. V a 0 V b 1 V f b a 75
Věta 7 Je-li L regulární jazyk nad abecedou Σ, pak existuje pravá lineární gramatika G = (V, Σ, S, P) taková, že L = L(G). Obrácení postupu konstrukce použité u věty 4.2. 76
Příklad 17 Zkonstruujte pravou lineární gramatiku pro L(aab a). 77
Příklad 17 Zkonstruujte pravou lineární gramatiku pro L(aab a). q 0 a q 1 a q 2 a q f b q 0 aq 1 q 1 aq 2 q 2 a bq 2 78
Místo pravé lineární gramatiky lze použít i levou lineární. Věta 8 Jazyk L je regulární právě tehdy, když existuje levá lineární gramatika G taková, že L = L(G). Souhrnné tvrzení: Věta 9 Jazyk L je regulární právě tehdy, když existuje regulární gramatika G taková, že L = L(G). 79
Vlastnosti regulárních jazyků 1. Které operace s regulárními jazyky dají jako výsledek regulární jazyk? 2. Můžeme rozhodnout, zda má daný jazyk určité vlastnosti? 3. Můžeme rozhodnout, jestli je jazyk regulární nebo ne? 80
Uzavřenost vůči základním operacím Věta 10 Jsou-li L 1 a L 2 regulární jazyky, pak také L 1 L 2, L 1 L 2, L 1 L 2, L 1, L 1 a LR 1 jsou regulární jazyky. 81
Práce s regulárními jazyky Tři základní typy otázek (pro jakýkoli jazyk): příslušnost: počet prvků: Patří daný řetěz do jazyka? Je jazyk prázdný, konečný nebo nekonečný? rovnost jazyků: Jsou dva zadané jazyky stejné nebo ne? 82
Příslušnost Věta 11 Je-li regulární jazyk L nad abecedou Σ zadán jednou ze standardních reprezentací, potom existuje algoritmus, který pro každý řetěz w Σ určí, zda je w L anebo není. Standardní reprezentace regulárního jazyka: konečný automat (DFA nebo NFA), regulární výraz regulární gramatika 83
Počet prvků Věta 12 Existuje algoritmus, který určí, zda je daný regulární jazyk prázdný, konečný anebo nekonečný. 1. Neprázdný: V grafu DFA existuje aspoň jedna cesta z počátečního vrcholu do nějakého koncového vrcholu. 2. Nekonečný: V grafu DFA najdeme všechny cykly; pokud některý cyklus leží na cestě z počátečního do koncového vrcholu, je jazyk nekonečný, jinak je konečný. 84
Rovnost jazyků Věta 13 Pro každou dvojici regulárních jazyků L 1 a L 2 existuje algoritmus, který rozhodne, zda L 1 = L 2 anebo ne. L 1 = L 2 právě když L je neprázdný. L = (L 1 L 2 ) (L 2 L 1 ) 85
Jak poznat neregulární jazyk? Dirichletův princip (pigeonhole principle): Máme-li rozdělit m předmětů do n přihrádek, přičemž je m > n, musí být alespoň v jedné přihrádce více než jeden předmět. Příklad 18: Rozhodněte, zda je jazyk L = { a n b n n 0 } regulární. 86
Pumpovací lemma Věta 14 Nechť L je nekonečný regulární jazyk. Potom existuje přirozené číslo m N takové, že všechny řetězy w o délce alespoň m ( w m) lze napsat ve tvaru w = xyz, kde xy m, y 1 a navíc pro všechna i 0 platí w i = xy i z L. Je-li počet stavů konečného automatu n, volíme m = n + 1. q 0 x q y r q r z q f Opakování musí nastat nejpozději v (n + 1). vrcholu, takže xy m. 87
Příklad 19 Pomocí pumpovacího lemmatu ukážeme, že následující jazyky nejsou regulární: L 1 = { a n b n n 0 } L 2 = { ww R w {a, b} } L 3 = { w {a, b} n a (w) < n b (w) } (n x (w) je počet výskytů symbolu x v řetězu w). 88
Použití pumpovacího lemmatu Pumpovací lemma je jen jednosměrná implikace: Je-li L regulární jazyk, pak.... Důkaz neregularity jazyka děláme sporem: předpokládáme, že zadaný jazyk je regulární a najdeme vhodný řetěz w, který po přiměřeném napumpování vypadne z jazyka. Postup důkazu si lze představit jako hru: 1. Protivník nám zadá m. 2. Já musím najít vhodný řetěz w délky aspoň m (stačí jeden). 3. Protivník zvolí rozklad w = xyz. 4. Já vyberu i 0 tak, aby xy i z / L. 89
Bezkontextové jazyky Přepisovací pravidla jsou pouze tvaru X γ, kde X je proměnná a γ řetěz terminálních symbolů a proměnných. Důležité vlastnosti: Když se během posloupnosti přepisů někde objeví terminální symbol, už tam zůstane. Přepisy různých proměnných jsou navzájem nezávislé: Máme-li řetěz ζxηyξ, můžeme postupně přepisovat proměnné X a Y v libovolném pořadí. 90
Příklad 20 Nechť Σ = {a, b}. Následující jazyky jsou bezkontextové: { a n b n n 0 } { a m b n m n } { ww R w Σ } 91
Příklad 20 Nechť Σ = {a, b}. Následující jazyky jsou bezkontextové: { a n b n n 0 } { a m b n m n } { ww R w Σ } S asb λ S AS 1 S 1 B S asa bsb λ S 1 as 1 b λ A aa a B bb b 92
Příklad 21 G = ({A, B, S}, {a, b}, S, P) 1. S AB 2. A aaa 3. A λ 4. B Bb 5. B λ Dvě různá odvození stejného řetězu aab: S 1 AB 2 aaab 3 aab 4 aabb 5 aab S 1 AB 4 ABb 2 aaabb 5 aaab 3 aab 93
Levé a pravé odvození Definice 15 Odvození nazveme levým, pokud se v každém kroku přepisuje vždy první (levou) proměnnou. Odvození nazveme pravým, pokud se v každém kroku přepisuje vždy poslední (pravou) proměnnou. Tímto způsobem lze efektivně zmenšit počet stupňů volnosti při odvozování. 94
Derivační strom Odvození (derivaci) slova lze graficky znázornit pomocí derivačního stromu (derivation tree, parse tree). Každému použitému přepisovacímu pravidlu v něm odpovídá právě jeden vrchol označený proměnnou na levé straně s dětmi označenými symboly, které jsou na pravé straně. Například pravidlu A ababc odpovídá fragment stromu A a b A B c 95
Definice 16 Nechť G = (V, T, S, P) je bezkontextová gramatika. Derivačním stromem gramatiky G nazveme orientovaný strom s těmito vlastnostmi: 1. Každý list je označen symbolem z množiny T {λ}. 2. Každý vnitřní vrchol (tj. kromě listů) je označen proměnnou. 3. Kořen je označen počátečním proměnnou S. 4. Je-li některý vrchol označen proměnnou A V a jeho potomci symboly (zprava doleva) α 1, α 2,..., α n, musí množina P obsahovat přepisovací pravidlo A α 1 α 2 α n. 5. List označený symbolem prázdného řetězu λ nemá sourozence. 96
Parciální derivační strom: nemusí platit 3 (kořen je pak označen libovolnou proměnnou) a místo 1 je splněna podmínka 1a. Každý list je označen symbolem z množiny V T {λ}. Řetěz, který dostaneme čtením všech listů derivačního stromu zleva doprava listy označené λ přitom vynecháváme se nazývá výsledek derivačního stromu. zleva doprava = prohledávání do hloubky (depth-first), přičemž ze všech dosud neprozkoumaných sourozenců vždy bereme toho nejvíc vlevo. Příklad 22: Zkonstruujeme derivační strom pro gramatiku s pravidly a řetěz abbbb. S aab A bbb B A λ 97
S a A B b B b A λ b B b λ 98
Vztah gramatiky a derivačního stromu Věta 15 Nechť G = (V, T, S, P) je bezkontextová gramatika. Potom pro každé w L(G) existuje derivační strom gramatiky G, jehož výsledkem je w. Obráceně, výsledkem libovolného derivačního stromu je věta patřící do L(G). Navíc, je-li T G nějaký parciální derivační strom gramatiky G, jehož kořenem je S, pak výsledkem stromu T G je větnou formou gramatiky G. 99
Syntaktická analýza (parsing) Teorie formálních jazyků má největší uplatnění při návrhu programovacích jazyků. Rozlišují se syntaktická a sémantická pravidla. ckar c; c = 3.14; Pro syntaktická pravidla se využívají (bezkontextové) gramatiky (Backus- Naurova Forma), pro sémantická zatím žádný obecně přijatý formalismus neexistuje. Pro syntaktickou analýzu je třeba kromě určení, zda w L(G), také najít odvození S w, tj. určit, z jakých syntaktických celků se w skládá (klíčové slovo, operátor, číslo,...). 100
Analýza všech možností 1. Vezmeme všechna pravidla tvaru S x 1, kde x 1 (V T). 2. Pro všechna taková x 1 vezmeme všechna pravidla tvaru A 1 x 2, kde A 1 je první proměnná v x 1 (nejvíc vlevo). 3.... Pokud se některou cestou dostaneme až ke slovu w, máme hledané (levé) odvození. Dospějeme-li k řetězu, z něhož určitě nelze w odvodit, větev ukončíme. Tento přístup se též nazývá analýza hrubou silou. Jde o typ analýzy shora dolů. Příklad 23: Najdeme odvození slova aabb v gramatice S SS asb bsa λ. 101
Nevýhoda #1: hledání nemusí skončit Pokud w / L(G), můžeme vytvářet stále delší cesty a nikdy nedospět k cíli v příkladu 23 se to stane s řetězcem abb. Tento problém nenastane, pokud gramatiku upravíme tak, aby neobsahovala žádná vypouštějící a jednotková pravidla. V příkladu 23 dostaneme: S SS asb bsa ab ba Věta 16 Nechť G = (V, T, S, P) je bezkontextová gramatika, která neobsahuje žádná pravidla tvaru A λ ani A B, kde A, B V. Algoritmus analýzy všech možností je pak schopen pro každý řetěz w T rozhodnout, zda w patří anebo nepatří do L(G). Délka libovolné cesty je maximálně 2 w. 102
Nevýhoda #2: exponenciální složitost V každém kroku algoritmu můžeme v nejhorším případě použít všechna přepisovací pravidla gramatiky. V prvním kroku tak můžeme mít až P větví, ve druhém P 2, ve druhém P 3, atd. Celý algoritmus tedy může posuzovat až P + P 2 + P 3 + + P 2 w = P P 2 w 1 P 1. řetězů. S rostoucím w tedy narůstá složitost algoritmu až exponenciálně. Obvykle to není tak zlé, ale algoritmus v žádném případě není efektivní. Věta 17 Pro každou bezkontextovou gramatiku existuje algoritmus, který libovolné slovo w syntakticky zanalyzuje v počtu kroků úměrném w 3. To už je lepší, chtěli bychom ale pokud možno lineární složitost. 103
s-gramatika Definice 17 Bezkontextová gramatika G = (V, T, S, P) se nazývá jednoduchá neboli s-gramatika, pokud jsou všechna přepisovací pravidla tvaru A ax kde A V, a T a x V, a navíc se každá taková dvojice (A, a) vyskytuje v P nejvýše jednou. Přepisujeme-li odleva, máme vždy jen jednu možnost a v každém kroku přibude v levé části jeden terminál složitost je tedy lineární. Klíčová slova v programovacích jazycích proto významně zjednodušují syntaktickou analýzu, např. příkaz while ::= while podmínka příkaz 104
Nejednoznačnost gramatik Může se stát, že pro nějaký řetěz existuje několik (mnoho) různých odvození. To někdy nevadí, někdy to ale může změnit význam řetězu. Definice 18 Bezkontextová gramatika G se nazývá nejednoznačná (ambiguous), pokud existuje aspoň jeden řetěz w L(G), který má dva nebo více různých derivačních stromů. 105
Příklad 24 Uvažujme gramatiku G = ({E, I}, {a, b, c, +,, (, )}, E, P) s těmito přepisovacími pravidly: E I, E E + E, E E E, E (E), I a b c. Tato gramatika je nejednoznačná. 106
Dvě odvození výrazu a + b c E E E + E E E I E E E + E I a I I I I c b c a b 107
Jednoznačná verze E T, E T F, F I, E + T E E + T, T T F, T T F F (E), I a b c. F F I I I c a b 108
Definice 19 Bezkontextový jazyk L se nazývá jednoznačný, pokud existuje alespoň jedna jednoznačná gramatika G generující jazyk L. Pokud žádná taková gramatika neexistuje, nazývá se jazyk L vnitřně nejednoznačný (inherently ambiguous). Příklad 25: Tento jazyk je vnitřně nejednoznačný: L = { a n b n c m } { a n b m c m } Všechny řetězy tvaru a n b n c n mají dvojí odvození. 109
Zjednodušování bezkontextových gramatik Bezkontextové gramatiky mohou mít na pravé straně obecně jakoukoli kombinaci proměnných a terminálů. Některé typy pravidel ale někdy působí problémy (viz pravidla A λ a A B u parsingu hrubou silou) jak se ukazuje, některých takových problematických pravidel se lze zbavit a zkonstruovat ekvivalentní gramatiku, která je neobsahuje. Dvě tzv. normální formy gramatik: Chomskyho normální forma (CNF) Normální forma Greibachové (GNF) 110
λ-free jazyky Pokud jazyk L obsahuje λ a G = (V, T, S, P) je gramatika pro L {λ}, pak gramatiku pro L dostaneme jednoduše přidáním pravidla S 0 S λ. Všechny podstatné vlastnosti jazyka L {λ} lze proto přenést i na L. Navíc si ukážeme, že z libovolné bezkontextové gramatiky G lze odvodit gramatiku ^G takovou, že L( ^G) = L(G) {λ}. Proto budeme nadále pracovat s λ-free jazyky (nebude-li řečeno jinak). 111
Jednoduché substituční pravidlo Věta 18 Nechť G = (V, T, S, P) je bezkontextová gramatika. Předpokládejme, že P obsahuje produkci ve tvaru přičemž A a B jsou různé proměnné. Nechť dále A x 1 Bx 2, (1) B y 1 y 2 y n jsou všechny produkce s proměnnou B na levé straně. Potom gramatika ^G = (V, T, S, ^P) vzniklá z G vyjmutím produkce (1) a přidáním produkcí je ekvivalentní s G, tj. L( ^G) = L(G). A x 1 y 1 x 2 x 1 y 2 x 2 x 1 y n x 2 112
Příklad 26 V gramatice G = ({A, B}, {a, b, c}, A, P) s produkcemi A a aaa abbc, B abba b substituujeme proměnnou B: A a aaa ababbac abbc, B abba b 113
Odstranění zbytečných produkcí Definice 20 Nechť G = (V, T, S, P) je bezkontextová gramatika. Řekneme, že proměnná A V je užitečná, pokud existuje aspoň jedna věta w L(G) taková, že S xay w, kde x, y (V T). Proměnnou, která není užitečná, nazýváme zbytečná. Druhý důvod zbytečnosti proměnné: nelze z ní odvodit žádnou větu: S asb λ A, A aa. 114
Odstranění zbytečných produkcí a proměnných Věta 19 Ke každé bezkontextové gramatice G = (V, T, S, P) existuje ekvivalentní bezkontextová gramatika ^G = ( ^V, ^T, S, ^P), která neobsahuje žádné zbytečné proměnné a produkce. Konstrukce ^G ve dvou krocích: 1. Nejprve zkonstruujeme gramatiku G 1 = (V 1, T 1, S, P 1 ), která bude obsahovat jen takové symboly A, z nichž je možné odvodit nějakou větu, tj. A w T. 2. Výslednou gramatiku ^G dostaneme tak, že z G 1 vyřadíme všechny proměnné, které nejsou dosažitelné z počáteční proměnné S. 115
Algoritmus pro 1. krok V 1 := Opakuj tento krok tak dlouho, dokud lze do V 1 přidat nějakou proměnnou A: Má-li A V produkci ve tvaru A x 1 x 2 x n, přičemž x i V 1 T pro všechna i = 1, 2,..., n, pak přidej A do V 1. Novou množinu produkcí P 1 vytvoř z P ponecháním jen těch pravidel, v nichž jsou všechny symboly ve V 1 T. 116
2. krok Vytvoříme graf závislostí proměnných v množině V 1 na počátečním symbolu S a vyhodíme všechny proměnné, které v tomto grafu nebudou. Tím dostaneme výslednou množinu proměnných ^V. V množině ^P pak ponecháme jen produkce s proměnnými z ^V. 117
Příklad 27 Odstraňte zbytečné proměnné a produkce z gramatiky G = (V, T, S, P), kde V = {S, A, B, C}, T = {a, b} a P sestává z těchto produkcí: S as A C, A a, B aa, C acb, 118
Příklad 27 Odstraňte zbytečné proměnné a produkce z gramatiky G = (V, T, S, P), kde V = {S, A, B, C}, T = {a, b} a P sestává z těchto produkcí: S as A C, A a, B aa, C acb, Výsledek: S as A, A a. 119
Odstranění λ-produkcí Definice 21 Produkční pravidlo ve tvaru A λ nazýváme λ-produkce. Proměnná A se nazývá vynulovatelná (nullable), pokud pro ni existuje odvození A λ. Příklad 28: Odstraňte λ-produkci z gramatiky S as 1 b, S 1 as 1 b λ. 120
Věta 20 Nechť G je bezkontextová gramatika taková, že λ / L(G). Potom existuje ekvivalentní gramatika ^G, která nemá λ-produkce. Nejprve najdeme množinu V N všech vynulovatelných proměnných: V N := { A V A λ } Opakuj tento krok tak dlouho, dokud lze nějakou proměnnou přidat do V N : Pro všechny produkce tvaru B A 1 A 2 A n, kde A i V N pro i = 1, 2,..., n přidej B do V N. Dále každé produkční pravidlo nahradíme sadou pravidel, v nichž budou postupně vyjmuty všechny možné kombinace vynulovatelných proměnných (nesmí ale na pravé straně zbýt λ). λ-produkce vyhodíme. 121
Příklad 29 Odstraňte λ-produkce z gramatiky S ABaC, A BC, B b λ, C D λ, D d. Výsledek: S ABaC BaC AaC ABa ac Aa Ba a, A B C BC, B b, C D, D d. 122
Jednotkové produkce Definice 22 Produkční pravidlo bezkontextové gramatiky ve tvaru A B, kde A, B V se nazývá jednotkové pravidlo. Věta 21 Nechť G = (V, T, S, P) je bezkontextová gramatika bez λ-produkcí. Potom existuje bezkontextová gramatika ^G = ( ^V, ^T, S, ^P), která je ekvivalentní s G a neobsahuje žádné jednotkové produkce. Důkaz využívá větu 6.3. 123
Příklad 30 Eliminujte jednotkové produkce z gramatiky S Aa B, B A bb, A a bc B. Výsledek: S a bc bb Aa, B a bb bc, A a bb bc. 124
Souhrnný výsledek Věta 22 Nechť L je bezkontextový jazyk neobsahující λ. Potom existuje bezkontextová gramatika, která generuje L a přitom neobsahuje žádné zbytečné proměnné a produkce, λ-produkce ani jednotkové produkce. Postup: 1. Odstraníme λ-produkce. 2. Odstraníme jednotkové produkce. 3. Odstraníme zbytečné proměnné a produkce. 125
Chomskyho normální forma Definice 23 Řekneme, že bezkontextová gramatika je v Chomskyho normální formě, pokud jsou všechna její pravidla v jednom z následujících tvarů: A BC nebo kde A, B, C V a a T. A a, CNF redukuje a přesně určuje počet symbolů na pravé straně (dvě proměnné anebo jeden terminál). 126
Věta 23 Ke každé bezkontextové gramatice G = (V, T, S, P) takové, že λ / L(G), existuje s ní ekvivalentní gramatika ^G = ( ^V, ^T, S, ^P), která je v Chomskyho normální formě. Postup ve dvou krocích: 1. Pouze pravidla tvaru A C 1 C 2 C n anebo A a. 2. Pravidla v CNF. 127
Příklad 31 Převeďte následující gramatiku do CNF: S ABa, A aab, B Ac. Výsledek: S AD 1, D 1 BB a, A B a D 2, D 2 B a B b, B AB c, B a a, B b b, B c c. 128
Normální forma Greibachové Definice 24 Řekneme, že bezkontextová gramatika je v normální formě Greibachové, pokud jsou všechna její pravidla ve tvaru kde a T a x V. A ax, Každé pravidlo má na pravé straně jen jeden terminál, a to nejvíce vlevo. To je stejné jako u s-gramatiky, u GNF ovšem obecně nemusíme mít pouze jedno pravidlo pro každou dvojici (A, a). Věta 24 Ke každé bezkontextové gramatice G takové, že λ / L(G), existuje s ní ekvivalentní gramatika ^G, která je v normální formě Greibachové. 129
Příklad 32 Převeďte následující gramatiku do GNF: S absb aa Výsledek: S absb aa, A a, B b. 130
Zásobníkový automat Hledáme automat, který bude schopen rozeznávat bezkontextový jazyk. Zásobníkový automat (push-down automaton, PDA) Vstupní data Řídící jednotka Zásobník 131
Definice 25 Nedeterministický zásobníkový automat je uspořádaná sedmice kde M = (Q, Σ, Γ, δ, q 0, z, F) Q je konečná množina stavů řídící jednotky; Σ je konečná vstupní abeceda; Γ je konečná množina symbolů abeceda zásobníku; δ je přechodová funkce funkce z Q (Σ {λ}) Γ do množiny všech konečných podmnožin kartézského součinu Q Γ ; q 0 Q je počáteční stav řídící jednotky; z Γ je počáteční symbol zásobníku; F Q je množina koncových stavů řídící jednotky. 132
Příklad 33 Q = {q 0, q 1, q 2, q 3 } Σ = {a, b} Γ = {0, 1} z = 0 F = {q 3 } δ(q 0, a, 0) = {(q 1, 10), (q 3, λ)} δ(q 0, λ, 0) = {(q 3, λ)} δ(q 1, a, 1) = {(q 1, 11)} δ(q 1, b, 1) = {(q 2, λ)} δ(q 2, b, 1) = {(q 2, λ)} δ(q 2, λ, 0) = {(q 3, λ)} q 0 a,0 : 10 q 1 a,1 : 11 a,0 : λ λ,0 : λ b,1 : λ q 3 λ,0 : λ q 2 b,1 : λ L = { a n b n n N 0 } {a} 133
Zápis přechodů zásobníkového automatu Přechodový diagram je názorný, ale pro teoretické úvahy (důkazy) je přehlednější zápis, který vychází z toho, že uspořádaná trojice (q, w, u) (konfigurace NPDA) plně určuje stav PDA, kde w je zbývající část vstupních dat a u je obsah zásobníku. Přechod mezi dvěma stavy daný přechodovou funkcí δ pak zapisujeme pomocí relace, např. platí pouze v případě, že (q 1, aw, bx) (q 2, w, yx) (q 2, y) δ(q 1, a, b). Přechody zahrnující libovolný počet kroků se označují pomocí. Tedy (q 1, w 1, x 1 ) (q 2, w 2, x 2 ) znamená, že automat může přejít z prvního stavu do druhého v libovolném (konečném) počtu kroků. 134
Jazyk rozpoznávaný zásobníkovým automatem Definice 26 Nechť M = (Q, Σ, Γ, δ, q 0, z, F) je nedeterministický zásobníkový automat. Jazyk rozpoznávaný automatem M je množina L(M) = { w Σ (q 0, w, z) (p, λ, u), p F, u Γ } 135
Příklad 34 Sestrojíme NPDA pro jazyk L = { w {a, b} n a (w) = n b (w) } 136
Příklad 34 Sestrojíme NPDA pro jazyk L = { w {a, b} n a (w) = n b (w) } Q = {q 0, q 1 } Σ = {a, b} Γ = {z, 0, 1} F = {q 1 } δ(q 0, a, z) = {q 0, 0z} δ(q 0, b, z) = {q 0, 1z} δ(q 0, a, 0) = {q 0, 00} δ(q 0, b, 0) = {q 0, λ} δ(q 0, a, 1) = {q 0, λ} δ(q 0, b, 1) = {q 0, 11} δ(q 0, λ, z) = {q 1, λ} 137
NPDA pro bezkontextový jazyk Problém: Jak zkonstruovat k danému bezkontextovému jazyku L zásobníkový automat, který jazyk L rozpoznává? Tedy jak ze zadané bezkontextové gramatiky vytvořit program pro zásobníkový automat? Usnadníme si úlohu předpokladem, že gramatika je v GNF víme, že do ní lze libovolnou bezkontextovou gramatiku λ-free jazyka převést (pravidlo S λ vyřešíme zvlášť). Máme tedy pouze pravidla tvaru A ax, kde a T je terminál a x V řetěz proměnných (může být prázdný). Napřed vložíme S do zásobníku a dále simulujeme přepisovací pravidla aplikovaná vždy na nejlevější proměnnou v odvozovaném slově (= levé odvození ): Máme-li na vrcholu zásobníku proměnnou A a na vstupu znak a, vybereme nějaké pravidlo tvaru A ax a proměnnou A v zásobníku nahradíme řetězem proměnných x. 138
Příklad 35 Zkonstruujeme NPDA rozpoznávající jazyk s gramatikou S asbb a. S asa a A bb B b Q = q 0, q 1, q 2 Γ = V {z} F = {q 2 } δ(q 0, λ, z) = {(q 1, Sz)} δ(q 1, a, S) = {(q 1, SA), (q 1, λ)} δ(q 1, b, A) = {(q 1, B)} δ(q 0, b, B) = {q 1, λ} δ(q 1, λ, z) = {q 2, z} 139
Věta 25 Pro libovolný bezkontextový jazyk L existuje nedeterministický zásobníkový automat M takový, že L = L(M). G = (V, T, S, P) M = ({q 0, q 1, q f }, T, V {z}, δ, q 0, z, {q f }) δ(q 0, λ, z) = {(q 1, Sz)} A ax (q 1, x) δ(q 1, a, A) δ(q 1, λ, z) = {(q f, z)} Je-li λ L, přidáme přechod δ(q 0, λ, z) = {(q f, z)}. 140
Příklad 36 Zkonstruujeme NPDA pro gramatiku S aa A aabc bb a B b C c δ(q 0, λ, z) = {(q 1, Sz)} δ(q 1, λ, z) = {(q f, z)} δ(q 1, a, S) = {(q 1, A)} δ(q 1, a, A) = {(q 1, ABC), (q 1, λ)} δ(q 1, b, A) = {(q 1, B)} δ(q 1, b, B) = {(q 1, λ)} δ(q 1, c, C) = {(q 1, λ)} 141
Postup bez GNF Zásobníkový automat lze zkonstruovat přímo, i když nemáme gramatiku v GNF: Γ = V T {z} 1. Pro produkce typu A Bx odebereme A ze zásobníku a vložíme tam Bx. 2. Pro produkce typu A abcx musíme napřed porovnat prefix složený z terminálů (ab) se stejným obsahem zásobníku a potom A nahradíme v zásobníku řetězem Cx. 142
Bezkontextové gramatiky pro NPDA Věta 26 Je-li M nedeterministický zásobníkový automat, pak L(M) je bezkontextový jazyk. Konstrukce odpovídající bezkontextové gramatiky je poměrně komplikovaná, protože kromě terminálů odpovídajících symbolům na vstupu a zbytku větné formy v zásobníku je činnost NPDA řízena také vnitřními stavy. 143
Deterministický zásobníkový automat (DPDA) DPDA nesmí mít nikdy možnost volby dvou nebo více různých tahů. Definice 27 Řekneme, že zásobníkový automat M = (Q, Σ, Γ, δ, q 0, z, F) je deterministický, pokud platí všechny podmínky pro NPDA (Definice 7.4) a navíc tato dvě omezení: 1. δ(q, a, b) obsahuje nejvýše jeden prvek pro všechna q Q, a Σ a b Γ; 2. Je-li δ(q, λ, c) neprázdné, musí být δ(q, a, b) = pro všechna a Σ. Na rozdíl od definice DFA jsou zde hodnoty přechodové funkce nadále množinové, protože chceme zachovat λ-přechody tím žádný nedeterminismus nevzniká, protože vždy odebíráme symbol ze zásobníku. 144
Deterministický bezkontextový jazyk Definice 28 Bezkontextový jazyk L se nazývá deterministický, pokud existuje DPDA M takový, že L = L(M). Příklad 37: Jazyk { a n b n n 0 } je deterministický. Jazyk { ww R w Σ + } není deterministický. Existují tedy nedeterministické bezkontextové jazyky, takže třídy automatů NPDA a DPDA nejsou stejné (NPDA toho umí víc). 145
LL gramatiky Deterministické bezkontextové jazyky lze velmi dobře syntakticky analyzovat pomocí DPDA. Vzhledem k možnosti λ-přechodů (bez načtení vstupního symbolu) nelze sice tvrdit, že složitost analýzy je lineární, ale je výrazně efektivnější než pro obecné bezkontextové jazyky. Požadavek efektivní syntaktické analýzy vede k požadavku, abychom v každém kroku odvozování (např. levého) věděli přesně, jaké přepisovací pravidlo použít. Splňují ho s-gramatiky, ty jsou ale příliš omezující. LL gramatiky: následující přepisovací pravidlo můžeme přesně určit, pokud se podíváme na omezenou část vstupního řetězu (příští symbol + pevný počet dalších). První L: vstup čteme odleva, druhé L: děláme levé odvození. LL(k): díváme se na k vstupních symbolů, speciálně u LL(1) jen na příští. Příklad 38: S asb ab je LL(2) gramatika. 146
Příklad 39 S SS asb ab Toto není LL(k) gramatika pro žádné k. Můžeme ale zkonstruovat ekvivalentní LL(1) gramatiku. Gramatika S asbs λ už téměř vyhovuje: a vybírá první pravidlo, b nebo konec vstupního řetězu druhé. Pouze musíme odstranit prázdné slovo: S 0 asbs S asbs λ 147
Definice 29 Bezkontextovou gramatiku G = (V, Σ, S, P) nazýváme gramatikou LL(k), pro k N, pokud pro každou dvojici odvození S w 1 Ax 1 w 1 y 1 x 1 w1 w 2, S w 1 Ax 2 w 1 y 2 x 2 w1 w 3, kde w 1, w 2, w 3 Σ, A V a x 1, x 2, y 1, y 2 (V Σ), platí: Je-li k nejlevějších symbolů ve slovech w 2 a w 3 shodných, musí být y 1 = y 2. Řada programovacích jazyků je definována pomocí LL gramatik a jejich kompilátory využívají LL analyzátory. Jiným užitečným typem jsou LR gramatiky, které realizují analýzu zdola nahoru. 148
Pumpovací lemma pro bezkontextové jazyky Věta 27 Nechť L je nekonečný bezkontextový jazyk. Potom existuje kladné číslo m N takové, že každý řetěz w L s délkou w m lze rozložit do tvaru w = uvxyz, kde a a pro všechna i = 0, 1, 2,... platí vxy m vy 1 uv i xy i z L. 149
Idea důkazu Budeme se zabývat jazykem L {λ}. Jazyk je nekonečný, takže v něm musíme mít řetězy libovolné délky. Počet přepisovacích pravidel je konečný, takže délka pravých stran je omezena nějakým číslem k. Pro odvození slova w tedy potřebujeme aspoň w /k odvození. Délka odvození musí tedy být také neomezená. Počet neterminálů je konečný, takže v dostatečně dlouhém odvození se musí nějaký terminál opakovat označme ho A. Odvození pak vypadá takto: S uaz uvayz uvxyz, kde u, v, x, y a z jsou řetězy terminálů. S T 1 T 2 u z A T 3 T 4 v y A T 5 x 150
Příklad 40 Ukážeme, že jazyk L = { ww w {a, b} + } není bezkontextový. Omezení délek: vxy m, vy 1. w = a m b m a m b m = uvxyz Pro {ww R } tento postup (samozřejmě) nefunguje: w = a m b m b m a m = uvxyz 151
Vsuvka: rozšířené regulární výrazy Moderní programovací jazyky umožňují pracovat s rozšířenými regulární výrazy. Např. Java: (\d\d)\1 Pozor na to, že tímto způsobem můžeme definovat jazyky, které nejsou regulární. Některá rozšíření můžeme nahradit regulárními výrazy podle naší definice, například výrazu \d odpovídá (0+1+2+3+4+5+6+7+8+9). Se zpětnými referencemi se už ale můžeme dostat dokonce mimo třídu bezkontextových jazyků: (.+)\1 = { ww w Σ + } Viz heslo Wikipedie Regular expression. 152
Příklad 41 Ukážeme, že jazyk L = { a n b n c n n 0 } není bezkontextový. Omezení délek: vxy m, vy 1. w = a m b m c m = uvxyz Pro {a n b n } tento postup (samozřejmě) nefunguje: w = a m b m = uvxyz 153
Pumpovací lemma pro lineární jazyky Definice 30 Řekneme, že bezkontextový jazyk L je lineární, pokud existuje lineární bezkontextová gramatika G taková, že L = L(G). Věta 28 Nechť L je nekonečný lineární jazyk. Potom existuje přirozené číslo m takové, že libovolná věta w L může být rozložena do podoby w = uvxyz, přičemž jsou splněny podmínky uvyz m, vy 1, a navíc pro libovolné i = 0, 1, 2,... platí uv i xy i z L. Ve větných formách lineární gramatiky máme stále nejvýše jednu proměnnou, která se proto musí opakovat nejpozději po n odvozeních, kde n je celkový počet proměnných. 154
Příklad 42 Ukažte, že jazyk L = { w {a, b} n a (w) = n b (w) } není lineární. Volíme w = a m b 2m a m. 155
Uzavřenost třídy bezkontextových jazyků Věta 29 Jsou-li L 1 a L 2 bezkontextové jazyky, pak také L 1 L 2, L 1 L 2 a L 1 jsou bezkontextové jazyky. G 1 = (V 1, T 1, S 1, P 1 ), G 2 = (V 2, T 2, S 2, P 2 ) G 3 = (V 1 V 2 {S 3 }, T 1 T 2, S 3, P 3 ) P 3 = P 1 P 2 { S 3 S 1 S 2 } G 4 = (V 1 V 2 {S 4 }, T 1 T 2, S 4, P 4 ) P 4 = P 1 P 2 { S 4 S 1 S 2 } G 5 = (V 1 {S 5 }, T 1, S 5, P 5 ) P 5 = P 1 { S 5 S 1 S 5 λ } 156
Věta 30 Jsou-li L 1 a L 2 bezkontextové jazyky, pak L 1 L 2 a L 1 nemusí být bezkontextové jazyky. L 1 = { a n b n c m n 0, m 0 } L 2 = { a n b m c m n 0, m 0 } Oba jsou bezkontextové zřetězení dvou bezkontextových jazyků, např. L 1 = { a n b n n N 0 }{c}. Ovšem není bezkontextový. L 1 L 2 = { a n b n c n n N 0 } Tvrzení pro doplněk plyne z de Morganova vzorce L 1 L 2 = L 1 L 2. 157
Průnik bezkontextového a regulárního jazyka Věta 31 Nechť L 1 je bezkontextový jazyk a L 2 regulární jazyk. Potom L 1 L 2 (tzv. regulární průnik) je bezkontextový jazyk. M 1 = (Q 1, Σ, Γ, δ 1, q 10, z, F 1 ) A 2 = (Q 2, Σ, δ 2, q 20, F 2 ) Zkonstruujeme PDA M = (Q, Σ, Γ, δ, q 0, z, F), který simuluje paralelní zpracování vstupního řetězu oběma automaty M 1 a A 2. Q = Q 1 Q 2 q 0 = (q 10, q 20 ) F = F 1 F 2 ((q 1k, q 2l ), x) δ((q 1i, q 2j ), a, b) právě tehdy, když (q 1k, x) δ 1 (q 1i, a, b) a zároveň δ 2 (q 2j, a) = q 2l. Navíc pro a = λ bereme q 2j = q 2l. 158