Języki, automaty i obliczenia/Wykład 11: Automat ze stosem

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania

Automat ze stosem

W tym wykładzie określimy automat ze stosem rozpoznający języki bezkontekstowe. Wprowadzimy dwie definicje rozpoznawania języków przez automat ze stosem oraz omówimy ważną podklasę języków bezkontekstowych, mianowicie języków rozpoznawanych przez deterministyczne automaty ze stosem. Uzasadnimy też fakt, iż rodzina języków rozpoznawana przez automaty ze stosem pokrywa się z rodziną jezyków bezkontekstowych.

Automaty ze stosem to systemy rozpoznające języki bezkontekstowe. Ich działanie jest nieco bardziej skomplikowane niż działanie automatu skończenie stanowego. Poza możliwością zmiany stanu pod wpływem czytanego symbolu umieszczonego na taśmie wejściowej automat ten posiada także taśmę stosu, na którą może wpisywać słowa, jak i odczytywać pojedynczy symbol znajdujący się na wierzchu stosu.

Definicja 1.1

Automatem ze stosem nad alfabetem A nazywamy system 𝒜𝒮=(A,AS,Q,f,s0,z0,QF) , w którym:

A - jest alfabetem,

AS - jest dowolnym skończonym i niepustym zbiorem zwanym alfabetem stosu (niekoniecznie rozłącznym z A ),

Q - jest dowolnym, skończonym i niepustym zbiorem zwanym zbiorem stanów,

f:AS×Q×(A{1})𝒫sk(AS*×Q) jest funkcją przejść, której wartościami są skończone podzbiory AS*×Q (także zbiór pusty),

q0Q jest stanem początkowym,

z0AS symbolem początkowym stosu,

QFQ zbiorem stanów końcowych.

Badając działanie automatu ze stosem, wygodniej jest, zamiast funkcji przejść f, rozważać skończoną relację P(AS×Q×(A{1}))×(AS*×Q) zwaną relacją przejść. Elementy tej relacji nazywane są prawami. Relacja P jest zatem skończonym zbiorem praw o następującej postaci:

  1. zqiuqj dla zAS,uAS*,qi,qjQ,
  2. zqiauqj dla zAS,uAS*,aA,qi,qjQ.

Często, używając relacji przejść, oznaczamy automat ze stosem jako układ:

𝒜𝒮=(A,AS,Q,P,s0,z0,QF).

Prawo zqiauqj będziemy reprezentować grafem:

Rysunek 1

Napis z/u oznacza, iż symbol z pobrany ze stosu wymieniany jest na słowo u utworzone nad alfabetem stosu AS.

Natomiast prawo zqiuqj interpretowane jest graficznie jako:

Rysunek 2

Działanie automatu ze stosem 𝒜𝒮 zależne jest, jak wspomnieliśmy we wstępie wykładu, nie tylko od czytanego przez automat słowa, ale także od symbolu znajdującego się na wierzchu stosu. Poniżej przedstawiamy graficznie te zależności.


Animacja 1

Prawo zqiauqj dla słowa u=z1zm określające działanie automatu 𝒜𝒮 interpretujemy w ten sposób, że automat, będąc w stanie qi po przeczytaniu litery a (ze słowa wejściowego) i symbolu z ze stosu, zmienia stan na qj oraz zastępuje na stosie literę z słowem u w ten sposób, że ostatnia litera tego słowa, symbol zm , jest na wierzchu stosu. Ten właśnie symbol będzie pobrany ze stosu przy kolejnym "ruchu" automatu, zgodnie z zasadą last in, first out. Ilustruje tę zasadę animacja, która jest zamieszczona będzie w dalszej części tego wykładu.

Dla precyzyjnego opisu działania automatu ze stosem wprowadza się pojęcie konfiguracji automatu, poprzedzając to pojęcie określeniem konfiguracji wewnętrznej.

Definicja 1.2

Konfiguracją wewnętrzną automatu ze stosem AS nazywamy dowolną parę (u,q)AS*×Q taką, że q jest stanem, w którym automat znajduje się aktualnie, a u słowem zapisanym na stosie tak, że litera będąca na wierzchu stosu jest ostatnią literą tego słowa.

