<<< Powrót do głównej strony wykładu
<<< Powrót do modułu 5
To są ćwiczenia z gramatyk bezkontekstowych.
Ogladaj rozwiązania __SHOWALL__
Ukryj rozwiązania __HIDEALL__
Zadanie 1 (palindromy)
Napisz gramatykę generującą wszystkie palindromy nad alfabetem {0,1}.
Rozwiązanie
0
Zadanie 2
Napisz gramatykę generującą język wszystkich słów nad alfabetem {0,1} postaci .
Rozwiązanie 1
1J0
S → J
Zadanie 3 (wyrażenia nawiasowe)
Napisz gramatykę generującą wszystkie poprawne wyrażenia nawiasowe.
Rozwiązanie 1
(S)
Rozwiązanie 2
ε
Zgodność: oczywista.
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ą . Przyglądając się pierwszej pozycji j>0 dla której , zauważamy, że słowa oraz są poprawnymi wyrażeniami nawiasowymi o mniejszej długości. Zatem można uzyskać wyprowadzenie słowa w .
Zadanie 4
Podaj gramatykę języka słów w nad alfabetem {0,1} takich, że
Rozwiązanie 1
S → SS | 0S1 | 1S0 | ε
Zgodność: oczywista.
Pełność: podobnie jak w Zadaniu 3. Dla uzyskania słowa w o długości n należy przyjrzeć się wykresowi funkcji .
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.
Rozwiązanie 2
S → 0S1S | 1S0S | ε
Zgodność: oczywista
Pełność: podobnie jak w Rozwiązaniu 1 i w Rozwiązaniu 2 Zadania 3.
Zadanie 5
Podaj gramatykę języka słów w nad alfabetem {0,1} takich, że
Rozwiązanie 1
R → 0R1 | 1R0 | RR | ε
N → 0N1 | 1N0 | RN | NR | 0
symbol startowy: N
Zgodność: wiedząc (z Zadania 4), że R generuje słowa o równej liczbie 0 i 1, łatwo pokazać przez indukcję, że N generuje słowa, w których liczba 0 jest o jeden większa niż liczba 1.
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.
Zadanie 6 (liczby podzielne przez 3)
Podaj gramatykę generującą liczby w zapisie binarnym, które są podzielne przez 3.
Rozwiązanie 1
S0 → 0 | S00 | S11
S1 → 1 | S01 | S20
S2 → S10 | S21
symbol startowy: S0
Zgodność: Łatwo pokazać, że kolejne symbole generują liczby, które w dzieleniu przez 3 mają resztę odpowiednio 0, 1 i 2. Dwa przypadki bazowe są oczywiste, następnie weźmy na przykład produkcję S1 → S20. Jeśli (z założenia indukcyjnego) S2 wygeneruje liczbę w o reszcie 2, to wygenerowana przez S1 liczba w0 będzie miała resztę 2×2 mod 3 = 1. Podobnie można sprawdzić wszystkie pozostałe produkcje.
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 Si. 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.
Pytanko 1
Jak należy zmodyfikować tę gramatykę, aby generowane liczby binarne nie mogły zaczynać się od 0 ?
Odpowiedź
S0 → S00 | S11
S1 → 1 | S01 | S20
S2 → S10 | S21
S → S0 | 0
symbol startowy: S
Zadanie 7
Podaj gramatykę generującą słowa nad alfabetem {0,1}, w których nie występuje podsłowo 000.
Rozwiązanie 1
S0 → ε | S01 | S11 | S21
S1 → S00
S2 → S10
S → S0 | S1 | S2
symbol startowy: S
Zgodność i pełność tej gramatyki wynika z faktu, że Sj generuje wszystkie słowa w nie zawierające 000 i kończące się na j zer.
Rozwiązanie 2
S0 → ε | S01 | S001 | S0001
S → S0 | S00 | S000
symbol startowy: S
Ta gramatyka powstała z poprzedniej przez usunięcie symboli S1 i S2 i włączenie ich (pojedynczych) produkcji do produkcji pozostałych symboli.
Rozwiązanie 3
Z → ε | 0 | 00
S → Z | S1Z
symbol startowy: S
Z - krotki ciąg zer (mniej niż 3)
S - ciąg krótkich ciągów zer poprzedzielanych jedynkami
Dla ciekawskich
Język opisany w tym zadaniu (i w Zadaniu 6) jest w istocie językiem regularnym, czyli dającym się wygenerować bez rekurencji, a tylko poprzez iterację (czyli prostszym, niż zwykły język bezkontekstowy). Można to poznać po tym, że udało nam się stworzyć gramatykę, w której wszystkie produkcje są postaci X → Yz lub X → Y gdzie X i Y to symbole nieterminalne, a z to symbol terminalny.
Języki regularne mają wiele wspólnego z wyrażeniami regularnymi używanymi w prostych operacjach na tekstach, takich jak wyszukiwanie i zastępowanie (np przez programy Unixowe grep, sed itp.)