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
Bez shrnutí editace
Riadok 36: Riadok 36:
</div>Poďme si vysvetliť, ako to funguje:
</div>Poďme si vysvetliť, ako to funguje:


* Máme neterminálne symboly <math>\color{darkgreen}c_1</math>, <math>\color{green}c_2</math>, <math>\color{lime}c_3</math> - index predstavuje '''číslo kroku (do čísla ktoré je väčšie ako 255)'''. Inými slovami, povedzme že začíname číslom 1. Aké najmenšie číslo sa začína na 1 a je väčšie ako 255? Jediná možnosť je číslo 1 000 (keďže 1, 10 a 100 sú menšie ako 255, nemôžme našej gramatike povoliť odvodenie takýchto čísel).
* Máme neterminálne symboly <math>\color{darkgreen}c_1</math>, <math>\color{green}c_2</math>, <math>\color{lime}c_3</math> (''"c" ako "číslo" - aby sme sa vedeli v pravidlách lepšie orientovať''). Index predstavuje '''číslo kroku (do čísla ktoré je väčšie ako 255)'''. Inými slovami, povedzme že začíname číslom 1. Aké najmenšie číslo sa začína na 1 a je väčšie ako 255? Jediná možnosť je číslo 1 000 (keďže 1, 10 a 100 sú menšie ako 255, nemôžme našej gramatike povoliť odvodenie takýchto čísel).
** <math>1\color{darkgreen}c_1</math> hovorí, že sme na prvom kroku od vytvorenia čísla ktoré je väčšie ako 255 (aktuálne číslo kroku vieme zistiť z indexu, teda: <math>\color{darkgreen}c\color{red}_1</math>). Celkový počet krokov je 3 (<math>\color{lime}c_3</math>), preto ešte musíme spraviť ďalšie dva kroky aby sme vytvorili najmenšie číslo ktoré má na začiatku 1 a je väčšie ako 255 (inými slovami, musíme pridať ešte ďalšie dve cifry aby bolo číslo v poriadku).
** <math>1\color{darkgreen}c_1</math> hovorí, že sme na prvom kroku od vytvorenia čísla ktoré je väčšie ako 255 (aktuálne číslo kroku vieme zistiť z indexu, teda: <math>\color{darkgreen}c\color{red}_1</math>). Celkový počet krokov je 3 (<math>\color{lime}c_3</math>), preto ešte musíme spraviť ďalšie dva kroky aby sme vytvorili najmenšie číslo ktoré má na začiatku 1 a je väčšie ako 255 (inými slovami, musíme pridať ešte ďalšie dve cifry aby bolo číslo v poriadku).
** <math>2\color{dodgerblue}d</math> hovorí, že číslo začína dvojkou a pokračuje niečím ďalším. V tomto prípade sa môžme rozhodnúť, že či chceme vygenerovať trojciferné číslo (255 až po 299) alebo viacciferné (napr.: 2 500, 29 857, a podobne). Túto vetvu pravidiel si vysvetlíme neskôr.
** <math>2\color{dodgerblue}d</math> hovorí, že číslo začína dvojkou a pokračuje niečím ďalším. V tomto prípade sa môžme rozhodnúť, že či chceme vygenerovať trojciferné číslo (255 až po 299) alebo viacciferné (napr.: 2 500, 29 857, a podobne). Túto vetvu pravidiel si vysvetlíme neskôr.
Riadok 42: Riadok 42:
c_2\color{black} | 4\color{green}c_2\color{black} | \dots | 9\color{green}c_2</math>). Tu sme využili už <math>\color{green}c_2</math> - povieme, že sme hneď na druhom kroku, a teda už nám stačí pridať iba 2 cifry aby to bolo číslo väčšie ako 255. Napríklad, ak začneme číslom 4, tak stačí pridať minimálne 2 čísla a máme trojciferné číslo väčšie ako 255, napr. 432. Ak by sme namiesto <math>\color{green}c_2</math> zvolili <math>\color{darkgreen}c_1</math>, naša logika ktorú sme definovali v <math>\color{darkgreen}c_1</math> by nás prinútila doplniť ešte 3 čísla, a nemohli by sme vygenerovať napr. číslo 432.
c_2\color{black} | 4\color{green}c_2\color{black} | \dots | 9\color{green}c_2</math>). Tu sme využili už <math>\color{green}c_2</math> - povieme, že sme hneď na druhom kroku, a teda už nám stačí pridať iba 2 cifry aby to bolo číslo väčšie ako 255. Napríklad, ak začneme číslom 4, tak stačí pridať minimálne 2 čísla a máme trojciferné číslo väčšie ako 255, napr. 432. Ak by sme namiesto <math>\color{green}c_2</math> zvolili <math>\color{darkgreen}c_1</math>, naša logika ktorú sme definovali v <math>\color{darkgreen}c_1</math> by nás prinútila doplniť ešte 3 čísla, a nemohli by sme vygenerovať napr. číslo 432.
* Pravidlá pre <math>\color{darkgreen}c_1</math>, <math>\color{green}c_2</math> a <math>\color{lime}c_3</math> iba hovoria o tom, že môžeme generovať čísla od 0 po 9 až po pravidlo <math>\color{lime}c_3</math>. V pravidle <math>\color{lime}c_3</math> nám už je jedno, koľko čísel bude nasledovať, potom už môžme využiť rekurziu a generovať čísla až pokým nezvolíme posledné číslo bez neterminálneho symbolu na konci (táto časť pravidla: <math>0 | 1 | 2 | \dots | 9</math>). Tam sa generovanie slova ukončuje, pretože už nemáme ako pokračovať.
* Pravidlá pre <math>\color{darkgreen}c_1</math>, <math>\color{green}c_2</math> a <math>\color{lime}c_3</math> iba hovoria o tom, že môžeme generovať čísla od 0 po 9 až po pravidlo <math>\color{lime}c_3</math>. V pravidle <math>\color{lime}c_3</math> nám už je jedno, koľko čísel bude nasledovať, potom už môžme využiť rekurziu a generovať čísla až pokým nezvolíme posledné číslo bez neterminálneho symbolu na konci (táto časť pravidla: <math>0 | 1 | 2 | \dots | 9</math>). Tam sa generovanie slova ukončuje, pretože už nemáme ako pokračovať.
* Pravidlo <math>\color{dodgerblue}d</math> je špecifické iba pre prípad, ak začíname s dvojkou. Môžu nastať 3 prípady:
* Pravidlo <math>\color{dodgerblue}d</math> (''ako "dva", čiže to znamená že začíname dvojkou'') je špecifické iba pre prípad, ak začíname s dvojkou. Môžu nastať 3 prípady:
** Pokiaľ chceme vygenerovať viac cifier ako trojciferné čísla (2 000 a vyššie), vybrali by sme si napríklad túto cestu:
** Pokiaľ chceme vygenerovať viac cifier ako trojciferné čísla (2 000 a vyššie), vybrali by sme si napríklad túto cestu:<math>2\color{dodgerblue}d\color{black} \Rightarrow 20\color{green}c_2\color{black} \Rightarrow 200\color{lime}c_3\color{black} \Rightarrow 2000</math>, alebo: <math>2\color{dodgerblue}d\color{black} \Rightarrow 26\color{lime}c_3\color{black} \Rightarrow 260\color{lime}c_3\color{black} \Rightarrow 2600</math>, a podobne.
<math>2\color{dodgerblue}d\color{black} \Rightarrow 20\color{green}c_2\color{black} \Rightarrow 200\color{lime}c_3\color{black} \Rightarrow 2000</math>, alebo: <math>2\color{dodgerblue}d\color{black} \Rightarrow 26\color{lime}c_3\color{black} \Rightarrow 260\color{lime}c_3\color{black} \Rightarrow 2600</math>, a podobne.
** Pokiaľ chceme vygenerovať dvojciferné číslo od 255 po 259, zvolili by sme napríklad: <math>2\color{dodgerblue}d\color{black} \Rightarrow 25\color{blue}p\color{black} \Rightarrow 256</math>.
** Pokiaľ chceme vygenerovať dvojciferné číslo od 255 po 259, zvolili by sme napríklad:
*** ''Poznámka: "p" ako "(dvesto)päťdesiat".''
<math>2\color{dodgerblue}d\color{black} \Rightarrow 25\color{blue}p\color{black} \Rightarrow 256</math>.
** Ak chceme vygenerovať čísla 260 až 299, zvolíme napr.: <math>2\color{dodgerblue}d\color{black} \Rightarrow 27\color{lime}c_3\color{black} \Rightarrow 275 </math>.
** Ak chceme vygenerovať čísla 260 až 299, zvolíme napr.: <math>2\color{dodgerblue}d\color{black} \Rightarrow 27\color{lime}c_3\color{black} \Rightarrow 275 </math>.
** Pravidlo <math>\color{dodgerblue}d</math> obsahuje všetky tri cesty, ktorými by sme sa mohli vybrať aby sme vygenerovali číslo väčšie ako 255.  
** Toto pravidlo <math>\color{dodgerblue}d</math> obsahuje všetky tri cesty, ktorými by sme sa mohli vybrať aby sme vygenerovali číslo väčšie ako 255.
* Pri tvorbe pravidiel musíme dávať pozor aj na to, že sa dajú odvodiť čísla ako napríklad 2 555. Toto má za dôsledok malú repetíciu pravidiel a podobné vzory, ale je to z dôvodu aby bola naša gramatika definovaná správne a neumožnila generovať napr. iba číslo 25 (ktoré nepatrí do zadaného jazyka). Inými slovami, pri riešení úloh nevadí že je tam niekedy repetícia. V prvom rade je dôležité nájsť funkčné riešenie, ktoré sa môže optimalizovať neskôr.</div>{{Téma|Oblast=Kategória:Formálne jazyky a automaty|Poradie=40}}
* Pri tvorbe pravidiel musíme dávať pozor aj na to, že sa dajú odvodiť čísla ako napríklad 2 555. Toto má za dôsledok malú repetíciu pravidiel a podobné vzory, ale je to z dôvodu aby bola naša gramatika definovaná správne a neumožnila generovať napr. iba číslo 25 (ktoré nepatrí do zadaného jazyka). Inými slovami, pri riešení úloh nevadí že je tam niekedy repetícia. V prvom rade je dôležité nájsť funkčné riešenie, ktoré sa môže optimalizovať neskôr.</div>{{Téma|Oblast=Kategória:Formálne jazyky a automaty|Poradie=40}}
[[Kategória:Formálne jazyky a automaty]]
[[Kategória:Formálne jazyky a automaty]]