Konfiguracją automatu ze stosem AS nazywamy trójkę

(u,q,w)AS*×Q×A*

gdzie (u,q) jest konfiguracją wewnętrzną, a w słowem wejściowym.

Wprowadzone pojęcia wykorzystamy do określenia działania automatu ze stosem dla dowolnych słów wejściowych i dowolnych słów znajdujących się na stosie. W tym celu rozszerzymy odpowiednio relację przejść P , określając ją na zbiorze konfiguracji i oznaczając symbolem | . Przyjmujemy dla dowolnych słów u1,u2AS* i litery zAS , dla dowolnego słowa wA* i aA{1} oraz dla dowolnych stanów q1,q2Q , że zachodzi relacja

(u1z,q1,aw)|(u1u2,q2,w)

wtedy i tylko wtedy, gdy zq1au2q2P .

Zwrotne i przechodnie domknięcie tej relacji nazywamy przejściem lub poprawnym obliczeniem automatu AS i oznaczamy symbolem |* .

Dla dowolnego słowa wA* przyjmujemy oznaczenie (u,q)w(u1,q1) , jeśli ma miejsce (u,q,w)|*(u1,q1,1) . Prawdziwa jest wówczas następująca równość:

|w1|w2 :=|w1w2

Mówimy, że konfiguracja wewnętrzna (u,q) automatu ze stosem AS jest osiągalna z konfiguracji wewnętrznej (u1,q1), jeśli istnieje takie słowo wA*, że

(u1,q1)w(u,q).

Zdefiniujemy teraz język rozpoznawany przez automat ze stosem. W literaturze spotkać można kilka równoważnych definicji rozpoznawania. W naszym wykładzie wprowadzimy dwie, używane najczęściej:

  1. rozpoznawanie poprzez stany końcowe (wyróżniony zbiór stanów końcowych QF ),
  2. rozpoznawanie poprzez pusty stos.

Definicja 1.3

Niech 𝒜𝒮=(A,AS,Q,P,s0,z0,QF) będzie automatem ze stosem. Językiem rozpoznawanym przez automat 𝒜𝒮 poprzez stany końcowe nazywamy zbiór

LF(𝒜𝒮)={wA*:(z0,q0)w(u,qF),:uAS*,qFQF}.

Językiem rozpoznawanym przez automat 𝒜𝒮 poprzez pusty stos nazywamy zbiór

Le(𝒜𝒮)={wA*:(z0,q0)w(1,q),qQ}.

Używając drugiego określenia rozpoznawania, w definicji automatu ze stosem pomija się zbiór stanów końcowych QF .

Przykład 1.1

Poniższa animacja ilustruje działanie automatu ze stosem. Przedstawiony grafem automat ze stosem 𝒜𝒮=(A,AS,{q0,qF},P,q0,z0,{qF}), w którym alfabet stosu AS={z0,a,b} rozpoznaje język bezkontekstowy

