Wstęp do programowania / Ćwiczenia 3: Różnice pomiędzy wersjami
Nie podano opisu zmian |
|||
(Nie pokazano 13 wersji utworzonych przez 5 użytkowników) | |||
Linia 4: | Linia 4: | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
Oglądaj wskazówki i rozwiązania __SHOWALL__<br> | |||
Ukryj rozwiązania __HIDEALL__ | Ukryj wskazówki i rozwiązania __HIDEALL__ | ||
</div> | </div> | ||
<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}. | ||
<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 → ε | 0 | 1 | 0S0 | 1S1 | S → ε | 0 | 1 | 0S0 | 1S1 | ||
Linia 27: | Linia 33: | ||
Krok indukcyjny: jeśli palindrom x ma długość > 1, to jest postaci 0y0 lub 1y1, gdzie y jest palindromem o mniejszej dlugości. Z założenia indukcyjnego S →...→ y. Zatem S → 0S0 →...→ 0y0 lub S → 1S1 →...→ 1y1 i otrzymaliśmy wyprowadzenie słowa x. | Krok indukcyjny: jeśli palindrom x ma długość > 1, to jest postaci 0y0 lub 1y1, gdzie y jest palindromem o mniejszej dlugości. Z założenia indukcyjnego S →...→ y. Zatem S → 0S0 →...→ 0y0 lub S → 1S1 →...→ 1y1 i otrzymaliśmy wyprowadzenie słowa x. | ||
</div> | </div> | ||
</div> | </div> | ||
==Zadanie 2== | ==Zadanie 2== | ||
Napisz gramatykę generującą język wszystkich słów nad alfabetem {0,1} postaci <math>0^n1^m0^{n+m}</math>. | Napisz gramatykę generującą język wszystkich słów nad alfabetem {0,1} postaci <math>0^n1^m0^{n+m}</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"> | |||
J → ε | 1J0 | J → ε | 1J0 | ||
Linia 47: | Linia 54: | ||
W pierwszym przypadku wyprowadzenie zawiera wyprowadzenie o długości n-1 startujące z J. Z założenia indukcyjnego wiemy, że wyprowadzone słowo jest postaci <math>1^m0^m</math>, a więc również <math>0^n1^m0^{n+m}</math> (dla n=0). | W pierwszym przypadku wyprowadzenie zawiera wyprowadzenie o długości n-1 startujące z J. Z założenia indukcyjnego wiemy, że wyprowadzone słowo jest postaci <math>1^m0^m</math>, a więc również <math>0^n1^m0^{n+m}</math> (dla n=0). | ||
W drugim przypadku wyprowadzone słowo jest postaci 0x0, gdzie x jest wyprowadzalny z S za pomocą n-1 kroków. Zatem z założenia indukcyjnego x jest postaci <math>0^n1^m0^{n+m}</math>, zatem <math>0x0=0^{n+1}1^m0^{n+m+1}</math>, zatem jest też jest | W drugim przypadku wyprowadzone słowo jest postaci 0x0, gdzie x jest wyprowadzalny z S za pomocą n-1 kroków. Zatem z założenia indukcyjnego x jest postaci <math>0^n1^m0^{n+m}</math>, zatem <math>0x0=0^{n+1}1^m0^{n+m+1}</math>, zatem jest też jest żądanej postaci. | ||
W trzecim przypadku wyprowadzone słowo jest postaci 1x0, gdzie x można wyprowadzić z J w n-1 krokach, zatem podobnie jak poprzednio 1x0 jest postaci <math>1^m0^m</math>, ponieważ x ma tę postać (z założenia indukcyjnego). | W trzecim przypadku wyprowadzone słowo jest postaci 1x0, gdzie x można wyprowadzić z J w n-1 krokach, zatem podobnie jak poprzednio 1x0 jest postaci <math>1^m0^m</math>, ponieważ x ma tę postać (z założenia indukcyjnego). | ||
Linia 53: | Linia 60: | ||
''Pełność'': (każde słowo języka da się wyprowadzić). Najpierw przez indukcję po m pokażemy, że każde słowo postaci <math>1^m0^m</math> można wyprowadzić z J. Następnie przez indukcję po n, że każde słowo postaci <math>0^n1^m0^{n+m}</math> można wyprowadzić z S. | ''Pełność'': (każde słowo języka da się wyprowadzić). Najpierw przez indukcję po m pokażemy, że każde słowo postaci <math>1^m0^m</math> można wyprowadzić z J. Następnie przez indukcję po n, że każde słowo postaci <math>0^n1^m0^{n+m}</math> można wyprowadzić z S. | ||
Istotnie, jeśli m=0, to słowo <math>1^00^0=\epsilon</math> można wyprowadzić z J. Zakładając, że słowo <math>1^m0^m</math> można wyprowadzić z J, łatwo | Istotnie, jeśli m=0, to słowo <math>1^00^0=\epsilon</math> można wyprowadzić z J. Zakładając, że słowo <math>1^m0^m</math> można wyprowadzić z J, łatwo zauważyć, że wyprowadzenie J → 1J0 →...→ 11<sup>m</sup>0<sup>m</sup>0 jest wyprowadzeniem słowa <math>1^{m+1}0^{m+1}</math>. Podobnie łatwo pokazać, że każde słowo postaci <math>0^n1^m0^{n+m}</math> da się wyprowadzić z S. | ||
</div> | |||
</div> | </div> | ||
==Zadanie 3 (wyrażenia nawiasowe)== | ==Zadanie 3 (wyrażenia nawiasowe)== | ||
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 77: | Linia 86: | ||
* <math>f_w(n)=0</math> | * <math>f_w(n)=0</math> | ||
* <math>f_w(i)\ge0</math> dla <math>i=0\dots n</math> | * <math>f_w(i)\ge0</math> dla <math>i=0\dots n</math> | ||
W przypadku gdy istnieje j takie, że <math>0<j<n</math> i <math>f_w(j)=0</math> słowa <math>w_1...w_j</math> oraz <math>w_{j+1}...w_n</math> są poprawnymi wyrażeniami nawiasowymi o długości mniejszej niż n. | W przypadku gdy istnieje j takie, że <math>0<j<n</math> i <math>f_w(j)=0</math>, słowa <math>w_1...w_j</math> oraz <math>w_{j+1}...w_n</math> są poprawnymi wyrażeniami nawiasowymi o długości mniejszej niż n. Zatem istnieją wyprowadzenia <math>S \rightarrow \cdots \rightarrow w_1...w_j</math> oraz <math>S \rightarrow \cdots \rightarrow w_{j+1}...w_n</math> i da się z nich złożyć wyprowadzenie <math>S \rightarrow SS \rightarrow \cdots \rightarrow w</math>. | ||
W przypadku, gdy dla wszystkich j, <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, | 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 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 90: | 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 103: | 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 112: | 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 128: | 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 140: | 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 153: | 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 171: | 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 189: | 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 200: | 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 213: | 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