Języki formalne i automaty Ćwiczenia 2

Podobne dokumenty
Języki formalne i automaty Ćwiczenia 1

Języki formalne i automaty Ćwiczenia 3

Języki formalne i automaty Ćwiczenia 4

Języki formalne i automaty Ćwiczenia 8

Języki formalne i automaty Ćwiczenia 9

Języki formalne i automaty Ćwiczenia 7

JAO - Wprowadzenie do Gramatyk bezkontekstowych

2.2. Gramatyki, wyprowadzenia, hierarchia Chomsky'ego

Matematyczne Podstawy Informatyki

3.4. Przekształcenia gramatyk bezkontekstowych

Metody Kompilacji Wykład 7 Analiza Syntaktyczna

Gramatyki, wyprowadzenia, hierarchia Chomsky ego. Gramatyka

11 Probabilistic Context Free Grammars

Hierarchia Chomsky ego Maszyna Turinga

Analizator syntaktyczny

JAO - lematy o pompowaniu dla jezykow bezkontekstowy

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

Języki formalne i automaty Ćwiczenia 6

Języki formalne i automaty Ćwiczenia 5

Efektywna analiza składniowa GBK

0.1 Lewostronna rekurencja

Wprowadzenie do analizy składniowej. Bartosz Bogacki.

GRAMATYKI BEZKONTEKSTOWE

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

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

Gramatyka operatorowa

Języki, automaty i obliczenia

Gramatyki rekursywne

Parsery LL(1) Teoria kompilacji. Dr inż. Janusz Majewski Katedra Informatyki

Wykład 5. Jan Pustelnik

JĘZYKIFORMALNE IMETODYKOMPILACJI

Programowanie w Logice Gramatyki metamorficzne. Przemysław Kobylański na podstawie [CM2003] i [SS1994]

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, δ)

Złożoność obliczeniowa zadania, zestaw 2

Imię, nazwisko, nr indeksu

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

Maszyna Turinga języki

Języki i gramatyki formalne

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 FORMALNE I METODY KOMPILACJI

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

JIP. Analiza składni, gramatyki

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

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

Języki, automaty i obliczenia

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

Metody Kompilacji Wykład 3

Hierarchia Chomsky ego

Analiza leksykalna 1. Teoria kompilacji. Dr inż. Janusz Majewski Katedra Informatyki

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

AUTOMATY SKOŃCZONE. Automat skończony przedstawiamy formalnie jako uporządkowaną piątkę:

Efektywność Procedur Obliczeniowych. wykład 5

Jaki język zrozumie automat?

Analiza semantyczna. Gramatyka atrybutywna

operacje porównania, a jeśli jest to konieczne ze względu na złe uporządkowanie porównywanych liczb zmieniamy ich kolejność, czyli przestawiamy je.

ZADANIA Z AUTOMATU SKOŃCZONEGO SPRAWOZDANIE NR 4

Symbol, alfabet, łańcuch

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

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

Algorytmy zwiazane z gramatykami bezkontekstowymi

Lista 5 Gramatyki bezkontekstowe i automaty ze stosem

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

Lingwistyka Matematyczna Języki formalne i gramatyki Analiza zdań

Języki i operacje na językach. Teoria automatów i języków formalnych. Definicja języka

Gramatyki atrybutywne

Algorytmy i struktury danych. Drzewa: BST, kopce. Letnie Warsztaty Matematyczno-Informatyczne

Zadanie analizy leksykalnej

1. Maszyna Turinga, gramatyki formalne i ONP

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

Zależności funkcyjne

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

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

Metodologie programowania

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:

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)

Gramatyki regularne i automaty skoczone

10. Translacja sterowana składnią i YACC

Plan wykładu. Kompilatory. Literatura. Translatory. Literatura Translatory. Paweł J. Matuszyk

Szukanie rozwiązań funkcji uwikłanych (równań nieliniowych)

Efektywny parsing języka naturalnego przy użyciu gramatyk probabilistycznych

Obliczenia inspirowane Naturą

