Ciele
- Definovať pumpovaciu lemu pre bezkontextové jazyky a demoštrovať jej využitie pri dôkaze neprislúšnosti jazyka do triedy bezkontextových jazykov.
- Osvojiť si princípy konštrukcie kontextových a frázových gramatík na báze riešenia reprezentatívnych príkladov.
- Presne opísať Turingov stroj ako výpočtový model s konkrétnymi inštrukciami.
- Navrhnúť a implementovať Turingov stroj pre konkrétny jazyk.
Úvod
V predchádzajúcich cvičeniach sme sa venovali regulárnym a bezkontextovým jazykom, pričom sme ukázali, že aj tieto formálne modely umožňujú opísať množstvo jazykových konštrukcií. V tomto cvičení sa bližšie zoznámime s tzv. pumpovacou lemou pre bezkontextové jazyky, ktorá predstavuje dôležitý nástroj na dokazovanie, že niektorý jazyk nie je bezkontextový.
Pochopenie limitácií bezkontextových jazykov nás zároveň prirodzene vedie k potrebe silnejších modelov výpočtu, konkrétne kontextových gramatík a frázových gramatík, ktoré sa nachádzajú na vyšších úrovniach Chomskeho hierarchie.
Záver kapitoly venujeme Turingovým strojom, ktoré sú najsilnejším modelom medzi klasickými výpočtovými modelmi a umožňujú formalizovať pojmy algoritmu a výpočítateľnosti.
Postup
Krok 1
Pumpovacia léma pre bezkontextové jazyky predstavuje dôležitý koncept, často využívaný pre dôkaz nepríslušnosti jazyka do triedy bezkontextových jazykov. Jej platnosť vyplýva z faktu, že odvodenie dostatočne dlhých slov bezkontextového jazyka nevyhnutne obsahuje opakovania určitých neterminálnych symbolov, čo je dôsledok obmedzeného počtu neterminálov a stromovej štruktúry derivácií.
Nech $L$ je bezkontextový jazyk. Potom existuje prirodzené číslo $p$, pumpovacia dĺžka taká, že všetky slová $w \in L$, ktorých dĺžka $|w| \geq p$, možno vyjadriť v tvare $w = uvxyz$, pričom:
- $|vxy| \leq p$,
- $|vy| > 0$,
- $\forall i\in \mathbb{N}_0$: $uv^ixy^iz \in L$.
Teraz sa pozrieme na intuíciu za pumpovacou lemou pre bezkontextové jazyky. Princíp je analogický tomu pre regulárne jazyky. V tomto prípade sa však nebudeme zameriavať na akceptačný spôsob špecifikácie jazyka pomocou automatu ale na generatívny spôsob špecifikácie jazyka prostredníctvom formálnej gramatiky.
Každé slovo generované bezkontextovou gramatikou možno reprezentovať ako strom odvodenia (derivačný strom). Listy tohto stromu zodpovedajú teminálnym symbolom, ktoré tvoria výsledné slovo, zatiaľ čo orientované cesty od koreňa k listom predstavujú sekvencie neterminálnych symbolov ukončené terminálnym symbolom. Ak má takýto strom výšku $h$ a maximálny faktor vetvenia $b$, potom počet listov neprekročí $b^h$. Z toho vyplýva, že pre všetky slová $w$ generované touto gramatikou platí: $$|w|\leq b^h,$$
kde:
- maximálny faktor vetvenia $b$ stromu odvodenia zodpovedá maximálnej dĺžke pravej strany pravidla danej gramatiky a
- výška stromu odvodenia $h$ maximálnej dĺžke orientovanej cesty v strome.
Zvoľme teraz konštantu $p = b^{|N|} + 1$, kde $|N|$ je počet neterminálnych symbolov v danej gramatike. Pre slová, na ktoré sa vzťahuje pumpovacia lema, potom platí: $$ \begin{align*} |w| &\geq p = b^{|N|}+1\\ &> b^{|N|}\quad &&\text{(tranzitivnos}\check{\text{t}}\ >\text{)}\\ b^{|N|} &< b^h &&\text{(preto}\check{\text{z}}\text{e }|w|\leq b^h\text{, tranzitivnos}\check{\text{t}}\ <\text{)}\\ \Rightarrow |N| &< h. &&\text{(monotonnos}\check{\text{t}}\text{ rastucej exponencialnej funkcie)}\\ \end{align*} $$
Z tejto nerovnosti vyplýva, že v odvodzovacom strome musí existovať orientovaná cesta dĺžky väčšej ako $|N|$. Pretože však máme len $|N|$ rôznych neterminálnych symbolov, aspoň jeden neterminálny symbol sa na tejto ceste musí zopakovať (pozri Obrázok 1), čo je priamy dôsledok Dirichletovho princípu (angl. pigeonhole principle), podľa ktorého nie je možné rozdeliť $h$ prvkov do $|N|$ kategórií, kde $h > |N|$, bez aspoň jedného opakovania. Toto opakovanie neteminálneho symbolu zabezpečí možnosť napumovať slovo tak, ako to prezentuje Obrázok 2.
Príklad
Dokážte, že jazyk $L=\{a^nb^nc^n\mid n\in\mathbb{N}\}$ nie je bezkontextový.
Riešenie
Postupovať budeme analogicky ako v prípade dôkazu neregularity jazyka, teda dôkazom sporom
-
Prvým krokom dôkazu je predpoklad, že tento jazyk je bezkontextvý a platí preň pumpovacia lema.
-
Predpokladáme, že existuje také číslo $p$ (pumpovacia konštanta), že slová s dĺžkou aspoň $p$ možno rozdeliť na základe vyššie prezentovaného princípu na peť časti $u,v,x,y,z$.
-
Určime slovo $w$, pre ktoré platí $|w|\geq p.$ Takýmto slovom je napíklad slovo $a^pb^pc^p$, keďže $$|w|=|a^pb^pc^p|=|a^p|+|b^p|+|c^p|=p+p+p=\underline{\underline{3p\geq p}}.$$
-
Teraz vykonáme tzv. analýzu prípadov, v rámci ktorej preskúmame všetky možné dekompozície tohto slova. Zameriame sa pritom na časti, ktoré možno napumpovať. Keďže $|vxy|\leq p$ je zrejmé, že pri dekompozícii môžu nastať len nasledujúce štyri prípady:
- $vxy$ je tvorené len symbolmi $a$
Z 2. bodu PL je zrejmé, že $vy$ obsahuje aspoň jeden symbol $a$. Pri napumnovaní týchto častí sa preto počet symbolov $a$ v slove navýši, zatiaľ čo počet symbolov $b$ a $c$ zostane nezmení, keďže sú súčasťou $z$. Takéto slovo však nepatrí jazyku $L$, čo predstavuje SPOR s tretím bodom PL.- $vxy$ je tvorené len symbolmi $b$; $vxy$ je tvorené len symbolmi $c$
Tieto prípady dekompozície vedu takiež k SPORU s tretím bodom PL, a to analogicky, ako predchádzajúci prípad.- $vxy$ je tvorené len symbolmi $a$, $b$
V tomto prípade možno napumpovaním častí $v$, $y$ dosiahnuť zvýšenie počtu symbolov $a$ alebo symbolov $b$ alebo oboch symbolov $a$ aj $b$, zatiaľ čo počet symbolov $c$ zostane nezmení. Takéto slovo však nepatrí jazyku $L$, čo predstavuje SPOR s tretím bodom PL.- $vxy$ je tvorené len symbolmi $b$. $c$
Tento prípad dekompozície vedie takiež k SPORU s tretím bodom PL, a to analogicky, ako predchádzajúci prípad.
Záver: Kedže v každom prípade sme dospeli k sporu, možno konštatovať, že jazyk $L$ nie je bezkontextový Q.E.D.
Úloha 1.1
Dokážte, že jazyk $L=\{a^ib^jc^k\mid i\leq j\leq k\}$ nie je bezkontextový.
Úloha 1.2
Dokážte, že jazyk $L=\{ww\mid w\in\{0,1\}^{*}\}$ nie je bezkontextový.
Krok 2
V predchádzajúcom kroku sme sa oboznámili s bezkontextovým variantom pumpovacej lemy a jeho využitím pri dôkaze,nepríslušnosti jazyka do triedy bezkontextových jazykov. Tým sme zároveň poukázali na limity vyjadrovacej sily bezkontextových gramatík a otvorili priestor na skúmanie silnejších modelov.
V tejto časti preto rozšírime naše uvažovanie smerom ku kontextovým a frázovým gramatikám, ktoré predstavujú vyššie úrovne v Chomskeho hierarchii.
Kontextové gramatiky
Pravidlá kontextovej gramatiky musia spĺňať nasledujće obmedzenie ich tvaru: $$ \alpha_1 A \alpha_2 \to \alpha_1 \beta \alpha_2, \text{ pri}\check{\text{c}}\text{om } A\in N, \alpha_1,\alpha_2,\beta\in(N\cup T)^{*} \text{ a } \beta\neq\varepsilon \text{ okrem pripadu ke}\check{\text{d}}\text{ } A=S. $$
Hlavný rozdiel oproti bezkontextovým gramatikám spočíva v tom, že ľavá strana pravidla nemusí byť len jeden neterminálny symbol, ale môže obsahovať kontext (symboly pred a za neterminálnym symbolom). To umožňuje gramatike kontrolovať "okolie" nahrádzaného neterminálneho symbolu a tým vyjadriť väzby, ktoré bezkontextové gramatiky nedokážu zachytiť. Ďalej platí, že dĺžka ľavej strany každého pravidla musí byť menšia alebo rovná dĺžke pravej strany daného pravidla.
Poznámka
Existuje aj ekvivalentná definícia kontextovej gramatiky (s ohľadom na prázdne slovo), ktorá na tvar pravidiel kladie nasledujúce obmedzenie: $$\alpha \to \beta, \text{ pri}\check{\text{c}}\text{om } \alpha,\beta\in(N\cup T)^{*} \text{ a } |\alpha| \leq |\beta|,$$ kde $|\alpha|$ označuje počet symbolov v reťazci $\alpha$. Takéto gramatiky sa nazývajú aj monotónne, pretože počet symbolov počas odvodenia slova nikdy neklesá.
Typickým pre kontextové gramatiky je taktež využitie tzv. pravidla zámeny (z angl. swap rule) tvaru: $$A B \to B A,$$ ktoré umožňuje realizovať zámenu dvoch neterminálnych symbolov $A$ a $B$ bez porušenia špecifikácie kontextovej gramatiky. Hoci sa na prvý pohľad môže zdať, že pravidlo takéhoto tvaru porušuje túto špecifikáciu, v skutočnosti ide o prípustné správanie, keďže ho možno prepísať do ekvivalentnej trojice kontextových pravidiel s využitím pomocného neterminálu $X$, a to nasledovne:
${}$ $\underline{A} B \underline{\phantom{A}}\to \underline{A} X \underline{\phantom{A}}$ $\underline{\phantom{A}} A \underline{X}\to \underline{\phantom{A}} B \underline{X}$ $\underline{B} X \underline{\phantom{A}}\to \underline{B} A \underline{\phantom{A}}$.
Poznámka
Pre jednoduchšiu kontrolu súladu tvaru týchto pravidiel so špecifikáciou kontextových gramatík sme v jednotlivých pravidlách graficky zvýraznili kontexty podčiarknutím.
Príklad
Navrhnite kontextovú gramatiku generujúcu jazyk $L = \{ a^n b^n c^n \mid n \in \mathbb{N}_0 \}$.
Riešenie
- Zavedenie pravidla pre prázdny reťazec:
V prvom kroku vytvoríme pravidlo pre generovanie prázdneho reťazca, keďže to sa podľa definície kontextovej gramatiky, môže udiať len priamou deriváciou z jej začiatočného symbolu
S
. Neterminálny symbolS'
následne slúži na generovanie neprázdnych reťazcov tohto jazyka.
${}$ |
---|
S $\to \varepsilon$ | S' |
- Generovanie vetných foriem tvaru
aB(AB)
${}^i$c
${}^i$c
, kde $i\in\mathbb{N}_0$: Keďže všetky ostatné reťazce musia začínať (aspoň jedným) terminálnym symboloma
a končiť (aspoň jedným) terminálnym symbolomc
do gramatiky zavedieme pravidlo:
${}$ |
---|
S' $\to$ a B c |
Je zrejmé, že ak následne prepíšeme neterminálny symbol
B
na terminálny symbolb
získame najkratšie neprázdne slovo jazykaabc
. Teraz však potrebujeme špecifikovať spôsob, ako rovnomerne navyšovať počet výskytov symbolova
,b
ac
, aby sme dokázali generovať všetky slová jazyka $L$. To dosiahneme zavedením ďalších pravidiel, ktoré opakovane vkladajú nové inštancie neterminálnych symbolovA
,B
medzi existujúcea
ac
, čím vytvárajú základ pre ich neskorší prepis na terminálne symboly.
${}$ | ${}$ |
---|---|
S' |
$\to$ a B X c |
X |
$\to$ A B c | A B X c |
- Zoskupenie terminálnych symbolov
A
aB
: Vyššie uvedený systém pravidiel je schopny generovať vetné formy tvaru:aBc
,aBABcc
,aBABABccc
$\ldots$ Ako je pritom možné pozorovať tieto vetné formy zachovávajú rovnakú početnosť symbolovc
,B
, z ktorých neskôr vzniknú symbolyb
a taktiež početnosť symbolova
aA
, z ktorých neskôr vzniknú symbolya
. Problém však predstavuje striedanie neterminálnych symbolovA
aB
, ktorý však možno jednoducho vyriešiť skôr spomínaným pravidlom zámeny, tvaru:
${}$ |
---|
B A $\to$ A B . |
- Finálny prepis neterminálnych symbolov
A
,B
na terminálne symbolya
,b
: Posledným krokom je už zoskupené, teda správne usporiadané neterminálne symbolyA
aB
prepísať na terminálne symbolya
ab
. Nemožno to však vykonať jednoducho prostredníctvom pravidielA
$\to$a
,B
$\to$b
, keďže tie by sa mohli alipkovať ešte pred usporiadaním týchto neterminálnych symbolov, čo by viedlo k možnosti generovať taktiež slová, ktoré nepatria jazyku $L$. (Majú rovnaké počty terminálnych symbolova
,b
,c
a však symbolya
nie sú zoskupené na začiatku a sú prekladané symbolmib
.)
Otázkou je tak za akých okolností (v akom kontexte) vieme prepísať neterminálne symboly
A
,B
na terminálne symbolya
,b
. Odpoveďou je, keď sú už správne usporiadané, čo v prípade neterminálnych symbolovB
predstavuje dva možné prípady, ak tento symbol stojí bezprostredne pred terminálnym symbolomc
alebob
a v prípade neterminálnych symbolovA
, ak tento symbol stojí bezprostredne za terminálnym symboloma
. Všetky tieto prípady sú vyjadrené prostredníctvom nasledujúcich pravidiel gramatiky:
${}$ |
---|
B c $\to$ b c |
B b $\to$ b b |
a A $\to$ a a . |
Výsledkom je teda kontextová gramatika $G=(\{$S
, S'
, X
, A
, B
$\},\{$a
, b
, c
$\},P,$S
$)$, kde $P$ je množina pozostávajúca z nasledujúcich pravidiel:
${}$ | ${}$ |
---|---|
S |
$\to$ ε | S' |
S' |
$\to$ a B c | a B X c |
X |
$\to$ A B c | A B X c |
B A |
$\to$ A B |
B c |
$\to$ b c |
B b |
$\to$ b b |
a A |
$\to$ a a . |
Príklad
Odvoďte reťazec aaabbbccc
na základe gramatiky navrhnutej v predchádzajúcom príklade.
Riešenie
${}$ | ${}$ |
---|---|
$\phantom{\overset{(2)}{\Rightarrow}}$S |
$\overset{(2)}{\Rightarrow}$ S' |
${}$ | $\overset{(4)}{\Rightarrow}$ aBXc |
${}$ | $\overset{(6)}{\Rightarrow}$ aBABXcc |
${}$ | $\overset{(6)}{\Rightarrow}$ aBABABccc |
${}$ | $\overset{(7)}{\Rightarrow}$ aABBABccc |
${}$ | $\overset{(7)}{\Rightarrow}$ aABABBccc |
${}$ | $\overset{(7)}{\Rightarrow}$ aAABBBccc |
${}$ | $\overset{(10)}{\Rightarrow}$ aaABBBccc |
${}$ | $\overset{(10)}{\Rightarrow}$ aaaBBBccc |
${}$ | $\overset{(8)}{\Rightarrow}$ aaaBBbccc |
${}$ | $\overset{(9)}{\Rightarrow}$ aaaBbbccc |
${}$ | $\overset{(9)}{\Rightarrow}$ aaabbbccc |
Frázové gramatiky
Frázové alebo neobmezené gramatiky (z angl. unrestricted grammars) predstavujú najvšeobecnejšiu triedu formálnych gramatík v rámci Chomského hierarchie. Na rozdiel od ostatných tried nekladú na prepisovacie pravidlá žiadne obmedzenia nad rámec všeobecnej definície formálnych gramatík. Pravidlá preto môžu mať tvar: $$ \alpha \to \beta, \text{ pri}\check{\text{c}}\text{om } \alpha\in (N\cup T)^{*}N(N\cup T)^{*}, \beta \in (N ∪ T)^{*}. $$ To znamená, že ľavá strana musí obsahovať aspoň jeden neterminálny symbol, zatiaľ čo pravá strana môže byť ľubovoľný reťazec terminálnych a neterminálnych symbolov,a to vrátane prázdneho reťazca $\varepsilon$.
Príklad
Navrhnite kontextovú gramatiku generujúcu jazyk $L = \{ ww \mid w \in \{a,b\}^{*} \}$.
Riešenie
Jazyk všetkých reťazcov, ktoré pozostávajú z dvoch za sebou idúcich identických podreťazcov, nie je kontextový. Dôvodom je, že nie je možné pomocou kontextovej gramatiky (ani zásobníkového automatu) zabezpečiť rovnosť dvoch ľubovoľne dlhých reťazcov bez toho, aby sme mali možnosť uchovávať arbitrárne veľké množstvo informácie o prvom z nich. Formálne sa dá dokázať, že tento jazyk nie je bezkontextový (ani kontextový), no v tomto príklade ukážeme, ako ho možno generovať pomocou frázovej gramatiky.
Základnou myšlienkou je najprv vygenerovať vetnú formu tvaru $w$T
$w^R$#
a následne preklopiť časť $w^R$ cez #
späť do pôvodného poradia, čím vznikne reťazec $ww$. V rámci tohto mechanizmu využijeme pomocný neterminálny symbol C
("prenášač"), ktorý zabezpečuje postupný presun terminálnych symbolov (z časti $w^R$) za špeciálny oddeľovací symbol #
predstavujúci hranicu medzi novými časťami reťazca.
- Generovanie reťazca $w$
T
$w^R$#
: touto časťou gramtiky možno dovodiť vetné formy tvaru:T#
,aTa#
,bTb#
,abTba#
$\ldots$
${}$ | ${}$ |
---|---|
S |
$\to$ S' # |
S' |
$\to$ a S' a | b S' b | T |
- Preklopenie $w^R$ za oddeľovací symbol
#
pomocou "prenášača"C
: po tom, čo máme vygenerovanú vetnú formu $w$T
$w^R$#
, potrebujeme pomocou pravidiel postupne presunúť jednotlivé symboly zo začiatku $w^R$ doprava za pomocný oddeľovací symbol#
, čím sa obrátený reťazec $w^R$ preklopí do správneho poradia. Prenos symbolov realizujeme pomocou "prenášača"C
, ktorý symbol "uchopí" a pomocou výmen s nasledujúcimi symbolmi sa spolu s týmto symbolom posúva doprava. Keď sa nosič dostane pred symbol #, výmenou ho dostane za pomocný oddeľovací symbol#
. Celý tento proces je vyjadrený prostredníctvom nasledujúcich pravidiel gramatiky:
${}$ | ${}$ |
---|---|
T |
$\to$ T C |
C a a |
$\to$ a C a |
C a b |
$\to$ b C a |
C b a |
$\to$ a C b |
C b b |
$\to$ b C b |
C a # |
$\to$ # a |
C b # |
$\to$ # b |
- Odstánenie pomocných neterminálnych symbolov
T
a#
: Opakovaním predchádzajúceho kroku sa všetky symboly zo segmentu $w^R$ presunú za oddeľovací symbol#
v správnom poradí, čím vznikne vetná forma tvaru $w$T#
$w$. Následne je už len potrebné odstrániť pomocné neterminálne symbolyT
a#
stojace vedľa seba prostredníctvom nasledujúceho pravidla:
${}$ |
---|
T # $\to \varepsilon$. |
Výsledkom je teda frázová gramatika $G=(\{$S
, S'
, T
, C
, #
$\},\{$a
, b
$\},P,$S
$)$, kde $P$ je množina pozostávajúca z nasledujúcich pravidiel:
${}$ | ${}$ |
---|---|
S |
$\to$ S' # |
S' |
$\to$ a S' a | b S' b | T |
T |
$\to$ T C |
C a a |
$\to$ a C a |
C a b |
$\to$ b C a |
C b a |
$\to$ a C b |
C b b |
$\to$ b C b |
C a # |
$\to$ # a |
C b # |
$\to$ # b |
T # |
$\to \varepsilon$. |
Príklad
Odvoďte reťazec abbabb
na základe gramatiky navrhnutej v predchádzajúcom príklade.
Riešenie
${}$ | ${}$ |
---|---|
$\phantom{\overset{(2)}{\Rightarrow}}$S |
$\overset{(1)}{\Rightarrow}$ S'# |
${}$ | $\overset{(2)}{\Rightarrow}$ aS'a# |
${}$ | $\overset{(3)}{\Rightarrow}$ abS'ba# |
${}$ | $\overset{(3)}{\Rightarrow}$ abbS'bba# |
${}$ | $\overset{(4)}{\Rightarrow}$ abbTbba# |
${}$ | $\overset{(5)}{\Rightarrow}$ abbTCbba# |
${}$ | $\overset{(9)}{\Rightarrow}$ abbTbCba# |
${}$ | $\overset{(8)}{\Rightarrow}$ abbTbaCb# |
${}$ | $\overset{(11)}{\Rightarrow}$ abbTba#b |
${}$ | $\overset{(5)}{\Rightarrow}$ abbTCba#b |
${}$ | $\overset{(8)}{\Rightarrow}$ abbTaCb#b |
${}$ | $\overset{(11)}{\Rightarrow}$ abbTa#bb |
${}$ | $\overset{(5)}{\Rightarrow}$ abbTCa#bb |
${}$ | $\overset{(10)}{\Rightarrow}$ abbT#abb |
${}$ | $\overset{(12)}{\Rightarrow}$ abbabb |
Úloha 2.1
Konštruujte a kategorizujte gramatiku jazyka $L=\{a^ib^jc^k \mid i \leq j \leq k\}$ v rámci Chomskeho hierarchie gramatík.
Úloha 2.2
Konštruujte a kategorizujte gramatiku jazyka $L=\{a^{2^{n}} \mid n\in\mathbb{N}_0\}$ v rámci Chomskeho hierarchie gramatík.
Krok 3
Turingov stroj (TS) predstavuje najvšeobecnejší model výpočtového zariadenia, ktorý zohráva rovnakú úlohu pri akceptácii rekurzívne vyčísliteľných jazykov (t. j. algoritmicky rozpoznateľných jazykov), ako zohrávajú konečnostavové automaty pri regulárnych jazykoch a zásobníkové automaty pri bezkontextových jazykoch. Autorom tohto modelu je britský matematik, logik a kryptograf Alan Turing, ktorý je preto považovaný za jedného zo zakladateľov vedeckého odboru teoretickej informatiky.
Vzhľadom na svoju výpočtovú silu slúži TS ako teoretický základ pojmu algoritmicky riešiteľného problému, a teda aj ako referenčný model výpočtovej univerzality. Táto výpočtová univerzálnosť Turingovho stroja je formalizovaná v Church–Turingovej téze, ktorá tvrdí nasledovné.
Každá funkcia, ktorá je vypočítateľná efektívnou procedúrov (algoritmom) je vypočítateľná Turingovým strojom.
TS sa skladá z troch hlavných komponentov, ktoré sú znázornené aj na Obrázku 3:
- nekonečne dlhá páska rozdelená na bunky, z ktorých možno čítať a na ktoré možno zapisovať symboly,
- konečnostavová riadiaca jednotka a
- čítacia a zapisovacia hlava, ktorá sa môže pohybovať po páske v ľubovoľnom smere.
Turingov stroj je usporiadana sedmica: $$M=(Q,T,\Gamma,\delta,q_0,\Box,F),$$ kde:
- $Q$ je konečná množina stavov TS,
- $T$ je konečná množina prípustných vstupných symbolov (alebo vstupná abeceda) TS,
- $\Gamma$ je konečná množina páskových symbolov (tzv. pásková abeceda) TS, ktorá obsahuje aj špeciálny symbol prázdnej bunky $\Box$ (z angl. blank symbol) pričom platí, že $T\subset\Gamma$,
- $\delta$ je prechodová funkcia TS, $\delta: Q \times \Gamma \to Q \times \Gamma \times \{L,R\}$,
- $q_0$ je počiatočný alebo iniciálny stav TS, $q_0 \in Q$,
- $\Box \in \Gamma - T$ je špeciálny symbol prázdnej bunky,
- $F$ je množina akceptujúcich (alebo koncových) stavov TS, $F\subseteq Q$.
Poznámka
Symbol prázdnej bunky $\Box$ sa líši od prázdneho reťazca $\varepsilon$, keďže predstavuje špeciálny znak označujúci neprítomnosť symbolu na páske TS.
Ak je výpočtový priestor TS obmedzený na úsek pásky, ktorej veľkosť je linárne závislá od dĺžky vstupu, hovoríme o lineárne ohraničenom Turingovom stroji (angl. linear bounded automaton), ktorý slúži ako rozpoznávač kontextových jazykov.
Konfigurácia turingovho stroja $M=(Q,T,\Gamma,\delta,q_0,\Box,F)$ je usporiadaná trojica $(s_1, q, s_2)\in \Gamma^*\times Q\times \Gamma^*$, kde $s_1$ je obsah úseku pásky naľavo od hlavy TS, $q$ je aktuálny stav a $s_2$ je obsah úseku pásky začínajúci bunkov, na ktorej stojí hlava TS.
- Začiatočná konfigurácia TS $M$ je konfigurácia $ (\varepsilon, q_0, w) $, kde $w \in T^*$ je celý vstupný reťazec. To znamená že hlavica sa na začiatku výpočtu nachádza vždy na začiatku vstupného slova.
- Koncová (alebo akceptujúca) konfigurácia automatu $M$ je konfigurácia $ (s_1, q, s_2) $ kde $ q \in F $ a $s_1,s_2 \in \Gamma^*$.
Na množine konfigurácií $\Gamma^*\times Q\times \Gamma^*$ definujeme binárnu reláciu prechodu (alebo krok výpočtu) TS $\vdash\;\subseteq (\Gamma^*\times Q\times \Gamma^*)^2$ nasledovne. Nech $q, p \in Q, x,y,z \in \Gamma, s_1,s_2,s_1',s_2',s_2''\in \Gamma^*.$ Potom
$(s_1,q, s_2) \vdash (s_1',p, s_2')$ vtedy a len vtedy, keď $s_2=xs_2', s_1'=s_1y$ a $\delta(q, x)=(p,y,R)$ alebo keď $s_2=xs_2'', s_1=s_1'z, s_2'=zys_2''$ a $\delta(q, x)=(p,y,L).$
Postupnosť (sekvencia) konfigurácií $ c_0, c_1, \ldots, c_k $, pre $ k \in \mathbb{N}$ takých, že $$ c_0 \vdash c_1 \vdash \dots \vdash c_k, $$ sa nazýva výpočet TS $M$ z $c_0$ do $c_k$ a vyjadrovať ho budeme v tvare $$ c_0 \vdash^k c_k. $$
Poznámka
Číslo $k$ predstavuje počet krokov výpočtu.
Slovo $w$ je akceptované TS $M$, ak existuje výpočet, ktorého prvá konfigurácia je začiatočná konfigurácia so vstupným slovom $w$ a posledná konfigurácia je akceptujúca konfigurácia, teda $$(\varepsilon,q_0,w) \vdash^{*} (s_1,q,s_2)\text{, kde }q\in F a s_1,s_2\in\Gamma^{*}.$$
Jazyk $L(M)$ rozpoznávaný (akceptovaný) TS $M$ je teda množina:
$L(M) = \{ w \mid (\varepsilon,q_0,w) \vdash^{*} (s_1,q,s_2) \land w \in T^*,$ $s_1,s_2 \in \Gamma^* \land q \in F\}.$
Krok 4
Príklad
Navrnite Turingov stroj rozpoznávajúci kontextový jazyk $L = \{ a^n b^n c^n \mid n \in \mathbb{N}_0 \}.$
Riešenie
V prvom kroku tohto cvičenia sme dokázali, že jazyk $L$ nie je bezkontextový, preto neexistuje ZA, ktorý by ho akceptoval. Keďže v druhom kroku sme konštruovali jeho kontextovú gramatiku je zrejmé, že preň musí existovať akceptor v podobe lineárne ohraničeného TS, ktorého cieľom je overiť, či vstupný reťazec obsahuje rovnaký počet symbolov $a$, $b$ a $c$, ktoré sú navyše zoradené striktne v tomto poradí. Uveďme teda princíp fungovania TS akceptujúceho jazyk $L$.
TS bude opakovane vyhľadávať prvý neoznačený symbol $a$, ktorý následne označí ako $X$. Potom preskočí všetky už označené symboly $b$, aby našiel prvý neoznačený symbol $b$, ktorý označí ako $X$. Následne analogickým spôsobom vyhľadá zodpovedajúci symbol $c$, pričom preskočí všetky predchádzajúce značky $X$, a označí ho ako $X$. Každý úspešne vykonaný trojstupňový krok (označenie $a\to X$, $b\to X$, $c\to X$) zodpovedá jednej trojici symbolov $a_{i}$, $b_{i}$, $c_{i}$.
Výsledný automat má tak tvar $M=(\{q_0,q_1,q_2,q_3,q_4\},\{a,b\},\{a,b,X,\Box\},\delta,q_0,\Box,\{q_4\})$, kde prechodová funkcia $\delta$ je určená nasledujúcim diagramom.
Poznámka
Označenie prechodu $a\to b,D$ znamená, že z pásky sa prečíta páskový symbol $a\in \Gamma$, ktorý sa prepíše na páskový symbol $b\in \Gamma$ a následne sa vykoná posun hlavice smerom $D$.
Príklad
Navrnite Turingov stroj rozpoznávajúci rekurzívne vyčísiteľný jazyk $L = \{ ww \mid w \in \{a,b\}^{*} \}.$
Riešenie
Keďže princíp fungovania tohto TS je pomerne zložitý rozdelíme ho do štyroch fáz:
-
Prepis vstupu na označené symboly: Turingov stroj najprv postupne prepisuje vstupné slovo na ekvivalentné slovo tvorené označenými symbolmi: každý symbol $a$ nahradí symbolom $X$ a každý symbol $b$ symbolom $Y$. Symboly $X$ a $Y$ teda predstavujú označené varianty pôvodných znakov. Tento prepis sa vykonáva striedavo – najprv z ľavého a potom z pravého konca neoznačenej časti vstupného slova, čím sa zabezpečí, že stroj skončí v strede slova. (Zodpovedajúce stavy: $q_0$ až $q_3$)
-
Obnovenie ľavej polovice slova: Po označení všetkých symbolov vstupného slova stroj prepíše ľavú polovicu slova naspäť na pôvodné symboly ($X$ na $a$ a $Y$ na $b$). Tým sa obnoví prvá polovica pôvodného slova. Tento krok končí na vstupného slova. (Zodpovedajúci stav: $q_4$)
-
Porovnávanie prvej a druhej polovoce slova: V ďalšej fáze stroj iteratívne označuje symboly prvej polovice, pričom ich porovnáva s príslušnými symbolmi druhej polovice:
- najprv označí symbol z prvej polovice,
- potom preskočí všetky neoznačené symboly a symboly $\Box$ až kým nenarazí na zodpovedajúci označený symbol,
- ak sa symboly zhodujú, prepíše symbol z druhej polovice na $\Box$ a vráti sa späť k ďalšiemu neoznačenému symbolu prvej polovice.
(Zodpovedajúce stavy: $q_5$ až $q_8$)
- Akceptácia slova: Po ukončení predchádzajúcej fázy je druhá polovica slova prepísaná na symboly $\Box$. Stroj následne prejde na začiatok prvej polovice slova (ktorá je v označenej forme) a zmení svoj stav na akceptujúci. (Zodpovedajúce stavy: $q_9$ a $q_{10}$)
Výsledný automat má tak tvar $M=(\{q_0,q_1,q_2,q_3,q_4,q_5,q_6,q_7,q_8,q_9,q_{10}\},\{a,b\},\{a,b,X,Y,\Box\},$ $\delta,q_0,\Box,\{q_{10}\})$, kde prechodová funkcia $\delta$ je určená nasledujúcim diagramom.
Úloha 4.1
Navrhnite Turingov stroj, ktorý vykonáva binárne násobenie číslom $2$. Naríklad pre pre vstupné slovo $11$ sa na konci výpočtu na páske nachádza slovo $110$.
Úloha 4.2
Navrhnite Turingov stroj pre jazyk nad abecedou $A=\{a\}$, ktorý zo vstupného reťazca $w$ vytvorí na páske reťazec $ww$.
Úloha 4.3
Navrhnite Turingov stroj, ktorý vykonáva binárne násobenie číslom $3$. Naríklad pre pre vstupné slovo $101$ sa na konci výpočtu na páske nachádza slovo $111111$.
Úloha 4.4
Navrhnite Turingov stroj, ktorý rozpozná jazyk palindrómov nad abecedou $A=\{a,b\}$.
Úloha 4.5
Implementujte TS z predchádazjúcich úloch a príkladov. Akú údajovú štruktúru možno využiť pre implementáciu pásky TS?
Dotazník na ohodnotenie učiva
Vážení študenti,
týmto by sme Vás chceli požiadať o poskytnutie spätnej väzby k formátu a obsahu materiálov na cvičenia vo forme vyplnenie nasledujúceho dotazníka .
Tento dotazník slúži na ohodnotenie vašich skúseností s pripravenými materiálmi z posledného cvičenia. Na vylepšovaní materiálov na základe vašej spätnej väzby aktívne pracujeme, a to s cieľom zvýšiť kvalitu, zrozumiteľnosť a prínosnosť výučby.