Sunteți pe pagina 1din 282

A-PDF Merger DEMO : Purchase from www.A-PDF.

com to remove the watermark

CAPITOLUL I. LIMBAJE FORMALE 1.1. CONCEPTE DE BAZ Cunoatem unele limbaje de nivel nalt, cum sunt Pascal, Fortran, Basic, C i altele. Ne scriem programele n aceste limbaje iar cnd citim un program sau o descriere a unui algoritm scris ntr-unul din ele, de obicei, putem spune ce face programul sau algoritmul respectiv (cel puin atunci cnd programul este bine scris i are o lungime rezonabil). Totodat ne dm seama de erorile din programe sau dintr-o secven de cod scris ntr-unul din aceste limbaje create de om. Urmtorul exemplu de linie de cod din Fortran,
IF (IND.EQ.1) N = N + 1

(1.1)

este corect, n timp ce


IF (IND.EQ.1) N =

(1.2)

nu este corect. Surprinztor, nu doar noi, presupuse fiine inteligente, descoperim astfel de greeli, da chiar i mainile (care n esen sunt formate dintr-o colecie de elemente hardware). Cum se realizeaz acest lucru? De fapt, noi introducem programul ntr-o main simbol cu simbol. Cnd o expresia de forma (1.1) este prezentat calculatorului se transmite mai nti litera I urmat de litera F, simbolul (, i aa mai departe. Maina accept aceste simboluri unul cte unul i dup ce s-au introdus toate, tie cum s procedeze n continuare. Ea poate determina de asemenea dac irul de simboluri primit este corect sau nu. Pentru aceasta,

maina trebuie s cunoasc ce nseamn corect i s fie n stare s determine dac irul (1.1) este scris corect, n timp ce (1.2) nu. n acest capitol vom discuta mai nti cum se definete un limbaj. Aceast definiie ne va permite s determinm, n mod automat, dac un ir de simboluri aparine sau nu unui limbaj. O astfel de definire complet formal i determinist nu este posibil pentru toate limbajele n particular, pentru limbaje naturale, cum sunt engleza, franceza i rusa, este probabil imposibil. Dar ea pare adecvat pentru limbajele de calculator pn la urm calculatoarele funcioneaz. Vom ncepe cu un alfabet fiecare limbaj presupune un alfabet. Alfabetul pentru Fortran se compune din 26 de litere: A, B, ..., X, Y, Z; 10 numere: 0, 1, 2, ..., 9, i alte simboluri cum ar fi: =, +, /, *, (, (spaiu). Alfabetul complet, numit i mulime de caractere, poate fi regsit pe primele pagini ale oricrui manual dedicat limbajului respectiv.

Definiia 1.1. Un alfabet este o mulime nevid i finit de simboluri. De obicei vom nota alfabetul cu simbolul . Definirea unui limbaj peste un alfabet dat devine acum simpl. Definiia 1.2. Un limbaj L peste un alfabet este o mulime de iruri finite de elemente din . Elementele uni alfabet se mai numesc i caractere. irurile dintr-un limbaj L se numesc i propoziii din L.

Exemplu 1.1. Fie alfabetul , compus doar din dou simboluri: 0 i 1, = {0,1} . Dou exemple de limbaj peste sunt: a) L1 = {0, 01,110} . Acest limbaj conine doar trei propoziii: 0, 01 i 110. b) L2 = Toate irurile de 0 i 1 cu un numr egal de 0-uri i 1-uri. Aadar, 010011 i 1010 sunt n limbajul L2 , n timp ce 110 i 010 nu. Evident c limbajul L2 (spre deosebire de L1 ) conine un numr infinit de propoziii. Pe parcursul acestei lucrri vom folosi deseori iruri de simboluri. Fapt pentru care folosim urmtoarele convenii de notaie. Dac
= x1 x2 ...xn i = y1 y2 ... ym sunt dou iruri, atunci concatenarea lor, notat , este definit prin = x1 x2 ...xn y1 y2 ... ym . Aadar, se obine din i prin alipirea irurilor i (n aceast ordine). De exemplu, dac = 01011 i = 001 , atunci = 01011001 . Se observ c = 00101011 ,

deci, n general . Dac x este un caracter, atunci x n este definit prin ca xx...x (de n ori). Observm c x 2 = xx , y 3 = yyy , etc. Lungimea unui ir = x1 x2 ...xm corespunde numrului de caractere din . Astfel, lungimea lui = abaa este 4. Convenabil este introducerea conceptului de ir vid. Un astfel de ir nu are nici un caracter; lungimea lui este 0. El va fi notat ntotdeauna cu i reciproc, simbolul va fi rezervat pentru un astfel de ir. Dac este un ir oarecare i este irul vid, atunci concatenarea lui cu va fi ntotdeauna , = = . Din acest motiv, dac x este un simbol oarecare, definim x 0 ca fiind irul vid ,
x 0 = . Lungimea irului vid este 0, el fiind singurul ir cu aceast

lungime.

Definiia 1.3. Fie o mulime nevid. Limbajul tuturor irurilor finite de elemente din (inclusiv irul vid) se noteaz cu * . Limbajul tuturor irurilor nevide de elemente din se noteaz + . n general, un limbaj L peste un alfabet nu conine toate irurile posibile de elemente din . Aceasta corespunde faptului c nu orice secven de simboluri formeaz un program valid. Ceea ce dorim s facem n continuare este s descriem o regul pentru a decide dac un ir aparine unui limbaj sau nu. Un astfel de exemplu putea fi considerat descrierea limbajului L2 din exemplul 1.1. Aici regula este foarte simpl; mai mult, dat fiind un ir de simboluri de 0 i 1, este uor de verificat dac propoziia face parte din limbaj sau nu. Pe de alt parte este greu de imaginat o regul att de simpl pentru un limbaj ceva mai real, cum e Pascal. Ca urmare, regula trebuie s fie sofisticat i precis astfel nct, dat fiind un program n Pascal (vzut ca un ir lung), ea s determine dac este sau nu un program valid: Sunt toate BEGIN-uri nchise cu END-uri? Sunt toate expresiile algebrice bine formate? etc. O metod util i general pentru descrierea de limbaje se bazeaz pe gramatici. n general, o gramatic este o mulime de reguli care, dac sunt urmate, vor produce o propoziie corect ntr-un limbaj. O descrierea detaliat i exact a conceptului de gramatic este urmtoarea: Definiia 1.4. O gramatic G se compune din patru obiecte: 1. O mulime nevid i finit numit alfabet. Limbajul generat de gramatica G se va compune din iruri de simbolurile din . Elementele din se numesc terminale i vor fi notate, n general, cu litere mici a, b, c, etc.

2. O mulime nevid i finit de simboluri N, fiecare dintre ele diferit de terminalele din ( N = ). Elementele din N se numesc neterminale sau variabile; n general se noteaz cu litere mari A, B, C, etc. 3. Un element dedicat S din N. Acest neterminal S se numete simbolul de start. 4. O mulime P de producii (numite i reguli de producie, reguli de substituire). Ea este format din reguli de forma
A X 1 X 2 ... X n ,

unde A este un neterminal i X 1 X 2 ... X n este un ir finit de terminale sau neterminale ( X i N ). Gramaticile astfel definite poart denumirea de gramatici independente de context; le vom discuta amnunit mai trziu. irul X 1 X 2 ... X n , din partea a 4-a a definiie de mai sus, nu trebuie s conin nici un simbol, el poate fi un ir vid . Producia corespunztoare ar fi atunci de forma A , i se numete producie vid. O gramatic G cu , N, S i P, ca n definiia 1.4., se va nota G = {, N , S , P} .

Exemplu 1.2. Fie urmtoarea descriere a unui gramatici


G = {, N , S , P} :

1. Mulimea de terminale (alfabetul) este {a, b, c} . 2. Mulimea de neterminale N este {S , A, B, C} . 3. Simbolul de start este S. 4. Mulimea P este format din urmtoarele producii:

S AaB B bC

SB C ac

A aB C

Aa

n ultima producie este irul vid i C este o producie vid. Gramatica are trei terminale (a, b, c), patru neterminale (S, A, B, C) i apte producii. n continuare vom descrie cum genereaz o gramatic un limbaj. Avem nevoie de urmtoarea terminologie: Definiia 1.5. Fie
G = {, N , S , P}

gramatic.

form

propoziional a lui G este orice ir X 1 X 2 ... X n de simboluri, fiecare X i fiind un terminal sau neterminal ( X i N ). O form propoziional nu trebuie s conin nici un simbol, ea poate fi chiar irul vid . n exemplul 1.2. irurile AaB, AAaCB, aba i sunt exemple de forme propoziionale. Definiia 1.6. Fie G = {, N , S , P} o gramatic. Presupunem c este o form propoziional exprimata astfel: = 1 A 2 unde 1 i 2 sunt iruri de terminale sau neterminale (forme propoziionale) i A este un neterminal. Mai presupunem c A X 1 X 2 ... X n este o producie din P. Fie
forma propoziional obinut din prin nlocuirea lui A cu X 1 X 2 ... X n , = 1 X 1 X 2 ... X n 2 . Vom spunem c forma propoziional este imediat

derivabil din folosind producia A X 1 X 2 ... X n . Folosim urmtoarea notaie:


Fie

gramatica

G = {, N , S , P}

din

exemplul

1.2.

Forma

propoziional = aBabC deriv imediat forma propoziional = abCabC folosind producia B bC :


= aBabC abCabC

Cu alte cuvinte, a spune c nseamn c unul dintre neterminalele din poate fi nlocuit cu partea dreapt a producie i devine irul . n forma propoziional = aBabC am nlocuit B cu bC ( B bC fiind o producie) i am obinut = abCabC . Ca alt exemplu, fie = aaCba . Aplicnd la producia C obinem
= aaCba aaba

Aici am substituit C cu partea dreapt a produciei C (irul vid). irul


, fiind irul vid, nu are simboluri, deci aa ba = aaba , astfel simbolul C

dispare. Definiia 1.7. Fie 1 i 2 dou forme propoziionale ale unei gramatici G. Presupunem c exist o secven de forme propoziionale
1 , 2 ,..., n astfel nct

1 1 2 ... n 2 .

Vom spunem atunci c 1 deriv 2 , sau 2 este derivabil din 1 i notm


1 * 2

n exemplul 1.2. avem S *aabC deoarece


S AaB aaB aabC Aa B bC

S AaB

Sub fiecare simbol am indicat producia corespunztoare folosit din G la derivare. Fiind dat gramatica G = {, N , S , P} , limbajul L(G) generat de G este mulimea tuturor irurilor de terminale derivabile din simbolul de start. Formal avem: Definiia 1.8. Fie G = {, N , S , P} o gramatic. Limbajul L(G) generat de G este definit a fi mulimea de iruri
L(G ) = { | * , S * } .

Elementele (irurile) din L(G) se numesc propoziii din L(G). n exemplul 1.2. irurile b, aabac i bac aparin toate lui L(G):
S B bC b S AaB aaB aabC aabac S B bC bac

Observm c irul cb nu este n limbajul L(G). ntr-adevr, ncepnd cu simbolul de start S, prima form propoziional derivat din

S va fi AaB sau B. Nici una dintre aceste dou propoziii va deriva ntr-o propoziie care ncepe cu c. Exemplu 1.3. Gramatica din acest exemplu va da limbajul tuturor expresiilor algebrice corect formate care pot fi obinute folosind simbolurile a, +, *, (, i ). Astfel, expresia (a + a) * a va fi n limbaj, n timp ce (a + a ) *(a + nu. Aceast gramatic o notatm G0 i o vom ntlni des pe parcursul acestei lucrri. Alfabetul din G0 este = {a, +,*, (, )} , mulimea de neterminale N = { E , T , F } i simbolul de start este E. Produciile din G0 sunt:
1. E E + T 2. E T 3. T T * F 4. T F 5. F ( E ) 6. F a

Expresia (a + a) * a face parte din limbajul L(G0 ) , derivarea sa fiind

E T T * F F * F ( E ) * F ( E + T ) * F (T + T ) * F ( F + T ) * F (a + T ) * F ( a + F ) * F ( a + a ) * F ( a + a ) * a
4 6 6 2 4 6

Numrul deasupra simbolului indic producia folosit la fiecare derivare. Pentru a vedea c irul (a + a ) *(a + nu este n L(G0 ) , observm c singura posibilitate de apariie a simbolurilor ) i ( ntr-o form propoziional este prin aplicarea produciei F ( E ) . De aici, orice ir derivat din E va avea acelai numr de ) ca i (, iar irul cu pricina nu are

aceast proprietate. Literele E, T i F, care formeaz mulimea neterminalelor, sunt mnemonice pentru expresie, termen i factor. Exist o serie de convenii folosite la descrierea de gramatici. n lipsa unei alte specificaii, terminalele alfabetului vor fi notate cu litere mici a, b, c, etc., cu numere 0, 1, 2, ..., 9 sau cu simboluri specifice ca +, *, (, ). Neterminalele sunt notate cu litere mari A, B, C, ..., i simbolul de start cu S. irul vid se noteaz ntotdeauna cu . Prima producie va avea simbolul de start pe partea stng. Elementele mulimii N se vor numi simboluri gramatice; deci un simbol gramatic este sau terminal sau neterminal. Dac
A 1 A 2 M A k

sunt toate produciile cu aceeai parte stng A, atunci, pentru a se salva spaiu, ele vor fi scrise sub urmtoare form
A 1 | 2 | L | k 1 | k .

Ca urmare, gramatica din exemplul 1.2. se va scrie


S AaB | B A a | aB B bC C ac |

iar gramatica G0 din exemplul 1.3.

E E +T |T T T *F | F F (E) | a

nelesul simbolurilor reias din context. Dac nu se specific n mod explicit, fiind dat descrierea unei gramatici prin
S AB A BSB | BB |1 B 0 A1| 0 |

tragem concluzia c mulimea de terminale este {0,1} , mulimea de neterminale N = {S , A, B} i produciile sunt
S AB A BSB A BB A 1 B 0 A1 B0 B

Forma aceast o vom folosi des pentru descrierea gramaticilor. Derivarea unei propoziii ntr-un limbaj generat de o gramatic se poate reprezentat grafic printr-un arbore de derivare. Ca exemplu considerm gramatica G:
S aBa B Sb | bCC C abb

i o derivare a propoziiei aababbabbaba:

S aBa aSba aaBaba aabCCaba aababbCaba aababbabbaba

O derivarea reprezentat schematic printr-un graf, se numete arbore de derivare, figura 1.1.

Figura 1.1. Un arbore de derivare a unui ir.

Obiectele rotunde din graf se numesc noduri. Nodul din vrf, S, se numete rdcina arborelui. Dac un nod X este legat de un nod de pe un nivel mai jos, atunci X se numete printele lui Y i Y se numete fiul lui X. Nodurile care nu au fii se numesc frunze, nodurile cu fiu/fii i printe se numesc noduri interne. Formarea grafului, numit arbore de derivare, este evident. Dac A este un neterminal, care se nlocuiete cu partea dreapt a produciei A X 1 X 2 L X n , atunci nodul A are ca fii X 1 , X 2 ,..., X n (de la stnga la dreapta). Rdcina arborelui este nodul S, unde S este simbolul de start a gramatici iar frunzele sunt noduri de forma x, unde
x sunt terminale. Dat fiind un arbore de derivare a unui ir, vom

obine acest ir prin concatenarea frunzelor arborelui de la stnga la dreapta.

Figura 1.2. Formarea unui arbore de derivarea

Propoziia (a + a) * a n limbajul L(G2 ) din exemplul 1.3., are arborele de derivare din figura 1.3.

Figura 1.3. Arborele de derivare pentru ( a + a ) * a

Exemplu 1.4. Ca un alt exemplu, prezentm o gramatic pentru limbajul tuturor constante reale valide din Fortran. n manualul de Fortran, aceste constante sunt descrise n diferite moduri. Printre care o constant real este reprezentat printr-un ir de numere; conine un punct zecimal i un exponent reprezentnd o putere a lui 10 sau amndou. Constante reale pot fi n urmtoarele formate:
n.n n., .n, n.nE s, n.E s, .nE s, nE s .

Exemple sunt: 3.E1, 3.1415768, 31.41592E-01, 314.0749162, .31415E01, -3.141592E+279, .31415E+01. Un exemplu de gramatic care genereaz un astfel de limbaj este:
S AB A XD B EXI | D .I | I . | I .I | I X +|| I M | MI M 0 |1| 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

Terminalele

formeaz

mulimea

= {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, E , +, , .} ,

mulimea de neterminale este N = {S , A, B, D, I , M , X } i simbolul de start este S. Arborele de derivare pentru -3.14E01 este dat n figura 1.4. Evident, c toate constantele Fortran (i numai acestea) pot fi derivate folosind aceast gramatic. Bineneles c aceasta nu este unica gramatic care poate fi folosit pentru descrierea acestui limbaj; este posibil s avem dou gramatici distincte G1 i G2 astfel nct L(G1 ) = L(G2 ) . Vom discuta acest concept mai trziu. De fapt, ntregul limbaj Pascal, ca i oricare alt limbaj de calculator, poate fi descris prin gramatica lui. Aceste gramatici sunt lungi i includ mai multe sute de producii. Metod aceasta de descriere a limbajului de calculator este numit Backus Normal Form sau BNF. Notaia folosit aici difer puin de notaia introdus mai sus. Sgeata este reprezentat prin simbolul ::= i neterminalele sunt scrise ca fraze auto explicative nchise ntre < L > . De pild, o descriere BNF a constantelor ntregi din Fortran (sau oricare alt limbaj) poate fi:

< IntegerConstant > ::= < Sign > < Number > < Sign > ::= + | | < Number > ::= < Digit > | < Digit > < Number > < Digit > ::= 0 |1| 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

Evident, c aceast form de descriere a gramaticilor (i a limbajelor), n afara conveniilor de notaie, este identic cu aceea prezentat anterior.

Figura 1.4. Arbore de derivare pentru -3.14E01

1.2. TIPURI DE GRAMATICI I CLASIFICAREA LOR Ideea descrierii unui limbaj printr-o gramatic aparine lui N. Chomsky. n prima parte a activitii sale interesul lui s-a ndreptat spre limbaje naturale, ca engleza i germana. Vom prezenta n continuare unele definiii generale de gramatici. I. Gramatici de tip 0 sau gramatici fr restricii. O gramatic fr restricii G se compune din patru obiecte: o mulime nevid de terminale
, o mulime nevid, N, de neterminale, cu N = , un simbol de start

S N i un ansamblu finit de producii P. ntr-o gramatic fr restricii

produciile sunt de forma


uv

unde u i v sunt iruri oarecare de terminale sau neterminale; u . Aceast producie permite nlocuirea arbitrar a unui ir (u) cu un ir (v). Se spune, c o forma propoziional deriv imediat o form propoziional dac = u , = v i u v este o producie a gramaticii. Vom nota aceasta prin . Limbajul L(G ) este definit a fi mulimea irurilor de terminale derivabil din simbolul de start S. Exemplu 1.5. Fie
= {a, b, c}

alfabetul unei gramatici G,

N = {S , X , Y } mulimea neterminalelor, S simbolul de start i mulimea

produciilor dat de
1. S aXYc 2. aX cad 3. Xc aXa 4. XYc Xcc 5. Yc

Un exemplu de derivare n aceast gramatic ar fi


S aXYc cadYc cad

sau
S a XYc a Xcc aaX ac acadac .

n formele propoziionale de mai sus am subliniat partea stng a produciilor folosite. Gramaticile de acest tip sunt foarte generale; orice limbaj (mulime de iruri) poate fi descris de o gramatic de tip 0. Un limbaj generat de o gramatic de tip 0 se numete limbaj de tip 0. II. Gramatici de tip 1, sau gramatici dependente de context. Terminalele, neterminalele i simbolul de start sunt aceleai. Fiecare producie va avea acum forma
A

unde A este un neterminal i este un ir oarecare de terminale sau neterminale. Neterminalul A se nlocuiete cu doar dac A este nconjurat, sau n context, de i . Evident c gramaticile dependente de context sunt i de tip 0, dar reciproc nu. III. Gramatici de tip 2 sau gramatici independente de context. Dac toate produciile unei gramatici sunt de forma A , unde A este un singur neterminal i un ir oarecare de terminale sau neterminale, atunci gramatica se numete gramatic independent de context, notat GIC. Gramatici de tip 2 sunt o restricie a gramaticilor de tip 1: este necesar ca = = . Astfel, dat fiind forma propoziional 1 A 2 i o producie A , nlocuim A cu pentru a deriva o form 1 2 indiferent de contextul 1 i 2 . Acest fapt explic denumirea de independent de context. Obinem exact definiia unei gramatici dat de definiia 1.4. Strict vzut, gramatici de tip 2 nu sunt chiar restricii ale gramaticilor de tip1, deoarece sunt permise producii de forma A n

una dar nu i n cealalt. Acesta ne conduce la un caz special. Vom arta ntr-un capitolul 7, c dat fiind o gramatic independent de context cu producii vide, exist o gramatic independent de context echivalent (genernd acelai limbaj) fr producii vide, exceptnd S (unde S este simbolul de strat). n particular, dac G este o gramatic independent de context astfel nct L(G ) limbajul generat de G atunci L(G ) = L(G ') , unde G ' este o gramatic independent de context fr producii vide. Astfel, dac L este un limbaj de tip2 care nu-l conine pe , atunci este i de tip 1. Reciproca nu este adevrat: exist limbaje de tip1 care n-au gramatici independente de context. Majoritatea gramaticilor discutate n aceast lucrare vor fi independente de context ele sunt mult mai uor de analizat. Toate limbajele actuale de programare, Pascal, C, etc., sunt independente de context. IV. Gramatici de tip 3 sau gramatici regulare. Exist o subclas interesant de gramatici independente de context, numite gramatici regulare sau liniare. Definiia 1.9. Spunem c o gramatic G este liniar la dreapta sau regular la dreapta, dac fiecare din produciile sale are una din formele urmtoare:
S A aB Aa.

Unde, S este simbolul de start, irul vid, A, B neterminale arbitrare i a un terminal oarecare. O gramatic se numete liniar la stnga sau regular la stnga dac toate produciile sale au una din formele urmtoare:

A Ba

Aa

O gramatic se numete regular (liniar) dac este regul (liniar) la dreapt sau la stnga. Evident, gramaticile regulare sunt independente de context. Le vom studia detaliat n capitolul 2. Aceast clasificarea a gramaticilor (tip j, j=0, 1, 2, 3) este cunoscut sub denumirea de ierarhie Chomsky. 1.3. REPREZENTAREA LIMBAJELOR PRIN GRAMATICI Am vzut n paragrafele 1.2. i 1.3. cum se descrie un limbaj n termeni de gramatici. Din punct de vedere a tiinei calculatoarelor urmtoarele dou probleme inverse sunt mai importante (i dificile). I. Fiind dat un ir de terminale, aparine el limbajului? II. Fiind dat un ir dintr-un limbaj, cum a fost derivat? Importana problemei I este evident fiind dat un program scris ntr-un limbaj oarecare dorim s determinm dac este scris corect. Nu punem ntrebarea dac programul face ceea ce ar trebui s fac, ci doar dac este valid sau nu. Ceea ce dorim s aflm la acest punct este dac programul este gramatical corect. Sunt toate instruciunile n forma potrivit? Sunt toate ciclurile DO nchise? Se termin toate BEGIN-urle cu END-ul corespunztor? .a.m.d. Examinarea acestui tip de ntrebare este cunoscut sub denumirea de analiz lexical. Problema II este chiar mai important, ea permindu-ne s interpretm nelesul programului i s decidem cum va fi executat. Studierea acestei a doua probleme se numete analiz sintactic (eng. parsing). Vom ilustra aceste dou puncte de vedere n urmtorul exemplu.

Exemplu 1.6. Fie G0 gramatica tuturor expresiilor aritmetice corecte scrise formate din ntregi pozitivi i simbolurile +, *, (, i ). Aceast gramatic are produciile 1. E E + T 2. E T 3. T T * F 4. T F 5. F ( E ) 6. F a

Simbolul a reprezint un ir oarecare de ntregi pozitivi. Fiind dat o propoziie n limbajul L(G0 ) , (5 + 3) * 4 , avem s decidem: I. Este o propoziie valid? II. Ce nseamn propoziia? n II este implicat interpretarea sau evaluarea irului (5 + 3) * 4 . Cnd acest ir va fi introdus, maina ar trebui s tie s ia numerele 5 i 3, s le ncarce n memorie sau n registre, s execute adunarea, s ia rezultatul adunrii i s-l ncarce n locaia potrivit, iar apoi s ncarce numrul 4 i s execute nmulirea final. Toate acestea se produc complet automat; maina fiind programat astfel nct, cnd primete irul (5 + 3) * 4 , toate operaiile anterioare s se realizeaz n ordinea corect. Vom arta n continuare c dac maina este capabil s reproduc arborele de derivare a propoziiei, ea poate intui cum s realizeze cele de mai sus, de exemplu, poate descifra nelesul sau valoare expresiei.

Figura 1.5. Arbore de derivare pentru (5 + 3) * 4 .

ntr-adevr, presupunnd c avem arborele de derivare pentru


(5 + 3) * 4 , ca n figura 1.5., a verifica dac irul aparine limbajului este

simplu: concatenm frunzele arborelui de la stnga la dreapta i verificm dac irul obinut se potrivete, simbol cu simbol, celui iniial. Nu vom discuta cum se memoreaz un astfel de arbore, cum se acceseaz nodurile, etc. Acestea in de implementare i, n particular, pot depinde de aspecte hardware ale mainii. Pretindem c, dat fiind acest arbore de derivare putem determina nelesul irului. Vom rescrie arborele ntr-un mod diferit. Fiecare nod va fi reprezentat printr-o celul X | n : Simbolul X va fi simbolul gramatic al nodului, (terminal, neterminal) iar n specific numrul produciei folosite n obinerea fiilor nodului.

Figura 1.6. Derivarea lui (5 + 3) * 4 .

Dac X este un terminal, de exemplu cnd nodul este frunz, punem n = 0 . Arborele de derivare pentru (5 + 3) * 4 va arta atunci ca n figura 1.6. Se definete o funcie V ( X | n ) = V ( X , n ) pe noduri n felul urmtor:

X if n = 0 V ( LeftChild ( X , n)) + V ( RightChild ( X , n)) if n = 1 V ( X , n) = V (Child ( X , n) if n = 2, 4, sau 6 V ( LeftChild ( X , n)) *V ( RightChild ( X , n)) if n = 3 V ( MiddleChild ( X , n) if n = 5

Funcia V ( X , n) este deci definit pentru acei X i n pentru care X | n poate fi nod ntr-un arbore de derivare a unei expresii aritmetice. Definiiile funciilor LeftChild, RightChild, MiddleChild i Child se subneleg. Dat fiind arborele de derivare a unei expresii, pentru aflarea nelesului sau valorii acesteia, se evalueaz V(Root). n exemplul discutat, vom avea:
V ( Root ) = V ( E , 2) = V (T ,3) = V (T , 4) *V ( F , 6) = V ( F ,5) *V (4, 0) = V ( E ,1) * 4 = (V ( E , 2) + V (T , 4)) * 4 = (V (T , 4) + V ( F , 6)) * 4 = (V ( F , 6) + V (3, 0)) * 4 = (V (5, 0) + 3) * 4 = (V (5, 0) + 3) * 4 = (5 + 3) * 4 = 32

Evident, funcia V va calcula corect valoarea oricrei expresii aritmetice valide, dac cunoate arborele de derivare a expresiei. Funcia V este recursiv, ea se va autoapela la evaluarea unor argumente. S-ar putea ca s nu fie clar cititorului cum se implementeaz, n mod complet automat, pe calculator evaluarea unei astfel de funcii. Acest lucru, ns, poate fi realizat, iar implementarea specific va depinde, la rndul ei, de limbajul i de hardware-ul folosi. Nu intrm n amnuntele acestui subiect. Mai degrab vom studia procesului de reconstruire a arborelui de derivare pentru un ir dat. Motivul introducerii funciei V a fost, de a convinge cititorul c procesul de reconstruire a arborelui de derivare este ntradevr folositor i chiar necesar.

Urmtoarea problem se ridic imediat ce discutm de parsing (de exemplu despre reconstruirea arborelui de derivare): Fiind dat o gramatic G i un ir din limbajul L(G ) , atunci poate avea doi arbori distinci de derivare? Se constat, desigur, c astfel de fenomene exista.

Exemplu 1.7. Fie G gramatica


SA A A0 A |1

Figura 1.7. arat doi arbori de derivare distinci pentru irul = 10101 .

Figura 1.7. Arbori de derivare distinci pentru irul = 10101 .

Aceasta ne conduce la urmtorul concept: Definiia 1.10. O gramatic G se numete ambigu dac exist o propoziie n L(G ) cu doi arbori de derivare distinci. Dac o gramatic nu este ambigu, ea se numete neambigu. Exemplu 1.8. Urmtorul este un exemplu concret relativ la construcia if C1 then C2 else C3 din Pascal sau din alt limbaj de

programare. Un fragment a unei gramatici pentru Pascal care folosete aceast construcie poate fi dat n felul urmtor:
< statement > if < condition > then < statement > | if < condition > then < statement > else < statement > | < other kind of statement >

(1.3)

Dac aceste construcii sunt descrise de gramatica de mai sus, atunci arborele de derivare a unor propoziii nu va fi unic. Considerm urmtoarea propoziie:
if C = 0 then if D = 1 then A := 3 else A := 4

(1.4)

Ea are doi arbori de derivare distinci, ca n figura 1.8. nelesul sau valoarea lui , difer pentru fiecare dintre cei doi arbori. Presupunnd c n timpul execuiei, variabila C are valoarea 1, D=1, A=5 i se ntlnete propoziia . Dac se admite ca arborele de derivare s fie dat de figura 1.8.(a), valoarea A = 5 rmne. Dac, pe de alt parte, se consider arborele din figura 1.8.(b) ca fiind cel corect, valoarea lui A devine 4. Astfel, la compilarea programelor derivate de la o gramatic ambigu, trebuie luat o decizie arbitrar i anume, care dintre arborii de derivare se va folosi, adic, ce neles se atribuie propoziiei. n acest exemplu, este preluat nelesul dat de arborele din figura 1.8.(a). Regula arbitrar aleas, ns fixat, este: Fiecare else se asociaz cu cel mai apropiat then precedent.

(a)

<statement>

if

C=0

then

<statement>

if

D=1

then

A := 3

else

A := 4

(b)

<statement>

if

C=0

then

<statement>

else

A := 4

if

D=1

then

A := 3

Figura 1.8. Ambiguitate pentru if...then...else. Observm c, gramaticile neambigue sunt preferabile celor ambigue. n general, fiind dat o gramatic G, nu exist un algoritm pentru a determina dac ea este ambigua sau nu. Unele gramatici speciale permit ns acest lucru n capitolul 8 vom arta c gramatica expresiilor aritmetice, G0 , este neambigu. Se poate ntmpla, ca pentru o gramatic dat G, care genereaz un limbaj
L(G ) , s existe o alt gramatic diferit care genereaz acelai limbaj,

adic, L(G ') = L(G ) . Urmtorul exemplu arat acest fenomen. Exemplu 1.9. Fie gramatica G
S 0 A0 A S |

i gramatica G '
S 0B B 0S | 0

Este evident c ambele gramatici genereaz acelai limbaj L mulimea tuturor irurilor avnd un numr par de zerouri. Gramaticile la rndul lor, sunt total diferite: G ' este o gramatic regular fr producii vide, iar G nu are nici una din aceste proprieti. Se poate da o gramatic ambigu G i s existe o alt gramatic G ' astfel nct L(G ) = L(G ') . Rescriem gramatica pentru if...then...else din exemplul 1.8. n felul urmtor:
< statement > S1 | S 2 < other kind of sentence > S1 if < condition > then S1 | if < condition > then S2 else S1 | S2 < other kind of sentence > if < condition > then S 2 else S 2 | < other kind of sentence >

(1.5)

Aceast gramatic genereaz aceeai propoziie ca gramatica din exemplul 1.8., dar ambiguitatea a fost nlturat. Aadar, dac propoziia
if C = 0 then if D = 1 then A := 3 else A := 4

este analizat sintactic, nelesul ei se interpreteaz ca


if C = 0 then (if D = 1 then A := 3 else A := 4)

opus lui

if C = 0 then (if D = 1 then A := 3) else A := 4

Definiia 1.11. Un limbaj se numete ambiguu n mod inerent dac orice gramatic care genereaz L este ambigu. Un exemplu de astfel de limbaj este
L = {a k b k c m d n | k , l , m i n 1, cu (k = 1 i m = n) sau (k = n i l = m)} .

iruri

din

sunt

aabbcccddd

(k = l = 2, m = n = 3) i

aabbbcccdd

(k = n = 2, l = m = 3) . A demonstra c acesta este un limbaj ambiguu n mod

inerent, nu face parte din scopul acestei lucrri. 1.4. O INTRODUCERE N PARSING (ANALIZA SINTACTIC) Considerm problema reconstruirii arborelui de derivare pentru o propoziie dat, adic, problema analizei sintactice. ntreaga lucrare se va concentra asupra acestei probleme, actualul paragraf fiind doar partea de introducere. Am putea crede c pentru specificarea arborelui de derivare este de ajuns folosirea secvenei de producii de la derivare. Urmnd aceast idee, n lipsa unor restricii, vor aprea dificulti. n primul rnd, dou secvene diferite de producii pot conduce la acelai arbore. De exemplu, fie gramatica expresiilor aritmetice G0 1. E E + T 2. E T 3. T T * F 4. T F 5. F ( E ) 6. F a

i irul a + a din acest limbaj. Secvenele 1, 2, 4, 6, 4, 6 i 1, 4, 6, 2, 4, 6 sunt diferite i corespund la dou derivri pentru a + a .
1 2 4 6 4 6

E E + T T + T T + F T + a F + a a + a

i
1 4 6 2 4 6

E E + T E + F E + a T + a F + a a + a

Ambele derivri genereaz acelai arbore din figura 1.9.

Figura 1.9. Arbor de derivare pentru a + a .

Poate avea loc i situaia invers: dac nu specificm la fiecare pas care neterminal este nlocuit, aceeai secven de producii poate conduce la arbori de derivare distinci. Pentru a vedea asta considerm gramatica
1. S A 2. A A0 A 3. A 1

Secvena de producii 1, 2, 2, 3, 3, 3 conduce la dou derivri distincte:

S A A0 A A0 A0 A 10 A0 A 1010 A 10101

i
1 2 2 3 3 3

S A A0 A A0 A0 A A0 A01 A0101 10101

(n fiecare form propoziional este subliniat neterminalul care va fi nlocuit.) Arborii de derivare a acelor dou derivri, apar n figura 1.10., ei sunt diferii.

Figura 1.10. Gramatici ambigue.

Aadar, pentru a specifica arborele de derivare prin secvenele de producii folosite, este totodat necesar i specificarea, la fiecare pas, a neterminalului nlocuit. Aceasta este greu de realizat i se observ c nu este necesar deoarece putem specifica dinainte care neterminal va fi ales pentru nlocuire.

Definiia 1.12. Fie G o gramatic, o propoziie n limbajul L(G ) i


S 1 2 ... n =

(1.6)

derivarea lui . Spunem c (1.6) este derivarea la stnga a lui , dac la fiecare pas i i +1 , neterminalul nlocuit din i , este cel mai din stnga. Spunem c (1.6) este derivarea la dreapta dac la fiecare pas nlocuim neterminalul cel mai din dreapta. De exemplu, derivarea la stnga a lui (a + a) * a n G0 (gramatica expresiilor aritmetice din exemplul 1.3.) este
1 3 4 5 1 2

E T T * F F * F ( E ) * F ( E + T ) * F (T + T ) + F ( F + T ) * F (a + T ) * F (a + F ) * F ( a + a ) * F ( a + a ) * a
6 4 6 4 6

Derivarea la dreapta a aceleiai propoziii este atunci


2 3 6 4 5 1

E T T * F T * a F * a ( E ) * a ( E + T ) * a ( E + F ) * a ( E + a ) * a (T + a) * a ( F + a ) * a (a + a ) * a
1 4 4 6 4

Astfel, dac tim de dinainte ce fel de derivare se folosete (la stnga sau la dreapta), secvena de producii din derivarea unei propoziii va descrie complet arborul de derivare.

Definiia 1.13. O analiz la stnga a unui ir este secvena de producii folosit n derivare la stnga a lui . O analiz la dreapta a lui
este inversa secvenei de producii folosite n derivarea la stnga a lui .

Motivul folosirii inversei din definiia analizei la dreapta va fi, pe scurt, discutat n aceast parte i detaliat n capitolul 8. Astfel, analiza la stnga pentru (a + a) * a este: 2, 3, 4, 5, 1, 2, 4, 6, 4, 6, 6. Analiza la dreapta a aceluiai ir va fi: 6, 4, 2, 6, 4, 1, 5, 4, 6, 3, 2. Putem vorbi de o analiz la stnga i la dreapta a oricrei forme propoziionale derivate din simbolul de start S. De exemplu, analiza la stnga pentru a *( E ) n gramatica G0 este 2, 3, 4, 6, 5, deoarece

E T T * F F * F a * F a *( E )

Toate acestea nu ne dau o metode de determinare a analizei (la stnga sau la dreapta) a unui ir. Fiind dat un ir de terminale = a1a2 ...an , singurul lucru pe care-l tim despre arborele lui de derivare este, c are simbolul S n vrf iar frunzele din partea de jos formeaz irul a1a2 ...an :

Figura 1.11. Arborul de derivare pentru a1a2 ...an .

Exist dou posibiliti de a popula interiorul arborelui: una este de a-l reconstrui de sus n jos (eng. top-down) iar cealalt de jos n sus (eng. bottom-up). n schema de analiz top-down, pornim cu neterminalul S i ncercm s descoperim prima producie S 1 care garanteaz o derivarea a lui a1a2 ...an de forma
S 1 L a1a2 ...an .

Odat ce a fost determinat, avem de examinat irul 1 i de descoperit care din neterminalele sale, fie acesta A, trebuie nlocuit cu partea dreapt a produciei A , producnd astfel forma propoziional 2 n derivarea
S 1 2 L a1a2 ...an .

Procedura se repet pn cnd ntreaga derivare este reconstruit. Dac ne limitm la derivarea la stnga, de exemplu, la fiecare pas vrem s aflm neterminalul cel mai din stnga care va fi nlocuit, dintr-o form propoziional , exist o modalitate foarte bun pentru efectuarea acestei alegeri avansate. Ea va fi prezentat n capitolul 6. n schema de analiz bottom-up, procesul este invers: ncepnd cu irul a1a2 ...an , ncercm s gsim o form propoziional k astfel nct derivarea lui a1a2 ...an s aib forma
S L k a1a2 ...an .

Pentru aceasta, trebuie s localizm un subir din a1a2 ...an care corespunde prii drepte a unei producii A i s nlocuim acest cu A. (Un astfel de subir se numete referin (eng. handle)). n continuare repetm procedura cu irul k n loc de a1a2 ...an . Continum pn cnd ajungem la S. Nu reiese limpede cum se obine aceasta, dar este posibil, dac ne limitm la construirea derivrii la stnga. Vom explica acest proces n capitolul 8. Aa se explica de ce analiza la dreapta a fost definit ca fiind inversul secvenei de producii folosite n derivarea la stnga a irului: n analiza bottom-up determinm mai nti ultima producie folosit n derivare, iar apoi penultima .a.m.d. PROBLEME 1. Fie G0 limbajul expresiilor algebrice din exemplul 1.3. Dai arborele de derivare, analiza la stnga i la dreapta a urmtoarelor iruri: a) a + a + a b) (a + a) * a + a *(a + a) c) a * a * a + a * a

Dai n problemele 2 12 o gramatic independent de context care descrie limbajul dat i un arbore de derivare pentru irul 0 indicat. 2. Toate irurile {0,1}* avnd un subir 001; 0 = 01001110 . 3. Toate irurile {0,1}* de lungime impar; 0 = 0011011 . 4. L = {a m+ nb m d n | m 0, n 0} 0 = aaaabccc . 5. L = {a mb n |1 n m 2n} ; 0 = aaabb . 6. L = {a mb n | 2 2n m 3n} ; 0 = aaaabb .

7. Mulimea tuturor irurilor peste = {0, 1} de lungime impar;


0 = 0010111 .

8. Mulimea tuturor irurilor peste = {a, b} n care numrul de a-uri este egal cu numrul de b-uri; 0 = abbaaabb . 9. Mulimea tuturor irurilor peste = {a, b} n care este un a mai mult dect b-uri; 0 = aabbbaa . 10. Mulimea irurilor peste = {0, 1} n care 1 apare cep puin de 3 ori;
0 = 001101 .

11. Mulimea irurilor peste = {a, b} n care primul simbol este diferit de ultimul simbol; 0 = aababab . 12. Mulimea tuturor datelor valide pentru anul 1900 pn 1999 dat sub forma NOIEMBRIE 30, 1941. Observm c anul 1900 nu a fost un an bisect deci nu a existat un FEBRUARIE 29 n 1900;
0 = OCTOMBRIE 30, 1941 .

n problemele 13 15, descriei limbajul generat de gramatica dat. 13. S aaSb | A , A cAdd | cd 14. S ASBB | AB , A aA | b , B Bc | d 15. S aSb | aSbb | aSbbb | ab Fiecare gramatic din problemele 16 21 este ambigu. Gsii pentru aceste gramatici o propoziie cu doi arbori distinci de derivare. 16. S SaSa | b 17. S aSb | Sb | Sa | a 18. S aaS | aaaS | a

19. S aS | aSb | A , A Aa | a 20. S AA , A AAA | a | bA | Ab 21. S AaA , A aA | bA | 22. Artai c fiecare gramatic stng liniar are i o gramatic drept liniar, i reciproc. 23. Un fragment al gramatici corespunztoare construciilor if...then...else, dat n (1.3), a fost ambiguu, propoziia (1.4) avnd, ca n figura 1.8., doi arbori distinci de derivare. Acest fragment a fost rescris n (1.5) astfel nct propoziia (1.4) s aib arborele de derivare dat de figura 1.8.(a). Rescriei gramatica din (1.3) astfel nct propoziia (1.4) s aib un unic arbore de derivare dat de figura 1.8.(b).

CAPITOLUL II. MAINI CU STRI FINITE n acest capitol introducem conceptul de main cu stri finite, numit i automat finit. Aceste dispozitive matematice i au originea n modelarea comportamentului circuitelor electronice secveniale; utilizarea i aplicarea lor este mult mai larg. Ele pot fi vzute ca cel mai simplu model de algoritm sau a unui analizator de limbaj sau chiar a unui calculator. Dispozitive mai sofisticate cum sunt automatele pushdown, sau mainile Turing, pot fi vzute ca maini cu stri finite cu numeroase clopoei i zurgli ataate lor. Teoria automatelor finite este destul de simpl pentru a motiva o ptrunde mai adnc n studiul acestor modele avansate. 2.1. DEFINIII Considerm conceptul matematic de main cu stri finite (MSF), sau automat finit (AF). Mai nti acordm atenie mainilor cu stri finite deterministe (MSFD). Aceste maini se compun dintr-un numr finit de stri i un dispozitiv de intrare, care citete simboluri, unul cte unul (de la stnga la dreapta), dintr-un ir de caractere de intrare. Dac maina se afl ntr-o stare Q i simbolul de intrare este x, ea i schimb starea (sau se mic) n starea (Q, x) . Apoi citete urmtorul simbol de intrare din dreapta iar procesul se repet. Maina se iniializeaz ntr-o stare iniial
Q0 , iar primul simbol din irul citit este cel mai din stnga simbol a

acestui ir. Regula (Q, x) care descrie urmtoarea stare se numete funcie de tranziie. Ea depinde doar de starea curent Q i de simbolul curent x, deci este complet independent de micrile i intrrile

anterioare. Maina se oprete dup ce a citit toate simbolurile irului de intrare. Unele variante ale conceptului de main admit ca funcia (Q, x) s nu fie definit pentru unele stri Q sau simboluri x. n acest caz, maina se va opri i cnd ajunge ntr-o configuraie pentru care (Q, x) nu este definit. nainte de a da definiie formal vom parcurge cteva exemple. Exemplu 2.1. Se presupune c maina M are patru stri: Q0 , Q1 , Q2 i Q3 . irurile de intrare admise sunt formate din simbolurile a, b i c. Fie
Q0 starea iniial i funcia de tranziie dat de tabela din figura 2.1.

Input curent a S Q0 t r i
Q3 Q3 Q1 Q0 Q1 Q2 Q1 Q0 Q3

B
Q2 Q0 Q1

c
Q0 Q3 Q2

Figura 2.1. Tabelul funciei de tranziie. Maina poate fi reprezentat, n mod autoexplicativ, prin aa numita diagram de stare sau diagram de tranziie corespunztoare din figura 2.2. Sgeata indic c Q0 este starea iniial. Observm c n unele cazuri maina rmne n aceeai stare, de exemplu (Q3 , a) = Q3 . Aadar, dac maina se afl n starea Q3 i simbolul de intrare este a, maina rmne n starea Q3 i urmtorul simbol va fi citit. Dac input-ul

mainii este aacbbca, maina va trece prin urmtoarea secven de micri:

Q0 Q1 Q0 Q0 Q2 Q1 Q3 Q3

Aici Qi Q j nseamn trecerea mainii din starea Qi n Q j citind input-ul x, (Qi , x) = Q j . Dup ce a fost citit irul de intrare maina se afl n starea
Q3 .

Maini cu stri finite sunt folosite pentru recunoaterea sau acceptarea diferitelor tipuri de iruri i respingerea altora, n funcie de starea mainii dup citirea irului. Pentru o main cu stri finite M dat, stabilim unele din stri drept acceptate sau finale. Cnd un ir
= x1 x2 ...xn este introdus n main, ea va executa secvena de micri

descris mai sus (ncepnd cu starea iniial Q0 i simbolul x1 ). Dup citirea simbolul xn , aflm starea n care se oprete maina M.

Figura 2.2. Diagram de tranziie.

Dac starea curent este o stare acceptat, vom spune c M accept , n caz contrar M nu accept . n diagrama de tranziie pentru M marcm strile acceptate cu un cerc dublu.

Figura 2.3. Stare acceptat Q.

Starea iniial poate fi o stare acceptat. O main n care aa ceva are loc va accepta irul vid . (Poate accepta i alte iruri.) Exemplu 2.2. Construim o main M care accept iruri de simboluri 0 i 1 cu un numr par de 1-uri (i nimic alt ceva). Diagrama de tranziie a mainii este dat n figura 2.4. Aadar, dac avem ca input
1 = 01001011 secvena de micri este:

Q0 Q0 Q1 Q1 Q1 Q0 Q0 Q1 Q0

Maina se oprete in starea acceptat Q0 , astfel 1 este acceptat de M. Pe de alt parte, dac input-ul este 2 = 01101 secvena de micri va fi

Q0 Q0 Q1 Q0 Q0 Q1 .

Starea Q1 n care se oprete maina, nu este o stare acceptat i ca urmare irul 2 nu este acceptat de M.

Figura 2.4. Diagrama de tranziie a unui automat finit.

ir de intrare Cap de citire


Input curent xk Stare curent Q j

Figura 2.5. Reprezentare schematic a unei maini cu stri finite.

Figura 2.5. arat o reprezentare schematic a mainii cu stri finite. Capul de citire se mic numai la dreapta; sgeata spre simbolul Q j indic starea curent. Definiia formal a unei maini cu stri finite este: Definiia 2.1. O main cu stri finite se compune din urmtoarele obiecte: 1. O mulime finit, nevid Q = {Q0 , Q1 , K , Qn } . Elementele Q din Q se numesc stri; 2. O mulime finit, nevid = {a1 , a2 , K , ak } de simboluri admise n irul de intrare. Mulimea se numete alfabetul de intrare pentru M; 3. O stare desemnat Q0 Q , denumit stare iniial; 4. O funcie de tranziie (Q, a) definit pentru toi Q Q i a . Valoarea funciei (Q, a) este o stare din Q, : Q Q . 5. O mulime nevid F de stri din Q. Elementele din F se numesc stri finale sau acceptate. O main cu stri finite M va atunci un cvintet M = {Q, , Q0 , , F} . Pentru maina din exemplul 2.2. avem Q = {Q0 , Q1} , = {0, 1} ,
Q0 = Q0 i este dat prin (Q0 , 0) = (Q1 , 1) = Q0 , (Q0 , 1) = (Q1 , 0) = Q1 . n

literatura de specialitate exist doar mici variaii ale acestei definiii. Uneori nu este necesar ca funcia de tranziie (Q, x) s fie definit pentru toi Q i x; de asemenea mulimea strilor acceptate poate fi vid.

ir de intrare

Figura 2.6. Main cu stri finite n configuraia Q, ak ak +1 K am .

Pentru a simplifica descrierea micrilor mainii, introducem conceptul de configuraie. O configuraie a unei maini M este o pereche
Q, , unde Q este starea i = ak ak +1 K am este partea irului de intrare

care se afl la dreapta i sub capului de citire, vezi figura 2.6. Dac maina M se afl n configuraia
Q, ak ak +1 K am i (Q, ak ) = Q ,

urmtoarea configuraia a mainii M este aceasta micare i o vom nota n felul urmtor:

Q, ak +1ak + 2 K am . Numim

Q, ak ak +1 K am Q, ak +1ak + 2 K am

Cnd irul de intrare este vid, de exemplu dup citirea ntregului ir, configuraia mainii M este Q, , unde ia locul irului vid. Ca urmare, micarea mainii din exemplul 2.2. cu input-ul 01101 este descris de urmtoarea secven de configuraii:

Q0 , 01101 Q0 , 1101 Q1 , 101 Q0 , 01 Q0 , 1 Q1 ,

Dac pentru o anumit secven de configuraii avem secvena de micri

Q1 , 1 Q2 , 2 L Q p , p

vom nota aceasta


Q1 , 1 Q p , p
*

i o numim tranziie. Exemplu 2.3. Maina M are ca alfabet mulimea = {0, 1, 2} . Fie input-ul pentru M numerele ntregii nenegativi exprimai n notaie ternar (n baza 3). Astfel, irul 1 2 K n reprezint numrul

x = n + n1 3 + n 2 32 + L 1 3n 1 .

Maina va accepta un ir 1 2 K n dac i numai dac numrul corespunztor lui x este par. Va accepta 121 ( = 1 + 2*3 + 1*9 = 16 , n baza 10) ns nu i 210 ( = 0 + 1*3 + 2*9 = 21 , n baza 10). Comportamentul mainii corespunde urmtoarei reguli de paritate a numerelor exprimate n notaie ternar: dac

x = n + n1 3 + n 2 32 + L 1 3n 1

(2.1)

atunci x este par, dac i numai dac 1 + 2 + L + n este par. Pentru a vedea aceasta, presupunem c x este dat de (2.1). mprirea cu 2 a puterilor lui 3, d restul 1. Astfel, cnd mprim x cu 2, fiecare termen
k 3n k va contribui cu k la rest. Demonstraia formal se poate da cu

ajutorul congruenelor. Maina M corespunde atunci diagramei din figura 2.7.

Figura 2.7. Divizibilitatea cu 2.

Funcia de tranziie este dat astfel nct (Qi , ) = Q j , unde j este restul obinut n urma mpririi lui i + la 2 ( j i + (mod 2) ). Cu input-ul de forma = 121 maina trece prin secvena de configuraii

Q0 , 121 Q1 , 21 Q1 , 1 Q0 ,

i pentru = 1122 micrile sunt

Q0 , 1122 Q1 , 122 Q0 , 22 Q0 , 2 Q0 , .

2.2. DESCRIEREA UNUI LIMBAJ CU AJUTORUL MAINILOR Conceptul de main cu stri finite permite o nou metod de descriere a limbajelor. Fie M o main cu stri finite avnd alfabetul . Definim limbajul L( M ) generat de M ca mulimea irurilor de elemente din acceptate de M. Cu alte cuvinte, un ir = x1 x2 K xn din * va fi n
L( M ) dac i numai dac maina M, pornit cu input-ul , se va opri

ntr-o stare acceptat. Formal avem: Definiia 2.2. Fie M = {Q, , Q0 , , F} o main cu stri finite. Limbajul L( M ) generat (recunoscut sau acceptat) de M este definit ca

L( M ) = * | Q0 , Q, unde Q F .

Descriere de mai sus a unui limbaj este foarte convenabil. Maini cu stri finite por fi uor simulate pe calculator, de fapt, ele pot fi uor implementate i n componente hardware. Astfel, dat fiind un limbaj L pentru care se poate construi o main cu stri finite, atunci, s-a obinut, de fapt, un analizator automat pentru L. n mod firesc apare urmtoarea ntrebare: Fiind dat o gramatic G, putem construi o main cu stri finite M astfel nct L(G ) = L( M ) ? Din nefericire (sau din fericire, n funcie de punctul de vedere), acest lucru este posibil doar pentru un tip special de gramatici gramaticile regulare. Reamintim c G este regular dac este liniar la dreapta (produciile sunt de forma A aB , A a sau

S ) sau liniar la stnga (produciile sunt de forma A Ba , A a sau S ). Avem urmtorul rezultat.

Teorema 2.1. Fie L un limbaj. Exist o main cu stri finite M astfel nct L = L( M ) dac i numai dac exist o gramatic regular G astfel ca L = L(G ) . n cele ce urmeaz vom demonstra doar suficiena. Fiind dat o main cu stri finite M, construim o gramatic regular G astfel nct
L( M ) = L(G ) .

Pentru

avem:

strile

Q0 , Q1 , K , Qn ,

alfabetul

= {a1 , a2 , K , ak } , funcia de tranziie (Q, a ) , starea iniial Q0 i F

mulimea strilor finale. Gramatica G este construit astfel: 1. Alfabetul (mulimea de terminale) este = {a1 , a2 , K , ak } . 2. Mulimea neterminalelor este mulimea simbolurilor din Q ( N = Q ). 3. Simbolul de start n G este Q0 starea iniial a lui M. 4. Produciile din G sunt formate dup urmtoarele reguli: I. Pentru fiecare tranziie (Qi , a) = Q j , unde Q j nu este o stare final, folosim producia Qi aQ j . II. Pentru fiecare tranziie (Qi , a) = Q j , unde Q j este o stare final, folosim produciile Qi aQ j i Qi a . III. Dac Q0 este a stare final, folosim producia Q0 .

Evident gramatic obinut este regular (liniar la stnga).

Exemplu 2.4. Fie M definit de diagrama din figura 2.8. Gramatica corespunztoare G este construit astfel:
1. Q0 bQ0 2. Q0 b 3. Q0 aQ0 4. Q0 5. Q1 aQ0 6. Q1 a 7. Q1 bQ2 8. Q1 b 9. Q2 aQ1 10. Q2 bQ0 11. Q2 b

Regula II. Q0 Q0 Regula I. Q0 Q1 Regula III. Q0 F Regula II. Q1 Q0 Regula II. Q1 Q2 Regula I. Q2 Q1 Regula II. Q2 Q0
b a b q a

Stare iniial Q0 Stri acceptate Q0 i Q1

Figura 2.8. Gramatic pentru o main cu stri finite. Demonstraia pentru L( M ) = L(G ) este imediat. Presupunem c un ir = x1 x2 K x p este acceptat de main. Secvena de configuraii pentru M va fi

Q0 , x1 x2 K x p Q1 , x2 x3 K x p Q2 , x3 x4 K x p Qi , xi +1 xi + 2 K x p Qi +1 , xi + 2 K x p Q p 1 , x p Q p ,
* *

(2.2)

unde x j , Q j Q i Qp F . Tranziiile corespund funcie de tranziie din

(2.3).

(Q0 , x1 ) = Q1 , (Q1 , x2 ) = Q2 , K , (Q , x ) = Q , K , (Q , x ) = Q
i i +1 i +1 p 1 p

(2.3)
p

Prin urmare, gramatica G include (printre altele) urmtoarele producii:

Q0 x1Q1 , Q1 x2Q2 , K , Qi xi +1Qi +1 , K , Q p 1 x p Q p , Q p 1 x p

(2.4)

Ultima producie este inclus deoarece Q p este o stare final. Deci, irul

= x1 x2 K x p poate fi derivat n gramatica G astfel

Q0 x1Q1 x1 x2Q2 K x1 x2 K xi Qi x1 x2 K xi xi +1Qi +1 x1 x2 K x p 1Q p 1 x1 x2 K x p 1 x p

(2.5)

n toate derivrile, cu excepia ultimei, am folosit producii de forma


Qi xi +1Qi +1 ; n ultima ns am folosit producia Q p 1 x p . Inversa se

demonstreaz n mod analog: Presupunem c derivarea unei propoziii


x1 x2 K x p n gramatica G este dat de (2.5). Aceasta implic c toate

produciile din (2.4) sunt producii n G, deci funcia de tranziie satisface relaiile (2.3) ceea ce implic, n final, c maina M trece prin secvena de configuraii (2.3), x1 x2 K x p L( M ) . Prin urmare, suficiena teoreme 2.1. este demonstrat. Ca exemplu, considerm maina M i gramatica G din exemplul 2.4. irul = abaab aparine limbajului L( M ) ntruct

Q0 , abaab Q1 , baab Q2 , aab Q1 , ab Q0 , b Q0 ,

i Q0 este o stare final. Derivarea lui n gramatica G este atunci

Q0 aQ1 abQ2 abaQ1 abaaQ0 abaab .

Numrul produciei folosite este indicat deasupra sgeilor. Un mic comentariu merit s fie fcut asupra acceptrii irului vid
de o main cu stri finite M. Cnd un astfel de ir este prezentat

mainii, ea pornete din configuraia (Q0 , ) , unde Q0 este starea iniial, i se oprete fr s fi fac nici o singur micare. Deci, L( M ) dac i numai dac starea iniial Q0 este o stare final. 2.3. MAINI CU STRI FINITE NEDETERMINISTE Demonstraia necesitii teoremei 2.1. este imediat. Dat fiind o gramatic G, construim o main cu stri finite M care accept L(G ) , punnd neterminalele s joace rolul strilor i incluznd tranziia A B
a

( ( A, a) = B ) pentru fiecare producie de forma A aB . Cu toate acestea, dup cum arat exemplul urmtor, ideea nu aduce rezultatul dorit. Fie G gramatica
S aA S bB A aB A aS . Bb

Dac ncercm s construim maina potrivit schemei indicate, apar dou dificulti. Mai nti, ce ar trebui s fi ( B, a) ? Nu exist o producie de forma B aX pentru nici un neterminal X. Dup cum vom vedea mai trziu, acesta este doar un mic inconvenient care poate fi eliminat. O problem cu mult mai serioas apare la produciile A aB sau A aS . n ncercarea construirii mainii M ne lovim de dilema definirii lui ( A, a) , de pild, ce e de fcut cnd M se afl n starea A i citete simbolul a. Producia A aB implic ca urmtoarea stare ( A, a) s fie B, n timp ce
A aS sugereaz s fie S. Aadar, fragmentul diagramei de descriere a M

va arta ca n figura 2.9.

Figura 2.9. Diagram de tranziie la ambiguitate. La definirea mainii cu stri finite n definiia 2.1., s-a precizat c (Q, x) a fost definit pentru fiecare stare Q n parte i orice simbol de intrare x, iar cunoscnd Q i x, tim starea urmtoare, de exemplu, valoarea funcie de tranziie (Q, x) a fost unic definit. Maina nu a fost lsat s fac nici o alt alegere. O modalitate de ieire din acest impas este de a

extinde definiia unei maini cu stri finite, permind includerea particularitilor descrise mai sus. Astfel de dispozitive vor fi numite automate finite nedeterministe (AFN) sau maini cu stri finite nedeterministe (MSFN). Se observ, c dat fiind o main de acest gen, M, exist un automat finit determinist obinuit (definit ca n definiia 2.1.) care accept acelai limbaj ca M. n continuare vom descrie detaliat acest concept. Definiia 2.3. O main cu stri finite nedeterminist (MSFN) se compune din urmtoarele cinci obiecte: 1. O mulime finit, nevid Q = {Q0 , Q1 , K , Qn } de stri. 2. O mulime finit, nevid = {a1 , a2 , K , ak } de simboluri de intrare admise (alfabetul). 3. O stare desemnat Q0 Q , numit stare iniial. 4. O funcie de tranziie (Q, x) , care nu trebuie definit pentru toi Q din Q i x din . Pentru acei Q i x pentru care este definit,
(Q, x) desemneaz o mulime de una sau mai multe stri din Q.

Concret, dac (Q) este mulimea tuturor submulimilor din Q, atunci funcia de tranziie este : Q (Q) . Cu aceast notaie, (Q, x) nu e definit nseamn (Q, x) = (mulimea vid). Funcia se interpreteaz la fel ca n cazul determinist: starea urmtoare. Diferena este doar, c admite mai multe posibiliti (sau nici una). 5. O mulime nevid F de stri. Elementele din F se numesc stri acceptate sau finale.

Aceste maini M vor fi notate {Q, , Q0 , , F} (ca mainile deterministe) i se mai numesc automate finite nedeterministe (AFN). Aadar, totul e la fel ca n cazul determinist, cu excepia definirii funcie de tranziie . Micrile unui MSFN sunt date n felul urmtor. 1. Fiind dat un ir = x1 x2 K x p de simboluri de intrare din , configuraia iniial va fi Q0 , x1 x2 K x p , unde M este n starea iniial Q0 cu simbolul de intrare x1 . 2. Presupunem c la un moment dat, configuraia M este
Q, xi xi +1 K x p . Dac Q este una din valorile posibile ale lui (Q, xi ) (mai exact, Q (Q, xi ) ) atunci M poate trece n configuraia Q, xi +1 K x p . Deci, dac M se afl n starea Q i

simbolul de intrare este x, M poate trece n orice stare din


(Q, xi ) , dar nu n alta. Cnd (Q, xi ) = nu se va face nici o

micare. Trecerea, dac e posibil, de la o configuraie la alta, se numete micare legal i este notat prin

Q, xi xi +1 K x p Q, xi +1 K x p .

3. Maina se oprete dac a citit ntregul input (n configuraia


Q, ) sau cnd (Q, xi ) = ( (Q, xi ) nu conine posibiliti

pentru urmtoarea starea). Exemplu 2.5. Fie M o MSFN dup cum urmeaz. Mulimea strilor Q are patru elemente: Q = {Q0 , Q1 , Q2 , Q3} , alfabetul = {1, 2, 3} , starea iniial este Q0 i mulimea strilor finale F = {Q2 , Q3 ,} .

Input curent 0 S Q0 t r i
Q3 {Q2 } {Q1 , Q3} {Q3 } Q1 Q2 {Q0 , Q1} {Q2 }

1
{Q0 } {Q2 } {Q0 , Q3}

2
{Q0 , Q3}

Figura 2.10. O funcie de tranziie nedeterminist .

Figura 2.11. O MSFN. Funcia de tranziie este dat de tabelul din figura 2.10., sau de diagrama din figura 2.11. Astfel, dac maina se afl n starea Q1 i simbolul de intrare este 2, M poate trece n strile Q0 sau Q3 . Ca urmare, dat fiind un input , maina M poate trece prin diferite secvene de micri. De

exemplu, pentru urmtoarele:

= 01021

unele dintre micrile posibile sunt

Q0 , 01021 Q0 , 1021 Q0 , 021 Q1 , 21 Q3 , 1 Q1 , stop Q0 , 01021 Q0 , 1021 Q0 , 021 Q0 , 21 stop Q0 , 01021 Q1 , 1021 Q2 , 021 Q2 , 21 stop Q0 , 01021 Q0 , 1021 Q0 , 021 Q1 , 21 Q3 , 1 Q3 , stop

n prima secven, input-ul este citit n ntregime dar maina se oprete ntr-o stare neacceptat; n a doua i a treia secven, M se oprete nainte ca irul s fie citit n ntregime; i n a patra secven, ntregul ir este citit iar ultima stare este o stare acceptat.
Dac Q, i Q, sunt dou configuraii, astfel nct M poate trece din Q, n Q, printr-o secven de micri admise, spunem c Q, este derivabil din Q,

i notm aceasta

Q, Q, .

n exemplul 2.5. avem Q0 , 01021 Q1 , 21 i Q0 , 01021 Q3 , . Putem defini acum un limbaj generat (acceptat, recunoscut) de o main cu stri finite nedeterminist. Definiia 2.4. Fie M = {Q, , Q0 , , F} o MSFN. Spunem c un ir
= x1 x2 K x p de elemente din este acceptat de M dac

Q0 , x1 x2 K x p Q,

i Q F . Mulimea irurilor acceptate de M se noteaz L( M ) i se numete limbaj generat de M. Observm, c pentru ca un ir s fie acceptat de M, avem nevoie doar de o secven legal de micri din Q0 , n Q, , unde Q este o stare acceptat; nu toate secvenele legale vor fi folosite aici. n exemplul 2.5. Q0 , 01021 Q3 , , deci = 01021 este n L( M ) deoarece Q3 este o stare acceptat. Chiar dac maina pornete n configuraia Q0 , 01021 , ea poate ajunge
* *

mai

multe

impasuri:

Q0 , 01021 Q0 , 21 ,

Q0 , 01021 Q2 , 21 , etc.

Evident, c mainile cu stri finite din definiia 2.1. sunt cazuri particulare ale mainilor nedeterministe. Ele se caracterizate prin faptul c pentru fiecare stare Q i pentru fiecare input x mulimea (Q, x) este format dintr-o singur stare. Din acest motiv e de ateptat ca clasa limbajelor acceptate de maini nedeterministe s fie mai mare dect clasa acceptat de mainile deterministe, de exemplu, s existe o MSFN M, astfel nct pentru nici o main determinist K s avem L( M ) = L( K ) . Surprinztor, acesta nu va fi cazul. Avem urmtoarea teorem. Teorema 2.2. Fie M o main cu stri finite nedeterminist. Atunci exist o main determinist K astfel nct L( M ) = L( K ) ; mainile M i K accept acelai ir.

Demonstraie. Lum o main cu stri finite nedeterminist M, de genul celei specificate n definiia 2.3. Fie Q = {Q0 , Q1 , K , Qn } o mulime de stri din M, cu Q0 starea iniial, = {a1 , a2 , K , ak } alfabetul, funcia de tranziie i F mulimea strilor acceptate. Maina K se specific astfel: 1. Alfabetul de intrare pentru K este acelai ca la M. 2. Strile din K vor fi toate submulimile posibile din Q. De exemplu, dac M are trei stri Q0 , Q1 i Q2 strile din K vor fi
S0 = {Q0 } , S1 = {Q1} , S 2 = {Q2 } , S3 = {Q0 , Q1} , S 4 = {Q0 , Q2 } ,

S5 = {Q1 , Q2 } , S6 = {Q0 , Q1 , Q2 } i S7 = mulimea vid. (Se

include mulimea vid ca submulime a fiecrei mulimi.) Astfel, dac M are n stri maina K va avea 2n stri:
S0 , S1 , S2 , K , S 2n 1 . Mulimea strilor din K se noteaz cu S.

3. K are starea iniial S0 = {Q0 } , unde Q0 este starea iniial din M. 4. O stare S S va fi stare final n K dac i numai dac conine o stare final Q F din M. De exemplu, considernd M maina din exemplul 2.5., strile finale pentru K vor fi mulimi care conin
Q2 sau Q3 (sau ambele). Acestea sunt {Q2 } , {Q3 } , {Q0 , Q2 } , {Q0 , Q3} , {Q1 , Q2 } , {Q1 , Q3} , {Q2 , Q3} , {Q0 , Q1 , Q2 } , {Q0 , Q1 , Q3} , {Q0 , Q2 , Q3} , {Q1 , Q2 , Q3} i {Q0 , Q1 , Q2 , Q3} n numr de .

5. Funcia de tranziie pentru K este definit n felul urmtor. Fie S = {Qi , Qi , K , Qi } o stare din K i x . Valoarea ( S , x)
1 2 p

corespunde altei stare din K, de exemplu, o mulime de Q-uri definite dup regula: Dac Q (Q j , x) pentru uni Q j din S, atunci Q ( S , x)

Formal avem

( S , x) =

QS

U (Q, x)

(2.6)

Cu alte cuvinte, dac pentru uni Q j din S maina M poate trece la input-ul x din starea Q j n Q, atunci Q ( S , x) . O nedeterminare apare cnd S = (mulimea vid, care este o stare din K). Formal, aceasta nu reprezint o problem, deoarece formule (2.6) ne d n acest caz (, x) = oricare ar fi x (o reuniune de mulimi vide este vid). Astfel, maina K e complet definit i evident determinist: Pentru fiecare stare S din K i fiecare simbol de intrare x, funcia ( S , x) definete n mod unic alt stare pentru K. nainte de a trece la a demonstra c ambele maini accept acelai limbaj, s vedem, ca exemplu, cum construim K. Exemplu 2.6. Fie M maina din exemplul 2.5. Maina determinist corespunztoare K are 16 ( = 24 ) stri:
S0 = {Q0 } , S1 = {Q1} , S 2 = {Q2 } , S3 = {Q3} , S 4 = {Q0 , Q1} , S5 = {Q0 , Q2 } , S6 = {Q0 , Q3} , S7 = {Q1 , Q2 } , S8 = {Q1 , Q3 } , S9 = {Q2 , Q3} , S10 = {Q0 , Q1 , Q2 } , S11 = {Q0 , Q1 , Q3 } , S12 = {Q0 , Q2 , Q3} , S13 = {Q1 , Q2 , Q3} , S14 = {Q0 , Q1 , Q2 , Q3} i S15 = .

Starea iniial este S0 = {Q0 } i strile acceptate sunt S2 , S3 , S5 , S6 , S7 , S8 ,


S9 , S10 , S11 , S12 , S13 i S14 , acei S care conin Q2 i/sau Q3 strile finale

din M. S calculm unele valori ale funcie de tranziie . Considerm ca exemplu ( S5 , 1) . Deoarece S5 = {Q0 , Q2 } i (Q0 , 1) = {Q0 } ,
(Q2 , 1) = {Q0 , Q3} ,

atunci

( S5 , 1) = (Q0 , 1) (Q2 , 1) = {Q0 } {Q0 , Q3 } = {Q0 , Q3 } = S6 , deci ( S5 , 1) = S6 .

Analog,

pentru De

S7 = {Q1 , Q2 } ,

( S7 , 0) = (Q1 , 0) (Q2 , 0) = {Q2 } = {Q2 } = S 2 .

asemenea,
x = 0, 1, 2 .

( S0 , 2) = (Q0 , 2) = = S12 . Prin urmare ( S15 , x) = S15 pentru

Descrierea complet a funcie de tranziie este dat n tabelul din figura 2.12. Maina K are propria diagram de tranziie, dar imaginea ei este prea complex. Aruncnd o privire asupra tabelei funciei , se observ c K are mai multe stri dect sunt necesare. De pild, starea S7 nu poate fi atins din starea iniial S0 . De altfel, ea nu poate fi atins din nici o stare. Aadar, putem nltura starea S7 iar maina va accepta acelai ir. Vom discuta, pe scurt, problema obinerii unei MSF pe ct posibil de mic. Ceea ce ncercm s artm acum este, c dat fiind o MSF nedeterminist, exist o MSF determinist care accept exact acelai ir; nu ncercm s gsim cea mai eficient main de acest gen.

Input x
S0 = {Q0 } S1 = {Q1} S 2 = {Q2 } S3 = {Q3} S 4 = {Q0 , Q1} S5 = {Q0 , Q2 } S4 S15 S2 S2 S4 S10 S10 S2 S2 S2 S10 S10 S10 S2 S10 S15 S0 S2 S6 S3 S5 S5 S11 S12 S13 S11 S12 S14 S11 S14 S14 S15 S15 S6 S15 S3 S6 S15 S3 S6 S6 S3 S6 S6 S3 S6 S6 S15

S t r i

S6 = {Q0 , Q3} S7 = {Q1 , Q2 } S8 = {Q1 , Q3 } S9 = {Q2 , Q3} S10 = {Q0 , Q1 , Q2 } S11 = {Q0 , Q1 , Q3 } S12 = {Q0 , Q2 , Q3} S13 = {Q1 , Q2 , Q3} S14 = {Q0 , Q1 , Q2 , Q3} S15 =

Figura 2.12. Tabela funcie de tranziie . Ne ntoarcem la a demonstra c L( K ) = L( M ) . Presupunem c un ir


= x1 , x2 , K , x p este acceptat de M. Aceasta nseamn c pentru o secven
de stri Q0 , Q1 , Q2 , K , Q p secvena de micri

Q0 = Q0 Q1 Q2 L Qi Qi +1 L Q p 1 Q p

x1

x2

xi +1

xp

(2.7)

este legal, iar Q p este o stare acceptat din M. Rezult c pentru fiecare i = 0, 1, 2, ..., p 1 , funcia de tranziie satisface

Qi +1 (Qi , xi +1 ), i = 0, 1, ..., p 1

(2.8)

Cnd irul este introdus n maina K, maina execut urmtoarea secven de micri:

S0 = S0 S1 S2 L Si Si +1 L S p 1 S p

x1

x2

xi +1

xp

(2.9)

Pentru i = 0 n (2.8), Q1 este n (Q0 , x1 ) , deoarece Q0 Q1 este o tranziie legal n M, astfel Q1 este n S1 = ( S0 , x1 ) . Analog, cu i = 1 , Q2 este n (Q1 , x2 ) , deci Q2 S2 = ( S1 , x2 ) . Continund n aceast manier, observm c Q j este n S j oricare ar fi j, n particular, Q p S p . Q p fiind o stare final n M ( a fost acceptat de M), constatm c S p este o stare final n K,

x1

este acceptat de K. Reciproc, presupunem c un ir = x1 , x2 , K , x p este acceptat de K, i fie (2.9) secvena de micri fcute de K la input-ul . Pentru fiecare
Q1 S1 micarea Q0 Q1 este legal pentru maina M ( S1 se compune din acei Q pentru care Q1 Q este micare legal n M). Analog, pentru fiecare Q2 S2 exist un Q1 n S1 astfel nct secvena de micri
x1 x1

Q0 Q1 Q2

x1

x2

este legal n M. Alegem Q1 ca fiind starea pentru care tranziia Q1 Q2 este legal ( Q1 exist deoarece ( S1 , x2 ) = S2 ). n acelai mod artm, c

x1

dac
x1

Q3 S3 ,
x2 x3

atunci putem gsi

Q1 S1

Q2 S 2

astfel nct

Q0 Q1 Q2 Q3 este o secven legal de micri. Continund n acest fel, observm c pentru fiecare Q p i S p putem gsi Q1 S1 , Q2 S2 , ..., Q p 1 S p 1 astfel nct (2.7) s fie o secven legal de micri din M. Dac alegem acum Q p din S p , care este o stare acceptat din M, constatm c

este acceptat de M, adic, face parte din limbajul L( M ) . Q.E.D.

Definiia 2.5. Fie M 1 i M 2 dou MSF. Mainile M 1 i M 2 se numesc echivalente dac genereaz (accept) acelai limbaj,
L( M 1 ) = L( M 2 ) .

Se observ imediat, din demonstraia teoremei 2.2., c dat fiind o main nedeterminist M 1 , maina determinist corespunztoare M 2 este destul de mare. ntr-adevr, dac M 1 are n stri, atunci construcie cere de la M 2 2n stri. Dac n = 10 , atunci M 2 va avea 210 = 1024 stri. n paragraful 2.5. vom arta cum micorm M 2 , de fapt cum s gsim cea mai mic main echivalent cu M 2 . n unele cazuri, construirea lui M 2 poate fi cu mult simplificat. Ne reamintim c maina M = {Q, , Q0 , , F} va eua la determinism din dou motive: 1. 2.
(Q, x) = pentru Q Q i x (dac M se afl n starea Q

i simbolul de intrare este x, urmtoarea stare e nedefinit).


(Q, x) conine mai mult de o stare (pentru unii Q i x).

Natura celor dou cazuri difer; maina M nu este chiar nedeterminist, problema const n faptul c se poate bloca ntr-un punct mort. Din acest motiv, unii autori nu consider astfel de maini nedeterministe. n cazuri n care apare 1 i 2 nu (atunci cnd (Q, x) este ntotdeauna goal sau conine o singur stare) construirea unei maini deterministe echivalente poate fi cu mult simplificat. Teorema 2.3. Fie M = {Q, , Q0 , , F} o main cu stri finite nedeterminist astfel nct pentru fiecare Q Q i x mulimea (Q, x) este vid sau conine un singur element. Fie K o main obinut din M prin adugarea unei stri noi D, i a crei funcie de tranziie este definit dup cum urmeaz:

(Q, x) dac (Q, x) (Q, x) = ( D, x) = {D} pentru toi x {D} dac (Q, x) =

Strile finale i iniiale din K sun aceleai ca i n M n particular D nu este o stare acceptat. Atunci K este o main determinist i echivalent cu M. Starea D introdus mai sus are nelesul de capcan sau stare moart. Ideea din spatele teoremei 2.3. este evident: Dac maina M se blocheaz ntr-o stare oarecare, irul citit nu poate fi acceptat. Totui se trimite maina n acea stare moart. Demonstraie. Faptul c K e determinist este evident: Pentru fiecare stare Q Q {D} i x mulimea (Q, x) conine numai o

singur stare. Dac un ir = x1 , x2 , K , x p este acceptat de M, atunci secvena de micri din K, la input-ul , este aceeai ca secvena de micri din M cu acelai input singura posibilitate ca micrile s difere este cnd M se blocheaz ntr-o configuraie

Q, xi xi +1 K x p

(Q, xi ) =

(2.10)

Deoarece M accept , aceasta nu va avea loc. Reciproc, dac M nu accept , atunci ori M trece din configuraia Q0 , n Q, unde Q nu e stare acceptat, caz n care K face acelai lucru, ori M se blocheaz n configuraia (2.10). n acest caz, K continu prin a trece n starea D i rmne aici pn cnd s-a citit restul irului. Cum D nu este o stare acceptat, K nu accept pe . Q.E.D. Exemplu 2.7. Considerm maina M a crei diagram de tranziie este dat n figura 2.13. Evident, M satisface condiiile teoremei 2.3., maina K echivalent cu M este dat de diagrama figurii 2.14.

Figura 2.13. Funcie de tranziie incomplet.

Figura 2.14. Completarea funciei de tranziie.

2.4. GRAMATICI REGULARE I MAINI CU STRI FINITE n aceast parte completm demonstraia teoremei 2.1. artnd c, dat fiind o gramatic regulat G, exist o main cu stri finite determinist M astfel nct L( M ) = L(G ) . Vom demonstra doar pentru gramaticile liniare la dreapta (produciile sunt de forma S , A aB sau A a ); cazul gramaticilor liniare la stnga este simplu i va fi lsat ca exerciiu. n contextul teoremei 2.2., este suficient de artat c dat fiind o gramatic liniar la dreapta, exist o main nedeterminist M astfel nct L( M ) = L(G ) . Teorema 2.4. Fie G o gramatic liniar la dreapta. Atunci exist o main cu stri finite nedeterminist M astfel nct L(G ) = L( M ) . Demonstraie. Fie G cu alfabetul = {a1 , a2 , K , ak } , mulimea de neterminale
N = {S , A, B, K} ,

S simbolul de start i P mulimea

produciilor. Alfabetul de intrare pentru M va fi tot , strile din M vor fi neterminalele S , A, B, K , plus o stare X, diferit de celelalte neterminale. Starea iniial din M este S. Strile acceptate din M sunt X i, dac S este o producie n G, starea S. Funcia de tranziie din M este definit prin urmtoarele reguli: 1. Pentru fiecare producie de forma A aB din G se include B n
( A, a ) , de exemplu, se include tranziia A B n diagrama de
a

tranziie. 2. Pentru fiecare producie de forma A a se include starea X n


( A, a ) , de exemplu, se include tranziia A X n diagrama de
a

tranziie. n general, maina rezultat fa fi nedeterminist. Trebuie s artm c irurile acceptate de M sunt chiar acelea ce sunt derivabile n G. Fie
= x1 x2 K xn un ir acceptat de M. Prin definiie exist o secven legal de

micri

S = Z1 Z 2 Z 3 L Z n Z n +1

x1

x2

x3

xn

(2.11)

unde Z n +1 este stare acceptat i Z n +1 = X sau (eventual) Z n +1 = S . Pentru fiecare i < n tranziia
Z i Z i +1
xi

este legal, ceea ce implic c

Z i +1 ( Z i , xi ) , astfel nct Z i xi Z i +1 este o producie n G. Considerm

acum ultima tranziie Z n Z n +1 . Dac Z n +1 = X , atunci G are producii de forma Z n xn ; dac Z n +1 = S , atunci G trebuie s aib produciile Z n xn S

xn

i S . Astfel, secvena de derivri pentru n G este dat ori de (2.12) ori de (2.13):

S = Z1 x1Z 2 x1 x2 Z 3 L x1 x2 K xn 1Z n x1 x2 K xn 1 xn

(2.12)

S = Z1 x1Z 2 x1 x2 Z 3 L x1 x2 K xn 1Z n x1 x2 K xn 1 xn S x1 x2 K xn

(2.13)

n ambele cazuri, este derivabil n G. i reciproca este adevrat. Presupunem c este n L(G ) ; derivarea lui trebuie s fie de forma (2.12) sau (2.13). n ambele cazuri (2.11) este o secven legal de micri din M. Ceva atenie trebuie acordat situaiei cnd = este irul vid. Dac S este o producie din G atunci evident L(G ) . n acest caz S este tot o stare acceptat, astfel nct, dac este introdus n M, configuraia iniial a mainii va fi S , i se oprete fr s fac o

singur micare. S fiind o stare acceptat, M accept , L( M ) . Q.E.D.

Exemplu 2.8. Considerm gramatica


S aA | aB | A aA | b B bS | b

Diagrama mainii nedeterministe M, astfel nct L(G ) = L( M ) , este dat n figura 2.15. S fiind o producie, starea S e acceptat. Tranziia A X
b

este rezultatul produciei A b ; B S provine din producia B bS ;


A A din A aA , etc.
b

Figura 2.15. Main cu stri finite nedeterminist care recunoate un limbaj. Pentru a construi o main determinist K astfel nct L( K ) = L(G ) , ne putem folosi de metoda utilizat n demonstraia teoremei 2.2. Maina rezultat K are 16 stri i funcia de tranziie dat de tabela din figura 2.16. Un numr mare de stri nu poate fi atins din starea iniial Q0 . De exemplu, Q4 nu poate fi atins din nici o stare, deci poate fi eliminat. Desigur, maina obinut nu este cea mai mic posibil. Ideea teoremei 2.2. este c o astfel de main poate fi construit. Vom discuta problema gsirii celei mai mici maini n paragraful urmtor. Starea iniial n K este Q0 iar strile acceptate sunt Q0 , Q3 , Q 4 , Q5 , Q6 , Q8 , Q9 , Q10 , Q11 ,
Q12 , Q13 i Q14 (acei Q care conin S sau X).

Input x a
Q0 = {S} Q1 = { A} Q 2 = {B} Q3 = { X } Q 4 = {S , A} Q5 = {S , B} Q7 Q1 Q15 Q15 Q7 Q7 Q7 Q1 Q1 Q7 Q7 Q7 Q7 Q1 Q7 Q15

b
Q15 Q3 Q6 Q15 Q3 Q6 Q15 Q2 Q3 Q6 Q6 Q3 Q6 Q6 Q6 Q15

S t r i

Q6 = {S , X } Q7 = { A, B} Q8 = { A, X } Q 9 = {B , X } Q10 = {S , A, B} Q11 = {S , A, X } Q12 = {S , B, X } Q13 = { A, B, X } Q14 = {S , A, B, X } Q15 =

Figura 2.16. Funcia de tranziie a mainii K. Considerm acum, de exemplu, derivarea

S aB abS abaA abaaA abaab

Micrile mainii nedeterministe K corespunztoare acestei derivri sunt

S , abaab B, baab S , abaab S , aab A, ab A, b X , .

Pe de alt parte, maina determinist K va executa secvena de micri

Q0 , abaab Q7 , baab Q0 , abaab Q6 , aab Q7 , ab Q1 , b Q3 ,

2.5. MINIMIZARE Exemplele din paragrafele anterioare ne arat c chiar gramatici simple conduc la maini mari. Ar fi de mare ajutor o metod de reducere a mrimii mainilor, dac e posibil. Considerm, de exemplu, MSF M 1 din figura 2.17. Strile Q3 i Q4 pot fi combinate ntr-o singur stare T, fr a schimba limbajul generat de M 1 . Rezult o main echivalent M 2 ilustrat n figura 2.18.

Figura 2.17. O main cu stri finite cu prea multe stri.

Orice input acceptat de M 1 este de asemenea acceptat de M 2 i invers. Maina M 2 poate fi redus mai mult combinnd strile Q1 i Q2 ntr-o singur stare R. Se obine o MSF M 3 ca n figura 2.19. Descrierea limbajului generat de M 2 (deci i de M 1 ) este acum evident: L( M 3 ) se compune din toate irurile de lungime patru, formate din simboluri de 0 i 1, terminate n 0.

Figura 2.18. Eliminare de stri.

Figura 2.19. Main cu stri finite minimal. Exist un algoritm, care, dac dat fiind o main cu stri finite determinist M 1 , va produce cea mai mic main cu stri finite M 2 astfel nct L( M 1 ) = L( M 2 ) . Dedicm acest paragraf descrierii acestui algoritm.

ncepem cu a arta cum se elimin dintr-o main aa numitele stri inaccesibile. Definiia 2.6. Fie M o main cu stri finite. Spunem c o stare Q din M este inaccesibil dac nu exist un ir de intrare astfel nct
Q0 , Q, . Unde Q0 este starea iniial din M.
*

Cu alte cuvinte, o stare Q din M este inaccesibil dac, ncepnd cu stare iniial Q0 , maina nu va ajunge niciodat n starea Q, indiferent de input. De exemplu, stare Q1 a mainii din figura 2.20. este inaccesibil.

Figura 2.20. O main cu stri finite avnd o stare inaccesibil. Evident vom avea: Teorema 2.5. Fie M 1 o main cu stri finite i fie M 2 o main obinut din
M1

prin

eliminarea

strilor

inaccesibile.

Atunci

L( M 1 ) = L( M 2 ) .

Dat fiind o main M, toate strile sale inaccesibile pot fi gsite cu urmtorul algoritm.

Algoritm 2.1. Stri inaccesibile ale unei maini cu stri finite. Input: O main cu stri finite M = {Q, , Q0 , , F} . Output: O mulime de stri inaccesibile. Mai nti, mulimea de stri accesibile A se construiete astfel. Formm o secven {A n } de mulimi de stri din M conform regulilor: 1.
A 0 = {Q0 } , A 0 se compune dintr-o singur stare Q0 starea

iniial din M. 2. Se presupunem A k deja construit pentru k 0 . Mulimea


A k+1 se formeaz prin adugarea la A k a strilor din M

accesibile din A k printr-o singur micare,

A k = A k {Q : Pentru Q din A k i x din , (Q, x) = Q} .

3.

Dac A k = A k+1 , de exemplu, cnd nu sunt adugate stri noi la A k , ne oprim i punem A = A k . n caz contrar ne ntoarcem la pasul 2.

Fiind un numr finit n de stri din M, acest proces se va termina n cel mult n 1 iteraii. Mulimea de stri inaccesibile se obine din Q prin eliminarea elementelor din A, = Q \ A (sunt eliminate din A elementele mulimii Q).

Figura 2.21. Eliminarea strilor inaccesibile.

Exemplu 2.9. Fie M maina dat prin diagrama de tranziie din figura 2.21. Atunci avem:
A 0 = {Q0 } prin definiie A1 = {Q0 } {Q1 , Q2 } = {Q0 , Q1 , Q2 } , cu (Q0 , 0) = Q1 i (Q0 , 1) = Q2 A 2 = A1 {Q4 } = {Q0 , Q1 , Q3 , Q4 } cu (Q2 , 0) = Q4 A 3 = A 2 din A 2 nu se pot atinge stri noi

Astfel A = A 2 = {Q0 , Q1 , Q2 , Q3} i = {Q3} este mulime strilor inaccesibile. Starea Q3 poate fi eliminat din M. Menionm c acest algoritm se poate aplica i mainilor nedeterministe. De pild, maina din exemplul 2.8. are doar ase stri accesibile. Verificarea o lsm ca exerciiu. n continuare vom presupune

c fiecare main cu stri finite nu are stri inaccesibile i ne concentrm asupra eliminrii strilor structural redundante. Procedeul folosit n acest scop se bazeaz pe conceptul de congruen. Definiia 2.7. Fie M = {Q, , Q0 , , F} o main determinist cu stri
finite i k 0 un ntreg. Numim dou stri Q i Q k-congruente dac

urmtoarele sunt adevrate: Fie un ir de intrare de lungime cel mult k i presupunem c


Q , P , , Q, P,
* *

descriu micrile din M cu input-ul

, ncepnd cu strile Q i Q . Atunci sau P i P sunt acceptate

mpreun, sau ele nu sunt acceptate mpreun.


Dac Q i Q sunt k-congruente, vom nota acesta prin Q k Q . Dac Q i Q sunt k-congruente pentru toi k = 0, 1, K , spunem c Q i Q sunt congruente i notm Q Q .

nelesul k-congruenei este urmtorul. Presupunem c este irul de testat din L( M ) . Pornim maina n configuraia Q0 , ; M i continu micrile pn cnd ajunge n configuraia Q, , unde este un ir de
lungime cel mult k. Dac Q i Q sunt k-congruente putem schimba starea din Q n Q i continum de aici (cu input-ul ), fr ca s se schimbe

rezultatul final: Dac se pornete cu configuraia Q, , maina se va opri ntr-o stare acceptat, acest lucru este valabil i cnd maina a pornit
din configuraia Q, . Presupunem c Q i Q sunt k-congruente pentru toi k = 0, 1, K . Atunci putem combina Q i Q ntr-o singur stare nu va

avea efect asupra mulimii de irului acceptate de M. Astfel, pentru a minimiza o main cu stri finite M, trebuie s determinm strile congruente ntre ele. Din definiie avem
1. Dac Q1 k Q2 atunci Q2 k Q1 . (simetric) 2. Pentru orice stare Q avem Q k Q . (reflexiv) 3. Dac Q1 k Q2 i Q2 k Q3 atunci Q1 k Q3 . (tranzitiv)

Deci, relaia k fiind simetric, reflexiv i tranzitiv, ea este o relaie de echivalen. Evident expresiile 1, 2 i 3 de mai sus, vor rmne adevrate chiar dac k se nlocuiete cu , astfel, congruena este o relaie de echivalen pe strile din M. Problema minimizrii unei maini M const, n esen, n mprirea strilor din M n clase echivalente; oricare dou stri dintr-o clas vor fi echivalente ntre ele, iar oricare dou stri din clase diferite nu vor fi echivalente ntre ele. Maina minimizat va avea ca stri aceste clase de echivalen. Se observ c acest procedeu furnizeaz cea mai mic posibil main echivalent cu cea original, adic maina cu cele mei puine stri. nainte de a da un algoritm, avem nevoie de dou leme. Lema 2.1. Dac dou stri ale unei maini sunt (k + 1) -congruente, ele sunt i k-congruente. Demonstraia rezult imediat din definiie. Lema 2.2. Fie M = {Q, , Q0 , , F} o main cu stri finite. Fie k 0 un ntreg fixat i G1 , G2 , K , Gn partiia strilor din M n clase de echivalene:

Dou stri din fiecare clas sunt k-congruente ntre ele i dou stri din clase diferite nu sunt k-congruente ntre ele. Fie G una din aceste clase i
Q1 , Q2 , K , Qm strile din G . Pentru fiecare simbol x i Q G , fie hk (Q, x) clasa Gi cu (Q, x) . Atunci strile Q i Q din G sunt

(k + 1) -congruente dac i numai dac

hk (Q, x) = hk (Q, x) pentru fiecare x

(2.14)

Demonstraie. Presupunem Q i Q sunt dou stri din aceeai

clas G i mai presupunem c (2.14) este adevrat. Vrem s artm c Q


i Q sunt (k + 1) -congruente, adic, dac este un ir de lungime maxim k + 1 , cu Q, P,
*

i Q, P, , atunci ori P i P sunt stri

acceptate, ori amndou nu sunt stri acceptate. Dac irul este de


lungime maxim k, ne oprim, fiindc conform ipotezei, Q i Q sunt n aceeai clas G de k -echivalen, deci, Q k Q . Presupunem atunci c

are lungimea k + 1 , de exemplu, = x , unde x i este de lungime k. Dar atunci

Q, = Q, x Q1 , P,

Q, = Q, x Q1 , P,

i ambii Q1 i Q1 aparin aceleai clase G ' (deoarece (2.14) e valabil, deci hk (Q, x) = G ' = hk (Q, x) ). Astfel Q1 k Q1 i avnd lungimea k, observm c P i P sunt amndoi acceptai sau neacceptai. Reciproc, presupunem Q i Q sunt dou stri (k + 1) -congruente;

vrem

artm

c pentru

(2.14)

este

adevrat.

ntr-adevr,

dac i

hk (Q, x) hk (Q, x)

x,

atunci

(Q, x) = Q1 hk (Q, x)

(Q, x) = Q1 hk (Q, x) , deci Q1 i Q1 nu sunt k-congruente. Aceasta implic,

c pentru un ir oarecare , de lungime cel mult k, configuraiile Q1 ,


i Q1 , se vor termina diferit: una ntr-o stare acceptat iar cealalt

ntr-una neacceptat. Acelai lucra este atunci adevrat i pentru configuraiile Q, x


i Q, x . Pe de alt parte, lungimea lui x este

k + 1 , ceea ce contrazice ipoteza c Q i Q sunt (k + 1) -congruente. Q.E.D.

Cnd k = 0 mprirea strilor n clase 0-congruente este simpl. Se observ c dou stri sunt 0-congruente dac i numai dac fie c sunt amndou acceptate sau fie c amndou sunt neacceptate. Astfel, pentru
k = 0 , exist dou clase de echivalen: G (0)1 toate strile neacceptate i G (0) 2 toate strile acceptate. Algoritmul de mprire a strilor n clase de - echivalene va opera n felul urmtor. Mai nti se mpart strile din M

n dou grupuri G (0)1 i G (0) 2 clasele de echivalen pentru relaia 0 (am artat adineauri ce sunt ele). Folosind lema 2.2., fiecare dintre acetia sunt mprite n alte subgrupuri; partiia rezultat formeaz clasa de echivalen pentru 1 . Operaia se repet, pn nu mai apar subdiviziuni. Descrierea formal exact a algoritmului este urmtoarea.

Algoritm 2.2. Main cu stri finite minimal. Input: O main cu stri finite M = {Q, , Q0 , , F} . Output: O main cu stri finite K, cu cele mai puine stri posibile, astfel nct L( K ) = L( M ) . I. Construire de stri din K. Strile din K vor fi clase de echivalen a strilor din M sub relaia de echivalen . Aadar, strile din K sunt mulimile de stri G1 , G2 , K , Gr din M astfel nct Q1 , Q2 s fie membrii din acelai G dac i numai dac Q1 Q2 . Aceste clase se construiesc n felul urmtor. 1. Fie G (0)1 mulimea strilor neacceptate i G (0) 2 mulimea tuturor strilor acceptate din M. 2. Presupunem c mulimile din M au fost mprite n clase de echivalene

G (k)1 , G (k) 2 , K , G (k) mk

(2.15)

cu relaia k . Pentru fiecare stare Q i x fie hk (Q, x) clasa


G (k) i care conine (Q, x) . Se mparte fiecare mulime G (k) i din (2.15) astfel. Dou stri Q i Q din G (k)i vor aparine aceleai clase dac i numai dac hk (Q, x) = hk (Q, x) , pentru fiecare x din . Fie partiia de stri din M obinut

G (k+1)1 , G (k+1) 2 , K , G (k+1) mk +1

(2.16)

3. Dac mulimile din (2.16) sunt identice cu cele din (2.15), ne oprim. Am obinut partiionarea n clase de echivalen. Dac n (2.16) sunt mai multe clase dect n (2.15), ne ntoarcem la pasul 2. II. K are acelai alfabetul de intrare ca i M, adic mulimea . III. Starea iniial din K este clasa de echivalen care conine starea iniial Q0 din M. IV. Funcia de tranziie se definete pentru K astfel: Fie

G1 , G2 ,K , Gr

(2.17)

strile din K. Exist clase de echivalene pentru acel k pentru care clasele de echivalen din (2.16) sunt identice cu cele din (2.15). Din construcia
prii I rezult c dac Q i Q sunt n aceeai Gi , atunci hk (Q, x) = hk (Q, x) ,

oricare ar fi x . Astfel funcia

(G , x) = hk (Q, x) pentru oricare Q G

este bine definit, independent de Q. (Observm c (G , x) este o clas de echivalen, una din G -uri, deoarece hk (Q, x) este clasa de echivalen care conine (Q, x) .) Lum funcia ca funcie de tranziie pentru K. V. O stare G este stare acceptat dac i numai dac se compune din stri acceptate din M.

Vom ilustra algoritmul 2.2. n exemplul urmtor. Exemplu 2.10. Fie M maina cu stri finite dat de diagrama din figura 2.22. Clasa
G1(0)

(a

strilor

neacceptate)

este

{Q0 , Q1 , Q2 , Q3 , Q4 , Q6 , Q7 , Q9 } . Clasa (tuturor strilor acceptate) G2 (0) este {Q5 , Q8 } . Urmtoarea subdivizare se obine cu ajutorul funciei h0 (Q, x) = clasa Gi (0) care conine (Q, x) .

Figura 2.22. Minimizarea unei maini cu stri finite. Astfel, pentru k = 1 clasa G1(0) se mparte n dou subclase
G1(1) = {Q0 , Q2 } i G2 (1) = { Q1 , Q3 , Q4 , Q6 , Q7 , Q9 } .

Clasa G2 (0) nu se mparte ( Q5 i Q8 produc rnduri identice) i devine G3(1) . Continuarea mpririi este redat n de tabelul din figura 2.24. Am omis

unele G -uri i Q-uri, reinnd doar indicii relevani. ( G3(3) este reprezentat ca 3 i Q5 ca 5.) Partea superioar lui Pas #1 al tabelei din figura 2.24. este identic cu tabelul figurii 2.23. n Pas 4# ( k = 3 ) nu sunt introduse subclase noi, astfel, clasele de echivalen din M, deci strile din K, sunt
G1 = {Q0 } , G2 = {Q2 } , G3 = {Q1} , G4 = {Q3 , Q4 , Q6 , Q7 , Q9 } , G5 = {Q5 , Q8 } .

Starea iniial din K este G1 i starea final este G5 . Funcia de tranziie este dat de funcia h3 n tabelul din figura 2.24. De exemplu, (G4 , a) = G4 deoarece h3 (Q3 , a) = h3 (Q4 , a) = h3 (Q6 , a) = h3 (Q7 , a) = h3 (Q9 , a) = G4 . n exact acelai mod se obine (G5 , b) = G4 cu h3 (Q5 , b) = h3 (Q8 , b) = G4 . n final, diagrama de tranziie pentru K este dat n figura 2.25.
h0 h0 (Q, a ) G1(0) G1(0) G1(0) G1(0) G1(0) G1(0) G1(0) G1(0) G1(0) G1(0) h0 (Q, b) G2 (0) G1(0) G1(0) G1(0) G1(0) G1(0) G1(0) G1(0) G1(0) G1(0)

(0)

Q
Q0 Q1 Q2

G1(0)

Q3 Q4 Q6 Q7 Q9

G2

(0)

Q5 Q8

Figura 2.23. Primul pas din algoritmul 2.2.

Rndurile pentru Q0 i Q1 sunt distincte, deci Q0 i Q1 vor aparine diferitor clase G (1) . Pentru Q2 i Q3 ele sunt identice, deci aparin aceleai clase G (1) .

(0)

h0

Q a b 0 1 2 1 1 1 2 1 2

(1)

h1

Q a b 0 2 3 2 2 3 1 2 1 3 2 2 4 2 2 6 2 2 7 2 2 9 2 2 5 2 2 8 2 2 Pas #2
k =1

(2)

h2

Q a b 0 2 4 2 3 4 1 3 1 3 3 3 4 3 3

(3)

h3

Q a b 0 3 5 2 4 5 1 4 2 3 4 4 4 4 4

1 2

1 2 3

3 1 1 4 1 1 6 1 1 7 1 1 9 1 1 5 1 1 8 1 1 Pas #1
k =0

6 3 3 7 3 3 9 3 3 5 3 3 8 3 3 Pas #3
k=2

6 4 4 7 4 4 9 4 4 5 4 4 8 4 4 Pas #4
k =3

Figura 2.24. Algoritmul 2.2. complet.

Figura 2.25. Main minimizat.

ncheiem acest paragraf prin a arta c algoritmul 2.2. funcioneaz corect. Teorema 2.6. Fie M i K mainile cu stri finite deterministe din algoritmul 2.2. Atunci L( K ) = L( M ) . Mai mult, dac K1 este o MSFD astfel nct L( K1 ) = L( M ) atunci numrul de stri din K1 este cel puin egal cu numrul de stri din K.
Demonstraie. Fie Q i Q dou stri din M i fie G i G dou stri din K astfel nct Q G i Q G . Din construcia lui K rezult c pentru

oricare x

Dac (Q, x) = Q atunci (G , x) = G

(2.18)

Fie acum = x1 x2 K x p un ir acceptat de M. Secvena de micri efectuate de M la input-ul este

Q0 Qi1 Qi2 L Qi p

x1

x2

x3

xp

(2.19)

unde Qi este stare acceptat n M. Fie Gi , Gi , K , Gi strile din K astfel


p 1 2 p

nct Qi Gi . Din (2.18) rezult c secvena de micri din K este


j j

G0 Gi1 Gi2 L Gi p

x1

x2

x3

xp

(2.20)

Deoarece Qi Gi , starea Gi este stare acceptat n K, deci L( K ) .


p p p

Reciproc, dac nu este n L( M ) atunci starea Qi din (2.19) nu este


p

stare final n M, i din nou, deoarece Qi Gi , starea Gi nu este stare


p p p

final n K, deci L( K ). Ca urmare L( K ) = L( M ) . Pentru a arta c maina K are minimul de stri, procedm n felul urmtor. Fie K1 o main cu stri finite determinist cu mai puine stri dect K. Vom arta c L( K1 ) L( M ) = L( K ) . Toate strile din M fiind accesibile, i strile din K vor fi de asemenea toate accesibile. Astfel, pentru fiecare G din K exist un ir = (G ) astfel nct G0 , G , . Fie P0 starea iniial din K1 , i considerm micrile din K1 la input-ul
(G ) pentru toate strile posibile G din K. Pentru fiecare astfel de G
*

main K1 se va opri ntr-o configuraie P(G ), pentru o stare oarecare


P (G ) din K1 . Deoarece K1 are mai puine stri dect K, vor exista dou

stri diferite din K, fie ele G ' i G '' , astfel nct P(G ' ) = P(G '' ) . Cu alte cuvinte, exist dou iruri diferite ' = (G ' ) i '' = (G '' ) astfel nct 1. La input-ul ' i '' maina K1 se mic din P0 n aceeai stare P. 2. La input-ul ' i '' maina K se mic din G0 n dou stri diferite G ' i G '' . Fie Q ' o stare din M coninut n G ' i fie Q '' o stare din M coninut n
G '' . Avnd G ' G '' , strile Q ' i Q '' nu sunt congruente. Deci pentru un

input , maina M va trece din Q ' n Q i din Q '' n Q unde una din strile Q i Q este acceptat iar cealalt nu. Aceasta implic c unul din irurile ' i '' este n L( M ) iar cellalt nu. S vedem ce se ntmpl

cnd aceste iruri sunt introduse n maina K1 . La input-ul ' maina K1 trece din configuraia P0 , ' n P, . La fel, cu input-ul '' maina K1 trece din P0 , '' n aceeai configuraie P, iar apoi continu pn se epuizeaz irul . Aadar, K1 trebuie s accepte fie ambele iruri ' i
'' fie s le resping pe amndou. Ca urmare L( K1 ) L( M ) , deoarece

prin construcie, maina L( M ) accept doar unul dintre aceste iruri. Q.E.D. 2.6. MAINI CU STRI FINITE BIDIRECIONALE Exist o variant modificat a conceptului de main cu stri finite, dup cum vom vedea n continuare. Ne reamintim, c la definirea automatelor finite a fost precizat faptul, c dac maina citete un simbol x i se afl ntr-o stare Q, ea va trece n starea (Q, x) i va deplaseaz capul de citire cu un simbol spre dreapta. Presupunem acum c permitem capului de citire s efectueze micri la dreapta i la stnga sau deloc. Astfel, dac maina se afl n starea Q i simbolul de intrare este x, ea poate efectua urmtoarele: 1. Schimb starea n Q ' i mic capul de citire la dreapta. 2. Schimb starea n Q ' i mic capul de citire la stnga. 3. Schimb starea n Q ' i nu mic poziia capului de citire. Decizia luat se bazeaz pe starea curent i simbolul de intrare, i este independent de strile/input-urile precedente. Valoarea funciei de tranziie pentru aceste maini va fi perechea:

(Q, x) = (Q ' , R) sau (Q ' , L) sau (Q ' , S )

Dac (Q, x) = (Q ' , R) , maina trece n starea Q ' i mic capul de citire cu un simbol la dreapta; cnd (Q, x) = (Q ' , L) , maina trece n starea Q ' i mic capul de citire cu un simbol la stnga; cnd (Q, x) = (Q ' , S ) , capul de citire nu se mic deloc i simbolul de intrare x este recitit. Formal avem: Definiia 2.8. O main cu stri finite determinist bilateral M se compune din urmtoarele cinci obiecte: 1. O mulime finit, nevid Q = {Q0 , Q1 , K , Qn } . Elementele din Q se numesc stri. 2. O mulime finit, nevid = {a1 , a2 , K , an } de simboluri admise n irul de intrare. Mulimea se numete alfabet pentru M. 3. O stare desemnat Q0 Q , numit stare iniial. 4. O funcie de tranziie (Q, x) definit pentru toate strile Q Q i toi x . Pentru fiecare Q Q i x valoarea (Q, x) este o pereche (Q ' , Z ) , unde Q ' este alt stare din Q i Z este unul din simbolurile R, L sau S. 5. O mulime nevid F de stri din Q. Elementele lui F se numesc stri finale sau acceptate. O main cu stri finite de genul celei descrise mai sus va fi un cvintuplu
M = {Q, , Q0 , , F} i se noteaz MSF2D.

Exemplu 2.11. Fie M o MSF2D cu patru stri Q0 (starea iniial),


Q1 , Q2 i Q3 ; cu alfabetul de intrare = {a, b, c} ; cu o stare final Q3 ; i cu

funcia de tranziie dat de tabelul din figura 2.26. Input curent a S Q0 t r i


Q3 (Q0 , L) (Q3 , L) (Q0 , S ) Q1 Q2 (Q0 , R) (Q0 , R) (Q0 , R)

b
(Q1 , R) (Q3 , L) (Q1 , R)

C
(Q2 , R) (Q1 , L) (Q2 , S )

Figura 2.26. O main cu stri finite determinist bilateral. Pentru a facilita descrierea micrilor unei MSF2D avem nevoie de o metod de descriere a configuraie mainii n orice moment dat. Deoarece capul de citire se poate deplasa la stnga ct i la dreapta, trebuie s cunoatem coninutul irului din dreapta capului de citire, ca i din stnga. Deci, o configuraie a unei MSF2D va fi un triplet , Q, , unde
este irul de intrare din stnga capului de citire, Q este starea curent i este irul de intrare din dreapta capului de citire presupunem c capul

de citire se afl poziionat pe primul simbol din . ntregul ir de intrare este . i pot fi irul vid : Dac = , irul de intrare este pe simbolul cel mai din stng a irului de intrare, iar = nseamn c ntregul ir de intrare a fost citit. Figura 2.27. arat aceast configuraie a mainii.

ir de intrare

Figura 2.27. O MSF2D n configuraia a0 a1 K ak , Q, ak +1 K a p . Micrile posibile ale mainii M sunt

a0 a1 K ak , Q, ak +1 K a p

a1 K ak ak +1 , P, ak + 2 K a p dac (Q, ak + 2 ) = ( P, R) a1 K ak 1 , P, ak K a p dac (Q, ak +1 ) = ( P, L) a1 K ak , P, ak +1 K ak dac (Q, ak +1 ) = ( P, S )

Maina pornete, ca de obicei, n configuraia , Q0 , a1a2 K ak . Pot aprea urmtoarele situaii: 1. Maina citete irul de intrare n ntregime i ajunge n configuraia , Q, , unde Q este o stare oarecare. n acest caz spunem c M s-a oprit. De pild, maina M din exemplul 2.11. va trece prin urmtoarea secven de micri avnd ca input = aabcac :

, Q0 , aabcac a, Q0 , abcac a, Q0 , bcac


aab, Q1 , cac aabc, Q2 , ac aabca, Q0 , c aabcac, Q2 , se oprete

2. Maina ajunge n configuraia

, Q, a K

i (Q, a) = (Q ', L) ,

capul de citire citete cel mai din stnga simbol al irul de intrare i instruciunile cer mutarea capului de citire la stnga. n acest caz vom spune c maina s-a blocat. De pild, la input-ul = abbbca , maina din exemplul 2.11. va avea urmtoarea secven de micare:
, Q0 , abbca a, Q0 , bbca ab, Q1 , bca
a, Q3 , bbca , Q3 , abbca se suspend

3. Maina intr ntr-un ciclu infinit. De pild, la input-ul


= abccab , micrile mainii M din exemplul 2.11. sunt:

, Q0 , abccab a, Q0 , bccab ab, Q1 , ccab


abc, Q2 , cab ab, Q1 , ccab intr n ciclu

Definim limbajul acceptat sau generat de o MSF2D M ca fiind o mulime de iruri pentru care maina M, pornit n configuraia , Q0 , , se va opri n configuraia , Q, , unde Q F . Formal avem

L( M ) = { * | , Q0 , , Q, , Q F}

Ca urmare, dac M este maina din exemplul 2.11, aabcac L( M ) , dar


abccab i abbbca nu aparin lui L( M ) . Mainile cu stri finite obinuite

pot fi vzute ca cazuri particulare ale mainilor bidirecionale:


(Q, a) (Q ', L) sau (Q ', S ) n acest caz. Este de ateptat ca clasa

limbajelor generate de MSF2D s fie mai mare dect clasa generat de MSF obinuite. Surprinztor, acesta nu este cazul. Avem urmtoarea teorem: Teorema 2.7. Fie M = {Q, , Q0 , , F} o MSF2D. Atunci exist o MSF determinist K astfel nct L( M ) = L( K ) . Demonstraie. Vom demonstra aceast teorem sub ipoteza suplimentar c maina deplaseaz capul de citire ori la stnga ori la dreapta, (Q, x) (Q ', S ) . Aceasta o face pentru simplificarea expresiei; demonstraia pe cazul general se bazeaz pe aceeai idee. Fie Q0 , Q1 , K , Qn strile din M i fie D un simbol nefolosit din M. Pentru fiecare ir definim dou funcii (Q) i (Q, x) n felul urmtor. Dac Q este o stare, definim (Q) ca fiind starea P, astfel nct maina M pornit n configuraia , Q, , se va opri n configuraia
, P, . Aceasta nseamn c M va citi toate simbolurile din i se

oprete n starea P. Dac nu exist un astfel de P, avem (Q) = D . Ceea ce va avea loc dac, de exemplu, maina M pornit cu input-ul , va trece ntr-o bucl infinit, sau dac se blocheaz. De pild, n maina exemplului 2.11. avem cac (Q1 ) = Q2 deoarece

, Q1 , cac c, Q2 , ac ca, Q0 , c cac, Q2 , se oprete

Pe de alt parte, bca (Q1 ) = D fiindc

, Q1 , bca , Q3 , bca se blocheaz

Formal avem : Q Q {D} dat prin

* P dac , Q, , P, (Q) = D dac nu exist un astfel de P

Funcia are dou argumente o starea Q i un simbol x i se definete astfel: Alegem (Q, x) ca fiind starea P astfel nct maina M, pornit n configuraia , Q, x va trece n configuraia , P, x n aa mod nct s nu existe R astfel nct

, Q, x , R, x , P , x

Cu alte cuvinte, (Q, x) este definit a fi prima stare P astfel nct, dac M este pornit n configuraia , Q, x , capul de citire a mainii M se mut la stnga i rmne n pn cnd ajunge n configuraia
, P, x . Dac nu exist o astfel de stare, punem (Q, x) = D .

Referindu-ne la exemplul 2.11. avem bca (Q3 , a ) = Q0 deoarece

bca, Q3 , a bc, Q0 , aa bca, Q0 , a

Formal, avem : Q Q {D} dat prin

+ P dac , Q, x , P, x , dar nu exist R P * * (Q, x) = astfel nct , Q, x , R, x , P, x D dac nu exist un astfel de P

n definiia anterioar, notaia

, Q, x , P , x

nseamn, c ntre

configuraii, maina execut un numr pozitiv de micri. Important de reinut despre funcia este: dac = (Q, x) = P , adic M pornete n configuraia , Q, x , capul de citire se deplaseaz la dreapta i rmne n
pn cnd se ajunge n configuraia , P, x .

Observm c exist doar un numr finit de funcii i , deoarece mulimile Q i sunt finite. Deci vor exista mai multe perechi 1 i 2 n
* astfel nct 1 (Q, x) = 2 (Q, x) i 1 (Q) = 2 (Q) pentru orice Q Q i x . Dou astfel de iruri se numesc echivalente i notm aceasta

1 2 . Evident, relaia

este o relaie de echivalen. Deoarece exist

un numr finit de funcii i , avem i un numr finit de clase de echivalen ale acestei relaii. Relaia de echivalen are n plus urmtoarea proprietate: Presupunem 1 2 . Atunci pentru oricare ,

1 L( M ) dac i numai dac 2 L( M )

(2.21)

Fie dat i presupunem c 1 L( M ) ; vream s demonstrm c 2 este tot n L( M ) . Vom presupune , n caz contrar concluzia este evident. Fie = x 1 i considerm micrile mainii M la input-ul 1 x 1 , n

particular, fie P1 starea din M cnd capul de citire ajunge prima dat la simbolul x primul simbol din : , Q0 , 1 x 1 1 , P1 , x 1 i n timpul tranziie ntre aceste configuraii capul de citire rmne n 1 . Dar aceasta nseamn c P1 = (Q0 ) , i fiindc irurile 1 i 2 sunt echivalente, P1
1

este de asemenea starea mainii M cnd capul ei de citire ajunge prima dat la x (pornind din configuraia , Q0 , 2 ). Astfel, la input-urile 1 x 1 i 2 x 1 micrile iniiale ale mainii M sunt

, Q0 , 1 x 1 1 , P , x 1 1 , Q0 , 2 x 1 2 , P , x 1 1
*

(2.22)

i n cursul configuraiilor intermediare, capul de citire rmne n 1 , respectiv 2 . Fie


P , P2 , K , Pk 1

strile mainii M corespunztoare

momentelor consecutive cnd capul de citire puncteaz pe x primul simbol din . (Urmrim n continuare micrile din M la input-ul 1 ). Cu alte cuvinte, fie P1 , P2 , K , Pk stri astfel nct

1 , P , x 1 1 , P2 , x 1 L 1 , Pk , x 1 L 1

(2.23)

unde micrile din (2.23) sunt de felul urmtor 1. naintea ca configuraia 1 , P1 , x 1 s fie ajuns, capul mainii M puncteaz n interiorul irului 1 . 2. ntre configuraiile 1 , Pj , x 1 i 1 , Pj +1 , x 1 capul de citire

puncteaz ori numai n 1 ori numai n x 1 .

3. Dup configuraia 1 , Pk , x 1 capul de citire este numai n x 1 . Din definiia funcie i din faptul c 1 2 rezult, c micrile mainii M la input-ul 2 i configuraia 2 , P1 , x 1 sunt

2 , P , x 2 2 , P2 , x 2 L 2 , Pk , x 2 L 1

(2.24)

Considerm micrile executate de M ncepnd cu prima configuraie din (2.24). Dac capul se deplaseaz la dreapta, micrile vor fi identice cu cele ale mainii M pornite n prima configuraie din (2.23). Aadar, dup ce capul de citire se ntoarce la x, M va fi n configuraia 2 , P2 , x 1 . Dac, pe de alt parte, capul de citire se deplaseaz la stnga atunci, deoarece P2 = ( P1 , x) i 2 este echivalent cu 1 , data urmtoare cnd
1

capul de citire ntlnete x, M trece n starea P2 . Procednd la fel cu strile


P2 i P3 n loc de P , P2 etc., observm c (2.24) este valabil. Dup ce M 1

ajunge n ultima configuraie din (2.24), procedeaz ca i cnd ar ncepe cu ultima configuraie din (2.23); cu alte cuvinte, accept 2 . Dat fiind faptul c rolul lui 1 i 2 , din aceast discuie, a fost simetric, ajungem la concluzia c (2.21) este adevrat. n final, putem construi maina K. Alfabetul de intrare este identic cu alfabetul din M. Strile corespund claselor de echivalen a relaiei . Dac este un ir oarecare din * , atunci denot clasa de echivalen care-l conine pe . Simbolul de start va fi clas de echivalen care conine irul vid. Ca stri acceptate pentru K sunt luate acele clase de echivalen n a cror componen intr doar iruri din L( M ) . (Se arat

uor c dac 1 2 atunci, ori 1 , 2 sunt n L( M ) , ori amndoi nu sunt n L( M ) ). Funcia de tranziie din K se definete n modul urmtor:

( , x) = x

(2.25)

Aceasta nseamn c este o clas de echivalen (o stare din K), i x este simbolul de intrare curent, atunci urmtoarea stare pentru K este clasa de echivalen coninnd x . Evident, K este o main cu stri finite determinist, a crei cap de citire se deplaseaz doar la dreapta. Utiliznd proprietatea (2.21), este uor de artat c L( M ) = L( K ) . Q.E.D. PROBLEME Construii pentru fiecare din problemele 1 9 o main cu stri finite determinist care accept limbajul dat. 1. Mulimea irurilor de 0-uri i 1-uri de lungime cel mult 5. 2. Mulimea de iruri din {a, b}* avnd un numr par de b-uri. 3. Mulimea de iruri formate din a-uri i b-uri avnd aa i bb ca subiruri. 4. Limbajul tuturor constantelor ntregi cu i fr semn. Deci, +345, -345 i 345 aparin toate limbajului. 5. Limbajul irurilor peste {0, 1}* care nu conin subirul 0011. 6. Limbajul L {a, b}* irurilor cu numr par de a-uri i impar de b-uri. 7. Mulimea irurilor de 0-uri i 1-uri care ncep cu 000 i nu mai conin irul 000. Deci, 000 este n limbaj, dar 0000 nu.

8. Limbajul irurilor formate din 0 i 1 n care subirul 001 apare cel puin de trei ori. 9. Mulimea de iruri din {a, b}* n care nici aa nici bb apar ca subir. Construii pentru problemele 10 14 o main cu stri finite care accept limbajul generat de gramatica indicat. Maina nu trebuie s fie determinist. 10. S aS | bS | b | 11. S 0 A |1B , A 0C |1A | 0 , B 1B |1A |1 , C 0 | 0 A 12. S aA | aB , A aA | bS , B b | bA 13. S aS | bB | , B aA | b , A aS | aB 14. S aS | bS | cA , A cB , B cC , C aC | bC | 15. Construii o main cu stri finite determinist care accept fiecare din limbajele generate n problemele 10 14. 16. Pentru fiecare main din figura 2.28. construii o main echivalent determinist.

Figura 2.28. Maini cu stri finite nedeterministe.

17. Minimizai maina cu stri finite a crei funcie de tranziie este dat n figura 2.16. (nti eliminai strile inaccesibile.) 18. Minimizai maina cu stri finite din figura 2.29. 19. Completai demonstraia teoremei 2.7. prin a arta urmtoarele: a. Dac 1 2 atunci sau 1 i 2 sunt n L( M ) , sau amndou nu sunt n L( M ) . b. Maina K introdus n demonstraie este echivalent cu M.

Figura 2.29. Automate finite.

CAPITOLUL 3 LIMBAJE REGULARE 3.1. LEMA DE POMPARE Am vzut n capitolul 2 c dac G este o gramatic regular (toate produciile sunt de forma S , A aB sau A a ), atunci exist o main cu stri finite determinist M, astfel nct L(G ) = L( M ) . Deoarece astfel de maini sunt uor de implementat pe calculator chiar i n hardware soluia problemei de analiz pare evident: Fiind dat un limbaj L, scriem o gramatic G pentru el astfel nct G s fie regular iar apoi construim un automat finit corespunztor. Considerm, de exemplu, limbajul

L = {0n1n | n = 0, 1, 2, K}

care reprezint mulimea irurilor formate din n 0-uri urmate de n 1-uri. O gramatic pentru acest limbaj poate fi

S 0 S1|

care evident nu este regular. Vom vedea c nu exist o gramatic regular G astfel nct L(G ) = L . Artm aceasta prin a demonstra c nu exist o main cu stri finite M cu L( M ) = L . Presupunem c exist o astfel de main M i fie Q0 , Q1 , K , Qk 1 strile acesteia (k din ele). Fie
= 0m1m un ir n limbajul L, a crui lungime este mai mare dect k,

2m > k . Cnd M se iniializeaz cu , va trece prin urmtoarea secven

de micri:

Q0 = Q0 Q1 Q2 L Qm Qm +1 L Q2 m
1 1 1

(1.1)

unde Q2 m este stare acceptat. Deoarece M are k < 2m stri, unele Q -uri din (3.1) se repet, Qi = Qi + p i, p > 0 . Fie

Qi Qi +1 L Qi + p = Qi j = 0,1

(1.2)

partea secvenei (3.1) ntre aceste dou stri i fie secvena 1 2 K p . Lungimea lui este p > 0 . Deci = 1 2 i . Considerm secvena
= 1 2 partea din se repet de dou ori vom vedea n

continuare ce se ntmpl cnd este introdus n M. Iniial M se afl n configuraia Q0 , 1 2 . Dac toate simbolurile din 1 sunt citite, maina va trece n configuraia
Qi , 2 . Dup procesarea simbolurilor din

primul ,configuraia va fi Qi + p , 2 = Qi , 2 , Qi + p = Qi . Mai departe,

maina M va proceda ca n secvena (3.1), terminnd n configuraia


acceptat Q2 m , . Schematic, cu input-ul = 1 2 , avem

Q0 Qi Qi + p = Qi Q2 m .

1 *

2 *

Cum este acceptat de M, = 1 2 trebuie s aparin limbajului L. Aceasta, ns, este imposibil. Dac se compune doar din 0-uri, atunci
= 1 2 are mai multe 0-uri dect 1-uri ( = 1 2 are un numr egal de

0-uri i 1-uri, ); dac se compune numai din 1-uri, atunci va avea mai multe 1-uri dect 0-uri. Dac are att 0-uri ct i 1-uri, atunci n irul = 1 2 unele simboluri de 1 vor preceda unele 0-uri, ceea ce de asemenea nu are loc pentru iruri din limbajul L. Observm c n toate cazurile nu poate fi n L, deci L L( M ) . Fenomenul descris aici este comun tuturor limbajelor regulare. Teorema 3.1. (lema de pompare) Fie G o gramatic regular. Exist un ntreg k cu urmtoarea proprietate: Dac este un ir din L(G ) de lungime mai mare dect k, atunci poate fi scris ca = 1 2 , unde
, i n aa fel nct toate irurile 1 2 , 1 2 , 1 2 , K , 1 n 2 , K ,

s aparin de asemenea limbajului L(G ) . Demonstraie. G fiind o gramatic regular, exist o main cu stri finite M astfel nct L(G ) = L( M ) (teorema 2.1.). Fie k numrul de stri din M; Q0 , Q1 , K , Qk 1 . Fie acum = x1 x2 K kl un ir din L(G ) de lungime l > k . Acest ir este accepta de maina M, care va trece prin urmtoarea secven de configuraii

Q0 = Q0 Q1 L Ql

x1

x2

x1

(1.3)

unde Ql este stare final n M. Fiindc l > k , apar dou stri identice n (3.3), Qi = Qi + p pentru i, p > 0 . Fie tranziia ntre aceste dou stri

Qi Qi +1 L Qi + p = Qi , x j

x1+1

xi + 2

xi + p

(1.4)

Lum = xi +1 xi + 2 K xi + p . Avem p > 0 , i putem scrie = 1 2 . Pentru orice n 0 , micarea mainii M la input-ul 1 n 2 va fi

Q0 Qi Qi L Qi Ql 144 2444 4 3
de n ori

1 *

2 *

i astfel 1 n 2 este acceptat de M, deci este n limbajul L( M ) . Q.E.D. Lema de pompare este de regul folosit pentru a demonstra c diferite limbaje nu au aceeai gramatic. Fiind dat un limbaj L, presupunem c are o gramatic regular i aplicm lema de pompare pentru a obine o contradicie; ca n exemplul de la nceputul capitolului. Exemplu 3.1. Fie L = {a n | n este ptratul unui ntreg} . Aadar L se compune din iruri de a-uri cu lungimile 1, 4, 9, 16, 25, ..., etc. Vom arta n continuare c L nu are o gramatic regular. Pentru aceasta presupunem c exist o gramatic regular G astfel nct L = L(G ) i fie k ntregul descris n lema de pompare. Dac = aa K a = a m este un ir de lungime mai mare dect k, m 2 > k . Atunci poate fi scris = 1 2 , i astfel nct pentru fiecare n irul 1 n 2 s fie de asemenea n L. Fie r1 lungimea lui 1 , t lungimea lui i r2 lungimea lui 2 , astfel ca
r1 + t + r2 = m 2 i t > 0 . Discuia anterioar ne arat c pentru fiecare ntreg
2

n, numrul r1 + nt + r2 este de asemenea un ptrat perfect, deci pentru fiecare n avem r2 + nt + r2 = jn 2 , unde jn este un ntreg. Aadar

t = (r1 + (n + 1)t + r2 ) (r1 + t + r2 ) =


2 2 2 2 = jn +1 jn ( jn + 1) 2 jn = 2 jn + 1

(1.5)

Parte stng din (3.5) este un numr fixat t, iar partea dreapt devine din ce n ce mai mare dac n . Aceast contradicie ne arat c L nu are o gramatic regular.

3.2. EXPRESII REGULARE O alt modalitate de descriere a limbajelor este folosirea aa numitelor expresii regulare. Aceast metod simuleaz descrierea verbal a unui limbaj. De exemplu, putem specifica un limbaj L prin a spune c L se compune din iruri care ncep cu dou simboluri de 1 urmate de trei 0-uri i de un numr arbitra de simboluri de 2 i 3. Astfel 110002322 este n limbaj, n timp ce 11000201 nu. Vom vedea c este posibil dezvoltarea unui formalism matematic precis pentru astfel de descrieri. ncepem cu concepte preliminare i terminologie. Definiia 3.1. Fie limbajele L, L1 i L2 . 1. Limbajul L1L2 este definit a fi mulimea tuturor irurilor obinute prin concatenarea unui ir din L1 cu un ir din L2 . Formal avem:

L1 L2 = { 1 2 | 1 L1 , 2 L2 }

2. Limbajul L1 + L2 este mulimea tuturor irurilor care aparin sau lui L1 sau lui L2 . Deci, L1 + L2 este reuniunea teoretic ntre L1 i L2 :

L1 + L2 = { | L1 sau L2 } = L1 L2

3. Limbajul L* este mulimea irurilor obinute prin concatenarea unui numr arbitrar, finit de iruri din L.

L* = { 1 2 K n | 1 L, 2 L, K , n L}

Dac n = 0 , irul va fi interpretat ca irul vid. Aadar, pentru orice limbaj L, L* . 4. Limbajul L+ este definit ca mulimea irurilor obinute prin concatenarea unui numr arbitrar, pozitiv de iruri din L.

L+ = { 1 2 K n | 1 L, 2 L, K , n L, n 1}

Limbajele L+ i L* sunt similare, singura diferen ntre ele const n faptul c n = 0 nu este permis. Dac L atunci L+ , dar L* . Ilustrm acesta prin unele exemplu. Fie L1 = {01,1001} i L2 = {11, 00, 1} . Atunci
L1 L2 = {0111, 0100, 011, 100111, 100100, 10011} L1 + L2 = {01, 1001, 11, 00, 1}

n definiia lui L1L2 sunt subliniate prile din ir care aparin lui L1 respectiv L2 . n general L1L2 L2 L1 . De pild, 101 este n L2 L1 dar nu i n
L1 L2 . Un exemplu de ir din L* este irul 1100111: 2

11 00 1 11

1 2 3 4

unde i L2 . Reprezentarea lui nu este unic. Acelai ir poate fi reprezentat ca

1 1 00 1 1 1

1 2 3 4 5 6

n continuare trecem la conceptul de expresie regular peste un alfabet . Expresiile regulare vor fi scrise cu caractere ngroate i vor desemna diferite limbaje dup cum urmeaz. Definiia 3.2. Fie un alfabet, adic, o mulime nevid, finit de simboluri. 1. este o expresie regular peste , desemneaz limbajul vid, adic limbajul fr nici un ir. 2. este o expresie regular peste i desemneaz limbajul {} , adic, limbajul format din irul vid . 3. Pentru fiecare a , a este o expresie regular i desemneaz limbajului {a} limbajul format dintr-un singur ir a. 4. Dac r i s sunt expresii regulare peste care desemneaz limbajele L1 respectiv L2 , atunci rs, r + s , i r * sunt expresii

regulare, unde rs desemneaz limbajul L1L2 , r + s desemneaz


L1 + L2 i r * desemneaz L* . 1

5. Orice expresie regular poate fi obinut prin aplicarea repetat a regulilor 1-4. Motivul pentru care expresiile regulare sunt notate cu caractere ngroate este pentru a le distinge de simbolurile limbajelor pe care le reprezint. O observaie merit a fi fcut asupra punctelor 1 i 2 din definiia anterioar: expresia regular este diferit de expresia regular
. Simbolul desemneaz limbajul format din irul vid, n timp ce

desemneaz limbajul care nu conine nici un ir nici irul vid. Exemplu 3.2. Fie = {a, b, c} . Exemple de expresii regulare peste
sunt: a, a + b , ab + c i a * + bc . Limbajele pe care le reprezint sunt

urmtoarele: a reprezint limbajul {a} format dintr-un singur ir a


a + b reprezint limbajul {a} {b} = {a, b} format din dou iruri: a i

b
ab reprezint limbajul {a}{b} = {ab} , iar ab + c reprezint limbajul {ab, c} a * reprezint limbajul { , a, aa, aaa, K , a n , K} a * + bc reprezint limbajul {bc, , a, aa, aaa, K , a n , K}

Expresiile regulare pot fi cu mult mai complicate dect acestea. De exemplu, expresia x = ab(a + bc )* (bc + ca ) . O descriere verbal a unui ir din limbajul x poate fi: trebuie s nceap cu ab, urmat de un numr finit de iruri, fiecare dintre ele fiind format din a sau bc, i se termin cu bc sau ca. Aadar, ababcaaca este n x, n schimb baabcab nu.

Exist diferite convenii de notaie folosite la expresii regulate. n continuare le vom prezenta pe scurt. Definiia 3.3. Fie r o expresie regular. Atunci
r n = rr K r (de n ori), i r + = rr *

Astfel, r n desemneaz limbajul irurilor obinute prin concatenarea a n iruri toate din limbajul r. Limbajul r + se obine lund toate concatenrile posibile ale unui numr finit de iruri, fiecare dintre ele aparinnd limbajul r, cu condiia ca acest numr finit s fie strict pozitiv. Se observ uor c r * = r + + ; n particular, dac r atunci r + = r * . n utilizarea expresiilor regulare se folosesc conveniile de preceden cunoscute din algebr: * are precedena mai mare dect concatenarea, care la rndul ei are precedena mai mare dect +. Deci, a (b* ) poarte fi scris ca ab* i (ab) + c ca ab + c . Algebra expresiilor regulare are majoritatea, dar nu toate, proprietile algebrei obinuite. Vom prezentm n continuare unele dintre ele. Teorema 3.2. Fie expresiile regulare r1 , r2 , K atunci au loc urmtoarele: 1. r1 + (r2 + r3 ) = (r1 + r2 ) + r3 Asociativitate fa de + 2. r1 + r2 = r2 + r1 Comutativitate fa de + 3. r1 (r2 r3 ) = (r1r2 )r3 Asociativitate fa de concatenare 4. ) r1 (r2 + r3 ) = r1r2 + r1r3 5. r1 + = + r1 = r1 6. r1 = r1 = r1 7. r1 = r1 =
) (r1 + r2 )r3 = r1r3 + r2 r3 Distributivitate

Demonstraie. Proprietile 1 5 sunt imediate pe baza definiiei. Prin 6 se nelege: dac lum irul vid din (expresie regulat) i-l concatenm cu un ir din r1 , obinem acelai ir . n 7, r1 desemneaz mulimea de iruri de foram = 1 2 , unde 1 i
2 r1 . Fiind imposibil de gsit un ir 1 n mulimea vid , nu exist

iruri de forma indicat mai sus, deci r1 = . Q.E.D. n general r1r2 r2 r1 . Deci, 10 01 , deoarece limbajul 10 conine doar irul 10 i limbajul 01 conine doar irul 01. Evident limbajele nu sunt identice. Exemplu 3.3. Expresiile regulare ne permit descrierea limbajelor ntr-un mod simplu i natural. Considerm, de pild, limbajul constantelor reale din Fortran discutate n exemplul 1.4. Alfabetul acestui limbaj este

= {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, +, , ., E}

Fie d = 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 o expresie regular peste ; d (expresie regulat) reprezint limbajul format din numere simple:
d = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} . Limbajul constantelor reale din Fortran poate fi

descris acum ntr-un mod natural astfel

(+ + + )(d + . d + + d + . + . d + )( + E ( + + + )d + )

Un alt exemplu ar fi limbajul identificatorilor din Fortran. Ei sunt definii ca orice combinaie de 1 7 caractere care ncepe cu o liter (vezi [10]). Expresia regular care desemneaz acest limbaj este
u( + v + v 2 + v 3 + v 4 + v 5 + v 6 )

unde u = A + B + C + L + X + Y + Z i v = u + 0 + 1 + L + 8 + 9 = u + d . 3.3. LIMBAJE REGULARE I EXPRESII REGULARE Avnd introdus o nou modalitate de descriere a limbajelor, ne ntrebm care este diferena ntre aceast metod i ceea veche. Vom descoperi c n afara unor convenii de notaie n-am obinut mult. Teorema 3.3. Un limbaj L poate fi descris de o expresie regular dac i numai dac este limbaj regular (adic are o gramatic regular). Demonstraie. Presupunem c avem un limbaj regular L i vream s gsim o expresie regular care-l descrie (presupunem c exist). L fiind regular, exist o main cu stri finite care accept limbajul L. Fie, de exemplu, aceast main maina din figura 3.1. n aceast figur starea acceptat este Q2 , dar intenionat nu specificm starea iniial. Pentru fiecare i = 0, 1, 2 , fie M i maina de mai sus cu starea iniial Qi , i fie
L( M i ) limbajul acceptat de M i . Presupunem c teorema 3.3. este

adevrat, i fie Qi expresia regular care descrie limbajul L( M i ) . Artm n continuare c expresia regular trebuie s satisfac mai multe relaii algebrice. Pentru Q0 , de exemplu, cerem ca

Q0 = bQ0 + aQ1

(1.6)

i presupunem c este un ir acceptat de M 0 , adic, Q0 . Acest ir trebuie s nceap cu simbolul a sau b. Dac ncepe cu a, atunci
= a 1 , deci dup citirea simbolului a, maina va trece n starea Q1 i

ncepe s citeasc 1 . Dac M 0 accept = a1 , atunci M 1 (adic maina cu starea iniial Q1 ) trebuie s accepte 1 , deci 1 Q1 i a 1 aQ1 .

Figura 3.1. Construcia unei expresii regulare dintre-o MSF. n mod analog, dac ncepe cu b, atunci = b 2 i 2 trebuie s fie acceptat de M 0 (dup ce M 0 citete simbolul b, rmne n starea Q0 ). Deci bQ0 . Aadar, oricare ar fi un ir Q0 , el este i n bQ0 + aQ1 . Se observ uor c dac un ir aparine prii drepte din (3.6), trebuie s aparin i prii stngi. Firete, fiecare astfel de ir va fi de forma b1 , cu
1 Q0 (adic, este acceptat de M 0 ), sau de forma a 2 , cu 2 Q1 ( este

acceptat de M 1 ). n ambele cazuri este acceptat de M 0 . Ca urmare (3.6) este adevrat. Pornind cu starea Q1 i procednd n exact acelai mod, avem ecuaia

Q1 = aQ1 + bQ2

(1.7)

Considerm acum starea Q2 i expresia regular Q2 , care descrie limbajul


L( M 2 ) . Q2 trebuie s conin expresia regular aQ2 + bQ0 . Deoarece Q2

este o stare acceptat, Q2 va trebuie s conin i irul . Ecuaia pentru


Q2 este

Q2 = aQ2 + bQ0 +

(1.8)

Aceasta arat, c dac limbajele L( M i ) sunt descrise de expresiile regulare Qi , i = 0, 1, 2 , atunci aceste expresii sunt soluiile sistemului de ecuaii

X 0 = bX 0 + aX1 X1 = aX1 + bX 2 X 2 = aX 2 + bX 0 +

(1.9)

Pentru a arta c fiecare dintre limbajele L( M i ) poate fi descris de o expresie regular, este de ajuns s artm urmtoarele dou lucruri: I. II. Sistemul de ecuaii (3.9) are soluie. Dac Q0 , Q1 i Q2 sunt expresii regulare care satisfac (3.9), atunci fiecare Qi este identic cu
L( M i ) (1.10)

ncepem mai nti cu II. Presupunem c sistemul de ecuaii (3.9) are o soluie X 0 = Q0 , X1 = Q1 i X 2 = Q2 . Cerem ca aceste expresii regulare

Qi s descrie limbajele L( M i ) , adic, Qi = L( M i ) . Ceea ce trebuie s

artm este, c dat fiind un ir acesta aparine lui L( M i ) dac i numai dac aparine lui Qi i = 0, 1, 2 . (Nu am stabilit dac sistemul (3.9) are o soluie sau, dac exist, cum s-o gsim.) Demonstraia se face prin inducie dup lungimea k a irului . Presupunem c are lungimea 0; deci = . Evident, este acceptat numai de L( M 2 ) i aparine lui Q2 (din prima ecuaie (3.9) avem c orice ir din Q1 trebuie s nceap cu a sau b; analog pentru iruri din Q0 ). Pentru k = 0 este adevrat. Presupunem c este adevrat pentru k, i fie un ir de lungime k + 1 ,
= x , unde este de lungime k. Dac este n Q2 , atunci din ecuaia a

treia din (3.9), x trebuie sie fie a, caz n care este n Q2 , sau b, caz n care trebuie s fie n Q0 . Din ipoteza induciei, avem c este acceptat fie de M 2 fie de M 0 . Dar aceasta nseamn c este acceptat de M 2 , deoarece dup ce M 2 citete x, trece n M 2 sau M 0 , iar atunci citete . Acelai argument este valabil i pentru iruri din Q0 i Q1 : Orice ir de lungime k + 1 care este n Qi trebuie s fie n L( M i ) . Reciproc, presupunem c irul este acceptat de M 1 , atunci x trebuie s fie sau a sau b. Dac x = b , atunci este acceptat de M 2 , iar din ipoteza inducie,
este n Q2 i, conform ecuaiei a doua din (3.9), este n Q1 . Analog se

procedeaz pentru x = a i cnd este acceptat de alte M i -uri. Aceasta demonstreaz II. din (3.10). Rmne de artat c sistemul de ecuaii (3.9) are o soluie i cum se gsete ea. Vom folosi urmtoarea lem.

Lema 3.1. Considerm ecuaia

x = ux + v

(1.11)

unde u i v sunt expresii regulare date i x este expresia regular care trebuie gsit. Atunci sunt adevrate urmtoarele: 1. Expresia regular x = x *v este o soluie pentru (3.11). 2. Dac irul vid nu aparine limbajului descris de u, atunci x = x *v este singura soluie pentru (3.11).

Demonstraie. Pentru a demonstra 1, trebuie s artm c

u*v = uu*v + v

(1.12)

ceea ce nseamn c ambele pri din (3.12) desemneaz aceeai mulime de iruri. Fie un ir din u*v . Atunci poarte fi scris ca = 1 2 , unde
1 u* i 2 v . Dac 1 , 1 uu* uu* + v ( 1 este o concatenare a

unui numr pozitiv, finit de iruri din u). Dac 1 =

atunci

= 2 v uu* + v . Astfel, partea stng din (3.11) este o submulime a

parii drepte. Reciproc, presupunem c uu*v + v . Dac uu*v , atunci aparine i lui u*v , dac este n v, atunci este de asemenea n u*v . Ca urmare (3.12) este adevrat.

Pentru a demonstra 2 este de ajuns s artm c dac u , atunci soluia pentru (3.11) este unic. ( x = u*v este ntotdeauna o soluie.) Presupunem atunci c avem dou soluii x1 x2 care satisfac (3.11):

x1 = ux1 + v x2 = ux2 + v

(1.13)

Prin x1 x2 nelegem c x1 i x2 descriu limbaje diferite, adic, exist un ir care aparine unuia dar mu i celuilalt. Fr a pierde din generalitate, putem presupune c exist un ir n x1 dar nu i n x2 ; fie cel mai scurt
astfel de ir. Deci, x1 i x2 , dac este un ir oarecare din x1 de lungime mai mic dect lungimea lui , atunci aparine lui x2 .

Deoarece x1 , avem, conform din primei ecuaii din (3.13), c ux1 sau v . Dar nu poate aparine lui v, deoarece ar aparine atunci i lui
x2 , din a doua ecuaie (3.13). Aadar, = 1 1 , unde 1 u i 1 x1 .

Avnd u , irul 1 , deci 1 este strict mai mic dect i, conform cele de mai sus, aparine lui x2 . Ceea ce implic c 1 1 , i astfel , aparin lui ux2 , i, din a doua ecuaia (3.13), lui x2 . Acesta oricum contrazice alegerea lui . Q.E.D. Acum putem rezolva sistemul de ecuaii (3.9), pe care-l reproducem n continuare.

X 0 = bX 0 + aX1 X1 = bX1 + aX 2 X 2 = bX 2 + aX 0 +

(1.14)

Rezolvm n X 2 (folosind lema 3.1. cu u = a i v = bX 0 + ) ecuaia a treia din (3.14).

X 2 = a * (bX 0 + ) = a *bX 0 + a *

i soluia este unic. nlocuind aceast expresie n primele dou ecuaii din (3.14) obinem dou ecuaii cu dou necunoscute.

X 0 = bX 0 + aX1 X1 = aX1 + ba*bX 0 + ba *

(1.15)

Rezolvnd a doua ecuaie n X1 (cu u = a i v = ba*bX 0 + ba* ) obinem

X1 = a * (ba*bX 0 + ba * ) = a *ba *bX 0 + a *ba*

Substituind aceasta n prima ecuaie din (3.15) avem

X 0 = (n + aa *ba *b) X 0 + aa *ba *

care n final ne d X 0 = Q0 = (b + aa*ba*b)* aa *ba* o expresie regular care descrie limbajul L( M 0 ) din figura 3.1. n mod analog se procedeaz pentru X1 i X 2 ; astfel putem gsi o expresie regular care descrie fiecare dintre limbajele L( M i ) , i = 0, 1, 2 din figura 3.1. Metoda poate fi uor extins pe caz general. Fiind dat o main cu stri finite M = {Q, , Q0 , , F} , pentru a gsi o expresie regular care

descrie limbajul L( M ) , procedm n felul urmtor. Pentru fiecare stare


Q0 , Q1 , K , Qn scriem o ecuaie n expresii regulare:

X i = ri k , i = 0, 1, 2, K , n
k

(1.16)

unde pentru fiecare i, ri k este definit astfel:

1. Dac Qi este o stare acceptat, se include n ri k . 2. Dac (Qi , a) = Q j este o tranziie valid, se include aX j n ri k .

Formal, ecuaia (3.16) poate fi scris ca

Xi =

( Qi , a ) =Q j

aX j + i

(1.17)

unde i = dac Qi este stare acceptat, i i = dac Qi nu este stare acceptat. Se poate arta atunci (utiliznd lema 3.1.) c sistemul de ecuaii (3.17) are o soluie X 0 = Q0 , X1 = Q1 , K , X n = Qn i c fiecare Qi este o expresie regular care descrie limbajul mainii M i obinut din M prin schimbarea strii iniiale n Qi . Maina M este atunci dat de Q0 . Pentru a calcula Q0 din sistemul (3.17) procedm invers: Utiliznd lema 3.1. rezolvm pentru X n din ultima ecuaie i substituim rezultatul n cele
n 1 ecuaii precedente. Repetnd acesta de n 1 ori, ajungem la o singur

ecuaie de forma

X 0 = X 0 +

pe care o rezolvm, din nou, folosind lema 3.1. Argumentele sunt aproape aceleai ca cele folosite la demonstraia pe caz special, i pot fi neglijate. Vom ilustra ntregul procedeu pe un exemplu. Exemplu 3.4. Considerm maina cu stri finite din figura 3.2. Ecuaiile (3.17) corespunztoare sunt

X 0 = aX1 + bX 2 X1 = bX1 + aX 3 X 2 = bX1 X 3 = aX 2 +

Figura 3.2. O main cu stri finite. Substituind valorile pentru X 3 din ultima ecuaie n celelalte ecuaii, obinem sistemul

X 0 = aX1 + bX 2 X1 = bX1 + aaX 2 + a X 2 = bX1

Substituim atunci X 2 n primele dou ecuaii pentru a obine sistemul

X 0 = aX1 + bbX1 X1 = bX1 + aaX1 + a = (b + a 2 b) X1 + a

Rezolvnd n X1 ultima ecuaie (cu lema 3.1.), obinem X1 = (b + a 2 b)* a , i n final, substituind aceasta n prima ecuaie i rezolvnd n X1 , obinem descrierea mainii L( M 0 ) printr-o expresie regular: (a + b 2 )(b + a 2 b)* a . Unele consideraii asupra lemei 3.1. (Ecuaia x = ux + v are o soluie x = u*v i ea este unic dac u ). Dac u , soluia nu trebuie s fie unic. Considerm ecuaia

x = (a + ) x + ab

Conform lemei 3.1., o soluie este x1 = (a + )* ab , dar, cum se poate verifica uor, x2 = (a + )* ab + b este tot o soluie, i x1 x2 . Un caz special apare cnd v = . Dac u , atunci singura soluie pentru x = xu + este
x = . Aadar conform lemei 3.1. singura soluie este x = u* = . Deci

am demonstrat prima parte a teoremei 3.3: Orice limbaj regular poate fi descris printr-o expresie regular. n continuare vom arta cum se construiete o main cu stri finite dintr-o expresie regular. Mai nti, vom face acesta pentru expresii regulare simple: , i a. Teorema 3.4. Fie M 1 , M 2 i M 3 mainile cu stri finite date de diagramele figurii 3.3. Atunci L( M 1 ) = , L( M 2 ) = i L( M 3 ) = a .

Figura 3.3. Automate finite simple. Demonstraia este evident. Mainile M 1 i M 2 sunt ceva mai complicate de ct ar trebui s fie, motivul va fi explicat mai trziu. Observm c M 1 i M 2 nu au tranziii; (Q, x) = pentru toate strile Q i simbolurile de intrare x. Fie L, L1 i L2 limbajele regulare acceptate de mainile cu stri finite M , M 1 i M 2 . Mai presupunem c avem o metod de construire a mainilor N, N1 i N 2 (folosind M , M 1 i M 2 ) astfel nct L* = L( N ) ,
L1 + L2 = L( N1 ) i L1 L2 = L( N 2 ) (vezi definiia 3.1.). Dac avem o astfel de

metod, atunci, dat fiind o expresie regular r, vom putea construi o main cu stri finite K astfel nct L( K ) = r . r se obine din expresiile regulare , i a, aplicnd succesiv operaiile de concatenare, + i * (vezi definiia 3.2.). Dar, mainile corespunztoare pentru , i a sunt deja cunoscute din teorema 3.4. Metoda de construire pentru N, N1 i N 2 este evident. Dac mainile M 1 i M 2 pentru L1 respectiv L2 sunt cunoscute, construim maina pentru L1L2 legnd M 1 i M 2 , ca n figura 3.4. La construirea mainii pentru L1 + L2 , reunim M 1 i M 2 n mod paralel, ilustrat n figura 3.5. n final, pentru a construi maina N pentru L( M )* legm n jurul lui M ca n figura 3.6.

Se combin aceste dou stri

Figura 3.4. Main pentru limbajul L1L2 .

Se combin aceste dou stri

Se combin aceste dou stri

Figura 3.5. Main pentru limbajul L1 + L2 .

Se combin aceste dou stri

Figura 3.6. Main pentru limbajul L( M )* . Este evident, c descrierea acestor construcii trebuie s fie mai precis. Mainile M , M 1 i M 2 pot avea mai mult dect o stare acceptat, i apar dificulti la alegerea strilor care vor fi combinate. Pentru aceasta vom dezvoltm n continuare o descriere matematic precis. Definiia 3.4. Fie M o main cu stri finite. Spunem c M este direct dac satisface urmtoarele condiii:

1. Nu exist tranziii care duc n starea iniial Q0 din M. Cu alte cuvinte, pentru orice stare Q i orice simbol de intrare x,
Q0 (Q, x)

2. Maina M are una sau dou stri acceptate. Una dintre ele, fie ea
QF , este diferit de starea iniial Q0 i are proprietatea c nu exist

tranziii din ea, adic, (QF , x) = , oricare ar fi x. Cealalt stare acceptat, dac exist, trebuie s fie starea iniial Q0 . Schematic, o main direct are una din formale indicate n figura 3.7. Vom folosi aceste maini directe pentru realizarea construciei indicate mai sus.

O stare acceptat QF

Dou stri acceptate Q0 i QF

Figura 3.7. Maini directe. Mai nti avem: Lema 3.2. Fiind dat o main oarecare cu stri finite M, exist o main direct K astfel nct L( M ) = L( K ) . Demonstraie. Fie M = {Q, , Q0 , , F} cu strile Q0 , Q2 , K , Qn . Pentru a construi maina K, sunt adugate dou stri noi I i F i se fac urmtoarele modificri.

1. Starea iniial din K este I. 2. F este stare acceptat n K. n plus, dac Q0 este stare acceptat n M, atunci i I este o stare acceptat din K. 3. Pentru fiecare tranziie de forma Q0 Q din M, se adaug tranziia
I Q n K. 4. Pentru fiecare tranziie de forma Q0 Q din M, unde Q este o stare
x x

acceptat, se adaug tranziia Q F n K. 5. Pentru fiecare tranziie de forma Q0 Q din M, unde Q0 este o stare iniial i Q o stare final, se adaug tranziia I Q n K. 6. Relaiile de tranziie ntre Q-uri rmn neschimbate, starea Q0 nu va mai fi stare iniial (este I), i strile acceptate din M devin neacceptate. Trebuie subliniat faptul c o tranziie din M poate genera mai multe tranziii n K. De pild, dac M are 3 stri: Q0 (iniial), Q1 i Q2 (acceptat), atunci tranziia Q0 Q2 va genera tranziiile I Q2 (regula 1),
Q0 F (regula 4) i I F (regula 5).
x x x x

Artm n continuare c M i K accept acelai ir. Presupunem c


= este acceptat de M, atunci Q0 trebuie s fi stare acceptat n M, deci

I este o stare acceptat n K, deoarece L( K ) . Reciproc, L( K ) dac i numai dac I este stare acceptat n K, dar aceasta are loc numai dac
Q0 este stare acceptat n M, deci L( M ) . Fie acum = x1 x2 K xm un ir

nevid din L( M ) . Cu input-ul maina M trece prin urmtoarea secven de configuraii:

Q0 , x1 x2 K xm 1 xm Q1 , x2 K xm 1 xm Qm 1 , xm Qm ,

unde Qm este stare acceptat n M. Astfel Q0 Q1 i Qm1 Qm sunt tranziii legale din M, deci I Q1 i Qm 1 F sunt tranziii n K. Aadar,
x1 xm

x1

xm

cu input-ul , maina K trece prin urmtoarea secven de micri:

I , x1 x2 K xm 1 xm Q1 , x2 K xm 1 xm Qm 1 , xm F ,

ca urmare L( K ) . Procednd n mod similar, observm ca dac


L( K ) atunci va fi totodat i n L( M ) . Q.E.D.

Exemplu 3.5. Presupunem o main M dat de diagrama din figura 3.8. Maina direct corespunztoare K este atunci descris de figura 3.9.

Figura 3.8.
b b a

De pild, tranziia Q1 F este inclus deoarece Q1 Q2 (regula 4); I Q1 este inclus deoarece Q0 Q1 (regula 2). Dac Q0 ar fi o stare acceptat n M, atunci I ar trebui s fie o stare acceptat din K, i am avea trei tranziii
a

adiionale: Q0 F (regula 4 aplicat la Q0 Q0 ), Q2 F (regula 4 aplicat la Q2 Q0 ), i I F (regula 5 aplicat la Q0 Q0 ).


a

Figura 3.9. Main direct. Putem descrie acum cu precizie construciile discutate anterior definiiei 3.4. Teorema 3.5. Fie M 1 , M 2 i M maini cu stri finite. Atunci fiecare dintre limbajele L( M 1 ) + L( M 2 ) , L( M 1 ) L( M 2 ) i L( M )* este acceptat de o main cu stri finite. Demonstraie. Fr a pierde din generalitate, putem presupune c
M 1 , M 2 i M sunt maini directe, dac nu, ele pot fi convertite n maini

directe folosind lema 3.2. Fie I1 , I 2 i I strile iniiale ale mainilor M 1 ,


M 2 i M respectiv F1 , F2 i F strile finale. Pentru a construi o main

care accept L( M 1 ) + L( M 2 ) contopim strile iniiale din M 1 i M 2 , i strile finale F1 i F2 . Schematic, noua main are diagrama reprezentat n figura 3.10. Starea iniial este indicat printr-o sgeat i starea

final printr-un cer dublu. Dac I1 sau I 2 (sau amndou) sunt stri acceptate, atunci I1 = I 2 este tot o starea acceptat a mainii. Evident, limbajul acceptat de MSF este L( M 1 ) + L( M 2 ) . Pentru a construi o main care accept starea ( L( M ))* procedm astfel: legm maina n jurul lui M, astfel nct s combinm I i F ntr-o stare nou care va fi stare iniial i n acelai timp stare acceptat. Aceasta este reprezentat schematic n figura 3.11. Evident, construcia va da o un rezultat corect.

Figura 3.10. Main pentru limbajul L( M 1 ) + L( M 2 ) .

Figura 3.11. Main pentru limbajul ( L( M ))* . La construirea mainii L( M 1 ) L( M 2 ) apar complicaii minore. Fictiv, atam M 2 la sfritul lui M 1 , adic, strile I 2 i F1 s fie combinate ntr-una, iar diagrama rezultat ar trebui s fie de forma celei din figura 3.12. n esen, aceasta este ceea ce se va face, mai mult atenie trebuie

acordat cazului n care unul dintre limbaje conine un ir vid. Considerm, de exemplu, situaia n care L( M 1 ) (adic I1 este stare acceptat) i un ir nevid oarecare din L( M 2 ) . Atunci, irul este n L( M 1 ) L( M 2 ) , dar nu exist nici o posibilitate pentru ca s fie trimis prin M 1 la M 2 .

Figura 3.12. Main ipotetic pentru L( M 1 ) L( M 2 ) . Pentru a realiza aceasta trebuie s considerm mai multe cazuri reprezentate n figura 3.13. Se observ, c n toate cele patru cazuri, aceste maini vor accepta limbajul L( M 1 ) L( M 2 ) . Q.E.D. Cazul I. L( M 1 ) i L( M 2 ) I1 este neacceptat i I 2 este neacceptat.

Cazul II. L( M 1 ) i L( M 2 ) I1 este neacceptat i I 2 este acceptat.

Cazul III. L( M 1 ) i L( M 2 ) I1 este acceptat i I 2 este neacceptat.

Maina M 2 se reproduce de dou ori. Cazul IV. L( M 1 ) i L( M 2 ) I1 este acceptat i I 2 este acceptat.

Maina M 2 se reproduce de dou ori. Figura 3.13. Maini pentru limbajul L( M 1 ) L( M 2 ) . Exemplu 3.6. Fie M 1 i M 2 dou maini cu stri finite descrise de diagramele din figura 3.14.

Maina M 1

Maina M 2

Figura 3.14. Dou maini cu stri finite.

Mainile pentru L( M 1 ) + L( M 2 ) , ( L( M ))* , L( M 1 ) L( M 2 ) i L( M 2 ) L( M 1 ) sunt atunci date de diagramele figurii 3.15. Conform cazului III i figurii 3.13, n diagrama lui L( M 2 ) L( M 1 ) maina M 1 trebuie s fie reprodus de dou ori. Pentru a distinge cele dou reproduceri, notm strile unei copii ai lui
M 1 cu I1 , A, B, F1 respectiv I1 , A , B i F1 .

Am demonstrat deci teorema 3.3: Un limbaj este regular dac i numai dac poate fi descris de o expresie regular. nainte de a da un exemplu de construire a unei maini cu stri finite dintr-o expresie regular, demonstrm n plus o proprietate a limbajelor regulare. Dac L este un limbaj peste alfabetul , notm cu L limbajul irurilor din * care nu aparin lui L acest limbaj se numete complementul lui L. Dac
L1 i L2 sunt dou limbaje, notm cu L1 L2 toate irurile care se regsesc

n ambele limbaje, L1 i L2 . (A nu se confunda cu limbajul L1L2 , a irurilor din L1 concatenate cu toate irurile din L2 .) Avem urmtoarele. Teorema 3.6. Presupunem c L, L1 i L2 sunt limbaje regulare. Atunci i urmtoarele limbajele sunt regulare: L* , L1L2 , L1 + L2 , L , L1 L2 .

Demonstraie. Singurele limbaje neacoperite de teorema 3.6. sunt

( L( M 2 ))* L( M 1 ) L( M 2 ) :

L( M 1 ) + L( M 2 )

L( M 2 ) L( M 1 ) :

Figura 3.15. Combinaii de maini.

limbajele L i L1 L2 . Dac L este un limbaj regular, fie atunci M o main cu stri finite care accept L. Construim acum o main cu stri finite M prin interschimbarea strilor acceptate i neacceptate din M strile neacceptate vor deveni stri acceptate i invers). Evident c
L = L( M ) , aadar L este de asemenea un limbaj regular. n final, este uor

de observat c L1 L2 = L1 + L2 , deci L1 L2 este tot un limbaj regular. Q.E.D. Exemplu 3.7. Construim o main cu stri finite care recunoate limbajul 01(10)* + 1(1* + 0) . Vom merge din aproape n aproape. Maini pentru 01 i 10 sunt

Conform teoremei 3.6, maina pentru (10)* este

Din lema 3.2. maina direct pentru (10)* va fi

Astfel, din teorema 3.6. avem urmtoarea main pentru 01(10)*

Maina direct pentru 01(10)* , conform lemei 3.2, este

(Strile A i B pot fi eliminate.) Mainile pentru 1 i 1* sunt (teorema 3.6.)

Maina direct pentru 1* (lema 3.2.)

Maina pentru 1* + 0 este atunci

i astfel, maina pentru 1(1* + 0) va fi (teorema 3.6.)

Maina direct pentru 1(1* + 0)

(Strile A i B pot fi eliminate.)

n final, conform teoremei 3.6., maina pentru 01(10)* + 1(1* + 0) va fi

3.4. MAINI CU OUTPUT Deseori este convenabil s considerm maini cu stri finite care pe lng unor treceri prin stri interne, au i un dispozitiv de ieire. De exemplu, presupunem c primim un flux de 0 i 1-uri i dorim s dam un mesaj de atenionare de fiecare dat cnd trei sau mai multe simboluri de 1 sunt recepionate succesiv. n secvena

0110111101110010

sgeata indic poziia la care apare mesajul. O modalitate formal de descriere a uni astfel de proces este urmtoarea: Considerm o main cu stri finite M, cu 4 stri, notate sugestiv [00], [01], [10] i [11]. Dac
1 2 K k 1 k K este un ir de 0 i 1-uri, presupunem c la ntlnirea

simbolului k maina se afl n starea [ k 1 , k ] (fiecare j este sau 1 sau 0). Dup recepionarea a dou -uri, starea iniial este specificat iar

urmtoarele micri ale mainii sunt determinate de diagrama din figura 3.16.

Figura 3.16. Main cu output. De pild, presupunem c primele dou simboluri primite sunt 00 astfel nct maina ncepe cu starea iniial [00]. Mai presupunem c simbolurile subsecvenei sunt 101110. Maina va trece atunci prin urmtoarea secven de micri:

[00] [01] [10] [01] [11] [11] [10]

Conform cerinelor problemei, la trecerea mainii din starea [11], cu input-ul 1, napoi n starea [11], adic la tranziia [11] [11] , trebuie luat o decizie (lansarea mesajului) iar la toate celelalte tranziii, trebuiesc luate alte decizii. Aceasta poate fi descris matematic printr-o funcie
F (Q, x) , unde Q este o stare i x un simbol de intrare. n exemplul
1

discutat, funcia F este dat astfel

A dac Q = [11] i x = 1 F (Q, x) = B n rest

(1.18)

Ca urmare F (Q, x) descrie output-ul mainii n timpul tranziiei din Q n


(Q, x) ( este funcia de tranziie a mainii). Maini de acest tip se

numesc maini Mealy, vezi [16]. Formal avem: Definiia 3.5. O main Mealy Me este o pereche Me = ( F , M ) , unde M este o main cu stri finite obinuit i F = F (Q, x) este o funcie definit pentru toate strile Q i simbolurile de intrare x, cu valori n mulimea nevid S ( F : Q S , unde Q este o mulime de stri din M i
este alfabetul de intrare din M). Mulimea S se numete alfabetul de

ieire pentru Me.


Interpretarea lui F este c n timpul tranziiei Q Q maina
x

genereaz output-ul F (Q, x) . La fel ca n cazul mainilor cu stri finite, mainile Mealy pot fi deterministe sau nedeterministe n funcie de automatul finit care le st la baz. O modalitate convenabil de descriere a unei maini Mealy este prin utilizarea de diagrame similare cu cele folosite la descrierea automatelor finite. Presupunem c o main se afl n starea Q iar simbolul de intrare este x, astfel ca urmtoarea stare s fie
Q = (Q, x) iar output-ul s fie X = F (Q, x) . n diagram se indic aceasta

astfel

Prin urmare, maina cu stri finite din figura 3.16, n conjuncie cu funcia de ieire din (3.18), d o main Mealy cu diagrama din figura 3.17.

Exemplu 3.8. Presupunem c primim un flux de simboluri, fiecare dintre ele fiind 0, 1 sau 2 i vrem s construim o main care emite simbolul a ori cte ori suma a trei simboluri consecutive este 0, 1 sau 4; i simbolul b dac suma a trei simboluri consecutive este 2 sau 3; iar c dac suma a trei simboluri consecutive este 5 sau 6. Maina Mealy Me care simuleaz aceast situaie poate fi descris astfel. Alfabetul de intrare este mulimea = {0, 1, 2} . Strile sunt perechile [xy], unde x i y sunt din maina se afl n starea [xy] dac ultimele dou simboluri de intrare sunt x i y (n aceast ordine). Exist 9 astfel de stri, iar dup primirea primelor dou simboluri, starea iniial este determinat.

Figura 3.17. O main Mealy. Diagrama complet a unei astfel de maini este prea complexe, motiv pentru care va fi redat doar un fragment ilustrat n figura 3.18.

Figura 3.18. Un fragment de main Mealy.


1a

De exemplu, tranziia [12] [21] nseamn, c dac maina se afl n starea [12] i primete input-ul 1, va trece n starea [21], i are ca output, n timpul tranziiei, simbolul a. Acestea corespunde configuraiei mainii, deoarece fiind n starea [12], ultimele dou simboluri recepionate au fost 1 i 2, n aceast ordine. Input-ul 1 face suma ultimelor trei input-uri egal cu 4, deci output-ul a este emis iar starea urmtoare este [21]. ntreaga main Me poate fi reprezentat sub form tabelar ca n figura 3.19. n acest tabel (Q, x) desemneaz urmtoarea stare i F (Q, x) desemneaz output-ul mainii n timpul tranziiei din Q n (Q, x) .

Simbol de intrare Starea curent aQ [00] [01] [01] [10] [11] [12] [20] [21] [22]
(Q, 0)

0
F (Q, 0)

1
(Q, 1)
F (Q, 1)

2
(Q, 2)
F (Q, 2)

[00] [10] [20] [00] [10] [20] [00] [10] [20]

a a b a b b b b a

[01] [11] [21] [01] [11] [21] [01] [11] [21]

a b b b b a b a c

[02] [12] [22] [02] [12] [22] [02] [12] [22]

b b a b c c b c c

Figura 3.19. Tabela de tranziie a unei maini Mealy. Presupunem, de exemplu, c primele dou simboluri primite sunt 2, 0, deci starea iniial este [20], i urmtoarele cinci input-uri sunt 1, 2, 2, 0. Atunci maina va trece prin urmtoarea secven de micri:

[20] [01] [12] [22] [20]

1b

2b

2c

0a

Astfel secvena de intrare 1, 2, 2, 0 produce secvena de ieire b, b, c, a. Exist o alt modalitate de asociere a unui output la o main cu stri finite, i anume, prin a cere ca acest output s fie emis n timp ce

maina rmne ntr-o stare (i nu n timpul tranziiei dintre dou stri, ca n cazul mainilor Mealy). De pild, considerm din nou problema fluxurilor de 0 i 1-uri la care dorim s semnalm apariia unei succesiuni de trei 1-uri. O modalitate de simulare a acestei situaii este de a considera o main cu stri finite cu 8 stri: [000] [001] [010] [011] [100] [101] [110] [111]. Starea [1 , 2 , 3 ] nseamn c primele teri simboluri primite sunt 1 , 2 i
3 (n aceast ordine). Funcia de tranziie este definit ca

([1 2 3 ], 4 ) = [ 2 3 4 ]

Odat ce primele trei simboluri sunt primite, starea iniial este determinat iar maina i continu activitatea. Vom construi n continuare o funcie de ieire G, definit pentru fiecare stare prin

A dac [1 , 2 , 3 ] = [111] G ([1 , 2 , 3 ]) = B n rest

Funcia G depinde numai de strile mainii, spre deosebire de funcia de ieire F, a mainii Mealy, care depinde de amndou, adic de stare i de input. Maini de acest tip se numesc maini Moore, vezi [17]. Formal, avem urmtoarea definiie pentru ele.

Definiia 3.6. O main Moore Mo se compune din dou obiecte: 1. O main cu stri finite 2. O funcie G (Q) definit pentru toate strile Q din Mo cu valori ntr-o mulime nevid S, numit alfabetul de ieire a lui Mo La fel ca automatele finite sau mainile Mealy, i mainile Moore pot fi reprezentate printr-o diagram. Fiecare stare fiind o pereche (Q, X ) , unde Q este o stare iar X = G (Q) este output-ul asociat strii Q. De pild, maina Moore descris anterior (care detecteaz aparena unei secvene de trei 1-uri dintr-un flux de 0 i 1) are diagrama din figura 3.20. Comparnd aceast diagrama cu diagrama mainii Mealy pentru aceeai problem, observm c diferena esenial const n funcia de ieire. Cnd irul vid este primit de o main Mealy, nu va fi produs un output atta timp ct nu are loc o tranziie. Pe de alt aparte, maina Moore va produce output-ul G (Q0 ) asociat cu starea iniial. Astfel, la un input dat, output-ul mainii Moore va fi ntotdeauna cu un simbol mai lung dect output-ul unei maini Mealy. De exemplu, presupunem c starea iniial a mainii Mealy din figura 3.17. este [00] i starea iniial a mainii Moore din figura 3.20. este [000].

Figura 3.20. O main Moore. Dat fiind input-ul = 11101 , maina Mealy va produce ca output BBABB, iar maina Moore BBBABB are un B n plus n fa. Din acest motiv este imposibile s construim o main Mealy echivalent cu o main Moore dat, i reciproc. Dac neglijm ns simbolul iniial al output-ului mainii Moore, cele dou dispozitive sunt echivalente. Introducem urmtoarea definiie. Definiia 3.7. Fie M o main Mealy sau Moore. Pentru fiecare ir de intrare fie H M ( ) irul de ieire generat de M la input-ul . Spunem c dou maini M i M (amndou sau Mealy sau Moore) sunt echivalente dac pentru orice input avem H M ( ) = H M ( ) . Fie M o main Mealy i K o main Moore. Spunem c M i K sunt echivalente dac pentru fiecare ir de intrare

avem

H K ( ) = XH M ( ) , unde X este un simbol din alfabetul de ieire. Cu alte

cuvinte, presupunnd c neglijm simbolul iniial al output-ului din K, amndou vor produce la acelai input acelai output.

Pe baza acestei definiii, dat fiind o main de un tip, se poate construi o main echivalent de tipul cellalt. Teorema 3.8. Dac M este o main Mealy, atunci exist o main Moore K echivalent cu M. Reciproc, dat fiind o main Moore K, exist o main Mealy M echivalent cu K. Demonstraie. Fie M o main Mealy cu strile Q0 (starea iniial),
Q1 KQn , alfabetul de ieire { X 1 ,K , X m } , alfabetul de intrare {x1 , K, x j } i

funcia de ieire F (Q, x) . Strile mainii Moore corespunztoare K, vor fi toate perechile posibile de {Q, X } , unde Q este o stare din M i X este un simbol de ieire din M. Starea iniial pentru K este {Q0 , X 1} . Funcia de ieire G n K este definit prin

G ({Q, X }) = X .

Tranziiile din K sunt definite de urmtoarea regul:

Dac Q Q este o tranziie pentru M , atunci {Q, B} {Q, X } este o tranziie pentru K , oricare ar fi B un simbol de ieire

x/ X

(1.19)

Cu alte cuvinte, dac diagrama de tranziie pentru M conine fragmentul

atunci diagrama de tranziie pentru K va conine un fragment de forma

Evident, c dac M, cu input-ul x1 x2 K xr , trece prin secvena de stri Q0 (= Q0 ), Q1 , K , Qr i emite ca output X 1 X 2 K X r , atunci maina K va trece prin secvena de stri {Q0 , X 1}, {Q1 , X 1}, {Q2 , X 2 }, K, {Qr , X r } i va emite acelai output X 1 X 1 X 2 K X r (cu excepia simbolului iniial X 1 ). Aadar,

prima tranziie din M este

Q0 Q1

x1 / X1

adic, M trece n starea Q1 i emite simbolul X 1 . Iar K pornete din starea {Q0 , X 1} , deci emite simbolul X 1 iar la input-ul x1 trece n {Q1 , X 1} , unde emite simbolul X 1 , vezi (3.19). Tranziiile urmtoare pentru K i M sunt

acele din (3.19),

Q1 Q2 i {Q1 , X 1} {Q2 , X 2 }

x2 / X 2

x2

astfel nct X 2 este al doilea simbol emis de M i al treilea emis de K.

Continund acest procedeu observm c M i K sunt echivalente.

Pentru a construi o main Mealy dintr-o main Moore K dat, vom proceda n felul urmtor. Notm strile din K cu Q0 (starea iniial),
Q1 , K , Qn , simbolurile de ieire cu X 1 , K, X m i simbolurile de intrare x1 ,K, x j . Fie G (Q) funcia de ieire pentru K (depinde numai de starea Q).

Strile, alfabetul de intrare i de ieire pentru M vor fi identice cu cele pentru K. O stare din K pot fi vzute ca o pereche {Q, G (Q)} , unde Q este o stare i G (Q) este simbolul de ieire emis de K n starea Q. Tranziia i funcia de ieire pentru M sunt date de urmtoarea regul:

Dac {Q, X } {Q, X } este o tranziie pentru K atunci Q Q este o tranziie pentru M .
x/ X

(1.20)

Vzute ca diagrame de tranziie, fiecare fragment din diagrama de tranziie pentru K, figura 3.21.(a), genereaz un fragment al diagramei de tranziie pentru M, figura 3.21.(b).

{Q, X } {Q, X } (a)

QQ (b)

x/ X

Figura 3.21. Tranziii Mealy i Moore.


n mod firesc, dac maina K cu input-ul x1 x2 K xr trece prin secvena de stri {Q0 , X 0 }, {Q1 , X 1}, K, {Qr , X r } emind simbolurile X 0 , X 1 , K, X r , atunci M va trece prin secvena de stri Q0 , Q1 , K, Qr emind simbolurile X 1 , X 2 , K, X r . Q.E.D.

Exemplu 3.9. Considerm maina Mealy dat prin diagrama din figura 3.22.

Figura 3.22. O main Mealy. Maina echivalent Moore are ase stri {Q0 , X } (= starea iniial),
{Q0 , Y }, {Q1 , X }, {Q1 , Y }, {Q2 , X } i {Q2 , Y } . Diagrama ei de tranziie este dat

n figura 3.23.

Figura 3.23. O main Moore.

De exemplu, tranziia {Q1 , Y } {Q0 , X } din maina Moore este inclus deoarece Q1 Q0 este o tranziie a mainii Mealy. Aceast ultim tranziie este responsabil i pentru {Q1 , X } {Q0 , Y } . Similar, {Q2 , Y } {Q2 , Y } este inclus deoarece Q2 Q2 genereaz {Q2 , X } {Q2 , Y } i {Q2 , Y } {Q2 , Y } . Maina din figura 3.23. poate fi simplificat, prin nlturarea strilor
{Q1 , X } i {Q0 , Y } , ele fiind inaccesibile.
0 /Y 0 0 1 0 1/ X

Exemplu 3.10. Considerm maina Moore din figura 3.24.(a). Maina Mealy corespunztoare este reprezentat n figura 3.24.(b). De exemplu, tranziia {Q1 , Y } {Q2 , Y } induce tranziia Q1 Q2 , {Q2 , Y } {Q3 , Y } induce Q2 Q3 , etc. Cu input-ul 100 maina Moore va produce output-ul XYXY, n timp ce maina Mealy emite output-ul YXY. Aceste dou output-uri sunt considerate identice, deoarece n compararea lor neglijm caracterul iniial din output-ul mainii Moore.
(a) (b)
1/ Y 1 1/ Y 1

Figura 3.24. Maini Mealy i Moore.

PROBLEME n problemele 1 7 artai c limbajul dat nu este regular. 1. L = {a 2 nb n c n | n = 1, 2, 3, K} 2. L = {a nb n c n | n = 0, 1, 2, K} 3. L = {a nbc n | n = 0, 1, 2, K} 4. L = {a 3nb n | n = 1, 2, 3, K} 5. L = {a n + mb n c n | n, m = 1, 2, 3, K} 6. L = {a nb m c n m | n, m = 0,1, 2,K} 7. L = {(a nb) p (c m d ) p | n, m, p = 0,1, 2,K} Pentru fiecare dintre problemele 7 14, scriei expresia regular care descrie limbajul dat. 8. 8. L = { {0,1}* | are un subir de forma 111} 9. L = { {a, b}* | are ca subiruri aa i bb} 10. L = { {0,1}* | lungimea lui este divizibil cu 3} 11. L este mulimea tuturor irurilor peste {a, b, c} care conin un numr par de simboluri a. 12. L = { {0,1}* | ncepe cu 0 i are un numr par de 1-uri} 13. L = { {a, b, c}* | nu exist a -uri n partea dreapt a oricrui b din } 14. L = { {a, b, c}* | are dou simboluri a consecutive} 15. Verificai urmtoarele expresii: a. (rs + r )* r = r ( sr + r )* b. (a + b)* = a* (ba* )*

c. (a + b)* = a * + b* d. a + (a + bc )* = (a + bc )* e. ( x + y )* = ( x* + y )* f. (a *b)* = + (a + b)* b 16. Construii o main cu stri finite care accept fiecare din urmtoarele limbaje: a. 1* (0 + 11) + 1(0* + 10) + b. (ab + ba )* + 1 c. a * (b + c )(a* + b* ) d. (a + b*c )* e. ((bc )* + a )* (ac + b*c ) f. (a + (ab + a )* )* + b 17. Gsii o expresie regular care descrie limbajul acceptat de fiecare dintre mainile din figura 3.25. 18. Construii o main direct echivalent pentru fiecare MSF din figura 3.25.(a) i (b).

Figura 3.25. Maini cu stri finite. 19. Construii o main Moore echivalent pentru fiecare main Mealy din figura 3.26.

Figura 3.26. Maini Mealy.

20. Construii o main Mealy echivalent pentru fiecare mainile Moore din figura 3.27.

Figura 3.27. Maini Moore.

CAPITOLUL 4 AUTOMATE PUSH-DOWN 4.1. DEFINIREA UNUI AUTOMAT PUSH-DOWN Am vzut n capitolul 4 c exist gramatici independente de context G pentru care nu exist o maini cu stri finite care recunosc limbajul L(G ) . Exemplul dat a fost limbajul L = {0n1n | n = 1, 2, K} , el se compune din n 0-uri urmai de n 1-uri. Motivul pentru care nu exist o MSF care s recunoasc pe L este, c orice main care ntlnete un ir din acest limbaj ar trebui s memoreze ci de 0 apar n faa irului, iar atunci s verifice dac numrul de 1-uri, care urmeaz, este acelai. Aadar, orice main care recunoate L va avea nevoie de o memorie suplimentar capabil s stocheze o cantitate arbitrar de informaii. Deoarece, prin definiie mainile cu stri finite au doar un numr finit de stri, ele nu pot recunoate limbajul L. Demonstraia complet este dat n paragraful 3.1. Vom introduce acum un nou tip de dispozitiv, care poate memora imput-urile precedente i comportamentul anterior. Aceste dispozitive se numesc automate push-down (APD); ele au avantajul de a fi uor implementate pe calculator. Vom constata c orice limbaj independent de context poate fi recunoscut de o astfel de main. Un automat push-down se compune dintr-un numr finit de stri, un dispozitiv de intrare (mpreun cu un cap de citire) i o stiv cu un pointer de stiv. Figura 4.1. ilustreaz o reprezentare schematic a lui. Automatul push-down funcioneaz n felul urmtor: n orice moment dat maina se afl ntr-o stare Q, pointer-ul de intrare (IP input pointer sau cap de citire) puncteaz spre un simbol a de pe banda de intrare iar pointer-ul de stiv (SP stack pointer) puncteaz spre un simbol Z de pe stiv. Locaia simbolului Z se numete vrful stivei (TOS top of the

stack) Locaiile sub vrful stivei sunt populate cu simboluri de stiv admise iar cele deasupra vrfului se consider goale. Mrimea stivei nu este limitat, dar ntotdeauna finit.

Banda de intrare

Vrful stivei

Stiva

Baza stivei

Figura 4.1. Automat push-down. Pe baza acestor informaii (Q, a i Z) maina poate efectua una sau mai multe dintre urmtoarele aciuni: 1. Schimb starea. 2. Deplaseaz pointer-ul de intrare cu o unitate spre dreapta. 3. nlocuiete simbolul Z din vrful stivei printr-un numr finite de simboluri de stiv acceptate i poziioneaz pointer-ul de stiv pe vrful stivei. 4. Se oprete. Reamintim, c decizia care va fi luat este n exclusivitate determinat de Q, a i Z. n aciunea de tip 3 este permis nlocuirea lui Z

cu irul vid . Caz n care aciunea 3 nseamn eliminarea simbolului Z din stiv i deplasarea pointer-ului de stiv cu o poziie n jos. Operaia se numete POP. Dup ce una sau mai multe dintre aciunile 1 3 au avut
loc, maina se va afl ntr-o stare nou Q , cu pointer-ul de intrare punctnd spre noul simbol de intrare a iar pointer-ul de stiv la noul simbol Z din vrful stivei. ntregul proces se repet pn la oprirea

mainii. Simbolurile inferioare vrfului stivei sunt salvate de la o micare la alta; ele formeaz memoria mainii. Odat ce s-au citite simbolurile benzii de intrare, ele se pierd pointer-ul de intrare se deplasa numai la dreapta. n schimb pointer-ul de stiv se poate deplasa n sus i n jos. Simbolurile de intrare se salveaz, n momentul citirii, prin trecerea lor pe stiv. Pentru o descriere complet a acestei maini trebuie s specificm: configuraia ei, deci stare iniial, coninutul iniial al benzii de intrare i coninutul stivei. Pentru simplificare, introducem urmtoarele convenii referitoare la automatele push-down: C.1. n configuraia iniial stiva conine un singur simbol #. Acest simbol nu poate fi niciodat eliminat din stiv (stiva nu va fi vid); el apare o singur dat pe stiv. Locaie lui # se numete baza stivei. C.2. Orice ir de intrare se termin n partea dreapt cu simbolul $, astfel nct = 1 $ ; acest simbol este unic n irul de input. Motivul introducerii acestor simboluri speciale este ca maina s poat detecta sfritul input-ului i baza stivei. Ca i mainile cu stri finite, automatele push-down pot fi deterministe sau nedeterministe. n cazul determinist, fiind date Q, a i Z, este permis doar un singur rnd de aciuni; n cazul nedeterminist exist

cel puin dou alternative pentru anumite situaii. Un automat push-down are unele dintre strile sale desemnate ca stri acceptate sau stri finale. Fie acum un alfabet care nu conine simbolul $, i fie L un limbaj peste . Spunem c un automat push-down determinist P accept L dac sutn adevrate urmtoarele: Fiind dat un ir , setm maina P n starea ei iniial Q0 ; introducem irul $ pe banda de intrare i pointer-ul de intrare l plasm pe cel mai din stnga simbol din $ . De asemenea, punem simbolul # pe baza stivei i fixm pointer-ul de stiv pe el. Dup un numr finit de pai maina P se oprete. Dac este n limbaj, P se va opri ntr-una din strile acceptate iar pointer-ul de intrare va puncta la simbolul $ (indicnd c ntregul input a fost citit). Dac nu este n limbajul L, atunci P se va opri ntr-o alt configuraie, adic, fie ntr-o stare neacceptat fie fr a scana ntregul input (sau amndou). Observm, c pentru acceptarea irului , nu facem specificaii referitoare la coninutul stivei. Definiia modului de acceptare a unui limbaj de ctre un automat push-down nedeterminist este similar cu definiia de acceptare a mainii cu stri finite nedeterministe. Spunem c un ir este n limbajul generat de un automat push-down nedeterminist P, dac i numai dac, ncepnd din configuraia iniial, P poate ajunge, printr-o secven de micri legale, ntr-o configuraie acceptat. nainte de a da definiia formal a conceptelor discutate, s considerm un exemplu.

Stare
Q0

Simbol de intrare 0 1 Opri t $ Oprit

S t i v

Oprit 1. Schimb starea n Q1 . 2. Pune simbolul A n vrful

# stivei. 3. Deplaseaz pointer-ul de intrare cu o poziie la dreapta.

Opri t

Schimb starea n
Q3 , pointerii rmn

neschimbai.

Stare
Q1

Simbol de intrare 0 1. Rmne n starea Q1 . 1 Schimb starea n


Q2 ; pointerii rmn

S t i v #

2. Pune simbolul A n vrful A stivei. la dreapta. Oprit

Opri t

3. Deplaseaz pointer-ul de intrare neschimbai.

Oprit

Opri t

Stare
Q2

Simbol de intrare 0 1 1. Schimb starea n Q2 . $

S t i v

A Oprit

2. Scoate A n vrful stivei. 3. Deplaseaz pointer-ul de intrare la dreapta.

Oprit

Schimb starea n # Oprit Oprit


Q3 , pointerii rmn

neschimbai.

Stare Q3 : Se oprete n toate cazurile.

Figura 4.2. Un automat push-down pentru limbajul L = {0n1n | n = 0, 1, 2, K} .

Configuraia iniial

Pasul 1

Pasul 2

Pasul 3

Pasul 4

Pasul 5

Pasul 6

Pasul 7

Configuraia final

Figura 4.3. Micrile unui APD la input-ul 000111. Exemplu 4.1. Considerm un automat push-down care accept limbajul L = {0n1n | n = 0,1, 2,K} . Acest APD va avea patru stri Q0 (= starea iniial), Q1 , Q2 i Q3 (starea acceptat). Alfabetul de intrare este = {0,1} . Fie, n afar de #, un simbol de stiv adiional admis A. Maina va opera n felul urmtor. De fiecare dat cnd simbolul de intrare este 0, se

adugat un simbol A pe stiv. Aadar, dup ce toate 0-urile au fost citite maina tie ci de 0 se afl n input pentru fiecare 0 din input se salveaz cte un A pe stiv. Pentru fiecare simbol de 1 ntlnit, maina terge cte un A. n final, cnd ajunge la simbolul $ de pe banda te intrare, pointer-ul de stiv va puncta spre simbolul # din baza stivei numrul de 1-uri este egal cu numrul de A-uri salvate. Orice deviere de la aceast form indic c irul nu aparine limbajului. Descrierea exact a micrilor lui P este dat in tabelul din figura 4.2. Maina se va opri n starea Q3 cu capul de citire pe $ dac i numai dac irul de intrare se compune din simboluri de 0 urmate de un numr egal de simboluri de 1. n orice alt situaie el se va opri ntr-o alt stare cu (eventual) o parte a input-ului necitit. n figura 4.3. dm secvena de micri a acestui APD cu input-ul 000111. Evident, nainte de a trece la definiii matematice formale, avem nevoie de unele notaii pentru a descrie configuraia unui automat push-down n orice moment dat. Desenarea de diagrame schematice de genul celor din figura 4.3. nu este convenabil. Aadar, descriem configuraia unui APD printr-un triplet:

$, Q, # = xk xk +1 K x p $, Q, Z t Z t 1 K Z1 #

Figura 4.4. Un APD n configuraia xk xk +1 K xk $, Q, Zt Zt 1 K Z1 # . Partea necitit a input-ului este dat prin $ = xk xk +1 K x p $ iar capul de citire puncteaz pe simbolul xk . Starea curent este Q. Coninutul stivei este dat de # = Zt Zt 1 K Z1 # , unde Zt este vrful stivei iar # este baza stivei. O main n configuraia (4.1) corespunde figurii 4.4. Cu aceast convenie, micrile mainii din figura 4.3., por fi descrise astfel:

000111$, Q0 , # 00111$, Q1 , A # 0111$, Q1 , AA # 111$, Q1 , AAA # 111$, Q2 , AAA # 11$, Q2 , AA # 1$, Q2 , A # $, Q2 , # $, Q3 , # oprit

Vom nota pointer-ul de intrare cu IP (input pointer) iar pointer-ul de stiv cu SP (stack pointer). Definiia 4.1. Un automat push-down (APD) se compune din urmtoarele ase obiecte: 1. O mulime nevid de simboluri de intrare admise. Aceast mulime se numete alfabet de intrare i nu conine simbolul $. 2. O mulime nevid de simboluri de stiv admise. Aceast mulime este numit alfabetul stivei i nu conine simbolul #. 3. O mulime finit de stri Q = {Q0 , Q1 , K , Qn } . 4. O stare dedicat, notat Q0 ( Q ), numit stare iniial. 5. O mulime nevid F de stri, numite stri finale sau acceptate. 6. O funcie de tranziie (Q, x, Z ) . Argumentele lui sunt: x un simbol din sau $; Q o stare din Q, Z un simbol din sau #.

Valorile lui (Q, x, Z ) sunt mulimi finite (sau vide) de triplete de


forma ( N , Q, ) unde

a) N este unul dintre simbolurile sau (st sau se mic).


b) Q este o stare din Q.

c) este un ir de caractere (eventual vid) din , care poate fi urmat de simbolul #. n final avem:

: Q ( {$}) ( {#}) B ({, } Q {*{#+ }})

unde B ( E ) desemneaz mulimea tuturor submulimilor finite a unei mulimi E, i D* mulimea tuturor irurilor posibile de simboluri din D. Aadar, folosind notaia pentru expresii regulare, *{# + } este mulimea de iruri de simboluri din urmate fie de irul vid fie de simbolul #. n plus, funcia satisface urmtoarele condiii: C1. Pentru orice Q Q i orice Z , (Q, $, Z ) trebuie s

conin doar triplete de forma (, Q, ) . Aceasta corespunde

cerinei ca pointer-ul de intrare s nu poat trece de simbolul $. C2. Pentru orice x i orice Q Q , (Q, x, #) conine doar
triplete de forma ( N , Q, #) , unde este un ir de elemente din .

Aceasta corespunde cerenei c simbolul # nu poate fi eliminat din baza stivei: dac nlocuim # prin # , simbolul stivei # rmne n baza stivei. C3. Pentru orice x , Q Q i Z ( Z # ), (Q, x, Z ) conine
doar triplete de forma ( N , Q, ) , unde este un ir din * care nu

se termin cu #. Aceasta corespunde cerinei ca # s apar numai la baza stivei. Un automat push-down cu , , Q, Q0 , F i de genul celui de mai sus se va nota P = {, , Q, Q0 , F, } . Funcia din definiia anterioar descrie micrile posibile ale mainii. Argumentele x, Q i Z din reprezint input-ul curent, starea curent i coninutul vrfului stivei. Maina definit prin definiia 4.1. este nedeterminist, deci valoarea lui este mulimea micrilor posibile dintr-o configuraie dat (pot fi mai multe). Fiecare astfel de micare
posibil este descris de un triplet ( N , Q, ) . Dac N = atunci pointer-ul

de intrare nu se schimb la micarea urmtoarea va fi citit acelai simbol de intrare; dac N = atunci pointer-ul de intrare se va muta cu o
poziie la dreapta. Q desemneaz urmtoarea micare a mainii. este neles astfel: Dac ( N , Q, ) este un triplet din (Q, x, ) , atunci

simbolul Z din vrful stivei este nlocuit cu irul . (Cel mai din stnga caracter din va fi noul vrf al stivei.) Condiia C1 precizeaz c pointer-ul de intrare nu va trece de simbolul $. Condiia C2 asigur c # nu va fi eliminat niciodat din baza stivei iar C3 garanteaz c # nu apare n alt locaie de pe stiv dect n baz. Maina se oprete dac
(Q, x, Z ) = mulimea vid. Un automat push-down se numete

determinist dac, pentru fiecare x, Q i Z, valoarea lui (Q, x, Z ) este mulimea vid sau conine doar un singur triplet. Descriem n continuare, formal, micrile unui automat push-down. Definiia 4.2 Fie P un automat push-down. O configuraie a lui P este tripletul $, Q, # , unde este un ir de caractere din iar este

un ir de caractere din . (Amndou pot fi vide.) Fie xy K $, Q, ZW K #


o configuraie pentru P i fie ( N , Q, ) un triplet din (Q, x, Z ) . Dac N = atunci spunem c xy K $, Q, W K # este urmtoarea

configuraie legal, iar

xy K $, Q, ZW K # xy K $, Q, W K #

i o numim micare legal.


Dac N = atunci spunem c y K $, Q, W K # este urmtoarea

configuraie legal i

xy K $, Q, ZW K # y K $, Q, W K #

o numim de asemenea micare legal. Dac


(Q, x, Z ) = ,

vom spune c P se oprete. Dac

C1 = $, Q, # i C2 = $, Q, # sunt dou configuraii astfel nct este

posibil trecerea din C1 n C2 , printr-o secven legal de micri, atunci notm aceasta

$, Q, # $, Q, # .

O micare special i cu nume propriu pentru un APD este plasarea unui simbol A, n vrful stivei fr a elimina ceva din stiv. Funciile de
tranziie pentru astfel de micri sunt de forma (Q, x, Z ) = ( N , Q, AZ ) :

Simbolul Z din vrful stivei a fost ters i nlocuit cu irul AZ; efectul

obinut este plasarea lui A n vrful stivei. Aceast micare se numete push spunem c plasm A n vrful stivei printr-o operaie de push. Exemplu 4.2. Considerm APD-ul discutat anterior, care recunoate limbajul
L = {0n1n | n = 0,1,K} .

Descrierea

formal

este

urmtoarea: Mulimea = {0,1} , alfabetul stivei este = { A} , mulimea strilor Q este {Q0 , Q1 , Q2 , Q3} i mulimea de stri acceptate este F = {Q3} . Starea iniial este Q0 iar funcia este dat prin: Pentru starea Q0 :
(Q0 , 0, A) = (Q0 , 1, A) = (Q0 , $, A) = (Q0 , 0, #) = (, Q1 , A #)

(Q0 , 1, #) = (Q0 , $, #) = (, Q3 , #)

Pentru starea Q1 :
(Q1 , 0, A) = (, Q1 , AA) (Q1 , 1, A) = (, Q2 , A) (Q1 , 0, #) = (Q1 , 1, #) = (Q1 , $, #) =

Pentru starea Q2 :
(Q2 , 0, A) = (Q2 , $, A) = (Q2 , 1, A) = (, Q2 , ) (Q2 , 0, #) = (Q2 , 1, #) = (Q2 , $, #) = (, Q3 , #)

Pentru starea Q3 : (Q3 , x, Z ) = pentru toate valorile lui x {$} i Z {#} . n exemplul de mai sus, pentru fiecare x, Q i Z valoarea lui
(Q, x, Z )

este un singur triplet sau mulimea vid.

Aadar,

comportamentul mainii este complet determinat la fiecare configuraie. Aceste de maini se numesc deterministe. Definiia 4.3. Fie P = {, , Q, Q0 , F, } un automat push-down. Dac pentru fiecare x {$} , Q Q i Z {#} valoarea lui (Q, x, Z ) este un singur triplet sau mulimea vid, spunem c P este determinist. Dac P nu este determinist, spunem c P este nedeterminist. Fiind dat un automat push-down P, definiia limbajului L( P) generat (recunoscut sau acceptat) de P este identic cu acea dat pentru mainile cu stri finite (definiia 2.2.). Un ir aparine limbajului L( P) dac i numai dac, P pornit n configuraia iniial $, Q0 , # , trece printr-o secven de micri legale i se oprete n configuraia $, Q, ,
Q Q . Se cere ca ntregul ir s fie citit iar ultima stare s fie una

acceptat, dar nu se cere, cum o fac unii, ca stiva s fie vid. Formal avem urmtoarele. Definiia 4.4. Fie P = {, , Q, Q0 , F, } un automat push-down. Limbajul L( P) generat (recunoscut sau acceptat) de P este definit prin

L( P) = { | * , $, Q0 , # $, Q, Z }

unde Q F i (Q, $, Z ) = . Exemplu 4.3. Fie un alfabet; pentru fiecare ir * fie R inversul lui . Adic, dac = abcd , R = dcba , dac = aab , R = baa . Un palindrom peste este un ir de forma R unde * . Exemple de palindroame sunt abcddcba ( = abcd ) i aabbaa ( = aab ). Observm c aceast definiie este diferit de cea obinuit un cuvnt care se citete la fel n ambele sensuri. De exemplu, conform definirii noastre, = abcba nu este un palindrom. Artm n continuare cum se construiete un automat push-down P care recunoate limbajul de palindroame peste un alfabet dat . n lini mari, maina P va citi irul de intrare i va insera acest input, caracter cu caracter, pe stiv. La un moment dat, P ghicete c a ajuns la mijlocul irului iar atunci compar coninutul stivei, din vrf pn n baz, cu restul input-ului. Dac alegerea a fost bun i input-ul este un palindrom, pointer-ul de intrare ajunge la simbolul $ n acelai timp cnd pointer-ul stivei ajunge la baza stivei marcat cu #. Definiia exact a lui P este urmtoarea: 1. este o mulime nevid, finit dat. 2. = (alfabetul stivei i alfabetul de intrare este aceleai). 3. Q = {Q0 , Q1 , Q2 , Q3} . 4. Starea acceptat este Q3 ( F = {Q3} ). 5. Funcia de tranziie este definit ca: i. ii. iii.
(Q0 , x, #) = {(, Q1 , x #)} pentru toi x . (Q0 , $, #) = {(, Q3 , #)} (Q1 , x, Z ) = {(, Q1 , xZ ), (, Q2 , Z )} pentru toi x i
Z .

iv.

(Q2 , x, x) = {(, Q2 , )} pentru toi x .

v. vi.

(Q2 , $, #) = {(, Q3 , #)} . (Q, x, Z ) = n toate cazurile nedefinite de i v.

Micrile se explic dup cum urmeaz: i. P pornete n starea iniial Q0 i ncepe s insereze caracterele de intrare n vrful stivei. Majoritatea inserrilor sunt fcute n timpul strii Q1 . ii. iii. Asigur c irul vid este n L( P) . P continu s insereze simbolul de intrare pe stiv sau ghicete dac mijlocul cuvntului a fost ajuns i este timpul s compare coninutul stivei cu restul input-ului. Aceasta este partea operaiei n care maina are un comportament nedeterminist. iv. v. Simbolurile stivei sunt comparate, unul cte unul, cu restul input-ului. Cuvntul este gsit palindrom, deci P trece n starea acceptat. Observm c din cauza lui iii, APD-ul este nedeterminist. Considerm acum, ca exemplu, comportamentul lui P la input-ul = abccba :

abccba$, Q0 , # bccba$, Q1 , a # ccba$, Q1 , ba # cba, Q1 , cba # cba$, Q2 , cba # ba$, Q2 , ba # a$, Q2 , a # $, Q2 , # $, Q3 , # oprit

(4.1)

Subliniem faptul c maina ar fi putut s ghiceasc greite. De exemplu, ar fi putut s atepte prea mult mijlocul irului:

abccba$, Q0 , # bccba, Q1 , a # ccba$, Q1 , ba # cba$, Q1 , cba # ba$, Q1 , ccba # ba$, Q2 , ccba # oprit

Aici maina se oprete, ntr-o configuraie neacceptat, deoarece


(Q2 , b, c) = . Aceasta ns nu nsemn c nu este n L( P) ; criteriul

este s existe o posibilitate pentru P de a citi i s se opreasc ntr-o stare acceptat. C exist este demonstrat n (4.1). Evident c dac automatele push-down sunt folosite pentru recunoaterea limbajelor de programare, acest tip de comportament nu poate fi admis (sau cel puin s fie strict controlat) cu alte cuvinte, APD-ul s fie determinist. n cazul mainilor cu stri finite mainile deterministe i nedeterministe se dovedesc a fi echivalente: Dat fiind o MSF nedeterminist M 1 , exist o MSF M 2 astfel nct L( M 1 ) = L( M 2 ) . Aceasta ns nu este adevrat pentru automatele push-down. De fapt, limbajul palindroamelor din exemplul 4.3. nu poate fi generat de orice APD determinist. Teorema 4.1. Fie L limbajul L = { R | {0,1}*} mulimea tuturor polindroamelor compuse din simbolurile 0 i 1. Nu exist un automat push-down determinist P astfel nct L = L( P) . Demonstraie. Demonstraia complet a acestei teoreme nu face parte din scopul acestei lucrri. Vom arta doar c L nu poate fi recunoscut de un APD determinist care satisface urmtoarele trei condiii: 1. Maina se oprete n orice stare dac input-ul este gol, adic,
(Q, $, Z ) = pentru toate strile Q i simbolurile de stiv Z. Cu alte

cuvinte, dup ce input-ul a fost citit n ntregime, maina nu poate face nici o micare. 2. Maina accept iruri doar cu stiva vid. Acesta nseamn c un ir este acceptat dac i numai dac maina se oprete ntr-o stare final iar stiva conine numai simbolul #. 3. Maina are doar o singur stare acceptat. Presupunnd c o main determinist P = {, , Q, Q0 , F, } servete drept acceptor pentru limbajul L din ipotez, i mai presupunem c L satisface condiiile 1 3 de mai sus. Din ipotez, F are doar o stare
acceptat, Q . Fie i dou iruri din {0,1}* astfel nct R R s nu

fie n L, de exemplu = 101 i = 11 . Maina P accept irul R ,


R R , R i R R dar nu i R R . Dup citirea lui R maina
trebuie s se afle n starea acceptat Q iar stiva trebuie s fie vid (adic

s conin numai #). Aadar, la input-ul R R maina trece prin urmtoarea secven de configuraii:

R R $, Q0 , # R , Q, # $, Q, #

(4.2)

Ca urmare, dac P este pornit n starea Q cu input-ul R , se va opri n

configuraia acceptat. n acelai mod, la input-ul R R maina va executa secvena de micri:

R R $, Q0 , # R , Q, # $, Q, #

(4.3)

Starea Q din mijlocul configurailor (4.2) i (4.3) este aceeai deoarece

este stare acceptat, iar noi am presupus c exist doar una singur. Dar acum s vedem ce se ntmpl cnd irul R R este trimis lui P. Dup
citirea primei pri a irului, R , maina se va afla n starea Q i stiva va

conine doar #. (Din teorema (4.2.).) n acest moment, P se afl n


configuraia R , Q, # i conform cu (4.3) el va trece n $, Q, # ,

adic, accept R R , despre care am presupus c nu este n limbaj. Deci


L L( P) .

Pentru o demonstraie complet, trebuie artat c dat fiind un APD


determinist P exist alt APD determinist P astfel nct L( P) = L( P) i P

s aib 1 3 de mai sus. Pentru detalii vezi [13]. Q.E.D. 4.2. LEGTURI CU GRAMATICILE INDEPENDENTE DE

CONTEXT Abordm n continuare o discuie detaliat a rolului jucat de automatele push-down n recunoaterea limbajelor independente de context. n capitolele 2 i 3 am studiat conceptul de main cu stri finite. Aceste maini au fost uor de implementat; cu toate acestea, ele puteau s recunoasc doar limbaje simple limbaje regulare. Ne-a fost uor s dm un exemplu de limbaj nerecunoscut de nici una dintre aceste maini. Automatele push-down sunt similare mainilor cu stri finite exceptnd un punct esenial APD-urile au o memorie nelimitat sub forma de stiv. Este surprinztor faptul cum aceast mic facilitate face dintr-un APD un instrument att de puternic, capabil s genereze limbaje independente de context arbitrare. De fapt, limbajele independente de context sunt chiar acele limbaje pentru care exist un APD care le recunoate.

Teorema 4.2. Fie L un limbaj, adic, o mulime de iruri peste un alfabet . Atunci L este generat de un automat push-down dac i numai dac L are o gramatic independent de context. Demonstraie. O demonstraie complet a acestei teoreme nu este prea dificil, dar oarecum lung. Din acest motiv vom prezenta doar o schi ntr-o singur direcie: Dat fiind o gramatic independent de context G = {, N , S , P} , s artm cum se construiete un APD P astfel nct L( P) = L . Pentru demonstraia complet i detalii suplimentare, cititorul este invitat s consulte [13] sau [7]. Reamintim c o gramatic G este independent de context dac toate produciile ei sunt de forma X , unde X este un neterminal iar este un ir, eventuala vid, de terminale sau neterminale ( { N }* ). APD-ul de construit P va simula n esen derivarea cea mai din stnga pentru orice ir din L(G ) . Alfabetul de intrare pentru P va fi , identic cu alfabetul lui G iar alfabetul stivei pentru P va fi N . Presupunem c simbolurile speciale $ i # nu aparin lui N . Maina va avea trei stri:
Q0 (starea iniial), Q1 i Q2 (starea acceptat). Majoritatea timpului

maina va rmne n Q1 . P acioneaz n felul urmtor: Fie un ir din


L(G ) i fie S 1 1 L derivarea cea mai din stnga a lui

tranziia ntre formele propoziionale i = i +1 fiind rezultatul nlocuirii neterminalului cel mai din stnga X a formei propoziionale i , cu partea dreapt a produciei X . Maina va face o micare la fiecare astfel de tranziie. Presupunem c primele micri sunt

S 1 2 L x1 x2 K xk A

unde x1 , x2 , K , xk sunt terminale iar urmtoarea producia din derivare este A . Ca urmare irul este de forma = x1 x2 K xk y1 y2 K yn , deoarece orice alt aplicare a unei reguli de producie nu va afecta
x1 x2 K xk . n acest moment maina P se va afla n configuraia y1 y2 K yn $, Q1 , A # . (Pointer-ul de intrare puncteaz la y1 , primul simbol

al prii lui care urmeaz a fi derivat i pointer-ul de stiv puncteaz pe A, urmtorul neterminal de nlocuit n derivarea ceea mai la stnga a lui
). Maina va nlocui acum vrful stivei, adic, simbolul A, cu irul

partea dreapt a producie A . Dac ncepe cu un neterminal A ' , avem aceeai situaie, deci nlocuim A ' cu ' partea dreapt a produciei A ' ' . Repetm procedura pn cnd apare un terminal n vrful stivei. Aadar, putem presupune c ncepe cu un terminal. Acest terminal trebuie s fie y1 , altminteri A nu poate fi producia corect aleas. Prin urmare, dup ce A este nlocuit cu , pointer-ul de intrare i pointer-ul de stiv puncteaz amndou spre acelai simbol y1 . n continuare eliminm pe y1 din stiv i deplasm pointer-ul de intrare la dreapta, iar atunci repetm procedeul. Evident c continund n acest mod, maina P va trece din configuraia $, Q1 , # n $, Q1 , # , punct n care schimbm starea n Q2 i ne oprim. Definiia complet a funciei de tranziie este urmtoarea: 1. (Q0 , x, #) = {(, Q1 , S #)} pentru toate terminalele x. Aceasta are ca efect plasarea simbolului de start n vrful stivei i trecerea n starea activ Q1 . 2. (Q0 , $, #) = {(, Q1 , S #)} . Aceast tranziie particular este necesar pentru cazul n care irul vid este n limbajul L(G ) .

Simbolul de start S va fi plasat pe stiv; dac L(G ) eventual el va dispare. 3. (Q1 , x, x) = {(, Q1 , )} pentru toate terminalele x. Pointer-ul de intrare i pointer-ul de stiv puncteaz amndou spre acelai simbol x. Se elimin x de pe stiv i se citete urmtorul simbol. 4. Dac x este terminal sau simbolul $, i dac A este un neterminal, atunci

(Q1 , x, A) = {(, Q1 , 1 ), (, Q1 , 2 ), K , (, Q1 , p )}

unde A 1 | 2 | K | p sunt toate produciile avnd A n partea stng. Aceast regul se aplic atunci cnd un neterminal se afl n vrful stivei, i maina alege care dintre producii va fi n continuare aplicat pentru a se potrivi cu simbolul curent de intrare x (precum i restul input-ului). 5. (Q1 , $, #) = {(, Q2 , #)} . ntregul input a fost citit, stiva este vid, deci maina trece n starea acceptat. 6. (Q, x, Z ) = pentru restul de x, Q i Z. Maina P astfel construit este evident nedeterminist: Cnd regula 4 de mai sus este pe punctul de a fi aplicat, P alege producia corect care se va folosi. Este limpede, c dac exist o secven de alegeri corecte (adic, dac input-ul este n limbaj), P va accepta input-ul. De asemenea este adevrat c dac P poate trece din configuraia iniial n ceea acceptat, atunci este derivabil n gramatica G. Demonstraia complet a acestor consideraii poate fi uor construit, i se bazeaz pe inducia dup lungimea irului . Q.E.D.

Configuraia lui M

Forma propoziional corespunztoare, vrful stivei este subliniat

Comentarii

a *(a + a)$, Q0 , # a *(a + a)$, Q1 , E # a *(a + a)$, Q1 , T # a *(a + a)$, Q1 , T * F # a *(a + a)$, Q1 , F * F # a *(a + a)$, Q1 , a * F # *(a + a )$, Q1 , * F # E T T *F F *F a*F a*F

Configuraia iniial E plasat n vrful stivei aplicat E T aplicat T T * F aplicat T F aplicat F a a eliminat din vrful stivei * eliminat din vrful stivei aplicat F ( E ) ( eliminat din vrful stivei aplicat E E + T aplicat E T aplicat T F aplicat F a a eliminat din vrful stivei + eliminat din vrful stivei

(a + a )$, Q1 , F #

a*F

(a + a )$, Q1 , ( E ) # a + a )$, Q1 , E ) #

a * ( E) a *( E )

a + a )$, Q1 , E + T ) # a + a )$, Q1 , T + T ) # a + a )$, Q1 , F + T ) # a + a )$, Q1 , a + T ) # + a )$, Q1 , + T ) #

a *( E + T ) a *(T + T ) a *( F + T ) a *( a + T ) a *(a + T )

a)$, Q1 , T ) #

a *(a + T )

a)$, Q1 , F ) # a)$, Q1 , a) # )$, Q1 , ) #

a *(a + F ) a *(a + a ) a *(a + a )

aplicat T F aplicat F a a eliminat din vrful stivei ) eliminat din vrful stivei Configuraia final

$, Q1 , #

a *(a + a )

$, Q2 , #

oprit i acceptat

Figura 4.5. Micri ale uni APD. Exemplu 4.4. Fie gramatica expresiilor algebrice:
E E +T |T T T *F | F F (E) | a

Regulile de tranziie pentru automatul push-down corespunztor sunt urmtoarele:


(Q0 , x, #) = {(, Q1 , E #)} pentru toi x = {a, +,*, (, )} (Q0 , $, #) = {(, Q1 , E #)} (Q1 , x, x) = {(, Q1 , )} pentru toi x (Q1 , x, E ) = {(, Q1 , E + T ), (, Q1 , T )} pentru toi x {$} (Q1 , x, T ) = {(, Q1 , T * F ), (, Q1 , F )} pentru toi x {$} (Q1 , x, F ) = {(, Q1 , ( E )), (, Q1 , a)} pentru toi x {$} (Q1 , $, #) = {(, Q2 , #)}

Secvena de micri a APD-ului la input-ul a *(a + a) este artat n figura 4.5. Reamintim de natura nedeterminist a acestui APD. De exemplu, n

configuraia

a )$, Q1 , F ) #

(marcat cu

n figura 4.5.), M alege

valoarea corect pentru (Q1 , a, F ) , adic tripletul (, Q1 , a) . Dac ar alege cealalt posibilitate (, Q1 , ( E )) , APD-ul s-ar opri imediat ntr-o configuraie neacceptat: a)$, Q1 , F ) # a)$, Q1 , ( E )) # oprit . Exemplu 4.5. n acest exemplu prezentm construcia i funcionarea unui APD plecnd de la o gramatic G:

S abA | B | baB | C A bS | b B aS C aA |

Regulile de tranziie rezultate sunt:


(Q0 , x, #) = {(, Q1 , S #)} pentru toi x = {a, b} (Q0 , $, #) = {(, Q1 , S #)} (Q1 , x, x) = {(, Q1 , )} pentru toi x (Q1 , x, S ) = {(, Q1 , abA #), (, Q1 , B), (, Q1 , baB), (, Q1 , C )} pentru toi
x {$}

(Q1 , x, A) = {(, Q1 , bS ), (, Q1 , b)} pentru toi x {$} (Q1 , x, B) = {(, Q1 , aS )} pentru toi x {$} (Q1 , x, C ) = {(, Q1 , aA), (, Q1 , )} pentru toi x {$} (Q1 , $, #) = {(, Q2 , #)}

Ca de obicei, Q0 este starea iniial iar Q2 este starea acceptat. n aceast gramatic irul vid aparine limbajului L(G ) , derivarea lui fiind

S C . APD-ul l accept i pe (cum ar trebui s-o i fac);

secvena de configuraii este:

$, Q0 , # $, Q1 , S # $, Q1 , C # $, Q1 , # $, Q2 , # oprit

irul baaa face parte din limbajul L(G ) ; derivarea lui cea mai din stnga este S baB baaS baaaS baaaC baaa . Micrile corespunztoare ale APD-ului sunt:

baaa$, Q0 , # baaa$, Q1 , S # baaa$, Q1 , baB # aaa$, Q1 , aB # aa$, Q1 , B # aa$, Q1 , aS # a$, Q1 , S # a$, Q1 , aS # $, Q1 , S # $, Q1 , C # $, Q1 , # $, Q2 , # oprit

Cu acelai input baaa maina ar fi putut s execute urmtoarea secven de micri

baaa$, Q0 , # baaa$, Q1 , S # baaa$, Q1 , abA # oprit

deoarece (Q1 , b, a) = . Ca urmare, dac este derivabil n L(G ) , atunci un APD poate efectua o secven legal de micri rezultnd n acceptarea lui . n capitolele 6 8 vom prezenta unele metodele pentru a face aceste maini deterministe. Evident, aceasta nu este ntotdeauna posibil (vezi teorema 4.1.). Aadar, orice limbaj independent de context poate fi generat de un automat push-down. Reciproca este de asemenea adevrat: Dat fiind un

automat push-down P, exist o gramatic independent de context G astfel ca L( P) = L(G ) ; nu vom da o demonstraie a acestui rezultat. Ea nu este dificil, ns incomod i lung (vezi [13] sau [7]). 4.3. EVALUAREA EXPRESIILOR ARITMETICE Automatele push-down pot fi utilizate pentru evaluarea automat a expresiilor aritmetice. Problema se pune n felul urmtor: Vrem s programm un calculator n aa fel nct dac introducem o expresie aritmetic, el o va evalua corect. De exemplu, dac expresia este
2*(3 + 2*5) + 8* 2

maina execut mai nti nmulirea 2*5 , adun

rezultatul la 3, nmulete acesta cu 2, etc. Ea ar trebui programat astfel nct s tie ce are de fcut i n ce ordine. Reamintim c maina primete expresia secvenial: Adic, citete mai nti simbolul 2, atunci simbolul *, (, 3 etc. n momentul n care ajunge la sfritul input-ului ea s neleag input-ului i execut operaiile necesare n ordinea corect. Pentru simplificare, ne vom limita la expresii cu doar dou operaii binare, * i +. Odat neleas, metoda poate fi uor de extins i pentru alte operaii (scdere, mprire, ridicare la putere sau operaii unare ca
a ). Mai nti prezentm soluia problemei n cazul n care expresia este

introdus n aa numita notaie postfixat (numit i notaia polonez invers). n aceast notare operaia nu este scris ntre numere, ci dup ele. Deci 3 + 7 se scrie ca 37 + , 8* 4 ca 84* , etc. n general, dac & denot o operaie binar (adunare, nmulire sau altceva), atunci a & b se scrie ca
ab & . Fiecare operaie acioneaz asupra primilor dou operanzi

precedeni. De exemplu, notaia postfixat ab + c * este neleas ca


(ab + c)* = ((ab+ )c) * , deci * acioneaz asupra lui c i lui ab + . Observm

c n notaia postfixat nu sunt necesare parantezele: Expresia ab + c * este

unic descifrat dac cerem ca fiecare operator s acioneaz asupra celor doi operanzi precedeni. Acum putem construi uor un automat push-down care va evalua automat orice expresie aritmetic , presupunnd c expresia este scris n forma postfixat. Maina va avea numai o singur stare i va aciona conform urmtoarelor reguli: 1. Dac simbolul de intrare este un numr, APD-ul plaseaz acest simbol n vrful stivei i deplaseaz pointer-ul de intrare cu o unitate la dreapta. 2. Dac input-ul este un operator, maina scoate primele dou numere din stiv, execut operaia indicat, i plaseaz rezultatul obinut n vrful stivei. 3. Cnd marcajul de intrare $ este ajuns, stiva va conine numai valoarea corect a expresiei (presupunnd c input-ul a fost gramatical corect). Considerm de pild expresia 2*(3 + 2*5) + 8* 2 . Forma ei postfixat este 2325* + *82* + . Micrile APD-ului cu acest input sunt:

2325* + *82* +$, # 325* + *82* +$, 2 # 25* + *82* +$, 32 # 5* + *82* +$, 232 # * + *82* +$, 5232 # + *82* +$, 1032 # *82* +$, 132 # 82* +$, 26 # 2* +$, 826 # * + $, 2826 # +$, 1626 # $, 42 #

Am omis simbolul de start deoarece a fost ntotdeauna acelai. Prin subliniere am vrut s difereniem ntre numrul 16 i 1 urmat de 6. Aceast metod, dei funcioneaz destul de bine, nu rezolv n ntregime problema noast, deoarece de regul expresiile aritmetice nu sunt

exprimate n notaia postfixat ci n foram normal cu operatorul scris ntre operanzi notaia infixat. Deci avem nevoie de o modalitate automat (determinist) pentru transcrierea expresiei aritmetice din notaia uzual n notaia postfixat. Descrierea formal a notaie postfixate este urmtoarea: Definiia 4.5. Fie mulimea operanzilor (adic, numerele) i fie
mulimea operatorilor (adic, +, *, , etc.). Atunci au loc:

1. Reprezentarea postfixat a fiecrui operand a este chiar a.


2. Dac A este o expresie scris n forma infixat i A este

reprezentarea ei n notaia postfixat, atunci reprezentarea


postfixat a lui (A) este A . 3. Dac A i B sunt expresii n notaia infixat, i A , B sunt

transcrierile corespunztoare n notaia postfixat, atunci pentru


orice operator &, transcrierea postfixat pentru A&B este AB & .

Punctul 2 se nelege astfel: Fiind dat o notaie postfixat A pentru A, notaia postfixat pentru (A) este A (omitem parantezele).

Similar, 3 spune c dac tim cum s reprezentm A i B n notaie


postfixat (ca A i ca B ), atunci tim cum s reprezentm A&B: anume ca AB & . Ceea ce dorim n continuare este s construim o schem

determinist care va converti o notaie infixat dat n transcrierea ei postfixat. Deci s converteasc irurile a + b * c , a *(b + c) n abc * + ,
abc + * etc. n general, dac 1 , 2 , 3 i sunt expresii aritmetice n notaie infixat iar reprezentrile lor postfixate sunt 1 , 2 , 3 i atunci

aceast schem efectueaz transcrieri indicate n (4.4). Primul lucru de remarcat despre aceast schem este c operanzii n notaia postfixat

apar n aceeai ordine ca n notaia infixat, singurele schimbri sunt c parantezele au fost eliminate iar operatorii * i + sunt interschimbai.
1 + 2 = 1 2 + ( 1 ) *( 2 ) = 1 2 * 1 *( 2 + 3 ) = 1 2 3 + * 1 + ( 2 ) *( 3 ) = 1 2 3 * +

(4.4)

Schema trebuie s in cont de prioritile operatorilor. Astfel, n expresia a + b * c , nmulirea b * c se execut naintea adunrii, deci n notaia postfixat simbolul * apare la dreapta lui +. Evident dac o astfel de schem are toate proprietile listate n (4.4), atunci ea va funciona corect n toate cazurile. Se observ c schema poate fi realizat determinist cu ajutorul unui automat push-down cu output. Mai nti, explicm cum funcioneaz o astfel de main iar apoi vom da indicaii pentru demonstrarea corectitudinii ei. Acest translator push-down va fi un automat push-down, descris n paragraful 4.1, mpreun cu un dispozitiv de ieire. Schematic el poate fi reprezentat ca n figura 4.6.
ir de intrare

Stiva

Output

Figura 4.6. Un APD care traduce o notaie infixat ntr-o notaie postfixat.

Automatul push-down are doar o singur stare Q i acioneaz n felul urmtor. Iniial, input-ul conine o expresie aritmetic n notaie infixat; stiva este vid (adic, conine doar marcajul #); banda de ieire este goal; i pointer-ul de ieire puncteaz la cea mai din stnga poziie a benzii. Presupunem c input-ul este delimitate n partea dreapt de simbolul $ astfel ca T s poat detecta sfritul input-ului. La un moment dat maina examineaz simbolul curent din vrful stivei i simbolul de intrare curent, putnd efectua una din urmtoarele operaii: 1. Emite unul sau mai multe simboluri pe banda de ieire. Aceste simboluri pot fi luate fie din stiv fie de pe banda de intrare. Pointerii relevani sunt ajustai corespunztor (pointer-ul de intrare este deplaseaz la dreapta iar pointer-ul de stiv coboar). Pointer-ul de ieire se deplaseaz la dreapta la urmtoarea poziie liber disponibil. 2. Plaseaz simbolul de intrare curent n vrful stivei, ajustnd ambii pointeri (Aceast operaie se numete push). Simbolurile de intrarea admise sunt operanzii (adic, numerele) a, b, c, ..., simbolurile de operatori sunt * i +, parantezele ), ( i simbolul de delimitare $. Simbolurile de stiv admise sunt +, * paranteza stng ( i simbolul din baza stivei #. Fiecrui simbol de stiv Z i asociem dou numere prioritatea de input I ( Z ) i prioritatea de stiv S ( Z ) conform tabelului din figura 4.7.

Z * + ( #

I (Z )

S (Z )

2 1 3

2 1 0 0

Figura 4.7. Funcii de prioritate. Maina se comport n felul urmtor: 1. Dac simbolul de intrare este unul dintre operanzii a, b, c, ..., el este trimis spre output i se citete urmtorul simbol. Pointer-ul de intrare i cel de ieire sunt ajustai corespunztor; stiva nu se schimb. 2. Dac simbolul de intrare x este (, +, sau *, adic, este i simbol de stiv, atunci se compar valorile pentru I ( x) i S ( Z ) , unde Z este vrful curent al stivei. Vor avea loc urmtoarele: i. Dac I ( x) > S ( Z ) simbolul x este plasat n vrful stivei i se citete urmtorul simbol. Pointerii de input i de stiv sunt ajustate corespunztor, nu are loc un output. ii. Dac I ( x) S ( Z ) se emite ca output simbolul Z din vrful stivei, pointerii de stiv i de ieire sunt ajustai iar simbolul x este citit din nou (pointer-ul de intrare rmne neschimbat). 3. Dac simbolul de intrare este paranteza dreapt ) stiva este trimis la output, unul cte unul, pn ce apare paranteza stng (. Iar

atunci se elimin paranteza stng ( din stiv nu este trimis la ieire; pointerii de stiv i de output se ajusteaz corespunztor iar pointer-ul de intrare se deplaseaz la stnga. 4. Dac simbolul de intrare x este $, atunci se trimite, ncepnd din vrf, unul cte unul, coninutul stivei spre ieire pn la marcajul de baz #. Descriem configuraia mainii T ntr-un moment dat printr-un triplet de iruri astfel:

xi xi +1 K xn $, Z j Z j 1 K Z1 #, y1 y2 K yk CINP

CTOS

COUT

(4.5)

Unde CINP este simbolul de intrarea curent, CTOS vrful curent al stivei iar
COUT este pointer-ul de ieire curent. APD-ul din figura 4.6. se afl n

configuraia (4.5). Cu aceste notaii, dm n continuare unele exemple de micri ale lui T la diferite input-uri. Exemplu 4.6. Comportamentul mainii T la diverse input-uri. Cu input-ul a + b * c maina se mic astfel:

a + b * c$, #, +b * c$, #, a b * c$, + #, a *c$, + #, ab c$, * + #, abc $, * + #, abc $, + #, abc* $, #, abc * +

Cu input-ul (a + b) * c micrile lui T sunt:

(a + b) * c$, #, a + b) * c$, (#, +b) * c$, (#, a b) * c$, + (#, a ) * c$, + (#, ab *c$, + #, ab+ c$, * #, ab+ $, * #, ab + c $, #, ab + c*

Dac input-ul este (a + b * c) *(d + e) , micrile sunt:

(a + b * c) *(d + e)$, #, a + b * c) *(d + e)$, (#, +b * c) *( d + e)$, (#, a b * c) *(d + e)$, + (#, a *c) *(d + e)$, + (#, ab c ) *(d + e)$, * + (#, ab ) *(d + e)$, * + (#, abc *(d + e)$, #, abc * + (d + e)$, * #, abc * + d + e)$, (*#, abc * + + e)$, (*#, abc * + d e)$, + (*#, abc * + d )$, + (*#, abc * + de $, * #, abc * + de+ $, #, abc * + de + *

Evident maina funcioneaz corect n aceste exemple. De fapt, ea o va face n toate cazurile. Teorema 4.3. Fie T un automat push-down descris n figurile 4.5. i 4.6. Dac este o expresie aritmetic oarecare bine format n notaie
infixat, atunci T va transforma n traducerea corect a lui n

notaia postfixat. Demonstraie. (O schi) Vom folosi inducia dup lungimea irului de intrare. Singurele expresii aritmetice (n notaia infixat) de lungime mai mic sau egal cu teri sunt: a, (a), a + b i a * b . Se observ uor c T va traduce corect toate acestea. Presupunem acum c T funcioneaz corect pentru toate expresiile de lungime cel mult n 3 i fie

o expresie, de lungime n + 1 , scris n notaia infixat. Atunci este

ntr-una din urmtoarele forme: i. = ( ) ii. = 1 + 2 iii. = 1 * 2 unde toi sunt de lungime mai mic dect n. n fiecare caz T l va traduce corect pe : i. Iniial, T va trece din configuraie ( )$, #, n )$, (#, . Iar atunci va opera asuprea lui , producnd output-ul traducerea postfixat a lui fr a influena simbolul ( de pe stiv. Aadar, la un moment dat va ajunge n configuraia )$, (#, i va trece n
$, #, producnd rezultatul corect.

ii. T pornete n configuraia 1 + 2 $, #, . Din ipotezele induciei, el va traduce 1 corect, deci dup ce ultimul simbol din 1 a fost citit, T se va afla n configuraia + 2 $, #, 1 . De aici va trece n
2 $, #, 1 iar conform ipotezelor induciei el va continua s treac

$, + #, 12 . Simbolul + din stiv va rmne nedistribuit

deoarece 2 trebuie s nceap cu un operand x sau parantez stng (; n ambele cazuri + rmne pe stiv. Din aceast ultim configuraie, T va trece n traducerea corect. iii. Analog cu ii. Q.E.D. Trebuie s menionm aici c T nu detecteaz greeli n input-ul original. Astfel, de exemplu, dac input-ul este a + *b output-ul lui T va
$, #, 12 + , producnd din nou

fi ab * + , amndou fiind secvene fr neles. n capitolele 6 i 8 vom construi analizatoare deterministe care nu vor evalua doar aceste expresii aritmetice, ci chiar vor putea decide dac irurile de intrare sunt corect formate. Maina T, dat aici, nu este un analizator adevrat deoarece nu reconstruiete arborele de derivare a input-ului. 4.4. LEMA DE POMPARE PENTRU APD-URI n paragrafele 4.1. i 4.2. am vzut c automatele push-down sunt mult mai adaptabile dect mainile cu stri finite. Mai exact, am gsit un limbaj acceptat de un APD dar nu de o main cu stri finite (exemplul 4.1.). Din acest motiv ne putem ntreba dac orice limbaj este recunoscut de un APD, sau (din teorema 4.2.) ce se ntmpl n cazul limbajelor cu gramatic independent de context? Vom utiliza n mod special teorema 4.4., care este analoag cu lema de pompare pentru maini cu stri finite (teorema 3.1.). Teorema 4.4. (Lema de pompare pentru automate push-down). Fie
G = {, N , S , P} o gramatic independent de context. Atunci exist un

numr k, care depinde numai de G, cu urmtoarea proprietate: Orice propoziie din L(G ) de lungime mai mare dect k poate fi scris ca
= 1 2 , unde , , , 1 i 2 sunt iruri din * i astfel nct pentru

fiecare n = 0,1, 2,3,K irul = 1n 2n aparine de asemenea lui L(G ) . Mai mult, unul din irurile 1 i 2 (sau amndou) est diferit de irul vid . Motivul pentru care teorema se refer la automate push-down este c limbajele cu gramatici independente de context sunt chiar acele limbaje care sunt recunoscute de automate push-down (teorema 4.2.).

nainte de a trece la demonstraie vom arta cum se aplic aceast teorem. Exemplu 4.7. Fie L0 limbajul L0 = {a nb n c n | n = 0,1, 2,K} . Aadar, L se compune din iruri avnd un numr egal de simboluri a, b i c urmate succesiv. Vrem s artm c L0 nu este acceptat de un APD, sau echivalent, nu are gramatic independent de context. Presupunem deci, c L are o gramatic independent de context G astfel ca L0 = L(G ) i fie k numrul corespunztor lui G din teorema 4.4. Dac m > k , irul
= a mb m c m are lungimea 3m > k , deci poate fi scris ca a mb m c m = 1 2 ,

unde sau 1 sau 2 , i pentru fiecare n = 1, 2,K irul 1n 2n este n limbajul L. Vom arta c aceasta este imposibil. Presupunem c 1 . Atunci 1 trebuie s fie un ir format dintr-un singur tip de simboluri, adic, a, b, sau c. ntr-adevr, dac de exemplu, conine a-uri i b-uri, atunci 2 = va avea a-uri (n al doilea ) care se afl n dreapta b-urilor (n primul ). Dar aceasta implic c 12 22 nu este n L0 contradicie cu alegerea lui 1 . Analog se procedeaz pentru 1 coninnd a-uri i c-uri sau b-uri i c-uri. n acelai mod artm c dac 2 , atunci 2 trebuie s fie un ir format fie numai din a-uri fie numai din b-uri sau c-uri. Dar atunci, considerm din nou irul = 12 22 care este garantat, prin teorema 4.4., a fi din L0 . Dac 1 se compune doar din a-uri iar 2 numai din b-uri, atunci are prea puini de c. Dac 1 are numai b-uri i 2 numai c-uri, atunci are prea puini de a, etc. n toate cazurile posibile irul nu poate fi o propoziie n limbajul L. Deci, ntr-adevr, L nu poate avea o gramatic independent de context.

Continum

acum

cu

demonstraia

teoremei

4.4.

Pentru

simplificare, facem ipoteza c G nu are producii vide, adic, producii de forma A . Fiind dat o gramatic G, vom construi un numr k = k (G ) astfel nct pentru orice ir din L(G ) de lungime mai mare dect k, exist o derivare a lui de forma

S X 1 X 2 1 2 =

(4.6)

unde X este un neterminal oarecare i fie 1 fie 2 este un ir nevid. ntr-adevr, dac (4.6) este adevrat, atunci

X 1 X 2 i X

sunt derivri valide n G. Aadar, toate dintre derivrile urmtoare pot fi fcute n G:
* * * *

S X S X 1 X 2 1 2
2 2 S X 1 X 2 12 X 2 12 2 * * * * *

i se obine teorema. Fie r lungimea celui mai lung ir din partea dreapt a unei producii din G, i fie n numrul de neterminale din G; n0 = n + 1 . Punem k = r n + 1 .
0

Fie acum un ir oarecare din L(G ) a crui lungime este mai mare dect k i considerm arborele lui de derivare ca n figura 4.8. Definim un drum ntr-un astfel de arbore ca fi secvena de noduri i de segmente de drum care le leag, ncepnd din rdcina S i mergnd prin neterminale pn la

o frunz (adic, un terminal n ). Lungimea drumului este numrul acestor segmente de drum. Definim adncimea arborelui ca fiind lungimea cea mai mare a acestor drumuri.

Figura 4.8. Schem de arbore de derivare pentru . Considerm, de exemplu, gramatica G0 a expresiilor aritmetice (exemplul 1.3.). irul = (a + a ) * a are arborele de derivare din figura 4.9. Exemple de drumuri n acest arbore sunt: E-T-F-a, (de lungime 3), E-T-T-F-), (de lungime 4), E-T-T-F-E-E-T-F-a (de lungime 8), etc. Adncimea arborelui este 8. Observm c dac irul are un arbore de derivare de adncime d, atunci nu poate avea mai mult de r d simboluri (pe orice nivel, fiecare nod poate avea cel mult r fii). Aadar rdcina S poate avea cel mult r fii, r 2 fii de gradul 2, etc. Cu alte cuvinte, dac numrul de frunze n arborele de derivare a unui ir este mai mare dect r d , atunci arborele de derivare trebuie s conin un drum de lungime mai mare dect d.

Figura 4.9. Exemplu de arbore de derivare.

Figura 4.10. Demonstraia teoremei 4.4. = 1 2 Presupunem acum c irul este mai lung dect k = r n + 1 i considerm
0

un arbore de derivare pentru care are cel mai mic numr de noduri. ( poate avea mai mult dect un singur arbore de derivare. Dac exist mai muli astfel de arbori de derivare minimali, se alege unul oarecare dintre

ei.) Din cele spuse adineauri, arborele de derivare pentru trebuie s conin un drum de lungime mai mare dect n0 , adic, de lungime
n0 + 1 = n + 2 sau chiar mai mult (n este numrul de neterminale din G).

Acest drum conine exact un termina, toate celelalte noduri (cel puin n + 1 dintre ei) sunt neterminale. Aadar, exist un neterminal X care apare de dou ori n acest drum, deci arborele de derivare a lui este de forma celui din figura 4.10. Unul dintre irurile 1 sau 2 trebuie s fie diferit de
, deoarece altfel am putea elimina ntreaga poriune a arborelui de

derivare ntre primul X i al doilea X, i obinem un arbore de derivare cu mai puine simboluri. Dar aceasta ne arat c (4.6) este adevrat, deci am terminat demonstraia. Q.E.D. 4.5. PROPRIETATEA DE NCHIDERE A LIMBAJELOR

INDEPENDENTE DE CONTEXT Am vzut n capitolul 3 (teorema 3.6) c dac L, L1 i L2 sunt limbaje regulare atunci L* , L , L1 + L2 , L1L2 i L1 L2 sunt de asemenea regulare. Unele, dar nu toate, dintre aceste proprieti sunt adevrate i pentru limbajele independente de context. Reamintim c L* este limbajul tuturor irurilor de forma 1 2 K n L ; L este mulimea irurilor care nu aparin lui L; L1 + L2 este reuniunea dintre L1 i L2 ; L1L2 este mulimea irurilor de forma 1 2 K i Li i L1 L2 este mulimea irurilor care se afl att n L1 ct i n L2 . Teorema 4.5. Fie L, L1 i L2 limbaje independente de context. Atunci limbajele L* , L1 + L2 i L1L2 sunt de asemenea independente de context.

Demonstraie. Presupunem c L are o gramatic independent de context G = {, N , S , P} . Definim o nou gramatic G* astfel: Terminalele din corespund celor din G. Neterminalele sunt aceleai ca pentru G, plus nc un simbol nou S * . Simbolul de start va fi atunci S * iar produciile vor fi tot cele din G, plus S * S *S | . Evident c
L(G * ) = ( L(G ))* i G * este o gramatic independent de context.

Pentru a arta c reuniunea i concatenarea a dou gramatici independente de context este din nou independent de context procedm astfel. Fie Gi = {i , Ni , Si , Pi } o gramatic independent de context pentru limbajul Li , i = 1, 2 . Presupunem c neterminalele din L1 sunt disjuncte fa de cele din L2 ; N1 N 2 = . Pentru a construi o gramatic
G = {, N , S , P} pentru limbajul L1 + L2 lum = 1 2 , N = N1 N 2 plus

nc un simbol nou S, care este i noul simbol de start din G, iar produciile sunt S S1 | S2 plus toate produciile din P1 i P2 . Evident
L(G ) = L(G1 ) + L(G2 ) . Pentru a obine o gramatic pentru limbajul L1 L2 ,

procedm n exact aceeai manier, ns introducem producia S S1S2 n loc de S S1 | S2 . Q.E.D. Exemplu 4.8. Intersecie a dou limbaje independente de context nu trebuie s fie independent de context. ntr-adevr, limbajul
M 1 = {a n b n | n = 0,1, 2,K} este independent de context, fie gramatica lui S aSb | . Limbajul M 2 = {c k | k = 0,1, 2,K} este de asemenea independent

de context. Analog, limbajele M 3 = {a i | n = 0,1,K} i M 4 = {b j c j | j = 0,1, 2,K} sunt independente de context. Din teorema 4.5. avem c limbajele
L1 = M 1M 2 i L2 = M 3 M 4 sunt independente de context. Limbajul, ns, L1 L2 nu este independent de context. Observm c L1 L2 este limbajul

L0 = {a nb n c n | n = 0,1, 2,K} care, dup cum am artat n exemplul 4.7., nu

este independent de context. Complementara unui limbaj independent de context nu trebuie s fie independent de context. Pentru aceasta, presupunem c complementara fiecrui limbaj independent de context este independent de context. Atunci, date fiind dou limbaje independente de context L1 i
L2 , limbajul L1 L2 = L1 + L2 ar trebui s fie independent de context, ceea

ce, cum am vzut adineauri, nu este cazul. Acest raionament este corect, ns nu furnizeaz un exemplu concret. Pentru a construi un astfel de exemplu, vom arta c complementara limbajului L0 de mai sus este independent de context. Aceasta este suficient, deoarece orice limbaj este complementara complementarei sale: L = L . Considerm acum limbajul L0 . Un ir va aparine lui L0 (adic, nu aparine lui L0 ) dac este satisfcut una dintre urmtoarele condiii: 1. nu este de forma a ib j c k . 2. este de forma a ib j c k , dar i j sau j k . Fie K1 mulimea irurilor din {a, b, c}* care satisfac 1 i fie K 2 mulimea irurilor din {a, b, c}* care satisfac 2; evident L0 = K1 + K 2 . Este suficient s artm c amndou K1 i K 2 sunt independente de context, deoarece limbajele independente de context sunt strns legate de operaia + (teorema 4.5.). Limbajul K1 este chiar complementara unui limbaj

regular descris de expresia regular a*b*c* . Deoarece complementara unui limbaj regular este tot un limbaj regular (teorema 3.7.), K1 este un limbaj regular, deci este i independent de context. Fie K 2 reuniunea a dou

limbaje,

Ka

Kb ,

unde

K a = {a i b j c k | i j}

K b = {a i b j c k | j k} :

K 2 = M 1 + M 2 . Raionamentul ar fi complet dac am putea arta c ambele

limbaje K a i Kb sunt independente de context: Produce o gramatic independent de context pentru K a :

S AC | BC A aA | aP B Bb | Pb C cC | P aPb |

Idee este simpl: Neterminalul A va produce iruri de forma a i b j cu i > j iar neterminalul B va produce iruri de foram a i b j cu i < j . Neterminalul C produce iruri formate doar din c-uri iar neterminalul P iruri de foram
a mb m . Deci, K a este independent de context. Raionamentul pentru K b

este analog. Deseori se afirm c una dintre limitele automatelor push-down este c ele nu pot ine cont de mai mult dect dou secvene infinite. Faptul c limbajul L0 , de mai sus, nu este un limbaj independent de context, i astfel neacceptat de vreun automat push-down, este motivul acelei descrieri neformale. Orice automat push-down care accept L0 ar trebui s in cont de trei secvene cu lungimi arbitrare: a-uri, b-uri i c-uri.

PROBLEME Construii n fiecare dintre problemele 1 7 un automat push-down determinist care recunoate limbajul dat. Dai o descriere verbal neformal i formal. n fiecare problem artai micrile mainilor efectuate asupra irului indicat. 1. L = {a 2 nb n | n = 0,1, 2,K} ; 1 = aaaabb , 2 = aaabb 2. L = {a nbc n | n = 0,1, 2,K} ; 1 = aaabccc , 2 = aabcc 3. L = { {0,1}* | are mai multe 0-uri dect 1-uri} ; 1 = 0110010 ,
2 = 110010

4. L = {a 2 nb3n | n = 0,1, 2,K} ; 1 = aabbb , 2 = ababb 5. L = { {a, b}* | are acelai numr de a-uri i b-uri} ; 1 = abbaab ,
2 = bbaba

6. L = {a nb m | n m} ; 1 = aaabb , 2 = aaba , 3 = aabb 7. L = {a ib j c k | i + j = k} ; 1 = abbccc , 2 = aabbccc n fiecare dintre problemele 8 12 construii un APD nedeterminist care accept limbajele cu gramatica dat. Artai micrile acceptate ale acestui APD efectuate asupra irurilor indicate. 8. S 0 A1 , A 00 A1| ; = 00011 9. S 0 AB | B1A , A BB | 0 , B AA |1 ; = 10001 10. S ABC , A BB | , B CC | a , C AA | b ; = aaab 11. E E + T | T , T T * F | F , F ( E ) | a ; = (a + a ) * a 12. S Aa | bB , A aA | S , B b | Aa | ; = aba

13. Construii un APD care va traduce corect expresii aritmetice din notaia infixat n notaia postfixat i care n plus permite ridicarea la putere. Adic, a b este denotat prin a b . Exponeniala are precedena mai mare dect + i *, adic, expresia (3 + 7) *5 8 , nsemnnd n notaia obinuit (3 + 7) *58 , s fie tradus n
37 + 58 * .

14. Scriei urmtoarele expresii n notaia postfixat: a. (7 + 3*5) *(8 + 7 * 2) + 1 b. (3 + 2) *(3*7 + 8) 15. Convertii urmtoarele expresii n notaia infixat (toate numerele implicate sunt numere simple). a. 357 + *4*5 + b. 12 + 3* 4 + 5* 16. Artai c urmtoarele limbaje nu au gramatici independente de context. a. L = {a n | n = 1, 2,3,K} b. L = {a nb m c k | 0 < n < m < k} c. L = {a p | p este numr prim} d. L = {a nb n c m | m n} e. L = { {a, b, c}* | are un numr egal de a -uri, b-uri i c-uri} f. L = { R | {0,1}*} ; R nseamn inversul lui 17. a. Artai c limbajele L1 = {a ib 2 j c j | i, j = 0,1, 2,K} i
L2 = {a j bi c 2i | i, j = 0,1, 2,K} sunt independente de context.
2

b. Artai c limbajul L1 L2 nu este independent de context. 18. Fie L un limbaj independent de context i fie LR = { | R L} . Artai c LR este de asemene un limbaj independent de context. ( R este inversul irului .)

CAPITOLUL 5 MAINI TURING 5.1. INTRODUCERE I DEFINIII n capitolele precedente am introdus diferite tipuri de dispozitive automate, cum sunt mainile cu stri finite i automatele push-down, care sunt menite s recunoasc limbaje generate de gramatici. Numrul tipurilor de limbaje recunoscute de automatele finite a fost foarte restrns limbaje cu gramatic regular. Automatele push-down s-au dovedit a fi dispozitive mai puternice; de fapt, orice limbaj independent de context a fost recunoscut de un APD (eventual nedeterminist). Dar, chiar i mainile au limitele lor; de pild, un limbaj aparent simplu
{a nb n c n | n = 0,1, 2,K} nu este recunoscut de nici un PDA. (Vezi exemplul

4.6.) Am discutat i maini cu output (paragrafele 3.4. i 4.3). Ele pot fi vzute ca modele matematice a unui concept de algoritm intuitiv: Pentru un input dat (sub forma unui ir finit de simboluri pe o band), maina opereaz asupra acestui input i produce diferite output-uri. Procesul de calcul n aceste maini const n schimbarea strilor interne i modificarea diferiilor pointeri (input, stiv i/sau output). n acest capitol vom studia un alt dispozitiv, numit main Turing, care nglobeaz toate aceste caracteristici, i este mai puternic dect toate mainile discutate pn acuma. Mainile Turing par a fi cele mai puternice dispozitive automate posibile ele sunt n esen definiia matematic exact, a conceptului de algoritm sau procedur. Din acest motiv au fost introduse n 1936 de Alan Turing, vezi [19]. Vom discuta aceste idei mai trziu, dar n esen avem urmtoarea situaie. Un algoritm poate fi vzut ca o mulime de instruciuni, sau dac dorim ca o carte de bucate, folosit de o main care va aciona asupra

diferitelor tipuri de input-uri. Input-urile pot fi vzute ca o mulime finit de simboluri care urmeaz a fi citite de o main (unul cte unul), i programul sau instruciunile care arat mainii ce are de fcut dup citirea fiecrui astfel de simbol. n esen, acesta este comportamentul mainilor Turing, ns partea interesant este faptul c orice definire rezonabil, precis a unui algoritm este echivalent cu conceptul de main Turing. Pe de alt parte, un algoritm este definit ca o main Turing. n esen, o main Turing este compus dintr-un numr finit de stri i o band. Banda este mprit ntr-un numr infinit (numerabil) de celule i este infinit la dreapta. Mainile Turing pot fi reprezentate ca n figura 5.1.

Figura 5.1. O main Turing. Maina are n plus un pointer (cap) de citire/scriere care n otice moment dat puncteaz spre una dintre celulele de pe band. De asemenea mai ar o mulime finit de simboluri, numit alfabetul benzii. Elementele din sunt simbolurile admise n celulele de pe band un simbol pe celul. Unul dintre aceste simboluri este dedicat i se numete simbolul blank, l

vom nota ntotdeauna cu #. Dac simbolul # apare ntr-o celul spunem c celula este blank. n orice moment dat exist doar un numr finit de celule care conin un simbol ne-blank, toate celelalte celule sunt blank. Aadar, toate celulele din dreapta unei celule sunt blank. Maina opereaz n pai discrei. La orice moment dat se afl ntr-o stare Q iar capul ei de citire puncteaz spre o celul care conine un simbol x . Pe baza acestor informaii i numai acestora, maina efectueaz urmtoarele trei operaii:
1. Trece ntr-o stare nou Q .

2. nlocuiete simbolul x, scanat anterior de capul de citire, cu alt


simbol x din .

3. Mut capul cu o celul la dreapta sau la stnga, sau deloc. Aceste trei aciuni, executate mpreun, se numesc micare. Dup efectuarea unei micri maina se afl ntr-o alt stare i citete alt simbol, deci execut alt micare iar procedeul se repet. Iniial, maina se afl ntr-o stare iniial special, pe care de obicei o vom nota Q0 iar banda este umplut cu secvene de simboluri din . Coninutul iniial al benzii va fi numit input. Vom presupune ntotdeauna c input-ul conine doar un numr finit de celule ne-blank. Aadar, cu aceste setri iniiale, maina intr n execuie. Ea se va opri n urmtoarele trei situaii: 1. Una din strile mainii este desemnat ca stare de oprire i va fi ntotdeauna notat cu H. Dup ce maina intr n aceast stare H ea se oprete i-i termin activitate. Spunem n acest caz c maina s-a oprit. 2. Capul de citire/scriere puncteaz spre cea mai din stnga celul de pe band i instruciunile cer capului s se deplaseze cu o celul la

dreapta. n aceast situaie maina nceteaz s opereze; vom spune c maina s-a blocat. 3. Pentru starea curent i simbolul pe care se afl poziionat capul nu exist instruciuni n programul mainii. Dac aceasta are loc, spunem de asemenea c maina s-a blocat. Aadar, fiind dar un input-ul iniial, maina ncepe n starea iniial
Q0 i trece prin stri n timp ce opereaz asupra benzii de intrare. Ea poate

aciona nedefinit, se poate opri sau se poate bloca. Formal avem:

Definiia 5.1. O main Turing T se compune din urmtoarele patru obiecte: 1. O mulime finit de stri Q. Unul dintre elementele din Q este denotat prin H i se numete starea de oprire. 2. O mulime finit de simboluri , numit alfabetul benzii. Unul dintre elementele din este # i poart denumirea de simbol blank. Se presupune c simbolurile L, R, i S nu aparin lui . 3. O stare specificat Q0 din Q numit stare iniial. 4. O funcie de tranziie (Q, x) definit pentru toate perechile de forma (Q, x) unde Q Q ( Q H ) i x . Valoarea lui (Q, x)
este un triplet (Q, x, N ) unde Q Q , x i N = L, R, sau S .

Formal,

: (Q \{H }) Q {L, R, S} ,

cu precizarea c funcia nu trebuie s fie definit pentru toate valorile de Q i x. O astfel de main Turing se noteaz T = {Q, , Q0 , } . Funcia de
tranziie (Q, x) = (Q, x, N ) se interpreteaz astfel: Dac maina se afl n

starea Q i capul ei de citire/scriere puncteaz la simbolul x, atunci T trece


n starea Q , nlocuiete x cu x i deplaseaz capul cu o celul spre

dreapta ( N = R ), o celul spre stnga (dac N = I ) sau rmne neschimbat (dac N = S ). nainte de a prezenta un exemplu, vom elabora o notaie pentru descrierea configuraiilor mainilor Turing. ntruct n orice moment dat banda mainii conine doar un numr finit de simboluri ne-blank, coninutul unei astfel de benzi este descris complet prin listarea prii stngi a benzii inclusiv ultimul simbol ne-blank. Pentru evitarea unor ambiguiti de pild, cnd banda este complet goal descriem coninutul benzii cu trei simboluri: 1 , x i 2 , unde 1 este coninutul benzii din partea dreapt a capului, inclusiv ultimul simbol ne-blank. Fiecare dintre irurile 1 i 2 poate fi irul vid : Dac 1 = , capul puncteaz la cea mai din stnga celul a benzii, dac 2 = , toate celulele din dreapta capului sunt blank (adic, conin simbolul #). Configuraia unei maini Turing este atunci definit ca fiind cvadruplul Q, 1 , x, 2 , unde Q este starea curent iar 1 , x i 2 sunt cele descrise mai sus. Astfel, de exemplu, configuraiile (i) i (ii) din figura 5.2. sunt
Q4 , a # ba, #, a

respectiv

Q5 , aba, #, . Dac nu exist pericol de

confuzie, este convenabil s combinm irurile 1 , x i 2 ntr-un singur ir 1 x 2 i s subliniem poziia capului (adic, simbolul x). Aadar,
Q, 1 , x, 2

este scris ca Q, 1 , x, 2 . Configuraiile din figura 5.2.

vor fi atunci Q4 , a # ba # a i Q5 , aba # . Configuraia unei maini ntr-o stare Q, cu banda complet goal i cu capul punctnd spre celula cea mai din stnga este atunci Q, # .

(i)

(ii)

Figura 5.2. Configuraia unei maini Turing. Presupunem acum c maina Turing se afl n configuraia
Q, 1 x 2

i n urma aplicrii unei funcii de tranziie trece n

configuraia Q, 1 x 2 . Notm aceasta

Q, 1 x 2 Q, 1 x 2

Dac maina T trece din configuraia Q, 1 x 2 n Q, 1 x 2 printr-o

secven de mai multe micri, notm aceasta

Q, 1 x 2 Q, 1 x 2

Notaia aceasta este complet analoag cu cea folosit la descrierea micrilor unei maini cu stri finite sau automat push-down. n aceeai manier, mainile Turing pot fi reprezentate prin diagrame similare celor ale mainilor cu stri finite. Dac T = {Q, , Q0 , } este o main Turing,

pentru fiecare valoare (Q, x) = (Q, x, N ) desenm o sgeat ntre strile Q i Q , ca n figura 5.3.

unde N = L, R sau S

Figura 5.3. Tranziia unei maini Turing. 5.2. MAINI TURING CA PROCEDURI DE DECIZIE Mainile Turing pot fi utilizate ca acceptori de limbaje. Prin aceasta nelegem c o main Turing T = TL recunoate un limbaj L dat, dac T poate determina dac un ir este n L sau nu. O astfel de main Turing este vzut ca o procedur de decizie de apartenen la un limbaj. Aceasta este analog cazului mainilor cu stri finite. Caz n care, dat fiind un limbaj L i o MSF M care recunoate L, am putut determina pentru orice ir dac aparine sau nu lui L. Procedura era simpl: Am pornit M n starea iniial cu input-ul i am observat comportamentul lui M. Dac M s-a oprit ntr-o stare acceptat, era n L, dac M s-a oprit ntr-o stare neacceptat n-a fost n L. n cazul mainilor Turing, informaia dac un ir dat aparine sau nu limbajului, este afiat pe band. Formal avem urmtoarele. Definiia 5.2. Presupunem c L este un limbaj peste un alfabet ; pentru simplificare presupunem c nu conine simbolurile # i $. Spunem c L este recunoscut n sens Turing, dac exist o main Turing
T = TL cu urmtoarele proprieti:

1. Alfabetul de band a lui T conine {S , #} (poate conine i alte simboluri); 2. Presupunem c este un ir de simboluri din ( * ) i considerm maina T n configuraia iniial Q0 , $ . Dac este n L, maina T se va opri n configuraia H , $Y ;

Q0 , $ H , $Y pentru L ;

Dac nu este n L, atunci maina se va opri n configuraia


H, $N :

Q0 , $ H , $ N pentru L .

Maina Turing trebuie s se opreasc pentru toate input-urile valide, adic, ori de cte ori este pornit n configuraia Q0 , $ cu * .

Aceasta nseamn c T poate decide problema apartenenei pentru orice ir * . Din acest motiv, limbajele recunoscute de o main Turing se numesc i recunoscute n sens Turing. Deci, un limbaj poate fi descris i de o main Turing bazat pe faptul dac maina se oprete, sau nu, cu un ir dat. Spunem c un limbaj este acceptat de o main Turing T = TL dac L se compune din acei pentru care T, eventual, odat pornit n configuraia Q0 , $ , se va opri (coninutul benzii n momentul intrrii n starea de oprire este vid). Dac un limbajul L este acceptat de o main Turing, spunem c L este acceptabil Turing. Aceast metod de descriere a unui limbaj este complet diferit de ceea dat anterior i o vom discuta detaliat n capitolul 9. Pentru clarificarea acestor concepte, s considerm unele exemple.

Exemplu 5.1. Vom proiecta o main Turing care va recunoate limbajul


L = {1n | n = 1,3,5,K}

adic, limbajul irurilor formate dintr-un numr impar de 1-uri. Ideea de baz a unei astfel de maini T este urmtoarea: Pornit n configuraia
Q0 , $11K1 va muta capul spre dreapta, alternnd ntre dou stri pentru

a contoriza numrul de 1-uri, pn cnd ntlnete #. Atunci se va deplasa la stnga, nlocuind toate simbolurile de band cu #, pn ce ajunge captul stng al benzii; apoi scrie Z pe band i se oprete. Descrierea formal a mainii este urmtoarea: 1. Alfabetul este {$, 1, Y , N , #} . 2. Strile sunt: Q0 , starea iniial; Q1 , numr par de 1-uri ntlnite pn aici; Q2 , numr impar de 1-uri ntlnite pn aici; Q3 , numrul de 1-uri din este par, mut capul napoi pe $; Q4 , numrul de 1-uri din este impar, mut capul napoi pe $; Q5 , scrie Y i se oprete; Q6 , scrie N i se oprete; H, starea de oprire. 3. Funcia de tranziie este dat de diagrama din figura 5.4.

Figura 5.4. Main Turing care recunoate un limbaj. n figura 5.5. valorile funciei de tranziie sunt date sub form tabelar. Funcia nu este definit pentru toate valorile de Q i x. Considerm acum, ca exemplu, micrile mainii la input-urile 1 = 111 i 2 = 1111 . Cu input-ul 1 avem
Q0 , $111 Q1 , $ 1 11 Q2 , $1 1 1 Q1 , $11 1 Q2 , $111# Q4 , $11 1 Q4 , $1 1 Q4 , $ 1 Q4 , $ Q6 , $ # H , $ H se oprete, irul de intrare este n L.

Simbol de band x 1
Q0 Q1 (Q2 , 1, R) (Q1 , 1, R) (Q3 , #, L) (Q4 , #, L) (Q5 , $, L) (Q6 , $, R)

$
(Q1 , $, R)

(Q3 , #, L) (Q4 , #, L) (Q3 , #, L) (Q4 , #, L) ( H , N , L) ( H , N , L)

S t a r e

Q2 Q3 Q4 Q5 Q6

H Figura 5.5. Valorile funcie de tranziie .

Cu input-ul 2 avem
Q0 , $1111 Q1 , $ 1 111 Q2 , $1 1 11 Q1 , $11 1 1 Q2 , $111 1 Q1 , $1111# Q3 , $111 1 Q3 , $11 1 Q3 , $1 1 Q3 , $ 1 Q3 , $ Q5 , $ # H , $ N se oprete, irul de intrare nu este n L.

Aceast main, fiind simpl i direct, nu este foarte interesant. Limbajul din cauz a fost deja recunoscut de un automat finit. Dm acum un exemplu de main Turing care va recunoate limbajul
L = {a nb n c n | n = 0,1, 2,K} , despre care tim c nu este acceptat de vreun

automat push-down, vezi exemplul 4.7. Exemplu 5.2. Construim o main Turing care recunoate limbajul
L = {a nb n c n | n = 0,1, 2,K} . Maina T se va comporta n felul urmtor: Fiind

dat un ir de a-uri, b-uri i c-uri ( (a + b + c )* ), maina, odat pornit n configuraia


Q0 , $ , se va opri n configuraia H , $Y

dac c

aparine limbajului sau n H , $ N

dac nu aparine limbajului. O

scurt privire asupra operaiilor ei este urmtoarea: 1. Va avea strile C1 , C2 , C3 . Dac T decide c aparine limbajului, va intra n starea C1 urmnd s goleasc banda i se oprete n configuraia H , $Y . 2. Va avea strile D1 , D2 , D3 . Dac T decide c nu aparine limbajului, va intra n starea D1 i trece n configuraia H , $ N . 3. Va utiliza strile E1 E5 pentru a determina dac este de forma
a i b j c k , adic, dac a *b*c * . Aceasta se face, ncepnd din

configuraia

E1 , $ , prin deplasarea capului spre dreapta i

intrarea n starea E2 . Dac este ntlnit a, capul continu s se deplaseze la dreapta ateptnd apariia lui b, la care T intr n starea
E3 . Capul se deplaseaz atunci din nou spre dreapta pn cnd este

ntlnit c iar starea se schimb n E4 . Capul continu deplasarea spre dreapta pn ce ntlnete #, deci a *b*c* . Dac ceva merge greit, maina intr n starea D1 . 4. Mai departe, se determin dac numrul de a-uri, b-uri i c-uri este acelai. n aceste moment se tie deja c irul este de forma
a i b j c k , deci mai trebuie verificat dac i = j i j = k . Pentru a

verifica c numrul de a-uri i b-uri este acelai, capul este poziionat la nceputul irului i oscileaz, nainte i napoi, ntre a-uri i b-uri. De fiecare dat cnd ntlnete un a, acesta se schimb n p, iar capul se deplaseaz la dreapta pentru a gsi un b. Odat gsit, este schimbat n q, iar capul se deplaseaz napoi pentru a gsi alt a. Dac nu mai gsete nici unul, maina verific dac exist b-uri nemarcate, adic, dac toi b au fost schimbai n q-uri. Din nou, dac merge ceva greit, maina intr n starea D1 . Toate acestea au loc n timp ce maina rmne ntr-una din strile
F1 , F2 , F3 , F4 . Mai rmne de artat c numrul de p-uri este egal

cu numrul de c-uri (fiecare a a fost schimbat n p, deci exist attea p-uri ci au fost de a). Aceasta are loc n timp ce maina se mic ntre strile G1 , G2 , G3 ; ideea este aceeai ca la compararea de a-uri i b-uri. Aceasta nu este cea mai eficient modalitate de construire a mainii discutate; schema a fost aleas doar din motive de claritate. Formalitile construcie sunt urmtoarele:

1. Maina are urmtoarele stri:


Q0 , Q1 pentru pornirea operaiei; (aici se determin i dac = ) C1 , C2 , C3 pentru golire dup ce s-a determinat c L D1 , D2 , D3 pentru golire dac s-a determinat c L E1 , E2 , E3 , E4 , E5 pentru a determina dac a *b*c * F1 , F2 , F3 , F4 pentru a determina dac numrul de a-uri i b-uri

este acelai
G1 , G2 , G3 pentru a determina dac numrul de a-uri i c-uri este

acelai 2. Alfabetul benzii este = {$, a, b, c, p, q, r , s, Y , N , #} . 3. Starea iniial este Q0 . 4. Funcia de tranziie este dat dup cum urmeaz: Strile C1 , C2 i C3 : Dac maina intr n starea C1 , a determinat c irul este n limbaj iar tot ce rmne de fcut sunt operaii de golire:
(C1 , x) = (C1 , x, R) pentru toi x # (Localizeaz primul simbol din

dreapta)
(C1 , #) = (C2 , #, L)

(C2 , x) = (C2 , x, L) pentru toi x $ (terge toate simbolurile de pe

band exceptnd $)
(C2 , $) = (C3 , $, R)

(C3 , #) = ( H , Y , L) Scrie Y pe band i se oprete.

Strile D1 , D2 i D3 : Micrile sunt la fel ca mai sus, cu excepia c simbolul N trebuie scris la sfrit:
( D1 , x) = ( D1 , x, R) pentru toi x # ( D2 , x) = ( D2 , #, L) pentru toi x $ ( D3 , #) = ( H , N , L) ( D1 , #) = ( D2 , #, L) ( D2 , $) = ( D3 , $, R)

Strile E1 E5 . Pornim n configuraia

E1 , $ , ne deplasm la

dreapta, ateptnd s gsim un ir de a-uri urmat de o secven de b-uri, urmate de c-uri iar n final #. Dac aceasta are loc, ntoarcem capul la $ i trecem la urmtoarea etap. Orice deviere de la ceea ce ne ateptm rezult n schimbarea n starea D1 . Avem:
( E1 , $) = ( E2 , $, R ) ( E2 , b) = ( E3 , b, R) ( E3 , c) = ( E4 , c, R ) ( E4 , #) = ( E5 , #, L) ( E2 , a) = ( E2 , a, R) ( E3 , b) = ( E3 , b, R) ( E4 , c) = ( E4 , c, R)

n acest moment maina a determinat c a *b*c* , deci trebuie s mute capul napoi la $ i s continue cu urmtorul set de teste:
( E4 , x) = ( E5 , x, L) pentru toi x $ , ( E5 , $) = ( F1 , $, S ) . n toate

celelalte cazuri, ( E j , x) = ( D1 , x, R) . (Continu cu respingere.)

Strile F1 F4 : Obiectivul este aici de a determina dac numrul de a-uri este acelai cu numrul de b-uri. ntruct am ajuns

configuraia F1 , $ , suntem asigurai c este de forma a ib j c k . ncepem cu mutarea capului spre dreapta pn la gsirea lui a. Atunci starea va fi schimbat n F2 i a nlocuit cu p. Capul va continua s se deplaseze la dreapta (presupunnd numai a-uri i q-uri pe acest drum) pn ce ntlnete un b. La ntlnirea unui b, acesta se schimb n q, capul se ntoarce la celula cea mai din stnga ($) i procedeul ncepe de la nceput. irul trece de testul de apartenen la L dac ncepnd de la $ i mergnd spre dreapta, maina nu gsete nici un a sau b tot ce vede sunt p-uri i q-uri iar apoi d de un c. Detaliat avem:
( F1 , x) = ( F1 , x, R ) pentru x = $, p, q ; ( F1 , a) = ( F2 , p, R) (Gsete i

marcheaz un a.)
( F2 , x) = ( F2 , x, R) pentru x = a, q ; ( F2 , b) = ( F3 , q, L) (Gsete i

marcheaz un b.)
( F3 , x) = ( F3 , x, L) pentru x $ ; ( F3 , $) = ( F1 , $, R ) (ncepe din nou

cutarea unui a.)


( F1 , c) = ( F4 , c, L) ; (Toate a-urile i b-urile sunt potrivite, este

timpul pentru a vedea dac numrul de p-uri este egal cu numrul de c-uri.)
( F4 , x) = ( F4 , x, L) pentru toi x $ ; ( F4 , $) = (G1 , $, S )

n toate celelalte situaii ( Fj , x) = ( D1 , x, R) (irul nu este din L).

Strile G1 G3 . Aici se determin dac numrul se a-uri (p-uri) este egal cu numrul de c-uri. Ideea de baz este analoag comportamentului din strile F; formularea exact este urmtoarea:

(G1 , x) = (G1 , x, R) pentru x = $, r , p, s ; (G1 , p) = (G2 , r , R) (Gsete

i marcheaz un p.)
(G2 , x) = (G2 , x, R) pentru x = p, q, s ; (G2 , c) = (G3 , s, L) (Gsete i

marcheaz un c.)
(G3 , x) = (G3 , x, L) pentru x $ ; (G3 , $) = (G1 , $, R) (Caut din nou

un p.)
(G1 , #) = (C1 , #, L) (Numrul de p-uri este egal cu numrul de c-uri

deci L .) n toate celelalte situaii (G j , x) = ( D1 , x, R) .

n final, ntreaga operaia ncepe n configuraia Q0 , $ . Aadar:


(Q0 , $) = (Q1 , $, R) ; (Q1 , #) = (C1 , #, R)

(irul = , continu

pentru acceptare)
(Q1 , x) = ( E1 , x, L) pentru restul de x-uri. (ncepe cu testarea.)

Ilustrm comportarea lui T cu input-ul = aabbcc . Micrile sunt:

Q0 , $ aabbcc Q1 , $aabbcc E1 , $ aabbcc E2 , $ aabbcc E2 , $aabbcc E2 , $aabbcc E3 , $aabbcc E3 , $aabbcc E4 , $aabbcc E4 , $aabbcc # E5 , $aabbcc E5 , $aabbcc E5 , $aabbcc E5 , $aabbcc E5 , $aabbcc E5 , $ aabbcc E5 , $ aabbcc F1 , $ aabbcc F1 , $ aabbcc F2 , $ pabbcc F2 , $ pabbcc F3 , $ paqbcc F3 , $ paqbcc F3 , $ paqbcc F1 , $ paqbcc F1 , $ paqbcc F2 , $ ppqbcc F2 , $ ppqbcc F3 , $ ppqqcc F3 , $ ppqqcc F3 , $ ppqqcc F3 , $ ppqqcc F1 , $ ppqqcc F1 , $ ppqqcc F1 , $ ppqqcc F1 , $ ppqqcc F1 , $ ppqqcc F4 , $ ppqqcc F4 , $ ppqqcc F4 , $ ppqqcc F4 , $ ppqqcc F4 , $ ppqqcc G1 , $ ppqqcc G1 , $ ppqqcc G2 , $rpqqcc G2 , $rpqqcc G2 , $rpqqcc G2 , $rpqqcc G3 , $rpqqsc G3 , $rpqqsc G3 , $rpqqsc G3 , $ rpqqsc G3 , $ rpqqsc G1 , $ rpqqsc G1 , $rpqqsc G2 , $rrqqsc G2 , $rrqqsc G2 , $rrqqsc G2 , $rrqqsc G3 , $rrqqss G3 , $rrqqss G3 , $rrqqss G3 , $rrqqss G3 , $ rrqqss G3 , $ rrqqss G1 , $ rrqqss G1 , $rrqqss G1 , $rrqqss G1 , $rrqqss G1 , $rrqqss G1 , $rrqqss G1 , $rrqqss # C1 , $rrqqss C1 , $rrqqss # C2 , $rrqqss C2 , $rrqqs C2 , $rrqq C2 , $rrq C2 , $rr C2 , $ r C2 , $ C3 , $ # H , $Y irul este n limbaj.

5.3. CALCULE CU MAINI TURING n exemplele 5.1. i 5.2. am reconstruit maini Turing care serveau rolului de a recunoate diferite tipuri de limbaje. Maina a decis dac un ir de intrare dat a fost valid sau nu, adic, au decideau dac un ir dat aparinea unor limbaje anume. Mainile Turing pot deservi i rolul de calculator sau computer. Mai precis, dac presupunem c f (n) este o funcie de o variabil n care s fie un ntreg pozitiv, i presupunem c valorile lui f sunt de asemenea ntregi pozitivi ( f :
+ +

). Spunem c f

este calculabil Turing dac exist o main Turing T f cu urmtoarea

proprietate: Pentru un input oarecare format din n de 1, maina T f va trece din configuraia iniial

Q0 , $111K1 123
de n ori 1

n configuraia de oprire
H , $ 111K1 123

de f ( n ) ori 1

Exemplu 5.3. Vom construi un exemplu de main Turing T pentru funcia f (n) = 2n . Practic, maina va funciona n felul urmtor: 1. Pornind din cea mi din stnga celul a benzii, maina se deplaseaz la dreapta pn ce gsete simbolul 1. Odat ntlnit, 1 este nlocuit cu a iar capul continu s se deplaseze spre dreapta pn ce a ntlnit i nlocuit primul simbol blank # cu b. 2. Capul se ntoarce la celula cea mai din stnga i ncepe cutarea unui alt 1. Odat gsit, acest 1 este din nou nlocuit cu a iar primul simbol blank cu b. 3. Pasul 2 se repet atta timp ct mai sunt 1-uri n input-ul. De vreme ce nu mai exist 1-uri, banda va conine n de a i n de b. Toate acestea sunt din nou nlocuite cu 1 iar maina se oprete. Formal, aceast main este schiat de diagrama din figura 5.6. Starea Q1 este folosit pentru gsirea i nlocuirea urmtorului 1 cu a, Q2 gsete primul # disponibil i-l nlocuiete cu b, Q3 mut capul napoi pe cea mai din stnga celul, Q4 nlocuiete a-urile i b-urile cu 1-uri i trece

n starea de oprire la apariia lui $. Alfabetul benzii este = {1, a, b, $, #} . Simbolul $ este introdus aici, ca i n exemplul anterior, pentru simplificare pentru a marca cea mai din stnga celul a benzii dar poate fi omis, ceea ce ar face maina mai complicat. Considerm, de pild, micrile acestei maini la input-ul = 11 :
Q0 , $11 Q1 , $ 1 1 Q2 , $a 1 Q2 , $a1# Q3 , $a 1 b Q3 , $ a1b Q3 , $ a1b Q1 , $ a1b Q1 , $a 1 b Q2 , $aab Q2 , $aab # Q3 , $aabb Q3 , $aabb Q3 , $ aabb Q3 , $ aabb Q1 , $ aabb Q1 , $aabb Q1 , $aab b Q1 , $aabb Q1 , $aabb # Q4 , $aabb Q4 , $aab1 Q4 , $aa11 Q4 , $ a111 Q4 , $1111 H , $1111 O alt demonstraie c 2* 2 = 4.

Figura 5.6. O main Turing care calculeaz. Conceptul funciilor calculabile nu trebuie restrns doar la funciile ntregi. O funcie calculabil pot fi vzut ca algoritm sau set de reguli, care pentru un argument (input) dat, format dintr-un ir finit de

simboluri, produce o valoare (output), compus la rndul ei dintr-un ir finit de simboluri (potenial diferite). Definiia 5.3. Fie 1 i 2 dou alfabete (mulimi finite, nevide de simboluri), care, pentru simplificare, presupunem c nu conin simbolurile $ i #. Fie f ( ) o funcie a crei argumente sunt iruri de simboluri din 1 i ai crei valori sunt iruri de simboluri din 2 . Presupunem c f este definit pentru toate irurile ca mai sus
* f : 1 * . Spunem c f este calculabil Turing dac exist o main 2

Turing T f astfel nct oricnd configuraia iniial Q0 , $

f ( ) = , maina T f

va trece din

n configuraia de oprire H , $ . Cu alte

cuvinte T f va transforma input-ul n output-ul f ( ) .

Definiia acoper toate situaiile posibile. De exemplu, o funcie de valori ntregi cu trei variabile w = f ( x, y, z ) este calculabil Turing dac exist o main Turing T f care va transforma un input-ul

e1 11K1| e2 11K1| e3 11K1 { { {


de x ori de y ori de z ori

n
e 11K1 {

de f ( x , y , z ) ori

Acele e-uri pot fi irul vid, +, sau iar | este un separator. Aadar, dac
w = f ( x, y, z ) = 3 x 4 y z , astfel ca f (1, 2, 3) = 2 , maina Turing pentru f

are de transformat irul 1|11| 111 n 11 , adic, trece din configuraia


Q0 , $1|11| 111 n H , $ 11 .

Mainile Turing sunt acceptate ca noiuni precise a unor concepte vagi de algoritm sau procedur efectiv. Astfel, a spune c exist un algoritm pentru rezolvarea unei probleme este echivalent cu a spune c exist o main Turing care, alimentat cu o band care conine descrierea acestei probleme, va executa o secven finit de micri i se va opri cu banda coninnd soluia problemei. Exist alte definiri de algoritmi i funcii efectiv calculabile, dar ele sunt echivalente cu cea dat anterior. Afirmaia c orice procedur efectiv calculabil, sau orice algoritm, poate fi implementat de o main Turing este cunoscut sub numele de tez Church-Turing (vezi [6] i [19]). Desigur nu poare fi demonstrat, dar este aproape universal acceptat. Aceasta conduce n mod natural la ntrebarea dac orice funcie este calculabil i dac orice problem are un algoritm care s-o rezolve. Mai exact prin aceasta se nelege urmtorul lucru: 1. Este adevrat c pentru o funcie oarecare dat f : , exist o main Turing T f care pentru orice n va executa urmtoarea secven de micri:
*

Q0 , $11K1 H , $ 11K1 { {
de n ori 1

de f ( n ) ori 1

2. ntrebarea Are fiecare problem un algoritm care o va rezolva? este desigur prea vag i neprecis pentru orice analiz matematic raional. O vom formula astfel: Presupus c C este o clas de probleme, fiecare din ea putnd fi complet descris de un numr finit de simboluri dintr-un alfabet fixat . n plus se presupune c fiecare problem din C

este bine definit, adic, poate fi rspuns cu Da sau Nu. A ntreba de existena unui algoritm pentru a rezolva toate problemele din C nseamn a ntreba urmtoarele: Exist o main Turing TC care pornit n configuraia Q0 , $ , unde este descrierea unei probleme din C, se va opri n configuraia H , $Y dac rspunsul pentru este Da i se va opri n configuraia H , $ N dac rspunsul pentru este Nu. Exprimat n aceti termeni, un algoritm este atunci doar o alt funcie efectiv calculabil f : * {Y , N } Surprinztor rspunsul la aceste dou ntrebri este nu. Exist funcii necalculabile i probleme nerezolvabile. Afirmaia are, desigur, o varietate de implicaii filosofice, care ns nu vor fi atinse aici. n schimb, restul capitolului va fi consacrat expunerii explicite a acestor probleme i funcii.

5.4. EXTENSII ALE MAINILOR TURING O proprietate curioas, dar esenial, a mainilor Turing este c puterea lor de calcul nu poate fi cu mult mbuntit. Putem considera, de pild, maini Turing cu mai multe benzi, definirea exact fiind mai mult sau mai puin evident. Se descoper c orice funcie care poate fi calculat de o astfel de main poate fi calculat i de o main standard (cu o band). Alt posibilitate este de a permite mainii Turing s aib mai multe capuri de citire din nou nu se obine nimic prin aceasta. Tot ce poate fi calculat de aceste maini presupuse mai puternice poate fi calculate i de maini Turing standard.

Situaia

este

similar

cnd

considerm

maini

Turing

nedeterministe. Definiia lor concret este exact ca mai sus, cu excepia c funcia de tranziie (Q, x) poate avea valori multiple: Dac maina se afl n starea Q iar capul ei puncteaz spre simbolul x de pe band atunci
(Q, x) d lista micrilor legale posibile. Este dificil s vorbim de un

limbaj recunoscut de o main Turing nedeterminist, ntruct, n funcie de input-ul iniial, alegeri diferit de micri pot duce la rezultate diferite. Putem, ns, vorbi de un limbaj L acceptat de o main Turing nedeterminist. Fiind dat o astfel de main Turing T, limbajul LT acceptat de L se compune din acele iruri pentru care exist secvene de micri legale, ncepnd cu configuraia Q0 , $ , care fac ca T s se opreasc. (Nu cerem ca T s poat decide dac un ir dat este sau nu n L.) Din punct de vedere a acceptrii limbajelor, mainile nedeterministe nu sunt mai puternice dect cele deterministe: Dac un limbaj L este acceptat de o main Turing nedeterminist T1 , este acceptat i de o alt main Turing determinist T2 . Astfel, situaia este asemntoare cu cazul automatelor finite, dar diferit de automatele push-down. Nu vom demonstra toate aceste rezultate raionamentele sunt lungi i nu conduc la o ptrundere mai adnc n materia acestui subiect. Cititorului i este liber s aleag o tratare mai detaliat al acestui subiect, vezi [15] sau [8]. Vom da doar o singur ilustrare a unei teoreme de acest gen, anume, c orice main Turing cu dou benzi este echivalent cu o main standard cu o band. Mai precis, o main Turing cu dou benzi va avea i dou capuri. Aadar funcia de tranziie a acestei maini va fi de forma
(Q, x1 , x2 ) = (Q, x1 , N1 , x2 , N 2 )

unde Q este starea curent, x1 simbolul pe care se afl capul de pe prima


band, x2 este simbolul citit de al doilea cap, Q este noua stare, x1 i x2

sunt simbolurile care nlocuiesc x1 i x2 , iar N1 i N 2 sunt instruciunile corespunztoare pentru mutarea capurilor la dreapta ( Ni = R ), stnga ( Ni = L ) sau deloc ( Ni = S ). O configuraia a maini va fi descris de
Q, 1 x11 , 2 x2 2

unde Q este starea curent i i xi i este coninutul benzii i, i = 1, 2 (locaia capului este marcat prin subliniere).

Banda 1

Starea curent Q7

Banda 2

Figura 5.7. O main Turing cu dou benzi. De exemplu, maina Turing cu dou benzi din figura 5.7. se afl n configuraia
Q7 , accb # a, abbacca .

Dac, (Q7 , c, a) = (Q3 , b, L, b, R) ,

urmtoarea configuraie a mainii va fi Q3 , accb # a, bbbacca . Fie L un limbaj peste un alfabet . Spunem c L este recunoscut de o main Turing cu dou benzi T2 dac pentru oricare din * sunt adevrate urmtoarele:
*

L implic Q0 , $ , $ H , $ Y , $

L implic Q0 , $ , $ H , $ Y , $

Cu aceste notaii avem: Teorema 5.1. Fie L un limbaj peste un alfabet . Atunci L este recunoscut de o main Turing cu dou benzi T2 dac i numai dac este recunoscut de o main standard cu o singur band T1 (definiia 5.2.). Demonstraie. Dac un limbaj este recunoscut de o main cu o band T1 , este evident recunoscut i de o main cu dou benzi T2 : nu micm al doilea cap. Formal, dat fiind T1 = {Q, , Q0 , } , maina T2 va avea aceleai stri i acelai alfabet ca T1 , iar funcia ei de tranziie va fi
2 (Q, x, y ) = (Q, x1 , N , y, S )

unde 1 (Q, x) = (Q, x, N ) mutm primul cap din T2 n aceeai manier ca

capul din T1 , iar al doilea cap l lsm s puncteze ntotdeauna spre celula cea mai din dreapta. Partea dificil (i interesant) a demonstraiei este de a arta c dac un limbaj L recunoscut de o main cu dou benzi, este recunoscut i de o main standard cu o singur band. La prima vedere se pare c avnd la dispoziie o a doua band obinem o mai mare putere de calcul: Putem memora informaie pe o band n timp ce lucrm cu cealalt. Vom vedea c acesta nu este cazul. O demonstraie formal complet este grea, cu multe implicaii i oarecum dincolo de scopul acestei lucrri. Vom prezenta o schi a ideii principale. Fie T2 o main Turing cu dou benzi care recunoate un limbaj L. Notm capurile cu h1 i h2 . Vom construi mai nti o main auxiliar cu

o band U care va simula micrile lui T2 dup cum urmeaz. Fiecare celul a benzii mainii U va conine: simbolul , simbolul blank % (pentru a-l putea deosebi de simbolul blank # al mainii T2 ), sau un cvadruplu (a1 , 1 , a2 , 2 ) . Simbolul se va afla ntotdeauna n celula cea mai din stnga i nu va fi eliminat niciodat. Cvadruplul (a1 , 1 , a2 , 2 ) din celula a i-a din U va conine informaia despre celulele i de pe benzile mainii T2 . (Indexarea celulelor din U ncepe de la 0: celula cea mai din dreapta a lui U este celula 0, urmtoarea este prima celul etc. Celulele din T2 vor fi indexate ncepnd cu 1: celula cea mai din stnga a fiecrei benzi din T2 este referit ca celula numrul 1, urmat de celula numrul 2, etc.)

Figura 5.8. O celul a mainii Turing U. Dac celulele i de pe benzile mainii T2 conine simbolurile x respectiv y, atunci celula a i-a din U conine cvadruplul ( x, 1 , y, 2 ) . Simbolurile 1 i
2 sunt determinate astfel: Dac capul h1 puncteaz spre celula i a primei

benzi din T2 , punem 1 = 1 , n caz contrar 1 = 0 ; aceeai regul se aplic simbolului 2 este egal cu 1 sau 0 n funcie dac capul h2 puncteaz spre celula a i-a a de pe banda a doua din T2 . Vom descrie un astfel de cvadrupl n forma vertical ca n figura 5.8. Astfel, dac benzile mainii
T2 se afl n configuraia din figura 5.9., banda maini U va fi de forma

dat n figura 5.10.

Toi #

Banda 1

Toi #

Banda 2

Figura 5.9. Benzile unei maini Turing cu dou benzi. Comportamentul mainii U este acum evident: O singur micare a mainii T2 va rezulta n schimbarea strii mainii, coninutul a dou celule (cte una de pe fiecare band) i reajustarea poziiilor capurilor de citire
h1 i h2 . Fiecare astfel de micare a lui T2 va determin o secven de

micri a lui U, rezultnd ntr-o ajustare a celulelor sale valorile relevante pentru ai -uri i i se schimb pentru a reflecta noua configuraie a mainii T2 .

Toi %

Figura 5.10. O band a unei maini Turing. Formal, alfabetul U a mainii U este dat de o mulime finit
U = {, %} ( {0, 1} {0, 1})

Maina U i va ncepe activitatea cu capul punctnd pe celula cea mai din stnga (coninnd simbolul ). Dup fiecare micare a lui T2 capul lui se va deplasa la dreapta, fcnd ajustrile necesare, iar atunci se ntoarce

la cea mai din stnga celul ateptnd urmtoarea micare a lui T2 . Aceasta se poate realiza avnd strile din U ca expresii de forma
(Q, x, y, (Q, x, y ))

unde Q este starea curent din T2 iar x i y sunt simbolurile din care se afl sub capurile h1 respectiv h2 . Instruciunile mainii U pot fi acum explicitate: 1. Pornete n starea (Q0 , x0 , y0 , (Q0 , x0 , y0 )) cu capul punctnd spre celula cea mi din stnga (coninnd simbolul ). Simbolurile x0 i
y0 precum i coninutul iniial al benzii din U vor reflecta

configuraia iniial a mainii T2 . 2. Deplaseaz capul spre dreapta pn ce sunt ntlnite ambele cazuri de i = 1 . De fiecare dat, schimb valorile a-urilor i -urilor relevante. (Informaia privind ceea ce este de fcut dac se ntlnete = 1 este coninut n valoarea funciei (Q0 , x0 , y0 ) .)
Noteaz aceste valori, fie ele Q , x i y ; se ntoarce la celula cea

mai din stnga (care poate fi depistat prin prezena lui ); i trece
ntr-o stare nou (Q, x, y, (Q, x, y )) . 3. Repet pasul 2 pn ce noua stare Q este starea de oprire H din T2 .

4. Golete prin a termina cu capul amplasat pe cea mai din stnga celul i se oprete. Ca urmare, este evident c maina cu o singur band U va simula micrile mainii Turing cu dou benzi T2 orice decizie luat de T2 va fi luat i de U. De asemenea este limpede c, prin adugarea unor stri

suplimentare la U, coninutul final al benzii poate fi transformat n forma cerut de enunul teoremei 5.1. Q.E.D. Trebuie remarcat faptul c adugarea unei benzi suplimentare la o main Turing nu are efect asupra puterii de calcul a acesteia, dar are definitiv efect asupra eficienei. Presupunem c T2 este o main Turing cu dou benzi simulat de o main Turing cu o singur band T1 , ca n teorema 5.1. Dac unul dintre capurile lui T2 este m celle ndeprtat de la nceputul benzii i T2 face o micare, atunci T1 are de efectuat cel puin m micri pentru a simula aceast singur micare. Dac T2 pornete cu ambele capuri pe cele mai din stnga celule i la fiecare micare amndou capuri se deplaseaz la dreapta, atunci i ia lui T1 cel puin
1 + 2 + L + k 1 2 k 2 micri pentru a simula primele k micri ale lui T2 .

Aadar, vag vorbind, dac o main Turing necesit n micri pentru rezolvarea unei anumite probleme, ne am putea atepta ca adugarea unei benzi suplimentare va duce la rezolvarea problemei n
n pai. Aceast

idee poate fi cu mult precizat; studiul complexitii de calcul se ocup cu ntrebri de acest gen. Un cititor interesat poate consulta [13]. 5.5. CODIFICRI Evident c conceptul de main Turing este independent de modul n care aceste maini sunt descrise. Aadar, nu conteaz dac notm strile unui maini cu Q0 , Q1 ,K , sau P1 , P2 ,K . Ceea ce conteaz sunt procesele interne ale dispozitivului adic, numrul de stri, numrul de simboluri de band, relaia de tranziie i desemnarea diferitelor stri drept stri interne i/sau de oprire. Vom prezenta acum o schem care descrie uniform oricare i toate mainile Turing. Mai exact, fiind dat o

main Turing T, vom arta cum se d o descriere complet i neambigu a lui T utiliznd doar un numr finit de simboluri fixate. De fapt, orice main Turing poate fi descris folosind numai simbolurile B, A, E, P, X, Y, L, R, S, 0 i 1. Se procedeaz astfel: Prin definiie, orice main Turing se compune dintr-un numr finit de stri, un alfabet de band finit i un numr finit de relaii de tranziie care implic doar strile i simbolurile de band. Astfel, orice main Turing poate fi descris de o secven de simboluri

B1 A 2 PT1T2 KTm E

(0.1)

unde 1. 1. 1 este numrul de stri din T scris n notaie binar (adic, utiliznd doar 0 i 1). Starea iniial are asociat numrul 1 i starea de oprire numrul 1 . 2. 2. 2 Este numrul de simboluri de band din T, din nou scris n notaie binar. Simbolul blank, care este un simbol de band pentru oricare main Turing, va avea asociat numrul 1. 3. 3. T1 , T2 , K , Tk sunt relaii de tranziie din T codificate n felul urmtor. Fiecare stare i fiecare simbol de band din T are asociat un numr unic strile au numere ntre 1 i 1 iar simbolurile de band numere ntre 1 i 2 . Fiecare relaie de tranziie
(Q, x) = (Q, x, N ) este atunci codificat ca

1 X2 X3 X 4 XNY

unde 1 i 2 sunt numerele asociate lui Q i x, respectiv 3 i 4


sunt numerele asociat lui Q i x iar N = R, L sau S . Simbolurile B,

A, P, X, Y i E sunt folosite drept delimitatoare. Dac T este o main Turing, notm cu D1 (T ) descrierea lui T dat de (5.1) este:

D1 (T ) = B1 A 2 PT1T2 KTm E

(0.2)

Similar, orice segment iniial (finit) de band a unei maini Turing T poate fi codificar utiliznd doar simbolurile A, F, W, Z, 0 i 1. Codificarea unei astfel de benzi are forma

W 2 A 1Z 2 Z 2 K Z k F

(0.3)

Aici 2 este numrul de simboluri de band din T i 1 , 2 , K , k sunt numerele acestor simboluri care apar efectiv pe band: 1 este numrul simbolului de band din prima (cea mai din stnga) celul, 2 este numrul simbolului din a doua celul, etc. Aceste numere
2 , 1 , 2 , K , k sunt exprimate n notaie binar iar W, A, Z i F servesc

drept delimitatori. Se subnelege c simbolul din dreapta celulei k este simbolul blank, a crui numr este 1. Codificarea prii iniiale a benzii descrise va fi notat D2 ( ) :

D2 ( ) = W 2 A 1Z 2 Z 2 K Z k F

(0.4)

Exemplu 5.4. Considerm maina Turing dat de diagrama din figura 5.11.

Figura 5.11. O main Turing T. Aceast main are trei stri, deci 1 = 11 (binar, 3 n decimal). Prin convenie, starea iniial are asociat numrul 1 iar starea de oprire H numrul 1 = 11 ; aadar, Q1 are asociat numrul 10. Mai are 4 simboluri de band: a, b, c i #, deci 2 = 100 (n binar); prin convenie # are asociat numrul 1 iar noi asociem 10 lui a, 11 lui b i 100 lui c. Tranziiile lui T sunt codificate astfel:

reprezint

(Q0 , a) = (Q0 , a, R)

i se codific ca

1 1 { X 10 X { X 10 X R Y { {
Q0 a Q0 a

reprezint

(Q0 , b) = (Q1 , #, S )

i este codificat ca

1 1 { X 11 X 10 X { X S Y { {
Q0 b Q1 #

reprezint (Q1 , b) = (Q1 , b, R) i este codificat ca

10 X 11 X 10 X 11 X R Y { { { {
Q1 b Q1 b

reprezint

(Q1 , a) = ( H , c, R)

i este codificat ca

10 X 10 X 11 X 100 X R Y { { { {
Q1 a H c

Codificarea ntregii maini Turing este atunci


D1 (T ) = B 11 A 100 P 1X 10 X 1X 10 XRY 1X 11X 10 X 1XSY { { 144 2444 1442444 4 3 4 3
1 2
T1 T2

10 X 11X 10 X 11XRY 10 X 10 X 11X 100 XRY E 1444 2444 144424443 3


T3 T4

Similar, dac partea stng a benzii lui T ar fi = ab # ac , coninutul benzii s-ar codifica astfel:
D2 ( ) = W 100 A 10 Z 11 Z { Z 10 Z 100 F 1 { { { { {
2
a b # a c

Din acest exemplu se observ c maini mai complexe vor avea codificri considerabil mai lungi, dar n principiu, orice main Turing i orice parte finit a benzii poate fi codificat cu aceast schem. Posibilitatea codificrii complete i neambigue a unei maini Turing arbitrare i a input-ului ei ne permite s construim aa numita main Turing universal U 0 . n esen, o astfel de main simuleaz orice alt main Turing n felul urmtor: Fie T o main Turing oarecare i fie coninutul iniial al benzii lui T. Fie D1 (T ) i D2 ( ) codificrile pentru T i descrise mai sus. Punem maina T n configuraia iniial
Q0 ,

i maina U 0 n configuraia Q0 , D1 (T )$ D2 ( ) . Cu alte cuvinte,

introducem descrierea lui T i coninutul iniial al benzii din T n maina U 0 . Universalitatea lui U 0 se bazeaz pe urmtoarea descriere a comportamentului ei: 1. Dac, pornind din configuraia iniial Q0 , , T se oprete avnd ca coninut al benzii irul , atunci U 0 , pornind din configuraia
Q0 , D1 (T )$ D2 ( ) , se va opri de asemenea, cu banda coninnd irul D2 ( ) . Formal,

Q0 , H ,

implic Q0 , D1 (T )$ D2 ( ) H , D2 ( )

Poziia exact a capurilor celor dou maini este neesenial. 2. Dac T nu se oprete cu input-ul indicat, nu se va opri nici U 0 . Construcia formal exact a mainii U 0 este greoaie, lung i oarecum dincolo de scopul acestei lucrri. Vom prezenta doar ideea principal; pentru detalii suplimentare cititorul este invitat s consulte [13]. Maina Turing universal U 0 va avea trei benzi T1, T2 i T3 cu capurile corespunztoare h1 , h2 i h3 . Banda T1 va conine descrierea codificat a mainii Turing T simulate i banda T2 va conine input-ul iniial al lui T. Banda T3 va conine starea curent i locaia curent a capului mainii T. Instruciunile mainii U 0 sunt urmtoarele: 1. Introduce codificarea D1 (T ) a mainii T pe banda T1, codificarea
D2 ( ) a inputului iniial pentru T pe banda T2 i starea iniial a

lui T mpreun cu poziia capului lui T pe banda T3. Poziioneaz toate capurile h1 , h2 corespunztoare. 2. Deplaseaz capul h3 spre dreapta pn ce s-a gsite descrierea strii curente i locaia curent a capului din T. 3. Utiliznd informaiile obinute la pasul 2, deplaseaz capul h1 pn ce s-a gsit descrierea corespunztoarea a funcie de tranziie . 4. Utiliznd informaiile din paii 1 i 2, ajusteaz coninutul benzilor T1 i T2 pentru a reflecta noua stare i noua band a lui T. 5. Dac noua stare a lui T este starea de oprire atunci golete dac nu deplaseaz toate capurile de citire pe cea mai din stnga celul i continu cu pasul 2. Faptul c U 0 are trei stri nu ridic probleme; conform teoremei 5.1, ea poate fi acum nlocuit de o main Turing standard cu o singur band. Aceast idee se formalizeaz n felul urmtor. Definiia 5.4. O main Turing U 0 = {Q, , Q0 , 0 } se numete universal dac are urmtoarea proprietate. Fie T = {Q, , Q0 , 0 } o main Turing oarecare i fie un ir din * . Fie D1 (T ) codificare lui T i D2 ( ) codificarea lui . Maina T va executa secvena de micri
Q0 , H ,
*

i h3 la captul stng al benzilor

dac i numai dac maina U 0 execut secvena de

micri
*

Q0 , D1 (T )$ D2 ( ) H , D 2 ( )

Se presupune c mainile de mai sus ncep i nceteaz activitatea cu capul amplasat pe cea mai din stnga celul. Teorema 5.2. Exist o main Turing universal. Remarcm faptul c exist o main Turing universal cu numai dou stri. Construcia ei a fost dat de C. E. Shannon n [18]. Posibilitate codificrii oricrei maini Turing are o alt consecin important: Este posibil listarea mainilor ntr-o singur secven

T1 , T2 , T3 , T4 , K

(0.5)

Orice main Turing posibil se va afla pe undeva n aceast list. Enumerare de maini Turing se realizeaz astfel: Am vzut c o main Turing poate fi unic descris de o secven finit de simboluri, fiecare dintre ele fiind unul din cele 11 caractere: B, A, E, P, X, Y, R, L, S, 0 i 1. Pentru un ntreg oarecare n, exist doar un numr finit de iruri de lungime n de fapt sunt exact 11n . Aadar, putem lista toate mainile Turing ntr-o secven astfel: Mai nti listm toate mainile Turing a cror descriere necesit doar un singur simbol (dac exist), atunci toate mainile descrise de 2 simboluri (dac exist), etc. Cea mai mic main Turing este

care are doar un singur simbol de band #. (Acesta este minimul ce poate avea o main Turing.) Descrierea este B10 A1PE , necesitnd un ir de lungime 7 i st la nceputul secvenei (5.5). Aadar avem urmtoarele: Teorema 5.3. Numrul de maini Turing distincte este numerabil. n exact acelai mod, toate input-urile posibile a tuturor mainilor Turing pot fi ordonate ntr-o singur secven. Aceasta rezult din faptul c orice poriune finit a unei benzii poate fi descris utiliznd doar un ir finit de simboluri A, W, Z, F, 0 i 1. Restul raionamentului rmne la fel. 5.6. PROBLEME DE DECIDABILITATE n acest paragraf vom da o formulare precis (i soluia) problemei discutate pe scurt n paragraful 5.3. 1. Are fiecare problem un algoritm care o rezolv? 2. Este fiecare funcie calculabil? Aceste dou ntrebri sunt de fapt identice, ntruct soluia problemei poate fi vzut ca funcie a descrierii problemei. A demonstra numai c exist funcii necalculabile este uor. Din teorema 5.3. avem c exist doar numerabil de multe maini Turing. Exist nenumerabile funcii
f: {0,1} , vezi Appendix 1. Aadar unele dintre aceste funcii (de fapt,

majoritatea lor) nu vor fi calculabile Turing. Acest argument, dei perfect corect, este oarecum nesatisfctor, ntruct nu d un exemplu specific de problem nerezolvabil sau funcie necalculabil. Vom da n acest paragraf dou exemple concrete de acest tip.

Ne ntoarcem la ntrebarea existenei unui algoritm pentru rezolvarea unei probleme date. Reamintim c a spune c exist un algoritm de rezolvare a unei probleme este identic cu a spune c exist o main Turing care va rezolva aceea problem (teza lui Church-Turing). Vom arta c nu exist un algoritm care, dac este dat descrierea unei maini Turing T i descrierea inputului pentru T, va determina dac T se oprete sau nu. Aadar, spunem c problema execuiei mainii Turing este nedecidabil. n termenii mainii Turing aceasta poate fi formulat n felul urmtor: Teorema 5.4. Problema execuiei pentru maini Turing este nedecidabil. Mai precis, nu exist o main Turing A = {Q, , Q0 , 0 } cu
urmtoarele proprieti: Fie T = {Q, , Q0 , 0 } o main Turing oarecare i fie un ir oarecare din * , i D1 (T ) , D2 ( ) codificarea lui T respectiv

, descris n paragraful 5.4. Considerm comportamentul lui T la


input-ul (adic, comportamentul lui T pornit n configuraia Q0 , , cu

capul punctnd spre cea mai din stnga celul). Mai considerm comportamentul lui A la input-ul $ D1 (T ) D2 ( ) , adic, comportamentul lui A pornit n configuraia iniial Q0 , $ D1 (T ) D2 ( ) . Dac T se oprete, eventual, atunci A se va opri n configuraia H , 1 , dac T nu se oprete atunci A se va opri n configuraia H , 0 . Remarcm c T nu trebuie s se opreasc poate intra ntr-un ciclu infinit sau se poate bloca; maina A trebuie s se opreasc ntotdeauna, cu condiia c a primit un input corect format. Pentru a demonstra teorema avem nevoie de unele rezultate preliminare. Fie T1 , T2 , T3 , K enumerarea tuturor mainilor Turing i fie 1 , 2 , 3 , K secvena tuturor input-urilor

admise pe aceast main. T-urile i -urile sunt codificate ca n paragraful 5.5. Fie L0 mulimea acelor i pentru care maina Ti nu se oprete n configuraia H , 1 . Aadar, o secven de input i este n limbajul L0 dac i numai dac maina Ti , pornit n configuraia
( Q0i ) , i , nu se oprete deloc sau se oprete ntr-o alt configuraie dect

H, 1 .

Lema 5.1. Nu exist nici o main Turing T0 care va decide pentru fiecare i dac i aparine, sau nu, limbajului L0 . Mai precis, nu exist nici o main Turing T0 = {Q0 , 0 , Q0 , 0 } cu proprietatea ca pentru fiecare
i = 1, 2,3,K

1. Q0 , $ i H , 1 dac i este n L0 2. Q0 , $ i H , 0 dac i nu este n L0 Demonstraie. Presupunem c o asemenea main T0 exist; atunci va trebui s fie una dintre T1 , T2 , K din (5.5.). Fie atunci T0 = Ti i s
0

vedem ce se ntmpl dac pornim T0 = Ti cu input-ul i . Din ipotez,


0 0

T0 (= Ti0 ) ea se va opri sau n configuraia H , 1 sau n H , 0 . n primul

caz, i este n limbajul L0 , ceea ce nseamn c Ti nu se oprete n


0 0

configuraia H , 1 ; evident, este imposibil. Dac T0 = Ti se oprete n


0

configuraia H , 0 H , 1 , nseamn c i este n limbajul L0 , aadar


0

T0 i deci Ti0 ar trebui s se opreasc n configuraia H , 1 , dar am

presupus c aceasta nu are loc. Ca urmare, T0 nu poate decide cu exactitate dac i aparine limbajului L0 . Q.E.D.
0

Putem demonstra acum teorema 5.4. Ideea demonstraiei este de a arta c dac o main Turing A, descris n teorema 5.4., exist, atunci se poate construi o main T0 care recunoate limbajul L0 ca n lema 5.1. Ceea ce este ns imposibil. Presupunnd c A exist, construcia lui T0 este urmtoarea: Fiind dat un ir i , maina T0 trimite codificarea D2 ( i ) i D1 (Ti ) la maina A. Dac A se oprete cu 0 pe banda (n configuraia
H , 0 ), atunci T0 scrie 1 pe band i se oprete n configuraia H, 1 .

(S-ar putea s aib de fcut unele operaii de golire.) Dac A se oprete cu 1 pe band (n configuraia H , 1 ), atunci T0 trimite descrierile D1 (Ti ) i
D2 ( i ) la maina universal U 0 din teorema 5.2. Prin definiie, maina U 0

se va comporta la acest input n acelai mod ca maina Ti cu input-ul i , adic se va opri. (ntruct A a anticipat, probabil corect, c Ti se va opri.) Dac U se oprete cu 1 pe banda sa, T0 va scrie 0 pe band i se oprete n configuraia H , 0 . Dac U se oprete cu banda coninnd alt ceva dect 1, atunci T0 va scrie 1 pe banda sa i se oprete n configuraia H , 1 . Este acum simplu de artat c maina T0 va anticipa corect dac un ir i dat este n limbajul L0 sau nu. Presupunem c i este n limbajul L0 . Aceasta nseamn c Ti , la input-ul i , nu se va opri n configuraia
H , 1 . Exist dou posibiliti: i) Ti nu se va opri deloc, sau ii) Ti se va

opri, dar ntr-o alt configuraie dect H , 1 . n cazul i), maina A se va opri n configuraia
H, 0

deci, prin construcie, T0 se va opri n

configuraia H , 1 , anticipnd corect c i L0 . n cazul ii), A se va opri n configuraia H , 1 , iar irul i , mpreun cu descrierea lui Ti vor fi introduse n maina universal U 0 , care, la rndul ei, se oprete ntr-o configuraie diferite de H , 1 . Din nou, prin construcie, T0 se va opri n

configuraia H , 1 , anticipnd corect c i L0 . De asemenea se vede uor c T0 se va comporta corect dac i L0 , lsm demonstraia ca exerciiu. Q.E.D. Ne ndreptm acum atenia spre funcii necalculabile. Reamintim c o funcie f (n) = m (n, m numere pozitive) se numete calculabil dac exist o main Turing T f care, la input-ul $111K1 (de n ori 1) va produce ca output $111K1 (de f (n) ori 1). O funcie f care nu este calculabil se numete necalculabil. Teorema 5.5. Exist o funcie necalculabil. Demonstraie. Am vzut n paragraful 5.5. c exist o mulime finit 1 astfel nct orice main Turing poate fi descris de un ir finit de elemente (caractere) din 1 . De fapt, aceast mulime poate fi format din 11 caractere distincte. n mod similar, orice input pentru o main Turing poate fi descris de un ir finit de simboluri dintr-o mulime 2 , unde 2 este din nou finit. (n paragraful 5.5. mulime 2 are ase elemente.) Fie T o main Turing i fie un input pentru T (adic, coninutul iniial al benzii lui T). Fie D1 (T ) i D2 ( ) descrierile lui T respectiv . Fie p (T ) lungimea irului D1 (T ) ie fie q( ) lungimea irului . Pentru un ntreg pozitiv n, exist doar un numr finit de perechi
(T , ) , unde T este o main Turing iar este input-ul ei iniial, astfel ca p(T ) + q ( ) n . Fie A n mulimea acestor perechi. Dac (T , ) este o

pereche din A n , atunci T, cu input-ul , se poate opri sau nu. Fie Bn mulimea acelor perechi din A n care au proprietatea ca T s se opreasc la input-ul . Din nou, Bn se compune dintr-un numr finit de perechi.

Dac (T , ) este o pereche din Bn , fie (T , ) desemnnd numrul de micri pe care T le face naintea de a se opri n configuraia de oprire. Definim acum o funcia b(n)

b(n) = Max{ (T , ) | (T , ) Bn }

n general, b(n) este cel mai mare numr de micri pe care o main Turing l poate executa asupra unui input , dac descrierea lui T i luate mpreun nu depesc n simboluri. Funcia b(n) astfel definit se numete funcie busy beaver i nu este necalculabil. Presupunem c exist o main Turing B care calculeaz b(n) . Vom arta c aceast implic c se poate construi o main Turing A care rezolv problema. Aceasta, ns este imposibil, dup cum arat teorema 5.4. Pentru a construi A procedm astfel: Fiind dat o main Turing i T cu inputul , maina A codific T i ca D1 (T ) i D2 ( ) i calculeaz n = p(T ) + q( ) . Dup aceasta, A paseaz acest numr n mainii B i obine b(n) . Avnd acestea fcute, paseaz descrierile D1 (T ) i D2 ( ) , ale lui T i , la maina universal U 0 i ncepe s numere micrile lui U 0 . Dac U 0 se oprete nainte de b(n) micri, A scrie 1 pe banda ei i se oprete n configuraia H , 1 . Dac U 0 nu se oprete la a b(n) -a micarea, A scrie 0 pe band i se oprete n configuraia H , 0 . Este limpede c A se va comporta corect: Dac U 0 nu se oprete la a b(n) -a micarea, nu o va face nici T, ntruct U 0 simuleaz pe T micare cu micare i p(T ) + q( ) n . Q.E.D.

Merit fcute unele comentarii asupra ultimelor dou teoreme. Dac teorema 5.4. afirm c problema de oprire a mainilor Turing este nedecidabil, nu nseamn c nu putem decide, n unele cazuri specifice, dac o main Turing dat se va opri, sau nu, la un input fixat. Considerm, de pild, maina Turing descris n figura 5.12. Se observ c dac maina T este pornit n configuraia Q0 , ab nu se va opri niciodat; dac ns este pornit n configuraia Q0 , baab se va opri. Ceea ce afirm teorema este c nu exist o metod universal care va decide aceast ntrebare n toate cazurile posibile.

Figura 5.12. O main Turing care n unele cazuri se oprete iar n altele nu. Multe dintre ntrebrile legate de limbaje formale sunt

nedecidabile. Vom enumera aici cteva dintre ele. A le demonstra ne ar duce ns prea departe. Cititorul interesat este invitat s consule unele tratate excelente referitoare la acest subiect, de exemplu, [13] sau [15]. Teorema 5.6. Este nedecidabil dac o gramatic independent de context arbitrar este ambigu.

Din nou, aceasta nu nseamn c n unele cazuri speciale nu putem decide aceast problem. O gramatic
S a|b|

este evident

neambigu. Ceea ce afirm teorema este c nu exist o main Turing care, la un input dat ce descrie o gramatic, decide dac aceast gramatic este ambigu sau nu. Evident c este posibil s descriem o gramatic printr-o secven finit de simboluri, deci punerea problema existenei unei astfel de maini Turing are sens. Teorema 5.7. Este nedecidabil dac dou gramatici independente de context au o propoziie comun. Aadar, nu exist o main Turing care, pentru dou gramatici independente de context G1 i G2 date, va decide dac L(G1 ) L(G2 ) = . Vom arta n capitolul 6, c exist o procedur, adic, o main Turing, care, primind o gramatic independent de context G = {, N , S , P} i un ir specific din * , va decide dac L(G ) sau nu. Teorema 5.8. Este nedecidabil dac o gramatic independent de context arbitrar este ambigu n mod inerent. Chiar mai surprinztor avem: Teorema 5.9. Este nedecidabil dac o gramatic independent de context arbitrar are o gramatic regular.

PROBLEME 1. Construii 1111. 2. Construii o main Turing care va calcula funcia f (n) = 3n . Artai micrile mainii cu input-ul 11. 3. Fie urmtoarea main Turing dat sub form tabelar Simbol de intrare a S t a r e a. Artai micrile acestei maini ncepnd din configuraiile
Q0 , # abbaacaa , Q0 , # bbaaca i Q0 , # abbcaab . Q2 (Q2 , a, L) (Q2 , b, L) (Q2 , c, L) ( H , #, S ) Q0 Q1 (Q1 , a, S ) (Q1 , b, R)

main

Turing

care

recunoate

limbajul

L = {12 n | n = 0,1, 2,K} Artai micrile mainii cu input-urle 111 i

b
(Q1 , b, S ) (Q1 , a, R)

c
( H , c, S ) (Q2 , c, S )

#
(Q0 , #, R) (Q2 , #, S )

b. Dai o diagram de stare a mainii. c. Descriei neformal ce face maina. 4. Fie urmtoarea main Turing

a. Artai micrile mainii la input-ul = ababbba ncepnd cu configuraia Q0 , ababbba . b. Dai o descriere tabelar a mainii. c. Descriei neformal ce face maina. 5. Considerai o main Turing care compar dou numere m i n. Maina ar trebui s treac din configuraia

Q0 , #11K1#11K1 n H , # x , { {
n m

unde x = f , s sau e n funcie dac n > m , n < m sau n = m . 6. Construii o main Turing cu o band infinit bidirecional car se va opri dac i numai dac input-ul iniial conine simbolul a. Acest simbol poate aprea oriunde pe band, nu neaprat n dreapta poziiei iniiale a capului. 7. Construii o main Turing care recunoate limbajul
L = { R | {a, b}*} . Aici, R desemneaz inversul irului .

8. Dai codificri ale mainilor Turing din problemele 1 i 2, conform descrierii din paragraful 5.5. De asemenea dai codificarea

coninutului iniial al benzii din configuraia iniial menionat n aceste probleme. 9. Demonstrai c nu exist un algoritm care decide dac o main Turing cu input iniial dat se va ntoarce cndva n starea iniial
Q0 .

10. Demonstrai c nu exist un algoritm care decide dac o main Turing cu input iniial dat va scrie cndva simbolul a pe band.

CAPITOLUL 6 ANALIZA TOP-DOWN 6.1. PRELIMINARII Am vzut n capitolul 1 c una dintre atribuiile principalele ale unui compilator este analiza. Fiind dat o gramatic G = {, N , S , P} i un ir = x1 x2 x3 K xn de simboluri din , obligaia unui analizator este de a recunoate o derivare a lui din simbolul de start S, sau s constate c nu poate fi derivat, adic, nu este n L(G ) . Reconstruirea unui arbore de derivare pentru este echivalent cu reconstruirea nelesului lui . Pentru un ir dat, pot exista mai multe posibiliti de al deriva din simbolul de start S; n acest capitol ne vom limita la gsirea derivrii cea mai din stnga (la fiecare etap a derivrii nlocuim neterminalul cel mai din stnga cu partea dreapt corespunztoare din producie). Dup cum am vzut n capitolul 1, aceasta nu ne garanteaz unicitatea derivrii. Aadar cutm un algoritm care, la un input dat = x1 x2 K xn , va produce o secven de producii utilizate n derivarea la stnga a lui . Acest algoritm trebuie s fie complet determinist i fr ambiguiti. Metoda descris aici se refer la reconstruirea arborelui de derivare de sus n jos. tim c derivarea lui ncepe cu simbolul S; echivalent, arborele de derivare pentru va avea ca S ca rdcin. Prima ntrebare care ne-o punem n metoda de analiz top-down este: Care a fost prima producie utilizat n derivarea lui , sau echivalent, care sunt fii rdcinii S din arborele de derivare a lui ? Rspunznd la aceast ntrebare putem izola terminalul cel mai din stnga X iar apoi s ntrebm fin nou: Care este a doua producie utilizat n derivare, sau echivalent, care sunt fii lui X din arborele de derivare? Continum n aceast manier pn ce ntregul

arbore este reconstruit. Acest tipuri de analizator top-down este numit i analizator (parser) LL. nainte de a trece la o discuie amnunit s considerm un exemplu. Exemplu 6.1. Fie G gramatica dat prin

1. S aAS 2. S b 3. A bSA 4. A a

i fie = abbab . tim c prima operaie utilizat n derivarea lui este 1 sau 2. Dar cum 2 nu poate fi, ntruct, dup utilizarea ei forma propoziional ar deveni b, ceea ce nsemn c nu mai sunt posibile alte derivri (nu mai rmn neterminale). Aadar prima producie utilizat este 1 iar derivarea lui trebuie s nceap cu S aAS . Echivalent, arborele de derivare pentru va arta ca n figura 6.1.(b). Trecem acum la a doua producie utilizat. ntruct cutm derivarea cea mai din stnga, neterminalul de nlocuit este A. Din nou putem alege ntre produciile 3 ( A bSA ) sau 4 ( A a ). Aici producia 4 cade, ntruct dac s-ar aplica irul final ar fi cu aa. Aadar, se aplic producia 3 deci derivarea cea mai din stnga a lui

ncepe cu secvena

S aAS abSAS . Observm c primele dou simboluri (ab) sunt fixate

substituiile urmtoare nu au efect asupra acestei pri a formei propoziionale. n acest moment putem afirma c foram propoziional abSAS i irul destinaie = abbab sunt mprite n dou pri astfel:

de potrivit

deja potrivit

Problema care rmne este derivarea prii nc nepotrivite a lui (adic, bab) din segmentul rmas n forma propoziional (adic, SAS). Din nou, ntruct cel mai din stnga S trebuie substituit, exist posibilitatea pentru dou producii: 1 ( S aAS ) i 2 ( S b ). Deoarece primul simbol din poriunea rmas din este b, se aplic producia S b . Continund n acest mod, obinem urmtoarea derivare a lui :
S aAS abSAS abbAS abbaS abbab
1 3 2 4 2

La fiecare pas am subliniat neterminalul utilizat. Dezvoltarea corespunztoare a arborelui de derivare este prezentat n figura 6.1.

Figura 6.1. Arbore de derivare pentru abbab.

6.3. DESCRIEREA UNUI ANALIZATOR TOP-DOWN Prezentm n continuare maina unui analizator top-down. Cum se construiete, dintr-o gramatic dat, un astfel de analizator va fi discutat mai trziu. Acum suntem interesai doar de modul n care funcioneaz acest dispozitiv. Pentru simplificare facem o remarc suplimentar asupra irului de analizat: Fiecare astfel de ir se termin cu simbolul $, care nu mai apare n alt parte prin . Efectul acestei ipoteze este c dac parcurgem irul de la dreapta la stnga, putem detectat sfritul input-ului. Evident c aceast ipotez suplimentar nu impune restricii serioase asupra tipurilor de iruri care vor fi analizate. Analizatorul top-down pentru o gramatic G = {, N , S , P} va fi un automat push-down nedeterminist cu un input. Schematic, el poate fi reprezentat ca n figura 6.2. Analizatorul din aceast schem are doar o singur stare Q. Alfabetul automatului este alfabetul al gramatici mpreun cu simbolul $ (despre care se presupun c nu este n ). Alfabetul de stiv este format din toate neterminalele i terminalele gramaticii G, mpreun cu simbolul # din baza stivei (despre care se presupun c nu este n i nici n N). Ca de obicei, pointer-ul de stiv se poate deplasa n ambele sensuri, n timp ce pointer-ii de intrare i ieire se pot deplasa numai la dreapta. Configuraia analizatorului din figura 6.2. va fin notat

ai ai +1 K an $, j j 1 K 2 1 #, n1n2 K nk

Notaia este puin difer de cea folosit n capitolul 4, dar nu ar trebui s duc la confuzii. Nu includem starea curent a analizatorului deoarece este ntotdeauna aceeai. Indicm, ns, coninutul benzii de ieire.

Banda de intrare

Program

Stiva

Banda de ieire

Figura 6.2. Analizator top-down ca automat push-down. Configuraia iniial a analizatorului este

ai ai +1 K an $, S #,

unde a1a2 K an este irul de analizat i S este simbolul de start din gramatica G. Astfel, banda de intrare conine irul a1a2 K an $ cu pointer-ul de intrare punctnd spre cel mai din stnga simbol ai ; stiva conine dou simboluri: # la baz i S n vrf. n orice moment dat analizatorul poate efectua una i numai una din urmtoarele operaii: 1. Dac vrful stivei conine un neterminal X, analizatorul nlocuiete X cu irul 1 2 L t unde X 1 2 K t este o producie a gramaticii

G. ( 1 devine noul vrf al stivei.) n acelai timp, analizatorul scrie pe banda de ieire numrul acestei producii. n general vor exista mai multe producii cu X n partea stng; analizatorul trebuie s aleag cea corect. Acest tip de micare se numete aplicarea produciei X 1 2 K t i va fi denotat prin APPLY ( X 1 2 K t ) . Pointer-ul de input nu se schimb, deci acelai simbol este recitit. 2. Dac vrful stivei conine un terminal x, acesta se compar cu simbolul de intrare curent a. Dac x = a , atunci x este eliminat din vrful stivei iar pointer-ul de intrare se deplaseaz o celul la dreapta. Acest tip de micare poart numele de POP. Spunem c terminalul x a fost scos din stiv i de pe banda de intrare prin operaia POP. Dac x a analizatorul scrie REJECT pe banda de ieire i se oprete. Deci s-a determinat c nu aparine limbajului
L(G ) .

3. Dac stiva conine doar simbolul # i pointer-ul de intrare puncteaz spre $, analizatorul scrie ACCEPT pe banda de ieire i se oprete. Cnd aceasta are loc banda de ieire va conine analiza la stnga a input-ului original = a1a2 K an . Decizia legat de ceea ce este de fcut n fiecare situaie depinde numai de simbolul din vrful stivei i simbolul de intrare curent a. Aadar, operaia analizatorului este complet descris de funcia

M [ , x] = Ce este de fcut

unde este un simbol de stiv iar x este un simbol de band. De fapt, acest analizator reconstruiete derivarea unui ir
= a1a2 K an astfel: Presupunem c derivarea la stnga a lui este

S = 1 2 L j j +1 L m =

unde fiecare denot o form propoziional (adic, un ir de terminale i neterminale). Mai presupunem c tranziia i i +1 este rezultatul aplicrii unei producii X 1 2 K n . Aceasta nseamn c j este de forma j = X , unde este un ir de terminale, X este neterminalul curent iar este un ir de terminale sau neterminale. ntruct orice derivare adiional nu-l va schimba pe , acest ir trebuie s fie identic cu partea de nceput din a
= a1a2 K an .

Cu

alte

cuvinte, s

j +1 = a1a2 K ai1 2 K t .

Pentru

completa

derivarea

trebuie

transformm partea de sfrit a lui j , adic irul X n ai +1ai + 2 K an . Aadar, analizatorul pstreaz irul X pe stiv i continu nlocuirea vrfului stivei (adic, substitue cel mai din stnga neterminal) pn ce apare ai +1 n vrf. n acest moment ai +1 este eliminat din stiv (cu operaia POP) iar ceea ce rmne va trebui transformat astfel nct s se potriveasc cu ai + 2 ai +3 K an . Procedeul se repet pn ce s-au verificat toate simbolurile de intrare. Vom prezenta aceasta ntr-un exemplu. Exemplu 6.2. Considerm gramatica
1. S aAS 3. A bSA 2. S b 4. A a

Atunci funcia de analiz este dat astfel:


M [ x, x] = POP pentru toate terminalele x ( = a sau b )

M [ x, y ] = REJECT dac x, y sunt terminale i x y M [#, $] = ACCEPT M [#, ] = REJECT pentru # M [ A, a ] = APPLY ( A a ) M [ A, b] = APPLY ( A bSA) M [#, x] = REJECT pentru x $ M [ S , a ] = APPLY ( S aAS ) M [ S , b] = APPLY ( S b)

Ea poate fi exprimat n mod autoexplicativ cu ajutorul tabelului din figura 6.3. Numrul n parantez identific producia. Simbol de intrare x a S S S aAS (1) t A i a v b a #
A a(4)

b
S b(2) A bSA(3)

$ REJECT REJECT REJECT REJECT ACCEPT

POP REJECT REJECT

REJECT POP REJECT

Figura 6.3. Un tabel de analiz. Considerm acum micrile analizatorului cu input-ul = abbab . Avem
abbab$, S #, abbab$, aAS #, 1 bbab$, AS #, 1 bbab$, bSAS #, 13 bab$, SAS #, 13 bab$, bAS #, 132 ab$, AS #, 132 ab$, aS #, 1324 b$, S #, 1324 b$, b #, 13242 $, #, 13242 ACCEPT

Observm c la fiecare pas stiva conine o form propoziional care trebuie transformat n partea nc nepotrivit a input-ului. Dac

analizatorul l accept pe , atunci el se va opri cu output-ul coninnd secvena 1, 3, 2, 4, 2 care este exact derivarea la stnga a lui . 6.3. CONSTRUCIA UNUI TABLOU DE ANALIZ Cunoscnd acum cum funcioneaz un analizator top-down, ne rentoarcem la problema construirii lui pornind de la o gramatic dat
G = {, N , S , P} . n particular, dorim s construim funcia M [ , x ]

descris n paragraful 6.2. Aceast funcie trebuie definit pentru toate simbolurile de stiv N {#} i toi x {$} . Dac simbolul curent de input este x iar vrful stivei conine , atunci M trebuie s defineasc n mod unic aciunile analizatorului. Vom vedea c o asemenea funcie nu exist pentru orice gramatic independent de context G. S definim ns o clas de gramatici pentru care exist o asemenea funcie M, deci pentru care exist un analizator top-down determinist. Definiia 6.1. O gramatic G = {, N , S , P} se numete simpl dac satisface urmtoarele condiii: 1. Fiecare producie din G este de forma A x , unde x este un terminal i un ir (eventual vid) de terminale i/sau neterminale. 2. Dac A x11 i A x2 2 sunt dou producii distincte din G atunci x1 x2 . Menionm c condiia 1 implic c G nu are producii vide ( A ). Pentru gramatici simple se poate construi uor un analizator top-down.

Teorema 6.1. Dac G = {, N , S , P} este o gramatic simpl, atunci G are un analizator top-down determinist definit de funcia M [ , x] astfel: 1. M [ x, x] = POP pentru toi x 2. M [#, $] = ACCEPT 3. Pentru fiecare producie A x M [ A, x] = APPLY ( A x ) 4. M [ , x] = REJECT n rest Demonstraie. nainte de toate, observm c valoarea M [ A, x] definit de condiia 3 este unic: Din ipotez, pentru fiecare neterminal A i fiecare terminal x exist cel mult o producie de forma A x . Ceea ce trebuie s artm este c analizatorul definit de funcia M de mai sus se comport corect. Aceasta nseamn c dac = b1b2 K bk L(G ) , atunci analizatorul va reconstrui corect arborele de derivare pentru . ntruct gramatica G este simpl, prima producie utilizat n derivarea lui este de forma S b11 , i mai mult, aceasta identific producia n mod unic, fie n1 numrul ei. Analizatorul definit de M, cu input-ul , pornete n configuraia b1b2 K bk $, S #, . Din definiia analizatorului i din faptul c G este simpl, avem c valoarea lui M [ S , b1 ] este APPLY ( S b11 ) . Aadar analizatorul reconstruiete corect prima producie. Presupunem c analizatorul reconstruiete corect primele m producii folosite n derivarea lui , i c dup aplicarea acestor m producii ajungem la forma propoziional

b1b2 K b j AX 1 X 2 K X i

unde A este un neterminal iar X-urile sunt terminale sau neterminale. Din acelai raionament ca n cazul primei producii, avem c urmtoarea producie utilizat trebuie s fie de forma A b j +1 i mai mult, aceasta identific n mod unic producia cu numrul n j +1 . Dup determinarea corect a primelor m producii, analizatorul ajunge la configuraia

b j +1b j + 2 K bk $, AX 1 X 2 K X i #, n1n2 K nm

Prin

construcie

din

proprietatea aadar

de

gramatic determin

simpl, corect

M [ A, b j +1 ] = APPLY ( A b j +1 ) ,

analizatorul

urmtoarea producie. Q.E.D. Exemplu 6.3. Considerm gramatica dat prin

1. S 0 A 2. A 0 AB 3. A 1 4. B 1

Se observ c G este simpl. Tabloul de analiz descris de teorema 6.1. este dat n figura 6.4. Csuele goale indic valoarea REJECT; aceast convenie o vom folosi i n continuare. Condiiile care trebuie impuse unei gramatici pentru a fi simpl sunt foarte restrictive i numai puine limbaje au gramatici simple. Prezentm acum un algoritm de construcie a unui analizator determinist pentru o clas considerabil mai mare de gramatici (dar nu toate). Pentru aceasta trebuie s introducem dou funcii FIRST ( ) , definit pentru orice

form propoziional

FOLLOW ( A) ,

definit pentru toate

neterminalele A. Valorile acestor dou funcii vor fi mulimi de simboluri. Simbol de intrare x 0 S t i v a S A B 0 1 # POP POP ACCEPT
S 0A A 0 AB A 1 B 1

Figura 6.4. Tablou de analiz pentru o gramatic simpl. Fie G = {, N , S , P} o gramatic. Pentru o form propoziional ,
FIRST ( ) va conine toate terminalele x astfel nct s existe o derivare de

forma x . Cu alte cuvinte, dac se poate deriva din o form propoziional care ncepe cu x, atunci x va fi n FIRST ( ) . Dac irul vid
este derivat din , atunci simbolul va fi introdus n FIRST ( ) .

Descrierea lui FOLLOW ( A) este urmtoarea. Pentru un neterminal A dat, mulimea FOLLOW ( A) se compune din toate terminalele x care pot aprea dup A n toate formele propoziionale derivabile din S. Aadar, x este n FOLLOW ( A) dac i numai dac n gramatica G exist o derivare legal de forma S Ax , unde i sunt iruri. Mai mult, dac A poate aprea la sfritul unei forme propoziionale derivabile din S, adic, dac exist o derivare legal de forma S A , includem simbolul $ n
* *

FOLLOW ( A) . Formal avem urmtoarele ( B ( E ) denot mulimea factor a

lui E mulimea tuturor prilor lui E): Definiia 6.2. Fie G = {, N , S , P} o gramatic independent de context astfel ca $ N . Pentru fiecare form propoziional
( N ) + ,
FIRST : ( N ) + B ( {}) se definete ca

FIRST ( ) = {x | Exist o derivare legal de forma x } { | Derivarea este legal}


*

Pentru fiecare A N , FOLLOW : N B ( {$}) se definete ca

FOLLOW ( A) = {x | Exist o derivare legal de forma S Ax } {$ | Exist o derivare legal de forma S A}


*

Pentru o gramatic independent de context G dat exist un algoritm determinist care calculeaz funciile FIRST i FOLLOW. Vom prezenta acest algoritm n paragraful 6.4.; acum vom da doar un exemplu. Exemplu 6.4. Fie G gramatica dat de

S BA A aBA | B DC C bDC | D cSc | d

Putem calcula ad hoc FIRST ( ) pentru toi care apar n partea dreapt a produciilor de mai sus i FOLLOW ( X ) pentru toate neterminalele X. Avem

FIRST ( BA) = {c, d }

(0.1)

Firete,

BA DCA cScCA deci c FIRST ( BA) BA DCA dCA deci d FIRST ( BA)

Observm c pornind din forma propoziional BA este imposibil derivarea un ir care ncepe cu a sau b. De asemenea este imposibil derivarea lui din BA, deci (6.1) este corect. Mai departe

FIRST (aBA) = {a}

(0.2)

Aceasta rezult din faptul c dac ncepe cu un terminal x, atunci


FIRST ( ) = {x} : Orice am face cu irul aBA, simbolul a va rmne n fa.

Printr-un raionament similar obinem

FIRST ( ) = {} FIRST (bDC ) = {b}

FIRST ( DC ) = {c, d } FIRST (cSc) = {c}

FIRST (d ) = {d }

(0.3)

Trecem la funcia FOLLOW. Avem

FOLLOW ( S ) = {$, c}

(0.4)

ntr-adevr, S poate sta la sfritul unei forme propoziionale derivat din S. Aadar $ FOLLOW ( S ) . Similar, derivarea

S BA DCA cScCA

arat c c poate succede pe S. Deci, c FOLLOW ( S ) . Se observ c nici un alt terminal este inclus n FOLLOW ( S ) . n continuare avem

FOLLOW ( A) = {$, c}

(0.5)

Aceasta

este

consecin

derivrii

S BA

S BA DCA cScCA cBAcCA . Este limpede c nici un alt terminal l

poate succede pe A ntr-o firm propoziional derivat din S. Folosind aceeai tehnic ad hoc stabilim c

FOLLOW ( B ) = {$, a, c} FOLLOW (C ) = {$, a, c} FOLLOW ( D ) = {$, a, b, c}

(0.6) (0.7) (0.8)

Motivul includerii lui $ n FOLLOW ( B) este derivarea S BA B ( A este o producie a gramaticii G). Utiliznd funciile FIRST i FOLLOW se poate construi un analizator top-down pentru orice gramatic independent de context G. Subliniem faptul c aceasta depinde n mare msur de abilitatea de a

calcula determinist funciile FIRST i FOLLOW. n paragraful urmtor vom arta cum se materializeaz acest lucru; pentru moment, ns, ajunge s tim c este posibil. Construcia analizatorului este atunci urmtoarea: Algoritm 6.1. Analizator top-down, numit i analizator LL. Input: O gramatic independent de context G = {, N , S , P} . Output: Tabloul de analiz M [ , x] a uni analizator top-down. Dac N {#} este un simbol de stiv i x {$} este un simbol de intrare atunci intrrile M [ , x] ale tabloului de analiz sunt definite de urmtoarele reguli: 1. M [ x, x] = POP pentru fiecare terminal x . 2. M [#, $] = ACCEPT . 3. Pentru fiecare producie X din G avem: (a) Pentru fiecare terminal y n FIRST ( ) punem

M [ X , y ] = APPLY ( X )

(b) Dac FIRST ( ) , punem

M [ X , y ] = APPLY ( X ) pentru fiecare y FOLLOW ( X )

4. M [ X , y ] = REJECT n rest. naintea de a detalia i a demonstra corectitudinea acestui algoritm, s artm cum lucreaz.

Exemplu 6.5. Fie G = {, N , S , P} gramatica din exemplul 6.4:


S BA A aBA | B DC C bDC | D cSc | d

Valorile pentru FIRST ( ) necesare algoritmului 6.1. au fost calculate n (6.1) (6.3):
FIRST ( BA) = {c, d } FIRST ( DC ) = {c, d } FIRST (cSc) = {c} FIRST (aBA) = {a} FIRST (bDC ) = {b} FIRST (d ) = {d } FIRST ( ) = {}

Valorile pentru FOLLOW sunt date de (6.1) (6.8):


FOLLOW ( S ) = FOLLOW ( A) = {$, c}
FOLLOW ( B ) = FOLLOW (C ) = {$, a, c} FOLLOW ( D ) = {$, a, b, c}

Tabloul de analiz este atunci cel din figura 6.5. Ca de obicei, csuele goale din tabel indic valoarea M [ , x] = REJECT . Explicm acum unele dintre intrri. M [a, a] = M [b, b] = M [c, c] = M [d , d ] = POP din pasul 1 al algoritmului iar M [#, $] = ACCEPT este pasul 2. Trecem la intrrile definite la pasul 3. Considerm avem producia din
S BA .

Deoarece 3(a)

FIRST ( BA) = {c, d } ,

pasul

M [ S , c] = M [ S , d ] = APPLY ( S BA) . ntruct FIRST ( BA) , pasul 3(b) nu

este aplicat la aceast producie. n mod similar, producia A aBA produce intrarea M [ A, a] = APPLY ( A aBA) ; producia B DC produce intrrile M [ B, c] = M [ B, d ] = APPLY ( B DC ) (fiindc FIRST ( DC ) = {c, d } );
C bDC definete M [C , b] ; D cSc i D d duc la definiiile M [ D, c]

i M [ D, d ] . n nici unul dintre aceste cazuri s-a aplicat punctul (b) din pasul 3. Considerm acum producia A . ntruct FIRST ( ) = {} , pasul 3(a) nu este aplicat (nu exist terminale n FIRST ( ) ), dar pasul 3(b) cerea ca M [ A, x] = APPLY ( A ) pentru fiecare simbol x din FOLLOW ( A) . Deoarece FOLLOW ( A) = {$, c} avem c M [ A, $] = M [ A, c] = APPLY ( A ) . Similar, producia
C

duce

la fiindc

M [C , $] = M [C , a ] = M [C , c] = APPLY (C ) , FOLLOW (C ) = {$, a, c} . Aceasta explic intrrile din figura 6.5.

Simbol de intrare x a a S t i v a b c d S A B C D #
C C bDC A aBA S BA A B DC C D cSc Dd B DC C

b POP

POP POP POP


S BA A

ACCEPT Figura 6.5. Tablou de analiz pentru exemplul 6.5.

Trecem acum la discuia algoritmului 6.1. Primul lucru de observat este c funcia M [ , x] se dovedete a fi multiplu definit, adic, nedeterminist. Mai exact, pentru un simbol de stiv i un input x, aplicarea pasului 3 poate produce dou valori distincte pentru M [ , x] . Considerm, de exemplu, gramatica

S aA | aB A a B b

Se observ c

FIRST (aA) = {a}

deci

M [ S , a ] = APPLY ( S aA) .

Dar

FIRST (aB) = {a} ; deci M [ S , a ] = APPLY ( S aB) . Dac aceasta are loc,

spunem c tabloul de analiz conine un conflict. (Strict vorbind, ar trebui s definim M [ , x] cu valori ntr-o mulime, conflictul fiind atunci definit ca manifestare a uni M [ , x] cu dou sau mai multe elemente. Vom renuna aici la aceast idee legat de mulimi.) Cnd apare unui conflict, considerm n continuare algoritmul 6.1. ca genernd un analizator top-down, cu excepia c analizatorul este nedeterminist. Valoarea
M [ , x ] descrie aciunea analizatorului (un automat push-down) dac

vrful stivei conine simbolul i input-ul curent este x. Dac M [ , x] conine mai mult dect o intrare, atunci analizatorul poate aciona n mai multe feluri. Un ir dat va fi acceptat de un astfel de analizator numai dac acesta poate trece din configuraia iniial
$, S #,

$, #, n1n2 K nk , ACCEPT . (Desigur, nu orice secven de alternative va

produce aceast tranziie.) Din punct de vedere al aplicaiilor, este preferabil s avem analizatoare deterministe, adic, pentru care M [ , x] este unic determinat, oricare a fi i x.

Definiia 6.3. Fie G = {, N , S , P} o gramatic independent de context i fie M [ , x] funcia de analiz definit de algoritmul 6.1. Dac
M [ , x ] are o singur valoare, atunci spunem c G este LL(1) . Dac M [ , x ] are mai multe valori spunem c tabloul de analiz pentru G

conine conflicte i G nu este LL(1) . Teorema 6.2. Dac G = {, N , S , P} este o gramatic LL(1) atunci G are un analizator top-down determinist, i anume cel definit de funcia
M [ , x ] din algoritmul 6.1.

Demonstraie. Trebuie s artm c dac L(G ) atunci analizatorul va reconstrui corect derivarea la stnga a lui iar dac
L(G ) analizatorul l va respinge pe . Fie = a1a2 a3 K an . La

introducerea

lui

analizator,

configuraia

iniial

este

a1a2 K an $, S #,

iar programul cerceteaz valoarea lui M [a1 , S ] . Dac

intrarea este REJECT, nseamn c a1 FIRST ( ) , oricare ar fi astfel ca


S s fie producie din G. Dar aceasta nseamn c pornind cu S, nu

este posibil derivarea unui ir care ncepe cu a1 , deci L(G ) . Dac, pe de alt parte, M [a1 , S ] conine o producie, ea poate fi doar una singur. (Din ipotez, tabloul de analiz nu are conflicte.) Aceast producie este de forma S i a intrat n tablou prin aplicarea pasului 3(a) sau 3(b). Dac a fost utilizat 3(a) atunci a1 FIRST ( ) i dac S este alt producie cu S n partea stng, atunci a1 nu este n FIRST ( ) . Aadar, analizatorul determin corect prima producie. Dac s-a folosit pasul 3(b), nseamn c FIRST ( ) i a1 FIRST ( ) pentru orice producie de forma S . O scurt reflectare ne arat c n acest caz irul trebuie

s fie irul vid , a1 este de fapt delimitatorul $ iar prima producie utilizat n transformarea lui S n trebuie s fie S . Ca urmare, dac se poate deriva din simbolul de strat S, analizatorul nostru determin corect prima producie care trebuie utilizat. n mod similar, presupunem c dup diverse micri analizatorul ajunge n configuraia ak ak +1 K an $, AX 1 X 2 K X p #, s . Aceast nseamn c analizatorul alege corect secvena de producii s care transform S n
a1a2 K ak 1 AX 1 X 2 K X p i trebuie s determine corect urmtoarea producie.

Din nou, analizatorul verific intrarea M [ A, ak ] din tabloul de analiz. Dac aceast intrare este REJECT, atunci, din forma propoziional
AX 1 X 2 K X p , nu se poate deriva un ir care ncepe cu ak . ntr-adevr, ak FIRST ( ) pentru orice din partea dreapt a unei producii de forma A . Dac neterminalul A poate fi transformat n atunci ak poate fi

primul simbol ntr-un ir derivabil din X 1 X 2 K X p . n acest caz,


ak FOLLOW ( A) , ceea ce, din pasul 3(b), ar duce la M [ak , A] REJECT .

Presupunem acum c M [ak , A] conine o singur producie i ea trebuie s fie de forma A . Dac producia a fost inclus ca un rezultat al pasului 3(a), atunci ak FIRST ( ) i producia trebuie aplicat pentru a deriva
ak ak +1 K an . Mai mult, nici o alt producie de forma A va satisface

aceast derivare, ntruct ak FIRST ( ) . Dac A este inclus din cauza pasului 3(b), aceasta nseamn c FIRST ( ) , ak FIRST ( ) , iar pentru a deriva ak ak +1 K ak din AX 1 X 2 K X p trebuie s transformm mai nti A n irul vid (ncepnd cu producia A ) iar apoi s derivm
ak ak +1 K ak din X 1 X 2 K X p . Aadar, analizatorul se comport corect i n

aceast situaie. Demonstraia complet poate fi fcut prin inducie dup lungimea irului i utiliznd ideile de mai sus. Q.E.D.

Presupunem acum c avem un limbaj pentru care dorim s construim un analizator. Putem scrie o gramatic G din L iar atunci s aplicm algoritmul 6.1. Dac aceasta rezult ntr-un analizator determinist am terminat. Dac nu, ne sunt deschise mai multe alternative. nainte de toate, ncercm s gsim alt gramatic G, echivalent cu G, astfel ca analizatorul generat de G s fie determinist. De fapt, suntem interesai de analiza unui limbaj i nu de o gramatic particular care-l genereaz. Vom discuta diferite transformri de gramatici care rezolv aceasta n capitolul 7. O alt posibilitate este utilizarea analizatorului, aa cum este, n felul urmtor. Dac apare un conflict, adic, dac tabloul de analiz nu specific n mod unic urmtoarea producie dar d una sau mai multe alternative, putem ncerca toate aceste alternative una cte una. Mai exact, presupunem c M [ A, a] conine dou producii A 1 i A 2 iar analizatorul ajunge n configuraia a K $, AK #, s . ncercm s aplicm producia A 1 i vedem ce se ntmpl. Dac restul analizei decurge bine i ajungem la ACCEPT, tim c irul este n limbaj i c am obinut derivarea lui la stnga. Dac, pe de alt parte, ajungem la REJECT, tim c alegerea A 1 a fost greit i ncercm s aplicm
A 2 . Acest tip de analiz se numete analiz back-tracking sau analiz

recursiv descendent. Evident c un asemenea analizator necesit mult timp i este complicat de implementat, n special dac tabloul de analiz conine multe conflicte. Dup ntlnirea unui conflict i efectuarea unei alegeri de producie, putem da de alt conflict etc. n plus trebuie inut cont de alegerile efectuate precum i de locaiile acestor alegeri din procesul de analiz. Pentru o descriere detaliat ai acestei tehnici de analiz vezi [2] sau [3]. Exist ns i alt posibilitate pentru tablourile de analiz cu conflicte. Presupunem c la fiecare pas al analizei facem o alegere

(asupra urmtoarei producii) nu numai n funcie de valoarea din vrful stivei i a simbolului de intrare curent, ci i n funcie de urmtorul simbol de intrare. Cu alte cuvinte, la fiecare pas al analizei inem cont, n acelai timp, de dou simboluri de intrare. n acest caz funcia de analiz M este o funcie de trei variabile: M = M [ , x, y ] unde este coninutul vrfului stivei, x este simbolul de intrare curent iar y este urmtorul simbol de intrare. Considerm de exemplu gramatica

S aA S aB Aa Bb

Se observ uor c M [ S , a ] conine dou producii: S aA i S aB . Dac considerm M o funcie de trei variabile,
M [ S , a, a ] = APPLY ( S aA) i M [ S , a, b] = APPLY ( S aB) , conflictul este

rezolvat. Gramaticile pentru care se poate construi un analizator top-down conform acestor indicaii (adic, un analizator care acioneaz innd cont, n acelai timp, de dou simboluri de intrare) se numesc gramatici
LL(2) . Evident, procedeul poate fi generalizat pentru k simboluri i

conduce astfel la conceptul de gramatic LL(k ) . Pentru detalii legate de expunerea acestui concept cititorul poate consulta [2] i [3]. n final, o descriere a literelor LL din LL(k ) . Primul L nseamn c analizatorul parcurge irul din stnga (spre dreapta). Al doilea L nseamn c analizatorul produce derivarea la stnga a unui ir. n capitolul 8 vom discuta analizatoarele LR. Acetia citesc de asemenea input-ul din stnga spre dreapta, dar produc derivarea la dreapta.

6.4. FUNCIILE FIRST I FOLLOW Toate rezultatele i construciile paragrafului 6.3. se bazeaz pe abilitatea e a calcula n mod determinist funciile FIRST i FOLLOW. ncepem cu funcia FIRST. Reamintim c dac este o form propoziional, atunci FIRST ( ) se compune din toate terminalele x astfel nct, pornind din , o form propoziional care ncepe cu x s poat fi derivat (vezi definiia 6.2.). Ideea de baz a unui algoritm pentru calcularea lui
FIRST ( )

este urmtoarea: Fiind dat o form

propoziional , determinm mai nti toate terminalele care pot aprea n fa dup o substituie a neterminalului cel mai din stnga. Apoi determinm neterminalul care poate aprea n faa unei forme propoziionale care rezult din efectuare a dou substituii, etc. Vom vedea c aceast procedur se va opri dup un numr finit de pai i va produce rezultatul corect. Algoritmul concret este urmtorul. Algoritm 6.2. Funcia FIRST ( ) . Input: O gramatic independent de context G = {, N , S , P} i o form propoziional . Output: Mulimea FIRST ( ) . Partea I. Calculeaz pentru toate simbolurile

FIRST ( X )

gramaticale ala lui G (adic, pentru toi x N {} ) conform urmtorului procedeu: 1. FIRST ( ) = {} 2. FIRST ( x) = {x} pentru toate terminalele x 3. Fie A1 , A2 , K , Ap toate neterminalele gramaticii G

(c) Definete mulimile N ( A1 ) = N ( A2 ) = L = N ( Ap ) = i N ( x) = {x} pentru x (d) Trece prin toate produciile din G ntr-o ordine arbitrar dar fixat iar pentru fiecare producie modific mulimile N ( A1 ) ,
N ( A2 ) , N ( A3 ), K , N ( Ap ) astfel:

i) Dac producia este de forma A x unde x este un terminal, adaug x la N ( A) . ii) Dac producia este de forma A , adaug la N ( A) iii) Dac producia este de forma A Y1Y2 KYk unde Y-urile sunt simboluri gramaticale simple ( Y1 este un neterminal, ntruct altfel are loc cazul i, i n 2 , ntruct altfel are loc ii), rezult dou cazuri: (*) Exist un cel mai mic indice 1 j k astfel ca
n(Y j ) . n acest caz, adaug toate neterminalele din
N (Y1 ) , N (Y2 ), K , N (Y j ) la mulimea N ( A)

(**) Nu exist un astfel de index j, adic, fiecare dintre mulimile N (Y1 ) , N (Y2 ), K , N (Yk ) conine . n acest caz, adaug toate elementele din N (Y1 ), K , N (Yk ) la
N ( A)

(e) Dac vreuna din mulimile N ( A1 ) , N ( A2 ) , N ( A3 ), K , N ( Ap ) a fost modificat n timpul execuiei pasului 3(b), ntoarce i execut pasul din nou. Dac, pe de alt parte, nici una dintre mulimile N ( A1 ) , N ( A2 ) , N ( A3 ), K , N ( Ap ) a fost modificat (adic, la nici una nu au fost adugate elemente noi), pune

FIRST ( A1 ) = N ( A1 ) , FIRST ( A2 ) = N ( A2 ), K , FIRST ( Ap ) = N ( Ap )

Partea II. Dac partea I este completat, toate valorile lui


FIRST ( X ) sunt cunoscute, unde X N {} . Presupunem acum c

este o form propoziional dat prin = Z1Z 2 K Z m , unde Z m este un terminal sau neterminal. Putem presupune c m 2 , deoarece altfel = ( m = 0 ) sau un simbol gramatical simplu ( m = 1 ), n ambele cazuri valoarea lui FIRST ( ) este deja cunoscut din partea I. Avem dou posibiliti: 1) Exist un cel mai mic indice 1 j m astfel ca FIRST ( Z j ) . n acest caz punem

FIRST ( ) = {FIRST ( Z1 ) FIRST ( Z 2 ) L FIRST ( Z j )} {}

Aceasta nseamn c FIRST ( ) se compune din toate terminalele din FIRST ( Z1 ) , FIRST ( Z 2 ), K , FIRST ( Z j ) ; nu este n FIRST ( ) . 2) Nu exist un astfel de indice j, adic, FIRST ( Z j ) pentru toi
j = 1, 2, K , m . n acest caz

FIRST ( ) = FIRST ( Z1 ) FIRST ( Z 2 ) L FIRST ( Z m )

Deci, FIRST ( ) este reuniunea tuturor simbolurilor din FIRST ( Z1 ) ,


FIRST ( Z 2 ), K , FIRST ( Z m ) , inclusiv .

Evident c algoritmul de mai sus este complet determinist i poate fi implementat pe o main. Singurul punct problematic este pasul 3(b)

din partea I. Algoritmul cere aplicarea repetat a acestui pas pn ce nici una din mulimile N ( A1 ) , N ( A2 ) , N ( A3 ), K , N ( Ap ) este schimbat; ntrebarea este dac aceasta are loc ntr-un numr finit de pai. Observm c fiecare modificare const n adugare a unui sau a mai multor terminale la aceste mulimi. ntruct exist numai nu numr finit de terminale, fiecare mulime poate fi modificat doar de un numr finit de ori. Aadar, algoritmul 6.2. se va termina ntr-un numr finit de pai. nainte de a da demonstraia c acest algoritm ntr-adevr calculeaz corect funcia FIRST, vom prelucra un exemplu. Exemplu 6.6. Considerm gramatica, discutat i n exemplele 6.4. i 6.5., dat prin

S BA A aBA

B DC A

D cSc C bDC

Dd C

Valorile pentru FIRST ( ) au fost calculate pentru toi din partea dreapt a produciilor din G. Derivm acum aceste valori utiliznd algoritmul 6.2. Partea I, pasul 1 i 2 dau

FIRST ( ) = {} FIRST (c) = {c}

FIRST (a) = {a} FIRST (d ) = {d }

FIRST ( B) = {b}

(0.9)

Trecem acum la pasul 3. Aa cum se cere la (a) iniializm

N ( S ) = N ( A) = N ( B) = N (C ) = N ( D) =

(0.10)

Prima trece prin producii este urmtoarea:

S BA : Se aplic cazul iii. ntruct N ( B ) ( = ) folosim

subcazul (*) cu j = 1 , adic, trebuie adugate toate elementele din N ( B) la


N ( S ) . Deoarece N ( B) = , nu apar schimbri. A aBA : Aici cazul corespunztor este i, deci adugm terminalul

a la N ( A) astfel ca N ( A) = {a} .
A : Cazul ii, deci adugm la N ( A) ; aadar N ( A) devine { , a} . B DC : Cazul iii. ntruct

N ( D) ( = ), adugm toate

neterminalele din N ( D) la N ( B) . N ( D) = , deci nu au loc schimbri.


C bDC : Din cazul i avem N (C ) = {b} . C : Conform cazului ii, va fi adugat la N (C ) care devine { , b} . D cSc : Aici, din cazul i, N ( D) devine {c} . D d : Din nou, din cazul i N ( D) crete la {c, d } .

Valorile N la sfritul primei treceri sunt

N (S ) = N (C ) = { , b}

N ( A) = { , a} N ( D) = {c, d }

N ( B) =

(0.11)

ntruct aceste valori difer de cele din (6.10), executm din nou pasul 3(b).
S BA : N ( B) = , deci nu se fac schimbri aici. A aBA : Adaug a i la N ( A) , dar N ( A) = { , a} , deci nu are A

loc nici o schimbare.

B DC :

ntruct

N ( D) = {c, d } ,

cazul

iii(*)

N ( B) = N ( D) = {c, d } . C bDC : Adaug b i la N (C ) , dar N (C ) = { , b} , deci nu are C

loc nici o schimbare.


D cSc : Adaug c i d la N ( D) , dar N ( D) = {c, d } , deci nu are loc Dd

nici o schimbare. La sfritul celei de a doua treceri avem

N (S ) = N (C ) = { , b}

N ( A) = { , a} N ( D) = {c, d }

N ( B) = {c, d }

(0.12)

Acestea difer de valorile din (6.11) deci executm din nou pasul 3(a).
S BA : Cazul iii(*) cu j = 1 , rezultnd n N ( S ) = N ( B) = {c, d } .

Se poate verifica uor c produciile rmase nu modific nici una dintre mulimile N. Deci obinem

N ( S ) = {c, d } N (C ) = { , b}

N ( A) = { , a} N ( D) = {c, d }

N ( B) = {c, d }

(0.13)

Valorile sunt diferite de cele din (6.12), deci executm a patra trecere prin pasul 3(b). Se observ uor c aceast trecere nu schimb mulimile N. Aadar, la sfritul prii I avem:

FIRST ( S ) = {c, d } FIRST (C ) = { , b}

FIRST ( A) = { , a} FIRST ( D) = {c, d }

FIRST ( B) = {c, d }

Trecem acum la partea II.


= BA . Se aplic cazul 1 cu j = 1 ( FIRST ( B) ) deci
FIRST ( BA) = FIRST ( B) = {c, d } .

= aBA . Se aplic cazul 1 cu j = 1 ( FIRST (a) ) deci


FIRST ( aBA) = FIRST (a ) = {a} .

= . FIRST ( ) = {} din partea I. = DC . Cazul 1 cu j = 1 d FIRST ( DC ) = FIRST ( D ) = {c, d } . = bDC . Cazul 1 cu j = 1 conduce la FIRST (bDC ) = FIRST (b) = {b} . = cSc . FIRST (cSc) = {c} ca mai sus. = d . FIRST (d ) = {d } din partea I.

Aceste valori sunt identice cu cele din (6.3) care au fost obinute ntr-un mod oarecum ad hoc i intuitiv. Teorema 6.3. Algoritmul 6.2. calculeaz corect funcia FIRST. Demonstraie. Mai nti artm c algoritmul 6.2. de calcularea a lui FIRST ( ) , funcioneaz corect dac este format dintr-un singur simbol (partea I). Se observ c algoritmul 6.2. determin corect valorile pentru FIRST ( ) dac este un terminal sau dac = . Presupunem acum c este un singur neterminal, = A . Cerem ca la fiecare iteraie a pasului 3(b) fiecare din strile N ( Ai ) s conin numai simboluri din

FIRST ( Ai ) . Evident aceasta este adevrat pentru iteraia 0 toate

mulimile sunt vide. Presupunem acum c aceast afirmaia este corect i dup a q-a iteraie. n timpul iteraiei (q + 1) , va fi adugat un simbol x la
N ( Ai ) numai ca rezultat al aplicrii unuia dintre cazurile i, ii sau iii. n

cazul i, x este adugat la mulimea N ( Ai ) dac i numai dac exist o producie de forma Ai x . Evident x FIRST ( Ai ) . n cazul ii, simbolul
este adugat la N ( Ai ) dac exist o producie de forma Ai , dar

aceasta nseamn c este n FIRST ( Ai ) . n cazul iii exist dou posibiliti: posibilitatea (*), exist o producie de forma Ai Y1Y2 KYk i
1 j k astfel nct N ( Ai ) , dar N (Y1 ), K , N (Y j 1 ) . n aceast situaie

adugm toate terminalele din N (Y1 ) , N (Y2 ), K , N (Y j ) la N ( Ai ) . ntruct fiecare din neterminalele Y1 , Y2 , K , Y j poate fi transformat n irul vid ( se afl n fiecare dintre mulimile N (Y1 ) , N (Y2 ), K , N (Y j 1 ) ), observm c fiecare terminal adugat aici la N ( Ai ) va fi adugat i n FIRST ( Ai ) . Un raionament complet analog arat c afirmaia este corect i pentru posibilitatea (**) ( este n fiecare dintre mulimile
N (Y1 ) ,

N (Y2 ), K , N (Yk ) ).

n continuare trebuie s artm c dac un simbol aparine lui


FIRST ( A) , atunci acest simbol va fi adugat la N ( A) ntr-o iteraie din

pasul 3(b). Alegem acum x FIRST ( A) ; presupunem pentru moment c


x . Aceasta nseamn c n gramatica G exist o derivare legal de

forma A x , pentru un ir oarecare. Fie

A 1 2 L q 1 q = x

(0.14)

cea mai scurt derivare la stnga care satisface aceasta. (O asemenea derivare nu trebuie s fie unic, dac gramatic este ambigu, dar nu conteaz.) Definim o funcie ( A, x) ca fiind lungimea unei astfel de derivri scurte: n (6.14), ( A, x) = q . Artm c pentru fiecare neterminal
Ai , dac x FIRST ( Ai ) , atunci x va fi inclus n N ( Ai ) nainte sau n timpul

iteraiei a ( Ai , x) -a. Afirmaia este adevrat dac ( Ai , x) = 1 , ntruct n acest caz cea mai scurt derivare este rezultatul unei singure producii de forma Ai x , deci x este inclus n mulimea N ( Ai ) n timpul primei iteraii. Presupunem acum c afirmaia este adevrat pentru toi Ar i x pentru care ( Ar , x) < q . Fie Ai i x astfel nct x FIRST ( Ai ) i
( Ai , x) = q . n plus fie derivarea ca n (6.14). Forma propoziional 1

trebuie s aib forma 1 = Y1Y2 KYs unde Y-urile sunt simboluri gramaticale simple (terminale sau neterminale). Aadar derivarea A x trebuie s fie de forma
*

A Y1Y2 KYs x

Pentru ca aceasta s aib loc, primul j0 din acei Y ( 0 j0 s 1 ) trebuie transformat n iar Y j +1 este ntr-un ir ncepnd cu x. Toate aceste
0

derivri sunt de lungime < q . Prin inducie, j0 + 1 este primul indice astfel ca N (Y j ) i x N (Y j +1 ) . Deci x este adugat la N ( Ai ) n etapa a q-a
0

(pasul 3(b)iii(*)). Cazul pentru x = este similar. Ca urmare, algoritmul funcioneaz corect n partea I, adic evalueaz corect FIRST (Y ) pentru orice simbol gramatical simplu Y. Demonstraia corectitudinii algoritmului 6.2. n partea II este complet analog i de aceea lsat ca exerciiu. Q.E.D.

Trecem la funcia FOLLOW. Algoritmul se bazeaz din nou pe inducie: Definim la nceput mulimi M ( X ) pentru toate neterminalele X, iar apoi trecem din aproape n aproape prin producii, adugnd la aceste mulimi elemente pn ce nu mai apar schimbri. Ca i n cazul lui FIRST, n timpul iteraie a q-a adugm acele simboluri la M ( X ) care pot aprea dup X n uram a cel mult q substituii. Algoritmul pentru FOLLOW necesit evaluarea lui propoziionale .
FIRST ( )

pentru diferite forme

Algoritm 6.3. Funcia FOLLOW ( X ) . Input: O gramatic independent de context G = {, N , S , P} . Presupunem c simbolul $ nu este n N . Output: Valorile lui FOLLOW ( X ) pentru toate neterminalele X. 1. Fie S = A1 , A2 , A3 , K , An neterminalele din G, unde S este simbolul de start. Definete mulimile M ( Ai ) pentru fiecare Ai prin

M ( S ) = M ( A1 ) = {$}

M ( A2 ) = M ( A3 ) = K = M ( An ) =

2. Trece prin toate produciile din G ntr-o ordine fixat dar arbitrar i execut pentru fiecare urmtoarele operaii asupra mulimilor M: (a) Dac o producia are n partea dreapt numai terminale (sau ), nu face nimic.

(b) Dac producia are neterminale n partea dreapt, atunci pentru fiecare astfel de neterminal X exprim producia ca Ai X i f urmtoarele: i) Adaug toate terminalele din FIRST ( ) la M ( X ) (nu adaug
).

ii) Dac FIRST ( ) , adaug toate simbolurile din M ( Ai ) la


M (X ) .

3. Dac una dintre mulimile M a fost schimbat n timpul execuiei pasului 2, ntoarce i execut din nou pasul 2. Dac nici una a fost schimbat, pune FOLLOW ( Ai ) = M ( Ai ) , i = 1, 2,K , n . Ca i n cazul funcie FIRST, algoritmul se oprete dup un numr finit de pai. Pasul 2 cere (eventual) modificarea mulimilor M ( Ai ) prin adugarea unor terminale la ele. ntruct exist doar un numr finit de terminale, procedura trebuie s se opreasc dup un numr finit de iteraii.

Exemplu 6.7. Considerm din nou gramatica G din exemplul 6.6:

S BA A aBA A

B DC C bDC C

D cSc Dd

Vom calcula cu algoritmul 6.3. mulimile FOLLOW ( S ) , FOLLOW ( A) ,


FOLLOW ( B) , FOLLOW (C ) i FOLLOW ( D ) . Pasul 1 d

M ( S ) = {$}

M ( A) = M ( B) = M (C ) = M ( D) =

(0.15)

Trecem acum la prima iteraie a pasului 2.


S BA . Aici X = B sau X = A i trebuie s considerm ambele

cazuri. Dac X = B , atunci = , = A . Deoarece FIRST ( A) = { , a} (vezi exemplul 6.6.), pasul 2(b)i cere adugarea terminalului a la M ( B) i pasul 2(b)ii cere adugarea tuturor simbolurilor din M ( S ) la M ( B) . Aadar,
M ( B) devine {a, $} . Dac X = A , atunci = B i = . n acest caz FIRST ( ) = {} deci se aplic numai pasul 2(b)ii: Toate simbolurile din M ( S ) sunt adugate la M ( A) , care devine {$}. A aBA . Din nou X = B sau X = A , i considerm ambele cazuri.

Dac lum X = B , atunci = a i = A . Aceasta cere adugarea lui a din


FIRST ( A) la M ( B) nici o schimbare, a se afl deja acolo iar pentru

adugarea lui M ( S ) la M ( B) (ntruct FIRST ( A) ) din nou nici o schimbare. Dac X = A , atunci = aB i = . Aceasta cere (pasul 2(b)ii) adugarea de elemente din M ( A) la ea nsi nici o schimbare.
A . Nu are loc nici o aciune, pasul 2(a). B DC . Dac punem X = D atunci = C i FIRST (C ) = { , b} .

Aceasta cere adugarea lui b la M ( D) (pasul 2(b)i) i M ( B) la M ( D) (pasul 2(b)ii). Aadar M ( D) devine {$, a, b} . Dac X = C atunci
M (C ) = M ( B) = {$, a} . C . Nici o aciune aici. D cSc . M ( S ) devine {$, c} . D d . Nu se ntmpl nimic.

La sfritul acestui pas avem

M ( S ) = {$, c} M (C ) = {$, a}

M ( A) = {$} M ( D) = {$, a, b}

M ( B) = {$, a}

(0.16)

Valorile lui M difer de cele date n (6.15), deci executm din nou pasul 2.
S BA . Punnd X = B determin ca c s fie adugat la M ( B) .

Aceasta deoarece FIRST ( A) i c M ( S ) . Aadar, M ( B) devine


{$, a, c} . Din X = A rezult c c trebuie adugat la M ( A) , care este acum {$, c} . Ambele adugri sunt un rezultat al pasului 2(b)ii. A aBA . Nu are loc nici o schimbare. B DC . Dac X = D atunci M ( D) trebuie adugat la M ( D)

(deoarece FIRST (C ) ), aadar, M ( D) devine {$, a, b, c} . Dac X = C , atunci M ( D) trebuie adugat la M (C ) , transformnd-o n {$, a, c} . Produciile rmase nu produc alte schimbri. Deci, la sfritul celei de a doua iteraii a pasului 2 avem

M ( S ) = {$, c} M (C ) = {$, a, c}

M ( A) = {$, c} M ( D) = {$, a, b, c}

M ( B) = {$, a, c}

Aceste valori difer de cele din (6.16), deci va trebui s repetm din nou pasul 2. Se verific uor c urmtoarea iteraie nu produce nici o schimbare. n final avem

FOLLOW ( S ) = FOLLOW ( A) = {$, c} FOLLOW ( B ) = FOLLOW (C ) = {$, a, c}

FOLLOW ( D ) = {$, a, b, c}

Ceea ce corespunde derivrii noastre intuitive a valorilor lui FOLLOW din exemplul 6.4. Algoritmii 6.1. 6.3. dau o modalitate complet determinist de construire a unui analizator top-down pentru orice gramatic independent de context G. (Acest analizator se poate dovedi nedeterminist.) Teorema 6.4. Algoritmul 6.3. evalueaz corect valorile lui FOLLOW. Demonstraia acestei teoreme este similar cu demonstraia teoremei 6.3. Mai nti artm c la fiecare iteraie a pasului 2, doar simbolurile din FOLLOW ( Ai ) sunt adugate la mulimea M ( Ai ) , iar atunci demonstrm c fiecare simbol din FOLLOW ( Ai ) va fi eventual inclus n
M ( Ai ) . n ambele cazuri demonstraia formal utilizeaz inducia. Nu

vom prezenta aceast demonstraie (este un pic dificil), n schimb vom discuta neformal de ce este necesar pasul 2(b)ii n procesul de derivare. (Necesitatea pasului 2(b)i este evident.) n esen, pasul 2(b)ii spune c dac Y X este o producie i FIRST ( ) conine , atunci orice simbol din FOLLOW (Y ) ar trebui inclus n FOLLOW ( X ) . Presupunem
x0 FOLLOW (Y ) ; deci exist o derivare legal de forma S Yx0 .
*

ntruct Y X este o producie din G, derivarea S Yx0 X x0 este de asemenea legal. Deoarece FIRST ( ) , exist o derivare , deci, n final, derivarea

S Yx0 X x0 Xx0

este tot legal, adic, x0 trebuie inclus n FOLLOW ( X ) . PROBLEME Construii n problemele 1 4 un analizator LL pentru fiecare gramatic dat. Nu evaluai formal funciile FIRST i FOLLOW, facei doar alegeri nelepte ale lor. Care dintre aceste gramatic sunt LL(1) ? 1. S aA , A S | . 2. S AB , A a , B CD | aE , C ab , D bb , E bba . 3. S aAaB | bAbB , A a | ab , B aB | a . 4. S BA , A + BA | , B DC , C *DC | , D ( S ) | a . n problemele 5 8 calculai FIRST i FOLLOW pentru toate neterminalele din gramatica dat. Artai explicit cel puin dou iteraii a algoritmului utilizat. 5. S ABC , A aA | b | , B bC | Ab | , C a | b | c . 6. S aABc , A a | , B b | . 7. S aAde , A BCD , B bB | , C cC | , D bD | . 8. S ABC | Ba | bA , A a | BC | Ca , B b | bbCb | , C AS | Ba | . 9. Presupus c ntr-o gramatic G avem urmtoarele relaii:

FIRST ( A) = {a, b, } FIRST (C ) = {a, }

FIRST ( B) = {b, } FIRST ( D) = {b}

Calculai FIRST ( ABCD) , FIRST ( BC ) i FIRST ( AbB) . 10. Artai c gramatica din problema 8 nu este LL(1) i gsii toate conflictele din tabloul de analiz. 11. Considerai gramatica din exemplul 6.5. a crei tablou de analiz este dat n figura 6.5. Artai micrile acestui analizator cu irurile
1 = dbd , 2 = cdbdad i 3 = cdaabdc .

S-ar putea să vă placă și