Verzia z 11:00, 2. november 2024

Táto stránka bude venovaná iba riešeným úlohám pre tvorbu gramatík z hľadiska formálnych jazykov. Najskôr sa ich pokús vyriešiť sám, potom si riešenie skontroluj. Alebo iba sleduj...


Regulárne gramatiky

Predpokladá sa, že výsledné riešenie bude definícia regulárnej gramatiky, definovaná ako G=(N,T,P,S).

1.

Zadanie: Navrhnite regulárnu gramatiku, ktorá generuje jazyk L={xN;n255}.

Riešenie

Odporúčané je skamarátiť sa s matematickými zápismi. Zadanie chce všetky prirodzené čísla (to znamená, čísla väčšie ako nula) ktoré sú zároveň väčšie alebo rovné ako 255. To znamená, že hľadáme čísla: 255, 256, 257, 258, 259, 260 a tak ďalej, až donekonečna... V zadaní je zároveň požiadavka, že sa má jednať o regulárnu gramatiku - teda, pravidlá musia byť zapísané vo forme, kde na ľavej strane je práve jeden neterminálny symbol a na pravej strane jeden terminálny symbol za ktorým nasleduje práve jeden neterminálny symbol.

Jedno z mnohých riešení by mohlo vyzerať napríklad takto:

G=(N,T,P,S)N={S,c1,c2,c3,d,p}T={0,1,2,3,4,5,6,7,8,9}P:S1c1|2d|3c2|4c2||9c2c10c2|1c2||9c2c20c3|1c3|2c3||9c3c30c3|1c3||9c3|0|1|2||9d0c2|1c2|2c2|3c2|4c2|5c2|6c3||9c3|5pp5|6|7|8|9

Poďme si vysvetliť, ako to funguje:
  • Máme neterminálne symboly c1, c2, c3 ("c" ako "číslo" - aby sme sa vedeli v pravidlách lepšie orientovať). Index predstavuje číslo kroku (do čísla ktoré je väčšie ako 255). Inými slovami, povedzme že začíname číslom 1. Aké najmenšie číslo sa začína na 1 a je väčšie ako 255? Jediná možnosť je číslo 1 000 (keďže 1, 10 a 100 sú menšie ako 255, nemôžme našej gramatike povoliť odvodenie takýchto čísel).
    • 1c1 hovorí, že sme na prvom kroku od vytvorenia čísla ktoré je väčšie ako 255 (aktuálne číslo kroku vieme zistiť z indexu, teda: c\color 1). Celkový počet krokov je 3 (c3), preto ešte musíme spraviť ďalšie dva kroky aby sme vytvorili najmenšie číslo ktoré má na začiatku 1 a je väčšie ako 255 (inými slovami, musíme pridať ešte ďalšie dve cifry aby bolo číslo v poriadku).
    • 2d hovorí, že číslo začína dvojkou a pokračuje niečím ďalším. V tomto prípade sa môžme rozhodnúť, že či chceme vygenerovať trojciferné číslo (255 až po 299) alebo viacciferné (napr.: 2 500, 29 857, a podobne). Túto vetvu pravidiel si vysvetlíme neskôr.
    • Pokračujeme číslami 3 až 9 (3c2|4c2||9c2). Tu sme využili už c2 - povieme, že sme hneď na druhom kroku, a teda už nám stačí pridať iba 2 cifry aby to bolo číslo väčšie ako 255. Napríklad, ak začneme číslom 4, tak stačí pridať minimálne 2 čísla a máme trojciferné číslo väčšie ako 255, napr. 432. Ak by sme namiesto c2 zvolili c1, naša logika ktorú sme definovali v c1 by nás prinútila doplniť ešte 3 čísla, a nemohli by sme vygenerovať napr. číslo 432.
  • Pravidlá pre c1, c2 a c3 iba hovoria o tom, že môžeme generovať čísla od 0 po 9 až po pravidlo c3. V pravidle c3 nám už je jedno, koľko čísel bude nasledovať, potom už môžme využiť rekurziu a generovať čísla až pokým nezvolíme posledné číslo bez neterminálneho symbolu na konci (táto časť pravidla: 0|1|2||9). Tam sa generovanie slova ukončuje, pretože už nemáme ako pokračovať.
  • Pravidlo d (ako "dva", čiže to znamená že začíname dvojkou) je špecifické iba pre prípad, ak začíname s dvojkou. Môžu nastať 3 prípady:
    • Pokiaľ chceme vygenerovať viac cifier ako trojciferné čísla (2 000 a vyššie), vybrali by sme si napríklad túto cestu:2d20c2200c32000, alebo: 2d26c3260c32600, a podobne.
    • Pokiaľ chceme vygenerovať dvojciferné číslo od 255 po 259, zvolili by sme napríklad: 2d25p256.
      • Poznámka: "p" ako "(dvesto)päťdesiat".
    • Ak chceme vygenerovať čísla 260 až 299, zvolíme napr.: 2d27c3275.
    • Toto pravidlo d obsahuje všetky tri cesty, ktorými by sme sa mohli vybrať aby sme vygenerovali číslo väčšie ako 255.
  • Pri tvorbe pravidiel musíme dávať pozor aj na to, že sa dajú odvodiť čísla ako napríklad 2 555. Toto má za dôsledok malú repetíciu pravidiel a podobné vzory, ale je to z dôvodu aby bola naša gramatika definovaná správne a neumožnila generovať napr. iba číslo 25 (ktoré nepatrí do zadaného jazyka). Inými slovami, pri riešení úloh nevadí že je tam niekedy repetícia. V prvom rade je dôležité nájsť funkčné riešenie, ktoré sa môže optimalizovať neskôr.