Wstęp do programowania / Ćwiczenia 3: Różnice pomiędzy wersjami
(Nie pokazano 6 pośrednich wersji utworzonych przez tego samego użytkownika) | |||
Linia 9: | Linia 9: | ||
<span class="mw-collapsible-toogle-default mw-collapsible-toogle-default mw-collapsible-toogle-default">Rozwiązanie 1</span> | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle-default mw-collapsible-toogle-default mw-collapsible-toogle-default">Rozwiązanie 1</span></div> | |||
==Zadanie 1 (palindromy)== | ==Zadanie 1 (palindromy)== | ||
Napisz gramatykę generującą wszystkie palindromy nad alfabetem {0,1}. | Napisz gramatykę generującą wszystkie palindromy nad alfabetem {0,1}. | ||
Linia 63: | Linia 67: | ||
Napisz gramatykę generującą wszystkie poprawne wyrażenia nawiasowe. | Napisz gramatykę generującą wszystkie poprawne wyrażenia nawiasowe. | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie 1</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
S → SS | (S) | ε | S → SS | (S) | ε | ||
Linia 84: | Linia 90: | ||
W przypadku, gdy dla wszystkich j takich, że <math>0<j<n</math> mamy <math>f_w(j)>0</math>, słowo <math>w_2...w_{n-1}</math> jest poprawnym wyrażeniem nawiasowym o długości n-2, zatem wyprowadzalnym z S. Stąd łatwo otrzymać wyprowadzenie słowa w <math>S \rightarrow (S) \rightarrow \cdots \rightarrow w</math>. | W przypadku, gdy dla wszystkich j takich, że <math>0<j<n</math> mamy <math>f_w(j)>0</math>, słowo <math>w_2...w_{n-1}</math> jest poprawnym wyrażeniem nawiasowym o długości n-2, zatem wyprowadzalnym z S. Stąd łatwo otrzymać wyprowadzenie słowa w <math>S \rightarrow (S) \rightarrow \cdots \rightarrow w</math>. | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie 2</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
S → (S)S | ε | S → (S)S | ε | ||
Linia 93: | Linia 101: | ||
''Pełność'': podobnie jak w Rozwiązaniu 1. Dla uzyskania danego słowa w o długości > 0 należy posłużyć się funkcją <math>f_w</math>. Przyglądając się '''pierwszej''' pozycji j>0, dla której <math>f_w(j)=0</math>, zauważamy, że słowa <math>w_2...w_{j-1}</math> oraz <math>w_{j+1}...w_n</math> są poprawnymi wyrażeniami nawiasowymi o mniejszej długości. Zatem można uzyskać wyprowadzenie słowa w <math>S \rightarrow (S)S \rightarrow \cdots \rightarrow w</math>. | ''Pełność'': podobnie jak w Rozwiązaniu 1. Dla uzyskania danego słowa w o długości > 0 należy posłużyć się funkcją <math>f_w</math>. Przyglądając się '''pierwszej''' pozycji j>0, dla której <math>f_w(j)=0</math>, zauważamy, że słowa <math>w_2...w_{j-1}</math> oraz <math>w_{j+1}...w_n</math> są poprawnymi wyrażeniami nawiasowymi o mniejszej długości. Zatem można uzyskać wyprowadzenie słowa w <math>S \rightarrow (S)S \rightarrow \cdots \rightarrow w</math>. | ||
</div> | </div> | ||
</div> | </div> | ||
==Zadanie 4== | ==Zadanie 4== | ||
Podaj gramatykę języka słów w nad alfabetem {0,1} takich, że <math>\#_0(w)=\#_1(w)</math> | Podaj gramatykę języka słów w nad alfabetem {0,1} takich, że <math>\#_0(w)=\#_1(w)</math> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie 1</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
S → SS | 0S1 | 1S0 | ε | S → SS | 0S1 | 1S0 | ε | ||
Linia 106: | Linia 116: | ||
Jeśli funkcja ta nie ma miejsc zerowych poza 0 i n, pierwszą produkcją jest S → 0S1 lub S → 1S0. W przeciwnym przypadku w rozkłada się na dwa krótsze słowa o równej liczbie zer i jedynek i pierwszą produkcją jest S → SS. | Jeśli funkcja ta nie ma miejsc zerowych poza 0 i n, pierwszą produkcją jest S → 0S1 lub S → 1S0. W przeciwnym przypadku w rozkłada się na dwa krótsze słowa o równej liczbie zer i jedynek i pierwszą produkcją jest S → SS. | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie 2</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
S → 0S1S | 1S0S | ε | S → 0S1S | 1S0S | ε | ||
Linia 115: | Linia 127: | ||
''Pełność'': podobnie jak w Rozwiązaniu 1 i w Rozwiązaniu 2 Zadania 3. | ''Pełność'': podobnie jak w Rozwiązaniu 1 i w Rozwiązaniu 2 Zadania 3. | ||
</div> | </div> | ||
</div> | </div> | ||
==Zadanie 5== | ==Zadanie 5== | ||
Podaj gramatykę języka słów w nad alfabetem {0,1} takich, że <math>\#_0(w)=\#_1(w)+1</math> | Podaj gramatykę języka słów w nad alfabetem {0,1} takich, że <math>\#_0(w)=\#_1(w)+1</math> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie 1</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
R → 0R1 | 1R0 | RR | ε | R → 0R1 | 1R0 | RR | ε | ||
Linia 131: | Linia 144: | ||
''Pełność'': mając dane słowo w o długości > 1 zaczynamy od wskazania (dowolnego) nadmiarowego 0. Następnie postępujemy jak w Zadaniu 4, nie licząc wskazanego 0, pamiętając przy tym, żeby ta część słowa, która zawiera wskazane 0, była wyprowadzana z N, a nie z R. | ''Pełność'': mając dane słowo w o długości > 1 zaczynamy od wskazania (dowolnego) nadmiarowego 0. Następnie postępujemy jak w Zadaniu 4, nie licząc wskazanego 0, pamiętając przy tym, żeby ta część słowa, która zawiera wskazane 0, była wyprowadzana z N, a nie z R. | ||
</div> | </div> | ||
</div> | </div> | ||
<!-- | <!-- | ||
R → 0R1R | 1R0R | ε | R → 0R1R | 1R0R | ε | ||
Linia 143: | Linia 156: | ||
Podaj gramatykę generującą liczby w zapisie binarnym, które są podzielne przez 3. | Podaj gramatykę generującą liczby w zapisie binarnym, które są podzielne przez 3. | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie 1</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
S<sub>0</sub> → 0 | S<sub>0</sub>0 | S<sub>1</sub>1 | S<sub>0</sub> → 0 | S<sub>0</sub>0 | S<sub>1</sub>1 | ||
Linia 156: | Linia 171: | ||
''Pełność'': Przez indukcję po długości liczby pokażemy, że każdą liczbę o reszcie z dzielenia przez 3 wynoszącej i da się wygenerować z symbolu S<sub>i</sub>. Istotnie, dla liczb jednocyfrowych jest to oczywiste. Dla pozostałych, postaci wb, wystarczy popatrzeć na ostatnią cyfrę b. Reszta z dzielenia wb przez 3 oraz wartość b determinują resztę z dzielenia w przez 3. Dla wszystkich sześciu przypadków w naszej gramatyce istnieje odpowiednia produkcja. Następnie wystarczy użyć założenia indukcyjnego, aby wygenerować w. | ''Pełność'': Przez indukcję po długości liczby pokażemy, że każdą liczbę o reszcie z dzielenia przez 3 wynoszącej i da się wygenerować z symbolu S<sub>i</sub>. Istotnie, dla liczb jednocyfrowych jest to oczywiste. Dla pozostałych, postaci wb, wystarczy popatrzeć na ostatnią cyfrę b. Reszta z dzielenia wb przez 3 oraz wartość b determinują resztę z dzielenia w przez 3. Dla wszystkich sześciu przypadków w naszej gramatyce istnieje odpowiednia produkcja. Następnie wystarczy użyć założenia indukcyjnego, aby wygenerować w. | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Ćwiczenie 1</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Jak należy zmodyfikować tę gramatykę, aby generowane liczby binarne nie mogły zaczynać się od 0 ? | Jak należy zmodyfikować tę gramatykę, aby generowane liczby binarne nie mogły zaczynać się od 0 ? | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Odpowiedź</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
S<sub>0</sub> → S<sub>0</sub>0 | S<sub>1</sub>1 | S<sub>0</sub> → S<sub>0</sub>0 | S<sub>1</sub>1 | ||
Linia 174: | Linia 192: | ||
symbol startowy: S | symbol startowy: S | ||
</div> | </div> | ||
</div> | </div> | ||
==Zadanie 7== | ==Zadanie 7== | ||
Podaj gramatykę generującą słowa nad alfabetem {0,1}, w których nie występuje podsłowo 000. | Podaj gramatykę generującą słowa nad alfabetem {0,1}, w których nie występuje podsłowo 000. | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie 1</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
S<sub>0</sub> → ε | S<sub>0</sub>1 | S<sub>1</sub>1 | S<sub>2</sub>1 | S<sub>0</sub> → ε | S<sub>0</sub>1 | S<sub>1</sub>1 | S<sub>2</sub>1 | ||
Linia 192: | Linia 212: | ||
Zgodność i pełność tej gramatyki wynika z faktu, że S<sub>j</sub> generuje wszystkie słowa w nie zawierające 000 i kończące się na j zer. | Zgodność i pełność tej gramatyki wynika z faktu, że S<sub>j</sub> generuje wszystkie słowa w nie zawierające 000 i kończące się na j zer. | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie 2</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
S<sub>0</sub> → ε | S<sub>0</sub>1 | S<sub>0</sub>01 | S<sub>0</sub>001 | S<sub>0</sub> → ε | S<sub>0</sub>1 | S<sub>0</sub>01 | S<sub>0</sub>001 | ||
Linia 203: | Linia 225: | ||
Ta gramatyka powstała z poprzedniej przez usunięcie symboli S<sub>1</sub> i S<sub>2</sub> i włączenie ich (pojedynczych) produkcji do produkcji pozostałych symboli. | Ta gramatyka powstała z poprzedniej przez usunięcie symboli S<sub>1</sub> i S<sub>2</sub> i włączenie ich (pojedynczych) produkcji do produkcji pozostałych symboli. | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie 3</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Z → ε | 0 | 00 | Z → ε | 0 | 00 | ||
Linia 216: | Linia 240: | ||
S - ciąg krótkich ciągów zer poprzedzielanych jedynkami | S - ciąg krótkich ciągów zer poprzedzielanych jedynkami | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> |
Aktualna wersja na dzień 22:24, 1 cze 2020
<<< Powrót do modułu Gramatyki - definiowanie składni i semantyki wyrażeń
To są ćwiczenia z gramatyk bezkontekstowych.
Oglądaj wskazówki i rozwiązania __SHOWALL__
Ukryj wskazówki i rozwiązania __HIDEALL__
Rozwiązanie 1
Zadanie 1 (palindromy)
Napisz gramatykę generującą wszystkie palindromy nad alfabetem {0,1}.
Rozwiązanie 1
Zadanie 2
Napisz gramatykę generującą język wszystkich słów nad alfabetem {0,1} postaci .
Rozwiązanie 1
Zadanie 3 (wyrażenia nawiasowe)
Napisz gramatykę generującą wszystkie poprawne wyrażenia nawiasowe.
Rozwiązanie 1
Rozwiązanie 2
Zadanie 4
Podaj gramatykę języka słów w nad alfabetem {0,1} takich, że
Rozwiązanie 1
Rozwiązanie 2
Zadanie 5
Podaj gramatykę języka słów w nad alfabetem {0,1} takich, że
Rozwiązanie 1
Zadanie 6 (liczby podzielne przez 3)
Podaj gramatykę generującą liczby w zapisie binarnym, które są podzielne przez 3.
Rozwiązanie 1
Ćwiczenie 1
Odpowiedź
Zadanie 7
Podaj gramatykę generującą słowa nad alfabetem {0,1}, w których nie występuje podsłowo 000.
Rozwiązanie 1
Rozwiązanie 2
Rozwiązanie 3
Dla ciekawskich