Algorytm - pojęcie algorytmu, sposób zapisu, poziom szczegółowości, czynności proste i strukturalne. Pojęcie procedury i funkcji.

Def. Kod jednoznacznie definiowalny Def. Kod przedrostkowy Def. Kod optymalny. Przykłady kodów. Kody optymalne

Analiza metodą zstępującą. Bartosz Bogacki.

Turing i jego maszyny

10110 =

Obliczenia inspirowane Naturą

JĘZYKI FORMALNE I METODY KOMPILACJI

Uproszczony schemat działania kompilatora

Kompresja danych. Tomasz Jurdziński. Wykład 6: kodowanie gramatykowe

1. Synteza automatów Moore a i Mealy realizujących zadane przekształcenie 2. Transformacja automatu Moore a w automat Mealy i odwrotnie

1. Algorytmy przeszukiwania. Przeszukiwanie wszerz i w głąb.

Podstawy programowania 2. Temat: Drzewa binarne. Przygotował: mgr inż. Tomasz Michno

Uproszczony schemat działania kompilatora

Modele Obliczeń. Wykład 1 - Wprowadzenie. Marcin Szczuka. Instytut Matematyki, Uniwersytet Warszawski

Metody Kompilacji Wykład 13

Obliczenia inspirowane Naturą

Definicja 2. Twierdzenie 1. Definicja 3

Maciej Piotr Jankowski

Transkrypt:

Języki formalne i automaty Ćwiczenia 2 Autor: Marcin Orchel Spis treści Spis treści... 1 Wstęp teoretyczny... 2 Metoda brute force... 2 Konwersja do postaci normalnej Chomskiego... 5 Algorytm Cocke a-youngera-kasamiego (CYK).... 7 Referencje... 8 Zadania... 9 Zadanie na 3.0... 9 Zadanie na 4.0... 9 Zadanie na 5.0... 9

Wstęp teoretyczny Jednym z pytań w teorii języków formalnych jest pytanie, jak sprawdzić czy dane słowo należy do danego języka. Na tych zajęciach będziemy rozważali to pytanie dla języków formalnych wyrażonych w postaci gramatyk. Sprawdzanie czy dane słowo należy do języka nazywamy parsowaniem. Pierwszą zaprezentowaną metodą będzie metoda brute force. Metoda brute force Metoda brute force polega na sprawdzeniu wszystkich możliwych słów, jeśli dane słowo nie należy do języka, lub aż do momentu napotkania tego słowa, jeśli należy do tego języka. Algorytm parsowania brute force: Lista aktualnych łańcuchów na początku ustawiona jest na (S). 1. Wybierz produkcje, które można zastosować do poszczególnych łańcuchów z aktualnej listy łańcuchów. 2. Zastosuj odpowiednie produkcje do wszystkich elementów z listy aktualnych łańcuchów. 3. Uaktualnij listę łańcuchów. 4. Sprawdź czy szukane słowo znajduje się na liście aktualnych łańcuchów. Jeśli tak to przerwij działanie programu, jeśli nie to przejdź do kroku 1. Przykład: Gramatyka: 1. S absc 2. S abc 3. Ba ab 4. Bb bb Pytamy czy słowo aabbcc należy do tego języka generowanego przez powyższą gramatykę. Kolejne listy łańcuchów dla algorytmu brute force będą wyglądały następująco: (S), (Prod 1 od S : absc, Prod 2 od S : abc), (Prod 1 od absc : ababscc, Prod 2 od absc : ababcc), (Prod 1 od ababscc : abababsccc, Prod 2 od ababscc : abababccc, Prod 3 od ababscc : aabbscc, Prod 3 od ababcc: aabbcc), (Prod 1 od abababsccc : ababababscccc, Prod 2 od abababsccc : ababababcccc, Prod 3a od abababsccc : aabbabsccc, Prod 3b od abababsccc : abaabbsccc, Prod 3a od abababccc: aabbabccc, Prod 3b od abababccc: abaabbccc, Prod 1 od aabbscc: aabbabsccc, Prod 2 od aabbscc: aabbabccc, Prod 4 od aabbcc: aabbcc). W aktualnej liście łańcuchów znajduje się szukane słowo aabbcc, a więc

