Matematyczna wieża Babel. 3. Gramatyki o językach bezkontekstowych materiały do ćwiczeń

Podobne dokumenty
Matematyczna wieża Babel. 4. Ograniczone maszyny Turinga o językach kontekstowych materiały do ćwiczeń

Zadanie 1. Czy prawdziwa jest następująca implikacja? Jeśli L A jest językiem regularnym, to regularnym językiem jest też. A = (A, Q, q I, F, δ)

Języki formalne i automaty Ćwiczenia 1

Języki formalne i automaty Ćwiczenia 7

Zadanie 1. (6 punktów) Słowo w nazwiemy anagramem słowa v jeśli w można otrzymać z v poprzez zamianę kolejności liter. Niech

Imię, nazwisko, nr indeksu

Przykład: Σ = {0, 1} Σ - zbiór wszystkich skończonych ciagów binarnych. L 1 = {0, 00, 000,...,1, 11, 111,... } L 2 = {01, 1010, 001, 11}

Matematyczne Podstawy Informatyki

Języki, automaty i obliczenia

Jaki język zrozumie automat?

złożony ze słów zerojedynkowych o długości co najmniej 3, w których druga i trzecia litera od końca sa

Matematyczne Podstawy Informatyki

JAO - Wprowadzenie do Gramatyk bezkontekstowych

Języki programowania zasady ich tworzenia

Języki formalne i automaty Ćwiczenia 9

Języki formalne i automaty Ćwiczenia 6

Języki formalne i automaty Ćwiczenia 2

Wprowadzenie do analizy składniowej. Bartosz Bogacki.

2.2. Gramatyki, wyprowadzenia, hierarchia Chomsky'ego

Dopełnienie to można wyrazić w następujący sposób:

Hierarchia Chomsky ego Maszyna Turinga

Automat ze stosem. Języki formalne i automaty. Dr inż. Janusz Majewski Katedra Informatyki

KATEDRA INFORMATYKI TECHNICZNEJ. Ćwiczenia laboratoryjne z Logiki Układów Cyfrowych. ćwiczenie 204

3.4. Przekształcenia gramatyk bezkontekstowych

GRAMATYKI BEZKONTEKSTOWE

(j, k) jeśli k j w przeciwnym przypadku.

Gramatyki, wyprowadzenia, hierarchia Chomsky ego. Gramatyka

Języki formalne i automaty Ćwiczenia 3

Definiowanie języka przez wyrażenie regularne(wr)

Matematyczny świat języków. Wprowadzenie i języki regularne materiały do ćwiczeń

JAO - lematy o pompowaniu dla jezykow bezkontekstowy

Hierarchia Chomsky ego

Rozwiązania około dwustu łatwych zadań z języków formalnych i złożoności obliczeniowej i być może jednego chyba trudnego (w trakcie tworzenia)

Maszyna Turinga języki

10110 =

Efektywna analiza składniowa GBK

Języki, automaty i obliczenia

Celem ćwiczenia jest zapoznanie się z podstawowymi możliwościami języka Prolog w zakresie definiowania faktów i reguł oraz wykonywania zapytań.

Temat: Zastosowanie wyrażeń regularnych do syntezy i analizy automatów skończonych

Języki i gramatyki formalne

Języki formalne i automaty Ćwiczenia 4

CIĄGI wiadomości podstawowe

1 Automaty niedeterministyczne

Luty 2001 Algorytmy (7) 2000/2001

Dalszy ciąg rachunku zdań

Monoidy wolne. alfabetem. słowem długością słowa monoidem wolnym z alfabetem Twierdzenie 1.

Uwagi wprowadzajace do reguł wnioskowania w systemie tabel analitycznych logiki pierwszego rzędu

Paradygmaty dowodzenia

Zadanie 1. Potęgi (14 pkt)

Metoda Tablic Semantycznych

Maszyna Turinga. Algorytm. czy program???? Problem Hilberta: Przykłady algorytmów. Cechy algorytmu: Pojęcie algorytmu

Indukcja matematyczna

Metody Kompilacji Wykład 8 Analiza Syntaktyczna cd. Włodzimierz Bielecki WI ZUT

Metody Kompilacji Wykład 3

Wykład 4. Określimy teraz pewną ważną klasę pierścieni.

Wprowadzenie: języki, symbole, alfabety, łańcuchy Języki formalne i automaty. Literatura

