====== AP8, IN8 Regulární jazyky ======
===== Zadání =====
regulární jazyky, způsoby jejich reprezentace, vlastnosti regulárních jazyků, vztah mezi konečnými automaty a regulárními gramatikami
===== Základní pojmy =====
**Abeceda** je libovolná konečná množina **znaků** (písmen, symbolů)
**Slovo** nad abecedou Sigma je libovolná konečná posloupnost znaků této abecedy
**Jazyk** nad abecedou Sigma je libovolná množina slov nad Sigma
===== Reprezentace regulárních jazyků =====
**Jazyk** //L// je **regulární**, právě když:
* může být vygenerován **regulární gramatikou** (tzn. existuje regulární gramatika //G// taková, že //L(G) = L//),
*je akceptovaný nějakým **deterministickým konečným automatem** (tzn. existuje deterministický konečný automat //M// takový, že //L(M) = L//),
* je akceptovaný nějakým **nedeterministickým konečným automatem** (tzn. existuje nedeterministický konečný automat //M// takový, že //L(M) = L//),
* může být popsán **regulárním výrazem** (tzn. existuje regulární výraz //RE// takový, že //L(RE) = L//)
==== Regulární gramatika ====
**Gramatika** //G// je čtveřice (//N//, Sigma, //P//, //S//), kde
* //N// je neprázdná konečná množina neterminálních symbolů (**neterminálů**),
* Sigma je konečná množina terminálních symbolů (**terminálů**) taková, že N inter Sigma = varnothing; N union Sigma = V je množina **všech symbolů** gramatiky,
* //P// ⊆ //V*NV* x V*// je konečná množina **pravidel**. Pravidlo (alpha, beta) obvykle zapisujeme ve tvaru alpha right beta (čteme "alfa přepiš na beta"),
* //S// in //N// je **počáteční** neterminál, neboli kořen gramatiky.
**Gramatika** je **regulární**, jestliže každé její pravidlo je tvaru //A -> aB// nebo //A -> a// s výjimkou //S -> //epsilon, pokud se //S// nevyskytuje na pravé straně žádného pravidla.
Je to gramatika typu 3 podle //Chomského hierarchie gramatik//.
==== Konečný automat ====
**Konečný automat** //M// je pětice (//Q//, Sigma, delta, //q0//, //F//), kde
* //Q// je neprázdná konečná množina **stavů**,
* Sigma je konečná množina **vstupních symbolů** (vstupní abeceda),
* delta: //Q x //Sigma //-> Q// je parciální **přechodová funkce** (delta: //Q x //Sigma// -> 2Q// totální v případě nedeterministického konečného automatu),
* //q0// in //Q// je **počáteční stav**,
* //F// ⊆ //Q// je množina **koncových stavů**
=== Rozšířená přechodová funkce deterministického konečného automatu: ===
hat{delta}: //Q x //Sigma* //-> Q// definována induktivně vzhledem k délce slova ze Sigma*:
* hat{delta}(//q//, epsilon) = //q// pro každý stav //q// in //Q//
* hat{delta}(//q//, //wa//) =
*delta(hat{delta}(//q//, //w//), //a//) je-li hat{delta}(//q//, //w//) i delta(hat{delta}(//q//, //w//), //a//) definováno
*ortho jinak
=== Rozšířená přechodová funkce nedeterministického konečného automatu: ===
hat{delta}: //Q x //Sigma* //-> 2Q//, definována induktivně vzhledem k délce slova ze Sigma*:
* hat{delta}(//q//, epsilon) = {q}
* hat{delta}(//q//, //wa//) = bigcup{p in hat{delta}(q,w)}{}{delta(p,a)}
=== Konečný automat je možné reprezentovat: ===
* uspořádanou pěticí
* tabulkou
* přechodovým grafem
* výpočetním stromem
více viz otázka [[home:inf:ap9|AP9,IN9 Konečné automaty]]
==== Regulární výrazy ====
Množina **regulárních výrazů** nad abecedou Sigma, označovaná //RE//(Sigma), je definována induktivně takto:
- epsilon, varnothing a //**a**// pro každé //a// in Sigma jsou (základní) regulární výrazy nad Sigma.
- Jsou-li //E//, //F// regulární výrazy nad Sigma, jsou také (//E.F//), (//E// + //F//) a (//E*//) regulární výrazy nad Sigma.
- Každý regulární výraz vznikne po konečném počtu aplikací kroků 1--2.
Závorky je možné vypouštět s tím, že největší prioritu má operátor " * ", pak " . " a nakonec " + "
Každý regulární výraz E nad abecedou Sigma popisuje jazyk //L(E)// nad abecedou Sigma podle těchto pravidel:
* L(epsilon) = {epsilon}
* L(varnothing) = varnothing
* L(**a**) = {a} pro každé //a// in Sigma
* L(E.F) = L(E).L(F)
* L(E+F) = L(E) union L(F)
* L(E*) = L(E)*
Ekvivalenci mezi regulárními výrazy a konečnými automaty shrnuje **Kleeneho veta**:
Libovolný jazyk je popsatelný regulárním výrazem, právě když je rozpoznatelný konečným automatem.
==== Lemma o vkládání (pumping lemma) ====
Nechť //L// je regulární jazyk. Pak existuje //n// in bbN takové, že slovo //w// in //L//, jehož délka je alespoň //n//, lze psát ve tvaru //w// = //xyz//, kde |//xy//| ≤ //n//, //y// ≠ epsilon a //xyiz// in //L// pro každé //i// in bbN0.
Lemma o vkládání je **nutnou** (nikoliv postačující) podmínkou pro regularitu jazyka a lze jej použít pro důkaz toho, že nějaký jazyk **není** regulární (NE pro důkaz toho, že jazyk je regulární!!!). Postupujeme tak, že ukážeme, že pokud platí "negace" lemmatu o vkládání, potom jazyk //L// není regulární:
* pro libovolné //n// in bbN (pumpovací konstanta)
* existuje takové //w// in //L//, délky alespoň //n//, pro které platí, že
* při libovolném rozdělení slova //w// na tři části //x//, //y//, //z//, že |//xy//| ≤ //n// a //y// ≠ epsilon
* existuje alespoň jedno //i// in bbN0 takové, že //xyiz// notin //L//
Potom z lemmatu o vkládání plyne, že //L// není regulární.
==== Myhill-Nerodova věta ====
Myhill-Nerodova věta představuje **nutnou a postačující** podmínku pro regularitu jazyka.
Pro formulaci M-N věty potřebujeme několik pomocných pojmů:
nechť Sigma je abeceda a nechť ~ je ekvivalence na Sigma*. Řekněme, že ~ je **zprava invariantní (pravá kongruence)**, pokud pro každé //u//, //v//, //w// in Sigma* platí //u// ~ //v// doubleright //uw// ~ //vw//. Index ~ je počet tříd rozkladu Sigma*/~ (pokud je těchto tříd nekonečně mnoho, klademe index ~ roven infty).
Nechť //L// je libovolný (ne nutně regulární) jazyk nad abecedou Sigma. Na množině Sigma* definujeme relaci ~//L// zvanou **prefixová ekvivalence** pro //L// takto:
//u// ~//L// //v// doubleleftright forall//w// in Sigma* : //uw// in //L// doubleleftright //vw// in //L//
Tedy ~//L// obsahuje právě ty dvojice (//u//, //v//) které mají tu vlastnost, že po připojení libovolného //w// vzniklá slova //uw//, //vw// budou do jazyka //L// patřit buď obě, nebo ani jedno z nich.
Nechť //L// je libovolný jazyk nad Sigma. Pak relace ~//L// je pravá kongruence a //L// lze vyjádřit jako sjednocení některých (ne nutně konečně mnoha) tříd rozkladu Sigma*/~//L//.
Nechť //L// je jazyk nad Sigma, pak tato tvrzení jsou ekvivalentní:
- //L// je rozpoznatelný konečným automatem.
- //L// je sjednocením některých tříd rozkladu určeného pravou kongruencí na Sigma* s konečným indexem.
- Relace ~//L// má konečný index.
===== Vlastnosti regulárních jazyků =====
==== Uzávěrové vlastnosti ====
Třída regulárních jazyků je uzavřena na:
* **sjednocení** (//L1// union //L2//),
* **průnik** (//L1// inter //L2//),
* **rozdíl** (//L1// \ //L2//),
* **komplement** (co--//L//),
* **zřetězení** (//L1//.//L2//)
* **iteraci** (//L//*),
* **pozitivní iteraci** (//L//+),
* **zrcadlový obraz (reverzi)** (//LR//)
==== Rozhodnutelné problémy pro třídu regulárních jazyků ====
Mějme konečné automaty //M// a //M'//.
Následující problémy jsou rozhodnutelné:
* **ekvivalence**: jsou //M// a //M'// ekvivalentní? (platí //L//(//M//)=//L//(//M'//)?)
* **inkluze** (jazyků): platí //L//(//M//) ⊆ //L//(//M'//)?
* **příslušnost** (slova k jazyku): je-li dáno //w// in Sigma*, platí //w// in //L//(//M//)?
* **prázdnost** (jazyka): je //L//(//M//) = varnothing?
* **univerzalita** (jazyka): je //L//(//M//) = Sigma*?
* **konečnost** (jazyka): je //L//(//M//) konečný jazyk?
===== Vztah mezi konečnými automaty a regulárními gramatikami =====
Třídy jazyků, které lze generovat regulárními gramatikami, resp. rozpoznat konečnými automaty, **jsou si rovny**. To znamená, že k dané regulární gramatice lze sestrojit ekvivalentní (deterministický, nedeterministický, ...) konečný automat a naopak.
==== Regulární gramatika → konečný automat ====
Ke každé regulární gramatice //G// =(//N//, Sigma, //P//, //S//) existuje nedeterministický konečný automat //M// = (//Q//, Sigma, delta, //q0//, //F//) takový, že //L//(//G//) = //L//(//M//).
(Důkaz viz skripta z Automatů a formálních jazyků I, str. 49)
=== Myšlenka důkazu: ===
Stavy automatu budou odpovídat neterminálům gramatiky, tj. pro každý neterminál //A// bude existovat stav overline{A}. Pro každé pravidlo //A// -> //aB// přidáme do delta(overline{A}, //a//) stav overline{B}. Abychom se mohli vypořádat také s pravidly tvaru //C// -> //a//, zavedeme speciální koncový stav //qf//, který přidáme do delta(overline{C}, //a//). Počáteční stav bude overline{S}, koncový stav //qf// a případně také overline{S}, pokud gramatika obsahuje pravidlo //S// -> epsilon.
==== Konečný automat → regulární gramatika ====
Pro každý konečný automat //M// = (//Q//, Sigma, delta, //q0//, //F//) existuje regulární gramatika //G// =(//N//, Sigma, //P//, //S//) taková, že //L//(//M//) = //L//(//G//).
(Důkaz viz skripta z Automatů a formálních jazyků I, str. 50)
=== Myšlenka důkazu: ===
Neterminály budou odpovídat stavům, pravidla budou simulovat přechodovou funkci. Je tu však jeden problém – pokud automat přijímá prázdné slovo (tj. počáteční stav je koncovým stavem), musí každá ekvivalentní gramatika nutně obsahovat pravidlo //S// -> epsilon, kde //S// je kořen. Pak se ale //S// nesmí vyskytovat na pravé straně žádného pravidla. Přitom je ale možné, že některé přechody automatu končí v počátečním stavu a mají být simulovány pravidly, které mají na pravé straně //S//, což by vedlo ke konfliktu s požadavkem pravostranných výskytů //S//. Tento problém vyřešíme tak, že ke zkonstruované gramatice (mající jak //S// -> epsilon, tak i pravostranné výskyty //S//) nalezneme ekvivalentní regulární gramatiku.
===== Poznámka =====
Lingvista Noam Chomsky rozdělil gramatiky do čtyř skupin (typů) na základě různých omezení na tvar pravidel a podle jejich popisné síly.
Chomského hierarchie rozlišuje tyto čtyři (základní) typy gramatik:
* **typ 0**
Libovolná gramatika je gramatikou typu 0; na tvar pravidel se nekladou žádné omezující požadavky. Někdy též se takové gramatiky označují jako gramatiky bez omezení či frázové gramatiky.
* **typ 1**
Gramatika je typu 1 nebo též kontextová, jestliže pro každé její pravidlo platí alpha right beta platí delim{|}{alpha}{|} <= delim{|}{beta}{|} s eventuelní výjimkou pravidla S right epsilon pokud se S nevyskytuje na pravé straně žádného pravidla.
* **typ 2**
Gramatika je typu 2, též bezkontextová, jestliže každé její pravidlo je tvaru A right alpha, kde delim{|}{alpha}{|} >= 1 s eventuelní výjimkou pravidla S right epsilon pokud se S nevyskytuje na pravé straně žádného pravidla.
* **typ 3**
Gramatika je typu 3, též regulární, jestliže každé její pravidlo je tvaru A right aB nebo A right a s eventuelní výjimkou pravidla S right epsilon, pokud se S nevyskytuje na pravé straně žádného pravidla.
===== Literatura =====
[[http://is.muni.cz/elportal/estud/fi/js06/ib005/Formalni_jazyky_a_automaty_I.pdf|Skripta Automaty a formální jazyky I]]
[[http://www.fi.muni.cz/~xstrejc/IB102/slajdy/slajdy_corr.pdf|Slidy k předmětu Automaty a gramatiky]]
===== Vypracoval =====
Lukáš Hala, 173454@mail.muni.cz
Pokud si myslíte, že tady něco chybí, přebývá nebo že je něco blbě, tak to prosím upravte ;-)
FIXME Je potřeba ještě zapracovat [[http://statnice.dqd.cz/tmp/regularni_jazyky.pdf|poznámky od Jitky Pospíšilové]].
~~DISCUSSION~~