słowo to należy do języka. Lista generowanych łańcuchów dla podanego przykładu może być zobrazowana za pomocą drzewa: Powyższe drzewo w algorytmie brute force jest konstruowane począwszy od najwyższego poziomu i jednocześnie sprawdzane są nowo powstające poziomy, a więc przechodzenie przez drzewo jest typu level-order. Wyróżniamy dwa rodzaje algorytmów parsowania: top-down parsing, oraz bottom-up parsing. W top-down parsing zaczynamy poszukiwania od symbolu startowego S, a w bottom-up parsing zaczynamy od poszukiwanego słowa i dążymy do symbolu startowego S. Powyższy algorytm parsowania brute force jest algorytmem top-down parsing. ambigous grammar gramatyka, w której istnieje słowo, które może być wyprowadzone na kilka sposobów, to znaczy, że istnieją dwa różne ciągi produkcji prowadzące do tego słowa. Problemem parsowania brute force jest to, że należy ominąć konieczność sprawdzenia nieskończonej liczby słów w przypadku, gdy słowo nie należy do języka. Najprostszym rozwiązaniem, ale nie dającym pewności, że słowo nie należy do języka jest możliwość zatrzymania programu przez użytkowania po pewnym czasie. Kolejnym rozwiązaniem jest podanie liczby poziomów, które należy sprawdzić. Innym rozwiązaniem dającym pewność czy dane słowo należy do języka po skończonej liczbie kroków jest przestanie rozwijania łańcuchów, które są dłuższe niż szukane słowo, algorytm ten będzie działał poprawnie dla gramatyk, które mają właściwość taką, że z każdej produkcji może powstać łańcuch tylko o tej samej liczbie symboli lub większej oraz taką, że nie istnieje nieskończenie wiele produkcji, które nie zmieniają długości łańcucha. Takimi gramatykami są np. gramatyki kontekstowe bez produkcji łańcuchowych generujące język bez słowa pustego, gramatyki bezkontekstowe bez ε-produkcji i bez produkcji łańcuchowych, gramatyki regularne.

Podana wyżej gramatyka przykładowa jest gramatyką kontekstową, ponadto posiada własności opisane wyżej. Dlatego można zastosować udoskonalenie dla podanego algorytmu takie, że gałąź dla której aktualny łańcuch przekracza długość szukanego słowa zostaje porzucona. Po tej modyfikacji lista generowanych łańcuchów dla podanego przykładu będzie wyglądała następująco: Wynikiem algorytmu parsowania jest nie tylko informacja o tym czy dane słowo należy do danego języka, ale również informacja o wyprowadzeniu tego słowa, czyli o tym, jakie należy zastosować produkcje i w jaki sposób, aby otrzymać dane słowo. W rozważanym przykładzie są to produkcje (1,2,3,4), zastosowane w następujący sposób: S 1 absc 2 ababcc 3 aabbcc 4 aabbcc. Każde wyprowadzenie dla gramatyki bezkontekstowej można przedstawić za pomocą drzewa rozbioru, w którym wewnętrznymi węzłami są nieterminale, a zewnętrznymi terminale. Przykładowo dla gramatyki bezkontekstowej 1. S F 2. S asbfc 3. F d wyprowadzenie dla słowa adbdc wygląda następująco: S 2 asbfc 1 afbfc 3 adbfc 3 adbdc. Drzewo rozbioru wygląda następująco:

Konwersja do postaci normalnej Chomskiego Gramatyka jest w postaci normalnej Chomskiego, kiedy produkcje są postaci: A BC A α S ε gdzie A, B, C to symbole nieterminalne, α jest terminalem. Można zauważyć, że każda gramatyka w postaci normalnej Chomskiego jest gramatyką bezkontekstową. Można udowodnić również, że każda gramatyka bezkontekstowa może być przekształcona do postaci normalnej Chomskiego. Przy wyprowadzaniu jakiegoś słowa każdy kolejny łańcuch jest takiej samej długości, lub o jeden symbol dłuższy, przy pominięciu ostatniej produkcji. Każde wyprowadzenie słowa o długości n składa się z 2n-1 produkcji. Dowód: Jeśli słowo ma długość n to potrzebujemy zastosować produkcje typu 1 dokładnie n 1 razy, a następnie produkcje typu 2 dokładnie n razy. Drzewo rozbioru jest drzewem binarnym, o wysokości co najwyżej n. Algorytm konwersji gramatyki bezkontekstowej do postaci normalnej Chomskiego. Na wejściu mamy gramatykę bezkontekstową, bez ε-produkcji i bez produkcji łańcuchowych. Do zbioru nowych produkcji dodajemy wszystkie poprawne produkcje. Dla każdej pozostałej produkcji, która jest postaci A X 1 X 2 X n, gdzie n 2, X i jest terminalem lub nieterminalem:

1. Dla każdego i od 1 do n 2. Jeśli X i = x i jest terminalem to wtedy: dołączamy do zbioru nieterminali nieterminal C xi, dołączamy do zbioru produkcji produkcje C xi x i, B i = C xi. 3. Jeśli X i jest nieterminalem to wtedy B i = X i. 4. Koniec pętli i 5. Jeśli n = 2, to produkcje postaci A B 1 B 2 dodajemy do zbioru nowych produkcji 6. Jeśli n > 2, to: do zbioru nieterminali dodajemy: D 1, D 2,, D n-2, Przykład: do zbioru produkcji dodajemy: A B 1 D 1, D 1 B 2 D 2, D n-3 B n-2 D n-2, D n-2 B n-1 B n. Dana jest gramatyka postaci: S ba ab A baa as a B abb bs b Dana gramatyka nie zawiera ε-produkcji ani produkcji łańcuchowych. Poprawne produkcje: A a B b Wprowadzamy nieterminale: C b oraz C a i otrzymujemy: S C b A C a B A C b AA C a S a B C a BB C b S b C a a C b b Produkcję A C b AA zastępujemy: A C b D 1 D 1 AA Produkcję B C a BB zastępujemy: B C a D 2 D 2 BB i otrzymujemy: S C b A C a B A C b D 1 C a S a B C a D 2 C b S b C a a

C b b D 1 AA D 2 BB Algorytm Cocke a-youngera-kasamiego (CYK). Algorytm sprawdza czy dane słowo należy do języka generowanego przez gramatykę podaną w postaci normalnej Chomskiego. Złożoność algorytmu CYK wynosi O(n 3 ). Sprawdzamy czy łańcuch x o długości n > 0 należy do języka. Algorytm polega na wyznaczeniu wszystkich wyprowadzeń postaci A *x i,j, gdzie A to dowolny nieterminal, x i,j to dowolny podłańcuch o długości j, rozpoczynający się od i-tej pozycji łańcucha x. Wyprowadzenia wyznaczamy począwszy od wyprowadzeń podłańcuchów o długości 1, później 2 itd. Dla podłańcuchów o określonej długości wyznaczamy wyprowadzenia dla podłańcuchów rozpoczynających się od kolejnych symboli sprawdzanego słowa. Przykładowo dla j = 1 sprawdzamy czy istnieją wyprowadzenia postaci A * x i,1. Wyprowadzenie takie istnieje, jeśli istnieje produkcja postaci A x i,1. Dla j = 2 sprawdzamy czy istnieje wyprowadzenie postaci A *x i,2. Wyprowadzenie to możemy zapisać w postaci: które można rozpisać na: A *x i,1 x i+1,1, A BC x i,1 x i+1,1. Takie wyprowadzenie istnieje, jeśli istnieją produkcje A BC oraz B x i,1 oraz C x i+1,1. Dla j = 3 sprawdzamy czy istnieją wyprowadzenia postaci A * x i,3. Wyprowadzenie takie istnieje, jeśli istnieją wyprowadzenia: A BC, B * x i,2, C * x i+2,1 lub A BC, B * x i,1, C *x i+1,2 Wyprowadzenia drugie i trzecie w obydwu alternatywach były już rozpatrowane w trakcie analizy przypadku gdy j = 2. Dla j = n jeśli w wyprowadzeniu znajdzie się produkcja postaci S BC to słowo należy do języka generowanego przez daną gramatykę. Przykład: Gramatyka postaci: 1. S AB 2. S BC 3. A BA 4. A a 5. B CC 6. B b 7. C AB 8. C a