L(𝒜𝒮)={w{a,b}*:#aw=#bw}.
Animacja 2

Zauważmy, że automat ten rozpoznaje ten sam język zarówno zarówno przez stany końcowe ( QF={qF} ), jak i w sensie rozpoznawania przez pusty stos.

W ogólności dla ustalonego automatu ze stosem 𝒜𝒮 wprowadzone wyżej dwa sposoby rozpoznawania niekoniecznie prowadzą do tego samego języka. Jednak są one równoważne, o czym przekonuje następujące twierdzenie, w dowodzie którego konstruujemy odpowiednie automaty ze stosem.

Twierdzenie 1.1

Język LA* jest rozpoznawany przez automat ze stosem przez stany końcowe wtedy i tylko wtedy, gdy jest rozpoznawany przez automat ze stosem poprzez pusty stos.

Dowód

Załóżmy, że automat 𝒜𝒮=(A,AS,Q,P,s0,z0,QF) rozpoznaje przez stany końcowe język L=LF(𝒜𝒮) . Wówczas automat

𝒜𝒮=(A,AS{x0},Q{q0,qe},P,q0,x0),

w którym symbol x0 jest spoza alfabetu AS , stany q0,qe nie należą do Q , a relacja przejść P określona jest poniżej

P=P : :{x0q0x0z0q0,zqqe, :qQF,zAs{x0},zqeqe, :zAS{x0}},

rozpoznaje język L przez pusty stos.

Na odwrót, jeśli automat ze stosem 𝒜𝒮=(A,AS,Q,P,q0,z0) rozpoznaje poprzez pusty stos język L=Le(𝒜𝒮) , to automat

𝒜𝒮=(A,AS{x0},Q{q0,qF},P,q0,x0,{qF}),

w którym symbol x0 jest spoza alfabetu AS , stany q0,qF nie należą do Q , a relacja przejść P określona jest poniżej

P=P{x0q0x0z0q0,x0qqF,qQ}

rozpoznaje język L poprzez stany końcowe.

Zdefiniujemy i omówimy teraz deterministyczne automaty ze stosem. W odróżnieniu od automatów skończenie stanowych deterministyczne automaty ze stosem posiadają mniejsze możliwości rozpoznawania języków niż automaty, które dopuszczają przejścia niedeterministyczne.

Definicja 1.4

Automat ze stosem 𝒜𝒮=(A,AS,Q,f,s0,z0,QF) nazywamy deterministycznym, jeśli dla każdej konfiguracji (z,q,a)AS×Q×(A{1}) wartość funkcji f(z,q,a) jest zbiorem co najwyżej jednoelementowym, czyli f(z,q,a)1 oraz jeśli f(z,q,1) , to f(z,q,a)= dla każdego aA .

A więc deterministyczny automat ze stosem ma możliwość co najwyżej jednego przejścia z dowolnej konfiguracji (z,q,a)AS×Q×(A{1}) oraz jeśli istnieje przejście dla określonego stanu i symbolu ze stosu pod wpływem słowa pustego, to jest ono jedynym możliwym dla tego układu w tym automacie.

Język rozpoznawany przez deterministyczny automat ze stosem nazywamy językiem deterministycznym.

O tym, że, w przeciwieństwie do klasy języków regularnych, języki rozpoznawane przez deterministyczne automaty ze stosem stanowią właściwą podklasę wszystkich języków akceptowanych przez automaty ze stosem, przekonuje przykład.

Przykład 1.2

Język L={anbn: :n1}{anb2n: :n1} rozpoznawany przez automat ze stosem opisany grafem

Rysunek 3

nie jest językiem deterministycznym. Zauważmy bowiem, że deterministyczny automat ze stosem, aby zaakceptować słowo anbn , dla kontrolowania ilości liter a i b wykorzystuje stos, wprowadzając przy czytaniu każdej litery a ustalony symbol na stos, na przykład a i usuwając sekwencyjnie te symbole przy czytaniu liter b . Dla zaakceptowania słowa anb2n podobne postępowanie prowadzi do wpisywania na stos słowa aa z alfabetu stosu dla każdej litery a i usuwaniu pojedynczego symbolu przy czytaniu b . Jest to jedyny sposób kontroli ilości liter, a opisane działanie automatu jest źródłem jego istotnej niedeterministyczności. Bez trudu można zauważyć, że każdy automat ze stosem rozpoznający język L będzie zawierać ten niedeterministyczny układ w swojej strukturze.

Aby lepiej uchwycić istotę tego niedeterminizmu, zauważmy, że automat ze stosem określony grafem

Rysunek 4

rozpoznaje język L={anbn: :n1} i jest deterministyczny.


Każdy język rozpoznawany przez deterministyczny automat ze stosem jest oczywiście (dlaczego?) jednoznaczny. Jednoznaczność języka nie implikuje jednak jego deterministyczności, o czym przekonuje zamieszczony poniżej przykład.

Przykład 1.3

Język L={anbn: :n1}{anb2n: :n1} , który jest rozpoznawany przez automat ze stosem z poprzedniego przykładu, nie jest, jak wiemy, deterministyczny, ale jest jednoznaczny.

Gramatyki bezkontekstowe i automaty ze stosem

Automaty ze stosem charakteryzują rodzinę języków bezkontekstowych w tym samym sensie, w jakim automaty skończenie stanowe charakteryzują języki regularne.

Twierdzenie 2.1

Rodzina języków rozpoznawanych przez automaty ze stosem jest równa rodzinie języków bezkontekstowych 2 .

Dowód

(szkic)

Dla dowodu, że każdy język bezkontekstowy jest rozpoznawany przez odpowiedni automat ze stosem, rozważmy gramatykę G=(VN,VT,v0,PG) bezkontekstową w postaci normalnej Greibach i załóżmy, że słowo puste 1 nie należy do języka L(G) generowanego przez tę gramatykę. Podamy konstrukcję automatu ze stosem AS , który, jak można wykazać, akceptuje poprzez pusty stos język L(G) . Niech

𝒜𝒮=(VT,VNVT,{q},f,q,v0),

gdzie funkcja f:(VNVT)×{q}×(VT{1})𝒫sk((VNVT)*×{q}) określona jest następująco. Dla dowolnych vVN, :aVT

f(v,q,1)={(xa,q) :: :vaxPG}
f(a,q,a)={(1,q)}

oraz ma wartość równą zbiorowi pustemu we wszystkich pozostałych przypadkach.

Jest to więc automat o jednym stanie q , alfabetem wejściowym jest alfabet terminalny VT , alfabetem stosu jest suma mnogościowa alfabetu symboli nieterminalnych VN i terminalnych VT , a symbol początkowy stosu jest symbolem startowym gramatyki. Istotą działania automatu AS jest symulacja lewostronnego wyprowadzenia w gramatyce G. Pełne uzasadnienie podanej konstrukcji znajduje sie na końcu tego wykładu, w części "dla zainteresowanych".

Załóżmy teraz, że automat 𝒜𝒮=(A,AS,Q,f,q0,z0) akceptuje poprzez pusty stos język L(𝒜𝒮) . Konstrukcja gramatyki bezkontekstowej G , która generuje ten sam język przebiega następująco. Niech G=((Q×AS×Q){v0},A,v0,PG) , gdzie v0QASA . Wprowadzamy do zbioru praw PG wyłącznie następujące prawa:

  1. v0(q0,z0,q) dla wszystkich stanów qQ ,
  2. (q,z,q1)a(qk+1,zk,qk)(qk,zk1,qk1)(q2,z1,q1) dla dowolnych stanów q,q1,,qk+1Q,aA{1},z,z1,zkAS jeśli (z1...zk,qk+1)f(z,q,a) ,
  3. (q,z,q1)aPG jeśli (1,q1)f(z,q,a) .

Mamy więc następującą równoważność:

(1)

(q,z,q1)a(qk+1,zk,qk)(qk,zk1,qk1)(q2,z1,q1)PG(z1zk,qk+1)f(z,q,a),

która w szczególności dla k=0 przyjmuje postać

(q,z,q1)aPG(1,q1)f(z,q,a)

i oznacza dla gramatyki wymazywanie symboli nieterminalnych, a dla automatu wymazywanie symboli stosu.

Skonstruowana gramatyka G odtwarza działanie automatu AS działającego pod wpływem słowa wejściowego w . Pełne uzasadnienie podanej konstrukcji znajduje się na końcu tego wykładu, w części "dla zainteresowanych".

Z konstrukcji przedstawionej w szkicu dowodu twierdzenia wynika, że każdy język bezkontekstowy może być rozpoznawany poprzez pusty stos przez automat ze stosem o jednym stanie. Określenie algorytmów na podstawie powyższego twierdzenia proponujemy jako ćwiczenie.

Powróćmy na moment do języka Łukasiewicza. Język ten oraz jego gramatyka zostały wprowadzone podczas pierwszego wykładu poświęconego językom bezkontekstowym. Każde słowo, generowane przez tę gramatykę, jest pewnym wyrażeniem algebraicznym zapisanym w notacji polskiej, prefiksowej, bez użycia nawiasów. Bez trudności można określić gramatykę bezkontekstową, która generuje język Łukasiewicza, w którym słowa zapisywane są w wersji postfiksowej. Wystarczy bowiem przyjąć: G=(VN,VT,v0,P), gdzie VN={v0}, VT={a,b,+,*} , v0=v oraz P={va,vb,vvv+,vvv*}. Język Łukasiewicza jest więc teraz zbiorem

L(G)={a, :b,ab+,bab+*,ab+ab+*,}.

Oczywiście język ten jest rozpoznawany przez odpowiedni automat ze stosem. Określeniem takiego automatu zajmiemy się podczas ćwiczeń. Warto zauważyć, że rozpoznając słowa języka Łukasiewicza w postfiksowej postaci, automat ze stosem działa dokładnie tak, jak obliczane są wartości wyrażeń arytmetycznych we współczesnych procesorach. Automat ze stosem, czytając wyrażenie od lewej do prawej, zapisuje wyniki częściowe na stosie, a operacje wykonywane są zawsze na ostatnich elementach stosu.

Dla bardziej dociekliwych studentów proponujemy poniżej pełny dowód twierdzenia 2.1 orzekajacego, że języki rozpoznawane przez automaty ze stosem to dokładnie języki bezkontekstowe.

Dla zainteresowanych



Dowod

Dla dowodu, że każdy język bezkontekstowy jest rozpoznawany przez odpowiedni automat ze stosem, rozważmy gramatykę G=(VN,VT,v0,PG) bezkontekstową, w postaci normalnej Greibach i załóżmy, że słowo puste 1 nie należy do języka L(G) generowanego przez tę gramatykę. Konstruujemy teraz automat ze stosem AS , który, jak udowodnimy, akceptuje poprzez pusty stos język L(G) . Niech

𝒜𝒮=(VT,VNVT,{q},f,q,v0)

gdzie funkcja f:(VNVT)×{q}×(VT{1})𝒫sk((VNVT)*×{q}) określona jest następujaco. Dla dowolnych vVN, :aVT

f(v,q,1)={(xa,q) :: :vaxPG}
f(a,q,a)={(1,q)}

oraz równa jest zbiorowi pustemu we wszystkich pozostałych przypadkach.

A zatem jest to automat o jednym stanie q , alfabetem wejściowym jest alfabet terminalny VT , alfabetem stosu jest suma mnogościowa alfabetu symboli nieterminalnych VN i terminalnych VT , a symbol początkowy stosu jest symbolem startowym gramatyki. Działanie automatu AS symuluje lewostronne wyprowadzenie w gramatyce G.

Dla dowolnego słowa wL(G) istnieje lewostronne wyprowadzenie

v0a1v1y1a1a2v2y2...a1...ak1vk1a1...ak=w

gdzie aiVT , viVN oraz yiVN* , gdyż gramatyka jest w postaci Greibach. Odpowiada temu wyprowadzeniu następujące działanie automatu 𝒜𝒮 :

(v0,q)1(y1v1a1,q)a1(y1v1,q)1(y2v2a2,q)a2...
...1(vk1ak1,q)ak1(vk1,q)1(ak,q)ak(1,q).

A to oznacza zaakceptowanie słowa w poprzez pusty stos. Zatem L(G)L(𝒜𝒮) . Dla dowodu inkluzji w przeciwną stronę wykorzystamy implikację

(v0,q)w(x,q)w𝒜𝒮v0L*wxwG

która ma miejsce dla dowolnego wVT* . Implikację tę udowodnimy indukcyjnie ze względu na długość słowa w . Dla słowa pustego 1 oraz dla w=aVT powyższa implikacja wynika bezpośrednio z definicji automatu ze stosem. Załóżmy teraz, że (v0,q)w(x,q) w 𝒜𝒮 i niech w=w1a dla aVT i w1VT* . Mamy więc (v0,q)w1(y,q) i (y,q)a(x,q) w automacie 𝒜𝒮 . Z założenia indukcyjnego wnioskujemy, że v0L*w1y w G . W przypadku, gdy y=a , wnioskujemy z określenia automatu ze stosem, że x=1 i wtedy v0L*w1a=w w G . Jeśli natomiast y=vy dla vVN i yVN* , to w automacie 𝒜𝒮 ma miejsce wyprowadzenie

(v0,q)w1(y,q)=(yv,q)1(yx,q)a(x,q)

gdzie x=az,aVT i zVN* i prawo vxPG . W dalszym ciągu działania automatu następuje krok (yx,q)a(x,q) , a to w konsekwencji oznacza, że w gramatyce G ma miejsce wyprowadzenie

v0L*w1y=w1vyL*w1xyL*w1azy=wx.

Załóżmy teraz, że automat 𝒜𝒮=(A,AS,Q,f,q0,z0) rozpoznaje z pustym stosem język L(𝒜𝒮) . Skonstruujemy gramatykę bezkontekstową G , generującą ten sam język. Niech G=((Q×AS×Q){v0},A,v0,PG) , gdzie v0QASA . Do zbioru praw PG zaliczymy wyłącznie następujące prawa:

  1. v0(q0,z0,q) dla wszystkich stanów qQ ,
  2. (q,z,q1)a(qk+1,zk,qk)(qk,zk1,qk1)(q2,z1,q1) dla dowolnych stanów q,q1,,qk+1Q,aA{1},z,z1,zkAS jeśli (z1...zk,qk+1)f(z,q,a) ,
  3. (q,z,q1)aPG jeśli (1,q1)f(z,q,a) .

Mamy więc następującą równoważność:

(2)

(q,z,q1)a(qk+1,zk,qk)(qk,zk1,qk1)(q2,z1,q1)PG(z1zk,qk+1)f(z,q,a),

która w szczególności dla k=0 przyjmuje postać

(q,z,q1)aPG(1,q1)f(z,q,a)

i oznacza dla gramatyki wymazywanie symboli nieterminalnych, a dla automatu wymazywanie symboli stosu.

Skonstruowana gramatyka G odtwarza działanie automatu AS działającego pod wpływem słowa wejściowego w co udowodnimy poniżej. W tym celu wykażemy indukcyjnie ze względu na długość słowa wA* następującą równoważność:

(q,z,q1)G*w(qk+1,zk,qk)(q2,z1,q1)(z,q)w(z1zk,qk+1).

Dla w=aA równoważność redukuje się do obserwacji (2). Załóżmy teraz, że słowo w=w1a oraz że w gramatyce G mamy wyprowadzenie (q,z,q1)G*w1a(qk+1,zk,qk)(q2,z1,q1) . Z postaci gramatyki G wynika, że to wyprowadzenie można przedstawić nastepująco:

(q,z,q1)G*w1(q,z,qp)(qp,zp1,qp1)(q2,z1,q1)Gw1a(qk+1,zk,qk)(qp+1,zp,qp)(qp,zp1,qp1)(q2,z1,q1).

dla pewnego pk i odpowiednich q,q,q1,,qk+1Q,z,z,z1,zkAS .

Z założenia indukcyjnego wynika, iż pierwszy fragment wyprowadzenia jest w automacie AS zastąpiony równoważnie poprawnym obliczeniem

(z,q)w1(z1zp1z,q),

a drugi

(z1zp1z,q)|a(z1zp1zp...zk,qk+1).

A to oznacza, że w automacie AS mamy poprawne obliczenie

(z,q)w1a(z1,zk,qk+1),

co kończy dowód indukcyjny równoważności. Na jej podstawie, przyjmując q=q0, :z=z0 , otrzymujemy:

(q0,z0,q)G*w(z0,q0)w(1,q).

Uwzględniając, iż dla dowolnego stanu q mamy w gramatyce G prawo v0(q0,z0,q) oraz że automat AS akceptuje słowa przez pusty stos (stan q jest nieistotny), ostatnia równoważność kończy dowód twierdzenia.