====== N-AP14 ======
====== Zadání ======
Bezkontextové jazyky. Bezkontextové gramatiky. Zásobníkové automaty. Normální formy bezkontextových gramatik. Převod bezkontextové gramatiky na zásobníkové automaty. Použití pumping lemmatu a uzávěrových vlastností bezkontextových jazyků.
====== Bezkontextové jazyky ======
Jazyk je bezkontextový, pokud existuje bezkontextová gramatika taková, že .((Přitom každá regulární gramatika je současně i bezkontextová, tedy pouhé nalezení bezkontextové gramatiky ještě nemusí znamenat, že jazyk není navíc i regulární.))
**Bezkontextová gramatika** (CFG) je čtveřice , kde:
* je neprázdná konečná množina neterminálních symbolů
* je konečná množina terminálních symbolů taková, že
* je konečná množina pravidel ()
* je počáteční neterminál
Současně třída jazyků rozpoznávaných zásobníkovými automaty je právě třída bezkontextových jazyků. Tj. jazyk je bezkontextový, pokud je akceptován nějakým zásobníkovým automatem (existuje zásobníkový automat , takový, že ).
===== Způsoby reprezentace bezkontextových jazyků =====
Bezkontextové jazyky lze reprezentovat:
* bezkontextovou gramatikou
* zásobníkovým automatem
* rozšířeným zásobníkovým automatem
====== Zásobníkový automat ======
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).
**Nedeterministický zásobníkový automat** (PushDown Automaton, PDA) je sedmice , kde
• 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**
Rozdíl mezi zásobníkovým automatem a rozšířeným zásobníkovým automatem je následující: Zásobníkový automat má přechodovou funkci definovanou jako zobrazení z do konečných podmnožin množiny . Oproti tomu rozšířený zásobníkový automat má definovanou rozšířenou přechodovou funkci jako zobrazení z konečné podmnožiny množiny do konečných podmnožin množiny .
Neformálně řečeno, rozšířený zásobníkový automat "vidí" hlouběji do zásobníku – tj. čte 0--//n// vrchních symbolů.
===== 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ě".
==== 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))
===== 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|}}
====== Normální formy bezkontextových gramatik ======
===== Chomského normální forma =====
Bezkontextová gramatika je v Chomského normální formě (CNF) je bez -pravidel (dle def. 3.13) a každé pravidlo z má jeden z těchto tvarů:
-
-
Každý bezkontextový jazyk lze generovat bezkontextovou gramatikou v Chomského normální formě. Algoritmus transformace do CNF lze nalézt ve skriptech Automaty a gramatiky, strana 67. Ve zkratce algoritmus funguje tak, že pravé strany délky větší než 2 nahradí novými neterminály, a tak se tato pravá strana zkrátí. Například pravidlo X -> ABC se změní na pravidla X -> A, -> BC ( je nový neterminál). Pro pravé strany délky 2, které se skládají z terminálu a neterminálu nahradí terminál novým neterminálem. Např. X -> aC se změní na X -> C, -> a.
===== Greibachové normální forma =====
Bezkontextová gramatika je v Greibachové normální formě (GNF) právě když:
* je bez -pravidel (dle def. 3.13)
* každé pravidlo z je tvaru , kde a
Každý bezkontextový jazyk lze generovat bezkontextovou gramatikou v Greibachové normální formě. Velmi zhruba naznačený postup je následující: Pokud je prázdný, pak jej definujeme jako jediné pravidlo (). Pokud je neprázdný, odstraníme levou rekurzi a převedeme do GNF. Algoritmus transformace do GNF lze nalézt ve skriptech Automaty a gramatiky, strana 73,74.
====== Převod bezkontextové gramatiky na zásobníkové automaty ======
Ke každému PDA M lze sestrojit CFG G takovou, že .Jednoduchý algoritmus na prvnim slidu http://www.nvc.cs.vt.edu/~jzhang/cs5104/Note-8.pdf
priklad si bud vygooglovat nebo strana 89 ve skriptech FJA
Ke každé CFG G lze sestrojit PDA M takový, že .Strana 25, 26 http://www.eecs.wsu.edu/~ananth/CptS317/Lectures/PDA.pdf
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í.
====== Použití pumping lemmatu a uzávěrových vlastností bezkontextových jazyků ======
===== Použití lemmatu o vkládání pro bezkontextové jazyky =====
Nechť L je CFL. Pak existují přirozená čísla (závisející na L) taková, že každé slovo , délky alespoň , lze psát ve tvaru , kde alespoň jedno ze slov je neprázdné (tj. ), a pro všechna .
Explicitněji lze lemma přepsat takto:
Za předpokladu, že , pak
Lemma o vkládání je ve tvaru implikace P ⇒ Q, kde P je výrok, že L je CFL a Q jsou uvedené vlastnosti. Této implikace (resp. její kontrapositivní formu) lze použít k důkazu, že nějaký jazyk //není// CFL. Stačí ukázat platnost následujícího tvrzení:
Pro libovolnou konstantu existuje slovo , takové, že pro všechna slova , , , , splňující: , a existuje takové , že .
Pro libovolnou konstantu existuje slovo : Zvolíme slovo jako libovolné, pro důkaz vhodné, slovo z jazyka - . Dále pro každé libovolné rozdělení slova splňující následující podmínky: musí existovat takové, že .
Nyní musíme takové nalézt. Položme tedy a ověříme, že rozebráním jednotlivých případů:
- není podslovo . Potom ale nebo , kde . Z toho plyne, že .
- je podslovo . Tuto situaci rozdělíme ještě na další dva případy:
* je podslovo : Pak ale , z čehož plyne, že
* je podslovo : . Současně a tudíž a tedy .
===== Uzávěrové vlastnosti bezkontextových jazyků =====
Třída bezkontextových jazyků **je** uzavřena vzhledem k operacím:
* sjednocení
* zřetězení
* iterace
* pozitivní iterace
* průnik s regulárním jazykem
Třída bezkontextových jazyků **není** uzavřena vzhledem k operacím:
* průnik
* doplněk
Pro následující případy uvažujme:
je generován CFG , je generován CFG a bez újmy na obecnosti budeme předpokládat .
==== Sjednocení ====
Definujme , kde je nový symbol a
Jazyk je generován gramatikou .
==== Zřetězení ====
Definujme , kde je nový symbol a
Jazyk je generován gramatikou .
==== Iterace a pozitivní iterace ====
Definujme , kde je nový symbol a
Jazyk je generován gramatikou .
Definujme , kde je nový symbol a
Jazyk je generován gramatikou .
==== Průnik a doplněk ====
Kdyby byla třída bezkontextových jazyků uzavřena vzhledem k operaci průnik, pak i by musel být bezkontextový, což však není.
Neuzavřenost vůči doplňku plyne z uzavřenosti třídy bezkontextových jazyků vzhledem k operaci sjednocení, neuzavřenosti na průnik a De Morganových pravidel:
====== Předměty ======
====== Vypracoval ======
Marek Menšík UČO 255679
Nevím přesně, kdo otázky zpracoval přede mnou, pouze jsem je sem umístil, doplnil chybějící věci a opravil nepřesnosti. Připomínám, že věci zde uvedené nemusí být korektní a zatím neprošly kontrolou žádného z profesorů.
====== Použitá literatura a weby ======
~~DISCUSSION~~