Sprawdzamy łańcuch wejściowy: aabbab. W celu zastosowania algorytmu CYK konstruujemy tabelę w której każdej komórce odpowiada podłańcuch o początku i i długości j. Wiersze odpowiadają długościom podłańcuchów, a kolumny początkom podłańcuchów. W każdym polu wpisujemy nieterminale z których można wyprowadzić dany podłańcuch. i / j 1 2 3 4 5 6 1 A,C A,C B B A,C B 2 B S, C A,S S,C x 3 B A S,C x x 4 S,C x x x 5 A B x x x x 6 S,C x x x x x x oznacza, ze nie istnieje łańcuch o podanej długości i początku, np. nie istnieje łańcuch w tym przykładzie o długości 2 zaczynający się na ostatniej pozycji w rozpatrywanym słowie. Na początku wypełniamy pole [1,1]. Polu temu odpowiada podłańcuch a. Istnieją dwie produkcje z których można wyprowadzić dany podłańcuch: produkcje 4 i 8. Po wypełnieniu pierwszego wiersza zaczynamy wypełniać wiersz 2. Polu [2, 1] odpowiada podłańcuch aa. Sprawdzamy czy istnieje produkcja postaci? [1, 1][1, 2]. A zatem czy istnieje produkcja postaci? AA lub? AC lub? CA lub? CC. Istniejącą produkcją jest produkcja 5. A zatem do komórki [2, 1] wpisujemy nieterminal B. Po wypełnieniu drugiego wiersza zaczynamy wypełniać wiersz 3. Polu [3, 1] odpowiada podłańcuch aab. Szukamy produkcji postaci? [1, 1][2, 2] lub? [2, 1][1, 3]. Istniejąca produkcja to produkcja 5. Itd. W polu [6, 1] jest nieterminal S, a zatem dane słowo należy do języka. Wyprowadzenie możemy otrzymać przechodząc przez tabelkę od końca. Referencje [1] http://kompilatory.agh.edu.pl/pages/ta-wyklady/3-6-wlasciwosci-jezykowbezkontekstowych.htm

Zadania Zadanie na 3.0 Zapoznać się z wpisywaniem gramatyk do programu JFLAP. Zadanie 6.16 ze strony http://kompilatory.agh.edu.pl/pages/ta-zadania/%20zadania06- przeksztalcenia-gramatyk.htm Zadanie 7.15 ze strony http://kompilatory.agh.edu.pl/pages/ta-zadania/%20zadania07-wlasnoscijbezkontekstowych.htm Wybrać kilka komórek tabeli CYK i opisać ich powstawanie. Dodatek: Dla gramatyki i słowa z zadania 7.15 narysować drzewa rozbioru dla algorytmu parsowania CYK. Zadanie na 4.0 Implementacja parsera brute force w Javie ze sprawdzaniem długości łańcucha. Dodatek: Porównać wyniki tego algorytmu z wynikami algorytmu CYK dla gramatyki z zadania 7.15. Zadanie na 5.0 Implementacja w Javie konwersji do postaci normalnej Chomskiego i algorytmu CYK. Dodatek: Porównać wyniki z konwersją do postaci normalnej za pomocą programu JFLAP dla gramatyki z zadania 6.16. Porównać wyniki algorytmu CYK z wynikami z programu JFLAP dla gramatyki z zadania 7.15. Dodatki są nieobowiązkowe.