Toggle menu
Toggle preferences menu
Toggle personal menu
Neprihlásený/á
Your IP address will be publicly visible if you make any edits.
Bez shrnutí editace
Značka: editor wikitextu 2017
Táto verzia je označená na preklad
Riadok 2: Riadok 2:


<translate>
<translate>
<!--T:1-->
== História ==
== História ==
[[Súbor:Turing_Machine_Model_Davey_2012.jpg|náhľad|251x251bod|Model Turingovho stroja, skonštruovaný Mike Daveyom, vystavený na Harvardovej univerzite v roku 2012.<ref>"A Turing Machine Overview" - Mike Davey (https://aturingmachine.com/)</ref>]]
[[Súbor:Turing_Machine_Model_Davey_2012.jpg|náhľad|251x251bod|Model Turingovho stroja, skonštruovaný Mike Daveyom, vystavený na Harvardovej univerzite v roku 2012.<ref>"A Turing Machine Overview" - Mike Davey (https://aturingmachine.com/)</ref>]]
V 30-tych rokov 20. storočia britský matematik a logik [https://sk.wikipedia.org/wiki/Alan_Turing Alan Turing] skúmal abstraktné výpočtové zariadenie, ktoré malo všetky schopnosti dnešných počítačov. Takéto zariadenie sa nazýva [https://sk.wikipedia.org/wiki/Turingov_stroj Turingov stroj].
V 30-tych rokov 20. storočia britský matematik a logik [https://sk.wikipedia.org/wiki/Alan_Turing Alan Turing] skúmal abstraktné výpočtové zariadenie, ktoré malo všetky schopnosti dnešných počítačov. Takéto zariadenie sa nazýva [https://sk.wikipedia.org/wiki/Turingov_stroj Turingov stroj].


<!--T:2-->
Otázkou bolo: dajú sa všetky problémy riešiť pomocou algoritmu?
Otázkou bolo: dajú sa všetky problémy riešiť pomocou algoritmu?


<!--T:3-->
O Turingovom stroji v kontexte formálnych jazykov a automatov hovoríme že je to "automat" - teda, zariadenie ktoré dokáže automaticky previesť nejaký vstup na výstup. Každý automat pritom využíva určité pravidlá, podľa ktorých generuje výstup - gramatiku.
O Turingovom stroji v kontexte formálnych jazykov a automatov hovoríme že je to "automat" - teda, zariadenie ktoré dokáže automaticky previesť nejaký vstup na výstup. Každý automat pritom využíva určité pravidlá, podľa ktorých generuje výstup - gramatiku.


<!--T:4-->
== Základné pojmy ==
== Základné pojmy ==
Predtým, ako môžme pochopiť čo je presne automat a ako sa dá matematiky alebo schematicky vyjadriť jeho princíp fungovania, si musíme vysvetliť základné pojmy. Našťastie, veľa z týchto pojmov už poznáme pretože ich využívame v každodennom živote, a teda znamenajú presne to, čo si pod nimi predstavujeme. Ale možno z trochu iného hľadiska - toho matematického:
Predtým, ako môžme pochopiť čo je presne automat a ako sa dá matematiky alebo schematicky vyjadriť jeho princíp fungovania, si musíme vysvetliť základné pojmy. Našťastie, veľa z týchto pojmov už poznáme pretože ich využívame v každodennom živote, a teda znamenajú presne to, čo si pod nimi predstavujeme. Ale možno z trochu iného hľadiska - toho matematického:


<!--T:5-->
=== Abeceda ===
=== Abeceda ===
Abeceda je ľubovoľná konečná množina symbolov. Označujeme ju písmenom <math>V</math>. Napríklad: <math>V = \{ a, b, c, d, \ldots, x, y, z \}</math> je množina, ktorá obsahuje všetky malé písmená (symboly) anglickej abecedy.
Abeceda je ľubovoľná konečná množina symbolov. Označujeme ju písmenom <math>V</math>. Napríklad: <math>V = \{ a, b, c, d, \ldots, x, y, z \}</math> je množina, ktorá obsahuje všetky malé písmená (symboly) anglickej abecedy.


<!--T:6-->
Symboly nemusia byť iba písmená, ale aj číslice a dokonca iné špeciálne znaky. To znamená, že aj nasledujúca abeceda je platná: <math>V = \{ -, \Psi, \Theta, \aleph, \heartsuit, \Game, \spadesuit \}</math>.
Symboly nemusia byť iba písmená, ale aj číslice a dokonca iné špeciálne znaky. To znamená, že aj nasledujúca abeceda je platná: <math>V = \{ -, \Psi, \Theta, \aleph, \heartsuit, \Game, \spadesuit \}</math>.


<!--T:7-->
=== Slovo ===
=== Slovo ===
Slovo <math>w</math> je ľubovoľná konečná postupnosť symbolov z abecedy <math>V</math>. Dĺžku slova <math>w</math> (teda, počet znakov v slove) označujeme ako <math>|w|</math>. Napríklad:<math display="block">\begin{array}{lcl}
Slovo <math>w</math> je ľubovoľná konečná postupnosť symbolov z abecedy <math>V</math>. Dĺžku slova <math>w</math> (teda, počet znakov v slove) označujeme ako <math>|w|</math>. Napríklad:<math display="block">\begin{array}{lcl}
Riadok 24: Riadok 31:
\end{array}</math>
\end{array}</math>


<!--T:8-->
==== Prázdne slovo ====
==== Prázdne slovo ====
Prázdne slovo označujeme gréckym písmenom <math>\epsilon</math> (Epsilon). Je to slovo, ktoré má nulovú dĺžku: <math>|\epsilon| = 0</math>. Predstav si to ako prázdny reťazec v programovacom jazyku: <code>"" // reťazec nulovej dĺžky: je to nič</code>. Aj keď sa na prvý pohľad zdá že to nedáva zmysel a tento symbol je nepotrebný, neskôr pri príkladoch zistíme, že spĺňa dôležitú funkciu pri popisovaní gramatík.
Prázdne slovo označujeme gréckym písmenom <math>\epsilon</math> (Epsilon). Je to slovo, ktoré má nulovú dĺžku: <math>|\epsilon| = 0</math>. Predstav si to ako prázdny reťazec v programovacom jazyku: <code>"" // reťazec nulovej dĺžky: je to nič</code>. Aj keď sa na prvý pohľad zdá že to nedáva zmysel a tento symbol je nepotrebný, neskôr pri príkladoch zistíme, že spĺňa dôležitú funkciu pri popisovaní gramatík.


<!--T:9-->
=== Jazyk ===
=== Jazyk ===
Jazyk označujeme pomocou písmena <math>L</math> (ako z anglického '''''L'''anguage''). '''Jedná sa o ľubovoľnú podmnožinu množiny <math>V^*</math> všetkých slov nad nejakou abecedou <math>V</math>.''' To znamená, že ak '''<math>V^*</math>'''obsahuje všetky možné slová (kombinácie symbolov) z abecedy '''<math>V</math>''' ktorých je nekonečne veľa, tak táto podmnožina obsahuje iba tie vybrané kombinácie symbolov (slová) ktoré sú platné pre daný jazyk (dávajú zmysel, teda: spĺňajú pravidlá danej gramatiky).
Jazyk označujeme pomocou písmena <math>L</math> (ako z anglického '''''L'''anguage''). '''Jedná sa o ľubovoľnú podmnožinu množiny <math>V^*</math> všetkých slov nad nejakou abecedou <math>V</math>.''' To znamená, že ak '''<math>V^*</math>'''obsahuje všetky možné slová (kombinácie symbolov) z abecedy '''<math>V</math>''' ktorých je nekonečne veľa, tak táto podmnožina obsahuje iba tie vybrané kombinácie symbolov (slová) ktoré sú platné pre daný jazyk (dávajú zmysel, teda: spĺňajú pravidlá danej gramatiky).


<!--T:10-->
Predstav si to, ako keby existovali všetky možné kombinácie písmen, bez ohľadu na to či by tie slová dávali zmysel alebo nie. To by predstavovala množina <math>V^*</math>, napríklad:
Predstav si to, ako keby existovali všetky možné kombinácie písmen, bez ohľadu na to či by tie slová dávali zmysel alebo nie. To by predstavovala množina <math>V^*</math>, napríklad:


<!--T:11-->
<math display="block">V^* = \{ \epsilon, a, b, c, \ldots, asdaf, asdag, \ldots, \color{green}{mama}\color{black}, \ldots, xyzhrbbdfu, \ldots \}</math>
<math display="block">V^* = \{ \epsilon, a, b, c, \ldots, asdaf, asdag, \ldots, \color{green}{mama}\color{black}, \ldots, xyzhrbbdfu, \ldots \}</math>


<!--T:12-->
Ak takáto množina obsahuje všetky kombinácie, ktorých je nekonečne veľa, tak potom podmnožina - jazyk <math>L</math> - bude obsahovať iba tie slová, ktoré sú platné pre ten jazyk (spĺňajú pravidlá definované v gramatike). Napríklad: <math>L = \{ \color{green}mama\color{black} \}</math>.
Ak takáto množina obsahuje všetky kombinácie, ktorých je nekonečne veľa, tak potom podmnožina - jazyk <math>L</math> - bude obsahovať iba tie slová, ktoré sú platné pre ten jazyk (spĺňajú pravidlá definované v gramatike). Napríklad: <math>L = \{ \color{green}mama\color{black} \}</math>.


<!--T:13-->
== Gramatika ==
== Gramatika ==
V predošlých pojmoch sa vyskytla aj gramatika. Gramatika <math>G</math> generuje iba slová ktoré patria do jazyka <math>L</math> a žiadne iné.
V predošlých pojmoch sa vyskytla aj gramatika. Gramatika <math>G</math> generuje iba slová ktoré patria do jazyka <math>L</math> a žiadne iné.


<!--T:14-->
Gramatika je definovaná ako štvorica (<math>G = (N, T, P, S)</math>), kde:
Gramatika je definovaná ako štvorica (<math>G = (N, T, P, S)</math>), kde:


<!--T:15-->
* ˆ<math>N</math> je '''konečná neprázdna množina neterminálnych symbolov''',
* ˆ<math>N</math> je '''konečná neprázdna množina neterminálnych symbolov''',
* <math>T</math> je '''konečná neprázdna množina terminálnych symbolov''', pričom <math>N \cap T = \emptyset</math> (to znamená, že tieto dve množiny nemajú spoločný žiadny symbol - symbol nemôže byť zároveň aj terminálny aj neterminálny),
* <math>T</math> je '''konečná neprázdna množina terminálnych symbolov''', pričom <math>N \cap T = \emptyset</math> (to znamená, že tieto dve množiny nemajú spoločný žiadny symbol - symbol nemôže byť zároveň aj terminálny aj neterminálny),
Riadok 48: Riadok 63:
* ˆ<math>S \in N</math> je '''začiatočný neterminálny symbol'''.
* ˆ<math>S \in N</math> je '''začiatočný neterminálny symbol'''.


<!--T:16-->
Definícia môže vyzerať naozaj strašne pre niekoho kto nevie čítať matematické zápisy. V takom prípade stačí, ak si zapamätá:
Definícia môže vyzerať naozaj strašne pre niekoho kto nevie čítať matematické zápisy. V takom prípade stačí, ak si zapamätá:


<!--T:17-->
# Pomocou gramatiky generujeme nejaké slovo ktoré jednoznačne patrí iba do jedného konkrétneho jazyka (napríklad: môžeme definovať gramatiku pre generovanie čísiel od 0 po 9 a naše pravidlá zabezpečia že výsledok bude vždy iba nejaké číslo, nie napríklad písmeno);
# Pomocou gramatiky generujeme nejaké slovo ktoré jednoznačne patrí iba do jedného konkrétneho jazyka (napríklad: môžeme definovať gramatiku pre generovanie čísiel od 0 po 9 a naše pravidlá zabezpečia že výsledok bude vždy iba nejaké číslo, nie napríklad písmeno);
# Gramatika funguje tak, že najskôr definujeme pravidlá pre postupné nahrádzanie dočasných (neterminálnych) symbolov konkrétnymi konečnými (terminálnymi) symbolmi;
# Gramatika funguje tak, že najskôr definujeme pravidlá pre postupné nahrádzanie dočasných (neterminálnych) symbolov konkrétnymi konečnými (terminálnymi) symbolmi;
# Vždy definujeme neterminálny symbol, z ktorého vychádzame. Ak nezostane nič, čo by sme mohli nahradiť, máme výsledok;
# Vždy definujeme neterminálny symbol, z ktorého vychádzame. Ak nezostane nič, čo by sme mohli nahradiť, máme výsledok;


<!--T:18-->
=== Príklad ===
=== Príklad ===
Poďme si gramatiku ukázať na príklade. Zadanie hovorí, že máme definovať gramatiku <math>G</math>, ktorá bude generovať jednocifernú číslicu od nula po desať.
Poďme si gramatiku ukázať na príklade. Zadanie hovorí, že máme definovať gramatiku <math>G</math>, ktorá bude generovať jednocifernú číslicu od nula po desať.


<!--T:19-->
Našu gramatiku definujeme ako <math>G = (N, T, P, S)</math> (''v preklade: gramatika'' <math>G</math> ''je štvorica'' <math>N</math>''eterminálnych a'' <math>T</math>''erminálnych symbolov s'' <math>P</math>''ravidlami a začiatočným neterminálnym symbolom - teda substitučným symbolom, s ktorým začíname - a tento symbol má označenie'' <math>S</math>''. Môžeme zvoliť akékoľvek označenie, ale najčastejšie sa používa '''S''').''
Našu gramatiku definujeme ako <math>G = (N, T, P, S)</math> (''v preklade: gramatika'' <math>G</math> ''je štvorica'' <math>N</math>''eterminálnych a'' <math>T</math>''erminálnych symbolov s'' <math>P</math>''ravidlami a začiatočným neterminálnym symbolom - teda substitučným symbolom, s ktorým začíname - a tento symbol má označenie'' <math>S</math>''. Môžeme zvoliť akékoľvek označenie, ale najčastejšie sa používa '''S''').''


<!--T:20-->
Teraz definujeme jednotlivé "písmená" z našej "'''NTPS'''" štvorice:
Teraz definujeme jednotlivé "písmená" z našej "'''NTPS'''" štvorice:


<!--T:21-->
<math display="inline">\begin{align}
<math display="inline">\begin{align}
N & = \{ S \} \\
N & = \{ S \} \\
Riadok 66: Riadok 87:
\end{align}</math>
\end{align}</math>


<!--T:22-->
Čo zápis vyššie znamená?
Čo zápis vyššie znamená?


<!--T:23-->
* <math>N</math> predstavuje množinu neterminálnych symbolov. Je to zoznam symbolov, ktoré môžeme nahradiť niečím iným.
* <math>N</math> predstavuje množinu neterminálnych symbolov. Je to zoznam symbolov, ktoré môžeme nahradiť niečím iným.
* <math>T</math> predstavuje množinu terminálnych symbolov. Sú to všetky symboly, z ktorých môže byť tvorené nejaké slovo
* <math>T</math> predstavuje množinu terminálnych symbolov. Sú to všetky symboly, z ktorých môže byť tvorené nejaké slovo


<!--T:24-->
Ak ešte nechápeš čo sa tu deje, skúsime si to vysvetliť na pravidlách:
Ak ešte nechápeš čo sa tu deje, skúsime si to vysvetliť na pravidlách:


<!--T:25-->
<math display="block">\begin{align}
<math display="block">\begin{align}
P: \\
P: \\
Riadok 81: Riadok 106:
\end{align}</math>
\end{align}</math>


<!--T:26-->
Definovali sme najdôležitejšiu časť každej gramatiky: pravidlá, pomocou ktorých sa symboly prepisujú na iné. Šípku (<math>\rightarrow</math>) čítame ako "symbol x sa prepíše na y".
Definovali sme najdôležitejšiu časť každej gramatiky: pravidlá, pomocou ktorých sa symboly prepisujú na iné. Šípku (<math>\rightarrow</math>) čítame ako "symbol x sa prepíše na y".


<!--T:27-->
Úplná definícia našej gramatiky (ktorá generuje práve jednu číslicu od nula po desať) vyzerá nasledovne:
Úplná definícia našej gramatiky (ktorá generuje práve jednu číslicu od nula po desať) vyzerá nasledovne:


<!--T:28-->
<math display="inline">\begin{align}
<math display="inline">\begin{align}
G & = ( N, T, P, \color{red}S\color{black} ) \\
G & = ( N, T, P, \color{red}S\color{black} ) \\
Riadok 94: Riadok 122:
\end{align}</math>
\end{align}</math>


<!--T:29-->
<math display="inline">\begin{align}
<math display="inline">\begin{align}
P:
P:
Riadok 102: Riadok 131:
\end{align}</math>
\end{align}</math>


<!--T:30-->
Poďme skúsiť vygenerovať čislicu 4. Za začiatočný neterminálny symbol sme zvolili <math>\color{red}S</math> (je to posledný symbol zo štvorice v definícií našej gramatiky <math>G</math>, preto sme ho zvýraznili), takže týmto symbolom musíme aj začať. Čo bude nasledovať ďalej? Musíme tento symbol nahradiť niečím za šípkou v pravidlách (preto sa zápis "<math>S \rightarrow \ldots</math>" číta ako "S sa prepíše na ..." - pretože sa skutočne prepíše na niečo iné... duh).
Poďme skúsiť vygenerovať čislicu 4. Za začiatočný neterminálny symbol sme zvolili <math>\color{red}S</math> (je to posledný symbol zo štvorice v definícií našej gramatiky <math>G</math>, preto sme ho zvýraznili), takže týmto symbolom musíme aj začať. Čo bude nasledovať ďalej? Musíme tento symbol nahradiť niečím za šípkou v pravidlách (preto sa zápis "<math>S \rightarrow \ldots</math>" číta ako "S sa prepíše na ..." - pretože sa skutočne prepíše na niečo iné... duh).


<!--T:31-->
V zozname našich pravidiel vidíme pravidlo "<math>S \rightarrow 4</math>". A to je vlastne všetko a máme číslicu 4 ktorú sme chceli. Musíme to ale matematicky zapísať:
V zozname našich pravidiel vidíme pravidlo "<math>S \rightarrow 4</math>". A to je vlastne všetko a máme číslicu 4 ktorú sme chceli. Musíme to ale matematicky zapísať:


<!--T:32-->
<math display="block">S \Rightarrow 4</math>
<math display="block">S \Rightarrow 4</math>


<!--T:33-->
Dôležité je použiť dvojitú šípku (<math>\Rightarrow</math>) namiesto jednoduchej (<math>\rightarrow</math>), pretože dvojitá šípka predstavuje takzvaný "''krok odvodenia''". Znamená to že sme prepísali neterminálny symbol S na 4. V jednom kroku môžeme použiť maximálne jedno pravidlo (teda, môžeme prepísať iba jeden neterminálny symbol na terminálny, nemôžme prepísať viacej symbolov naraz).
Dôležité je použiť dvojitú šípku (<math>\Rightarrow</math>) namiesto jednoduchej (<math>\rightarrow</math>), pretože dvojitá šípka predstavuje takzvaný "''krok odvodenia''". Znamená to že sme prepísali neterminálny symbol S na 4. V jednom kroku môžeme použiť maximálne jedno pravidlo (teda, môžeme prepísať iba jeden neterminálny symbol na terminálny, nemôžme prepísať viacej symbolov naraz).


<!--T:34-->
Slovo bolo vygenerované našou gramatikou správne, ak sa vo výsledku nenachádza žiadny neterminálny symbol (v našom prípade za neterminálny symbol podľa definície považujeme iba <math>S</math>). Vo výsledku sa za dvojitou šípkou nachádza iba 4, čo je symbol ktorý sme definovali v našej množine terminálnych symbolov (<math>T = \langle 0, 9 \rangle</math>). Znamená to, že naše slovo "4" patrí do našej gramatiky <math>G</math>, pretože tento výsledok obsahuje iba terminálne (konečné) symboly.
Slovo bolo vygenerované našou gramatikou správne, ak sa vo výsledku nenachádza žiadny neterminálny symbol (v našom prípade za neterminálny symbol podľa definície považujeme iba <math>S</math>). Vo výsledku sa za dvojitou šípkou nachádza iba 4, čo je symbol ktorý sme definovali v našej množine terminálnych symbolov (<math>T = \langle 0, 9 \rangle</math>). Znamená to, že naše slovo "4" patrí do našej gramatiky <math>G</math>, pretože tento výsledok obsahuje iba terminálne (konečné) symboly.


<!--T:35-->
=== Čo dokážeme s gramatikou? ===
=== Čo dokážeme s gramatikou? ===
Príklad vyššie bol veľmi jednoduchý. Prepísali sme iba jeden neterminálny symbol na nejakú číslicu, a mali sme výsledné slovo z nášho jazyka číslic. Ale čo ak by sme mali za úlohu vytvoriť gramatiku ktorá bude generovať akékoľvek prirodzené číslo (celé číslo, ktoré je väčšie ako nula)?
Príklad vyššie bol veľmi jednoduchý. Prepísali sme iba jeden neterminálny symbol na nejakú číslicu, a mali sme výsledné slovo z nášho jazyka číslic. Ale čo ak by sme mali za úlohu vytvoriť gramatiku ktorá bude generovať akékoľvek prirodzené číslo (celé číslo, ktoré je väčšie ako nula)?


<!--T:36-->
Využijeme gramatiku z predchádzajúceho príkladu. Musíme ju avšak zmeniť tak, aby sme dokázali vygenerovať viac ako jeden symbol (a aby sme vynechali z pravidiel prepis na nulu).
Využijeme gramatiku z predchádzajúceho príkladu. Musíme ju avšak zmeniť tak, aby sme dokázali vygenerovať viac ako jeden symbol (a aby sme vynechali z pravidiel prepis na nulu).


<!--T:37-->
Skúsme sa pozrieť na takéto pravidlá:
Skúsme sa pozrieť na takéto pravidlá:


<!--T:38-->
<math display="block">\begin{align}
<math display="block">\begin{align}
P: \\
P: \\
Riadok 126: Riadok 164:
\end{align}</math>
\end{align}</math>


<!--T:39-->
Už sme z nich vynechali prepis na nulu. Avšak, ak musíme stále začať iba symbolom <math>S</math>, pravidlá nám povolia tento symbol prepísať iba na číslicu od 1 po 9 (vrátane). Ak by nás hneď nenapadlo riešenie, pravdepodobne by sme skúsili čísla ''nejako'' premiestniť na ľavú stranu (pred šípkou) aby sme ''nejako'' vygenerovali viac ako jednu číslicu a táto postupnosť by vytvorila číslo. Avšak, toto nie je povolené (podľa definície gramatiky musí ľavá strana vždy obsahovať neterminálny symbol, teda v tomto prípade naše <math>S</math>).
Už sme z nich vynechali prepis na nulu. Avšak, ak musíme stále začať iba symbolom <math>S</math>, pravidlá nám povolia tento symbol prepísať iba na číslicu od 1 po 9 (vrátane). Ak by nás hneď nenapadlo riešenie, pravdepodobne by sme skúsili čísla ''nejako'' premiestniť na ľavú stranu (pred šípkou) aby sme ''nejako'' vygenerovali viac ako jednu číslicu a táto postupnosť by vytvorila číslo. Avšak, toto nie je povolené (podľa definície gramatiky musí ľavá strana vždy obsahovať neterminálny symbol, teda v tomto prípade naše <math>S</math>).


<!--T:40-->
Riešenie v skutočnosti spočíva v rekurzií. Aby bolo riešenie čitateľné, musíme naše pravidlá trochu zmeniť:
Riešenie v skutočnosti spočíva v rekurzií. Aby bolo riešenie čitateľné, musíme naše pravidlá trochu zmeniť:


<!--T:41-->
<math display="block">\begin{align}
<math display="block">\begin{align}
P: \\
P: \\
Riadok 138: Riadok 179:
\end{align}</math>
\end{align}</math>


<!--T:42-->
Pribudol nám nový neterminálny symbol <math>\color{green}c</math> (ako "číslo" - môžeme si zvoliť ľubovoľný symbol, dokonca by sme mohli pravidlá vyjadriť aj celým slovom, napríklad: <math>\text{číslo} \rightarrow \ldots</math>, ale potom by bol zápis dlhý, preto to nebudeme komplikovať).
Pribudol nám nový neterminálny symbol <math>\color{green}c</math> (ako "číslo" - môžeme si zvoliť ľubovoľný symbol, dokonca by sme mohli pravidlá vyjadriť aj celým slovom, napríklad: <math>\text{číslo} \rightarrow \ldots</math>, ale potom by bol zápis dlhý, preto to nebudeme komplikovať).


<!--T:43-->
Zároveň sme pridali dve nové pravidlá pre neterminálny symbol <math>\color{red}S</math>, kde využívame rekurziu:
Zároveň sme pridali dve nové pravidlá pre neterminálny symbol <math>\color{red}S</math>, kde využívame rekurziu:


<!--T:44-->
* Symbol <math>\color{red}S</math> sa môže prepísať na číslo <math>\color{green}c</math>, '''''alebo sám na seba''''';
* Symbol <math>\color{red}S</math> sa môže prepísať na číslo <math>\color{green}c</math>, '''''alebo sám na seba''''';
* Symbol <math>\color{red}S</math> sa môže prepísať na prázdne slovo (ktoré označujeme ako <math>\color{cadetblue}\epsilon</math>).
* Symbol <math>\color{red}S</math> sa môže prepísať na prázdne slovo (ktoré označujeme ako <math>\color{cadetblue}\epsilon</math>).


<!--T:45-->
Poďme skúsiť vyjadriť číslo "123":
Poďme skúsiť vyjadriť číslo "123":


<!--T:46-->
<math display="block">\begin{array}{ll}
<math display="block">\begin{array}{ll}
\color{gray}\text{1.}& \color{red}S\color{black} & \Rightarrow & \color{green}c\color{red}S\color{black} & \Rightarrow \\
\color{gray}\text{1.}& \color{red}S\color{black} & \Rightarrow & \color{green}c\color{red}S\color{black} & \Rightarrow \\
Riadok 155: Riadok 201:
\end{array}</math>
\end{array}</math>


<!--T:47-->
To už vyzerá komplikovanejšie. Vysvetlíme si jednotlivé kroky:
To už vyzerá komplikovanejšie. Vysvetlíme si jednotlivé kroky:


<!--T:48-->
# V prvom kroku sme začali so symbolom <math>\color{red}S</math>, ktorý sme prepísali na <math>\color{green}c\color{red}S</math>. Využili sme pritom prvé pravidlo (<math>\color{red}S\color{black} \rightarrow \color{green}c\color{red}S</math>). Tým sme zabezpečili to, že môžeme <math>\color{green}c</math> nahradiť číslicou, za ktorou bude nasledovať ďalšie <math>\color{red}S</math>;
# V prvom kroku sme začali so symbolom <math>\color{red}S</math>, ktorý sme prepísali na <math>\color{green}c\color{red}S</math>. Využili sme pritom prvé pravidlo (<math>\color{red}S\color{black} \rightarrow \color{green}c\color{red}S</math>). Tým sme zabezpečili to, že môžeme <math>\color{green}c</math> nahradiť číslicou, za ktorou bude nasledovať ďalšie <math>\color{red}S</math>;
# Za číslom ktoré sme nahradili nám zostalo opäť <math>\color{red}S</math>, s ktorým sme aj začínali. Preto môžeme spraviť presne to isté, a <math>\color{red}S</math> prepísať opäť na <math>\color{green}c\color{red}S</math>;
# Za číslom ktoré sme nahradili nám zostalo opäť <math>\color{red}S</math>, s ktorým sme aj začínali. Preto môžeme spraviť presne to isté, a <math>\color{red}S</math> prepísať opäť na <math>\color{green}c\color{red}S</math>;
Riadok 164: Riadok 212:
# Výsledné slovo je "123". Toto číslo skutočne patrí do jazyka prirodzených čísel väčších ako nula, takže naša gramatika je definovaná správne.
# Výsledné slovo je "123". Toto číslo skutočne patrí do jazyka prirodzených čísel väčších ako nula, takže naša gramatika je definovaná správne.


<!--T:49-->
==== Zjednodušený zápis krokov odvodenia ====
==== Zjednodušený zápis krokov odvodenia ====
Rekurzia sa využíva v gramatikách veľmi často, pretože nám dovoľuje generovať prakticky slová s nekonečnou dĺžkou. Ak by sme chceli vygenerovať veľmi dlhé číslo (napr.: milión), tak by sme iba neustále opakovali kroky odvodenia pokým by sme sa nedopracovali k výsledku.
Rekurzia sa využíva v gramatikách veľmi často, pretože nám dovoľuje generovať prakticky slová s nekonečnou dĺžkou. Ak by sme chceli vygenerovať veľmi dlhé číslo (napr.: milión), tak by sme iba neustále opakovali kroky odvodenia pokým by sme sa nedopracovali k výsledku.


<!--T:50-->
Avšak, týchto krokov by bolo príliš veľa a pravdepodobne by sme ich nestihli napísať všetky dokým by sme neodpadli od únavy. Z tohto dôvodu sa zaviedol zjednodušený zápis krokov odvodenia. Teda, kroky odvodenia čísla "milión" by sme vyjadrili takto:
Avšak, týchto krokov by bolo príliš veľa a pravdepodobne by sme ich nestihli napísať všetky dokým by sme neodpadli od únavy. Z tohto dôvodu sa zaviedol zjednodušený zápis krokov odvodenia. Teda, kroky odvodenia čísla "milión" by sme vyjadrili takto:


<!--T:51-->
<math display="block">S \Rightarrow^* 100\ 000\ 000</math>
<math display="block">S \Rightarrow^* 100\ 000\ 000</math>


<!--T:52-->
Zápis <math>\Rightarrow^*</math> hovorí, že symbol <math>S</math> sme nejakým spôsobom (ale takým, akým nám naša gramatika povoľuje) prepísali na jeden milión. Vyhli by sme sa tak zdĺhavému vypisovaniu jednotlivých krokov odvodenia, pretože by trvalo naozaj dlho kým by sme sa dostali k výsledku.
Zápis <math>\Rightarrow^*</math> hovorí, že symbol <math>S</math> sme nejakým spôsobom (ale takým, akým nám naša gramatika povoľuje) prepísali na jeden milión. Vyhli by sme sa tak zdĺhavému vypisovaniu jednotlivých krokov odvodenia, pretože by trvalo naozaj dlho kým by sme sa dostali k výsledku.
[[Kategória:Formálne jazyky a automaty]]
[[Kategória:Formálne jazyky a automaty]]

Verzia z 08:35, 20. október 2024


<translate>

História

Model Turingovho stroja, skonštruovaný Mike Daveyom, vystavený na Harvardovej univerzite v roku 2012.[1]

V 30-tych rokov 20. storočia britský matematik a logik Alan Turing skúmal abstraktné výpočtové zariadenie, ktoré malo všetky schopnosti dnešných počítačov. Takéto zariadenie sa nazýva Turingov stroj.

Otázkou bolo: dajú sa všetky problémy riešiť pomocou algoritmu?

O Turingovom stroji v kontexte formálnych jazykov a automatov hovoríme že je to "automat" - teda, zariadenie ktoré dokáže automaticky previesť nejaký vstup na výstup. Každý automat pritom využíva určité pravidlá, podľa ktorých generuje výstup - gramatiku.

Základné pojmy

Predtým, ako môžme pochopiť čo je presne automat a ako sa dá matematiky alebo schematicky vyjadriť jeho princíp fungovania, si musíme vysvetliť základné pojmy. Našťastie, veľa z týchto pojmov už poznáme pretože ich využívame v každodennom živote, a teda znamenajú presne to, čo si pod nimi predstavujeme. Ale možno z trochu iného hľadiska - toho matematického:

Abeceda

Abeceda je ľubovoľná konečná množina symbolov. Označujeme ju písmenom V. Napríklad: V={a,b,c,d,,x,y,z} je množina, ktorá obsahuje všetky malé písmená (symboly) anglickej abecedy.

Symboly nemusia byť iba písmená, ale aj číslice a dokonca iné špeciálne znaky. To znamená, že aj nasledujúca abeceda je platná: V={,Ψ,Θ,,,,}.

Slovo

Slovo w je ľubovoľná konečná postupnosť symbolov z abecedy V. Dĺžku slova w (teda, počet znakov v slove) označujeme ako |w|. Napríklad:w=mama|w|=4

Prázdne slovo

Prázdne slovo označujeme gréckym písmenom ϵ (Epsilon). Je to slovo, ktoré má nulovú dĺžku: |ϵ|=0. Predstav si to ako prázdny reťazec v programovacom jazyku: "" // reťazec nulovej dĺžky: je to nič. Aj keď sa na prvý pohľad zdá že to nedáva zmysel a tento symbol je nepotrebný, neskôr pri príkladoch zistíme, že spĺňa dôležitú funkciu pri popisovaní gramatík.

Jazyk

Jazyk označujeme pomocou písmena L (ako z anglického Language). Jedná sa o ľubovoľnú podmnožinu množiny V* všetkých slov nad nejakou abecedou V. To znamená, že ak V*obsahuje všetky možné slová (kombinácie symbolov) z abecedy V ktorých je nekonečne veľa, tak táto podmnožina obsahuje iba tie vybrané kombinácie symbolov (slová) ktoré sú platné pre daný jazyk (dávajú zmysel, teda: spĺňajú pravidlá danej gramatiky).

Predstav si to, ako keby existovali všetky možné kombinácie písmen, bez ohľadu na to či by tie slová dávali zmysel alebo nie. To by predstavovala množina V*, napríklad:

V*={ϵ,a,b,c,,asdaf,asdag,,mama,,xyzhrbbdfu,}

Ak takáto množina obsahuje všetky kombinácie, ktorých je nekonečne veľa, tak potom podmnožina - jazyk L - bude obsahovať iba tie slová, ktoré sú platné pre ten jazyk (spĺňajú pravidlá definované v gramatike). Napríklad: L={mama}.

Gramatika

V predošlých pojmoch sa vyskytla aj gramatika. Gramatika G generuje iba slová ktoré patria do jazyka L a žiadne iné.

Gramatika je definovaná ako štvorica (G=(N,T,P,S)), kde:

  • ˆN je konečná neprázdna množina neterminálnych symbolov,
  • T je konečná neprázdna množina terminálnych symbolov, pričom NT= (to znamená, že tieto dve množiny nemajú spoločný žiadny symbol - symbol nemôže byť zároveň aj terminálny aj neterminálny),
  • ˆP je konečná neprázdna množina pravidiel v tvare αβ, kde:
    • ľavá strana pravidiel α je ľubovoľný reťazec obsahujúci aspoň jeden neterminálny symbol α(NT)*N(NT)*, a
    • pravá strana pravidiel β je ľubovoľný reťazec β(NT)*,
  • ˆSN je začiatočný neterminálny symbol.

Definícia môže vyzerať naozaj strašne pre niekoho kto nevie čítať matematické zápisy. V takom prípade stačí, ak si zapamätá:

  1. Pomocou gramatiky generujeme nejaké slovo ktoré jednoznačne patrí iba do jedného konkrétneho jazyka (napríklad: môžeme definovať gramatiku pre generovanie čísiel od 0 po 9 a naše pravidlá zabezpečia že výsledok bude vždy iba nejaké číslo, nie napríklad písmeno);
  2. Gramatika funguje tak, že najskôr definujeme pravidlá pre postupné nahrádzanie dočasných (neterminálnych) symbolov konkrétnymi konečnými (terminálnymi) symbolmi;
  3. Vždy definujeme neterminálny symbol, z ktorého vychádzame. Ak nezostane nič, čo by sme mohli nahradiť, máme výsledok;

Príklad

Poďme si gramatiku ukázať na príklade. Zadanie hovorí, že máme definovať gramatiku G, ktorá bude generovať jednocifernú číslicu od nula po desať.

Našu gramatiku definujeme ako G=(N,T,P,S) (v preklade: gramatika G je štvorica Neterminálnych a Terminálnych symbolov s Pravidlami a začiatočným neterminálnym symbolom - teda substitučným symbolom, s ktorým začíname - a tento symbol má označenie S. Môžeme zvoliť akékoľvek označenie, ale najčastejšie sa používa S).

Teraz definujeme jednotlivé "písmená" z našej "NTPS" štvorice:

N={S}T={0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

Čo zápis vyššie znamená?

  • N predstavuje množinu neterminálnych symbolov. Je to zoznam symbolov, ktoré môžeme nahradiť niečím iným.
  • T predstavuje množinu terminálnych symbolov. Sú to všetky symboly, z ktorých môže byť tvorené nejaké slovo

Ak ešte nechápeš čo sa tu deje, skúsime si to vysvetliť na pravidlách:

P:S0S4S8S1S5S9S2S6S3S7

Definovali sme najdôležitejšiu časť každej gramatiky: pravidlá, pomocou ktorých sa symboly prepisujú na iné. Šípku () čítame ako "symbol x sa prepíše na y".

Úplná definícia našej gramatiky (ktorá generuje práve jednu číslicu od nula po desať) vyzerá nasledovne:

G=(N,T,P,S)N={S}T=0,9  

P:S0S4S8S1S5S9S2S6S3S7

Poďme skúsiť vygenerovať čislicu 4. Za začiatočný neterminálny symbol sme zvolili S (je to posledný symbol zo štvorice v definícií našej gramatiky G, preto sme ho zvýraznili), takže týmto symbolom musíme aj začať. Čo bude nasledovať ďalej? Musíme tento symbol nahradiť niečím za šípkou v pravidlách (preto sa zápis "S" číta ako "S sa prepíše na ..." - pretože sa skutočne prepíše na niečo iné... duh).

V zozname našich pravidiel vidíme pravidlo "S4". A to je vlastne všetko a máme číslicu 4 ktorú sme chceli. Musíme to ale matematicky zapísať:

S4

Dôležité je použiť dvojitú šípku () namiesto jednoduchej (), pretože dvojitá šípka predstavuje takzvaný "krok odvodenia". Znamená to že sme prepísali neterminálny symbol S na 4. V jednom kroku môžeme použiť maximálne jedno pravidlo (teda, môžeme prepísať iba jeden neterminálny symbol na terminálny, nemôžme prepísať viacej symbolov naraz).

Slovo bolo vygenerované našou gramatikou správne, ak sa vo výsledku nenachádza žiadny neterminálny symbol (v našom prípade za neterminálny symbol podľa definície považujeme iba S). Vo výsledku sa za dvojitou šípkou nachádza iba 4, čo je symbol ktorý sme definovali v našej množine terminálnych symbolov (T=0,9). Znamená to, že naše slovo "4" patrí do našej gramatiky G, pretože tento výsledok obsahuje iba terminálne (konečné) symboly.

Čo dokážeme s gramatikou?

Príklad vyššie bol veľmi jednoduchý. Prepísali sme iba jeden neterminálny symbol na nejakú číslicu, a mali sme výsledné slovo z nášho jazyka číslic. Ale čo ak by sme mali za úlohu vytvoriť gramatiku ktorá bude generovať akékoľvek prirodzené číslo (celé číslo, ktoré je väčšie ako nula)?

Využijeme gramatiku z predchádzajúceho príkladu. Musíme ju avšak zmeniť tak, aby sme dokázali vygenerovať viac ako jeden symbol (a aby sme vynechali z pravidiel prepis na nulu).

Skúsme sa pozrieť na takéto pravidlá:

P:S1S4S7S2S5S8S3S6S9

Už sme z nich vynechali prepis na nulu. Avšak, ak musíme stále začať iba symbolom S, pravidlá nám povolia tento symbol prepísať iba na číslicu od 1 po 9 (vrátane). Ak by nás hneď nenapadlo riešenie, pravdepodobne by sme skúsili čísla nejako premiestniť na ľavú stranu (pred šípkou) aby sme nejako vygenerovali viac ako jednu číslicu a táto postupnosť by vytvorila číslo. Avšak, toto nie je povolené (podľa definície gramatiky musí ľavá strana vždy obsahovať neterminálny symbol, teda v tomto prípade naše S).

Riešenie v skutočnosti spočíva v rekurzií. Aby bolo riešenie čitateľné, musíme naše pravidlá trochu zmeniť:

P:ScSSϵc1c4c7c2c5c8c3c6c9

Pribudol nám nový neterminálny symbol c (ako "číslo" - môžeme si zvoliť ľubovoľný symbol, dokonca by sme mohli pravidlá vyjadriť aj celým slovom, napríklad: číslo, ale potom by bol zápis dlhý, preto to nebudeme komplikovať).

Zároveň sme pridali dve nové pravidlá pre neterminálny symbol S, kde využívame rekurziu:

  • Symbol S sa môže prepísať na číslo c, alebo sám na seba;
  • Symbol S sa môže prepísať na prázdne slovo (ktoré označujeme ako ϵ).

Poďme skúsiť vyjadriť číslo "123":

1.ScS2.1S1cS3.12S12cS4.123S123ϵ5.123

To už vyzerá komplikovanejšie. Vysvetlíme si jednotlivé kroky:

  1. V prvom kroku sme začali so symbolom S, ktorý sme prepísali na cS. Využili sme pritom prvé pravidlo (ScS). Tým sme zabezpečili to, že môžeme c nahradiť číslicou, za ktorou bude nasledovať ďalšie S;
  2. Za číslom ktoré sme nahradili nám zostalo opäť S, s ktorým sme aj začínali. Preto môžeme spraviť presne to isté, a S prepísať opäť na cS;
  3. c sme nahradili číslicou 2. Posledný krát spravíme to isté, čo v predchádzajúcich krokoch odvodenia a opäť nahradíme S za cS;
  4. Posledný neterminálny symbol c (ktorý zostal z tretieho kroku) sme prepísali na číslicu 3, čo je posledná číslica ktorú potrebujeme aby sme vytvorili číslo "123". Avšak, zostal nám tam stále symbol S, ktorý nasledoval za c. Pre to, aby bolo naše číslo platné, tak výsledok nesmie obsahovať neterminálny symbol S - musíme tento symbol nejako odstrániť.
    • V tomto kroku využijeme druhé nové pravidlo, ktoré sme definovali (Sϵ) a S prepíšeme na prázdne slovo ϵ. V tomto spočíva zmysel prázdneho slova, pretože predstavuje naozaj "nič" - už máme naše číslo 123, preto S nahradíme "ničím", čím tento nadbytočný symbol v podstate odstránime;
  5. Výsledné slovo je "123". Toto číslo skutočne patrí do jazyka prirodzených čísel väčších ako nula, takže naša gramatika je definovaná správne.

Zjednodušený zápis krokov odvodenia

Rekurzia sa využíva v gramatikách veľmi často, pretože nám dovoľuje generovať prakticky slová s nekonečnou dĺžkou. Ak by sme chceli vygenerovať veľmi dlhé číslo (napr.: milión), tak by sme iba neustále opakovali kroky odvodenia pokým by sme sa nedopracovali k výsledku.

Avšak, týchto krokov by bolo príliš veľa a pravdepodobne by sme ich nestihli napísať všetky dokým by sme neodpadli od únavy. Z tohto dôvodu sa zaviedol zjednodušený zápis krokov odvodenia. Teda, kroky odvodenia čísla "milión" by sme vyjadrili takto:

S*100 000 000

Zápis * hovorí, že symbol S sme nejakým spôsobom (ale takým, akým nám naša gramatika povoľuje) prepísali na jeden milión. Vyhli by sme sa tak zdĺhavému vypisovaniu jednotlivých krokov odvodenia, pretože by trvalo naozaj dlho kým by sme sa dostali k výsledku.

  1. "A Turing Machine Overview" - Mike Davey (https://aturingmachine.com/)

</translate> <languages />