17 KiB
Jazyky
Množinový přístup k pojmu jazyk nad abecedou; abeceda, uzávěr abecedy, iterace abecedy
- abeceda
- značení:
\sum = \{a, b, c\}
- konečná neprázdná množina symbolů
- prvky abecedy: písmena
- značení:
- řetězec (slovo)
- značení:
ab, aacabaaab, e
e, \lambda
- prázdný řetězec
- libovolná konečná posloupnost písmen abecedy
- značení:
- uzávěr abecedy
\sum
- značení:
\sum^+
- množina všech neprázdných řetězců vytvořených z písmen abecedy
\sum
- značení:
- iterace abecedy
\sum
- značení:
\sum^*
- množina všech řetězců vytvořených z písmen abecedy
\sum
- značení:
- zřejmé:
\sum^* = \sum^+ \cup \, \{e\}
- jazyk
L
nad abecedou $\sum$- libovolná množina řetězců nad abecedou
\sum
, tedyL \subseteq \sum^*
- jazyky chápeme jako množiny
- libovolná množina řetězců nad abecedou
Operace
Operace nad řetězci, operace nad jazyky (zřetězení, mocnina, reverze, délka řetězce, sjednocení, průnik, doplněk, rozdíl, zřetězení jazyků)
- řetězce
u
av
- zřetězení
\sum^* \times \sum^* \to \sum^*
u \cdot v = a_{1}a_{2}\dots a_{n}b_{1}b_{2}\dots b_{n}
- mocnina
\sum^* \times \, N_{0} \to \sum^*
u^0 = e
u^1 = u
u^2 = u \cdot u
- reverze (obrácení)
\sum^* \to N_{0}
u^R = a_{n}a_{n-1}\dots a_{1}
- délka
|u| = n
|e| = 0
- zřetězení
- jazyky
- sjednocení
L = L_{1} \cup L_{2}
- průnik
L = L_{1} \cap L_{2}
- doplněk
L = \overline{L_{1}}
- rozdíl
L = L_{1} / L_{2}
- zřetězení
L = L_{1} \cdot L_{2} = L_{1}L_{2}
A = \{a, b, c\}, B = \{0, 1\}
AB = \{a0, a1, b0, b1, \dots\}
- sjednocení
Popis
- množinový
- výčtem
- společnou vlastností řetězců
- akceptační
- automatem, který jazyk rozpoznává
- každý rozpoznávací automat jednoznačně definuje jazyk jako množinu všech řetězců, které automat převedou z počátečního stavu do některého z koncových stavů
- nemusí být konečný (existují i jiné automaty)
- automatem, který jazyk rozpoznává
- generativní
- pravidly pro vytváření řetězců, tedy gramatikou
- popsání správných řetězců pomocí formálních pravidel
- pomocí pravidel možné generovat řetězce patřící do jazyka
- přepisovací pravidla
- postupně nahrazujeme pomocné symboly
- odvozování končí, pokud nezbývají žádné pomocné symboly
- pravidly pro vytváření řetězců, tedy gramatikou
Jazyk akceptovaný deterministickým konečným rozpoznávacím automatem - definice
- automat
A\left( Q, \sum, \delta, q_{0}, F \right)
akceptuje jazykL(A) = \left\{ w; w \in \sum^* \wedge \, \delta^*(q_{0}, w) \in F \right\}
- TODO
Gramatika
Definice formální gramatiky:
Uspořádaná čtveřice G = (N, T, S, P)
N
- množina neterminálních symbolůT
- množina terminálních symbolůN \cap T = \emptyset
S \in N
- počáteční symbolP
- množina přepisovacích pravidel ve tvaru\alpha \to \beta
\alpha \in (N \cup T)^* N (N \cup T)
- na levé straně alespoň jeden neterminální symbol
\beta \in (N \cup T)^*
- na pravé straně může být i prázdný řetězec
Běžné konvence
- neterminální symboly: <podmět>, <identifikátor>, ... nebo S, A, B, C
- terminální symboly: 0, 1, 2, ... nebo a, b, c, d, f, ...
- řetězce:
\alpha, \beta, \gamma, \delta,
... nebo u, v, w, x, y, z
Chomského klasifikace gramatik
- gramatiky klasifikovány do 4 tříd
- třídy: 0, 1, 2, 3
- určující pro zařazení gramatiky je nejvyšší třída, jejímž pravidlům gramatika vyhovuje
- všechny gramatiky vyhovují pravidlům pro gramatiky třídy 0
- každá další (tj. vyšší) třída zpřísní formální požadavky na tvar přepisovacích pravidel
- nejužší třída 3 obsahuje gramatiky generující jazyky rozpoznatelné KA
Generace řetězců gramatikou
Generování řetězců gramatikou, přímé přepsání, přepsání, jazyk generovaný gramatikou
- gramatika
G
generuje jazykL(G)
jako množinu všech terminálních řetězců, které lze v gramtice odvodit z počátečního symbolu - mějme řetězce
w \in (N \cup T)^* N (N \cup T)^*
z \in (N \cup T)^*
- přímé přepsání
- řetězec
w
lze přímo přepsat naz
právě tehdy, když existují řetězcex_{1}, x_{2}, u, v \in (N \cup T)^*
takové, že zároveň platíw = x_{1} \, u \, x_{2}
z = x_{1} \, v \, x_{2}
u \to v \in P
- značení:
w \implies z
- řetězec
- přepsání
- řetězec
w
lze přepsat naz
právě tehdy, když existují řetězcew_{0}, w_{1}, \dots, w_{n} \in (N \cup T)^*
takové, žew = w_{0} \implies w_{1} \implies \dots \implies w_{n} = z
- tato sekvence přepsání se nazývá odvozením (derivací) slova
z
ze slovaw
- délka odvození je
n
- značení:
a \stackrel{*}{\implies} z
- délka odvození je
- řetězec
Odvození řetězců
- vyjdeme z počátečního symbolu
S
- v dosud odvozeném řetězci najdeme levou stranu některého přepisovacího pravidla
- řetězec přepíšeme tak, že tuto levou stranu nahradíme odpovídající pravou stranou, přičemž levý i pravý kontext zůstane zachován
- takto postupujeme dokud nedojdeme k řetězci, který se skládá pouze z terminálních symbolů
Jazyk generovaný gramatikou
- množina všech terminálních řetězců, které lze v gramatice odvodit z počátečního symbolu
L(G) = \{w | w \in T^* \wedge S \stackrel{*}{\implies} w\}
Typy gramatik
Gramatika typu 0 (G0)
- pravidla ve tvaru
\alpha \to \beta
\alpha \in (N \cup T)^* N (N \cup T)^*
- na levé straně musí být alespoň jeden neterminální symbol
\beta \in (N \cup T)^*
- na pravé straně může být i prázdný řetězec
Gramatika typu 1 (G1)
- všechna pravidla jsou ve tvaru
\alpha X \beta ⟶ \alpha \gamma \beta
\alpha, \beta \in (N \cup T)^*
X \in N
\gamma \in (N \cup T)^+
- výjimka: v gramatice může být pravidlo
S \to e
, pak se ale S nesmí vyskytnout na pravé straně přepisovacích pravidel - názvy: kontextová gramatika, context sensitive grammar (CSG), nevypouštěcí gramatika
Gramatika typu 2 (G2)
- všechna pravidla jsou ve tvaru
X \to \gamma
X \in N
\gamma \in (N \cup T)^*
- názvy: bezkontextová gramatika, ontext free grammar (CFG)
- nejpoužívanější gramatiky jsou G2
- nejpropracovanější metody syntaktické analýzy
Srovnání kontextových a bezkontextových gramatik
- kontextová:
\quad \alpha X \beta \to \alpha \gamma \beta\quad
(pravidlo 1) - bezkontextová:
\quad X \to \gamma\quad
(pravidlo 2)
- podle pravidla 1 může dojít k substituci
X
za\gamma
pouze ve „správném kontextu“ (tj. „zleva\alpha
, zprava $\beta$“ ) - podle pravidla 2 může dojít k substituci
X
za\gamma
kdykoli
Gramatika typu 3
- gramatiky typu 3 pravé (G3P)
- všechna pravidla jsou ve tvaru
X \to w
neboX \to w Y
X, Y \in N, w \in T^*
- všechna pravidla jsou ve tvaru
- gramatiky typu 3 levé (G3L)
- všechna pravidla jsou ve tvaru
X \to w
neboX \to Y w
X, Y \in N, w \in T^*
- všechna pravidla jsou ve tvaru
- názvy: pravá lineární gramatika, levá lineární gramatika
Jak určit gramatiku?
- gramatika je typu
i
, jsou-li všechna pravidla typui
nebo vyššího\implies
o typu gramatiky rozhoduje „nejhorší pravidlo“ (pravidlo s nejnižším typem) - vyskytují-li se v gramatice současně pravidla typu G3P a G3L, nejedná se o gramatiku typu G3, ale (v nejlepším případě) o typ G2
- pravidla, která se mohou vyskytnout v G3P i G3L, označujeme jako pravidla typu G3 (symetrická)
- tvar pravidel u G1 je takový, že existují gramatiky typu G2 a G3, které mu nevyhovují (mohou obsahovat pravidla
X \to e
, kdeX \in N
; proto je v obrázku třída G1 vyznačena jen čárkovaně, zakreslení není zcela korektní
Typy jazyků
Typy jazyků, hierarchické uspořádání tříd jazyků, hierarchie modelů jejich syntaktických analyzátorů
Jazyk L
je typu i
jestliže existuje gramatika G
typu i
taková, že L = L(G)
.
- typ jazyka je typ nejvyšší gramatiky, která generuje jazyk
třída | název | model syntaktického analyzátoru |
---|---|---|
0 | rekurzivně vyčíslitelné jazyky | Turingův stroj |
1 | kontextové jazyky | lineárně omezený Turingův stroj |
2 | bezkontextové jazyky | nedeterministický zásobníkový automat |
3 | regulární jazyky | konečný automat |
Největší praktické použití mají bezkontextové jazyky. Současné programovací a specifikační jazyky jsou vesměs třídy 2.
Cesta od gramatiky typu G3P ke konečnému automatu (obecný popis)
- ke každé gramatice typu G3P existuje ekvivalentní gramatika s pravidly ve tvaru
X \to aY
neboX \to e
, kdeX, Y \in N
aa \in T
- pojem KA zobecníme na nedeterministický konečný automat, který bude připouštět nejednoznačné přechody
- ke každému nedeterministickému konečnému automatu existuje konečný automat ve smyslu dosavadní definice
Převod gramatiky G3P na regulární tvar
Tvrzení: Ke každé gramatice G = (N, T, S ,P)
typu G3P existuje gramatika G' = (N', T', S', P')
s pravidly v regulárním tvaru X \to aY
nebo X \to e
, kde X, Y \in N
a a \in T
, taková, že L(G) = L(G')
.
Postup pro konstrukci ekvivalentní gramatiky v regulárním tvaru:
- množina
T
a počáteční symbolS
jsou vG'
stejné jako vG
- množinu přepisovacích pravidel
P'
zkonstruujeme takto:- do
P'
zařadíme všechna pravidla zP
, která jsou v pořadovaném regulárním tvaruX \to aY
neboX \to e
, kdeX, Y \in N
aa \in T
- za pravidla
X \to x_{1}x_{2}\dots x_{n}Y
zP (X, Y \in N, x_{i} \in T)
přidáme doP'
soustavu pravidel:X \to x_{1}X_{1}
X_{1} \to x_{2}X_{2}
- ...
X_{n-2} \to x_{n-1}X_{n-1}
X_{n-1} \to x_{n}X_{n}
- za každé pravidlo
X \to z_{1}z_{2}\dots z_{n}
zP (X \in N, z_{i} \in T)
přidáme doP'
soustavu pravidel:X \to z_{1}Z_{1}
Z_{1} \to z_{2}Z_{2}
- ...
Z_{n-1} \to z_{n}Z_{n}
Z_{n} \to e
- místo pravidel tvaru
X \to Y
zP
přidáme doP'
soustavu pravidel ve tvaru:Z' \to zZ'' \space \forall \, Z' \in U(Y) \space \forall \, Y \to zZ''
- kde
U(Y) = \{X | X \stackrel{*}{\implies} Y\}
- do
- množina neterminálních symbolů
N'
vznikne obohacením množinyN
o všechny nové neterminální symboly vytvořené v bodech 2.2 a 2.3
Poznámky k praktickému provedení transformace:
- provedení bodů 2.2 a 2.3 je triviální (dochází k postupnému odřezávání terminálních symbolů)
- k provedení bodu 2.4 je u složitějších gramatik vhodné nakreslit pomocný graf, který bude zobrazovat pravidla tvaru
X \to Y
a z něj vyčíst všechny množiny U(X) - důležitým faktorem je udržet si přehled v tom, která pravidla jsem již zpracoval (nahradil ekvivalentními soustavami pravidel), je tedy vhodné si zpracovaná pravidla v zadání označovat (odškrtávat)
Nedeterministický rozpoznávací KA
A = \left( Q, \sum, \delta, S, F \right)
Q
- konečná neprázdná množina stavů\sum
- konečná neprázdná množina vstupních symbolůS \subseteq Q
- množina počátečních stavů\delta : Q \times \left( \sum \cup \{e\} \right) \to 2^Q
- přechodová funkceF \subseteq Q
- množina koncových stavů
poznámky:
- na začátku se automat nachází v některém ze stavů množiny
S
- $e$-hrany může (ale nemusí) provádět automat samovolně
- obor hodnot přechodové funkce
2^Q
představuje množinu všech podmnožin stavové množinyQ
- pro konkrétní stav a vstupní písmeno může být hodnotou funkce více než jeden následující stav
- automat je vždy pouze v jednom stavu, přejde vždy do některého z možných
Typy nedeterminismu
- nejednoznačně určený počáteční stav (může jich být více)
- nejednoznačné přechody (více přechodů ze stavu se stejným znakem)
- možnost samovolného přechodu ($e$-přechody)
Řetězec akceptovaný NKA
- u deterministického KA je možné určit, do jakého stavu se zpracováním řetězce dostal, u NKA to možné není
Řetězec w
je NKA akceptován právě tehdy, jestliže v přechodovém grafu existuje alespoň jedna cesta, jejíž hrany jsou ohodnoceny písmeny řetězce w
(nebo symboly e
), která začíná v některém z počátečních stavů a končí v některém z koncových stavů.
- prázdný řetězec
e
je akceptován, pokud existuje průnik meziS
aF
nebo když existuje cesta složená z $e$-hran z některého počátečního stavu do některého koncového - různé možnosti zpracování řetězce chápeme jako různé výpočty
Závěr
- ke každému NKA existuje ekvivalentní KA
- KA a NKA rozpoznávají tutéž třídu jazyků
Převod NKA na ekvivalentní (D)KA
Popis převodu (bez $e$-hran)
- předem nelze určit počet stavů ekvivalentního KA
- počáteční stav KA odpovídá množině počátečních stavů NKA
- stavy KA vytváříme postupně tak, že vyhodnocujeme přechodovou funkci
\delta'
pro již vypočítané stavy KA (začínáme od počátečního stavu) - hodnota přechodové funkce
\delta'
pro konkrétní podmnožinuK \subseteq Q
a konkrétní vstupní písmenox
se získá jako sjednocení hodnot funkce\delta
pro všechny prvky množinyK
a vstupní písmenox
- koncovými stavy KA (tedy množinou
F'
) budou všechny stavy, které v sobě obsahují některý z koncových stavů výchozího NKA (tedy množinyF
)
K sestrojení NKA k levé lineární gramatice je potřeba provést její reverzi, poté převod a následně reverzi automatu.
Reverze gramatiky
Reverzní gramatika G^R
ke gramatice G
je gramatika, které má na levé i pravé straně převrácené řetězce z gramatiky G
.
- příklad
G
S \to aS
aS \to bA | bba
A \to abb
G^R
S \to Sa
Sa \to Ab | abb
A \to bba
Reverze rozpoznávacího NKA
Reverzní automat A^R
k automatu A
je automat, v jehož přechodovém grafu jsou obráceny orientace všech šipek (obrací se orientace přechodových hran a zamění se počáteční a koncové stavy).
Ekvivalentní KA k NKA s $e$-hranami
- nejprve je potřeba vytvořit ekvivalentní NKA bez $e$-hran
- poté k němu vytvoříme ekvivalentní KA známým způsobem
Ekvivalence odstranění $e$-hran
- pro každý stav
X
je potřeba vytvořit množinu $e$-následníků, tedy stavů, které jsou ze stavuX
dosažitelné cestami složenými z $e$-hran - každý stav je $e$-následníkem sebe samého
Množiny $e$-následníků použijeme
- k vytvoření přechodové tabulky ekvivalentního NKA bez $e$-hran tím, že stavy v množinách určující hodnoty funkce
\delta
nahradíme všemi jejich $e$-následníky - k vytvoření počátečního stavu ekvivalentního KA tím, že každý počáteční stav v množině
S
nahradíme všemi jeho $e$-následníky
Regulární výrazy
Regulární množiny
- regulární množina je regulární jazyk (množina řetězců, ke které existuje konečný automat, který ji rozpozná)
Regulární množina nad abecedou \sum
je definována rekurzivně takto:
\emptyset
je regulární množina\{ e \}
je regulární množina\{ a \}
je regulární množina\forall \, a \in \sum
- jsou-li
P
aQ
regulární množiny, pakP \cup Q
je regulární množinaP \cdot Q
je regulární množinaP^*
aQ^*
jsou regulární množiny
- neexistují žádné jiné regulární množiny
Regulární výrazy
\emptyset
je regulární výraz označující regulární množinu\emptyset
e
je regulární výraz označující regulární množinu\{ e \}
a
je regulární výraz označující regulární množinu\{ a \} \quad \forall \, a \in \sum
- jsou-li
p
aq
regulární výrazy označující regulární množinyP
aQ
, pakp + q
je regulární výraz označující regulární množinuP \cup Q
p \cdot q
je regulární výraz označující regulární množinuP \cdot Q
p^*
aq^*
jsou regulární výrazy ozn. regulární množinyP^*
aQ^*
- neexistují žádné jiné regulární výrazy
- vztah mezi regulární množinou a regulárním výrazem:
- regulární výraz R označuje regulární množinu A
- regulární množina A je hodnotou regulárního výrazu R
- značení
A = \Vert R\Vert
Souvislost s konečnými automaty
KA rozpoznávající regulární množiny
- předpokládejme, že NKA má právě jeden počáteční a právě jeden koncový stav (pokud ne, doplníme $e$-hrany)
Sestrojení NKA akceptující jazyk popsaný RV
- provádí se postupným rozkladem reg. výrazu R a odpovídající transformací zobecněného přechodového grafu
- zobecněný přechodový graf = přechodový graf, kde ohodnocením hrany může být také regulární výraz
- výchozí zobecněný přechodový graf
- počáteční stav
S
- koncový stav
K
- hrana z
S
doK
ohodnocená regulárním výrazemR
- počáteční stav
- výchozí zobecněný přechodový graf
- transformace grafu přidává nové stavy a nové přechodové hrany, čímž se zjednodušují regulární výrazy
- proces končí, pokud jsou všechny hrany ohodnoceny písmenem
\sum
nebo symboleme
- výsledkem je přechodový graf NKA
Sestrojení ekvivalentního RV z NKA
- opačný postup