Języki, automaty i obliczenia/Wykład 7: Twierdzenie Kleene'ego. Własności języków i gramatyk regularnych

Z Studia Informatyczne
Wersja z dnia 22:14, 11 wrz 2023 autorstwa Luki (dyskusja | edycje) (Zastępowanie tekstu – „<math> ” na „<math>”)
(różn.) ← poprzednia wersja | przejdź do aktualnej wersji (różn.) | następna wersja → (różn.)
Przejdź do nawigacjiPrzejdź do wyszukiwania

W wykładzie udowodnimy twierdzenie Kleene'ego, które orzeka, że rodzina języków regularnych jest identyczna z rodziną języków rozpoznawanych przez automaty o skończonej liczbie stanów. Przedstawimy własności języków regularnych i gramatyk typu (3). Na koniec uzasadnimy, że rodziny języków regularnych, rozpoznawalnych oraz generowanych przez gramatyki typu (3), są tożsame.

Twierdzenie Kleene

Stephen Cole Kleene (1909-1994)
Zobacz biografię

Wiemy już, z poprzednich wykładów, że rodzina wyrażeń regularnych

określa rodzinę języków regularnych. Celem pierwszej części tego wykładu jest ustalenie związku pomiędzy rodziną języków regularnych a rodziną języków rozpoznawanych przez automaty o skończonej liczbie stanów. Twierdzenie, udowodnione przez S.C.Kleene'ego w roku 1956, orzeka, iż te dwie rodziny języków są identyczne.

Twierdzenie 1.1.

Dla dowolnego skończonego alfabetu A

𝒢(A*)=𝒞(A*)

Dowód

Dowód pierwszej części twierdzenia, czyli inkluzja 𝒢(A*)𝒞(A*) , będzie prowadzony zgodnie ze strukturą definicji rodziny języków regularnych 𝒢(A*) .

1. Język pusty jest rozpoznawany przez dowolny automat 𝒜=(S,A,f,s0,T), w którym zbiór stanów końcowych T jest pusty.

2. Język a złożony z dowolnej litery aA jest rozpoznawany przez automat
Rysunek 1

Dla dalszej części dowodu ustalmy, iż dane są języki L1,L2 rozpoznawane odpowiednio przez automaty deterministyczne 𝒜i=(Si,fi,s0i,Ti), gdzie i=1,2.

3. Sumę mnogościową języków L1,L2, czyli język L=L1L2 rozpoznaje automat 𝒜=(S,f,s0,T), dla którego S=S1×S2, s0=(s01,s02),  :T=T1×S2S1×T2 oraz dla dowolnego stanu (s1,s2)S i litery aA funkcja przejść określona jest równością

f((s1,s2),a)=(f1(s1,a),f2(s2,a)).

