FAV-ZCU/KIV TI/02. Jazyky a gramatiky.md

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
  • řetězec (slovo)
    • značení: ab, aacabaaab, e
      • e, \lambda - prázdný řetězec
    • libovolná konečná posloupnost písmen abecedy
  • 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
  • iterace abecedy \sum
    • značení: \sum^*
    • množina všech řetězců vytvořených z písmen abecedy \sum
  • zřejmé: \sum^* = \sum^+ \cup \, \{e\}
  • jazyk L nad abecedou $\sum$
    • libovolná množina řetězců nad abecedou \sum, tedy L \subseteq \sum^*
    • jazyky chápeme jako množiny

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 a v
    • 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
  • 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\}

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)
  • 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

Jazyk akceptovaný deterministickým konečným rozpoznávacím automatem - definice

  • automat A\left( Q, \sum, \delta, q_{0}, F \right) akceptuje jazyk L(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í symbol
  • P - 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 jazyk L(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 na z právě tehdy, když existují řetězce x_{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
  • přepsání
    • řetězec w lze přepsat na z právě tehdy, když existují řetězce w_{0}, w_{1}, \dots, w_{n} \in (N \cup T)^* takové, že
      • w = 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 slova w
      • délka odvození je n
      • značení: a \stackrel{*}{\implies} z

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 nebo X \to w Y
    • X, Y \in N, w \in T^*
  • gramatiky typu 3 levé (G3L)
    • všechna pravidla jsou ve tvaru X \to w nebo X \to Y w
    • X, Y \in N, w \in T^*
  • názvy: pravá lineární gramatika, levá lineární gramatika

Jak určit gramatiku?

  • gramatika je typu i, jsou-li všechna pravidla typu i 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, kde X \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 nebo X \to e, kde X, Y \in N a a \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:

  1. množina T a počáteční symbol S jsou v G' stejné jako v G
  2. množinu přepisovacích pravidel P' zkonstruujeme takto:
    1. do P' zařadíme všechna pravidla z P, která jsou v pořadovaném regulárním tvaru X \to aY nebo X \to e, kde X, Y \in N a a \in T
    2. za pravidla X \to x_{1}x_{2}\dots x_{n}Y z P (X, Y \in N, x_{i} \in T) přidáme do P' 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}
    3. za každé pravidlo X \to z_{1}z_{2}\dots z_{n} z P (X \in N, z_{i} \in T) přidáme do P' 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
    4. místo pravidel tvaru X \to Y z P přidáme do P' 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\}
  3. množina neterminálních symbolů N' vznikne obohacením množiny N 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á funkce
  • F \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žiny Q
    • 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 mezi S a F 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žinu K \subseteq Q a konkrétní vstupní písmeno x se získá jako sjednocení hodnot funkce \delta pro všechny prvky množiny K a vstupní písmeno x
  • 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žiny $F$)

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 stavu X 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:

  1. \emptyset je regulární množina
  2. \{ e \} je regulární množina
  3. \{ a \} je regulární množina \forall \, a \in \sum
  4. jsou-li P a Q regulární množiny, pak
    1. P \cup Q je regulární množina
    2. P \cdot Q je regulární množina
    3. P^* a Q^* jsou regulární množiny
  5. neexistují žádné jiné regulární množiny

Regulární výrazy

  1. \emptyset je regulární výraz označující regulární množinu \emptyset
  2. e je regulární výraz označující regulární množinu \{ e \}
  3. a je regulární výraz označující regulární množinu \{ a \} \quad \forall \, a \in \sum
  4. jsou-li p a q regulární výrazy označující regulární množiny P a Q, pak
    1. p + q je regulární výraz označující regulární množinu P \cup Q
    2. p \cdot q je regulární výraz označující regulární množinu P \cdot Q
    3. p^* a q^* jsou regulární výrazy ozn. regulární množiny P^* a Q^*
  5. 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 do K ohodnocená regulárním výrazem R
  • 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 symbolem e
  • výsledkem je přechodový graf NKA

Sestrojení ekvivalentního RV z NKA

  • opačný postup