automatas de pila tema 10

Upload: isagomez

Post on 08-Mar-2016

233 views

Category:

Documents


1 download

DESCRIPTION

tc3

TRANSCRIPT

  • 173

    Captol 10

    Auto`mats amb pila

    Un exemple molt important de llenguatges incontextuals son els de programa-cio. Com el lector sap, la sintaxi dun programa es denida per unes regles es-pecques subministrades per la grama`tica del llenguatge. Llavors, vericar lacorreccio sinta`ctica dun programa consisteix simplement a decidir la seva perti-nenca al llenguatge generat per la grama`tica corresponent: als ordinadors, aquestatasca la porten a terme els compiladors.

    Per sort, el reconeixement de llenguatges incontextuals, i en particular delsllenguatges de programacio, es pot fer de manera en general ecient, per mitja`dauto`mats amb pila. Informalment, un auto`mat amb pila es un programa amb unvector per a lentrada, una estructura de dades per fer operacions amb una pila i unconjunt doperacions restringides: duna banda, el contingut del vector dentradano es pot canviar ni el punter shi pot moure cap a lesquerra, i, de laltra, la pilaes pot manipular unicament amb una se`rie doperacions concretes que deniremmes endavant.

    Si es fan servir programes indeterministes, es podran implementar auto`mats in-deterministes. Volem avisar ja dentrada que, contra`riament al que passa ambels programes generals, els auto`mats amb pila deterministes i els indeterministesno son equivalents: els segons poden recone`ixer molts mes llenguatges que no elsprimers.

    En aquest captol veurem algunes de les propietats ba`siques dels auto`mats ambpila i les aplicarem al reconeixement de llenguatges generats per grama`tiques simi-lars a les que deneixen els llenguatges de programacio. Daquesta manera acom-plirem els tres objectius daquest captol: aprendre a usar auto`mats amb pila,

  • 174 Auto`mats amb pila

    dissenyar un reconeixedor de programes que sera` util en el darrer captol a lhoradescriure programes que interpreten programes i veure mes aplicacions pra`ctiquesdels programes introduts en els captols anteriors.

    10.1 Denicions ba`siques

    Una pila es una estructura de dades que pot emmagatzemar una paraula de smbols,i nomes permet llegir el darrer smbol (el cim) o esborrar el darrer smbol si laparaula no es buida, o inserir un nou smbol despres del darrer. Aix, lauto`matamb pila nomes pot accedir a la informacio de la seva pila pel darrer element.Tradicionalment es diu que el darrer smbol a entrar dins una pila es el primer asortir-ne.

    A mes de la pila, lauto`mat amb pila te, com tots els programes, un vectordentrada, encara que el vector sols es pot llegir una vegada desquerra a dreta.Aquesta restriccio fa que els auto`mats amb pila tinguin un poder de ca`lcul mesbaix que el dels programes, com veurem al nal del captol.

    Denicio 10.1 (Auto`mat amb pila). Un auto`mat amb pila es un programaP = (,, prog) (on es diu alfabet de la pila) amb les caracterstiques seguents:

    (a) Es permeten tan sols dues operacions sobre el vector dentrada: llegir(ent)i dreta(ent).

    (b) La grama`tica que produeix prog conte els smbols terminals nous

    pila, buida, cim, desempilar, empilar

    i les produccions

    Exp buida(pila)Term cim(pila)Ins desempilar(pila) | empilar(pila,Term)

    (c) A mes, es permeten dues extensions de la sintaxi daquests programes:

    Les condicions de les instruccions si i mentre poden contenir operadorsde conjuncio i, disjuncio o i negacio no.

    Hi pot haver altres variables duna sola casella que es podran llegir imodicar de la mateixa forma que la variable accepta.

  • Auto`mats amb pila 175

    Aquestes dues extensions es poden descriure per mitja` de nous smbols termi-nals i produccions a la grama`tica.

    Intutivament, la sema`ntica de les operacions amb la pila es la seguent:

    Lexpressio buida(pila) es vertadera quan la paraula emmagatzemada a lapila es buida, cas en el qual direm que la pila es buida, i es falsa en cascontrari.

    El terme cim(pila) te com a valor el cim de la pila, el darrer smbol de laparaula a la pila, si la pila no es buida; si es buida, el valor de cim(pila) noesta` denit, i emprar aquest terme dona un error.

    La instruccio desempilar(pila) desempila, es a dir, esborra el darrer smbolde la paraula a la pila cas que aquesta no sigui buida; si es buida, aixo` no espot fer i aquesta instruccio dona un error.

    La instruccio empilar(pila,terme) empila el valor, diguem-ne t, del terme,es a dir, concatena el nou valor t despres del darrer smbol de la paraula a lapila, de manera que aquest valor esdeve el nou cim de la pila.

    Un auto`mat amb pila es determinista o indeterminista segons ho sigui com aprograma, en el sentit de les denicions donades en els captols anteriors.Les dues darreres extensions de la sintaxi ens permeten descriure programes

    mes clars, pero` si es volgues es podrien simular amb combinacions adients de lesinstruccions dels programes i usant la variable accepta amb molts smbols querepresentassin altres variables i resultats de combinacions dexpressions.

    Per simplicar els programes, sovint emprarem la instruccio empilar par perempilar paraules de termes, es a dir, com a abreviatura duna successio dinstruc-cions empila. Mes en concret, si w = t1t2 . . . tk, on cada ti indica un terme,aleshores empilar par(pila,w) es una abreviatura de

    empilar(pila,tk)empilar(pila,tk1)...empilar(pila,t2)empilar(pila,t1)

    Observau que comencam empilant el valor del terme mes a la dreta de w i avancamcap a lesquerra empilant els valors dels altres termes. Daquesta manera, el que

  • 176 Auto`mats amb pila

    escrivim desquerra a dreta a la pila es la transposada wt de la paraula w i el noucim de la pila esdeve t1, la primera lletra de w per lesquerra.

    Com sempre, les conguracions dels auto`mats amb pila han de representar elscontinguts instantanis de lentrada i de la pila. Per tant, cal representar en unaconguracio el contingut de la pila amb una paraula.

    Denicio 10.2 (Conguracio). Una conguracio dun auto`mat amb pila P =(,, prog) es una quntupla

    (n,, i, p, r) N N ( {e}),

    en que` els valors de n, , i i r son els mateixos que els de la Denicio 2.4 i prepresenta la paraula continguda a la pila.

    Consistentment amb les conguracions inicials dels programes, imposam tambeque les conguracions inicials dels auto`mats amb pila sempre tinguin la forma

    (1,, 1,, 0).

    En particular, en una conguracio inicial no es pot emprar ni desempilar(pila)ni cim(pila).

    Per exemple, a la conguracio

    (n, abcde, 3, Zhg, 0)

    lexpressio buida(pila) es falsa i el valor de cim(pila) es g. Si ara executam lainstruccio empila par(pila,abc), tenim els passos de derivacio

    (n, abcde, 3, Zhg, 0) (n+ 1, abcde, 3, Zhgcba, 0).

    En aquesta nova conguracio, el valor de cim(pila) es a. Si ara executam lainstruccio desempilar(pila), obtindrem la conguracio

    (n+ 2, abcde, 3, Zhgcb, 0),

    on el valor de cim(pila) ara es b.

    La descripcio intutiva de la sema`ntica dun programa amb pila donada abans estradueix formalment en la sema`ntica donada per als programes, tenint en compteles restriccions sobre les operacions que es poden efectuar sobre el vector mes lesderivacions seguents.

  • Auto`mats amb pila 177

    Denicio 10.3 (Derivacio directa). Sigui P un auto`mat amb pila amb alfabet dela pila . Per a cada conguracio C = (n,, i, p, r), sigui la n-e`sima lnia de P .Aleshores:

    Si es desempilar(pila), aleshores

    C (n+ 1,, i, p, r),

    quan p = pz per a alguns p i z ; si p = , aleshores

    C (nF ,, i, p, e),

    la qual cosa, com sempre, indica que sha donat un error .

    Si es empila par(pila,terme), aleshores

    C (n+ 1,, i, pt, r),

    on t es el valor del terme per a la conguracio C.

    Si conte cim(pila) i la pila es buida, aleshores

    C (nF ,, i, p, e),

    la qual cosa indica que sha donat tambe un error .

    Ate`s que les instruccions esquerra(ent) i esquerra(pila) estan prohibides, lesuniques fonts derrors en els auto`mats amb pila son la consulta del cim de la pila iel desempilatge quan la pila es buida.

    Exemple 10.4. Volem donar un auto`mat amb pila determinista que accepti elllenguatge L1 = {a

    ibi | i 0}.El programa empilara` una A per cada a que llegeixi a lentrada, i un cop hi

    trobi la primera b, anira` desempilant una A per cada b que contingui lentrada.Si despres daquest cicle la pila es buida, acceptara`, i si la pila no es buida o siapareix una a a la dreta duna b a lentrada, o si sacaben les As abans que les bes,no acceptara`.

    programa rec_anbn(ent)

    pila:tipus_pila

    mentre llegir(ent)=a fer

  • 178 Auto`mats amb pila

    empilar(pila,A)

    dreta(ent)

    fmentre

    mentre llegir(ent)=b i no buida(pila) fer

    desempilar(pila)

    dreta(ent)

    fmentre

    si buida(pila) i llegir(ent)=# llavors

    escriure(accepta,1)

    fsi

    fi

    Mes endavant donarem un me`tode sistema`tic per dissenyar un auto`mat amb pilaque accepti un llenguatge incontextual del qual coneguem una grama`tica que elgenera.

    Exemple 10.5. Considerem el llenguatge

    L2 = {w2wt | w {0, 1}},

    el qual es clarament incontextual pero` no regular.

    La idea ba`sica per dissenyar un auto`mat amb pila determinista que reconeguiL2 es emprar la pila per recordar les lletres de lentrada llegides abans del 2i, despres del 2, anar comparant els smbols de la pila amb els de lentrada perveure si savenen; com que lordre dels smbols que anirem empilant sera` linversde lordre com els llegim, es correspondra` amb el de la part transposada, i pertant aquesta comparacio es possible. Aquestes consideracions ens fan denir elprograma seguent:

    programa rec_w2wt(ent)

    pila:tipus_pila

    escriure(accepta,1)

    mentre llegir(ent)/=2 i llegir(ent)/=# fer

    empilar(pila,llegir(ent))

    dreta(ent)

    fmentre

    si llegir(ent)=2 llavors

    dreta(ent)

    si_no

  • Auto`mats amb pila 179

    escriure(accepta,0)

    fsi

    mentre no buida(pila) i cim(pila)=llegir(ent) fer

    desempilar(pila)

    dreta(ent)

    fmentre

    si no buida(pila) o llegir(ent)/=# llavors

    escriure(accepta,0)

    fsi

    fi

    Es pot comprovar que aquest auto`mat efectivament accepta L2.

    Denicio 10.6 (Llenguatge incontextual determinista). Un llenguatge L sobre unalfabet es incontextual determinista si L es pot recone`ixer mitjancant un auto`matamb pila determinista que sempre satura.

    La classe dels llenguatges incontextuals deterministes sobre es denotada perCFLdet() o, com es usual, simplement per CFLdet si lalfabet es conegut o irre-llevant.

    Mes endavant justicarem que tot llenguatge acceptat per un auto`mat amb pilaes incontextual. Per conseguent, tot llenguatge incontextual determinista en elsentit de la denicio anterior es, efectivament, incontextual. A mes, i encara queno ho demostrarem amb tot detall en aquestes notes, el lector ha de saber desdara que no tots els llenguatges incontextuals son deterministes. Es a dir, es te lainclusio estricta CFLdet CFL.Aix doncs, podem classicar els llenguatges incontextuals en deterministes o no,

    segons sigui possible trobar auto`mats amb pila deterministes que sempre saturenque els reconeguin o no. Com que els llenguatges de programacio mes usats sondeterministes, el reconeixement de les seves sente`ncies pot portar-se a terme en unnombre de passos redut mitjancant un auto`mat amb pila determinista adient.

    Exemple 10.7. Considerem el llenguatge

    L = {wwt | w {0, 1}}.

    Per recone`ixer una paraula daquest llenguatge basta empilar allo` que llegim de wi desempilar aquests smbols a mesura que llegim wt, tot comparant-los amb leslletres que llegim en aquesta paraula i aturant el ca`lcul si la lletra de la pila no save

  • 180 Auto`mats amb pila

    amb la de lentrada. Lunic problema consisteix a saber quan acaba w i comencawt. En el cas determinista, usa`vem un 2 per separar w de wt a les paraules delllenguatge. Amb lindeterminisme no ens cal: de manera indeterminista podemprovar totes les posicions de lentrada com a lloc de separacio entre w i wt. Ambaquesta idea al cap, proposam el seguent auto`mat amb pila indeterminista peracceptar aquest llenguatge:

    programa rec_wwt(ent)

    pila:tipus_pila

    continui:simbol

    1 escriure(continui,1)

    2 mentre llegir(continui)=1 fer

    3 ramificar

    4 si llegir(ent)/=# llavors

    5 empilar(pila,llegir(ent))

    6 dreta(ent)

    7 si_no

    8 escriure(continui,0)

    9 fsi

    10 amb

    11 escriure(continui,0)

    12 framificar

    13 fmentre

    14 mentre no buida(pila) i cim(pila)=llegir(ent) fer

    15 desempilar(pila)

    16 dreta(ent)

    17 fmentre

    18 si buida(pila) i llegir(ent)=# llavors

    19 escriure(accepta,1)

    20 fsi

    21 fi

    En el bloc de ramicacio (lnies 3 a 12), el programa tria entre llegir una lletrames de lentrada i empilar-la o deixar de llegir lentrada: aquesta darrera accio esmarca assignant a la variable continui el valor 0. Quan surt del bloc de rami-cacio, aquest programa segueix la mateixa estrate`gia que el de lexemple anterior:compara el contingut de la pila (de dreta a esquerra) amb la continuacio de len-trada (desquerra a dreta) i accepta si aquestes dues paraules son iguals.

  • Auto`mats amb pila 181

    Lindeterminisme te aqu un paper fonamental, ja que la decisio de deixar dellegir lentrada es indeterminista; es a dir, el programa prova de comencar el segonbucle (lnies 14 a 17) en tots els llocs possibles de la paraula dentrada, i si alguna deles derivacions que sobtenen daquesta manera acaba amb la pila buida, la paraulaes acceptada.

    En canvi, aquest llenguatge no pot ser acceptat per un auto`mat amb pila deter-minista; si no hi ha un smbol que separi w de wt, lindeterminisme es necessariper recone`ixer totes les concatenacions de paraules i les seves transposades.

    10.2 Reconeixedors de llenguatges incontextuals

    En aquesta seccio estudiam la relacio entre les grama`tiques incontextuals i elsauto`mats amb pila indeterministes. De fet, veurem que les grama`tiques incontex-tuals generen exactament els llenguatges que son acceptats pels auto`mats amb pilaindeterministes.

    Daquesta equivale`ncia, el mes interessant es la construccio dun programa tansimple com ens sigui possible que reconegui el llenguatge generat per una grama`ticadonada, un problema que se sol tractar amb detall en un curs de compiladors. Les-trate`gia ba`sica que seguirem per construir un programa que accepti un llenguatgeincontextual del qual coneixem una grama`tica que el genera sera` mantenir en unapila la descripcio dels smbols que, per acceptar lentrada, haurien dapare`ixer a laparaula que roman per llegir. Per exemple, si una grama`tica genera les paraulesformades per pare`ntesis ben encaixats, i shan llegit cinc pare`ntesis dobrir, la pilahauria de contenir (al comencament per lesquerra) els cinc pare`ntesis de tancarcorresponents.

    Per comencar, donarem un exemple senzill que ens mostri com es construeix unauto`mat amb pila per acceptar un llenguatge del qual coneixem una grama`tica queel genera.

    Exemple 10.8. Volem construir un programa que accepti el llenguatge generatper la grama`tica

    P pBfB IB | I i | sBg | mBh

    on les variables son P, I i B i els altres smbols son terminals.El programa ha de comencar empilant el smbol inicial de la grama`tica, que es P .

    Ara comencam a aplicar el me`tode que usarem en general: si el smbol que hi ha

  • 182 Auto`mats amb pila

    en un moment determinat al cim de la pila es una variable, es desempila i sempilala part dreta duna de les produccions corresponents a aquesta variable. En el casde P aixo` es simple: basta canviar P per pBf a la pila: vegeu les lnies 4 a 7 en elprograma que donarem a continuacio.

    Ara, al cim hi ha el smbol p; com que es terminal, per forca a lentrada en aquellmoment hi ha dhaver una p: es a dir, en aquest cas, la paraula ha de comencarper p per ser acceptada. El que fem, per tant, es comprovar que a lentrada tambehi ha una p a la primera posicio i a continuacio, duna banda, avancam el punterde lentrada una posicio cap a la dreta, i de laltra, desempilam la p. En general,per acceptar lentrada, si en un moment determinat hi ha un terminal al cim de lapila, en aquell mateix moment hi ha dhaver el mateix terminal a la posicio delentrada que llegeix el punter corresponent; a aixo` es al que ens referem abansquan de`iem que la pila ha de contenir el que sespera de lentrada (o`bviament enordre invers, ja que la buidam de dreta a esquerra). En el programa que donam,aquestes comprovacions les especicam a les lnies 25 a 32, on hem utilitzat unanotacio de conjunts per fer mes clar i mes concs el programa.Despres dhaver desempilat el smbol p, al cim hi tenim el smbol B. Com que

    B te diverses produccions associades, hem de considerar-les totes, ja que algunadelles pot ser la que shagi de fer servir per generar lentrada: vegeu el bloc deramicacio format per les lnies 10 a 13, on lamb de la lnia 12 signica continuarsense fer res, la qual cosa correspon a la produccio buida B . Aquesta part delprograma genera dos ls dexecucio cada cop que es executada.La manera de tractar el smbol I quan el trobam al cim de la pila es ana`loga a

    lanterior: es donada pel bloc de ramicacio de les lnies 17 a 23.Daquesta manera obtenim una solucio al nostre problema que consisteix en una

    traduccio directa i sistema`tica de la grama`tica donada en el programa seguent:

    programa recP(ent)

    pila:tipus_pila

    1 escriure(accepta,1)

    2 empilar(P)

    3 mentre no buida(pila) i llegir(accepta)=1 fer

    4 si cim(pila)=P llavors

    5 desempilar(pila)

    6 empilar_par(pila,pBf)

    7 si_no

    8 si cim(pila)=B llavors

  • Auto`mats amb pila 183

    9 desempilar(pila)

    10 ramificar

    11 empilar_par(pila,IB)

    12 amb

    13 framificar

    14 si_no

    15 si cim(pila)=I llavors

    16 desempilar(pila)

    17 ramificar

    18 empilar_par(pila,i)

    19 amb

    20 empilar_par(pila,sBg)

    21 amb

    22 empilar_par(pila,mBh)

    23 framificar

    24 si_no

    25 si cim(pila) dins {p,f,i,s,g,m,h} llavors

    26 si cim(pila)=llegir(ent) llavors

    27 desempilar(pila)

    28 dreta(ent)

    29 si_no

    30 escriure(accepta,0)

    31 fsi

    32 fsi

    33 fsi

    34 fsi

    35 fsi

    36 fmentre

    37 si llegir(ent)/=# llavors

    38 escriure(accepta,0)

    39 fsi

    40 fi

    El programa que sobte daquesta manera es, en general, indeterminista i, pertant, aquesta solucio sera` inecient. En aquest cas, es possible donar un programadeterminista que reconegui el llenguatge generat per la grama`tica, tenint en compteuna observacio important: si es pot determinar quina de les produccions shauriademprar en cada moment per generar lentrada, llavors el bloc de ramicacio espot evitar.

  • 184 Auto`mats amb pila

    La grama`tica daquest exemple es simple i la determinacio es pot fer. Comen-cem per tractar la variable I. Cada produccio de I comenca amb un terminaldiferent, i aixo` o`bviament determina quina produccio shauria de fer servir per ge-nerar una paraula concreta. Per exemple, i tornant a la grama`tica, si empilam laproduccio sBg, aleshores per acceptar lentrada hem de llegir en aquell moment s.Per conseguent, hem dempilar sBg unicament si la posicio que llegeix el punterde lentrada es s. A mes, com que el seguent pas sera` desempilar s i avancar sobrelentrada a la dreta, podem fer aquests dos passos simulta`niament: si el cim dela pila conte una I i a lentrada shi llegeix s, aleshores sempila Bg i savanca elpunter de lentrada un lloc a la dreta:

    si cim(pila)=I llavors

    desempilar(pila)

    si llegir(ent)=s llavors

    empilar_par(pila,Bg)

    dreta(ent)

    si_no

    ...

    fsi

    fsi

    Shan emprar uns condicionals similars per cobrir els casos quan llegir(ent)=mi llegir(ent)=i: vegeu les lnies 23 a 40 en el programa que donarem una micames avall.

    El cas mes difcil es quan el cim es B. En aquest cas, podem empilar IB o noempilar res. Per tant, la pregunta clau es:

    quan es desempila B, que` sha deixat al cim de la pila?

    Podem observar que la variable B nomes es pot produir dins les paraules pBf ,sBg, mBh o IB, i per conseguent nomes la podem empilar dins una daquestes.Aixo` signica que immediatament sota una B a la pila nomes hi pot haver f , g oh; si hem empilat IB, ha estat a canvi de desempilar una B, i per tant allo` quehi haura` sota la nova B sera` exactament el que ja hi havia sobre la B que hauremdesempilat.

    Si SOTA(X) representa el conjunt de smbols a la pila que poden estar sota laX, el para`graf anterior es resumeix a dir que

    SOTA(B) = {f, g, h} SOTA(B).

  • Auto`mats amb pila 185

    Sobre lultim terme, en general, si volem saber que` hi ha sotaX i tenim la produccioY X, llavors SOTA(X) SOTA(Y ), perque` el que era sota una Y abans dereemplacar Y per X, ara queda sota la X. En aquest cas particular, larmacioSOTA(B) SOTA(B) no aporta nova informacio i no es te en compte.Aix doncs, quan al cim de la pila hi ha una B, si a lentrada el punter esta` llegint

    una f , una g o una h, signica que hem de desempilar la B i a continuacio compararla lletra de lentrada amb la que hi ha a sota de la B a la pila, i si coincideixen,desempilar aquesta darrera i avancar sobre lentrada un lloc cap a la dreta; aixo`correspon a la produccio buida B . Si, en canvi, a lentrada el punter esta`llegint una i, una s o una m, hem dempilar IB, de manera que el nou cim de lapila sigui I.

    En vista daixo`, per a aquesta grama`tica concreta es possible dissenyar un pro-grama determinista equivalent, ja que el smbol a lentrada permet determinarquina produccio sha de simular. El resultat es el programa seguent:

    programa recP(ent)

    pila:tipus_pila

    1 escriure(accepta,1)

    2 empilar(P)

    3 mentre no buida(pila) i llegir(accepta)=1 fer

    4 si cim(pila)=P llavors

    5 desempilar(pila)

    6 si llegir(ent)=p llavors

    7 empilar_par(pila,Bf)

    8 dreta(ent)

    9 si_no

    10 escriure(accepta,0)

    11 fsi

    12 si_no

    13 si cim(pila)=B llavors

    14 desempilar(pila)

    15 si llegir(ent) en {i,s,m} llavors

    16 empilar_par(pila,IB)

    17 si_no

    18 si llegir(ent) no en {f,g,h} llavors

    19 escriure(accepta,0)

    20 fsi

    21 fsi

  • 186 Auto`mats amb pila

    22 si_no

    23 si cim(pila)=I llavors

    24 desempilar(pila)

    25 si llegir(ent)=i llavors

    26 dreta(ent)

    27 si_no

    28 si llegir(ent)=s llavors

    29 empilar_par(pila,Bg)

    30 dreta(ent)

    31 si_no

    32 si llegir(ent)=m llavors

    33 empilar_par(pila,Bh)

    34 dreta(ent)

    35 si_no

    36 escriure(accepta,0)

    37 fsi

    38 fsi

    39 fsi

    40 si_no

    41 si cim(pila) en {f,g,h} llavors

    42 si cim(pila)=llegir(ent) llavors

    43 desempilar(pila)

    44 dreta(ent)

    45 si_no

    46 escriure(accepta,0)

    47 fsi

    48 fsi

    49 fsi

    50 fsi

    51 fsi

    52 fmentre

    53 si llegir(ent)/=# llavors

    54 escriure(accepta,0)

    55 fsi

    56 fi

    Aquest programa sempre satura. En efecte, duna banda, no dona errors, perque`cada cop que empra la instruccio desempilar(pila) o el terme cim(pila) ho faen una iteracio del bucle principal (lnies 352), la qual cosa garanteix que la pila

  • Auto`mats amb pila 187

    no es buida. Daltra banda, cada cop que passa per una iteracio daquest bucle,o be rebutja lentrada, o be avanca sobre aquesta o be reemplaca una B de lapila. Encara que un reemplacament de B no avanci sobre lentrada, a la seguentiteracio sempre ho fara`: si empila IB, la I llegira` un smbol, i si desempila la B(per entendrens, si empila ), el terminal al cim de la pila fara` que un smbol delentrada sigui llegit. Aix doncs, el nombre de cops que es reemplaca B en unaexecucio del programa no es mes gran que la longitud de lentrada. Per tant, elnombre diteracions per les quals passa una execucio sobre una entrada es coma molt, essencialment, dos cops la longitud de lentrada; aixo` implica que aquestauto`mat amb pila determinista sempre satura. A mes, acabam de veure que esmolt ecient.Vegem amb un exemple com la grama`tica genera la paraula pisimihgf i com el

    programa determinista reconeix la paraula i fem-ne ressaltar la similitud. Anome-nam w la paraula a lentrada a lesquerra del punter i q el contingut de la pila justabans dentrar al bloc de bucle, abans dexecutar-se la lnia 4. La parella (w, q)resumeix una conguracio de lauto`mat cada vegada que el programa arriba a lalnia 4. Els seguents parells de lnies mostren les derivacions de la grama`tica iles seves conguracions associades al programa. El lector ha danalitzar cada pasdetalladament.

    P pBf pIBf piBf piIBf pisBgBf(, P ) (p, fB) (p, fBI) (pi, fB) (pi, fBI) (pis, fBgB)

    pisIBgBf pisiBgBf pisiIBgBf pisimBhBgBf (pis, fBgBI) (pisi, fBgB) (pisi, fBgBI) (pisim, fBgBhB)

    pisimIBhBgBf pisimiBhBgBf pisimihBgBf (pisim, fBgBhBI) (pisimi, fBgBhB (pisimi, fBgBh)

    pisimihgBf (pisimih, fBgB) (pisimih, fBg) (pisimihg, fB)

    pisimihgf (pisimihg, f) (pisimihgf,)La conclusio que podem inferir daquest exemple es que larmacio lo`gica que

    sempre es certa abans dexecutar la lnia 4 (la invariant) es que P wqt, on w esla paraula a lesquerra del punter i q es el contingut de la pila.

  • 188 Auto`mats amb pila

    Nota 10.9. Per produir un programa determinista que reconegui el llenguatgeformat per tots els programes sobre un alfabet xat, basta repetir largument delexemple anterior amb la grama`tica per generar programes donada a la Denicio2.1. Quan ho faci, el lector ha de tenir en compte que les produccions per aBloc son les mes difcils de simular dins el programa, pero` que son similars a lesproduccions per a B de lexemple anterior i per tant les pot tractar de manera similara aquestes. Aix doncs, a partir dara entendrem que disposam dun programadeterminista ecient (en particular, que sempre satura) que reconeix el llenguatgedels programes.

    Exemple 10.10. Volem trobar un programa amb pila determinista que acceptiles expressions aritme`tiques correctes sobre lalfabet {0, 1, [, ], }. Per xar idees,entendrem que les expressions aritme`tiques correctes que ens interessen son lesdenides per la grama`tica seguent:

    S F S | FF [S] | 0 | 1

    Podrem dissenyar fa`cilment un programa indeterminista que ana`s empilant lesparts dretes de les produccions cada cop que desempila`s la part esquerra correspo-nent, quan aquesta es una variable, i ana`s comparant el cim de la pila amb el smbolque llegeix a lentrada quan el primer fos un terminal; veurem al Teorema 10.11que aquest me`tode sistema`tic sempre permet traduir una grama`tica incontextualen un auto`mat amb pila que reconegui el llenguatge que genera la primera. Pero`en aquest cas mirarem descriure un programa determinista fent servir les idees delexemple anterior.

    Sabem que cada variable que te mes duna produccio implica un bloc de rami-cacio en el programa que volem evitar. La variable F te tres produccions, pero`les seves tres parts dretes comencen amb tres smbols terminals distints, i per tantpodrem distingir quina de les produccions cal simular en cada moment sense ferservir ramicacions. Aix doncs, la variable F no genera cap problema. La vari-able S, en canvi, te dues produccions que comencen amb la mateixa variable F ;qualssevulla que siguin els smbols amb els quals el boc de paraula derivat de Fcomenci, seran els mateixos per a les dues produccions i per tant daquesta manerano les sabrem distingir.

    Per eliminar lindeterminisme a lhora de processar S, podem factoritzar lesS-produccions i treballar amb la grama`tica seguent, que es equivalent a lanterior:

    S FGG S | F [S] | 0 | 1

  • Auto`mats amb pila 189

    Desgraciadament, ara es la nova variable G la que te dues produccions que podenentrar en conicte a lhora de fer una decisio determinista; una de les produccionslanul.la, i sabem de lexemple anterior que aquest es un cas difcil de manejar.Mirem de resoldre aquest punt com ho hem fet abans. Si G esta` al cim de la pila,podem reemplacar-la per S o desempilar-la sense afegir res al seu lloc. Per decidiren cada moment quina de les dues decisions prendre, ens demanam:

    quan es desempila G, que` sha deixat al cim de la pila?

    El smbol G tan sols safegeix a la pila quan FG reemplaca S al cim. Per tant,el smbol que queda sota G es exactament el que hi havia sota S. Usant la notaciode lexemple anterior,

    SOTA(G) = SOTA(S).

    Ara el smbol S safegeix a la pila fent servir les regles F [S] o G S, o alprincipi de tot, perque` es el smbol inicial. Quan ho fa amb [S], el que queda a sotade S es ]. Quan ho fa amb S, queda a sota de S el que hi havia sota el smbol quehem desempilat, que ha estat justament G. I en lultim cas, si el cim es la S quesha introdut com a smbol inicial, sota seu no hi ha res. Usarem el smbol perrepresentar la base de la pila buida que hi pot haver sota S, perque` S es el smbolinicial de la grama`tica:

    SOTA(S) = {]} SOTA(G) {}.

    En resum, si es desempila G, la pila te al cim un ] o es buida. Com que la pilabuida fa que el programa surti del bucle, lultim cas nomes pot processar un #.Aix, quan es desempila una G, el punter de lentrada ha destar llegint un ] o un# a que pugui coincidir aquest smbol amb el que el cim de la pila pot processarun cop desempilada la G.

    Aixo` ens resol el problema de lindeterminisme: quan hem de triar entre reem-placar G per S o per no res, hem de prendre la primera opcio sempre que el smbolque estigui llegint el punter de lentrada sigui , i la segona si aquest smbol es ] o#. Amb tot, el programa que resulta es el seguent:

    programa recExpressio(ent)

    pila:tipus_pila

    escriure(accepta,1)

    empilar(S)

    mentre no buida(pila) i llegir(accepta)=1 fer

    si cim(pila)=S llavors

  • 190 Auto`mats amb pila

    desempilar(pila)

    empilar_par(pila,FG)

    si_no

    si cim(pila)=G llavors

    desempilar(pila)

    si llegir(ent)=* llavors

    empilar_par(pila,S)

    dreta(ent)

    si_no

    si llegir(ent)/=] i llegir(ent)/=# llavors

    escriure(accepta,0)

    fsi

    fsi

    si_no

    si cim(pila)=F llavors

    desempilar(pila)

    si llegir(ent)=[ llavors

    empilar_par(pila,S])

    dreta(ent)

    si_no

    si llegir(ent)=0 llavors

    dreta(ent)

    si_no

    si llegir(ent)=1 llavors

    dreta(ent)

    si_no

    escriure(accepta,0)

    fsi

    fsi

    fsi

    si_no

    si cim(pila)=] llavors

    si cim(pila)=llegir(ent) llavors

    desempilar(pila)

    dreta(ent)

    si_no

    escriure(accepta,0)

    fsi

  • Auto`mats amb pila 191

    fsi

    fsi

    fsi

    fsi

    fmentre

    si llegir(ent)/=# llavors

    escriure(accepta,0)

    fsi

    fi

    Un argument similar al donat a lexemple anterior mostra que aquest auto`mat ambpila determinista satura sempre.

    Fixem-nos que, en aquest darrer exemple, hem pogut donar un programa deter-minista per recone`ixer el llenguatge que ens interessava que llegeix a cada momentun smbol de lentrada sense avancar sobre aquesta. En teoria de compiladors,direm que aquest llenguatge, com el de lExemple 10.8, es de la classe LL(1), on,per a cada k 1, la classe LL(k) es formada pels llenguatges que admeten reconei-xedors ecients que permeten llegir a cada pas k smbols consecutius de lentradasense avancar sobre ells abans de prendre una decisio.

    Aquest darrer exemple es important atesa la seva utilitat pra`ctica, ja que mostrauna solucio algortmica ecient, amb una estructura de dades senzilla, per analitzarles expressions aritme`tiques. Una altra solucio, tambe basada en la grama`tica,deniria un procediment per a cada variable de la grama`tica i aquests procedimentses cridarien recursivament segons les produccions; aquesta solucio per mitja` deprocediments recursius es mes estructurada, pero` menys ecient.Vegem ara un resultat general que, en el pitjor dels casos, ens permet de donar

    una solucio indeterminista al problema dacceptar per mitja` dun auto`mat amb pilaun llenguatge incontextual.

    Teorema 10.11. Per a cada llenguatge incontextual, existeix un auto`mat amb pilaindeterminista que el reconeix.

    Demostracio. Siguin L un llenguatge incontextual i G = (V,, P, S) una grama`ticaincontextual que el genera. Posem = V {#} i suposem que, per a cadaA V ,

    A A,1|A,2| |A,k

  • 192 Auto`mats amb pila

    son totes les produccions de A. Considerem aleshores el programa amb alfabet dela pila seguent (on representam per Sigma i cada paraula A,i pel corresponentalpha Ai):

    programa recG(ent)

    pila:tipus_pila

    escriure(accepta,1)

    empilar(S)

    mentre no buida(pila) i llegir(accepta)=1 fer

    si cim(pila) dins Sigma llavors

    si cim(pila)=llegir(ent) llavors

    desempilar(pila)

    dreta(ent)

    si_no

    escriure(accepta,0)

    fsi

    si_no

    si cim(pila)=A llavors

    desempilar(pila)

    ramificar

    empilar_par(pila,alpha_A1)

    amb

    .

    .

    .

    amb

    empilar_par(pila,alpha_Ak)

    framificar

    si_no

    .

    .

    .

    fsi

    fsi

    fmentre

    si llegir(ent)/=# llavors

    escriure(accepta,0)

    fsi

  • Auto`mats amb pila 193

    fi

    Aquest programa amb pila simula les derivacions esquerres de G, tot estotjanta cada instant a la pila els terminals que han estat generats per les produccionsque han generat les lletres de lentrada llegides ns llavors, aix com les varia-bles intercalades entre aquestes que produiran la resta de lletres amb produccionsposteriors. Quan la pila torna a ser buida, es perque` hem llegit tota una paraulagenerada per G.

    Indicarem amb n1 la posicio del si que inicia el darrer condicional del programa.Observem que la posicio del mentre que inicia el bucle del programa es 3.

    Per demostrar que recG accepta el llenguatge L generat per G, basta demostrarlarmacio seguent, on la derivacio es fa per lesquerra:

    Per a tota X V , tota w i tota que, o be comenci ambuna variable o be sigui ,

    X w si i nomes si (3, w, 1, X, 1) (3, w, |w|+ 1,t, 1).

    En particular per a X = S, S w si i nomes si w es la paraula ja llegida a

    lesquerra del punter i en la pila esta` t.Cada direccio daquesta equivale`ncia es pot demostrar per induccio: desquerra a

    dreta, per induccio sobre el nombre de passos de la derivacio X w, i de dreta a

    esquerra, per induccio sobre el nombre de vegades que la derivacio (3, w, 1, X, 1, 1) (3, w, |w|+1,t, ||, 1) passa per una conguracio de posicio 3. Aqu demostraremla primera direccio; deixam la demostracio de laltra com a exercici per al lector.

    Suposem que el nombre de passos es 1, es a dir, que X w. Si aixo` es aix,es perque` X w es una produccio de G i per tant un dels ls dexecucio delprograma reemplaca X per w a la pila. Llavors,

    (3, w, 1, X, 1) (3, w, 1, (w)t, 1)= (3, w, 1,twt, 1) (3, w, |w|+ 1,t, 1)

    La primera correspon a la primera passada pel bucle, en la qual es desempilaX i sempila la produccio corresponent w. La segona esta` formada per unaseque`ncia de passades pel bucle, per mitja` de les quals seliminen els smbols de wtde la pila dun en un mentre es llegeixen els mateixos smbols de w a lentrada.Suposem ara que X

    wY ww = w en n + 1 passos. En aquestcas, Y es la primera variable de wY (perque` la derivacio es per lesquerra), i es

  • 194 Auto`mats amb pila

    reescrita per mitja` de la produccio Y w. Llavors w = ww, la qual cosa enparticular implica per hipo`tesi que w no te variables, i = , la qual cosaimplica que comenca amb una variable o es .Ate`s que, a mes, la derivacio X

    wY te n passos, per hipo`tesi dinducciotenim que

    (3, w, 1, X, 1) (3, w, |w|+ 1, (Y )t, 1)i per tant

    (3, ww, 1, X, 1) (3, ww, |w|+ 1, (Y )t, 1)= (3, ww, |w|+ 1, ()tY, 1)

    (3, ww, |w|+ 1, ()t(w)t, 1)= (3, ww, |w|+ 1, ()t(w)t, 1)

    (3, w, |w|+ 1, ()t, 1),

    La primera es donada per la hipo`tesi dinduccio, com hem vist, la segona per lasubstitucio de la Y del cim de la pila per la paraula w donada per la produccioemprada, i la tercera, com en el cas anterior, correspon a lesborrat dels smbolsde (w)t dun en un de la pila mentre es llegeixen els mateixos smbols de w alentrada.

    Finalment, i un cop demostrada laltra direccio de la propietat, la qual recordamque hem deixat com a exercici per al lector, es te que, per a tota w ,

    w L(G) si i nomes si S wsi i nomes si (3, w, 1, S, 1) (3, w, |w|+ 1,, 1)

    (n1, w, |w|+ 1,, 1) (perque` la pila es buida) (nF , w, |w|+ 1,, 1) (perque` som al nal de lentrada)

    si i nomes si (1, w, 1,, 0) (3, w, 1, S, 1) (nF , w, |w|+ 1,, 1)si i nomes si w L(recG)

    i per conseguent L(recG) = L(G) = L.

    Es pot observar fa`cilment, raonant com a lauto`mat determinista de lExemple10.8, que lauto`mat amb pila indeterminista donat a la demostracio anterior nodona error en cap l dexecucio per a cap entrada possible.El teorema anterior es pot millorar, perque` la implicacio recproca tambe es

    vertadera.

    Teorema 10.12. Un llenguatge L es incontextual si i nomes si existeix qualqueauto`mat amb pila indeterminista P tal que L = L(P ).

  • Auto`mats amb pila 195

    No inclourem en aquest llibre la demostracio daquest teorema. El lector interes-sat la trobara` en molts llibres de llenguatges formals, com ara a [CM97], [HMU02]o [LP81]. Ara be, hem davisar el lector que vulgui consultar aquests textos quela sintaxi per als auto`mats amb pila que hem emprat en aquest llibre es estructu-rada, i que lhaura` de traduir a la notacio mes tradicional, que fa servir estats itransicions, que es la que trobara` als llibres esmentats.

    Recordant el que passava amb els programes, el lector podria creure que elsauto`mats amb pila indeterministes es poden determinitzar. Com ja hem avisat alprincipi daquest captol, aixo` es fals. Existeixen llenguatges acceptats per aquestsauto`mats que no es poden recone`ixer amb auto`mats amb pila deterministes. Nodonarem la demostracio detallada daquest fet, sino nomes la idea general.

    Suposem que existeix un auto`mat amb pila determinista P que accepta el llen-guatge {wwt | w (0 + 1)} de lExemple 10.7. Analitzem el comportament de Pquan processam paraules de la forma

    0n110n0m110m;

    observem que una paraula daquestes pertany al llenguatge donat si i nomes sin = m.

    Quan P llegeix la seque`ncia inicial de zeros 0n, i com que nomes disposa dunconjunt nit de smbols, cada un dels quals pot ocupar una casella de la pila, hademmagatzemar smbols a la pila de tal manera que pugui recordar el nombrede zeros que ha llegit. Quan llegeix 110n, ha de vericar que hi ha el mateixnombre de zeros en aquest boc que a la seque`ncia inicial, i aixo` nomes ho potfer buidant la pila (aquesta armacio intutiva requereix una prova formal difcil:ate`s, un altre cop, que P nomes te un conjunt nit de smbols, hi ha qualquealtre me`tode que pugui emprar un auto`mat amb pila determinista per comparardues seque`ncies iguals de zeros?). Ara, P ha llegit 0n110n. Si falta per llegir unaparaula ide`ntica, ha dacceptar, i en canvi, si falta per llegir 0m110m amb m = n,aleshores no ha dacceptar. Com que la pila es buida, no pot recordar el numero n ino pot recone`ixer correctament aquestes paraules. Aix doncs, aquest llenguatge nopot ser acceptat per cap auto`mat amb pila determinista, i per tant no tot llenguatgeincontextual pot ser acceptat per un auto`mat amb pila determinista. En canvi, jahem vist que tot llenguatge incontextual s que pot ser acceptat per un auto`matamb pila indeterminista.

    El fet que no siguin equivalents als auto`mats deterministes fa que els auto`matsamb pila indeterministes no es puguin implementar ecientment amb lordinador.Com a conseque`ncia daixo`, el seu intere`s nomes es teo`ric, ate`s que els auto`mats amb

  • 196 Auto`mats amb pila

    pila sestudien per la seva possible aplicacio al reconeixement ra`pid de sente`ncies dellenguatges, especialment de programacio. En realitat, els llenguatges incontextualsamb mes aplicacions son els deterministes, ja que, per a aquests, es poden construiranalitzadors molt ecients, com es fa en teoria de compiladors.Ate`s que, en darrera insta`ncia, un auto`mat amb pila es pot implementar amb un

    programa que faci servir un vector addicional per a la pila, el fet que tot llenguatgeincontextual es pugui recone`ixer amb un auto`mat amb pila indeterminista te coma conseque`ncia directa el resultat seguent.

    Proposicio 10.13. Tot llenguatge incontextual es semidecidible.

    A la pra`ctica es poden fer servir algorismes que saturen sempre tals que, donadesuna grama`tica incontextual i una paraula, decideixen si la paraula pertany o noal llenguatge generat per la grama`tica, com per exemple lanomenat algorisme deCocke-Younger-Kasami, i implementar aquests algorismes mitjancant programes.Lestudi daquests algorismes ultrapassa el nivell daquestes notes; el de Cocke-Younger-Kasami que hem esmentat el trobareu explicat a [BSA96]. Daltra banda,existeixen algorismes (que son part dels compiladors) molt ecients per a lana`lisisinta`ctica dels llenguatges de programacio. Per tant, el teorema anterior es potreforcar:

    Teorema 10.14. Tot llenguatge incontextual es decidible.

    El recproc del teorema anterior es fals.Proposicio 10.15. Existeixen llenguatges decidibles que no son incontextuals.

    Demostracio. El llenguatge {ww | w } no es incontextual (no ho demostrarem)pero` es decidible.

    Aix doncs, els auto`mats amb pila (i per conseguent, els auto`mats nits) sonmenys potents que els programes.

    Per acabar aquesta seccio, volem esmentar el resultat seguent, que tampoc nodemostrarem.

    Teorema 10.16. Per a tot alfabet , es te la inclusio CFLdet() CFLinamb().

    Si lalfabet te dues o mes lletres, la inclusio anterior es estricta. Un exemplenes el llenguatge L = {wwt | w {0, 1}}: es clarament inambigu, per exemple,gra`cies a la grama`tica denida per les produccions S 0S0 | 1S1 | , i ja hemcomentat a lExemple 10.7 que L no pot ser acceptat per un auto`mat amb piladeterminista.

  • Auto`mats amb pila 197

    10.3 Interseccio dun llenguatge incontextual i un de

    regular

    El lector potser recorda de la Nota 1.12 que la interseccio de dos llenguatges incon-textuals arbitraris no te per que` ser incontextual. En aquesta seccio mostrarem comes pot construir un auto`mat amb pila que reconegui la interseccio dels llenguatgesacceptats per un auto`mat amb pila i un AFD donats, la qual cosa en particulardemostrara` de manera constructiva que la interseccio dun llenguatge incontextuali un de regular sempre es incontextual La rao es que els auto`mats destats nits espoden implementar com a auto`mats de pila sense pila! (i, viceversa, els auto`matsde pila sense pila es poden representar mitjancant auto`mats destats nits). Abansde passar a la construccio general, vegem-ne un exemple.

    Exemple 10.17. Volem trobar un auto`mat amb pila que accepti el llenguatge

    L = {2 | , {0, 1}, || = ||, || es parell i ||0 es parell}.

    Aquest llenguatge L es la interseccio dels llenguatges

    L1 = {2 | , {0, 1}, || = ||},L2 = {2 | , {0, 1}, || i ||0 son parells}.

    El primer daquests llenguatges es incontextual i el segon regular. El nostre pla es,ara, trobar un auto`mat amb pila que reconegui L1 i un auto`mat nit deterministaque reconegui L2, i a partir daquests dos construir un nou auto`mat amb pila quereconegui la interseccio L.

    Basarem el disseny dun auto`mat amb pila que accepti L1 en lestrate`gia seguentper recone`ixer-ne les paraules: en un primer bucle, empilam una Z per cada lletrade lentrada abans del 2; quan arribi el smbol separador 2, sortim daquest bucle;a continuacio, en un bucle nou, desempilam una Z per cada lletra de lentrada;nalment, acceptam lentrada si lentrada sacaba exactament quan la pila es buida.Daquesta manera obtenim lauto`mat amb pila determinista seguent:

    programa rec_L1(ent)

    pila:tipus_pila

    1 mentre llegir(ent)=0 o llegir(ent)=1 fer

    2 empilar(pila,Z)

    3 dreta(ent)

    4 fmentre

  • 198 Auto`mats amb pila

    5 si llegir(ent)=2 llavors

    6 dreta(ent)

    7 mentre no buida(pila) i (llegir(ent)=0 o llegir(ent)=1) fer

    8 desempilar(pila)

    9 dreta(ent)

    10 fmentre

    11 si buida(pila) i llegir(ent)=# llavors

    12 escriure(accepta,1)

    13 fsi

    14 fsi

    15 fi

    Pel que fa al llenguatge L2, es acceptat per lAFD

    A = ({p0, p1, p2, p3}, {0, 1, 2}, A, p0, {p2})

    amb laplicacio de transicio A denida per

    A(p0, 0) = p1, A(p0, 1) = p1,A(p1, 0) = p0, A(p1, 1) = p0,A(p0, 2) = p2,A(p2, 0) = p3, A(p2, 1) = p2,A(p3, 0) = p2, A(p3, 1) = p3,

    i totes les altres transicions adrecades a un estat pou que ja no hem inclo`s pero` quea la construccio de lauto`mat amb pila que reconegui L1 L2 haurem de tenir encompte.

    p p

    pp

    0, 1

    0, 12

    0

    11

    0

    32

    0 1

    La idea ba`sica per combinar aquests dos auto`mats en un que accepti L1 L2 es:primer, traduir lAFD A en un auto`mat amb pila senzill que modiqui una variable

  • Auto`mats amb pila 199

    que guardara` lestat de lAFD; i segon, cridar aquest programa dins lauto`mat ambpila rec L1 cada cop que mogui el punter de lentrada a la dreta.

    Per comencar, aquest es lauto`mat amb pila que simula les modicacions destatsegons lAFD A:

    programa estat_seg(ent,estat)

    si llegir(estat)=p0 llavors

    si llegir(ent)=0 o llegir(ent)=1 llavors

    escriure(estat,p1)

    si_no

    si llegir(ent)=2 llavors

    escriure(estat,p3)

    fsi

    fsi

    si_no

    si llegir(estat)=p1 llavors

    si llegir(ent)=0 o llegir(ent)=1 llavors

    escriure(estat,p0)

    si_no

    escriure(estat,pou)

    fsi

    si_no

    si llegir(estat)=p2 llavors

    si llegir(ent)=0 llavors

    escriure(estat,p3)

    si_no

    si llegir(ent)=1 llavors

    escriure(estat,p2)

    si_no

    escriure(estat,pou)

    fsi

    fsi

    si_no

    si llegir(estat)=p3 llavors

    si llegir(ent)=0 llavors

    escriure(estat,p2)

    si_no

    si llegir(ent)=1 llavors

  • 200 Auto`mats amb pila

    escriure(estat,p3)

    si_no

    escriure(estat,pou)

    fsi

    fsi

    fsi

    fsi

    fsi

    fsi

    fi

    Amb la llarga`ria daquest programa podem observar que la sintaxi dels auto`matsnits es mes clara que la dels programes (ara be, amb la potent notacio dels pro-grames moderns tipus Java de la Nota 5.3, podrem reemplacar tot aquest auto`matper la instruccio estat = A.delta(estat,llegir(ent)), si la taula de lauto`matha estat llegida amb anterioritat a lobjecte A).

    I ara, escrivim un auto`mat amb pila que fa essencialment el mateix que feiarec L1, pero` ara amb cada dreta(ent) modica lestat de A segons la lletra delentrada que ha llegit i al nal accepta si lauto`mat amb pila original acceptava ia mes lestat de A es acceptador.

    programa rec_L(ent)

    pila:tipus_pila

    estat:simbol

    escriure(estat,p0)

    mentre llegir(ent)=0 o llegir(ent)=1 fer

    empilar(pila,Z)

    estat_seg(ent,estat)

    dreta(ent)

    fmentre

    si llegir(ent)=2 llavors

    estat_seg(ent,estat)

    dreta(ent)

    mentre no buida(pila)=0 i (llegir(ent)=0 o llegir(ent)=1) fer

    desempilar(pila)

    estat_seg(ent,estat)

    dreta(ent)

    fmentre

  • Auto`mats amb pila 201

    si buida(pila) i llegir(ent)=# llavors

    escriure(accepta,1)

    fsi

    fsi

    si llegir(estat)/=p2 llavors

    escriure(accepta,0)

    fsi

    fi

    El lector pot trobar aquesta solucio molt llarga, pero` te lavantatge de ser sis-tema`tica: com veurem al teorema seguent, aquesta construccio sempre es pot por-tar a terme a partir dun auto`mat amb pila (determinista o indeterminista) i unauto`mat nit determinista donats. Com es usual amb els me`todes generals, espossible que en un exemple concret aquesta construccio generi situacions que maino es facin servir; per exemple, en el nostre cas, dins el segon bucle de lauto`matde pila es impossible que lestat sigui p0 o p1 i, tanmateix, la crida a estat segsempre demanara` per ells abans de demanar per p2 o p3. Es possible, tambe, quelauto`mat amb pila continu processant la paraula encara que lestat de lauto`matja sigui a lestat pou.

    Es clar que si rec L1 no dona errors, aleshores rec L tampoc: com que estat segno toca per a res la pila, no pot generar cap error. Daltra banda, per demostrarque rec L realment reconeix L, basta demostrar que tant rec L1 com A reconeixenels llenguatges que hem dit que reconeixien. Deixam com a exercici per al lector lavericacio de lauto`mat A. Pel que fa a la vericacio de lauto`mat amb pila, hemdesperar ns al proper captol, on donarem les eines per fer-ho.

    Ara podem passar al teorema.

    Teorema 10.18. Per a cada auto`mat de pila indeterminista P i cada auto`mat nitdeterminista A, podem construir un auto`mat amb pila que reconeix el llenguatgeL(P ) L(A).

    Demostracio. Siguin P = (,, p) i A = (Q,, , q0, F ) un auto`mat de pila indeter-minista i un auto`mat nit determinista, respectivament. Construirem un auto`matamb pila P = (, Q, p) que reconegui el llenguatge L(P ) L(A). Per fer-ho,emprarem lestrate`gia de lexemple anterior. El nou programa P tindra` una novavariable estat duna sola casella on emmagatzemara` lestat de A. Aquesta varia-ble sera` controlada per una rutina estat seg que anira` canviant el valor destat

  • 202 Auto`mats amb pila

    (q,), on el valor q Q es lestat de A que en cada moment conte la variableestat i es la lletra que llegeix el punter de lentrada.Suposem per xar idees que Q = {q0, . . . , qm} i que representam al programa

    cada qi amb el corresponent qi, i que F = {qk, . . . , qm}. Suposem tambe que = {1, . . . ,n} i que representam cada j al programa amb el corresponentsigmaj. Finalment, indiquem cada (qi,j) al programa amb q ij (per a cada especca, en lloc de q ij posarem el seu valor de veritat). El programa estattindra`, llavors, laspecte seguent:

    programa estat_seg(ent,estat)

    si llegir(estat)=q1 llavors

    si llegir(ent)=sigma0 llavors

    escriure(estat,q_10)

    si_no

    si llegir(ent)=sigma1 llavors

    escriure(estat,q_11)

    si_no

    si llegir(ent)=sigma2 llavors

    escriure(estat,q_12)

    si_no

    ...

    si llegir(ent)=# llavors

    escriure(estat,q1)

    fsi

    ...

    fsi

    fsi

    fsi

    fsi

    si llegir(estat)=q2 llavors

    si llegir(ent)=sigma0 llavors

    escriure(estat,q_20)

    si_no

    si llegir(ent)=sigma1 llavors

    escriure(estat,q_21)

    si_no

    ...

    si llegir(ent)=# llavors

  • Auto`mats amb pila 203

    escriure(estat,q2)

    fsi

    ...

    fsi

    fsi

    fsi

    ...

    si llegir(estat)=qm llavors

    si llegir(ent)=sigma0 llavors

    escriure(estat,q_m0)

    si_no

    si llegir(ent)=sigma1 llavors

    escriure(estat,q_m1)

    si_no

    ...

    fsi

    fsi

    fsi

    fi

    Comparau-lo amb el donat al darrer exemple. En aquell cas, no tenem en comptela possibilitat que lauto`mat rec L1 llegs el blanc, perque` precisament en fer-hoera quan saturava i no executava cap altre dreta(ent). Pero` en general no sabemsi P llegira` blancs abans daturar-se, i per tant simplement fem que els blancs nocanvin lestat (ja que, des del punt de vista de lauto`mat nit, ja sha acabat dellegir lentrada).

    Aleshores, el nou programa P sobte inserint al programa P , just davant de cadainstruccio dreta(ent), una crida a estat seg(ent,estat). A mes, just abans delfi de P inserim les instruccions seguents, que fan que la paraula dentrada siguillegida completament, com ho faria A abans dacceptar, i que el valor de la variableaccepta tingui en compte tambe si en aturar-se P lAFD A ha arribat a un estatacceptador:

    mentre llegir(ent)/=# fer

    estat_seg(ent,estat)

    dreta(ent)

    fmentre

    si llegir(estat)/=qk i ... i llegir(estat)/=qm llavors

  • 204 Auto`mats amb pila

    escriure(accepta,0)

    fsi

    on, recordem, qk,. . . ,qm representen els estats acceptadors de A.

    Diguem una conguracio estesa de P a una estructura (n,, l, p, q, r), on (n,, l,p, r) es una conguracio de lauto`mat amb pila P en el sentit usual i q Q es elvalor de la variable estat en el moment representat per la conguracio. Si sobreaquesta conguracio estesa executam el programa estat seg, la nova conguraciotindra` la forma (n,, l, p, (q,), r), on , com sempre, es el smbol l-e`sim delentrada i n es la posicio de P en la qual acaba la rutina estat seg que comencaen la posicio n. Cap altra instruccio de P no modica el valor de q, i nomesmodica la part (n,, l, p, r) de la manera usual.Llavors, es pot demostrar per induccio que, per a tots , w,, tals que = w,

    i per a tota posicio n del programa P que no sigui la dun dreta(ent) ni la de fi,es te que

    (q0,) (q,) en A i (1,, 1,, 0) (n,, |w|, p, r) a P si i nomes si(1,, 1,, q0, 0) (n,, |w|, p, q, r) a P ,

    on n es la posicio al programa P de la instruccio corresponent a la instruccio n alprograma P . Notem que la nova posicio n esta` completament determinada, perque`les instruccions inserides al programa P estan xades pel mateix P i la longituddel programa estat seg.

    Deixam com a exercici per al lector els detalls daquesta demostracio per induccio,i que comprovi que aquesta equivale`ncia implica que P reconeix L(A)L(P ).

    10.4 Jerarquia de llenguatges

    Als captols anteriors hem introdut diverses classes de llenguatges i hem establertla relacio entre aquestes. El diagrama de la Figura 10.1 representa aquesta relacio, imostra la situacio dels llenguatges de laturada Lat, universal LU i els seus comple-mentaris, a mes de la dalguns llenguatges paradigma`tics sobre = {0, 1}, com araL1 = 0

    10, L2 = {0n10n | n 0}, L3 = {wwt | w } i L4 = {ww | w }.

  • Auto`mats amb pila 205

    1

    semidecidible

    LL

    L

    decidible

    incontextual

    deterministaincontextual

    regular

    23

    4U

    UC

    at Cat

    L LL

    L

    L

    Figura 10.1: Una jerarquia de llenguatges.

    10.5 Exercicis

    10.1. Per a cada una de les grama`tiques de lExercici 1.2, trobau un auto`mat ambpila que accepti el llenguatge que genera.

    10.2. Completau la demostracio del Teorema 10.11.

    10.3. Cercau un auto`mat amb pila que accepti el llenguatge

    {0n1n | n 1} {0n12n | n 1}.10.4. Cercau un auto`mat amb pila que accepti el conjunt dexpressions aritme`-tiques generat per la grama`tica seguent:

    E S + E | SS F S | FF (E) | 1 | 0

  • 206 Auto`mats amb pila

    10.5. Suposem que imposam sobre els auto`mats amb pila deterministes la con-dicio que la pila no pot contenir paraules de mes de 100 smbols. Hi ha qualquellenguatge que els auto`mats amb pila normals puguin recone`ixer pero` aquests nousno? Hi ha qualque llenguatge que aquests auto`mats nous puguin recone`ixer pero`els auto`mats nits no? Justicau les vostres respostes.

    10.6. Proposau una denicio dauto`mat amb dues piles (i una entrada). Hi haqualque llenguatge que pugui ser reconegut per un auto`mat amb dues piles da-quests, pero` que no sigui incontextual? Hi ha qualque llenguatge semidecidibleque no pugui ser reconegut per cap auto`mat amb dues piles? Justicau les vostresrespostes.

    10.7. Demostrau que les paraules amb un nombre parell de smbols + i que sonexpressions aritme`tiques amb exponents denides per la grama`tica seguent, formenun llenguatge incontextual determinista:

    E S + E | SS F S | FF BF | BB (E) | 1 | 0