4. Katenację języków L1,L2, czyli język L=L1L2 rozpoznaje automat 𝒜=(S,f,s0,T), dla którego S=S1×𝒫(S2),s0=(s01,) oraz dla dowolnego stanu (s1,S'2)S i litery aA funkcja przejść określona jest następująco:

Parser nie mógł rozpoznać (błąd składni): {\displaystyle f((s_1,S'_2),a) = \left\{ \begin{array} {ll} (f_1(s_1,a),f_2(S'_2,a)) & \text{gdy} f_1(s_1,a) \notin T_1 ,\\ (f_1(s_1,a),f_2(S'_2,a) \cup \{ {s_0}^2\}) & \text{gdy}f_1(s_1,a) \in T_1, \end{array} \right} .

a zbiorem stanów końcowych jest

T=S1×{S𝒫(S2):ST2}.

5. Załóżmy, że język L rozpoznaje automat 𝒜=(S,f,s0,T). Określimy automat niedeterministyczny, który będzie rozpoznawał gwiazdkę Kleene języka L, czyli L*. Automat niedeterministyczny 𝒜=(S,f,{s0},T), w którym

Parser nie mógł rozpoznać (błąd składni): {\displaystyle f'(s,a) = \left\{ \begin{array} {ll} \{ f(s,a)\} & \text{gdy} f(s,a) \notin T ,\\ \{ f(s,a),s_0 \} & \text{gdy} f(s,a) \in T \end{array} \right} .

rozpoznaje język język L+. Dowód tego faktu jest indukcyjny i pozostawiamy go na ćwiczenia. Zauważmy teraz, że język {1} rozpoznaje automat

Rysunek 2

Ponieważ L*=L+{1} , to korzystając z udowodnionej już zamkniętości języków rozpoznawanych ze względu na sumę mnogościową, stwierdzamy, że istnieje automat rozpoznający język L*.

Zatem dowód inkluzji 𝒢(A*)𝒞(A*) jest zakończony.

Przejdziemy teraz do dowodu inkluzji 𝒢(A*)C(A*) .

Niech L oznacza dowolny język rozpoznawany przez automat 𝒜=(S,f,s0,T). Dowód polega na rozbiciu języka L na fragmenty, dla których stwierdzenie, że są to języki regularne będzie dość oczywiste. Natomiast sam język L będzie wynikiem operacji regularnych określonych na tych właśnie fragmentach. Poniżej przeprowadzamy defragmentację języka L.

Dla s,tS niech

L(s,t)={wA*:f(s,w)=t}.

Jest to język złożony ze słów, które przeprowadzają stan s automatu 𝒜 w stan t . Ogół liter alfabetu A przeprowadzających stan s w t oznaczymy przez

A(s,t)={aA:f(s,a)=t}.

Dla stanów s,tS i zbioru S1S niech

L(s,S1,t)={wA*:f(s,w)=t,f(s,w1)S1:w=w1v,w1,vA*}.

Jest to język, który można przedstawić graficznie następująco:

Rysunek 3

Na koniec przyjmijmy

L(s,S2,t)={wA*:f(s,w)=t,f(s,w1)S2:w=w1v,w1,vA+},

określony dla S2S i s,tSS2

Język ten jest graficznie interpretowany poniżej.

Rysunek 4

Wprost z określeń wynika, że wszystkie wprowadzone powyżej języki są regularne, czyli należą do rodziny 𝒢(A*) . Dowód tego faktu przebiega indukcyjnie ze względu na liczbę elementów zbiorów S1 i S2. Szczegóły tego dowodu pominiemy. Natomiast warto wskazać rolę, jaką spełniają w dowodzie wprowadzone wyżej języki. A mianowicie:

L(s,{s},s)=A(s,s)*,


L(s,{r},t)=A(s,r)A(r,r)*A(r,t),


L(s,S1,t)=L(s,S1{s},s)*[rS1{s}A(s,r)L(r,S1{s},t)].

Tę ostatnią równość przedstawia poniższy rysunek.

Rysunek 5
L(s,S2,t)=r,rS2A(s,r)L(r,S2,r)A(r,t),

co graficznie można przedstawić następująco:

Rysunek 6

Dochodzimy więc do konkluzji, iż jezyki L(s,S1,t) oraz L(s,S2,t) są regularne. W szczególności zatem regularny jest język L(s0,S,t)=L(s0,t).

Język L możemy przedstawić w następującej postaci:

L=tT{wA*:f(s0,w)=t}=tTL(s0,t),

co w połączeniu z ustaleniami punktu 3 z poprzedniej części dowodu uzasadnia tezę, że język L należy do rodziny 𝒢(A*).

Własności języków regularnych i gramatyk regularnych

W tej części wykładu omówimy własności rodziny języków i gramatyk regularnych, czyli typu (3) w hierarchii Chomsky'ego. Ustalimy też związek pomiędzy językami a gramatykami regularnymi. Zbadamy zamkniętość rodziny języków regularnych ze względu na operacje mnogościowe, czyli ze względu na sumę, przecięcie, różnicę i uzupełnienie. Rozpoczniemy jednak tę część wykładu od wprowadzenia jednoargumentowego działania na słowach zwanego odbiciem zwierciadlanym.

Definicja 2.1.

Odbiciem zwierciadlanym słowa w=a1anA* nazywamy słowo w=ana1. Odbiciem zwierciadlanym języka LA* nazywamy język L={wA*:wL}.

Twierdzenie 2.1.

Rodzina 𝒢(A*)=𝒞(A*) jest zamknięta ze względu na:

(1) sumę mnogościową, przecięcie, różnicę i uzupełnienie,
(2) katenację i operację iteracji *
(3) obraz homomorficzny,
(4) podstawienie regularne,
(5) przeciwobraz homomorficzny,
(6) odbicie zwierciadlane.

Dowód

1. Zamkniętość rodziny języków 𝒢(A*) ze względu na sumę mnogościową wynika z twierdzenia Kleene'ego. Automat akceptujący iloczyn języków otrzymujemy, zmieniając odpowiednio zbiór stanów końcowych w automacie rozpoznającym sumę. Bowiem pozostając przy oznaczeniach punktu 3 z dowodu twierdzenia Kleene'ego, automat 𝒜=(S,f,s0,F), gdzie F=T1×T2, rozpoznaje język L1L2. Jeśli automat 𝒜=(S,f,s0,T) akceptuje język L, to automat 𝒜=(S,f,s0,ST) akceptuje język L=A*L. Ostatnia własność implikuje zamkniętość ze względu na uzupełnienie.

2 Z twierdzenia Kleene'ego, punkt 4 i 5, wynika zamkniętość ze względu na katenację i operację iteracji *.

3. Niech h:A*B* będzie homomorfizmem. Dowód implikacji

L𝒢(A*) :h(L)𝒢(B*)

przeprowadzimy zgodnie ze strukturą definicji rodziny języków regularnych. Dla L= i dla L={a} gdzie a jest dowolną literą alfabetu A , implikacja jest oczywista. W pierwszym przypadku obrazem homomorficznym jest język pusty, a w drugim język {w} , gdzie w jest pewnym słowem nad alfabetem B . Dla dowolnych języków regularnych X,Y𝒢(A*) prawdziwe są równości:

  • h(XY)=h(X)h(Y)𝒢(B*) ,
  • h(XY)=h(X)h(Y)𝒢(B*) ,
  • h(X*)=h(n=0Xn)=n=0(h(X))n=(h(X))*𝒢(B*)

co kończy dowód tego punktu.

4. Uzasadnienie jest podobne jak dla homomorfizmu. Jedyna różnica tkwi w tym, że dla podstawienia regularnego s:A*𝒫(B*) i dla dowolnej litery aA wartość podstawienia na literze jest pewnym językiem regularnym s(a)=L𝒢(B*) , a nie słowem jak w przypadku homomorfizmu.

5. Niech h:A*B* będzie homomorfizmem. Aby udowodnić implikację

L𝒢(B*) :h1(L)𝒢(A*),

odwołamy się do własności, że dla języka L𝒢(B*) istnieje skończony monoid M i homomorfizm φ:B*M taki, że L=φ1(φ(L)). Dla

homomorfizmu φh:A*M mamy równość:
((φh)1(φh))(h1(L))=h1(L).

Korzystając teraz z punktu 4 twierdzenia 1.2 z wykładu 3 (patrz twierdzenie 1.2. wykład 3), wnioskujemy, że h1(L)𝒢(A*) .

6. Wykorzystamy tutaj zapis języka regularnego przez wyrażenie regularne. Niech dla języka L𝒢(A*) wyrażenie regularne α𝒲 będzie takie, że L=α. Wtedy język L jest opisany przez wyrażenie regularne α, które uzyskujemy z α przez odbicie zwierciadlane, a dokładniej odwrócenie kolejności katenacji w każdej sekwencji tego działania występującej w wyrażeniu regularnym.

W wykładzie drugim wprowadziliśmy pojęcie gramatyki. Wracamy do tego pojęcia, a w szczególności do gramatyki typu (3), czyli regularnej. Przypomnijmy, że produkcje takiej gramatyki G=(VN,VT,v0,P) mają postać:

vvxlubvx

gdzie v,vVN,xVT*. Gramatykę typu (3), nazywamy inaczej lewostronną lub lewoliniową. Określa się też gramatykę regularną prawostronną (prawoliniową). Jest to gramatyka G=(VN,VT,v0,P), której produkcje są postaci:

vxvlubvx

gdzie v,vVN,xVT*. Jeśli język L=L(G) jest generowany przez gramatykę typu (3) (lewoliniową), to jego odbiciem zwierciadlanym jest L=L(G), gdzie G jest gramatyką prawoliniową, którą uzyskuje się z gramatyki G przez odbicie zwierciadlane prawych stron produkcji. Oznacza to, iż zmieniamy produkcje według następujących zasad:

vvx zastępujemy przez vxv
vx zastępujemy przez vx.

Oczywiście, jeśli L jest językiem generowanym przez gramatykę prawoliniową, to L jest generowany przez odpowiednią gramatykę lewoliniową.

Podamy teraz charakterystykę rodziny języków regularnych 𝒢(A*) przez rodzinę gramatyk prawoliniowych.

Twierdzenie 2.2.

Niech LA*. Język L𝒢(A*) wtedy i tylko wtedy, gdy L=L(G) dla pewnej gramatyki prawoliniowej G.

Dowód

Załóżmy, że automat 𝒜=(S,A,f,s0,T) rozpoznaje język L . Definiujemy gramatykę G=(VN,VT,v0,P) przyjmując VN=S,VT=A,v0=s0 oraz określając w następujący sposób zbiór produkcji

P={saf(s,a);:sS,aA}{s1;:sT}.

Dla dowolnego stanu sS i słowa wA+ prawdziwa jest równoważność

s0*ws ; ; ; ;f(s0,w)=s.

Dowód przeprowadzimy indukcyjnie ze względu na długość słowa w. Niech w=a dla pewnego aA. Z definicji zbioru produkcji P wynika równoważność

s0ass=f(s0,a).

Rozważmy teraz w=a1an oraz s0*ws. Z założenia indukcyjnego

wynika, że
f(s0,a1an1)=ss0*a1an1s

oraz, że s=f(s,an) wtedy i tylko wtedy, gdy sans. A więc fakt, że s=f(s0,w)=f(s0,a1an)=f(f(s0,a1an1),an) jest równoważny temu, że s=f(s0,a1an1)ans . A to z kolei równoważne jest

s0*a1an1s,sans

i ostatecznie równoważne faktowi, że s0*a1an1ans . A zatem dowodzona równoważność jest prawdziwa dla wA+, ponieważ

wL(𝒜) : :s=f(s0,w)T : :so*ws,s1P : :wL(G).

Dla w=1 mamy 1L(𝒜) : :s01P : :1L(G) co kończy dowód w jedną stronę.

Rozważmy teraz język L=L(G) generowany przez pewna gramatykę prawoliniową G=(VN,VT,v0,P). Skonstruujemy gramatykę równoważną G i taką, w której wszystkie produkcje są postaci vav lub v1, gdzie v,vVN,aA. Będziemy zamieniać produkcje występujące w gramatyce G na inne, o żądanej postaci, zgodnie z następująmi zasadami:

1. Produkcje typu vv, gdzie v,vVN

Z symbolem nieterminalnym vVN kojarzymy określony poniżej zbiór

VN(v)={vVN:vv1vnvwG}

oraz zbiór produkcji

P(v)={vxv:x1,vVN(v),vxvP}
{vx:vVN(v),vxP}.

Dla każdego takiego symbolu vVN usuwamy ze zbioru P wszystkie produkcje vv i wprowadzamy na to miejsce wszystkie produkcje ze zbioru P(v).

2. Produkcje typu vx dla x1.

Jeśli produkcja taka występuje w P i x1, to do alfabetu nieterminalnego VN dodajemy nowy symbol vx. Następnie ze zbioru P usuwamy powyższą produkcję i dodajemy dwie nowe:

vxvx,vx1.

Zauważmy, że jeśli xy, to vxvy.

3. Produkcje typu vxv dla x>1.

Jeśli va1anvP, przy czym n2, to do alfabetu nieterminalnego VN dodajemy nowe symbole v1,vn, produkcję va1anv usuwamy ze zbioru P i

dodajemy produkcje:
va1v1,v1a2v2,,vn1anv.

Po opisanych powyżej trzech modyfikacjach gramatyki G generowany język, co łatwo zauważyć, nie ulega zmianie. Zatem skonstruowana gramatyka jest równoważna wyjściowej. Dla otrzymanej gramatyki określamy teraz automat niedeterministyczny 𝒜=(S,A,f,{s0},T), przyjmując S=VN, A=VT oraz s0=v0 i definiując następująco funkcję przejść: f(v,a)={vVN:vavP}. Przjmując T={vVN:v1P} jako zbiór stanów końcowych, stwierdzamy, że automat 𝒜 rozpoznaje język

L(𝒜)={wVT* :: :f(s0)T}=L.

Uzyskany rezultat, w świetle równości 𝒢(A*)=C(A*) , kończy dowód twierdzenia.

Algorytmiczną stroną równoważności udowodnionej w powyższym twierdzeniu zajmiemy się w następnym wykładzie. Przykłady ilustrujące twierdzenie zamieszczamy poniżej.

Przykład 2.1.

1. Niech 𝒜=(S,A,f,s0,T) będzie automatem takim, że

S={s0,s1,s2},A={a,b},T={s1}, a graf przejść wygląda następująco:
Rysunek 7

Gramatyka G=(S,A,s0,P), gdzie

P={s0as1,s0bs2,s1as2,s1bs0,s11,s2as0,s2bs1}

akceptuje język L(𝒜).

Zauważmy, że język

L(𝒜)=L(G)={wA*:#aw#bw=1mod3}.

2. Niech G=({v0,v1},{a,b},v0,P), gdzie

P={v0av0,v0ab,v0bv1,v11}.

Gramatykę G przekształcamy w równoważną gramatykę

G=({v0,v1,v2,vb},{a,b},v0,P),

gdzie

P={v0av0,v0av2,v0bv1,v2bvb,v11,vb1}.

Niedeterministyczny automat 𝒜ND=({v0,v1,v2,vb},{a,b},f,v0,{v1,vb}), gdzie graf przejśc wygląda następująco:

Rysunek 8


L(G)=L(𝒜ND)=a*b

Wykorzystując udowodnione do tej pory własności rodziny języków generowanych przez gramatyki regularne, uzasadnimy teraz, iż ta właśnie rodzina, czyli ogół języków typu (3) w hierarchii Chomsky'ego pokrywa się z rodziną 𝒢(A*) .

Twierdzenie 2.3.

Dla dowolnego alfabetu A rodziny języków regularnych A* oraz języków generowanych przez gramatyki regularne są równe, czyli 𝒢(A*)=3 .

Dowód

Odbicie zwierciadlane dowolnego języka L𝒢(A*) , czyli język L należy również do rodziny 𝒢(A*) , co oznacza, że LC(A*) . Na podstawie twierdzenia 2.2. (patrz twierdzenie 2.2.) istnieje więc gramatyka prawoliniowa G taka, że L=L(G) . A stąd wniosek, że L=L=L(G) dla pewnej gramatyki G typu (3). Zatem L3 .

Rozważmy teraz język L typu (3), czyli L=L(G) dla pewnej gramatyki regularnej. A więc L=L(G) dla pewnej gramatyki prawoliniowej i LC(A*) . Z twierdzenia Kleene'ego wynika, że L𝒢(A*) i ostatecznie L=L𝒢(A*) , co kończy dowód twierdzenia.

Zamkniemy rozważania następującą konkluzją podsumowującą główne rezultaty tego wykładu.

Dla dowolnego skończonego alfabetu A prawdziwe są równości:

𝒢(A*)=𝒞(A*)=3

czyli wprowadzone pojęcia rodziny języków regularnych, rozpoznawalnych oraz generowanych przez gramatyki typu (3) są tożsame.