Matematyczne Podstawy Informatyki
Transkrypt
Matematyczne Podstawy Informatyki
Matematyczne Podstawy Informatyki dr inż. Andrzej Grosser Instytut Informatyki Teoretycznej i Stosowanej Politechnika Częstochowska Rok akademicki 2013/2014 Stany równoważne I Stany p i q są równoważne, jeżeli dla wszystkich łańcuchów wejściowych w, δ̂(p, w ) jest stanem akceptującym wtedy i tylko wtedy, gdy δ̂(q, w ) jest stanem akceptującym. I Stany równoważne można zastąpić pojedynczym stanem zachowującym się jak oba stany p i q. I Jeżeli dwa stany nie są równoważne to nazywa się je rozróżnialnymi. Odnajdywanie stanów równoważnych 1. Podstawa: Jeżeli p jest stanem akceptującym, a q nieakceptującym, to para p,q jest rozróżnialna. 2. Krok indukcyjny: Jeżeli p i q są stanami takimi, że dla pewnego symbolu a uzyskuje się stany r = δ(p, a) i s = δ(q, a) o których już wiadomo, że są rozróżnialne, to stany p i q są również parą stanów rozróżnialnych. Minimalizacja DAS I Minimalizacja DAS - A = (Q, Σ, δ, q0 , F ) 1. Znaleźć wszystkie grupy równoważnych stanów algorytmem opisanym wcześniej. 2. Podzielić zbiór stanów Q na bloki wzajemnie równoważnych stanów podaną wcześniej metodą. 3. Skonstruować równoważny automat B o minimalnej liczbie stanów, używając jako jego stanów uzyskanych w poprzednim kroku bloków. 3.1 Stanem początkowym B jest blok zawierający stan początkowy A. 3.2 Zbiorem stanów akceptujących B jest zbiór bloków zawierających stany akceptujące A. Przykład minimalizacji I →A B ∗C D E F G H a B G A C H C G G b F C C G F G E C Przykład minimalizacji II A A B C D E F G H x x x x x x B x x x x x C x x x x x D E F G x x x x x x x x x H Przykład minimalizacji III →(A,E) (B,H) ∗C (D,F) G a (B,H) G (A,E) C G b (D,F) C C G (A,E) Przekształcenie DAS na wyrażenie regularne I Konstrukcja Rijk : 1. Podstawa indukcji to k = 0. W takie sytuacji możliwe są jedynie: 1.1 Łuk prowadzący ze stanu i do wierzchołka j. 1.2 Ścieżka o długości zero, składająca się z jednego wierzchołka. 2. Jest następnie badany DAS i są wyszukiwane symbole wejściowe przy których istnieje przejście ze stanu I Dla i do j (i 6= j): 2.1 Jeżeli nie istnieje takie przejście, to Rij0 = ∅. 2.2 Jeżeli istnieje dokładnie jeden taki symbol a to Rij0 = a. 2.3 Jeżeli znaleziono więcej symboli - a1 , a2 , ..., an to Rij0 = a1 + a2 + ... + an . I Dla i = j: 2.1 Dopuszczalnymi ścieżkami są ścieżki o długości 0 i wszystkie pętle z i do siebie. 2.2 Ścieżka o długości zero jest reprezentowana przez wyrażenie regularne , dlatego dodaje się do przypadków opisanych wcześniej . Przekształcenie DAS na wyrażenie regularne II 3. Krok indukcyjny - założenie istnieje ścieżka ze stanu i do stanu j, która nie przechodzi przez stan wyższy od k. Należy rozważyć tutaj dwa przypadki: 3.1 Ścieżka nie przechodzi wcale przez stan k, wtedy etykieta tej ścieżki należy do stanu Rijk−1 . 3.2 Ścieżka przechodzi przez stan k co najmniej raz. Wtedy można ją rozbić na kilka części: I I I I Ścieżka przechodząca ze stanu i do stanu k (bez wcześniejszego przechodzenia przez k). Ścieżki przechodzące ze stanu k do stanu k (bez wielokrotnego przechodzenia przez k). Ścieżka przechodzą ze stanu k do stanu j (bez dalszego przechodzenia przez k). Zbiór etykiet reprezentuje dla tego rodzaju ścieżki wyrażenie k−1 ∗ k−1 regularne Rikk−1 (Rkk ) Rkj Przekształcenie DAS na wyrażenie regularne III 3.3 Łącząc oba przypadki uzyskuje się ostatecznie: k−1 ∗ k−1 Rijk = Rijk−1 + Rikk−1 (Rkk ) Rkj ) 3.4 Wyrażenie konstruje się w porządku rosnących indeksów górnych. 3.5 Postępując zgodnie z opisanym schematem uzyskuje się w końcu Rijn Przykład I Przykład II Rij0 0 R11 0 R12 0 R21 0 R22 +1 0 ∅ +0+1 Przykład III Rij1 1 R11 1 R12 1 R21 1 R22 ( + 1) + ( + 1)( + 1)∗ ( + 1) 0 + ( + 1)( + 1)∗ 0 ∅ + ∅( + 1)∗ ( + 1) ( + 0 + 1) + ∅( + 1)∗ 0 1∗ 1∗ 0 ∅ +0+1 Przykład IV Rij2 2 R11 2 R12 2 R21 2 R22 1∗ + 1∗ 0( + 0 + 1)∗ ∅ 1∗ 0 + 1∗ 0( + 0 + 1)∗ ( + 0 + 1) ∅ + ( + 0 + 1)( + 0 + 1)∗ ∅ ( + 0 + 1) + ( + 0 + 1)( + 0 + 1)∗ ( + 0 + 1) 1∗ 1∗ 0(0 + 1)∗ ∅ (0 + 1)∗ Przykład V 1. Biorąc pod uwagę sumę teoriomnogościową wszystkich wyrażeń, w których pierwszy stan jest stanem początkowym, a drugi stanem akceptującym uzyskuje się wyrażenie regularne odpowiadające automatowi. 2. W przykładzie stanem początkowym jest stan 1 a akceptującym stan 2, więc wyrażenie regularne przyjmie dla 2 tj. 1∗ 0(0 + 1)∗ . całego automatu przyjmie postać R12 Zastosowania wyrażeń regularnych 1. Wyszukiwanie wzorców tekstowych 2. Analiza leksykalna Wyrażenia regularne w systemie UNIX I I Symbol . (kropki) oznacza dowolny znak (dopasowanie do dowolnego znaku). I Ciąg [a1a2...an] oznacza a1 + a2 + ... + an. W nawiasach kwadratowym można też podać zakres znaków w postaci x − y oznacza to, że będą wyszukiwane znaki w zakresie od x do y w ciągu kodów ASCII. Np.: I I I I [A-Z] - dowolna wielka litera, [a-z] - dowolna mała litera, [0-9] - dowolna cyfra. Wyrażenia regularne w systemie UNIX II Niektóre narzędzia dodają następujące skróty: I \d - cyfra, I \D - wszystko co nie jest cyfrą, I \w - znak będący częścią słowa (zazwyczaj to samo co [a-z,A-Z,0-9]), I \W - znak niebędący częścią słowa, I \s - biały znak (spacja, tabulacja, znak nowego wiersza itp.) I \S - wszystko co nie jest białym znakiem. Wyrażenia regularne w systemie UNIX III Dla wygody zapisującego wyrażenia regularne wprowadzono także: I Operator | oznacza to samo co +. I Operator ? oznacza zero lub więcej wystąpień - R? to samo co + R. I Operator + oznacza jedno lub więcej powtórzeń - R+ to samo co RR ∗ I Operator {n} oznacza dokładnie n wystąpień - R{3} to to samo co RRR. Analiza leksykalna I Analiza leksykalna (analiza liniowa, skanowanie) - proces, w którym strumień znaków, składający się na program wejściowy jest wczytywany i grupowany w symbole leksykalne (tokeny) ciągi znaków, które wspólnie mają pewne znaczenie. I Wyjściowa sekwencja tokenów jest później podstawą do fazy analizy składniowej. I W czasie analizy leksykalnej mogą być usuwane znaki nie mające wpływu na dalsze przetwarzanie kodu programu (np. białe znaki, komentarze). I Analizator leksykalny często jest odpowiedzialny za zbieranie informacji do tablicy symboli. Analiza leksykalna Token, leksem, symbol leksykalny I Token - para składająca się z nazwy tokenu i opcjonalnej wartości tego tokenu. Nazwa tokenu jest symbolem reprezentującym z jaki rodzaj jednostki leksykalnej rozpoznano - słowo kluczowe, sekwencja znaków reprezentująca nazwę. I Wzorzec opisuje jaką formę może przyjąć strumień znaków, żeby zostały zidentyfikowane jako token (np. słowa kluczowe są opisywane jako ciąg znaków, bardziej skomplikowane elementy mogą być opisywane przez wyrażenia regularne). I Lexem - sekwencja znaków w programie źródłowym, jaką można dopasować do wzorca tokenu, która jest identyfikowana przez analizator leksykalny jako instancja tego tokenu. Analiza leksykalna int f(int x) {return x;} Token KWD INT IDENT ’(’ KWD INT IDENT ’)’ ’{’ KWD RETURN IDENT ’;’ ’}’ Wzorzec int [ a-zA-Z][ a-zA-Z0-9]* ( [ a-zA-Z][ a-zA-Z0-9]* ) { return [ a-zA-Z][ a-zA-Z0-9]* ; } Leksem int f ( int x ) { return x ; } Wartość f x x Literatura Do napisania materiałów wykorzystano: 1. M. Sipser “Wprowadzenie do teorii obliczeń”, WNT 2009 2. J.E. Hopcroft, R. Motwani, J.D. Ullman “Wprowadzenie do teorii, automatów, języków i obliczeń”, PWN 2005 3. Alfred V. Aho, Monica S. Lam, Ravi Sethi, Jeffrey D. Ullman ”Compilers: Principles, Techniques & Tools” Person Addison Wesley, 2007