====== AP11, IN11 Zásobníkové automaty, Syntaktická analýza ======
===== Zadání =====
(definice, převod bezkontextové gramatiky na zásobníkový automat)
(syntaktická analýza shora dolů a zdola nahoru, průběh analýzy daného slova)
===== Vypracování =====
==== Intuice zásobníkového automatu ====
Zásobníkový automat = PushDown Automaton = PDA
Na vstupní pásce je napsáno slovo (nad jistou vstupní abecedou) -- lze z ní pouze číst, čtecí hlava se pohybuje pouze vpravo. Automat může na vrchol zásobníku ukládat symboly (z jisté abecedy) a ty následně číst -- čte vždy jen vrchol zásobníku, přečtený symbol je odstraněn = systém LIFO (Last In First Out).
==== Formální definice ====
**Nedeterministický zásobníkový automat** (PushDown Automaton, PDA) je sedmice , kde
• Q je konečná množina, jejíž prvky nazýváme stavy,
• je konečná množina, tzv. vstupní abeceda,
• je konečná množina, tzv. zásobníková abeceda,
• , tzv. (parciální) přechodová funkce (zápis značí množinu všech konečných podmnožin množiny -- dvojice stav a řetězec symbolů zásobníkové abecedy),
• je počáteční stav,
• je počáteční symbol v zásobníku,
• je množina koncových stavů.
... dno zásobníku, A ... vrchol zásobníku, přidal se v tomto kroku
... obsah zásobníku se nezměnil, pouze se přešlo do stavu q1
... stav se nezměnil, ze zásobníku se přečetlo A -- bylo odebráno
**vrchol zásobníku běžného PDA se píše vlevo**
==== Výpočet zásobníkového automatu ====
Nechť je PDA.
**Konfigurací** nazveme libovolný prvek .
Na množině všech konfigurací automatu M definujeme binární relaci **krok výpočtu** takto:
pro
Reflexivní a tranzitivní uzávěr relace značíme .
Je-li M zřejmý z kontextu, píšeme pouze resp. .
=== Akceptující výpočet PDA ===
**Jazyk akceptovaný** PDA M **koncovým stavem** definujeme jako
, kde
a jazyk akceptovaný PDA M **prázdným zásobníkem** definujeme
, kde .
Takto definovaný PDA je nedeterministický -- akceptuje slovo, jestliže existuje **alespoň jeden výpočet**, který vede z počáteční konfigurace do akceptující. V případě možnosti automat "hádá správně".
==== Grafická reprezentace konfigurací ===
* Zpravidla nekonečné
* **Vnitřní konfigurace** (= částečná konfigurace) = aktuální stav a celý obsah zásobníku (vrchol se píše vlevo)
**Příklad:**
PDA - akceptuje koncovým stavem
PDA - akceptuje prázdným zásobníkem
Přechodovou funkci mají oba automaty stejnou:
Grafické znázornění obou automatů, žlutě vybarvené jsou konfigurace, ve kterých akceptuje automat A, v tlustě orámované konfiguraci akceptuje automat A'
{{:home:inf:pda_graficky.png|}}
==== Ekvivalence dvou způsobů akceptování ====
Pro každý jazyk L platí:
pro nějaký PDA N pro nějaký PDA M.
PDA **N** akceptuje koncovým stavem, PDA **M** prázdným zásobníkem
=== koncový stav => prázdná paměť ===
**Intuice:**
K danému N zkonstruujeme M simulující jeho činnost.
Vejde-li N do koncového stavu, M se nedeterministicky rozhodne
• pokračovat v simulaci automatu N nebo
• přejít do nově přidaného stavu , v němž vyprázdní zásobník.
**Komplikace:**
Automat N by vyprázdnil zásobník, aniž by došel do koncového stavu -- akceptoval by i nežádoucí vstup.
**Řešení:**
Před zahájením simulace bude u M na dně zásovníku nový symbol, který nedovolíme odstranit jinde, než ve stavu .
=== prázdná paměť => koncový stav ===
K danému M zkonstruujeme N simulující jeho činnost.
• N si před simulací přidá na dno zásobníku nový symbol.
• Je-li N schopen číst tento symbol (tj. zásobník automatu M je prázdný), potom N přejde do nově přidaného stavu , který je koncovým stavem.
důkaz viz skripta (( skripta Automaty a formální jazyky I, str. 78)), konstrukce viz slidy (([[http://www.fi.muni.cz/~xstrejc/IB102/|Web IB102]] - slajdy10, str. 5 a 8))
==== Rozšířený zásobníkový automat ====
- sedmice , kde
• všechny symboly až na mají stejný význam jako v definici PDA,
• je zobrazením
**z konečné podmnožiny** množiny ,
**do konečných podmnožin** množiny .
Pojmy konfigurace a akceptovaný jazyk (koncovým stavem, prázdným zásobníkem) zůstávají beze změny. Krok výpočtu definujeme takto:
pro
=== Ekvivalence rozšířených PDA a PDA ===
Ke každému rozšířenému PDA existuje ekvivalentní (obyčejný) PDA.(Důkaz: skripta Formální jazyky a automaty I, str. 82)
==== Zásobníkové automaty a bezkontextové jazyky ====
{{:home:inf:pda.png}}
**Problém syntaktické analýzy pro bezkontextové gramatiky:** pro danou bezkontextovou gramatiku G a slovo w rozhodnout, zda .
=== Ekvivalence bezkontextových gramatik a zásobníkových automatů ===
Ke každému PDA M lze sestrojit CFG G takovou, že .Ke každé CFG G lze sestrojit PDA M takový, že .Třída jazyků rozpoznávaných zásobníkovými automaty je právě třída bezkontextových jazyků.Konstrukce PDA řeší problém syntaktické analýzy. (platí pro dané G a w: )
v G existuje derivační strom s výsledkem w.
== Nedeterministická syntaktická analýza shora dolů ==
Budování derivačního stromu simuluje levé derivace, tj. vždy rozvíjíme nejlevější neterminál.Ke každé CFG G lze sestrojit PDA M takový, že .**Důkaz.** K dané gramatice G konstruujeme PDA M, který simuluje levé derivace v G (rozvíjíme nejlevější neterminál).
* V levé derivaci je v jednom kroku odvození nahrazen (nejlevější) neterminál A pravou stranou nějakého A-pravidla.
* V M této situaci odpovídá náhrada A na vrcholu zásobníku řetězem .
, kde je definována:
* obsahuje právě když
* pro všechna
korektnost + důkaz viz skripta ((str. 84 skripta Formální jazyky a automaty I, slajdy11 - str. 12))
== Nedeterministická syntaktická analýza zdola nahoru ==
Nechť G je libovolná CFG, pak lze zkonstruovat rozšířený PDA R takový, že L(G) = L(R).**Důkaz.**
**Vrchol zásobníku píšeme vpravo.**
Konstruujeme rozšířený PDA R, který simuluje pravou derivaci v G v obráceném pořadí.
PDA R má kroky dvojího typu:
- může kdykoli číst do zásobníku vstupní symbol,
- **(redukce)** je-li na vrcholu zásobníku řetěz tvořící pravou stranu nějakého pravidla v G, může ho nahradit odpovídajícím levostranným neterminálem (a ze vstupu nic nečte).
Nechť .
Položme , kde je nově přidaný symbol a kde je definována takto:
- pro všechna //...načítání vstupu na zásobník//,
- je-li , pak obsahuje (q, A) //...redukce//,
- //...akceptování//.
korektnost viz slajdy ((slajdy11, str. 17))
== Příklad: ==
Zadání:
G = ({S, A, B}, {a, b}, P, S)
P =
{S -> | abSA
A -> AaB | aB | a,
B -> aSS | bA | }
Derivační strom pro slovo w = abababaa
{{:home:inf:pda_analyza.png}}
**Automat, který provádí syntaktickou analýzu shora dolů:**
A = ({q}, {a,b}, {S, A, B, a, b}, , q, S, )
2 typy přechodových fcí:
* //levou stranu pravidel z gram. dáváme na zásobník levé strany přechodové fce PDA, pravou stranu pravidel z gram. na zásobník pravé strany//
(q, , S) = {(q, ), (q, abSA)}
(q, , A) = {(q, AaB), (q, aB), (q, a)}
(q, , B) = { (q, aSS), (q, bA), (q, )}
* //"mazací" přechodové fce//
(q, a, a) = {(q, )}
(q, b, b) = {(q, )}
* **Akceptující výpočet nad slovem abababaa:**
(intuice: postupuju podle derivačního stromu, sleduju jeho rozvíjení odshora a čtu ho zleva)
**vrchol zásobníku je vlevo**
\\
\\
\\
\\
\\
... celé slovo se přečetlo a zásobník se vyprázdnil **automat slovo akceptuje**
**Automat pro syntaktickou analýzu zdola nahoru:**
3 typy přechodových funkcí:
* //terminály z gramatiky se předávají na zásobník//
(q, a, ) = {(q, a)}
(q, b, ) = {(q, b)}
* //pravou stranu pravidel z gram. dáváme na zásobník levé strany přechodové fce PDA, levou stranu pravidel z gram. na zásobník pravé strany//
(q, , abSA) = {(q, S)}
(q, , ) = {(q, S), (q, B)} **! ! !** Nesmí být rozděleno na: (q, , ) = {(q, S)} a (q, , ) = {(q, B)}, nebyla by to pak funkce.
(q, , AaB) = (q, , aB) = (q, , a) = {(q, A)}
(q, , aSS) = (q, , bA) = {(q, B)}
* //přechod do koncového stavu//
(q, , S) = {(r, )}
* **Akceptující výpočet nad slovem abababaa:**
(Intuice: čtu derivační strom zleva -- jako když teče voda (= používám první skupinu pravidel), pokud by voda musela téct do kopce, použiju pravidlo z druhé skupiny)
**vrchol zásobníku je vpravo**
\\
\\
\\
\\
\\
... automat přečetl celé slovo a přešel do koncového stavu r, **slovo akceptuje**.
U nedeterministické analýzy automat slovo neakceptuje, pokud **žádný** z možných výpočtů není akceptující.
=== Efektivnost syntaktické analýzy ===
Nederministický PDA => nedeterministický algoritmus => exponenciální deterministický algoritmus
**Řešení:**
• deterministický algoritmus složitosti , kde n = |w| (algoritmus Cocke -- Kasami -- Younger)
• deterministické zásobníkové automaty a deterministické bezkontextové jazyky
• lineární algoritmy pro speciální třídy deterministických bezkontextových jazyků
=== C - Y - K algoritmus (Cocke - Younger - Kasami) ==
**Problém:** Lze v dané gramatice v CNF vygenerovat dané slovo w?
**Řešení:** Pro každé podslovo u slova w spočítáme množinu všech neterminálů, z kterých lze odvodit u.
* u = a
* u = ab
* u = abc
* **Kubická složitost** vzhledem k délce vstupního slova (velikost tabulky: , na vyplnění políčka je zapotřebí až n kroků.
* Pracuje pouze s gramatikou v CNF (Chomského normální formě)
== Algoritmus: ==
**Vstup:** gramatika v CNF, slovo
Poznámka:
for i:=1 to n do
for každé pravidlo do
if then fi
od od
for j:=2 to n do
for i:=1 to n-j+1 do
for k:=1 to j-1 do
for každé pravidlo do
if then {A} fi
od od od od
== Příklad ==
Je dána bezkontextová gramatika G = ({S,A,B,C}, {a, b, c, d}, P, S) v CNF, kde
P = { S -> AA | BC | a | b,
A -> BA | BB | a | c,
B -> AB | CA | b,
C -> BC | CC | SC | d }
Syntaktická analýza slova pomocí C-K-Y algoritmu:
{{:home:inf:pda_cyk.png}}
Vidíme, že , tedy .
== Intuitivní návod na vyplňování tabulky: ==
- na nultý řádek napíšeme slovo, které chceme testovat (co sloupeček, to 1 terminál)
- obsah každého políčka v 1. řádku tvoří **množina** neterminálů, ze kterých se vygenerují terminály v příslušném sloupečku nultého řádku
- další řádky se vyplňují stylem, který je naznačený u žlutého políčka: do množiny v políčku se zapíší všechny neterminály, které generují všechny dvojice neterminálů z příslušných dvojic políček - každá používaná dvojice políček je orámovaná stejnou barvou.
Pro žluté políčko vezmeme jednu z dvojic políček - např. tu orámovanou zeleně. Vzniklé dvojice neterminálů jsou SB a AB. SB není generována žádným neterminálem, tedy do žlutého políčka nepřipisuju nic. AB je generovaná B, proto B zapíšu do žlutého políčka. Stejně postupuju i u ostatních dvojic políček.
* Možnost, jak vybírat správné dvojice políček: začínám políčkem, které je nejníž v příslušném sloupečku a políčkem, který je nejblíž v úhlopříčce směrem doprava (pro žluté políčko to jsou zelené rámečky) a dál postupuju (podle krásně jednoduchého návodu Vaška Brožka:), tak že lezu nahoru po žebříku (ve sloupečku) a sestupuju po schodech (v úhlopříčce).
===== Předměty =====
[[https://is.muni.cz/auth/predmety/predmet.pl?id=454974;| IB102 Automaty a gramatiky]]
[[https://is.muni.cz/auth/predmety/predmet.pl?id=427603;|IB005 Formální jazyky a automaty I]]
===== Literatura =====
Skripta Formální jazyky a automaty I
Slajdy k přednáškám IB102 na [[http://www.fi.muni.cz/~xstrejc/IB102/|stránkách Jana Strejčka]]
===== Vypracoval =====
Didl - Dita Dlabolová
Stav: 100%, z mé strany hotovo a zkontrolováno.
FIXME Je potřeba ještě zapracovat [[http://statnice.dqd.cz/tmp/zasobnikove_automaty_syn_analyza.pdf|poznámky od Jitky Pospíšilové]].
~~DISCUSSION~~