====== AP10, IN10 Bezkontextové jazyky ======
===== Zadání =====
(definice, vlastnosti, způsoby jejich reprezentace, konstrukce bezkontextové gramatiky a zásobníkového automatu, normální formy bezkontextových gramatik, použití lematu o vkládání pro bezkontextové jazyky, uzávěrové vlastnost//i// bezkontextových jazyků)
===== Definice =====
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 ).
Definici zásobníkového automatu je možné nalézt v otázce [[home:inf:ap11|AP11,IN11 Zásobníkové automaty]]
===== 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
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ů.
===== Konstrukce bezkontextové gramatiky a zásobníkových automatů =====
Konstrukce zásobníkových automatů jsou popsány v otázce [[home:inf:ap11|AP11,IN11 Zásobníkové automaty]].
Každou bezkontextovou gramatiku, která reprezentuje neprázdný bezkontextový jazyk, lze dále upravit do tzv. kanonických tvarů - lépe se s nimi pracuje, jsou přehlednější, vyžadují je některé algoritmy atd. Kanonické tvary bezkontextových gramatik jsou následující:
* redukované CFG
* gramatiky bez -pravidel
* gramatiky bez jednoduchých pravidel
* gramatiky bez levé rekurze
Symbol je **nepoužitelný** v CFG právě když v neexistuje derivace tvaru pro nějaká .
Řekneme, že je redukovaná, jestliže neobsahuje žádné nepoužitelné symboly.
**Nepoužitelnost typu I.:** Neexistuje terminální řetěz takový, že .
**Nepoužitelnost typu II.:** Neexistují řetězy takové, že .
Řekneme, že CFG je bez -pravidel právě když buď
- neobsahuje žádné -pravidlo (tj. pravidlo tvaru ) nebo
- v existuje právě jedno -pravidlo a se nevyskytuje na pravé straně žádného pravidla z .
**Jednoduchým pravidlem** nazýváme každé pravidlo tvaru , kde .
CFG se nazývá **necyklická**, právě když neexistuje takový, že .
\\
se nazývá **vlastní**, právě když je bez nepoužitelných symbolů, bez -pravidel a necyklická.
\\
Ke každému neprázdnému bezkontextovému jazyku existuje **vlastní** bezkontextová gramatika, která jej generuje.
Neterminál A v CFG se nazývá **rekursivní** jestliže v existuje derivace . Je-li resp. , pak A se nazývá levorekursivní resp. pravorekursivní. CFG bez levorekursivních terminálů se nazývá nelevorekursivní. jsou levé strany pravidel v //**P**//.
Osobně se domnívám, že otázka je dostatečně obsáhlá na to, aby při ní //nebyla// vyžadována znalost algoritmů na odstranění nepoužitelných symbolů, jednoduchých pravidel, levé rekurze atd. Pokud by někdo přeci jen chtěl tyto algoritmy nastudovat, nalezne je ve skriptech Formální jazyky a automaty, počínaje stranou 62 (=68 v pdf).
===== 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.
===== 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 , lze psát ve tvaru , kde alespoň jedno ze slov je neprázdné (tj. ), a pro všechna .
Pokud by to někdo chtěl čistě matematicky pro "lehčí" zapamatování:
Lemma o vkládání je vlastně ve tvaru implikace. 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:
===== Rozhodnutelné vlastnosti =====
Pro třídu bezkontextových jazyků jsou rozhodnutelné následující vlastnosti:
* **Problém příslušnosti:** Ke každé CFG je možné sestrojit PDA a můžeme tak ověřit jestli daný PDA přijme nebo zamítne slovo //w//.
* **Problém prázdnosti:** Stačí ověřit zda . ( je množina použitelných symbolů vzhledem k typu I.)
* **Problém konečnosti:** Ke každé CFG lze sestrojit čísla taková, že je nekonečný, právě když existuje slovo takové, že