Języki i automaty część 3
Języki regularne i automaty Udowodniliśmy, że język L(A) zdefiniowany przez dowolny DAS A jest językiem regularnym. Istnieje zatem taki wzorzec p, że L(A)=L(p) Czy twierdzenie odwrotne jest prawdziwe? Czy dla dowolnego języka regularnego L(p) nad pewnym alfabetem istnieje DAS akceptujący dokładnie te słowa, które pasują do wzorca p? TAK
Twierdzenie 3.1 Dla każdego wyrażenia regularnego p nad pewnym alfabetem istnieje DAS akceptujący dokładnie te słowa, które pasują do p. Dowód Zacznijmy o prostych wzorców: wzorzec DAS x ¬x x po uproszczeniu:
? + = a a b b a b + ≠ Konkatenacja A1 jest automatem dla p1. A2 jest automatem dla p2. Szukamy automatu dla p1p2. Rozważmy następującą konstrukcję: A2 A1 ? Każdy akceptujący stan A1 jest stanem początkowym (kopii) A2 A1 + A2 = Przykład Rozpatrzmy wzorzec: ab ¬a a a ¬b b b a b ¬a ¬b + ≠ Automat ten akceptuje jednak słowa nie pasujące do wzorca a*b* np. aba.
Musimy zatem w inny sposób skonstruować automat dla wzorca p1p2. Między stanami wprowadzamy przejścia, które nie wymagają żadnego symbolu wejściowego. Przejścia takie pozwolą nam łączone automaty „utrzymać w pewnej odległości”. Do alfabetu dodajemy literę oznaczającą takie przejścia . Otrzymujemy w ten sposób automaty skończone z - przejściami. Konkatenacja A1 jest automatem dla p1. A2 jest automatem dla p2. Szukamy automatu dla p1p2. A1 A2 p1p2 A1 A2
Alternatywa A1 jest automatem dla p1. A2 jest automatem dla p2. Szukamy automatu dla p1| p2. A1 A2 p1| p2 A1 A2
Gwiazdka Kleenego A jest automatem dla p. Szukamy automatu dla p. UWAGA: automat nie jest deterministyczny!!!
a a Przykład Rozpatrzmy ponownie wzorzec: ab wzorzec automat a Po uproszczeniu otrzymujemy: a a
Mamy zatem: a a b b Ostatecznie otrzymujemy: a a b b
… W ten sposób otrzymaliśmy twierdzenie (oznaczmy je 3.2): Dla każdego wyrażenia regularnego p nad pewnym alfabetem istnieje NAS akceptujący dokładnie te słowa, które pasują do p. Czy z NAS można w jakiś sposób otrzymać DAS? (1) Na początek spróbujmy usunąć z NAS - przejścia Niech (Q, q0, F, ) będzie NAS z - przejściami. Nową funkcję ’ definiujemy w następujący sposób: q q’’ q’ … x
Do zbioru F’ należą wszystkie stany z F oraz te stany, z których można przejść do stanów z F przez dowolną liczbę - przejść. Dodatkowo usuwamy z automatu stany, które są nieosiągalne ze stanu początkowego. a b Przykład a b a b
x1x2…xn …x1…x2…xn… Przekształciliśmy zatem automat z - przejściami na automat bez - przejść. UWAGI (I) Nawet jeśli początkowo mamy DAS w wyniku powyższej procedury możemy otrzymać NAS. (II) Nowy automat akceptuje słowo x1x2…xn wtedy i tylko wtedy gdy istnieje słowo …x1…x2…xn… akceptowane przez stary (początkowy) automat.
’(S, x) = S’:= { q’Q: q S (q, x) = q’ } (2) Pokażemy teraz jak z NAS bez - przejść można uzyskać DAS. Niech (Q, q0, F, ) będzie NAS bez - przejść. Chcemy zbudować DAS akceptujący dokładnie te same słowa. nowy zbiór stanów Q’ jest zbiorem potęgowym zbioru Q czyli Q’=P(Q). nowym stanem początkowym jest zbiór {q0}. zbiór należący do Q’ jest stanem akceptującym jeżeli zawiera przynajmniej jeden stan należący do F. nowa funkcja przejścia: ’(S, x) = S’:= { q’Q: q S (q, x) = q’ }
Zatem do zbioru S’=(S, x) należą te stany do których można przejść ze stanów należących do S przez drogi z etykietą x. Dodatkowo usuwamy z automatu stany, które są nieosiągalne ze stanu początkowego. Przykład NAS DAS 1 a b Q={0, 1} Q’={{0}, {1}, {0,1}, } 1 01 a b
DAS NAS Przykład Q’={{0}, {1}, {2}, {0,1}, {1,2}, {0,2}, {1,2,3}, } 12 012 1 02 01 2 b 2 a 1 Q={0, 1, 2}
Po uproszczeniu otrzymujemy (pomijamy stany nieosiągalne): Przykład (cd) Po uproszczeniu otrzymujemy (pomijamy stany nieosiągalne): 12 012 1 02 01 2 12 012
Aby zakończyć dowód twierdzenia musimy pokazać, że zbudowany przez nas DAS akceptuje dokładnie te same słowa co początkowy NAS. Jeżeli słowo jest akceptowane przez początkowy NAS oznacza to, że istnieje przejście ze stanu początkowego q0 z etykietami będącymi kolejnymi literami słowa do jednego ze stanów akceptujących ze zbioru F. Oznacza to, że istnieje przejście ze stanu początkowego {q0} z etykietami będącymi kolejnymi literami słowa do stanu, który zawiera stan akceptujący początkowego NAS. Stan taki jest stanem akceptującym w zbudowanym DAS. Z drugiej strony jeżeli zbudowany DAS akceptuje pewne słowo to oczywiście musi je akceptować początkowy NAS. W ten sposób otrzymujemy Twierdzenie 3.1
Podsumowując nasze rozważania możemy sformułować twierdzenie: Język jest regularny wtw gdy jest rozpoznany przez DAS oraz wtw gdy jest rozpoznany przez NAS. Przykład Rozważmy alfabet ={0, 1} i język L={ 0n1n: nN} Czy L jest językiem regularnym?
Lemat o pompowaniu dla języków regularnych W znalezieniu odpowiedzi na to pytanie pomoże nam: Lemat o pompowaniu dla języków regularnych Twierdzenie 3.4 Niech L będzie nieskończonym językiem regularnym. Istnieje wówczas liczba n>0 taka, że każde słowo z L o długości ||n można rozbić na 3 części , i takie, że: = ≠ ||n dla dowolnego k0 słowo k należy do L
Przykład (cd) L={ 0n1n: nN} Rozważmy ponownie język nad alfabetem ={0, 1}. Załóżmy, że L jest językiem regularnym. Niech n będzie liczbą o której mówi Lemat o pompowaniu. Rozważmy słowo 0n1n. Słowo to spełnia założenie lematu (|0n1n| n), a zatem możemy je podzielić na części , i . Ponieważ ||n zatem składa się z samych 0 (a przynajmniej z jednego 0).
Przykład (cd) n 00............001……1 0 <n n Czyli: 00............001……1 n Zatem wyrażenie ma następującą postać: 00............001……1 <n n 0 Oznacza to, że 0 nie należy do L. A zatem język L nie może być regularny! Musimy rozważyć szerszą klasę języków!!!
Języki bezkontekstowe Gramatyka bezkontekstowa G składa się z czterech elementów: alfabet złożony z tzw. symboli terminalnych. zbiór N złożony z tzw. symboli nieterminalnych (zmienne) takich, że N=. wyróżniony element SN nazywany symbolem początkowym. skończony zbiór produkcji lub reguł tzn. łańcuchów postaci R gdzie RN i (N)* jest dowolnym łańcuchem symboli terminalnych i nieterminalnych. R czytamy: R może być zastąpione przez
Definicja S 0 1 n …. i i+1 Łańcuch (N)* jest generowany przez gramatykę G jeżeli istnieje ciąg S 0 1 n …. taki, że każdy krok jest uzyskany przez zastosowanie jednej z reguł gramatyki G do nieterminalnego symbolu występującego w . i i+1 Językiem generowanym przez gramatykę G jest zbiór wszystkich łańcuchów nad , które są generowane przez G. Język generowany przez gramatykę bezkontekstową nazywamy językiem bezkontekstowym.
S B | (S) | S+S | S-S | SS | S/S Przykład ={1, 2, 3, 4, (, ), +, -, x, / } N={S, B} Określmy następujące reguły: B 1 B 2 B 3 B 4 S B S (S) S S+S S S-S S SS S S/S Skrótowo: B 1 | 2 | 3 | 4 S B | (S) | S+S | S-S | SS | S/S Gramatyka ta generuje nam wyrażenia arytmetyczne w których występują liczby 1, 2, 3, 4.
Przykład (cd) S S S S (S) B (S) B (S+S) 2 (B+S) 2 (3+S) 2 (3+B) 2 (3+1) S S S S S S B B 2 ( 3 + 1 )
Czy języki bezkontekstowe stanowią szerszą klasę niż języki regularne? Lemat 3.1 Każdy język regularny jest generowany przez gramatykę bezkontekstową. Dowód Niech L będzie językiem regularnym. Istnieje wówczas DAS (Q, q0, F, ) rozpoznający język L. Zdefiniujemy gramatykę G taką, że słowa rozpoznane przez ten DAS tworzą język wygenerowany przez G. jest alfabetem N:=Q S:=q0
Dla gramatyki G reguły określamy w następujący sposób: Dla każdego przejścia w DAS q q’ x dodajemy następującą regułę do gramatyki: q xq’ Dla każdego stanu akceptującego qF do gramatyki dodajemy regułę q Łańcuchy generowane są przez gramatykę G w następujący sposób: Zaczynamy od symbolu początkowego q0. Symbol ten możemy zastąpić przez xq’ jeżeli w DAS jest przejście q q’ x
xq’ możemy zastąpić przez xyq’’ jeżeli w DAS jest przejście ………itd xy…zq’’’’ możemy zastąpić xy…z przez jeżeli q’’’’ jest stanem akceptującym. Gramatyka G generuje dokładnie te łańcuchy, które akceptowane są przez automat DAS (Q, q0, F, ) . Twierdzenie 3.5 Język jest regularny wtw gdy jest generowany przez gramatykę, której zbiór reguł jest następujący: RxR’, Rx, R gdzie R, R’N, x.
Przykład L={ 0n1n: nN} Rozważmy ponownie język nad alfabetem ={0, 1}. Wiemy już, że język ten nie jest językiem regularnym. Czy L jest językiem bezkontekstowym? Czy istnieje gramatyka, która generuje nam język L? Okazuje się, że tak. Zdefiniujmy następującą gramatykę: symbole terminalne ={0,1} symbole nieterminalne N={S}. zbiór reguł: S0S1, S Gramatyka ta rzeczywiście generuje nam język L: n S 0S1 00S11 … 0 0S1 1 0 01 1