More actions
Bez shrnutí editace |
Bez shrnutí editace |
||
Riadok 26: | Riadok 26: | ||
=== 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é 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). | ||
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: | ||
Riadok 53: | Riadok 53: | ||
=== 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ť | 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ť. | ||
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''').'' | |||
Teraz definujeme jednotlivé " | Teraz definujeme jednotlivé "písmená" z našej "'''NTPS'''" štvorice: | ||
<math display="inline">\begin{align} | <math display="inline">\begin{align} | ||
Riadok 64: | Riadok 64: | ||
\end{align}</math> | \end{align}</math> | ||
Čo zápis vyššie znamená? | |||
* <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 | |||
Ak ešte nechápeš čo sa tu deje, skúsime si to vysvetliť na pravidlách: | |||
<math display="block">\begin{align} | |||
P: \\ | |||
S & \rightarrow 0 & S & \rightarrow 4 & S & \rightarrow 8 \\ | |||
S & \rightarrow 1 & S & \rightarrow 5 & S & \rightarrow 9 \\ | |||
S & \rightarrow 2 & S & \rightarrow 6 \\ | |||
S & \rightarrow 3 & S & \rightarrow 7 \\ | |||
\end{align}</math> | |||
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". | |||
Úplná definícia našej gramatiky (ktorá generuje práve jednu číslicu od nula po desať) vyzerá nasledovne: | |||
<math display="inline">\begin{align} | |||
G & = ( N, T, P, \color{red}S\color{black} ) \\ | |||
N & = \{ S \} \\ | |||
T & = \langle 0, 9 \rangle \\ | |||
\end{align} | |||
\begin{align} | |||
\ \ \\ | |||
\end{align}</math> | |||
<math display="inline">\begin{align} | |||
P: | |||
S & \rightarrow 0 & S & \rightarrow 4 & S & \rightarrow 8 \\ | |||
S & \rightarrow 1 & S & \rightarrow 5 & S & \rightarrow 9 \\ | |||
S & \rightarrow 2 & S & \rightarrow 6 \\ | |||
S & \rightarrow 3 & S & \rightarrow 7 \\ | |||
\end{align}</math> | |||
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). | |||
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ť: | |||
<math display="block">S \Rightarrow 4</math> | |||
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). | |||
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. | |||
=== Č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á: | |||
<math display="block">\begin{align} | |||
P: \\ | |||
S & \rightarrow 1 & S & \rightarrow 4 & S & \rightarrow 7 \\ | |||
S & \rightarrow 2 & S & \rightarrow 5 & S & \rightarrow 8 \\ | |||
S & \rightarrow 3 & S & \rightarrow 6 & S & \rightarrow 9 \\ | |||
\end{align}</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>). | |||
Riešenie v skutočnosti spočíva v rekurzií. Aby bolo riešenie čitateľné, musíme naše pravidlá trochu zmeniť: | |||
<math display="block">\begin{align} | |||
P: \\ | |||
\color{red}S & \rightarrow \color{green}c\color{red}S & \color{red}S & \rightarrow \color{cadetblue}\epsilon \\ | |||
\color{green}c & \rightarrow 1 & \color{green}c & \rightarrow 4 & \color{green}c & \rightarrow 7 \\ | |||
\color{green}c & \rightarrow 2 & \color{green}c & \rightarrow 5 & \color{green}c & \rightarrow 8 \\ | |||
\color{green}c & \rightarrow 3 & \color{green}c & \rightarrow 6 & \color{green}c & \rightarrow 9 \\ | |||
\end{align}</math> | |||
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ť). | |||
Zároveň sme pridali dve nové pravidlá pre neterminálny symbol <math>\color{red}S</math>, kde využívame rekurziu: | |||
* 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>). | |||
Poďme skúsiť vyjadriť číslo "123": | |||
<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{2.} & 1\color{red}S\color{black} & \Rightarrow & 1\color{green}c\color{red}S\color{black} & \Rightarrow \\ | |||
\color{gray}\text{3.} & 12\color{red}S\color{black} & \Rightarrow & 12\color{green}c\color{red}S\color{black} & \Rightarrow \\ | |||
\color{gray}\text{4.} & 123\color{red}S\color{black} & \Rightarrow & 123\color{cadetblue}\epsilon\color{black} \\ | |||
\color{gray}\text{5.} & \Rightarrow 123 | |||
\end{array}</math> | |||
To už vyzerá komplikovanejšie. Vysvetlíme si jednotlivé kroky: | |||
# 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>; | |||
# <math>\color{green}c</math> sme nahradili číslicou 2. Posledný krát spravíme to isté, čo v predchádzajúcich krokoch odvodenia a opäť nahradíme <math>\color{red}S</math> za <math>\color{green}c\color{red}S</math>; | |||
# Posledný neterminálny symbol <math>\color{green}c</math> (ktorý zostal z tretieho kroku) sme prepísali na číslicu 3, čo je posledná číslica ktorú potrebujeme aby sme vytvorili číslo "12'''3'''". Avšak, zostal nám tam stále symbol <math>\color{red}S</math>, ktorý nasledoval za <math>\color{green}c</math>. Pre to, aby bolo naše číslo platné, tak výsledok nesmie obsahovať neterminálny symbol <math>\color{red}S</math> - musíme tento symbol nejako odstrániť. | |||
#* V tomto kroku využijeme druhé nové pravidlo, ktoré sme definovali (<math>\color{red}S\color{black} \rightarrow \color{cadetblue}\epsilon</math>) a <math>\color{red}S</math> prepíšeme na prázdne slovo <math>\color{cadetblue}\epsilon</math>. V tomto spočíva zmysel prázdneho slova, pretože predstavuje naozaj "nič" - už máme naše číslo 123, preto <math>\color{red}S</math> nahradíme "ničím", čím tento nadbytočný symbol v podstate odstránime; | |||
# 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: | |||
<math display="block">S \Rightarrow^* 100\ 000\ 000</math> | |||
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]] | ||
<references /> | <references /> | ||
{{Téma|Oblast=Kategória:Formálne jazyky a automaty|Poradie=10}} | {{Téma|Oblast=Kategória:Formálne jazyky a automaty|Poradie=10}} |
Verzia z 08:29, 29. september 2024
História

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 . Napríklad: 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á: .
Slovo
Slovo je ľubovoľná konečná postupnosť symbolov z abecedy . Dĺžku slova (teda, počet znakov v slove) označujeme ako . Napríklad:
Prázdne slovo
Prázdne slovo označujeme gréckym písmenom (Epsilon). Je to slovo, ktoré má nulovú dĺžku: . 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 (ako z anglického Language). Jedná sa o ľubovoľnú podmnožinu množiny všetkých slov nad nejakou abecedou . To znamená, že ak obsahuje všetky možné slová (kombinácie symbolov) z abecedy 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 , napríklad:
Ak takáto množina obsahuje všetky kombinácie, ktorých je nekonečne veľa, tak potom podmnožina - jazyk - bude obsahovať iba tie slová, ktoré sú platné pre ten jazyk (spĺňajú pravidlá definované v gramatike). Napríklad: .
Gramatika
V predošlých pojmoch sa vyskytla aj gramatika. Gramatika generuje iba slová ktoré patria do jazyka a žiadne iné.
Gramatika je definovaná ako štvorica (), kde:
- je konečná neprázdna množina neterminálnych symbolov,
- je konečná neprázdna množina terminálnych symbolov, pričom (to znamená, že tieto dve množiny nemajú spoločný žiadny symbol - symbol nemôže byť zároveň aj terminálny aj neterminálny),
- 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 , a
- pravá strana pravidiel je ľubovoľný reťazec ,
- 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á:
- 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;
- 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 , ktorá bude generovať jednocifernú číslicu od nula po desať.
Našu gramatiku definujeme ako (v preklade: gramatika je štvorica eterminálnych a erminálnych symbolov s 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 . 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:
Čo zápis vyššie znamená?
- predstavuje množinu neterminálnych symbolov. Je to zoznam symbolov, ktoré môžeme nahradiť niečím iným.
- 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:
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:
Poďme skúsiť vygenerovať čislicu 4. Za začiatočný neterminálny symbol sme zvolili (je to posledný symbol zo štvorice v definícií našej gramatiky , 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 "" čí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 "". A to je vlastne všetko a máme číslicu 4 ktorú sme chceli. Musíme to ale matematicky zapísať:
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 ). 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 (). Znamená to, že naše slovo "4" patrí do našej gramatiky , 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á:
Už sme z nich vynechali prepis na nulu. Avšak, ak musíme stále začať iba symbolom , 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 ).
Riešenie v skutočnosti spočíva v rekurzií. Aby bolo riešenie čitateľné, musíme naše pravidlá trochu zmeniť:
Pribudol nám nový neterminálny symbol (ako "číslo" - môžeme si zvoliť ľubovoľný symbol, dokonca by sme mohli pravidlá vyjadriť aj celým slovom, napríklad: , ale potom by bol zápis dlhý, preto to nebudeme komplikovať).
Zároveň sme pridali dve nové pravidlá pre neterminálny symbol , kde využívame rekurziu:
- Symbol sa môže prepísať na číslo , alebo sám na seba;
- Symbol sa môže prepísať na prázdne slovo (ktoré označujeme ako ).
Poďme skúsiť vyjadriť číslo "123":
To už vyzerá komplikovanejšie. Vysvetlíme si jednotlivé kroky:
- V prvom kroku sme začali so symbolom , ktorý sme prepísali na . Využili sme pritom prvé pravidlo (). Tým sme zabezpečili to, že môžeme nahradiť číslicou, za ktorou bude nasledovať ďalšie ;
- Za číslom ktoré sme nahradili nám zostalo opäť , s ktorým sme aj začínali. Preto môžeme spraviť presne to isté, a prepísať opäť na ;
- sme nahradili číslicou 2. Posledný krát spravíme to isté, čo v predchádzajúcich krokoch odvodenia a opäť nahradíme za ;
- Posledný neterminálny symbol (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 , ktorý nasledoval za . Pre to, aby bolo naše číslo platné, tak výsledok nesmie obsahovať neterminálny symbol - musíme tento symbol nejako odstrániť.
- V tomto kroku využijeme druhé nové pravidlo, ktoré sme definovali () a 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 nahradíme "ničím", čím tento nadbytočný symbol v podstate odstránime;
- 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:
Zápis hovorí, že symbol 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.
- ↑ "A Turing Machine Overview" - Mike Davey (https://aturingmachine.com/)