Documente Academic
Documente Profesional
Documente Cultură
2.3 Acceptoare............................................................................................................................................... 28
2.3.1
Automate finite ................................................................................................................................ 29
2.3.1.1 Construcia unui automat finit nedeterminist care accept limbajul descris de o expresie regulat
dat
30
2.3.1.2 Conversia unui automat finit nedeterminist (AFN) ntr-un automat finit determinist(AFD)...... 34
2.3.1.3 Construcia unui automat finit determinist care accept limbajul descris de o expresie regulat
dat
37
2.3.1.4 Simularea unui automat finit determinist.................................................................................... 43
2.3.1.5 Simularea unui automat finit nedeterminist ................................................................................ 44
2.3.1.6 Probleme de implementare pentru automatele finite deterministe i nedeterministe.................. 45
2.3.1.7 Minimizarea numrului de stri pentru AFD.............................................................................. 46
Gramatici
O gramatic reprezint cel mai important exemplu de generator de limbaje. Prin definiie o gramatic
este G = (N, T, P, S) unde :
literele mici de la nceputul alfabetului latin (a,b,c,...) reprezint elemente din T (simboli terminali);
literele mici de la sfritul alfabetului latin (u, v, x,...) reprezint elemente din T* (iruri de simboli
terminali);
literele mari de la nceputul alfabetului latin (A, B, C,...) reprezint elemente din N (simboli
neterminali);
literele mari de la sfritul alfabetului latin (U, V, X,...) reprezint elemente din N T (simboli
terminali sau neterminali);
literele alfabetului grecesc (, , ...) reprezint iruri din (N T)* (iruri de simboli terminali i
neterminali).
O form propoziional pentru o gramatic G se definete recursiv n modul urmtor:
(1) S este o form propoziional;
(2) dac este o forma propoziional i exist o producie atunci este o
form propoziional.
O form propoziional care conine numai simboli terminali se numete propoziie generat de G.
Notm cu L(G) mulimea tuturor propoziiilor generate de G altfel spus L(G) este limbajul generat de
gramatica G.
Se observ c o gramatic este o reprezentare finit (toate elementele sale sunt finite) pentru un limbaj
care poate s fie infinit. Conform observaiei fcute la nceputul acestui capitol nu orice limbaj are o
reprezentare finit, cu alte cuvinte nu pentru orice limbaj exist o gramatic care s l reprezinte.
Dou gramatici G i G' sunt echivalente dac i numai dac L(G) = L(G').
Asupra formelor propoziionale se definete o relaie numit relaie de derivare n modul urmtor.
Fie i doua forme propoziionale, dac i numai dac exist w1, w2 i P astfel nct
= w1 w2 i = w1 w2.
Relaia poate s fie extins obinndu-se derivarea n k pai. i anume k dac exist 0, 1,
..., k forme propoziionale astfel nct = 0, i-1 i ,1 i k i k = .
nchiderea tranzitiv a relaiei se noteaz cu + . nchiderea tranzitiv i reflexiv a relaiei se
noteaz cu =*>.
S considerm de exemplu gramatica G = ({A,S}, {0,1}, P, S) unde P = {S 1A1, S 0S0, 1A
11A1, A } (cu s-a notat irul vid de simboli). O derivare posibil este:
S 0S0 00S00 001A100 0011A1100 00111100
Ierarhia Chomsky.
Noam Chomski este lingvist i lucreaz n domeniul limbajelor naturale. Ierarhia care i poarta
numele a rezultat dintr-o ncercare a acestuia de a formaliza limbajele naturale. Gramaticile sunt clasificate
conform complexitii produciilor n urmtoarea ierarhie :
n al doilea caz S nu apare n membrul drept al nici unei producii. Se utilizeaz termenul de
dependen de context deoarece producia A poate s fie interpretat sub forma - dac
simbolul neterminal A apare ntre i atunci poate s fie nlocuit cu .
Corespunztor gramaticilor, despre limbajele generate de acestea se poate spune respectiv c sunt
regulate, independente de context, dependente de context sau de tipul zero. Se poate arata c un limbaj ce
poate s fie generat de o gramatic regulat poate s fie generat i de ctre o gramatic independent de
context. Un limbaj independent de context poate s fie generat i de o gramatic dependent de context iar
un limbaj dependent de context poate s fie generat i de o gramatic de tipul zero. Deoarece cu ct o
gramatic este mai restrictiv ea reprezint un mecanism mai simplu, suntem ntotdeauna interesai de cea
mai restrictiv gramatic care reprezint un limbaj dat.
S considerm cteva exemple:
a) G1 = ({S},{0,1},{S 0S, S 1S, S }, S). Se observ c G1 este o gramatic regulat care
genereaz limbajul {0,1}*
b) G2 = ({S, A},{0,1},{S AS, S , A , A 0, A 1}, S). Se observ c G2 este o
gramatic independent de context iar limbajul generat este tot {0,1}*. Rezult deci c un acelai limbaj
poate s fie definit de mai multe gramatici diferite eventual chiar de tipuri diferite.
c) G3 = ({, T, F},{a, +, *, (, )}, P, ) cu P = { + T, T, T T * F, T F, F (), F
a}. S considerm un exemplu de derivare n aceast gramatic :
+ T T + T F + T a + T a + T * F a + F * F a + a * F a + a * a.
Se observ c gramatica G3 este o gramatic independent de context i este o gramatica care descrie
limbajul expresiilor aritmetice cu paranteze care se pot forma cu operandul a i cu operatorii + i *.
n cele ce urmeaz pentru simplificarea notaiilor dac pentru un neterminal exist mai multe producii
: A w1, A w2, ... A wk le vom reprezenta sub o form mai compact: A w1 | w2 | ... | wk.
De asemenea pentru specificarea unei gramatici nu vom mai preciza n general dect mulimea
produciilor sale, celelalte elemente rezultnd n mod banal din aceasta.
2.1.1.1
Exerciii
n toate exemplele considerate pn acum s-a fcut "ghicirea" gramaticii care genereaz un limbaj dat
sau a limbajului generat de ctre o gramatic dat. Se pune ns problema cum se poate demonstra
corectitudinea rezultatului unei astfel de ghiciri. S considerm de exemplu gramatica:
G = ({S}, {(,)}, {S (S)S | }, S)
Aceast gramatica genereaz toate irurile de paranteze bine nchise (echilibrate). Dorim ns s
demonstrm aceast afirmaie. De fapt aici trebuie s demonstrm egalitatea a dou mulimi: mulimea
reprezentat de limbajul generat de G i mulimea irurilor de paranteze bine formate. Deci demonstraia
presupune demonstrarea dublei incluziuni. Adic trebuie s demonstrm c orice ir derivat din S satisface
condiia enunat i apoi trebuie s demonstrm incluziunea n sens invers. Dndu-se un ir de paranteze
bine nchise trebuie s artm c acest ir poate s fie derivat din S. Pentru prima parte a demonstraiei
vom utiliza inducia asupra numrului de pai n derivare. Considerm c irul vid care se obine ntr-un
pas din S este un ir de paranteze bine nchise. S presupunem c pentru toate derivrile realizate n mai
puin de n pai se obin iruri de paranteze bine nchise i s considerm o derivare de exact n pai. O
astfel de derivare poate s arate ca :
S (S)S * (x)S * (x)y
unde x i y sunt iruri de terminale derivate din S n mai puin de n pai, adic sunt iruri de paranteze
bine nchise. Rezult c irul (x)y este un ir de paranteze bine nchise. Cu alte cuvinte orice ir derivat din
S este "corect".
S considerm acum i includerea n sens invers. De data asta demonstraia se face prin inducie
asupra lungimii irului. Pentru primul pas observm c irul vid este un ir derivabil din S. S presupunem
acum ca orice ir cu mai puin de 2n simboli este derivabil din S. S considerm un ir w de paranteze bine
nchise avnd lungimea de 2n, cu n mai mare sau egal cu 1. Sigur irul ncepe cu o parantez deschis. Fie
(x) cel mai scurt prefix format din paranteze bine nchise. Se observ c w = (x)y, unde x i y sunt iruri
Exerciii
1. Fie gramatica G : S AA, A AAA, a, A bA, Ab, s se arate ca limbajul L(G) este limbajul
tuturor irurilor formate din simboli a avnd un numr par de simboli.
2. Fie gramatica G : S aB | bA, A a | aS | bAA, B b | bS | aBB s se arate ca L(G) este setul
tuturor irurilor din {a,b}+ care au un numr egal de apariii pentru a i pentru b.
2.1.3
Din punctul de vedere al procesului de compilare, gramaticile sunt utilizate pentru faza de analiz
sintactic, pentru care se utilizeaz gramatici independente de context. Exist o serie de metode de analiza
sintactic, bine puse la punct att din punct de vedere teoretic ct i practic. Fiecare dintre aceste metode
impune ns o serie de restricii asupra gramaticilor utilizate. n general atunci cnd se construiete o
gramatic se pleac de la forma general a structurilor pe care aceasta trebuie s le descrie i nu de la
metoda de analiza sintactica ce va fi utilizat. n acest mod se obine o gramatic ce poate s fie "citit"
uor de ctre proiectant. Pentru a satisface ns condiiile impuse de ctre metodele de analiza sintactic
sau de ctre generarea de cod, se realizeaz transformri asupra gramaticilor. Aceste transformri trebuie
s pstreze neschimbat limbajul generat. n cele ce urmeaz vom prezenta cteva transformri tipice
asupra gramaticilor independente de context. Pentru a explica semnificaia acestor transformri n
contextul analizei sintactice vom prezenta nti noiunea de arbore de derivare.
Un arbore de derivare este o reprezentare grafic pentru o secven de derivri (de aplicri ale relaiei
ntre formele propoziionale). ntr-un arbore de derivare nu se mai poate identifica ordinea n care s-a
fcut substituia simbolilor neterminali. Fiecare nod interior arborelui, reprezint un neterminal.
Descendenii unui nod etichetat cu un neterminal A sunt etichetai de la stnga la dreapta prin simbolii
care formeaz partea dreapt a unei producii care are n partea stnga neterminalul A. Parcurgnd de la
stnga la dreapta frunzele unui astfel de arbore se obine o form propoziional. S considerm de
exemplu din nou gramatica irurilor de paranteze bine formate:
G = ({S}, {(,)}, {S (S)S | }, S)
Fie urmtoarea secven de derivri:
S ( S ) S ( ( S ) S ) S ( () S ) S
( () ( S ) S ) S ( () () S ) S
( () () ) S ( () () ) ( S ) S + ( ()() ) ()
//\ \
// \ \
( S
) S
|
|
\
S
|
Arborele de derivare este construit de ctre analizorul sintactic. Aceasta construcie se poate face
pornind de la rdcin aplicnd succesiv producii - n acest caz se spune c analiza sintactic este topdown (descendent). Dar, se poate porni i invers de la irul de atomi lexicali (frunze) identificndu-se
simbolii neterminali din care se poate obine un ir de atomi lexicali. n acest caz se spune c analiza
sintactic este de tip bottom-up (ascendent).
Deoarece arborele de derivare descrie relaia ierarhica ntre entitile sintactice (neterminale) i atomii
lexicali (terminale) se poate asocia o interpretare n termeni de evaluare a entitilor sintactice. Astfel,
considernd de exemplu gramatica expresiilor aritmetice pentru irul a + a * a se obine arborele derivare :
/|\
/ | \
+
T
|
/|\
T
/ | \
|
T
*
F
F
|
|
|
F
a
a
|
a
n care se poate observa c a fost evideniat faptul c operaia de nmulire este prioritar fa de
operaia de adunare (aspect semantic).
2.1.3.1
Eliminarea ambiguitii
O gramatic care produce mai muli arbori de derivare pentru aceeai propoziie este o gramatic
ambigu. Deoarece exist tehnici de analiz sintactic care lucreaz numai cu gramatici neambigue vom
ncerca s construim gramatici care genereaz acelai limbaj i care sunt neambigue. S considerm de
exemplu urmtoarea gramatic :
instr if expresie then instr |
if expresie then instr else instr |
alte_instr
n toate limbajele de programare care accept construcii de tip if then else se consider cu sens prima
derivare n care fiecare clauza else este atribuit instruciunii if cea mai interioar. Rezult deci condiia pe
care trebuie s o satisfac o instruciune if. Instruciunea cuprins ntre then i else trebuie s nu fie o
instruciune if sau s fie o instruciune if cu clauza else. Rezult urmtoarea gramatic obinut prin
transformarea gramaticii anterioare:
instr if_cu_else| if_fara_else
if_cu_else if expresie then if_cu_else else if_cu_else |
alte_instr
if_fara_else if expresie then instr |
if expresie then if_cu_else else if_fara_else
Se observ c aceast gramatic genereaz acelai limbaj cu gramatica anterioar dar accept o
derivare unic pentru propoziia :
Se numete producie ambigu o producie care are n partea dreapt mai multe apariii ale aceluiai
simbol neterminal. Existena unei producii ambigue nu implic faptul c gramatica este ambigu. S
considerm gramatica G = ({S, A}, {a, b, c }, {S aAbAc, A a | b}). Se observ c aceast gramatic
nu este ambigu, gramatica genernd limbajul {aabac, aabbc, abac, abbc}
S considerm de exemplu i gramatica pentru expresii aritmetice:
G = ({}, {a, +, *}, { + | * | a}, )
Gramatica G este o gramatic ambigu (se poate verifica uor utiliznd de exemplu irul a + a * a). n
gramatica G nu au fost evideniate relaiile de preceden dintre operatori. Aceasta gramatica poate s fie
transformata ntr-o gramatica neambigu n care operaia de nmulire este mai prioritar dect cea de
adunare n doua moduri:
1. + T | T
T T * F | F
F a
2. T + | T
T F * T | F
F a
Fie irul a * a * a. Pentru cele doua gramatici se obin arborii de derivare respectivi:
|
T
/|\
/ | \
T * F
/|\
|
/ | \
a
T * F
|
|
F
a
|
a
|
T
/|\
/ | \
F * T
|
/|\
a
/ | \
F * T
|
|
a
F
|
a
A B A
| 1 | 2 | ... | n
, BN, 1, ... n T*
A' B A
| A'
A' 1 | 2 | ... | n
Trebuie s remarcam ns faptul c exist limbaje pentru care nu se pot construi gramatici neambigue.
Un astfel de limbaj se numete inerent ambiguu. De exemplu limbajul :
L = { aibjckdl | i = k sau j = l, i, j, k, l 0}
este inerent ambiguu. O gramatic care descrie acest limbaj va trebui probabil s considere c L este
de fapt reuniunea a dou limbaje:
L = { anbjcndl | n, j, l 0} i L = { aibnckdn | i, n, j, k 0}
Un ir de forma apbpcpdp va face parte din ambele limbaje i deci probabil c va avea doi arbori de
derivare. Exemplul anterior nu constituie ns o demonstraie, o demonstraie adevrat depete ca
dificultate cadrul textului curent.
Eliminarea - produciilor
Se spune ca o gramatic este - free dac satisface una dintre urmtoarele condiii:
a. Nu exist nici o producie care s aib n partea dreapta irul vid
b. Exist o singura producie care are n partea dreapta irul vid i anume o producie de forma S
. Simbolul S nu apare n acest caz n partea dreapt a nici unei producii.
Algoritmul de transformare pleac de la gramatica G = (N, T, P, S) i construiete gramatica G' = (N',
T, P', S') care satisface condiiile :
(i) L(G) = L(G')
(i) G' este - free.
Descrierea algoritmului este :
i=0
Ni = {A | A P}
repeta
i=i+1
Ni = { A | A P, a N*i-1} Ni-1
pn Ni = Ni-1
Ne = Ni
dac S Ne
N' = N {S'}
P' = {S' , S' S}
altfel
N' = N
S' = S
P' =
O gramatic este recursiv stnga dac exist un neterminal A astfel nct exist o derivare A + A
pentru (T N)*. O analiz sintactic descendent determinist nu poate s opereze cu o astfel de
gramatic, deci este necesar o transformare. S considerm nti cazul cel mai simplu pentru care n
gramatic exist producii de forma A A | . n acest caz limbajul generat este de forma n cu n 0.
Acelai limbaj poate s fie generat de ctre gramatica: A A', A' A'| .
S considerm pasul i. Produciile Ak Al care au mai rmas (pentru care k < i), au l > k. n aceasta
iteraie prin variaia lui j se ajunge ca pentru orice producie de forma Ai Am , m i. Dac se elimin
recursivitatea direct rmne m > i. S considerm de exemplu din nou gramatica :
A1 A2a | b, A2 A2c | A1d | e
Considerm pentru neterminale ordinea : A1, A2. Pentru A1 (i = 1) nu exist recursivitate stnga
direct deci nu se face nici o modificare. Pentru i = 2, producia A2 A1d se inlocuiete cu A2
A2ad | bd. Rezult deci c A2 A2c | A2ad | bd | e.
Eliminnd recursivitatea stnga se obine :
A1 A2a | b, A2 bdA2' | eA2', A2' cA2' | adA2' |
2.1.3.4
Factorizare stnga
Acest tip de transformare este util pentru producerea unei gramatici potrivite pentru analiza sintactic
descendent de tip determinist. Ideea este c dac nu este clar care dintre produciile alternative poate s
fie aplicat pentru un neterminal se va amna luarea unei decizii pn cnd s-a parcurs suficient din irul
de intrare pentru a se putea lua o decizie. S considerm de exemplu produciile :
SAbS|A
ABcA|B
B a | dSd
S presupunem c ncercm s construim irul derivrilor pentru a b a c a pornind de la simbolul de
start al gramaticii. Din recunoaterea simbolului a la nceputul irului nu se poate nc trage concluzia care
dintre cele doua producii corespunztoare neterminalului S trebuie s fie luata n considerare (abia la
ntlnirea caracterului b pe irul de intrare se poate face o alegere corect). n general pentru producia A
1 | 2 dac se recunoate la intrare un ir nevid derivat din nu se poate tii dac trebuie aleas
prima sau a doua producie. Corespunztor este util transformarea: A A', A' 1 | 2.
Algoritmul de factorizare funcioneaz n modul urmtor. Pentru fiecare neterminal A se caut cel mai
lung prefix comun pentru dou sau mai multe dintre produciile corespunztoare neterminalului A. Dac
atunci se nlocuiesc produciile de forma A 1 | 2 | ... | n | (unde reprezint alternativele
care nu ncep cu ) cu :
A A' |
A' 1 | 2 | ... | n
A' este un nou neterminal. Se aplic n mod repetat aceast transformare pn cnd nu mai exist dou
alternative producii cu un prefix comun pentru acelai simbol neterminal.
Relund exemplul considerat se obine :
S AX
X bS |
A BY
Y cA |
B a | dSd
Deci n analiza irului a b a la ntlnirea simbolului b pentru neterminalul Y se va utiliza producia Y
, n acest mod rezult irul de derivri :
S AX BYX aYX ...
2.1.3.5
Prin inducie asupra numrului de pai se poate demonstra corectitudinea algoritmului. S considerm
ca exemplu o gramatic avnd produciile : P = {S A, A a, B b, B a}, se observ c B este un
simbol neterminal inaccesibil. Aparent condiia de inaccesibilitate pentru un neterminal const din ne
apariia n partea dreapt a unei producii. Dac ns considerm o gramatic avnd produciile: {S A,
A a, B cC, C bB} se observ c este necesar o alt condiie.
Pornind de la o gramatic G = (N, T, P, S) se poate construi o gramatic fr simboli inaccesibili G' =
(N', T, P', S) care s satisfac condiiile:
(i) L(G) = L(G')
N0 = {S}
i=0
repeta
i = i + 1;
Ni = {A | A apare n partea dreapta a unei producii
pentru un neterminal din Ni-1} Ni-1
pn Ni = Ni-1
N' = Ni
P' conine numai producii care corespund neterminalelor din
N' si care conin n partea dreapta simboli neterminali numai din N'
Prin inducie asupra numrului de pai se poate determina corectitudinea algoritmului. Utiliznd
algoritmii pentru eliminarea simbolilor nefinalizai i cel pentru eliminarea simbolilor inaccesibili se
obine o gramatic care nu conine simboli neutilizai. Ordinea n care se aplic aceti algoritmi nu este
indiferent. S considerm de exemplu gramatica cu produciile:
S a | A, A AB, B b.
Dac se aplic nti algoritmul pentru eliminarea simbolilor nefinalizai, rmn produciile S
a i B b. Prin eliminarea simbolilor inaccesibili rmne numai producia S a. Dac ns se
aplic nti algoritmul pentru eliminarea simbolilor inaccesibili i apoi cel pentru eliminarea simbolilor
nefinalizai vor rmne pn la sfrit produciile S a i B b, adic nu se obine o gramatic fr
simboli neutilizai. Rezultatul obinut nu este ntmpltor n sensul c nu se poate gsii un exemplu pentru
care ordinea corect de aplicare a celor doi algoritmi s fie invers. Ideea este c prin eliminarea unui
simbol neterminal neaccesibil nu pot s apar simboli neterminali nefinalizai, n timp ce prin eliminarea
unui simbol neterminal nefinalizat pot s apar simboli neterminali inaccesibili deoarece anumii simboli
neterminali puteau s fie accesibili numai prin intermediul simbolului neterminal respectiv.
2.1.3.6
Anumite metode de analiz sintactic impun ca partea dreapt a fiecrei producii care nu este irul
vid s nceap cu un terminal. S considerm de exemplu gramatica avnd produciile:
lista a(numr) lista | *elem lista | a
elem a(numr) | *elem
n acest caz dac pe irul de intrare se gsete terminalul a nu este clar care dintre produciile pentru
neterminalul lista trebuie s fie utilizat.
Dac factorizm produciile neterminalului lista:
lista aX | *elem lista
X
(numr) lista |
elem a(numr) | *elem
Pe baza transformrilor anterioare se poate elabora un algoritm pentru construirea unei gramatici n
forma normal Greibach pentru o gramatic independent de context care nu este recursiv stnga.
Se definete nti o relaie de ordine asupra neterminalelor unei gramatici. i anume A < B dac exist
o producie A B . Considernd aceast relaie se observ c se poate construi o relaie parial de
ordine care poate s fie extinsa la o relaie liniar de ordine. Dac gramatica pentru care se construiete
aceast relaie nu este recursiv dreapta atunci produciile celui "mai mare" neterminal ncep sigur cu
simboli terminali. Rezult algoritmul:
Se construiete relaia de ordine asupra N astfel nct
N=
{A1, A2, ..., An} si A1 < A2 < ... < An.
pentru i = n - 1 pn la 1 pas = -1 executa
fiecare producie de forma Ai Aj cu i < j se nlocuiete cu Ai 1 | ... |
m unde Aj 1 | ...| m (se observa ca 1, ..., m ncep cu terminale)
Prin inducie asupra numrului de pai se poate demonstra c algoritmul realizeaz transformarea
dorit. De exemplu pentru gramatica expresiilor aritmetice n forma fr --producii:
'
T
T'
F
T '
+TE'
FT'
*FT'
()
|
|
|
|
|
T,
+T,
F,
*F
a
Relaia de ordine liniar poate s fie ' < < T' < T < F. Se pornete de la F, pentru care toate
produciile ncep cu un terminal. Rezult modificarea produciilor pentru T:
T () T' | a T' | () | a.
'
T
T'
F
A
2.1.4
Anumite construcii specifice limbajelor de programare nu pot s fie descrise prin limbaje
independente de context. S considerm cteva exemple :
1. Fie limbajul L1 = {wcw| w {0,1}*}. Acest limbaj realizeaz abstractizarea condiiei ca un
identificator s fie declarat nainte de a fi utilizat. L1 nu poate s fie generat de o gramatic
independent de context. Din acest motiv condiia ca un identificator s fie definit nainte de a fi
utilizat nu pot s fie verificat prin analiz sintactic, deci va fi verificat de ctre analiza
semantic.
2. Fie limbajul L2 = {anbmcndm | n > 1, m > 1}. Acest limbaj realizeaz abstractizarea corespondenei
ca numr ntre numrul de parametrii cu care au fost declarate procedurile i numrul de
parametrii cu care se utilizeaz acestea. Nici acest limbaj nu pot fi descris de o gramatic
independent de context. Pe de alt parte limbajul L2' = {anbn | n > 1}, poate s fie descris de
gramatica : S a S b | a b. Deci i aici dup o prim recunoatere fcut n analiza sintactic,
partea de dependen de context va fi rezolvat de ctre faza de analiz semantic.
Observaie
n general interpretnd gramaticile ca algoritmi de generare de iruri crora le corespund ca
echivaleni algoritmi de recunoatere de iruri, se constat c pentru cazul limbajelor regulate este necesar
ca pentru recunoatere s se fac o numrare pn la o valoare finit (care poate ns s fie orict de mare).
Astfel c limbajul LR = {anbn | 0 n 20000000000000} este un limbaj regulat. Numrul de a-uri
ntlnite poate s fie memorat n neterminalele. De altfel, LR este un limbaj finit i deci automat este
regulat (produciile gramatici pot s reprezinte de fapt lista irurilor care formeaz limbajul). Limbajul
Exerciii
1. Fie gramatica:
A BC | a. B CA | Ab, C AB | cC | b
S se construiasc gramatica echivalenta nerecursiva stnga
2. S se elimine simbolii neutilizai pentru gramatica:
S A | B, A aB | bS | b, B AB | BA, C AS|b
3. S se construiasc gramatica echivalenta fr -producii pentru gramatica:
S ABC, A BB | , B CC | , C AA | b
4. S se construiasc un algoritm care verific dac pentru o gramatic dat G, L(G) este mulimea
vid. S se demonstreze c algoritmul este corect
2.1.5
Limbajele formale sunt mulimi - putem s aplicm asupra lor operaii caracteristice mulimilor :
reuniune, intersecie, diferen dar i operaii specifice cum este de exemplu concatenarea. Dac L1 i L2
sunt dou limbaje, concatenarea lor este un limbaj L = L1L2 astfel nct:
L = { w | w = xy, x L1, y L2}
O alt operaie specific ce se poate aplica asupra unui limbaj formal L este "Kleen star". Notaia
utilizat pentru rezultat este L* i reprezint mulimea irurilor obinute prin concatenarea a zero sau mai
multe iruri din L (concatenarea a zero iruri este irul vid, concatenarea unui singur ir este el nsui etc.).
Se va utiliza i notaia L+ pentru LL*.
Dac aplicnd o operaie asupra oricror doua limbaje independente de context obinem un limbaj
independent de context vom spune c mulimea limbajelor independente de context este nchis sub
operaia respectiv. Se poate demonstra c mulimea limbajelor independente de context este nchis sub
operaiile: reuniune, concatenare i Kleen star.
S demonstrm de exemplu nchiderea sub operaia de reuniune. Fie doua gramatici G1 = (N1, T1, P1,
S1), G2 = (N2, T2, P2, S2). Putem ntotdeauna s presupunem c N1 N2 = eventual prin redenumirea
simbolilor neterminali din una dintre gramatici). Gramatica corespunztoare limbajului reuniune a
limbajelor generate de ctre cele doua gramatici se poate construi n modul urmtor:
G = (N, T, P, S), N = N1 N2 {S}, T = T1 T2, P = P1 P2 {S S1 | S2}
Pentru a demonstra c limbajul L(G) = L(G1) L(G2) trebuie s demonstrm includerea mulimilor
n ambele sensuri. Dac w L(G) nseamn c a fost obinut printr-o derivare ca S S1 * w sau S
S2 * w. Deci un ir derivat din S aparine limbajului L(G1) L(G2). Invers dac alegem un ir w
L(G1) L(G2) el este obinut dintr-o derivare din S1 sau din S2, deci se poate construi o derivare pentru
acest ir i n G. Construcii similare se pot face i pentru operaia de concatenare i pentru operaia Kleen
star. De exemplu L(G1)* pentru o gramatica G1 = (N1, T1, P1, S1) poate s fie generat de ctre:
G = (N1, T1, P1 {S1 | S1 S1}, S1)
Clasa limbajelor independente de context nu este nchis la operaiile de intersecie i complementare.
S considerm de exemplu limbajele L1 = {anbncm | n,m 0}, L2 = {ambncn | n,m 0}.
Limbajul L = L1 L2 este "cunoscut" ca fiind un limbaj dependent de context. S presupunem acum
c pentru un limbaj independent de context generat de ctre gramatica G = (N, T, P, S), limbajul
complementar, adic T* - L(G) este ntotdeauna independent de context. n acest caz, fie L un limbaj
obinut prin intersecia a dou limbaje independente de context: L1 i L2. Se poate scrie:
L = L1 L2 = T* - ((T* - L1) (T* - L2)).
Dac mulimea limbajelor independente de context este nchis la operaia de complementare atunci
(T* - L1) i (T* - L2) sunt limbaje independente de context i la fel este i reuniunea lor i la fel va fi i
complementarea limbajului obinut prin reuniune. Adic ar rezulta c L1 L2 este un limbaj independent
de context ceea ce deja tim c nu este adevrat.
Dup cum s-a constatat acelai limbaj poate s fie descris de mai multe gramatici, eventual de tipuri
diferite. Este util gsirea unui criteriu prin care s se indice tipul restrictiv al gramaticilor care pot s
descrie un limbaj dat, ntr-o manier mai precis dect observaia de la pagina 24. De exemplu s
considerm limbajul:
{ an * n | n > 1 }
Se pune problema dac exist o gramatica independent de context care s-l genereze. Urmtorul
rezultat ne d un criteriu cu ajutorul cruia putem s demonstrm c o gramatic nu este independent de
context.
Lema de pompare Fie L un limbaj independent de context. Atunci, exist o constanta k care este
caracteristic limbajului astfel nct dac z L i |z| k, atunci z poate s fie scris sub forma z = uvwxy
cu vx , |vwx| k , |w| 1 i pentru orice i, uviwxiy L.
S utilizm rezultatul anterior pentru a studia limbajul:
L = { an * n | n > 1 }
s presupunem c L este independent de context. nseamn c exist un numr k (asociat limbajului)
astfel nct dac n * n k atunci an x n = uvwxy astfel nct v i x nu sunt amndou iruri vide i |vwx| k.
S presupunem ca n este chiar k ( k * k > k). Rezult ca uv2wx2yL. Deoarece |vwx| k rezult 1 |vx| <
k deci lungimea irului iniial k x k < |uv2wx2y| < k x k + k. Dup k x k urmtorul ptrat perfect este (k +
1) x (k + 1) care este mai mare deci k x k + k, adic |uv2wx2y| nu poate s fie un ptrat perfect, deci L nu
poate s fie generat de o gramatic independent de context.
2.1.5.1
Exerciii
Fie T un alfabet finit. Se numete mulime regulat asupra alfabetului T mulimea construit recursiv
n modul urmtor:
1.
2.
3.
4.
Se observ deci c o submulime a mulimii T* este o mulime regulat asupra alfabetului T dac i
numai dac este mulimea vida, este o mulime care conine un singur simbol din T sau poate s fie
obinut din aceste dou tipuri de mulimi utiliznd operaiile de reuniune (P Q), concatenare (PQ) sau
nchidere P*.
Descrierea mulimilor regulate se poate face cu ajutorul expresiilor regulate. O expresie regulat este
la rndul ei definit recursiv n modul urmtor (prin analogie cu definiia mulimilor regulate) :
Acceptoare
Un acceptor este un dispozitiv format dintr-o band de intrare, o unitate de control i o memorie
auxiliar.
+--------------|a0|a1|...|an|
+--------------\ cap de citire
\
+---------+
| unitate |
| de
|
| control |
+---------+
|
+-----------+
| memorie |
| auxiliara |
+-----------+
Banda de intrare este formata din elemente n care se nscriu simbolii din irul de intrare. La un
moment dat capul de citire este fixat pe un simbol. Funcionarea dispozitivului este dat de aciunile
acestuia. ntr-o aciune capul de citire se poate deplasa la stnga sau la dreapta sau poate s rmn
nemicat. n cadrul unei aciuni unitatea de control are acces la informaia din memoria auxiliar pe care o
poate modifica. Se observ ca acest model este foarte general. Utiliznd diferite restricii asupra benzii de
intrare, organizrii i accesului la memoria auxiliar se obin diferite cazuri particulare de acceptoare.
O aciune a acceptorului este formata din :
deplasarea capului de citire la stnga sau la dreapta sau meninerea capului de citire pe aceeai poziie
i / sau;
memorarea unei informaii n memoria auxiliar i / sau;
modificarea strii unitii de control.
Comportarea unui acceptor poate s fie descris n funcie de configuraiile acestuia. O configuraie
este format din urmtoarele informaii :
coninutul memoriei.
Rezult c o aciune a acceptorului poate s fie precizat prin configuraia iniial (nainte de aciune)
i cea final (dup execuia aciunii).
Dac pentru o configuraie dat sunt posibile mai multe aciuni atunci spunem c acceptorul este
nedeterminist altfel este determinist.
Un acceptor are o configuraie iniial n care unitatea de control este ntr-o stare iniial, capul de
citire este fixat pe simbolul cel mai din stnga al irului de intrare iar memoria are un coninut iniial
specific. Acceptorul are o configuraie final pentru care capul de citire este situat pe simbolul cel mai din
dreapta de pe banda de intrare. Se spune c dispozitivul a acceptat un ir de intrare w dac pornind din
configuraia iniial ajunge n configuraia finala. Eventual, noiunea de acceptare poate s fie condiionata
i de ajungerea ntr-o anumit stare a unitii de control sau de un anumit coninut al memoriei auxiliare.
Evident dac acceptorul este nedeterminist dintr-o configuraie iniial pot avea loc mai multe evoluii.
Dac exist ntre acestea una pentru care se ajunge la o configuraie final atunci se spune c dispozitivul a
acceptat irul de intrare.
Limbajul acceptat de ctre un acceptor este format din mulimea irurilor acceptate de ctre acesta.
Pentru fiecare tip de gramatica din ierarhia Chomsky exist o clasa de acceptoare care definesc
aceeai clas de limbaje. Dintre acestea cele utilizate pentru implementarea compilatoarelor sunt
automatele finite care sunt acceptoare pentru limbaje regulate i automatele cu stiv (push-down), care
sunt acceptoare pentru limbajele independente de context. Automatele finite sunt acceptoare fr memorie
auxiliar iar automatele cu stiv sunt acceptoare pentru care accesul la memoria auxiliar se face conform
unui mecanism de tip stiv.
2.3.1
Automate finite
Dac pentru q Q, a T m(q,a) este definit, atunci m(q,a) se numete tranziie, dac a = atunci
m(q,a) se numete -tranziie. Se observ ca pentru o combinaie stare(q Q), intrare(a T) pot s
corespund mai multe stri urmtoare, deci aa cum a fost definit, automatul este nedeterminist (AFN).
Pentru reprezentarea unui automat finit se pot utiliza dou moduri de reprezentare, printr-o tabela de
tranziie sau printr-un graf. S considerm de exemplu automatul care accepta limbajul definit de expresia
(a | b)* abb. Poate s fie descris sub forma urmtoarei tabele :
simbol de intrare
stare
0
1
2
3
a
{0, 1}
-
b
{0}
{2}
{3}
+
Se observ c n fiecare intrare este specificat mulimea strilor urmtoare n care se trece pentru
starea i simbolul corespunztor intrrii respective. Acelai automat finit poate s fie descris de urmtorul
graf de tranziie :
a
--\/
+---+ +---+ +---+ +---+
start
| | a | | b | | b |+-+|
-------->| 0 |-->| 1 |-->| 2 |-->||3||
| | | | | | |+-+|
+---+ +---+ +---+ +---+
/\
--b
Se observ c pentru fiecare stare exist cte un nod, ntre dou noduri exist un arc etichetat cu un
simbol de intrare dac i numai dac se poate trece din starea reprezentat de primul nod n starea
reprezentat de al doilea nod la aplicarea la intrare a simbolului cu care este etichetat arcul. De remarcat
modul n care a fost specificat starea final.
Se spune c un automat finit accept un ir de intrare dac exist o cale n graful de tranziie ntre
nodul care reprezint starea de start i un nod care reprezint o stare final, astfel nct irul simbolilor
care eticheteaz arcele care formeaz aceast cale este irul de intrare. De exemplu irul aabb este acceptat
de automatul descris anterior, care va executa urmtoarele micri:
a a b b
0 0 1 2 3
Se observa c pentru acelai ir de intrare exist i alte secvene de intrri care ns nu duc ntr-o stare
de acceptare:
a
a
b
b
00000
Un caz particular al automatelor finite este dat de automatele finite deterministe (AFD). n cazul
automatelor finite deterministe definiia funciei strii urmtoare se modific:
m : S x T S.
Se observ c sunt satisfcute urmtoarele restricii:
1. nu exist -tranziii;
2. pentru (q, a) Q x T este definit cel mult o tranziie.
Se observ ca n acest caz, pentru un ir de intrare dat, n graful de tranziie exist cel mult o cale care
pornete din starea de start i duce ntr-o stare de acceptare.
2.3.1.1
Construcia unui automat finit nedeterminist care accept limbajul descris de o expresie regulat dat
Algoritmul pe care l vom prezenta utilizeaz direct structurile din definiia expresiilor regulate. Se
pleac de la o expresie regulat r asupra unui alfabet T i se obine un automat finit nedeterminist (N) care
accept limbajul L(r).
Pentru construirea automatului se identific n structura expresiei r structurile care n mod recursiv
compun expresia i se construiesc automatele finite nedeterministe (AFN) elementare corespunztoare.
3. Fie dou expresii regulate r,t pentru care s-au construit automatele finite nedeterministe
corespunztoare N(r) i N(t).
a. pentru expresia regulat r|t limbajul corespunztor este acceptat de :
Se observ ca n acest caz starea final a automatului corespunztor expresiei r coincide cu starea
iniial a automatului corespunztor expresiei t.
c. pentru expresia regulata r* limbajul corespunztor este acceptat de :
+-<------------+
|
|
-----|--------------|----+---+
| +---+
+---+ |
+-----+
| |
| | | N(r)
| | | |+---+|
---->| i |----------> | |--- ---> | |-------->|| f ||
| |
| | |
| | |
|+---+|
+---+
| +---+
+---+ |
+-----+
|
|
|
/\
|
-------------------------|
|
|
+---------------------------------------------+
d. pentru expresia (r) limbajul corespunztor este acceptat de automatul care accepta N(r).
pentru a | b :
+---+
+-----+
| | a |+---+|
----------> | |------>|| ||---/
| |
|+---+|
\
/
+---+
+-----+
\
+---+ /
\ +-----+
| |/
\|+---+|
->| i |
|| f ||
| |\
/|+---+|
+---+ \
/ +-----+
\
+---+
+-----+
/
\
| | b |+---+|
/
---------->| |------>|| ||---/
| |
|+---+|
+---+
+-----+
n final se obine :
---------------+
/
|
/
+-+ +-+
|
/
| |a | |
|
/
/ >|2|->|3|\ |
/
/
|| || \|
+-+ +-+ /
+-+ +-+ +-+ +-+ +-+ +-+ +--+
| | | |/
| | | |a | |b | |b |--|
> |0|->|1|
|6|->|7|->|8|->|9|->|10|
| | | |\
/| | | | | | | | |--|
+-+ +-+ \
+-+ +-+ / +-+ +-+ +-+ +-+ +--+
\
\ | |b | | /
/\
\
\ > |4|->|5|/
/
\
|| ||
/
\
+-+ +-+
/
\
/
--------------------
2.3.1.2
Conversia unui automat finit nedeterminist (AFN) ntr-un automat finit determinist(AFD)
Din exemplele anterioare s-a observat c un acelai limbaj reprezentat de expresia regulat (a | b)*
abb poate s fie recunoscut de dou automate diferite - unul nedeterminist i unul determinist.
Propoziie Pentru orice automat finit nedeterminist exist un automat finit determinist care accept
acelai limbaj.
Avnd n vedere aceast echivalen ntre cele dou automate se pune problema, cum se poate
construi un automat determinist echivalent unui automat nedeterminist dat. n cele ce urmeaz vom
considera c automatul finit nedeterminist a fost construit pornind de la o expresie regulat pe baza
construciei prezentate n capitolul anterior. Algoritmul care construiete automatul determinist utilizeaz
o metod de construire a submulimilor unei mulimi date. Diferena ntre automatele deterministe i cele
nedeterministe este dat de cardinalitatea funciei m. Automatul determinist se va construi calculnd n
mod recursiv strile acestuia, simulnd n paralel toate evoluiile posibile pe care le poate parcurge
automatul nedeterminist. Starea iniial a automatului finit determinist va corespunde mulimii strilor din
automatul nedeterminist n care se poate ajunge pornind din starea iniiala s0 i utiliznd numai -tranziii.
Orice stare s' a automatului determinist corespunde unei submulimi Q' Q a automatului nedeterminist.
Pentru aceasta stare i un simbol de intrare a T,
m(s',a) = {s Q | ( q Q')(s = m(q,a))}.
Rezult deci c n funcionarea AFD care simuleaz de fapt funcionarea AFN se urmresc simultan
toate "cile" pe care poate evolua automatul finit nedeterminist. Algoritmul care construiete automatul
finit determinist echivalent cu un automat nedeterminist dat utilizeaz dou funcii : -nchidere i mutare.
Funcia -nchidere : P(Q) P(Q) determin pentru fiecare mulime Q' Q setul strilor n care se poate
ajunge datorit -tranziiilor. Considernd o stare q a automatului finit determinist (AFD), aceasta
reprezint de fapt o submulime Q' Q a automatului nedeterminist. Notm cu
-nchidere(Q) = -nchidere({s})
sQ
-nchidere(Q') = A
Funcia mutare : P(Q) x T P(Q) este utilizat pentru construcia strii urmtoare a automatului
determinist. Astfel pentru o stare q a automatului determinist, cruia i corespunde o mulime Q' Q, i o
intrare a T,
mutare(Q,a) = m(s,a)
sQ'
Construcia automatului determinist se face prin construcia unei tabele de tranziii tranz_AFD[] i a
unei mulimi de stri stari_AFD.
stari_AFD = {-inchidere({s0})}
A=
ct timp stari_AFD \ A execut
fie t stari_AFD \ A
A = A {t}
pentru fiecare a T execut
B = -inchidere(mutare(t,a))
stari_AFD = stari_AFD {B}
tranz_AFD[t,a] = B
---------------+
/
|
/
+-+ +-+
|
/
| |a | |
|
/
/ >|2|->|3|\ |
/
/
|| || \|
+-+ +-+ /
+-+ +-+ +-+ +-+ +-+ +-+ +--+
| | | |/
| | | |a | |b | |b |--|
> |0|->|1|
|6|->|7|->|8|->|9|->|10|
| | | |\
/| | | | | | | | |--|
+-+ +-+ \
+-+ +-+ / +-+ +-+ +-+ +-+ +--+
\
\ | |b | | /
/\
\
> |4|->|5|/
/
\
|| ||
/
\
+-+ +-+
/
\
/
--------------------
Se observ c
-inchidere(0) = {0, 1, 2, 4, 7}, -inchidere(mutare({0,1,2,4,7}),a)) = -inchidere({3,8}) =
{1,2,3,4,6,7,8}. Dac q1 = {0,1,2,4,7}, q2 = {1,2,3,4,6,7,8} atunci tran_AFD(q1,a) = q2. Continund se
obine urmtoarea tabel de tranziie :
stare | intrare | multime corespunzatoare AFN
|a |b |
-----------+----+----+-------------------------------------q1 | q2 | q3 | {0,1,2,4,7} -inchidere({0})
-----------+----+----+-------------------------------------q2 | q2 | q4 | {1,2,3,4,6,7,8} -inchidere({3,8})
-----------+----+----+-------------------------------------q3 | q2 | q3 | {1,2,4,5,6,7} -inchidere({5})
-----------+----+----+-------------------------------------q4 | q2 | q5 | {1,2,4,5,6,7,9} -inchidere({5,9})
-----------+----+----+-------------------------------------q5 | q2 | q3 | {1,2,4,5,6,7,10} -inchidere({5,10})
------------------------------------------------------------
Se observ c s-a obinut un automat cu 5 stri fa de 4 stri ct avea automatul finit determinist cu
care s-au exemplificat automatele finite deterministe. Deci algoritmul utilizat nu produce neaprat o
soluie optim.
2.3.1.3
Construcia unui automat finit determinist care accept limbajul descris de o expresie regulat dat
O expresie regulat poate s fie reprezentat sub forma unui arbore (sintactic). De exemplu pentru
expresia regulata (a|b)*abb rezult arborele:
.
/\
/ \
.
b
/\
/ \
.
b
/\
/ \
*
a
|
/\
/ \
a
b
Se observ c n nodurile interioare apar operatori iar frunzele sunt reprezentate de ctre simbolii de
intrare. Exist trei operatori (|, *, .). Pentru a simplifica construciile considerm pentru orice expresie
regulata i un simbol de sfrit pe care l vom nota cu # astfel nct orice expresie regulata r va fi
reprezentat de r#. Relund pentru expresia anterioar va rezulta graful:
Vom ataa fiecrei frunze un cod unic, de exemplu acest cod poate s fie reprezentat de poziia
simbolului respectiv n expresia regulat.
Fie C mulimea codurilor ataate fiecrei frunze i N mulimea nodurilor arborelui. Fie c funcia de
codificare i c-1 funcia invers (c : N C). Definim patru funcii:
nullable : N {adevrat, fals}
firstpos : N P(C)
lastpos : N P(C)
followpos : C P(C)
Funcia nullable este o funcie logic care are valoarea adevrat dac i numai dac subarborele
corespunztor nodului respectiv reprezint o expresie regulat care poate s genereze irul vid. Astfel
funcia nullable aplicat subarborelui:
|
/\
a b
are valoarea fals n schimb aplicat asupra subarborelui:
*
|
a
are valoarea adevrat.
Funcia firstpos aplicat unui subarbore are ca valoare mulimea codurilor frunzelor corespunztoare
poziiilor de nceput pentru subirurile care pot s fie generate de ctre expresia regulat corespunztoare
subarborelui
respectiv.
De
exemplu
pentru
nodul
rdcin
al
subarborelui:
x
.
/\
/ \
*
a
|
/\
3
/ \
a
b
1
2
(a | b)* a
1 2 3
firstpos(x) = {1,2,3}
lastpos(x) = {3}
Funcia lastpos aplicat unui subarbore are ca valoare setul codurilor frunzelor corespunztoare
poziiei de sfrit pentru subirurile care pot s fie generate de ctre expresia regulat corespunztoare
subarborelui respectiv.
Funcia followpos este definit asupra mulimii codurilor frunzelor. Dac i este un cod i i este asociat
simbolului x, (i = c-1(x)) atunci followpos(i) este mulimea codurilor j (j = c-1(z)) care satisfac urmtoarea
condiie: xy (etichetate cu i i respectiv j ) pot s apar ntr-un ir generat din rdcin.
Altfel spus dac se consider irurile obinute din cuvintele din L(r) (limbajul generat de expresia
regulat) prin nlocuirea simbolilor din T cu codurile asociate frunzelor din graf care le genereaz,
followpos(i) conine toate codurile care pot s apar imediat dup i n aceste iruri. De exemplu
followpos(1) = {1,2,3}. Pentru a calcula funcia followpos trebuie s se calculeze funciile firstpos i
lastpos care la rndul lor necesit calculul funciei nullable. Regulile pentru calculul funciilor nullable,
firstpos i lastpos sunt urmtoarele :
forma nod n
n este o frunz
cu eticheta
n este o frunz
cu eticheta
avnd codul i
nullable(n)
adevrat
firstpos(n)
lastpos(n)
fals
{i}
{i}
nullable(c1)
sau
nullable(c2)
firstpos(c1)
firstpos(c2)
lastpos(c1)
lastpos(c2)
nullable(c1)
si
nullable(c2)
dac nullable(c1)
firstpos(c1)
firstpos(c2)
altfel
firstpos(c1)
firstpos(c)
dac nullable(c2)
lastpos(c1)
lastpos(c2)
altfel
lastpos(c2)
lastpos(c)
|
/\
/ \
c1 c2
.
/\
/ \
c1 c2
*
|
c
adevrat
Pentru a calcula followpos(i) care indic ce coduri pot s urmeze dup[ codul i conform arborelui se
utilizeaz dou reguli :
1. dac n este un nod corespunztor operatorului de concatenare cu subarborii c1 i c2 (respectiv stnga
dreapta) atunci dac i este un cod din lastpos(c1) toate codurile din firstpos(c2) sunt n mulimea
followpos(i).
Singurul nod pentru care funcia nullable are valoarea adevrat este nodul etichetat cu *. Pe baza
acestor valori s calculm followpos(1). n followpos(1) vor apare codurile din firstpos pentru nodul
etichetat cu * i codurile din firstpos pentru subarborele dreapta corespunztor operatorului de concatenare
(followpos(1) = followpos(2) = {1,2,3}. Rezult urmtoarele valori :
nod
1
2
3
4
5
6
followpos
{1,2,3}
{1,2,3}
{4}
{5}
{6}
-
Pornind de la aceste valori se poate construi un graf n care fiecare nod reprezint un cod iar ntre
dou noduri corespunztoare codurilor i i j exist un arc dac j followpos(i).
+---+
| |
| 4 |-
| |
+---+
+---+
| |
| 5 |-
| |
+---+
+-----+
|+---+|
|| 6 ||
|+---+|
+-----+
Pe baza unui astfel de graf se poate obine un automat finit nedeterminist fr -tranziii, etichetnd
arcele n modul urmtor. Dac ntre nodul i i nodul j exist un arc acesta va fi etichetat cu simbolul care
are codul j. Fiecare stare a automatului corespunde unui nod din graf. Automatul are ca stri iniiale strile
din firstpos pentru nodul rdcin. Strile finale sunt strile asociate cu simbolul #. Automatul care a
rezultat, avnd mai multe stri iniiale nu se ncadreaz de fapt n definiia pe care am dat-o pentru un
automat finit. Dac ns mai adugm o stare suplimentar care s reprezinte unica stare iniial din care
pe baza unor -tranziii ajungem ntr-una dintre strile automatului obinut, se vede c ne ncadrm n
definiia considerat
a
--\/
+---+
+-> | | a
|
| 1 |\ +---+
| +-| | \| | b
a |b | +---+ | 3 |->
| | +---+ | |
| | | | /+---+
| +>| 2 |/ a
+----| |
+---+
/\
-b
+---+
+---+
+-----+
| | b | | # |+---+|
| 4 |->| 5 |->|| 6 ||
| |
| |
|+---+|
+---+
+---+
+-----+
Mai interesant ns este faptul c funcia followpos poate s fie utilizat pentru construirea unui
automat determinist utiliznd un algoritm similar celui pentru construirea submulimilor.
Fie q1 = firstpos(rdcina) = {1,2,3}. Se observ c r(1) = r(3) = a, r(2) = r(4) = r(5) = b. Pentru q1 i
a se obine q2 = followpos(1) followpos(3) = {1,2,3,4}, deci tranz_AFD(q1,a) = q2. Pentru q2 i b,
followpos(2) = {1,2,3} = q1 i tranz_AFD(q1,b) = q1, etc.
Nici aceasta construcie nu garanteaz faptul c automatul obinut este minim.
2.3.1.4
Construim un algoritm care urmeaz s rspund la ntrebarea - dndu-se un automat finit determinist
D i un ir, este irul acceptat de ctre automat ?
Algoritmul utilizeaz funciile mutare (care determin starea urmtoare pentru o stare i un simbol de
intrare dat) i caracterul_urmtor (care obine caracterul urmtor din irul de intrare).
s = s0
c = caracterul_urmtor
cat timp c eof executa
s = mutare(s,c)
c = caracterul_urmtor
daca s F
atunci rezultat "DA"
altfel rezultat "NU"
care accepta limbajul (a | b)* abb, pentru irul ababb, se observ c va parcurge secvena de stri
012123.
2.3.1.5
Prezentm n continuare un algoritm pentru simularea unui automat finit nedeterminist. Algoritmul
citete un ir de intrare i verific dac automatul l accepta sau nu. Se consider c automatul a fost
construit direct pornind de la expresia regulat. n consecin automatul va satisface urmtoarele
proprieti:
1. are cel mult de dou ori mai multe stri fa de numrul de simboli i operatori care apar n expresia
regulat;
2. are o singur stare de start i o singur stare de acceptare. Dintr-o stare de acceptare nu pleac nici o
tranziie;
3. din fiecare stare pleac fie o tranziie pentru un simbol din alfabetul de intrare T, fie o -tranziie sau
doua -tranziii.
Se consider c exist un mecanism prin care se poate stabilii faptul c s-a ajuns la sfritul irului de
intrare (test de tip eof). Algoritmul de simulare se aseamn cu cel utilizat pentru construcia unui automat
finit determinist echivalent cu automatul N, diferenele constau n faptul c pentru fiecare mulime de stri
Q n care poate s ajung automatul pentru un prefix al irului x se consider pentru construirea mulimii
Q' de stri urmtoare numai simbolul curent din irul x. n momentul n care s-a ajuns la sfritul irului
(s-a ajuns la eof) dac n setul strilor curente este inclus i o stare de acceptare (final), atunci rspunsul
este "DA" altfel rspunsul este "NU".
S = -inchidere({s0}) # -inchidere(S) = {s' Q | s S, s' m(s,)} S
a = caracterul_urmtor
ct timp a eof execut
S = -inchidere(mutare(S,a)) # mutare(S,a) = m(s',a)
s' S
a = caracterul_urmtor
daca S F
atunci rezultat "DA"
altfel rezultat "NU"
Algoritmul poate s fie implementat eficient utiliznd dou liste i un vector indexat cu strile
automatului finit nedeterminist. ntr-o list se pstreaz mulimea strilor curente ale automatului, n
cealalt mulimea strilor urmtoare. Utiliznd algoritmul de calcul al strilor urmtoare pentru -tranziii
se calculeaz setul -nchidere pentru o stare dat. Vectorul este utilizat pentru a asigura funcionarea listei
ca o mulime n sensul c dac o stare este coninuta n list atunci ea nu trebuie s mai poat fi adugat.
Dup ce s-a terminat calculul -inchiderii pentru o stare se face schimbarea rolului celor dou liste.
Deoarece fiecare stare are cel mult dou tranziii, fiecare stare poate s produc cel mult dou stri noi. Fie
|N| numrul de stri pentru AFN. Deoarece n lista pot s fie memorate maximum |N| stri, calculul strii
urmtoare se poate face ntr-un timp proporional |N|. Deci timpul necesar pentru simularea AFN pentru
irul de intrare x va fi proporional cu |N| x |x|. S relum de exemplu automatul :
---------------+
/
|
/
+-+ +-+
|
/
| |a | |
|
/
/ > |2|->|3|\ |
/
/
|| || \|
+-+ +-+ /
+-+ +-+ +-+ +-+ +-+ +-+ +--+
| | | |/
| |? | |a | |b | |b |--|
> |0|->|1|
|6|->|7|->|8|->|9|->|10|
| | | |\
/| | | | | | | | |--|
+-+ +-+ \
+-+ +-+ / +-+ +-+ +-+ +-+ +--+
\
\ | |b | | /
/\
\
> |4|->|5|/
/
\
|| ||
/
\
+-+ +-+
/
\
/
--------------------
Acest AFN accept expresia regulata (a|b)*abb. S considerm de exemplu irul de intrare x = ab.
Evoluia celor dou liste va fi urmtoarea :
lista 1
lista 2
a
--------->
-i({0}) = {0,1,2,4,7}
-i({3,8}) = {1,2,3,4,6,7,8}
b
<------------i({5,9}) = {1,2,4,5,6,7,9}
Se observ c s-a ajuns la mulimea {1,2,4,5,6,7,9} care nu conine o stare de acceptare deci irul x nu
este acceptat de ctre automat.
2.3.1.6
complexitate construcie
memorie ocupat
complexitate simulare
2.3.1.7
AFN
O(|r|)
O(|r|)
O(|r| x |x|)
AFD
O(|r| x |T|)
O(c |r|)
O(|x|)
Se poate demonstra c fiind dat o mulime regulata exist un unic automat finit determinist cu numr
minim de stri care accept limbajul generat de mulimea respectiv. n cele ce urmeaz considerm c
automatul finit are funcia de tranziie definit pentru ntreg domeniul Q X T. Dac exist combinaii (s,i)
Q x T pentru care m(s,i) nu este definit considerm o extindere a automatului pentru care adugm o
stare d. Pentru i T, m(d, i) = d, pentru s Q, i T pentru care m(s,i) este nedefinit n automatul
iniial vom considera c m(s, i) = d.
Construim o extensie a funciei m, m : x T* Q n modul urmtor :
1. ( s Q) (m(s, ) = s)
2. ( s Q)( w T*)(i I)(m(s, wi) = m(m(s, w), i)
Fie w T* spunem c w separ strile s, t Q dac i numai dac m(s,w) F i m(t,w) F sau
m(t,w) F i m(s,w) F.
Un automat este redus dac i numai dac pentru oricare dou stri q1, q2 F exist o secven de
intrare care s le separe. Problema construirii automatului redus echivalent unui automat dat este de fapt
problema construirii partiiilor induse de o relaie de echivalen. Iniial, considerm ca mulimea Q este
mprit n F, Q - F i {d}. Fie P = { Q - F, F, {d}}. n continuare pentru o mulime de stri A P, pentru
care |A| > 1, se parcurg simbolii de intrare. Dac pentru un simbol a i strile q1, q2 A, m(q1, a) i
m(q2, a) fac parte din elemente diferite din P nseamn c strile succesoare strilor q1 i q2 nu fac parte
din aceeai mulime a partiiei. Corespunztor Q va fi mprit n 4 mulimi, etc. Algoritmul corespunztor
este:
Descrierea algoritmului de minimizare este:
daca new
P = P - {A}
A = A - new
P = P {A}{new}
Algoritmul utilizat nu este optim din punct de vedere al timpului de execuie. La fiecare pas mulimea
de stri Q se mparte n cel mult dou noi mulimi : new i Q \ new. Exist algoritmi pentru care numrul
de operaii este proporional cu n log n. S considerm urmtorul exemplu :
Iniial P = {{0, 1, 2, 3}, {4}}, A = {0, 1, 2, 3}. Fie first = 0, next = 1, m(0, a), m(1, a) A; m(0, b),
m(1, b) A. Pentru next = 2, m(0, a) A, m(2, a) A; m(0, b) A, m(2,b) A. Continund pentru next
= 3, m(0, b) A dar m(3, b) A, deci new = {3}. S-a obinut P = {{0, 1, 2}, {3}, {4}}. Se observ c P
P'. Urmeaz A = {0, 1, 2}. Se obine m(0, b) Q dar de aceasta data m(1, b) A. Rezult P = {{0, 2},
{1}, {3}, {4}}. Pentru A = {0, 2} se obine m(0, a), m(2, a) {1}; m(0, b), m(2, b) A. Se obine
automatul finit determinist cu numr minim de stri:
b
b
---------<--------------------+
\/ /
|
+---+ /
|
start | |/
+---+
+---+
+-----+
-----> |02 | a | | b
| |b
|+---+|
| |--- | 1 |------>| 3 |--- || 4 ||
+---+
| |
| |
|+---+|
+---+
+---+
+-----+
/\ ||
a
|
|
-- |+-<--------+
|
a|
|
|
a
|
+--<--------------------+
2.3.2
Un automat cu stiv (PDA) este un obiect matematic P = (Q, T, Z, m, q0, z0, F) unde:
Q - este o mulime finit de simboli ce reprezint strile posibile pentru unitatea de control a
automatului;
T - este mulimea finit a simbolilor de intrare;
Z - este mulimea finit a simbolilor utilizai pentru stiv;
m - este o funcie, m : S x (T {}) x Z P(S x Z*) este funcia care descrie modul n care se obine
starea urmtoare i informaia care se introduce n stiv pentru o combinaie stare, intrare, coninut
stiv dat;
q0 Q este starea iniial a unitii de control;
z0 Z este simbolul aflat n vrful stivei n starea iniial;
F Q reprezint mulimea finit a strilor finale.
O configuraie de stare a automatului este un triplet (q, w, ) Q x T* x Z* unde :
O tranziie a automatului este reprezentat prin relaia |- asupra mulimii configuraiilor automatului,
este definit n modul urmtor :
(q, aw, z) |- (q', w, )
unde (q', ) m(q, a, z), q Q, a T {}, w T*, z Z, Z*.
Dac a nseamn c, dac unitatea de control este n starea q, capul de citire este pe simbolul a iar
simbolul din vrful stivei este z atunci automatul poate s i schimbe configuraia n modul urmtor :
starea unitii de control devine q', capul de citire se deplaseaz cu o poziie la dreapta iar simbolul din
vrful stivei se nlocuiete cu .
=
=
=
=
=
{(q1,0z)}
{(q1,00)}
{(q2,)}
{(q2,)}
{(q0,z)}
Pentru toate celelalte elemente (s, a, z) Q x (T {}) x Z care nu sunt descrise de regulile de mai
sus, m(s, a, z) = . Se observ c automatul copiaz toate zerourile de pe banda de intrare n stiv i apoi
descarc stiva pentru fiecare simbol 1 ntlnit la intrare. De exemplu pentru irul 0011, automatul va
executa urmtoarea secven de tranziii :
(q0,0011,z)
||||-
(q1,011,0z)
(q1,11,00z)
(q2,1,0z)
(q2,,z)
|- (q0,,z)
||||-
(q1,11,0z)
(q2,1,z)
(q2,1,z)
(q0,1,z)
|- (q1,01,0z)
|- (q1,1,00z)
|- (q2,,0z)
n acest caz s-a ajuns la sfritul irului dar starea n care se gsete automatul nu este final deci nici
acest ir nu este acceptat.
Pentru a demonstra c L(P) = {0n1n} trebuie s artm c {0n1n} L(P) i L(P) {0n1n}. Se pot face
urmtoarele observaii :
(q0,0,z) |- (q1,,0z)
(q1,0i,0z) |-i (q1,,0i+1z)
(q1,1,0i+1z) |- (q2,,0iz)
(q2,1i,0iz) |-i (q2,,z)
(q2,,z) |- (q0,,z)
Deci {0n1n} L(P). Trebuie s artm c i L(P) {0n1n} . Se observ c pentru a accepta un ir din
{0 1 } pentru care n > 0, P trece n mod obligatoriu prin succesiunea de stri q0, q1, q2, q0.
n n
=
=
=
=
Funcionarea automatului parcurge trei etape. nti se copiaz n stiv irul w, apoi se identific
simbolul c care marcheaz mijlocul irului, dup care se descarc stiva conform wR.
S considerm i automatul care accept limbajul L = {wwR| w {a,b}+}, P = ({q0, q1, q2}, {a, b},
{z, a, b}, m,q0, z, {q2}) unde :
=
=
=
=
=
=
{(q0,xz)}, x {a, b}
{(q0,xx),(q1,)}, x {a, b}
{(q0,ab)}
{(q0,ba)}
{(q1,)}, x {a, b}
{(q1,)}
De data aceasta nu se tie unde se gsete mijlocul irului, astfel nct ori de cte ori simbolul din
vrful stivei este acelai cu cel de la intrare s-ar putea s se fi gsit mijlocul irului. Se observ c cel de al
doilea automat nu este determinist i c nici nu se poate construi un automat determinist care s accepte
limbajul L = {wwR| w {a,b}+}.
S considerm de exemplu secvena de micri pentru irul abba.
(q0,abba,z)
||||-
(q0,bba,az)
(q0,ba,baz)
(q0,a,bbaz)
(q0,,abbaz)
Se observ c pentru aceast secven de tranziii nu se ajunge ntr-o stare final. Automatul fiind
nedeterminist trebuie s cercetm ns toate secvenele de tranziii posibile. O alt secven este:
(q0,abba,z)
|||||-
(q0,bba,az)
(q0,ba,baz)
(q1,a,az)
(q1,,z)
(q2,,)
Fie P = (Q, T, Z, m, q0, z0, F) un automat cu stiv. Spunem c un ir w T* este acceptat de P prin
stiva goal dac exist o evoluie pentru care (q0, w, z0) |-+ (q, , ) pentru q Q.
Fie Le(P) mulimea irurilor acceptate de P prin stiva goal. Se poate demonstra urmtorul rezultat.
Dac L(P) este limbajul acceptat de automatul P prin stri finale atunci se poate construi un automat cu
stiv P' astfel nct L(P) = Le(P').
Automatul P' va simula funcionarea automatului P. Ori de cte ori P intr ntr-o stare final, P' poate
continua simularea sau intr ntr-o stare speciala qe n care golete stiva (qe Q). Se poate ns observa c
P poate s execute o secven de micri pentru un ir de intrare w care s permit golirea stivei fr ca
irul s fie acceptat de ctre automatul P (pentru P nu conteaz dect ajungerea ntr-o stare final). Pentru
a evita astfel de situaii se consider un simbol special pentru iniializarea stivei, simbol care nu poate s
fie scos din stiva dect n starea qe. Fie P' = (Q {qe, q'}, T, Z {z'}, m', q', z', ) unde funcia m' este
definit n modul urmtor :
1. dac (r, t) m(q, a, z) atunci (r, t) m'(q, a, z), pentru r, q Q, t Z*, a T {}, z Z.
2. m'(q', , z') = {(q0, z0z')}. P' i iniializeaz stiva cu z0z' (z' reprezint simbolul de iniializare al
stivei pentru P').
3. pentru q F i z Z, (qe, ) m'(q, , z);
4. pentru z Z {z'}, m'(qe, , z) = {(qe, )}
cu yr = z' dac i numai dac (q0, w, z0) |-n (q, , y1 y2 ... yr-1) pentru q F i y1 y2 ... yr-1 Z*. Deci
Le(P') = L(P).
Se poate demonstra i rezultatul invers, adic dndu-se un automat cu stiv i limbajul acceptat de
acesta prin stiva goal se poate construi un automat cu stiv care accept acelai limbaj prin stri finale.
2.3.2.2
Limbajele acceptate de automatele cu stiv sunt limbajele care pot s fie descrise de gramatici
independente de context. Dndu-se o gramatic independent de context s construim automatul care
accept limbajul generat de aceasta gramatica. Fie G = (N, T, P, S), se obine automatul cu stiv R = ({q},
T, N T, m, q, S, ) unde m este construit conform urmtoarelor reguli :
1. dac A P atunci (q, ) m(q, , A)
2. m(q, a, a) = {(q, )} pentru orice a T.
Se observ c automatul astfel construit va accepta limbajul prin stiv goal. Se poate arata c A k
w dac i numai dac (q,w,A) |-n (q, , ) k, n > 1. Altfel spus exist o derivare S + w dac i numai dac
(q, w, S) |-+ (q, , ). Rezult deci c L(G) = L(R). S construim de exemplu automatul care accept
limbajul expresiilor aritmetice G = ({, T, F}, {a, +, (, )}, P, ) unde P = { + T | T, T T * F | F, F
() | a}. Aplicnd construcia propus rezult R = ({q}, {a, +, *, (, )},{, T, F, a, +, *, (, )}, m, q, , )
unde m este definit n modul urmtor :
m(q,
m(q,
m(q,
m(q,
,
,
,
b,
)
T)
F)
b)
=
=
=
=
{(q,
{(q,
{(q,
{(q,
+ T),(q, T)}
T * F),(q, F)}
()),(q, a)}
)} cu b {a,+,*,(,)}.
|||||||||||||-
(q,
(q,
(q,
(q,
(q,
(q,
(q,
(q,
(q,
(q,
(q,
(q,
(q,
a + a * a,
a + a * a,
a + a * a,
a + a * a,
+ a * a, +
a * a, T)
a * a, T *
a * a, F *
a * a, a *
* a, * F)
a, F)
a, a)
, ).
+
T+
F+
a+
T)
T)
T)
T)
T)
F)
F)
F)
n reprezentarea tranziiilor vrful stivei a fost reprezentat n stnga. Se observ c secvena de tranziii
considerat, simuleaz urmtoarea secven de derivri de forme propoziionale :
Se observ ca n aceasta secven s-a nlocuit ntotdeauna cel mai din stnga neterminal. Din acest
motiv se spune c am utilizat o derivare stnga. Secvena de derivri anterioare poate s fie reprezentat de
urmtorul arbore de derivare.
/|\
/|\
+ T
|
/|\
| /|\
T T * F
| |
|
| |
|
F F
a
| |
a a
Acest gen de construire de secvene de derivare i deci automatele cu stiv care accept limbaje prin
stiv goal sunt utilizate n analiza sintactic descendent.
Un tip special de automat cu stiv l reprezint automatul cu stiv extins = (Q, T, Z, m, q0, z0, F)
pentru care m : Q x (T {}) x Z* P(Q x Z*). Se observ c n acest caz din stiv se consider nu
numai simbolul din vrful stivei ci un ir de simboli plasat n vrful stivei. Considerm pentru acest tip de
automat c acceptarea se face prin stri finale ( i n acest caz se poate construi un automat echivalent care
s fac acceptarea prin stiv goal). S considerm de exemplu automatul care accept limbajul L = {wwR
| w {a,b}*}. Fie P = ({q, p}, {a, b}, {a,b,S,z}, m, q, z, {p}) unde funcia m este definit n modul
urmtor:
m(q,a,) = {(q,a)}
m(q,b,) = {(q,b)}
m(q,,) = {(q,S)}
m(q,,aSa) = {(q,S)}
m(q,,bSb) = {(q,S)}
m(q,,Sz) = {(p,)}
De exemplu pentru secvena de intrare aabbaa este posibil urmtoarea secven de tranziii :
(q, aabbaa, z)
|||||||||||-
(q,
(q,
(q,
(q,
(q,
(q,
(q,
(q,
(q,
(q,
(p,
abbaa, az)
bbaa, aaz)
baa, baaz)
baa, Sbaaz)
aa, bSbaaz)
aa, Saaz)
a, aSaaz)
a, Saz)
, aSaz)
, Sz)
, )
Se observ ca n aceast secven s-a nlocuit ntotdeauna cel mai din dreapta neterminal. Din acest
motiv se spune ca s-a construit o derivare dreapta. Considernd acest tip de derivri i parcurgndu-le n
ordine invers (de la sfrit) se poate introduce noiunea de reducere stnga. Fie gramatica G = (N,T,P,S) o
gramatic independent de context s presupunem c S * aAw aw * xw. Dac n fiecare derivare a
fost nlocuit de fiecare dat neterminalul cel mai din dreapta atunci se spune c aw se reduce stnga la
aAw dac A P. Dac este cel mai din stnga astfel de ir atunci spunem ca este nceputul irului
aw. Un nceput (handle) pentru o derivare dreapta este orice ir care este partea dreapta a unei producii
i poate s fie nlocuit de neterminalul corespunztor ntr-o form propoziional care a aprut dintr-o
derivare dreapta obinndu-se forma propoziional anterioar din derivarea dreapta.
S considerm de exemplu gramatica: G = ({S, A, B},{a, b, c, d}, {S Ac | Bd, A aAb | ab, B
aBbb | abb}, S). Aceast gramatic genereaz limbajul {anbnc | n > 1} {anb2nd | n > 1}. S considerm
urmtoarea secven de derivri S Bd aBbbd aabbbbd. Pentru irul obinut abb este nceput
deoarece aBbbd este forma propoziional anterioar din derivarea dreapta, n timp ce ab nu este deoarece
aAbbbd nu este o forma propoziional care poate s apar ntr-o derivare dreapta.
Relund din nou gramatica pentru expresii aritmetice i secvena de derivri dreapta :
+T+T*F+T*a+F*a +a*aT+a*a
F+a*aa+a*a
|
|
T
|
|
F
|
|
a
/| \
/ | \
+ T
/| \
/| \
T * F
|
|
|
|
F
a
|
|
a
Dac analizm acest arbore se vede c a (care reprezint frunza celui mai din stnga subarbore) este
un nceput, dac se face o reducere se obine arborele :
/|\
/|\
+ T
|
/|\
| /|\
T T * F
| |
|
| |
|
F F
a
|
|
a
Continund se ajunge la :
/|\
/|\
+ T
/|\
/|\
T * F
|
|
F
a
|
a
T
/|\
/ | \
T * F
pentru care a, F, T respectiv T * F reprezint pri dreapta ale unor producii. Aceasta metoda de
reducere a arborilor de derivare se numete reducerea capetelor ("handle pruning").
Dndu-se o gramatic independent de context G = (N, T, P, S) se poate construi un automat cu stiv
extins care s opereze conform metodei reducerii capetelor n modul urmtor :
R = ({q, r},T,N T {$}, m, q, $, {r}) unde:
1. dac A P atunci (q, A) m(q, , )
2. m(q, a, ) = {(q, a)} pentru orice a T. Se observ c terminalele sunt copiate n stiva;
3. m(q, , $S) = {(r, )}.
S construim utiliznd aceast tehnic automatul cu stiv extins care accept limbajul expresiilor
aritmetice :
R = ({q, r},{a, +, *, (, )},{a, +, *, (, ), T, F, , $}, m, q, $,{r}) unde
b,
,
,
,
,
,
,
,
Fiind vorba de o derivare dreapta, vrful stivei a fost figurat n dreapta. Se observ c aceast secven
de tranziii este unica secven ce duce la acceptarea irului de intrare. Pentru irul a + a * a, automatul R
va executa urmtoarele tranziii :
(q, a + a * a, $) |- (q, + a * a, $a)
|- (q, + a * a, $F)
|- (q, + a * a, $T)
|- (q, + a * a, $)
|- (q, a * a, $ +)
|- (q, * a, $ + a)
|- (q, * a, $ + F)
|- (q, * a, $ + T)
|- (q, a, $ + T *)
|- (q, , $ + T * a)
|- (q, , $ + T * F)
|- (q, , $ + T)
|- (q, , $)
|- (q, , ?)
Automatele cu stiv construite dup modelul prezentat anterior vor fi utilizate n analiza sintactic de
tip ascendent.
Avnd n vedere echivalena dintre un automat cu stiv i limbajele independente de context, vom
spune c un limbaj independent de context este determinist dac este acceptat de un automat cu stiv
determinist. Vom modifica puin condiia de acceptare, considernd c un limbaj independent de context
este determinist dac exist un automat cu stiv determinist care accept limbajul L$. Simbolul $ este un
simbol care nu apare n alfabetul peste care este definit limbajul L. Se observ c utilizarea acestui simbol
care apare concatenat cu fiecare ir din L indic de fapt posibilitatea automatului cu stiv de a recunoate
sfritul irului. n acest mod se extinde puin clasa limbajelor independente de context deterministe.
Se pune ntrebarea dac orice limbaj independent de context este determinist. S considerm de
exemplu limbajul :
L = {wwR | w {a, b, c}
Dup cum s-a mai discutat un automat cu stiv care accept acest limbaj trebuie s ghiceasc unde este
mijlocul irului pentru ca s nceap descrcarea stivei. Intuitiv, o astfel de operaie nu se poate realiza cu
un dispozitiv determinist.
Propoziie. Exist limbaje independente de context care sunt acceptate de automate cu stiv
nedeterministe i nu sunt acceptate de automate cu stiv deterministe.
2.3.3
Maina Turing
banda de intrare
Banda de intrare este mrginit la stnga i infinit la dreapta. Dup poziia ocupat de irul de intrare
pe banda aceasta conine blancuri. n cele ce urmeaz vom indica simbolul blanc cu ajutorul caracterului #
(presupunnd c acest simbol nu face parte din alfabetul limbajului pentru care se construiete maina). De
asemenea vom utiliza caracterele L i respectiv R pentru a indica o deplasare la stnga respectiv la
dreapta. Maina Turing poate s scrie pe banda de intrare, deci poate s scrie att informaii intermediare
ct i un rspuns nainte de a se oprii. Maina Turing are o stare special numit stare de oprire (de halt)
pe care o vom nota n continuare cu h. S considerm o definiie formal a noiunii de main Turing.
Se numete main Turing obiectul matematic :
MT = (Q, T, m, q0)
unde
Dac q Q, a T i m(q, a) = (p, b) nseamn c fiind n starea q, avnd simbolul a sub capul de
citire maina trece n starea p. Dac b T atunci simbolul a va fi nlocuit cu b, altfel capul se va deplasa
cu o poziie la stnga sau la dreapta n funcie de valoarea simbolului b {L, R}. Se observ c maina
Turing a fost definit ca un acceptor determinist.
a)
#)
a)
#)
=
=
=
=
(q1, #)
(h, #)
(q0, a)
(q0, R)
S considerm c pe banda de intrare se gsete irul aaa i c poziia capului este pe primul caracter
din ir. Se observ c pentru aceast stare iniial, primul simbol a este nlocuit cu #, noua stare fiind q1.
Pentru q1, dac sub capul de citire se gsete un caracter # atunci se va face o deplasare la dreapta starea
devenind q0. Se continu evoluia ntr-o manier similar pn cnd n starea q0 capul de citire se gsete
pe un caracter #. n acest moment se trece n starea h i maina se oprete. Rezult ca evoluia mainii
duce la tergerea unui ir de a-uri nscris pe banda de intrare.
S considerm i urmtorul exemplu MT = ({q0}, {a, #}, m, q0), unde
m(q0, a) = (q0, L)
m(q0, #) = (h, #)
n acest caz maina caut primul simbol # la stnga poziiei din care pleac capul de citire / scriere. La
gsirea acestui simbol se trece n starea h. Dac nu exist un astfel de simbol maina nceteaz s
funcioneze cnd ajunge la captul din stnga al benzii, dar nu se oprete (este n stare de agare).
O configuraie pentru o main Turing este un element din mulimea :
(Q {h}) x T* x T x (T* (T - {#}) {})
Elementele unei configuraii sunt:
starea curent q (Q {h})
irul aflat pe banda de intrare la stnga capului de citire / scriere (a T*)
simbolul aflat sub capul de citire / scriere ( i T)
irul aflat la dreapta capului de citire / scriere ( (T* (T - {#}) {})).
Se observ c, deoarece irul de intrare este finit, n timp ce banda de intrare este infinit la dreapta
putem s considerm ntotdeauna c irul se termin cu un caracter care nu este # (oricum n continuare pe
band apar numai caractere #). Deci o configuraie este de forma (q, a, i, ). Pentru simplificare, o
configuraie se poate reprezenta i sub forma (q, ai), subliniind simbolul pe care se gsete capul de citire
/ scriere.
Asupra configuraiilor se poate defini o relaie de tranziie |- n modul urmtor. Fie (q1, w1, a1, u1) i
(q2, w2, a2, u2) dou configuraii. Atunci:
(q1,w1,a1,u1) |- (q2,w2,a2,u2)
# w1 a1 u1#
# w2 a2 u2#
# w1a1 u1 #
# w2 a2 u2 #
# w1 a1 u1 #
# w2 a2 u2 #
Un calcul efectuat de o maina Turing este o secven de configuraii c0, c1, ..., cn astfel nct n 0 i
c0 |- c1 |- ... |- cn. Se spune despre calcul c are loc n n pai.
Termenul de calcul nu a fost utilizat ntmpltor. Se poate considera c o main Turing tie s
evalueze funcii definite pe iruri de simboli cu valori n iruri de simboli. Dac T1 i T2 sunt doua
mulimi alfabet care nu conin simbolul #, s considerm funcia f : T1* T2*. Spunem ca MT = (Q, T,
m, s) calculeaz f dac T1, T2 T i pentru orice ir w T1* dac u = f(w), u T2*, atunci (s, #w#) |-*
(h, #u#). Se observ c s-a considerat c capul este poziionat dup sfritul irului de intrare att la
nceputul execuiei ct i la sfritul acesteia.
Dac pentru o funcie f dat exist o maina Turing care o calculeaz spunem c funcia f este Turing
calculabil.
S considerm de exemplu maina Turing MT = ({q0, q1, q2}, {a, b, #}, m ,q0) unde funcia m este
definit n modul urmtor:
m(q0, a) = (q1, L)
m(q0, b) = (q1, L)
m(q0, #) = (q1, L)
m(q1, a) = (q0, b)
m(q1, b) = (q0, a)
m(q1, #) = (q2, R)
m(q2, a) = (q2, R)
m(q2, b) = (q2, R)
m(q2, #) = (h, #)
||||||||||||-
(q1, #aab#)
(q0, #aaa#)
(q1, #aaa#)
(q0, #aba#)
(q1, #aba#)
(q0, #bba#)
(q1, #bba#)
(q2, #bba#)
(q2, #bba#)
(q2, #bba#)
(q2, #bba#)
(h, #bba#)
O main Turing poate s fie utilizat i ca acceptor de limbaj. i anume s considerm un limbaj L
definit asupra alfabetului T care nu conine simbolii #, D i N. Fie dL : T* {D, N} o funcie definit n
modul urmtor - pentru w T*
D dac w L
/
dL(w) =
\
N dac w L
Se spune ca limbajul L este decidabil n sens Turing (Turing decidable) dac i numai dac funcia dL
este calculabil Turing. Dac dL este calculat de o maina Turing MT spunem ca MT decide L.
S considerm de exemplu limbajul L = {w T* | |w| mod 2 = 0, T = {a}} (limbajul irurilor peste
alfabetul T = {a} care au lungimea un numr par). Funcia dL corespunztoare poate s fie calculat de
urmtoarea main Turing :
#)
a)
#)
#)
a)
#)
#)
D)
N)
#)
=
=
=
=
=
=
=
=
=
=
Noiunea de acceptare este mai larg dect noiunea de decidabilitate n legatura cu limbajele. i
anume dac L este un limbaj asupra alfabetului T, spunem ca limbajul L este Turing acceptabil dac exist
o maina Turing care se oprete dac i numai dac w L.
Limbajele Turing decidabile sunt i Turing acceptabile. Reciproca nu este ns adevarat.
Fie limbajul :
L = {w {a, b}* | w conine cel puin un simbol a}
considernd maina Turing MT = ({q0}, {a, b, #}, m, q0) cu
m(q0, a) = (h, a)
m(q0, b) = (q0, L)
m(q0, #) = (q0, L)
Se poate constata ca dac pe banda de intrare se gsete un ir din limbaj atunci pornind din
configuraia iniial se va face cutarea unui simbol a prin deplasare spre stnga. Dac un astfel de caracter
este gsit maina se oprete (deci accept irul). Dac ns pe banda de intrare se gsete un ir care nu
aparine limbajului atunci maina va intra n starea de agare dup ce a ajuns la captul din stnga al
benzii.
Pentru a evidenia "puterea" de calcul a mainilor Turing vom prezenta mecanismul prin care o
main Turing se poate construi pe baza unor maini Turing mai simple.
Propoziie Fie MT o maina Turing i fie (qi, wiaiui), (i = 1, 2, 3) configuraii ale acestei maini. Dac
sunt posibile evoluiile :
(q1, w1a1u1) |-* (q2, ww2a2u2) i
(q2, w2a2u2) |-* (q3, w3a3u3)
atunci este posibila i evoluia :
(q1, w1a1u1) |-* (q3, ww3a3u3)
Justificare. n evoluia din (q2, ww2a2u2) n (q3, w3a3u3) maina nu poate s ajung pe banda de intrare
pe un simbol aflat la stnga irului w2 (ntr-o astfel de situaie s-ar ajunge la marginea din stnga a benzii,
deci s-ar intra n starea de agare i deci nu s-ar mai ajunge n configuraia urmtoare). Deoarece maina
are o funcionare determinist va rezult aceeai evoluie i dac irul w2a2u2 nu este la nceputul benzii de
intrare. Rezult c este posibil i evoluia (q2, ww2a2u2) |-* (q3, ww3a3u3).
Pe baza propoziiei anterioare putem s realizm compunerea mainilor Turing ntr-o manier similar
utilizrii subprogramelor. S considerm de exemplu o maina Turing M1 care "tie" s funcioneze
primind un ir pe banda de intrare pornind cu capul de citire / scriere poziionat dup ir. S presupunem
c M1 nu poate s ntre ntr-o stare de agare. La oprire, capul va fi plasat de asemenea dup irul care a
rezultat pe banda de intrare. Dac M1 este utilizat n cadrul unei alte maini Turing care printre alte aciuni
pregtete i un ir de intrare pentru M1, atunci dup ce M1 primete controlul nu va depi limita stnga
a irului su de intrare, deci nu va modifica un ir care eventual a fost memorat nainte pe banda de intrare.
n cele ce urmeaz considerm ca mainile Turing care se combin nu pot s ntre n starea de agare
i c fiecare are strile sale proprii diferite de strile tuturor celorlalte maini Turing. Ca maini de baza
pornind de la care vom construi noi maini Turing vom considera cteva cu funcionare elementar.
Aceste maini au un un alfabet de intrare T comun.
1. exist |T| maini care scriu fiecare cte un simbol din T n poziia curent a capului. O astfel de main
este definit ca fiind Wa = ({q}, T, m, q), a T, m(q, b) = (h, a), b T. Pentru a simplifica notaiile
Wa va fi reprezentat de simbolul a.
1. exist dou maini care execut deplasri elementare. i anume VL = ({q}, T, m, q) cu m(q, a) = (h,
L) i VR = ({q}, T, m, q) cu m(q, a) = (h, R), a T. Vom nota aceste maini cu L i respectiv R.
Reprezentarea compunerii mainilor Turing se face ntr-o manier asemntoare unei structuri de
automat finit pentru care o stare este reprezentat de o maina Turing. Intrarea ntr-o stare a automatului
corespunde cu iniierea funcionrii unei maini Turing. La oprirea unei maini Turing (intrarea acesteia n
starea h) n funcie de simbolul aflat sub capul de citire se va trece ntr-o alt stare, adic se va iniia
funcionarea unei alte maini Turing.
O schem de main Turing este tripletul = (M, , M0) unde
M este o mulime finit de maini Turing care au toate un alfabet comun T i mulimi de stri
distincte;
M0 M este maina iniial;
este o funcie parial , : M x T M.
Acelai mod de nlnuire va avea loc i la oprirea (dac intervine) mainii M'. n mod formal acest
gen de compunere de maini Turing poate s fie descris n modul urmtor. Fie M = {M0, .., Mk}, k 0
astfel nct Mi = (Qi, T, mi, si), 0 i k. Fie q0, ..., qk stri care nu apar n mulimile Qi, 0 i k. Dac
(M, , M0) este o schem de main Turing , ea va reprezenta maina MT = (Q, T, m, s) unde
Se observ c strile noi q0, ..., qk au fost introduse ca puncte de trecere de la o main la alta. Din
definiie rezult c fiecare main funcioneaz "normal" pn cnd se oprete. Dac o main se oprete i
este definit maina urmtoare se va trece n starea care face legatura cu maina urmtoare. Dac nu este
definit maina urmtoare, MT se va opri. Dintr-o stare de legatur se intra n funcionarea mainii
urmtoare pe baza simbolului curent de pe banda de intrare.
S considerm de exemplu mulimea M = {M0} cu M0 = R = ({q}, T, m, q). Definim funcia n
modul urmtor :
(M0, a) = M0 dac a #
(M0, #) este nedefinit
n acest caz (M, , M0) reprezint o main notat cu R#, R# = ({q, q0}, T, m, q) unde
m(q, a) = (q0, R), a T
m(q0, a) = (q0, R), a #
m(q0, #) = (h, a)
n cele ce urmeaz vom reprezenta grafic compunerea mainilor Turing utiliznd o serie de reguli :
Se poate ntmpla ca n M s apar mai multe copii ale aceleiai maini (fiecare cu strile ei proprii
diferite de strile celorlalte). n acest caz fiecare dintre exemplare reprezint o alt main Turing deci
va fi desenat separat.
n reprezentrile grafice urmtoare vom utiliza o serie de simplificri. De exemplu schema :
a
---------/
b
\
> R ----------> R
\
c
/
| ---------- |
\
#
/
------------
a,b,c,#
> R --------- R sau > R -- R sau RR sau R2
indicnd faptul c se fac dou deplasri la dreapta indiferent de coninutul benzii de intrare.
Dac a T, a reprezint orice simbol din T diferit de a. Deci maina care caut simbolul # la
dreapta poate s fie reprezentat ca :
/|
/|
>R< |
\|
\|
Urmtoarea schem:
a # sau
/|
/|
> R < | #
\|
\|
caut mergnd la dreapta un simbol diferit de #, cnd l gsete l copiaz la stnga poziiei pe care la gsit. Se observ c din notaia a # rezult c simbolul gsit, i care este diferit de #, este notat
generic cu a i poate s fie utilizat n continuare.
n cele ce urmeaz utilizm urmtoarele notaii :
Utiliznd aceste maini "simple" s construim o maina de copiere C care funcioneaz n modul
urmtor. S presupunem c pe banda de intrare se gsete un ir w care nu conine simboli #
(eventual irul poate s fie i vid). Presupunem ca la stnga irului de intrare se gsete un singur
simbol #; pe banda de intrare nu se mai gsesc simboli diferii de # care s nu fac parte din w. Capul
este poziionat pe simbolul # care marcheaz sfritul irului w. Evoluia mainii trebuie s fie (s, #w#) |* (h, #w#w#). Se spune ca maina transform irul #w# n #w#w#. Reprezentarea grafic pentru aceasta
main este :
>L#
+-------------------------+
| x #
|
-->R --------#R# 2x L# 2 x ---+
# |
R#
transform irul #w# n w#. Similar se poate construi o maina SR care transform irul #w# n
##ww#.
Fie T0 = T - {#} cu f : T0* T0* astfel nct f(w) =wwR, f poate s fie calculat de urmtoarea
main:
+--------------------+
| x #
|
>L ----> #R# xL# x ----+
|#
R#
Pe parcursul funcionrii maina transform iruri de forma #x1 ... xn# n #x1 ... xi ... xnxnxn-1 ...
xi+1#, i = n-1, ..., 0. Pentru i = 0 se ajunge la #x1 ... xnxn ... x1#.
2.3.3.3
Avnd n vedere simplitatea deosebit a funcionrii unei maini Turing standard, se pune
problema dac aceasta nu poate s fie fcut mai "puternic": prin adugarea unor extensii care s
nu crete puterea de calcul oferit. Adic, nu se schimb nici clasa funciilor care pot s fie calculate
i nici a limbajelor acceptate sau decise.
Demonstraiile de echivalen sunt constructive realizndu-se pentru fiecare extensie construirea
unei maini Turing standard capabil s simuleze funcionarea unei maini Turing avnd extensia
considerat. S considerm de exemplu o maina Turing care are o band infinit la ambele capete.
Schimbarea definiiei formale pentru acest model de maina Turing intervine n modul n care se definete
noiunea de configuraie i relaia |- asupra configuraiilor. n acest caz o configuraie este de forma (q, w,
a, u) i w nu ncepe cu un simbol # iar u nu se termina cu un
simbol #. Nu mai exist limitri referitoare la deplasarea la stnga i deci dispar noiunile de
stare i respectiv de configuraie de agare.
Propoziie. Fie M1 = (Q1, T1, m1, q1) o main Turing cu banda de intrare infinit la ambele
capete. Exist o main Turing standard M2 = (Q2, T2, m2, q2) astfel nct, pentru orice w (T1 {#})* sunt ndeplinite urmtoarele condiii :
unde a1, ..., an (T1 - {#})*. Se observ c prelucrrile necesare nu sunt deosebit de dificile.
Etapa a doua poate s fie realizat de ctre o maina M1' care are n mulimea sa de stri pentru
fiecare q Q1 o pereche de stri notate <q, 1> i <q, 2>. Dac M1' este ntr-o stare <q, 1> nseamn c
M1' acioneaz asupra pistei superioare a benzii de intrare. Dac M1' este n starea <q, 2> atunci nseamn
c M1' acioneaz asupra pistei inferioare. De asemenea exist strile <h, 1> i <h, 2> care reprezint
oprirea n situaia n care M1' lucra pe pista superioar respectiv inferioar.
Funcia de tranziie m' pentru M1' este definit n modul urmtor :
a) dac q Q1, (a1, a2) T1 x T1 i m1(q, a1) = (p,b)
atunci
/ (<p, 1>, L)
dac b = L
m1'(<q,1>,(a1,a2) = (<p, 1>, R)
dac b = R
\ (<p, 1>, (b, a2)) dac b T1
f) pentru situaiile care nu se ncadreaz n nici unul dintre cazurile anterioare m1' se
definete arbitrar.
Se observ c n cazurile a i b este descris funcionarea mainii M1 la dreapta i respectiv la stnga
"mijlocului" ales. Cazul c. trateaz comutarea ntre piste care trebuie realizat atunci cnd se ajunge la
limita din stnga a benzii. Cazul d. indic modul n care se face extinderea celor doua piste la dreapta.
Cazul e trateaz intrarea n starea de oprire (h) a maini simulate M1. Se observ c la intrarea n aceasta
stare se va produce intrarea n starea h i a mainii M1' cu nregistrarea pistei pe care s-a fcut oprirea
mainii simulate.
Dac banda de intrare a maini M1 conine irul w (T1 - {#})* i aceasta se oprete cu un coninut
de forma :
----------------------------------------------| # | b1 | b2 | ...| bi | ...| bn | # | # |
-----------------------------------------------
unde c1c2 ... c2k = # ... # b1b2 ... bi-1 b bi+1 ... bn # ... # cu bi #, 1 i n.
Pentru etapa a treia se face translatarea simbolilor diferii de # de pe pista inferioar pe pista
superioar :
Din nou aceasta prelucrare este simpl. n final se reface banda sub forma :
+------------------------------------------| # | b1 | b2 | ... | bi | ... | bn | # |
+------------------------------------------
Rolul alfabetului T utilizat n construirea mainii M1' este de a permite identificarea poziiei capului
la oprirea mainii M1'.
Similar definiiei din cazul mainilor Turing standard putem s considerm i n acest caz definiia
noiunii de calcul. i anume dac T1 i T2 sunt doua mulimi de tip alfabet care nu conin simbolul #
atunci spunem c funcia f : T1* T2* este calculat de maina Turing, M care are banda de intrare
infinit la ambele capete, dac i numai dac pentru orice w T1*, dac f(w) = u atunci (q, w#) |-*
(h,u#). De asemenea noiunile de acceptare respectiv de decidabilitate referitoare la limbaje pot s fie
definite pentru mainile Turing cu banda infinit la ambele capete ntr-o maniera similara celei de la
maina Turing standard.
Orice funcie care este calculat i orice limbaj care este acceptat sau decis de o maina Turing cu
banda infinit la ambele capete este calculat respectiv acceptat sau decis de o main Turing standard.
Construcii i rezultate similare pot fi realizate i pentru celelalte extensii considerate la nceputul
acestui subcapitol. Din acest motiv n tratarea pe care o vom realiza n continuare putem s considerm
pentru a simplifica demonstraiile n loc de maini Turing standard maini care au oricare dintre
extensiile amintite sau chiar combinaii ale acestora.
Extinderea maini Turing se poate face i prin renunarea la caracterul determinist al acestora.
Pentru o main Turing nedeterminist funcia m este definit n modul urmtor :
m : Q x T P((Q {h}) x (T {L, R}))
Dup cum s-a artat pentru orice automat finit nedeterminist se poate construi un automat finit
determinist echivalent. n cazul automatelor cu stiv aceasta echivalen nu exist. Cu alte cuvinte
automatele cu stiv nedeterministe sunt "mai puternice" dect cele deterministe deoarece automatele
cu stiv nedeterministe accepta o clasa mai larga de limbaje.
n cazul mainilor Turing nedeterministe deoarece pentru acelai ir de intrare se pot obine
rezultate diferite, se pune problema cum se alege "calculul util" efectuat de maina Turing. Vom
restringe puin problema considernd numai noiunea de acceptare. n acest caz ceea ce conteaz este
c maina Turing se oprete n una din evoluiile sale posibile. Rezultatul depus pe band nu este n acest
caz neaprat semnificativ. S considerm mai nti un exemplu de main Turing nedeterminist. Fie
limbajul
L = { w { a, b}* | w contine sirul abaab}
Evident, limbajul este de tip regulat i poate s fie acceptat de un automat finit determinist. O
soluie de maina Turing nedeterminista care accepta acest limbaj este :
Configuraia din care se pleac este (q, #w#). Maina Turing pornete spre stnga. La un moment
dat, la ntlnirea unui simbol b, maina Turing "ghicete" ca a gsit sfritul sub irului cutat.
Dac ghicirea este corect atunci maina se va opri, altfel maina nu se oprete. Fiind vorba de o
funcionare nedeterminist tot ce conteaz este c dintre toate soluiile posibile exist una pentru care
maina se oprete. Se poate demonstra urmtoarea propoziie.
Propoziie Pentru orice maina Turing, M1 nedeterminist exist o maina Turing M2 determinist
(standard) astfel nct pentru orice ir w care nu conine simbolul # :
i) dac M1 se oprete pentru w atunci i M2 se va opri pentru w;
i) dac M1 nu se oprete pentru w atunci nici M2 nu se oprete pentru w.
S considerm o schi de demonstraie pentru propoziia anterioar. Fie M1 = (S, T1, m, s). M2
trebuie s ncerce toate evoluiile posibile pentru M1 n cutarea unei evoluii pentru care M1 se oprete.
M1 poate avea ns un numr infinit de evoluii pornind din s i avnd un ir w pe banda de intrare ( s nu
uitm c dac irul nu este acceptat de M1 aceasta nu se va opri). Se pune problema cum trebuie s fac
M2 cutarea ntre aceste evoluii (n ce ordine ?).
Ideea este urmtoarea, dac M1 este n configuraia C atunci exist mai multe configuraii C' astfel
nct C |- C'. Numrul configuraiilor C' este ns finit i depinde numai de definiia funciei m (nu de
configuraia C). Dac starea curenta este q i simbolul curent la intrare este a, atunci m(q, a) P((Q
{h}) x (T {L, R})) este o mulime finit, deoarece |m(q,a)| (|Q| + 1) x (|T| + 2). Fie
r = max (|m(q,a)|)
qQ
aT
Valoarea r rezult din definiia funciei m i reprezint numrul maxim de configuraii urmtoare
posibile pentru o configuraie dat. Deci dac pornim din configuraia iniial C = (q,#w#), M1 poate s
treac n maximum r configuraii urmtoare diferite. Fiecare dintre aceste r configuraii diferite poate s
treac la rndul ei n alte r configuraii diferite. Rezult deci c pentru o evoluie n k pai se poate ajunge
la un numr de maximum rk configuraii diferite pornind din configuraia iniial. Pentru fiecare mulime
m(q, a), q Q, a T, considerm cte o ordonare arbitrar a elementelor care o compun.
M2 va analiza n mod sistematic nti toate configuraiile n care se poate ajunge ntr-un pas, apoi n
doi pai, etc. Dac n aceasta cutare se trece printr-o configuraie pentru care M1 se oprete se va opri i
M2. Dac M1 se oprete vreodat atunci ea se oprete ntr-un numr finit de pai. Corespunztor M2 va
descoperi aceasta oprire ntr-un numr finit de pai.
Maina M2 poate s fie construit avnd trei piste. O pist este utilizat ca martor, pe ea se pstreaz
irul iniial. A doua pist este utilizat pentru a simula funcionarea maini M1. Fiecare simulare ncepe cu
o copiere a coninutului primei benzi (partea util) pe a doua band. A treia band pstreaz evidena
ncercrilor fcute. i anume pe aceast band se gsete un ir dintr-un alfabet D = {d1, ..., dr}, unde r
este numrul maxim de configuraii urmtoare posibile pentru orice configuraie a maini M1. Pe aceasta
Un automat liniar mrginit este un caz particular de main Turing nedeterminist. Definiia unui astfel de
automat este:
ALM = (Q, T, m, s, F)
unde:
Q este o mulime finit de stri
T este alfabetul benzii de intrare, #, L, R T
m este funcia de tranziie
m : Q x T P(Q x (T {L, R})).
s Q este starea iniial pentru automatul liniar mrginit.
F Q este mulimea strilor finale
Dac q Q este o stare, a T este un simbol de pe banda de intrare i (p, b) m(q, a) nseamn c
din starea curent q pentru simbolul de intrare a se poate trece n starea p, nlocund sibmbolul de pe banda
de intrare sau efectund o micare la stnga sau la dreapta. Definiia este a unui acceptor nedeterminist.
Funcionarea automatului pornete cu o configuraie avnd pe banda de intrare un ir cuprins ntre doi
simboli # (dou blancuri). Deoarece funcia de tranziie nu este definit pentru simbolul #, nseamn c
spaiul de micare al capului de citire/scriere pe banda d intrare este limitat la lungimea iniial a irului de
intrare. Cu alte cuvinte dac printr-o deplasare la stnga sau la dreapta capul de citire/scriere ajunge n
afara spaiului ocupat iniial de ctre irul analizat automatul se oprete. Conform definiiei, pentru
automatele liniat mrginite se consider o acceptare prin stri finale. Dac la oprirea automatului capul de
citire se gsete la captul din dreapta al irului i starea automatului face parte din F nseamn c evoluia
automatului a dus la acceptare.
Se poate demonstra c pentru orice gramatic dependent de context exist o gramatic echivalent
liniar mrginit. Produciile unei gramatici n liniar mrginit au n partea dreapt cel mult doi simboli.
Dac exist o producie S AB (unde S este simbolul de start al gramaticii) atunci A = S. Pentru orice
gramatic dependent de context liniar mrginit se poate construi un automat liniar mrginit care accept
acelai limbaj. De asemenea pentru orice automat liniar mrginit este posibil s se construiasc o
gramatic dependent de context care genereaz acelai limbaj. Adic, clasa limbajelor acceptate de
automate liniar mrginite este clasa limbajelor dependente de context. Intuitiv, relaia de echivalen dintre
gramaticile dependente de context i automatele liniar mrginite este susinut de condiia pe care o
satisfac produciile unei gramatici dependente de context. i anume - dac A este o producie
atunci |A| ||. Adic orice ir din limbajul generat de ctre gramatic este mai lung cel puin egal
cu orice form propoziional obinut n secvena de derivri prn care se obine irul respectiv.
Propoziie. Fie M = (Q, TM, m, q) o main Turing. Exist o gramatic G = (N, TG, P, S) astfel
nct pentru orice pereche de configuraii (q, uav) i (q', u'a'v') ale maini Turing
*
(q, uav) |- (q', u'a'v')
M
a)
#)
a)
#)
#)
a)
=
=
=
=
=
=
(q1,
(q0,
(q2,
(q1,
(h,
(q2,
R)
a)
R)
a)
#)
R)
irurile x, y, x' i y' sunt [, *], [* i respectiv ]. G transform un ir de forma [w*] cu w {a, b}*
n modul urmtor. Se transform nti primul simbol (a sau b) cu care ncepe irul n A sau B utiliznd
una dintre produciile [a [A sau [b [B. n continuare neterminalul astfel obinut migreaz spre
limita din dreapta a irului. La ntlnirea simbolului * se aplic una dintre produciile A* *a sau B*
*b. De exemplu pentru irul abb se obine :
[abb*] [Abb*] [bAb*] [BAb*] [BbA*]
[Bb*a] [bB*a] [b*ba] [B*ba]
[*bba]
Elemente de calculabilitate
Discuia coninut n acest subcapitol depete cadrul limbajelor formale dar este important
pentru a realiza legtura dintre modelele de calcul considerate i lumea real a calculatoarelor, mai
ales pentru a oferi o caracterizare a posibilitilor oferite de acestea.
n momentul n care s-a dat definiia limbajelor s-a precizat faptul c numai o anumit parte a
acestora poate s fie descris ntr-o form finit. Gramaticile, automatele finite, automatele push down,
maina Turing sunt astfel de reprezentri finite. Se pune problema dac odat cu maina Turing s-a atins
ntr-adevr limita de reprezentare finit a limbajelor. De asemenea, avnd n vedere c o
gramatica poate s fie interpretat i ca un dispozitiv capabil s efectueze calcule, se pune ntrebarea
dac nu exist mecanisme mai puternice de reprezentare dect gramaticile i maina Turing (avnd n
vedere faptul c un calculator real pare mult mai puternic dect o maina Turing).
2.3.3.6.1
Spre deosebire de o maina Turing standard, modelul Von Neumann de calculator presupune
noiunea de program memorat. Ar apare aici o diferen important ntre o main Turing i un
calculator real. i anume o main Turing standard este dedicat rezolvrii unei anumite probleme
(calculului unei anumite funcii) n timp ce un calculator este un dispozitiv universal, capabil s treac
la calculul unei noi funcii prin schimbarea programului, deci a ceva coninut n memorie, fr a schimba
ns modul de funcionare a unitii de control. Se pune ntrebarea dac nu se poate construi o maina
Turing care s funcioneze ntr-o manier similar adic, s primeasc la intrare att irul care se
transform ct i o descriere a transformrii. O astfel de main Turing se numete maina Turing
universal. Pentru a construi o main Turing universal este necesar s obinem nti un mod de
descriere al unei maini Turing sub forma de ir astfel nct aceast descriere s poat s fie utilizat
ca intrare pentru o alta main Turing .
Fiecare main Turing este definit utiliznd patru elemente MT = (Q, T, m,s). Deoarece Q i T
sunt mulimi finite descrierea unei maini Turing poate s fie fcut sub forma unui ir utiliznd
simboli din Q, T, paranteze, virgule i alte semne de punctuaie. O asemenea reprezentare sub forma de
ir, nu este recomandabil deoarece avem nevoie pentru maina pe care o construim de un alfabet
finit pe care s l utilizm n definiia acesteia, alfabet care s permit reprezentarea oricrui alfabet
posibil pentru o main Turing. Vom consider ca exist mulimile infinit numrabile :
Qinf = {q1, q2, ...} i Tinf = {a1, a2, ...}.
astfel nct pentru orice main Turing, mulimea strilor i respectiv alfabetul de intrare sunt
submulimi finite din Qinf i respectiv Tinf. Se consider urmtoarea codificare pentru elementele care
aparin unei definiii de main Turing utiliznd un alfabet ce conine un singur simbol {I}:
Se observ c fiecare stare q Q {h} are un cod unic, acelai lucru este valabil i pentru fiecare
simbol din alfabetul de intrare. Fie c un simbol c I. Pentru construirea irului care descrie o main
Turing se utilizeaz numai simbolii c i I. Fie MT = (Q, T, m, s) o main Turing cu Q Sinf i T Tinf.
Deci Q = {qi1, qi2, ..., qik}, i1 < i2 < ... < ik, iar T = {aj1, aj2, ... ajl}. Construim kl iruri notate cu Spr, unde
1 p k i 1 r l. Fiecare ir Spr codific valoarea funciei de tranziie pentru o pereche (qip, ajr).
Fie de exemplu m(qip, ajr) = (q', b), q' Q {h} i b T {L, R} atunci Spr = cw1cw2cw3cw4c
unde :
w1
w2
w3
w4
=
=
=
=
cod(qip)
cod(ajr)
cod(q')
cod(b).
Notm cu codif(M) irul cS0cS11S12 ... S1lS21 ... S2l ... Sk1 Sk2 ... Skl c. S0 este codificarea strii iniiale,
S0 = cod(s). Se observ c irul astfel obinut reprezint o codificare unic pentru o maina Turing. De
asemenea pe baza unui astfel de ir se poate reconstrui descrierea "clasica" a mainii.
S considerm de exemplu MT = (Q, T, m,s) cu Q = {q2}, T = {a1, a3, a6}, s = q2 i m(q2, a3) =
m(q2, a6) = (q2, R) i m(q2, a1) = (h,a3). Utiliznd notaiile anterioare, rezult k = 1, i1 =
2, l = 3 i j1 = 1, j2 = 3, j3 = 6. Se obine :
S11 | m(q2, a1) = (h, a3) | cIIIcIIIcIcIIIIIc
-----+---------------------+----------------------S12 | m(q2, a3) = (q2,R) | cIIIcIIIIIcIIIcIIc
-----+---------------------+----------------------S13 | m(q2, a6) = (q2, R) | cIIIcIIIIIIIIcIIIcIIc
Rezult
codif(M) = cI3c|cI3cI3cIcI5c|cI3cI5cI3cI2c|cI3cI8cI3cI2c|c
Se observ c irul obinut codif(w) nu poate s conin simboli #, chiar dac w conine simboli #. U =
(Qu, {I, c, #}, mu, qu) trebuie s satisfac urmtoarele condiii - pentru orice main Turing , M = (Q, T,
m, s) :
1. dac (h, uaw) este o configuraie de oprire pentru M astfel nct (s, #w#) |-*M (h, uav) atunci, (qu,
#codif(M) codif(w) #) |-*U (h, #codif(uav)#)
2. dac (qu, #codif(M)codif(w)#) |-*U (h,u'a'v') pentru o configuraie de oprire (h, u'a'v') pentru U atunci
a' = #, v' = , u' = #codif(uav) pentru u, a, v astfel nct (h, uav) este o configuraie de oprire pentru M
i (s, #w#) |-*M (h, uav).
Adic dac M se oprete pentru w atunci i U se oprete pentru un ir obinut prin concatenarea
irurilor codif(M) i codif(w). Mai mult, pentru o astfel de oprire coninutul benzii U reprezint o
codificare a rspunsului maini Turing, M pentru w. De asemenea dac U se oprete pentru un ir care
reprezint codif(M)codif(w) atunci i M se va opri pentru w i rezultatul lsat de U reprezint codificarea
rezultatului lsat de M.
Pentru a simplifica discuia vom consider o variant U' a maini U, variant care utilizeaz trei benzi.
Conform celor menionate anterior pentru aceasta variant se poate construi o main Turing echivalent
cu o singur band. Prima band va conine iniial codif(M)codif(w), a doua band conine n timpul
simulrii codif(M) iar a treia band va conine codificarea strii curente a maini M care se simuleaz.
Funcionarea ncepe cu prima band coninnd codif(M)codif(w), celelalte benzi find goale. U' va copia
irul codif(M) pe a doua band i va modifica coninutul primei benzi la forma #c codif(#w#). Se observ
c localizarea nceputului irului codif(w) n irul iniial se face uor pentru c aici exist trei simboli c
consecutivi. Din codif(M) se identific S0 (codul pentru starea iniial) i se copiaz pe cea de a treia
band. n continuare U' ncepe s simuleze funcionarea maini Turing M. ntre paii de simulare cele trei
capete de citire / scriere utilizate (exist trei benzi de intrare) sunt poziionate n modul urmtor :
pentru prima band pe ultimul c care indic sfritul codului pentru simbolul curent parcurs de M;
pentru a doua i a treia band la marginea stnga a benzilor respective.
n acest mod cnd M pornete s trateze ultimul simbol # din irul de intrare #w#, U' va ncepe
simularea deplasndu-i capul pe ultimul simbol c de pe banda. U' va cuta pe a doua band un subir de
forma ccIicIjcIkcIlcc unde Ii este irul coninut n a treia banda, iar Ij este irul curent de pe prima banda. La
identificarea unui astfel de subsir U' se va mica corespunztor. Dac Il este codif(L) sau codif(R) atunci se
realizeaz deplasarea pe prima banda de intrare la stnga respectiv la dreapta. Dac Il este cod(a) pentru a
Tinf se observ c nlocuirea simbolului curent poate s presupun deplasarea coninutului primei benzi
pentru ca spaiul ocupat de codul pentru a poate s fie diferit de cel ocupat de simbolul nlocuit. n cadrul
aceleiai micri U' nlocuiete irul nscris n a treia band cu Ik. Dac acum coninutul acestei benzi este
cod(h) U' va deplasa capul de pe prima banda pe primul simbol # aflat la dreapta poziiei curente dup
care se oprete. Dac pe banda a treia nu se gsete cod(h) atunci se continu simularea.
Rezult deci c o main Turing este suficient de puternic pentru a fi comparata cu un calculator
real. De fapt o main Turing este echivalent cu noiunea intuitiv de algoritm. Mai
mult conform ipotezei Church (Church's Thesis) nici o procedur de calcul nu este un algoritm dac
nu poate s fie executat de o maina Turing. Acest rezultat care este acceptat, n prezent constituie numai
o ipotez pentru c nu constituie un rezultat matematic, ci indic numai faptul c un anumit obiect
matematic (maina Turing) este echivalent cu un concept informal.
Revenind la problema reprezentri finite a limbajelor se pune problema cum arat limbajele care nu
sunt Turing decidabile. Cu alte cuvinte putem s dm o reprezentare finit pentru un astfel de limbaj ?.
Dac aa ceva este posibil nseamn c putem s construim un algoritm care s decid dac un ir face
parte din limbajul respectiv. Conform ipotezei Church ns noiunea de algoritm i cel de maina Turing
sunt echivalente, Rezult deci c ar exist o maina Turing care s verifice dac irul face parte din limbaj,
adic limbajul ar fii Turing decidabil ceea ce contrazice ipoteza.
S discutm puin i relaia dintre limbajele Turing acceptabile i limbajele Turing decidabile. Se
poate demonstra urmtorul rezultat:
Se observ c M' simuleaz M dup care studiaz rspunsul obinut pe band. Dac rspunsul este N,
M' va intra ntr-un ciclu infinit.
Se pune ntrebarea care este raportul invers ntre limbajele acceptabile i cele decidabile Turing.
Dac ar fi posibil ca pentru orice maina Turing i orice ir de intrare w, s prevedem dac maina
Turing se va opri pentru w, atunci orice limbaj Turing acceptabil ar fi i Turing decidabil, deoarece dac
M1 este maina Turing care accept L putem s construim M2 care decide L n modul urmtor. M2 va
executa calculele necesare pentru o prevedea dac M1 se oprete pentru w. Corespunztor M2 se va opri
cu un simbol D sau N pe banda de intrare dup cum M1 accept sau nu irul w.
Rezult c cele doua probleme:
sunt echivalente.
Am artat c dac se poate construi o main Turing care s prevad pentru orice main Turing dac
aceasta se oprete sau nu pentru orice ir atunci orice limbaj acceptabil este i decidabil. S presupunem
acum c orice limbaj acceptabil este i decidabil. n acest caz limbajul:
L0 = { codif(M)codif(w) | M accepta w}
care este acceptat de maina Turing universal, este un limbaj decidabil. Fie M+ maina Turing care
decide acest limbaj. n acest caz M+ poate s prevad pentru orice main Turing dac aceasta se oprete
sau nu pentru orice ir w.
Vom arta n continuare c L0 nu este decidabil. n mod corespunztor rspunsul la cele doua
probleme enunate anterior este : NU.
Dac L0 este Turing decidabil atunci limbajul :
L1 = { codif(M) | M accepta codif(M) }
este Turing decidabil. Dac M0 este maina care decide L0 atunci se poate construi maina M1 care s
decid L1. Funcionarea M1 const din transformarea intrrii din #w# n #wcodif(w)# pe care va funciona
apoi M0. Deci M1 va calcula acelai rezultat asupra irului #w# ca i M0 asupra irului #wcodif(w)#.
Conform definiiei limbajului L0, M0 va scrie D pe banda dac i numai dac :
a. w este codif(M) pentru o main Turing
b. maina Turing M, accept irul w, adic irul de intrare codif(M).
Dar asta este exact definiia limbajului L1. Rezult c este suficient s artm c L1 nu este Turing
decidabil. S presupunem c L1 este Turing decidabil n acest caz i limbajul
este decidabil. O main Turing care decide L1 se obine din maina Turing care decide L1 inversnd
la oprirea mainii rspunsurile D i N.
Limbajul L1nu este ns Turing acceptabil. S presupunem c exist o maina Turing M* care
accepta L1. Din definiia limbajului L1 rezult c:
M, codif(M) L1 M nu accept codif(M) (1)
dar, M* a fost construit pentru a accept L1, adic:
codif(M*) L1 => M* accept codif(M*) (2)
Din (1) i (2) rezult
M* nu accept codif(M*) M* accept codif(M*)
adica M* nu poate s existe, adic L1, L1 i deci L0 nu sunt Turing decidabile.
Deoarece L0 nu este Turing decidabil nu exist un algoritm care s stabileasc dac o main Turing
oarecare se oprete pentru un ir oarecare. Se observ c am gsit o problema pentru care nu avem o
soluie sub form de algoritm. Astfel de probleme se numesc nedecidabile (nerezolvabile). De fapt L0
descrie cea mai cunoscut problema nedecidabila i anume problema opriri maini Turing. Enunul acestei
probleme este : "s se determine pentru o main Turing M, arbitrar dac se oprete pentru un ir de
intrare dat ".
Alte probleme nedecidabile echivalente de fapt cu aceast problem sunt :
2.3.3.7
Chiar dac o problem poate s fie rezolvat cu ajutorul unei maini Turing dac timpul de
rezolvare este mult prea mare nseamn c practic problema nu poate s fie rezolvabil cu ajutorul unei
maini Turing. Unul dintre exemplele clasice pentru o astfel de enun este problema comis-voiajorului.
Ideea este c un comis-voiajor trebuie s viziteze 10 orae. Se cunosc distanele dintre orae i se cere s
se construiasc un intinerariu de lungime minim care s permit comis-voiajorului s viziteze toate
oraele. Evident, problema este rezolvabil. Numrul de drumuri posibile este finit (9!) i deci o
parcurgere a tuturor va produce o soluie. S considerm c 9! este nc o valoare siportabil, dar dac am
vorbi de 30 de orae. n acest caz numrul de posibiliti este mai mare dect 1030. Timpul pentru a a
analiza toate aceste soluii reprezint mai multe miliarde de viei omeneti. Rezult deci, c din punct de
vedere practic definiia de problem rezolvabil/nerezolvabil trebuie s fie redefinit. n continuare vom
iar pentru w L
(s, #w#, #, ..., #) |-x (h, #N#, #, ..., #) pentru x t(|w|).
Vom spune c L este decidabil n timp t dac exist un k > 0 i o main Turing cu k piste astfel
nct s decid L n timp t. Clasa limbajelor decidabile n timp t este reprezentat de TIME(t).
Rezult c numrul de pai executai de o main Turing pentru un ir dat depinde de lungimea sa.
Deoarece maina Turing trebuie cel puin s tearg irul de intrare, i s scrie un simbol (D sau N) i s
i poziioneze capul dup acest simbol nseamn c sunt necesare cel puin |w| + 1 operaii de scriere i
|w| + 3 operaii de deplasare. Rezult c pentru funcia t utilizat ca limit de timp t(n) > 2n + 4. S
considerm de exemplu maina care decide limbajul:
L = {w {a,b}* | w nu contine sirul aa}
#\
----+b
\ /
|--/
\b/
/ #
>L --#L ----->#L/
a
a
#
#
RDR
RNR
n timp ce maina parcurge irul de intrare de la stnga la dreapta l i terge. M va executa numrul
minim de pai, adic M decide L n timp t, cu t(n) = 2n + 4 adic L TIME(t). Acelai lucru se poate
scrie sub forma - L TIME(2n + 4).
Obiectivul unui studiu de complexitate pentru rezolvarea unei probleme const n construirea unei
maini Turing care s asigure c decizia limbajului respectiv se va face n maximum t pai, cu t propus
sau dac asta nu este posibil s se construiasc o demonstraie riguroas c o astfel de main nu se poate
construi.
Se poate demonstra c dndu-se un limbaj L TIME(t) atunci L TIME(t') unde t'(n) = 2n + 18
+ _ x t(n) _ unde x este o valoare real orct de mic (_ r _ reprezint cel mai mic numr ntreg m
astfel nct m r). Ceea ce exprim rezultatul anterior este faptul c ceea ce conteaz este viteza de
cretere i nu factorii constani sau termenii de ordin mai mic.
Fie f i g dou funcii pe numere naturale. Vom nota cu f = O(g) dac i numai dac exist o
constant c > 0 i un numr ntreg n0 astfel nct:
f(n) c g(n) pentru n n0.
d
j
Dac f(n) = ajn atunci f = O(nd). Adic viteza de cretere polinomial este reprezentat de
P = {TIME(n ) | d > 0}
Adic este clasa tuturor limbajelor care pot s fie decise de o main Turing ntr-un timp care este
mrginit de o funcie polinomial.
*
Fie t o funcie pe numere naturale. Fie L T0 i fie M = (Q, T, m, s) o main Turing
nedeterminist. Spunem c M accept limbajul L n timp t nedeterminist dac pentru w T0*,
w L daca si numai daca (s, #w#) |-x (h, vau)
*