Matematyka Dyskretna 2/2008 rozwiązania. x 2 = 5x 6 (1) s 1 = Aα 1 + Bβ 1. A + B = c 2 A + 3 B = d

Obliczenia inspirowane Naturą

Obliczenia inspirowane Naturą

0 + 0 = 0, = 1, = 1, = 0.

Finanse i Rachunkowość studia niestacjonarne Wprowadzenie do teorii ciągów liczbowych (treść wykładu z 21 grudnia 2014)

Definicja 2. Twierdzenie 1. Definicja 3

0.1. Logika podstawowe pojęcia: zdania i funktory, reguły wnioskowania, zmienne zdaniowe, rachunek zdań.

Algorytmy stochastyczne, wykład 05 Systemy Liendenmayera, modelowanie roślin

Nazwa implementacji: Nauka języka Python wyrażenia warunkowe. Autor: Piotr Fiorek. Opis implementacji: Poznanie wyrażeń warunkowych if elif - else.

Nazwa implementacji: Nauka języka Python pętla for. Autor: Piotr Fiorek

Gramatyki (1-2) Definiowanie języków programowania. Piotr Chrząstowski-Wachjtel

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

Elementy rachunku zdań i algebry zbiorów

Programowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++

W. Guzicki Zadanie 41 z Informatora Maturalnego poziom podstawowy 1

Lista 4. Kamil Matuszewski 22 marca 2016

Algorytmy zapisywane w pseudojęzyku programowania. Klasa 2 Lekcja 6

Przykłady zdań w matematyce. Jeśli a 2 + b 2 = c 2, to trójkąt o bokach długości a, b, c jest prostokątny (a, b, c oznaczają dane liczby dodatnie),

Liczby losowe i pętla while w języku Python

Zamiana ułamków na procenty oraz procentów na ułamki

Zapisywanie algorytmów w języku programowania

Matematyczna wieża Babel. 6. Nieskończoność i myślaki materiały do ćwiczeń

Zadanie 2: Arytmetyka symboli

Część wspólna (przekrój) A B składa się z wszystkich elementów, które należą jednocześnie do zbioru A i do zbioru B:

MATEMATYKA DYSKRETNA, PODSTAWY LOGIKI I TEORII MNOGOŚCI

Programowanie w języku Python. Grażyna Koba

Przykładowe zadania z teorii liczb

LOGIKA Dedukcja Naturalna

WYRAŻENIA ALGEBRAICZNE

Języki formalne i automaty Ćwiczenia 5

Symbol, alfabet, łańcuch

Metoda tabel semantycznych. Dedukcja drogi Watsonie, dedukcja... Definicja logicznej konsekwencji. Logika obliczeniowa.

Obliczenia na stosie. Wykład 9. Obliczenia na stosie. J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 266 / 303

4. Postęp arytmetyczny i geometryczny. Wartość bezwzględna, potęgowanie i pierwiastkowanie liczb rzeczywistych.

Matematyka dyskretna. Andrzej Łachwa, UJ, /15

2 Arytmetyka. d r 2 r + d r 1 2 r 1...d d 0 2 0,

Języki, automaty i obliczenia

Wprowadzenie do programowania języki i gramatyki formalne. dr hab. inż. Mikołaj Morzy

1. Wykład NWD, NWW i algorytm Euklidesa.

5. OKREŚLANIE WARTOŚCI LOGICZNEJ ZDAŃ ZŁOŻONYCH

