Vztah bezkontextových jazyků a ZA Věta: Nechť G=(N,T,P,S) je bezkontextová gramatika. Potom můžeme zkonstruovat zásobníkový automat M takový, že L(M)=L(G). Důkaz: konstrukcí nedeterministického zásobníkového automatu Z gramatiky G sestrojíme automat M=({q},,,,q0,Z0,Ø) tak, že =T, =NT, q0=q, Z0=S, a přechodové zobrazení je definováno následovně: 1) Je-li A pravidlo z P, potom (q,e,A) obsahuje (q, ) 2) (q,a,a) = {(q, e)} pro všechna aT
Vztah bezkontextových jazyků a ZA Příklad: Nechť G=({E,T,F},{+,*,(,),a},P,E), kde P = { E E+T | T T T*F | F F (E) | a } Odpovídající zásobníkový automat M takový, že L(M)=L(G): M=({q},{+,*,(,),a}, {+,*,(,),a,E,T,F},,q,E,Ø), přičemž (q,e,E) = {(q, E+T), (q,T)} (q,e,T) = {(q, T*F), (q,F)} (q,e,F) = {(q, (E)), (q,a)} (q,x,x) = {(q, e)} pro všechna x{+,*,(,),a}
Vztah bezkontextových jazyků a ZA Pro vstupní řetězec a+a*a může automat M vykonat následující posloupnost přechodů: (q, a+a*a ,E) (q, a+a*a ,E+T) (q, a+a*a ,T+T) (q, a+a*a ,F+T) (q, a+a*a ,a+T) (q, +a*a ,+T) (q, a*a ,T) (q, a*a ,T*F) (q, a*a ,F*F) (q, a*a ,a*F) (q, *a ,*F) (q, a, F) (q, a , a) (q, e, e) Jde o analogii odvození: E E+T T+T F+T a+T a+T*F ….. a+a*a
Vztah bezkontextových jazyků a ZA Z ilustrativního příkladu je zřejmá činnost automatu Nejprve se na zásobníku vytváří generuje příslušná větná forma a následně při kontrole se vstupním slovem dochází k mazání shodných terminálů ze zásobníku Jedná se o takzvanou syntaktickou analýzu metodou shora-dolů, protože od startovacího symbolu gramatiky vytváříme postupně levou derivaci příslušného řetězce Lze vytvořit i automat pracující metodou zdola-nahoru,kdy se z řetězce postupnými redukcemi dostáváme zpět k startovnímu symbolu
Vztah bezkontextových jazyků a ZA Příklad: Vytvořte zásobníkový automat M ke gramatice G=({S1, S2},{a, b, if, then, else}, P, S1) P={S1 if b then S1 | if b then S2 else S1 | a S2 if b then S2 else S2 | a } takový, že L(M)= L(G).
Vztah bezkontextových jazyků a ZA Věta: Nechť M=(Q,,,,q0,Z0,F) je zásobníkový automat. Potom existuje bezkontextová gramatika G=(N,T,P,S) taková, že L(M)=L(G). Důkaz: konstrukcí bezkontextové gramatiky Z automatu sestrojujeme gramatiku tak, že množina neterminálů využívá symbolů [qZp], kde q, pQ a Z a nový symbol S. Tím se částečně zakódují jednotlivé konfigurace (aktuální stav, stav zásobníku, nový stav) a podle tvaru přechodového zobrazení a vstupního symbolu se vytvoří pravidla (viz např. Češka 2002)
Vztah bezkontextových jazyků a ZA Shrnutí: Tvrzení L je jazyk generovaný bezkontextovou gramatikou L je jazyk přijímaný zásobníkovým automatem (koncovým stavem) L je jazyk přijímaný zásobníkovým automatem prostřednictvím vyprázdnění zásobníku jsou vzájemně ekvivalentní.
Vlastnosti bezkontextových jazyků Pumping lemma pro bezkontextové jazyky Věta: Pro každý bezkontextový jazyk L existují takové konstanty p,qN, že libovolné slovo wL, pro které platí |w|>p, je možné vyjádřit ve tvaru w=x1y1v y2x2 , kde 1. |y1v y2|q 2. y1y2e 3. x1y1iv y2ix2 L pro každé i0.
Vlastnosti bezkontextových jazyků Nástin důkazu: Pokud je v odpovídající gramatice G n neterminálů, zvolíme konstanty p=2n a q=2n+1 Potom nejdelší cesta v příslušném derivačním stromu obsahuje alespoň n+2 vrcholů.Jelikož poslední symbol je terminál, bude tam alespoň n+1 neterminálů => nejméně jeden se zde vyskytuje 2x Vyjádřeno pomocí odvození: S * x1Ax2 + x1y1A y2x2 + x1y1v y2x2 to ale znamená, že v gramatice G lze provést i derivace S * x1y1iv y2ix2 pro každé i0
Vlastnosti bezkontextových jazyků Grafické znázornění důkazu: x1 y1 v y2 x2 S A A A
Vlastnosti bezkontextových jazyků Grafické znázornění důkazu: x1 y1 y2 x2 y1 v y2 S A A A A
Pumping lemma - využití Jde o analogickou větu k pumping lemmatu pro regulární jazyky Analogické je i využití – k důkazu, že určitý jazyk není bezkontextový. Tvrzení: Jazyk L = {aibici |i1} není bezkontextový. Důkaz: Pro důkaz sporem předpokládejme,že zadaný jazyk je bezkontextový.
Pumping lemma - využití Potom dle pumping lemmatu musí existovat přirozená čísla p, q taková, že pro každé slovo w jazyka L, pro které platí |w|>p, je možné toto slovo vyjádřit ve tvaru w=x1y1v y2x2 , kde 1. |y1v y2|q 2. y1y2e 3. x1y1iv y2ix2 L pro každé i0. Zvolíme-li k>p/3, potom slovo akbkck má dostatečnou délku a lze jej napsat ve výše uvedeném tvaru. Jelikož y1y2e, alespoň jedno yi je neprázdné a obsahuje nejméně jedno písmenko.
Pumping lemma - využití Pokud neprázdné yi obsahuje různá písmenka, bude při iteraci docházet k porušování pořadí písmen ve slově x1y1ivy2ix2 a výsledné slovo nebude patřit do L. Odtud je zřejmé, že neprázdné yi může obsahovat tedy pouze jediné písmenko či více písmen stejného typu. Potom ovšem při iteraci bude růst počet těchto písmen ve slově x1y1ivy2ix2 (respektive může růst i počet dvou různých písmen za předpokladu,že obě slova yi jsou neprázdná) a výsledné slovo opět nebude patřit do L. Tím dostáváme spor s předpokladem, že L je bezkontextový.
Vlastnosti bezkontextových jazyků Věta: Nechť L1 a L2 jsou bezkontextové jazyky. Potom L1 L2 je také bezkontextový jazyk. Důkaz: Nechť G1 = (N1,T,P1,S1) a nechť G2 = (N2,T,P2,S2). Lze předpokládat (nebo přejmenováním zajistit) N1 N2=Ø Potom lze velmi jednoduše sestrojit gramatiku G=(N,T,P,S) takovou,že N = N1 N2 {S}, kde S je nový symbol (SN1 a SN2) a P = P1 P2 {SS1, SS2}
Vlastnosti bezkontextových jazyků Věta: Třída bezkontextových jazyků není uzavřena vůči operaci průnik. Důkaz: Pro důkaz sporem předpokládejme uzavřenost na průnik. Nechť L1 = {aibjck |i,j,k0, i=j} a nechť L2 = {aibjck |i,j,k0, j=k}. Potom L1 L2 = {aibici |i0} by byl také bezkontextový jazyk, čímž se dostáváme do sporu, protože tento jazyk bezkontextový není.
Deterministické bezkontextové jazyky V předcházející části jsme ukázali, že ke každé bezkontextové gramatice lze sestrojit zásobníkový automat, který daný jazyk přijímá. Takový automat lze považovat za syntaktický analyzátor příslušného jazyka. Problémem je, že takto zkonstruovaný analyzátor je obecně nedeterministický a jeho praktické využití je tedy omezené. Z hlediska praxe jsou důležité tzv. deterministické bezkontextové jazyky, které lze analyzovat deterministickými syntaktickými analyzátory.
Deterministický zásobníkový automat DEF: Deterministický zásobníkový automat M je sedmice M=(Q,,,,q0,Z0,F), kde Q je konečná množina vnitřních stavů automatu je konečná množina vstupních symbolů je konečná množina zásobníkových symbolů je přechodová funkce : Qx({e})x Qx* taková, že buď pro každé a obsahuje (q,a,Z) nejvýše jeden prvek a (q,e,Z)=Ø, nebo (q,a,Z)=Ø pro všechna a a (q,e,Z) obsahuje nejvýše jeden prvek q0 je počáteční stav automatu (q0Q) Z0 je počáteční zásobníkový symbol (Z0) F je množina koncových stavů (FQ)
Deterministický zásobníkový automat Poznámka: Pokud uvažujeme deterministický zásobníkový automat, můžeme namísto (q,a,Z)={(p,W)} psát pouze (q,a,Z)=(p,W) Poznámka: Na rozdíl od konečných automatů, kde lze dokázat,že nedeterminismus nerozšiřuje schopnosti automatu rozpoznávat širší třídu jazyků, v případě zásobníkových automatů platí, že ne každý jazyk přijímaný zásobníkovým automatem může být přijímán deterministickým zásobníkovým automatem. Obecný algoritmus převodu nedeterministického zásobníkového automatu na deterministický neexistuje!!
Deterministické bezkontextové jazyky DEF: Jazyk L se nazývá deterministický bezkontextový jazyk, jestliže existuje deterministický zásobníkový automat, který jazyk L přijímá. Tvrzení: Třída deterministických bezkontextových jazyků (DBJ) je vlastní podtřídou jazyků bezkontextových. 1 2 DBJ 3
Deterministické bezkontextové jazyky Příklad: Navrhněte deterministický zásobníkový automat přijímající jazyk L={wcwR| w{a,b}+}. Řešení: ukládej postupně symboly na zásobník a po přečtení středového symbolu c porovnávej vstupní symboly se symboly postupně umazávanými ze zásobníku M=({q0,q1,q2}, {a,b,c}, {Z,a,b}, , q0, Z, {q2}) (q0,X,Y)= (qo,XZ) pro všechna X{a,b} a Y{Z,a,b} (q0,c,Y)= (q1,Y) pro všechna Y{a,b} (q1,X,X)= (q1,e) pro všechna X{a,b} (q1,e,Z)= (q2,e)
Deterministické bezkontextové jazyky Shrnutí: Deterministické bezkontextové jazyky tvoří sice vlastní podmnožinu všech bezkontextových jazyků, ale na straně druhé je jejich menší obecnost výhodou z hlediska implementace procesu syntaktické analýzy. Odpovídající syntaktický analyzátor je efektivní (pracuje v čase omezeném lineárně a lineárně omezenou pamětí) Syntaktická analýza je realizována jednoduchým algoritmem pracujícím nad určitými tabulkami, které se vytvoří na základě znalosti gramatiky Jelikož pracuje bez návratů, usnadňuje se lokalizace syntaktických chyb
Závěrečné opakování Příklad: Navrhněte automat sledující vstupy a výstupy z budovy, který kontroluje, zda v budově nikdo nezůstal. Příklad: Napište gramatiku generující příslušný jazyk. Příklad: Navrhněte automat přijímající jazyk L={w| w{0,1}+, w obsahuje právě o dvě 0 více než 1} Lze výše uvedené automaty navrhnout jako deterministické zásobníkové automaty?