Chomského hierarchie Automaty a gramatiky Roman Barták, KTIML bartak@ktiml.mff.cuni.cz http://ktiml.mff.cuni.cz/~bartak gramatiky typu 0 (rekurzivně spočetné jazyky L 0 ) pravidla v obecné formě gramatiky typu 1 (kontextové jazyky L 1 ) pouze pravidla ve tvaru αxβ αwβ, X V N, α,β (V N V T )*, w (V N V T ) + jedinoýjimkou je pravidlo S λ, potom se ale S nevyskytuje na pravé straně žádného pravidla gramatiky typu 2 (bezkontextové jazyky L 2 ) pouze pravidla ve tvaru X w, X V N, w (V N V T )* gramatiky typu 3 (regulární/pravé lineární jazyky L 3 ) pouze pravidla ve tvaru X wy, X w, X,Y V N, w V T * Kontextové gramatiky pouze pravidla ve tvaru αxβ αwβ, X V N, α,β (V N V T )*, w (V N V T ) + jedinoýjimkou je pravidlo S λ, potom se ale S nevyskytuje na pravé straně žádného pravidla Poznámky: neterminál X se přepisuje na w pouze v kontextu α a β pravidlo S λslouží pouze pro přidání λ do jazyka Příklad: L = {a n b n c n n 1} je kontextový jazyk (není BKJ) S asbc abc CB BC pozor, není kontextové pravidlo! bb bb bc bc cc cc Separované gramatiky Gramatika je separovaná, pokud obsahuje pouze pravidla tvaru α β, kde: buď α,β V + N (neprázdné posloupnosti neterminálů) nebo α V N a β V T {λ}. Lemma: Ke každé gramatice G lze sestrojit ekvivalentní separovanou gramatiku G. nechť G = (V N,V T,S,P) pro každý terminál x V T zavedeme nový neterminál X v pravidlech z P nahradíme terminály odpovídajícími neterminály a přidáme pravidla X x G = (V N V T,V T,S,P {X x x V T }) zřejmě L(G) = L(G ) 1
Od monotonie ke kontextovosti Gramatika je monotónní (nevypouštějící), jestliže pro každé pravidlo (u v) P platí u v. Monotónní gramatiky slovo v průběhu generování nezkracují. Věta: Ke každé monotónní gramatice lze nalézt ekvivalentní gramatika kontextovou. nejprve převedeme gramatiku na separovanou tím se monotonie neporuší (+ pravidla X x jsou kontextová) zbývají pravidla A 1 B 1 B n (kde m n) převedeme na kontextová pravidla s novými neterminály C A 1 C 1 A 2 C 1 A 2 C 1 C 2 C 1 C m-1 A m C 1 C m-1 C m C 1 C m B 1 C m B 1 C 2 C m B 1 B 2 C m B 1 B m-1 C m B 1 B m-1 B m B n Příklad kontextového jazyka L = {a i b j c k 1 i j k} je kontextový jazyk (není BKJ) S asbc abc B BBC C CC CB BC ab ab bb bb bc bc cc cc generování symbolů a množení symbolů B množení symbolů C uspořádání symbolů B a C začátek přepisu B na b pokračování přepisu B na b začátek přepisu C na c pokračování přepisu C na c CB BC není kontextové pravidlo, nahradíme ho: CB XB, XB XY, XY BY, BY BC Chomského hierarchie gramatiky typu 0 (rekurzivně spočetné jazyky L 0 ) pravidla v obecné formě gramatiky typu 1 (kontextové jazyky L 1 ) pouze pravidla ve tvaru αxβ αwβ, X V N, α,β (V N V T )*, w (V N V T ) + jedinoýjimkou je pravidlo S λ, potom se ale S nevyskytuje na pravé straně žádného pravidla gramatiky typu 2 (bezkontextové jazyky L 2 ) pouze pravidla ve tvaru X w, X V N, w (V N V T )* gramatiky typu 3 (regulární/pravé lineární jazyky L 3 ) pouze pravidla ve tvaru X wy, X w, X,Y V N, w V T * Turingovy stroje - historie a motivace 1931-1936 pokusy o formalizaci pojmu algoritmu Gödel, Kleene, Church, Turing Turingův stroj zachycení práce matematika (nekonečná) tabule lze z ní číst a lze na ni psát mozek (řídící jednotka) Formalizace TS: místo tabule oboustranně nekonečná páska místo křídy čtecí a zapisovací hlava, kterou lze posouvat místo mozku konečná řídící jednotka (jako u ZA) Další formalizace: λ-kalkul, částečně rekurzivní funkce, RAM 2
Definice Turingova stroje Turingovým strojem nazýváme pětici T=(Q,X,δ,q 0,F), kde Q - neprázdná konečná množina stavů X - neprázdná konečná množina symbolů obsahuje symbol ε pro prázdné políčko δ -přechodová funkce δ : (Q-F) X Q X {-1,0,1} popisuje změnu stavu, zápis na pásku a posun hlavy q 0 Q - počáteční stav F Q - množina koncových stavů páska řídící jednotka 1) výpočet začíná ve stavu q 0 2) v každém taktu dojde ke změně stavu k přepisu políčka na pásce k posunu hlavy 3) výpočet končí, když není definována žádná instrukce (speciálně platí pro koncové stavy) Turingovy stroje - konfigurace a modifikace Konfigurace Turingova stroje je souhrn údajů přesně popisující stav výpočtu. Obsahuje: nejmenší souvislou část pásky, která obsahuje všechny neprázdné buňky čtenou buňku obvyklý zápis: uqv vnitřní stav polohu čtené buňky (hlavy) TS postupně přepracovává konfigurace. Modifikace Turingova stroje: více pásek, více hlav, jednostranná páska omezené činnosti v taktu omezený počet stavů, omezená abeceda dva zásobníky λ q λ Příklad Turingova stroje Navrhněte Turingův stroj převádějící konfiguraci q 0 w na q F w R, kde w {a 1,,a n }* (tj. obrácení slova). q 0,ε q F,ε,0 prázdné slovo q 0,a i q i,r,a i,+1 přečte písmeno, pamatuje si ve stavu q 0,a i q R,a i,+1 konec (slovo sudé délky) q i,r,a j q i,r,a j,+1 běží doprava q i,r,ε q i,w,ε,-1 na konci se otočí q i,r,a j q i,w,a j,-1 q i,w,a j q j,l,a i,-1 vymění písmena q i,w,a i q R,a i,+1 konec (slovo liché délky) q i,l,a j q i,l,a j,-1 a běží zpět (doleva) q i,l,a j q 0,a i,+1 na zarážce uloží písmeno a začne znova q R,a j q R,a j,+1 běží doprava q R,ε q C,ε,-1 na konci se otočí q C,a j q C,a j,-1 při běhu doleva ruší označení q C, ε q F, ε,+1 slovo je obráceno Výpočet Turingova stroje Turingovým strojem nazýváme pětici T=(Q,X,δ,q 0,F) prázdné políčko ε Konfigurace TS popisuje aktuální stav výpočtu - uqv. ε c a Krok výpočtu (přímá změna konfigurace): uqv wpz v=av, w=u, z=bv q,a p,b,0 v=av, w=ub, z=v q,a p,b,+1 v=av, u=wc, z=cbv q,a p,b,-1 Poznámky: technicky je potřeba ošetřit případy, kdy v=λ nebo u=λ s u a v lze pracovat jako se dvěma zásobníky Výpočet je posloupnost přímých kroků uqv * wpz q ε 3
Turingovy stroje a jazyky Slovo w je přijímáno Turingovým strojem T, pokud q 0 w * upv, p F někdy je na konci výpočtyžadováno smazání pásky (q 0 w * λpε) Jazyk přijímaný Turingovým strojem T L(T) = {w w (X-{ε})* & q 0 w * upv, p F}. Jazyk L nazveme rekurzivně spočetným, pokud je přijímán nějakým Turingovým strojem T (L=L(T)). Příklad: {a 2n } q 0,ε q F,ε,0 q 0,a q 1,a,+1 q 1,a q 0,a,+1 prázdné slovo (konec výpočtu) zvětší čítač (2k+1 symbolů) nuluje čítač (2k symbolů) Od Turingova stroje ke gramatice Každý rekurzivně spočetný jazyk je typu 0. pro Turingův stroj T najdeme gramatiku G tak, že L(T)=L(G) gramatika nejdříve vygeneruje pásku stroje + kopii slova potom simuluje výpočet (stavy jsou součástí slova) v koncovém stavu smažeme pásku, necháme pouze kopii slova w ε n w R q 0 ε n (ε n představují volný prostor pro výpočet) I) S D Q 0 E D xd X E generuje slovo a jeho reverzní kopii pro výpočet E εe ε generuje volný prostor pro výpočet II) X P Y X Q Y pro δ(p,x)=(q,x,0) X P Y Q X Y pro δ(p,x)=(q,x,+1) X P Y X Y Q pro δ(p,x)=(q,x,-1) III) P C pro p F C A C mazání pásky A C C mazání pásky C λ konec výpočtu Od Turingova stroje ke gramatice - pokračování Ještě L(T) = L(G)? w L(T) existuje konečný výpočet stroje T (konečný prostor) gramatika vygeneruje dostatečně velký prostor pro výpočet simulujeme výpočet a smažeme dvojníky w L(G) pravidla v derivaci nemusí být v pořadí, jakém chceme derivaci můžeme přeuspořádat tak, že pořadí je I, II, III podtržené symboly smazány, tj. vygenerován koncový stav Příklad: δ(q 0,ε) = (q F,ε,0) δ(q 0,a) =(q 1,a,+1) δ(q 1,a) = (q 0,a,+1) Gramatika po zjednodušení S D q 0 D ad a ε ε q 0 C a q 0 q 1 a a q 1 q 0 a C a C C λ Od gramatik k Turingově stroji Každý jazyk typu 0 je rekurzivně spočetný. Důkaz (neformálně): idea: Turingův stroj postupně generuje všechny derivace derivaci S w 1 w n =w kódujeme jako slovo #S#w 1 # #w# TS postupně generuje všechna slova #S# w 1 # #w k # pokud w n =w, výpočet končí jinak, TS generuje další derivaci umíme udělat TS, který přijímá slova #u#v#, kde u v umíme udělat TS, který přijímá slova #w 1 # #w k #, kde w 1 *w k umíme udělat TS postupně generující všechna slova stroje spojíme do while cyklu Generuj (další) slovo Slovo tvoří derivaci? ne ano Derivace končí w? ne ano 4
Nedeterministické Turingovy stroje Nedeterministickým Turingovým strojem nazýváme pětici T=(Q,X,δ,q 0,F), kde Q,X,q 0,F jsou jako u TS a δ : (Q-F) X P(Q X {-1,0,1}). Slovo w je přijímáno nedeterministickým Turingovým strojem T, pokud existuje nějaký výpočet q 0 w * upv, p F. Tvrzení: N Turingovy stroje přijímají právě rekurzivně spočetné jazyky. Důkaz (neformálně): Ukážeme, že výpočty NTS lze modelovat pomocí TS. Pozor! Nelze použít podmnožinovou konstrukci (kvůli pásce)! TS modeluje všechny výpočty NTS prohledáváním do šířky max δ(q,x) Na pásce můžeme mít všechny konfigurace v hloubce k (páska je nekonečná), nebo můžeme generovat popis výpočtu (posloupnost pravidel) a vždy k němu dopočítat výslednou konfiguraci Lineárně omezené automaty Ještě potřebujeme ekvivalent pro kontextové gramatiky. Připomeňme, že kontextovou gramatiku dostaneme z libovolné monotónní gramatiky Lineárně omezený automat (LOA) je nedeterministický TS, kde na pásce je označen levý a pravý konec (l, r). Tyto symboly nelze při výpočtu přepsat a nesmí se jít nalevo od l a napravo od r. Slovo w je přijímáno lineárně omezeným automatem, pokud q 0 lwr * upv, p F. Prostor výpočtu je definován vstupním slovem a automat při jeho přijímání nesmí překročit jeho délku u monotónních (kontextových) derivací to není problém: žádné slovo v derivaci není delší než výstupní slovo Od kontextových jazyků k LOA Každý kontextový jazyk lze přijímat pomocí LOA. derivaci gramatiky budeme simulovat pomocí LOA použijeme pásku se dvěma stopami (větší abeceda) l 1) slovo w dáme do horní stopy a na začátek dolní stopy dáme S 2) přepisujeme slovo ve druhé stopě podle pravidel G 2.1) nedeterministicky vybereme část k přepsání 2.2) provedeme přepsání dle pravidla (pravá část se odsune) αxβ αγβ S w u α X β v u α γ β v 3) pokud jsoe druhé stopě samé terminály, porovnáme ji s první stopou (slovo přijmeme či zamítneme) r odsunutí Od LOA ke kontextovým jazykům LOA přijímají pouze kontextové jazyky. potřebujeme převést LOA na monotónní gramatiku tj. gramatika nesmí generovat nic navíc! výpočet ukryjeme do dvoustopých neterminálů 1) generuj slovo ve tvaru (a 0,[q 0,l,a 0 ]),(a 1,a 1 ),,(a n,[a n,r]) stav a okraje musíme ukrýt to neterminálů w q 0,l,a 0 a 0,r 2) simuluj práci LOA ve druhé stopě (stejně jako u TS) 3) pokud je stav koncový, smaž druhou stopu speciálně je potřeba ošetřit přijímání prázdného slova pokud LOA přijímá λ, přidáme speciální startovací pravidlo 5
Rekurzivní jazyky Co se stane, když TS nepřijímá nějaké slovo? a) výpočet skončí v nekoncovém stavu b) výpočet nikdy neskončí protože výpočet neskončil, nevíme, zda slovo do jazyka patří Říkáme, že TS T rozhoduje jazyk L, pokud L=L(T) a pro každé slovo w je výpočet stroje nad w konečný. Jazyky rozhodnutelné TS nazýváme rekurzivní jazyky. Věta (Postova): Jazyk L je rekurzivní, právě když L a doplněk L jsou rekurzivně spočetné. máme Turingovy stroje T 1 pro L a T 2 pro -L pro dané slovo w naráz simulujeme výpočet T 1 i T 2 T 1 a T 2 rozpoznávají komplementární jazyky, tedy po konečném počtu kroků víme zda w L Problém zastavení TS Existuje rekurzivně spočetný jazyk, který není rekurzivní? ANO Problém zastavení Turingova stroje (halting problem) je algoritmicky nerozhodnutelný. Neexistuje algoritmus, který by pro daný kód TS a daný vstup rozhodl, zda se TS zastaví. Důkaz (neformálně): vychází z existence univerzálního TS (Turingův stroj, který simuluje výpočet jiného TS nad daným vstupem) U(T,X) = T(X) T je kód stroje, X jsostupní data můžeme udělat stroj P(X), který se na datech X zastaví právě když U(X,X) se nezastaví U(P,P) vede ke sporu: P(P) U(P,P) P(P) (diagonální metoda) Postův korespondenční problém Postovým korespondenčním problémem (PKP) nazýváme konečný seznam dvojic neprázdných slov [u 1,v 1 ],, [u n,v n ]. Říkáme, že Postův korespondenční problém má řešení, pokud existují indexy i 1, i k tak, že 1 i j n a u u i 1 i2 u ik = v i1 v i2 v ik Říkáme, že Postův korespondenční problém má iniciální řešení, pokud existují indexy i 1, i k tak, že 1 i j n a u 1 u u i 1 i2 u ik = v 1v v i 1 i2 v ik Věta: PKP je algoritmicky rozhodnutelný, právě když je algoritmicky rozhodnutelné zda PKP má iniciální řešení. PKP s iniciálním řešením PKP (stačí vyzkoušet všechny začátky) PKP PKP s iniciálním řešením značení a 1 a 2 a n = a 1 a 2 a n a 1 a 2 a n = a 1 a 2 a n x 1 = u 1, x j+1 = u j, x n+2 = y 1 = v 1, y j+1 = v j, y n+2 = PKP s u,v má iniciální řešení právě když PKP s x,y má řešení Algoritmická nerozhodnutelnost PKP Existence iniciálního řešení PKP není algoritmicky rozhodnutelná. výpočet TS pro slovo w převedeme na PKP + +εq 0 w+ x x x X + + px qy δ(p,x)=(q,y,0) p+ qy+ δ(p,ε)=(q,y,0) px yq δ(p,x)=(q,y,+1) p+ yq+ δ(p,ε)=(q,y,+1) zpx qzy δ(p,x)=(q,y,-1) zp+ qzy+ δ(p,ε)=(q,y,-1) +px +qεy δ(p,x)=(q,y,-1) u: + K 0 + v: + K 0 + K 1 + K n-1 + K n + + K n + uqv + xqy q q F xq+ q+ +qy +q q++ + PKP má iniciální řešení TS se zastaví nad w + q + + + q + + výpočet mazání 6
Algoritmická rozhodnutelnost u BKJ Pro bezkontextové jazyky je algoritmicky rozhodnutelné, zda dané slovo patří či nepatří do jazyka. umíme λ L(G) (S *λ) pro ostatní slova použijeme ChNF (X YZ, X a) v každé derivaci se délka slova zvětšuje nebo roste počet terminálních symbolů (tj. v derivaci není cyklus!) na terminální slovo délky n použijeme právě (2n-1) pravidel derivací pro všechna slova délky n je konečně můžeme postupně vyzkoušet všechny derivace vedoucí ke slovům dané délky, například prohledáváním do hloubky Pro bezkontextové jazyky je algoritmicky rozhodnutelné, zda je jazyk prázdný. umíme zjistit, zda z S lze generovat terminální slovo (algoritmus redukce) Algoritmicky nerozhodnutelné problémy Pro bezkontextové gramatiky G 1,G 2 je algoritmicky nerozhodnutelné zda L(G 1 ) L(G 2 )=. převedeme PKP na daný problém máme PKP [u 1,v 1 ],, [u n,v n ] zvolíme nové terminály a 1,,a n pro kódy indexů G 1 : S u i Sa i u i a i generuje slova u u i 1 ik a ik a i1 G 2 : S v i Sa i v i a i generuje slova v v i 1 ik a ik a i1 PKP má řešení právě když L(G 1 ) L(G 2 ) u-část = v-část + složky a i zajišťují stejné pořadí Je algoritmicky nerozhodnutelné, zda je bezkontextová gramatika víceznačná. S S 1 S 2 S 1 u i S 1 a i u i a i S 2 v i S 2 a i v i a i PKP má řešení právě když je gramatika víceznačná Další algoritmicky nerozhodnutelné problémy Je algoritmicky nerozhodnutelné, zda L(G)=X* pro BKG G. G 1 : S u i Sa i u i a i generuje slova u u i 1 ik a ik a i1 G 2 : S v i Sa i v i a i generuje slova v v i 1 ik a ik a i1 jazyky L(G 1 ), L(G 2 ) jsou deterministické, tedy -L(G 1 ) a -L(G 2 ) jsou deterministické BKJ a -L(G 1 ) -L(G 2 ) je BKJ máme BKG G takovou, že L(G) = -L(G 1 ) -L(G 2 ) PKP má řešení L(G 1 ) L(G 2 ) L(G) = -L(G 1 ) -L(G 2 ) X* Poznámka: L(G) = je algoritmicky rozhodnutelné. Důsledky: Nelze algoritmicky rozhodnout, zda L(G) = R, pro BKG G a regulární jazyk R (důkaz: za R zvolme X*) R L(G), pro BKG G a regulární jazyk R (důkaz: za R zvolme X*) L(G 1 ) = L(G 2 ), pro BKG G 1 a G 2 (důkaz: nechť G 1 generuje X*) L(G 1 ) L(G 2 ), pro BKG G 1 a G 2 (důkaz: nechť G 1 generuje X*) Poznámka: L(G) R je algoritmicky rozhodnutelné L(G) R L(G) -R = + (L(G) -R) je BKJ Shrnutí popis nekonečných objektů konečnými prostředky regulární jazyky konečné automaty (NKA,2KA) Nerode, Kleene, pumpování bezkontextové jazyky zásobníkové automaty (DZA) Dyckovy jazyky, pumpování kontextové jazyky lineárně omezené automaty monotonie rekurzivně spočetné jazyky Turingovy stroje algoritmická nerozhodnutelnost použití nejen pro práci s jazyky! 7