Wykład 4 Udowodnimy teraz, że jeśli U, W są podprzetrzeniami skończenie wymiarowej przestrzeni V to zachodzi wzór: dim(u + W ) = dim U + dim W dim(u

Podstawą w systemie dwójkowym jest liczba 2 a w systemie dziesiętnym liczba 10.

1. Powtórka ze szkoły. Wykład: (4 godziny), ćwiczenia: , kolokwium nr 1:

2.8. Algorytmy, schematy, programy

Transkrypt:

Matematyczna wieża Babel. 3. Gramatyki o językach bezkontekstowych materiały do ćwiczeń Projekt Matematyka dla ciekawych świata spisał: Michał Korch 21 marca 2019 1 Gramatyki! Gramatyka to taki przepis na tworzenie słów z języka. Składa się z reguł, które pozwalają przekształcać poszczególne symbole (robocze) na ciągi symboli (roboczych i liter z alfabetu). Po tym, jak po ciągu przekształceń, zaczynając od roboczego symbolu startowego, przerobimy symbole robocze w ten sposób, że słowo składa się tylko z liter z alfabetu mamy to słowo, które chcemy. Nazwę i ideę można ogarnąć patrząc na gramatykę jakiegoś prawdziwego języka. Na przykład, języka angielskiego. Niech zatem naszym alfabetem będą angielskie słowa. Nasz język to będą poprawne zdania po angielsku, a więc ciągi liter z naszego alfabetu (których rolę pełnią angielskie słowa: a, an, the, black, good, happy, computer, she, it, has, likes, takes, talks, for, to, on, and, but, because). Symbolami roboczymi niech będą nazwy różnych obiektów gramatycznych dla odróżnienia od liter będziemy je pisać pochyloną czcionką. Symbolem startowym niech będzie Zdanie. Uproszczona gramatyka zdań języka angielskiego wygląda tak: Zdanie P odmiot Czasownik Dopelnienie Zdanie Spojnik Zdanie P odmiot Rodzajnik P rzymiotnik Rzeczownik Rodzajnik Rzeczownik Rodzajnik - a an the P rzymiotnik black good happy Rzeczownik girl cat computer she it Czasownik has likes takes talks Dopelnienie Rodzajnik Rzeczownik P rzyimek Rodzajnik Rzeczownik Dopelnienie P rzyslowek Dopelnienie Dopelnienie - P rzyimek for to on P rzyslowek fast often Spojnik and but because Jak widzicie każda reguła mówi na co można zamienić dany symbol roboczy i podaje kilka opcji oddzielonych od siebie pionowymi kreskami. Jest też jeszcze dodatkowy symbol mówiący, że dany symbol roboczy można po prostu wykreślić zamiast zamieniać go na coś. 1

Zatem słowo (zdanie) the happy girl talks to the cat often because she likes it możemy wygenerować następująco, korzystając z tych reguł: Zadnie Zdanie Spojnik Zdanie Podmiot Czasownik Dopelnieniebecause, Podmiot Czasownik Dopelnienie Rodzajnik Przymiotnik Rzeczownik talks Dopelnienie Dopelnienie because, Rodzajnik Rzeczownik likes Rodzajnik Rzeczownik the happy girl talks Przyimek Rodzajnik Rzeczownik Przyslowek because, she likes it the happy girl talks to the cat often because she likes it Wszystkie te przejścia wygodniej jest przedstawić przy pomocy następującego drzewiastego schematu (zwanego drzewem wyprowadzenia): Zdanie Zdanie Spójnik Zdanie Podmiot Czasownik Dopełnienie because Podmiot Czasownik Dopełnienie Rodzajnik Przymiotnik Rzeczownik talks Dopełnienie Dopełnienie Rodzajnik Rzeczownik likes Rodzajnik Rzeczownik the happy girl Przyimek Rodzajnik Rzeczownik Przysłówek - she - it to the cat often Zadanie 1 Narysuj drzewo wyprowadzenia dla następujących słów (zdań) w powyższej gramatyce ˆ the cat likes the girl ˆ she has a computer and it talkes ˆ the computer talks to a cat Zadanie 2 Zaproponujcie dwa dodatkowe zdania po angielsku (słowa w naszym języku), które należą do tego języka (które można wyprowadzić przy pomocy tej gramatyki). Narysuj dla nich drzewa wyprowadzeń. Następnie zaproponuj sensowne zdanie po angielsku, którego nie obejmuje nasza gramatyka. Zadanie 3 Poprawcie zdefiniowaną wyżej gramatykę w taki sposób, żeby można było używać przymiotników nie tylko w podmiocie, ale i w dopełnieniu. Możecie przy okazji wprowadzić też inne zmiany w tej gramatyce, które wydają Wam się przydatne (np. takie, żeby można było w niej wyprowadzić ostatnie zdanie, które przygotowaliście w poprzednim zadaniu). Generalnie będziemy rozważać gramatyki bezkontekstowe, w których alfabet składa się z prawdziwych liter, np {a, b}. W takich gramatykach można będzie więc wyprowadzić słowa (czyli ciągi liter). Powiemy, że język jest definiowany przez pewną gramatykę bezkontekstową, jeśli jest zbiorem wszystkich słów, które da się z niej wyprowadzić. 2

Zadanie 4 Rozważcie następującą gramatykę nad alfabetem {a, b} z symbolem początkowym P P aap aa bbp bb S S aa bb Znajdź 3 słowa, które można wyprowadzić przy pomocy tej gramatyki. Następnie, opisz język zdefiniowany tą gramatyką. Zadanie 5 Zaproponujcie gramatykę, która definiuje język złożony ze słów, w których najpierw są litery a, a potem litery b, ale liczby liter a i b są różne. Wskazówka: Niech pierwsza reguła to P W M Następnie niech W generuje słowa, których najpierw są litery a, a potem litery b, ale liter a jest więcej niż b, a M generuje słowa, których najpierw są litery a, a potem litery b, ale liter a jest mniej niż b. Odnotujmy jeszcze fakt, że każdy język regularny jest bezkontekstowy. Rzeczywiście każde wyrażenie regularne można bez trudu przerobić na gramatykę bezkontekstową. Zadanie 6 Znajdźcie gramatykę bezkontekstową równoważną wyrażeniu regularnemu (a.a.b + b.a).a.a. Wskazówka: Zacznijcie od wyrażenia a.a.b+b.a Wskazówka: Stwórzcie nowy symbol początkowy, żeby dostać (a.a.b + b.a) Wskazówka: Zajmijcie się teraz częścią a.a Wskazówka: Połącz ostatnie dwa kroki w jedną całość dodając nowy symbol początkowy 2 Zastosowanie gramatyk bezkontekstowych Gramatyki komputerowe odgrywają zasadnicze znaczenie w procesie rozumienia wyrażeń przez komputer. Jak widzisz na przykładzie języka angielskiego, jeśli dostaniemy zdanie the happy girl talks to the cat often because she likes it to znając gramatykę bezkontekstową możemy znaleźć jego drzewo wyprowadzenia. A znając drzewo wyprowadzenia wiemy już dużo więcej co jest tutaj podmiotem, co jest orzeczeniem itd. W szczególności, w ten właśnie sposób działają języki programowania. Interpreter rozpoznaje poszczególne elementy napisanego kodu programu tworząc w pamięci drzewo jego wyprowadzenia. Najprostszym przypadkiem mogą być tutaj wyrażenia arytmetyczne (dla uproszczenia załóżmy, że liczby w tych wyrażeniach są jednocyfrowe i jest tylko dodawanie i mnożenie, bez nawiasów). Moglibyśmy takie wyrażenie zdefiniować gramatyką: W W W W + W 0 1 2 3 4 5 6 7 8 9 Wtedy możemy zrozumieć wyrażenie 1 2 + 3 4 jako 3

W W + W W. W W. W 3 1 4 2 Co brzmi świetnie, bo umożliwia w ogóle poprawne obliczenie tego wyrażenia 1 2 + 3 4 = (1 2) + (3 4) = 2 + 12 = 14. Ale, ale, moglibyśmy też nasze wyrażenie wyprowadzić jako W W. W 1 W. W W + W 4 2 3 Ale, gdybyśmy tego wyprowadzenia chcieli użyć do konstrukcji gramatyki, skończyłoby się to źle: 1 2 + 3 4 1 ((2 + 3) 4) = 1 (5 4) = 20. Ale da się to naprawić. Zadanie 7 Naprawcie tą gramatykę tak, żeby każda metoda wyprowadzenia była zgodna z kolejnością wykonywania działań arytmetycznych i w związku z tym mogła zostać użyta do kalkulacji wyniku. 3 Nie każdy język jest bezkontekstowy! Zauważmy jednak, że nie każdy język jest bezkontekstowy. Przykładem takiego języka jest język słów nad alfabetem {a, b, c} takich, że najpierw są litery a, potem b, potem c, ale liter a jest tyle samo co liter b, których jest tyle samo, co liter c. Aby udowodnić, że tak jest, trzeba posłużyć się dowodem nie wprost. Załóżmy zatem, że istnieje gramatyka, która generuje ten język. Powiedzmy, że gramatyka ta ma N symboli roboczych, a najdłuższa reguła przekształca symbol w M symboli (inaczej mówiąc patrząc na drzewo wyprowadzenia, największe rozgałęzienie to rozgałęzienie na M gałęzi). Ale w takim razie weźmy słowo w, które ma najpierw M N+1 liter a, potem M N+1 liter b, potem M N+1 liter c. I wyobraźmy sobie drzewo wyprowadzenia tego słowa w gramatyce, której istnienie założyliśmy. Skoro nasze drzewo może się rozgałęziać maksymalnie na M, musi mieć wysokość większą niż N (bowiem drzewo wysokości N rozgałęziające się w każdym miejscu na M wygeneruje maksymalnie M N+1 liter, a my musimy wygenerować 3M N+1 liter). Ale w takim razie pewna ścieżka (gałąź) tego drzewa musi mieć długość co najmniej N + 1. Ale skoro 4

symboli roboczych użytych w tej gramatyce jest tylko N, to któryś symbol musi się na tej ścieżce powtórzyć dwa razy. Mógłbym powiedzieć zatem, że nasze słowo było generowane następująco: P αxβ αγxδβ a... ab... bc... c, gdzie α, β, γ, δ są też pewnymi ciągami symboli. Zatem moje słowo w składa mogę podzielić na pięć kolejnych części: w α, w γ, w X, w δ, w β, które zostały odpowiednio wygenerowane z ciągów symboli α, γ, X, δ i β. Ale, zauważ, że to oznacza, że z symbolu X mogę wygenerować ciąg symboli γxδ. Zatem poniższe wyprowadzenie też jest poprawne: P αxβ αγxδβ αγγxδδβ w α w γ w γ w X w δ w δ w β. Ale zauważ, że niezależnie od tego, jak dokładnie słowo a... ab... bc... c jest podzielone na części w α, w γ, w X, w δ, w β, to nie jest możliwe, że słowo w α w γ w γ w X w δ w δ w β jest postaci a... ab... bc... c o tej samej liczbie liter a, b i c. Zadanie 8 Rozważcie przypadki, żeby zrozumieć dlaczego! Wobec tego nasza gramatyka pozwala wyprowadzić słowo, które nie jest w języku, który ta gramatyka miała definiować. Mamy sprzeczność, zatem taka gramatyka nie istnieje! Zadanie 9 Stosując podobne rozumowanie, udowodnijcie, że język słów nad alfabetem {a, b}, które mają postać ww konkatenacji (złożenia) dwóch identycznych słów nie jest bezkontekstowy. Wskazówka: Zauważcie, że w dowodzie można przyjąć, że część w X nie może być dłuższa niż M N+1. 4 Automaty ze stosem Wróćmy zatem do koncepcji automatów! Załóżmy, że nasze automaty będą niedeterministyczne. Co więcej dodajmy im nową rzecz. Stos. Stos jest takim miejscem, na który (w ramach przejścia) nasz automat może wrzucać rzeczy (jakieś symbole). Może też zdejmować rzeczy ze stosu (z wierzchu, czyli te najświeższe). Może też widzieć co jest na górze stosu i na tej podstawie decydować o przejściu. Zatem tym razem nasze przejścia będziemy opisywać nie tylko pojedynczą (czytaną przez automat literą), ale tak: a, c dd co oznacza, że takie przejście automat może wykonać czytając literę a i widząc literę c na szczycie stosu. W wyniku przejścia na stosie zamiast litery c pojawiają się kolejno dwie litery d. Będziemy również dopuszczać przejścia, w których automat nic nie czyta ze słowa, którym się zajmuje (a tylko wykonuje operacje na stosie), c dd Może być tak, że automat tylko zdejmuje coś ze stosu, a nic tam nie odkłada, co będzie oznaczane, np. a, c 5

(automat czytając a i widząc na stosie c, usuwa to c nie zostawiając nic nowego.) Będzie też specjalny symbol #, który zawsze będzie na dnie stosu (i jest jedynym symbolem na stosie na początku działania automatu). Na przykład to jest automat ze stosem. Zadanie 10 Powyższy automat może zaakceptować na przykład słowo abbaabba. Jak on to zrobi? Prześledźcie jakie stany przejdzie i co dokładnie będzie na stosie w kolejnych krokach. Zadanie 11 Jaki język rozpoznaje rozważany automat? Dlaczego? Zadanie 12 Wzbogaćcie powyższy automat w taki sposób, żeby akceptował tylko takie słowa (spośród akceptowanych przez oryginalny automat), które mają liczbę liter a podzielną przez 4. Okazuje się, że język jest bezkontekstowy wtedy i tylko wtedy, gdy istnieje automat ze stosem który go rozpoznaje. Inaczej mówiąc dla każdej gramatyki istnieje równoważny automat ze stosem. Ale o tym już dowiesz się na wykładzie! 5 Zadania dodatkowe Zadanie 13 Zastanówcie się nad tym, czego nauczyłeś się w kwestii programowania w Pythonie. Czy moglibyście użyć gramatyki bezkontekstowej do zapisania składni tego języka? Wybierzcie jakiś prosty typ instrukcji w Pythonie, np. test logiczny (to co może się np. pojawić po słowie if) i spiszcie gramatykę, która pozwala wygenerować taki test logiczny. Możemy ograniczyć się tylko do takich testów logicznych, w których podstawowym budulcem są liczby (ale nie ma operacji arytmetycznych). 6

Zadanie 14 Rzeczywiście, gramatyk bezkontekstowych (w połączeniu z wyrażeniami regularnymi) używa się do opisywania składni języków programowania. Gramatyka składni Pythona jest dostępna pod adresem https://docs.python.org/3/reference/grammar.html. Szybko zauważycie, że gramatyka ta jest zapisana nieco inaczej niż zapisujemy ją tu. Spróbujcie zrozumieć, co oznaczają poszczególne oznaczenia. Zadanie 15 Przejrzyjcie tę gramatykę Pythona w poszukiwaniu konstrukcji programistycznych, których używaliśmy na ostatnich zajęciach z programowania. Czy zauważyłeś przy okazji coś nowego? Zadanie 16 Skonstruujcie gramatykę, która definiuje język złożony ze słów nad alfabetem {a, b}, który zawiera wszystkie słowa nieparzystej długości oraz te słowa parzystej długości, które są da się przedstawić jako konkatenacja uv (sklejenie) dwóch słów u i v, które są nieparzystej długości i mają różne środkowe litery. Wskazówka: Niech pierwsza reguła to P A B AB BA a reguła na A niech generuje dowolne słowo o nieparzystej długości i środkowej literze A, zaś reguła na B dowolne słowo o nieparzystej długości i środkowej literze B Zadanie 17 Skonstruujcie gramatykę, która definiuje język złożony ze słów nad alfabetem {a, b}, który zawiera wszystkie słowa, które nie są konkatenacją (sklejeniem) dwóch identycznych słów (nie są postaci ww, gdzie w to pewne słowo). Wskazówka: Przyjrzyjcie się porządnie słowom generowanym przez gramatykę z poprzedniego zadania. Cała trudność polega na udowodnieniu obserwacji dotyczącej tych słów. Zadanie 18 Skonstruujcie automat ze stosem, który rozpoznaje dokładnie te słowa, które zdefiniowane są przez gramatykę S asb A A bsa S Wskazówka: Użycie symboli roboczych jako symboli stosu. Na początku niech automat wrzuci sobie na stos symbol początkowy. W dowolnym momencie automat może zamienić symbol na stosie według jednej z reguł. 7

6 Zadania domowe Zadanie 19 (1 punkt) Popraw gramatykę przedstawioną na samym początku ćwiczeń, tak aby uniemożliwiała ustawienie rodzajnika (a, the, an) przed zaimkiem (she, it). Przedstaw przykład zdania z języka zdefiniowanego przez tę nową gramatykę łącznie z jego drzewem wyprowadzenia. Zadanie 20 (2 punkty) Prześledź działanie poniższego automatu ze stosem na przykładzie słowa aaabbccccc. Czy ten automat może zaakceptować to słowo? A jeśli tak, jakie są poszczególne stany i zawartość stosu? Opisz język, który jest rozpoznawany przez ten automat. Zadanie 21 (3 punkty) Dopełnieniem pewnego języka L nad danym alfabetem to język złożony ze wszystkich słów nad tym alfabetem, które nie są w L. Udowodnij, że nie zawsze dopełnienie języka bezkontekstowego jest językiem bezkontekstowym. Wskazówka: Znajdź gramatykę definiującą język, który składa się ze słów, w których kolejno występują najpierw litery a, potem litery b, a następnie litery c, z tym że liter a jest inna liczba niż liter b lub liter b jest inna liczba niż liter a (przyjrzyj się rozwiązaniu zadania 5). Gdy już przygotujesz taką gramatykę, dorzuć do niej reguły generujące słowa, które nie są postaci, w której kolejno występują najpierw litery a, potem litery b, a następnie litery c. 8