13.07.2015 Views

Autómatas de Pila y Máquinas de Turing Estructurados Jairo Rocha

Autómatas de Pila y Máquinas de Turing Estructurados Jairo Rocha

Autómatas de Pila y Máquinas de Turing Estructurados Jairo Rocha

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

334 Fundamentos teóricos <strong>de</strong> la informáticaprograma doblar(w)v: vectormientras leer(w) /= # hagaescr(v,leer(w))<strong>de</strong>r(w)<strong>de</strong>r(v)fmientrasizq(v)mientras leer(v) /= # hagaizq(v)fmientras<strong>de</strong>r(v)mientras leer(v) /= # hagaescr(w,leer(v))<strong>de</strong>r(w)<strong>de</strong>r(v)fmientrasizq(w)mientras leer(w) /= # hagaizq(w)fmientras<strong>de</strong>r(w)escr(acepta,1)finNotemos que esta solución es conceptualmentemás simple que la que podríamos dar si únicamenteusáramos un vector.Ejemplo 6. Más a<strong>de</strong>lante usaremos el siguiente programaque copia el contenido <strong>de</strong>l primer vector al segundoy aparca los punteros (los <strong>de</strong>ja en la primeracasilla):programa copiar(ent,copia)mientras leer(ent) \= # hagaescr(copia,leer(ent))<strong>de</strong>r(ent)<strong>de</strong>r(copia)fmientrasizq(ent)izq(copia)mientras leer(ent) \= # hagaizq(ent)izq(copia)fmientras<strong>de</strong>r(ent)<strong>de</strong>r(copia)finComo antes, se pue<strong>de</strong> <strong>de</strong>finir una configuraciónque en este caso contendrá información sobre cadauno <strong>de</strong> los vectores.Para <strong>de</strong>mostrar que los lenguajes que pue<strong>de</strong>n serreconocidos con programas multivector son exactamentelos semi<strong>de</strong>cidibles, es necesario traducir unprograma en uno <strong>de</strong> sólo un vector. La traducciónconsiste en <strong>de</strong>finir una estructura <strong>de</strong> datos sobre unvector que pueda simular el conjunto finito <strong>de</strong> vectores<strong>de</strong> un programa multivector dado. Aquí preferimosapelar a la intuición y la experiencia en programación<strong>de</strong> los estudiantes, y pedirles que se convenzanque es posible <strong>de</strong>finir instrucciones para un vectorque traduzca cada instrucción <strong>de</strong>l programa multivectoren instrucciones sobre el vector único (estatraducción es automática). A<strong>de</strong>más, el nuevo programa<strong>de</strong> un solo vector <strong>de</strong>bería <strong>de</strong>jar, al <strong>de</strong>tenerse, uncontenido sobre el vector análogo al que <strong>de</strong>ja el programaoriginal sobre el primer vector y los dos <strong>de</strong>beríanaceptar exactamente las mismas entradas.La <strong>de</strong>mostración formal <strong>de</strong> la equivalencia entrelos programas multivector y los <strong>de</strong> un único vector esmuy larga, y a<strong>de</strong>más creemos que poco interesante,así que se omite. De hecho, se trata <strong>de</strong> un ejercicio <strong>de</strong>representación <strong>de</strong> una estructura en otra más simple,y con seguridad el estudiante tendrá la oportunidad<strong>de</strong> hacer ejercicios <strong>de</strong> este tipo más útiles en un curso<strong>de</strong> estructuras <strong>de</strong> datos. El estudiante interesado queno quiera, o no pueda, hacer la <strong>de</strong>mostración rigurosasolo, la encontrará en muchos libros <strong>de</strong> autómatas ylenguajes formales como, por ejemplo, [1].2.3. Programas que llaman otros programasPara simplificar los programas, se utiliza <strong>de</strong> manerasistemática un recurso que nos permite el uso <strong>de</strong>un programa <strong>de</strong>ntro <strong>de</strong> otro programa. Este recursose correspon<strong>de</strong>, en el mundo <strong>de</strong> los lenguajes <strong>de</strong> programación,a cuando una rutina llama otra rutina; la<strong>de</strong>finición dada aquí es más simple.Suponemos que el programa llamado rutina2en la posición n tiene la llamadarutina1(v1,...,ve)don<strong>de</strong> v1,...,ve son vectores diferentes <strong>de</strong>l programarutina2. Si el programa rutina1 tiene elencabezadoprograma rutina1(x1,...,xe)y1,...,ym:vector


XI Jornadas <strong>de</strong> Enseñanza Universitaria <strong>de</strong> la Informática 335entonces la llamada es una abreviación <strong>de</strong> insertaren la posición n todas las instrucciones (excepto elfin) <strong>de</strong>l programa rutina1 don<strong>de</strong> previamentese han reemplazado todas las ocurrencias <strong>de</strong> cadauna <strong>de</strong> las variables x1,...,xe por v1,...,ve,respectivamente; a<strong>de</strong>más, todas las ocurrencias <strong>de</strong>y1,...,ym han <strong>de</strong> ser reemplazadas por otro nombresi hay un vector <strong>de</strong> rutina2 que tenga el mismonombre; finalmente, se supone que los vectoresy1,...,ym (con su nuevo nombre si es necesario)son <strong>de</strong>clarados al programa rutina2.En realidad, con la <strong>de</strong>finición anterior, las llamadasno se hacen en el momento <strong>de</strong> la ejecución sinoque representan un cambio en el programa que hacela llamada. A<strong>de</strong>más, todos los vectores <strong>de</strong> entrada <strong>de</strong>lprograma llamado son compartidos por los dos programas;la variable acepta también es compartida.2.4. Lenguajes in<strong>de</strong>cidiblesEn esta sección mostraremos cómo se <strong>de</strong>finen problemasque no se pue<strong>de</strong>n resolver mediante programas.Como escribiremos programas que tienen por entradaotros programas y ésta tiene que ser una palabrabinaria, tenemos que codificar los programas mediantepalabras sobre {0, 1}; notemos que los programas<strong>de</strong> or<strong>de</strong>nador reales ya están codificados enbinario usando el código ASCII. Se usa aquí la mismacodificación y <strong>de</strong>nota la palabra binaria querepresenta el programa P .La codificación <strong>de</strong> expresiones por números fue unconcepto muy nuevo hace setenta años, y tiene el origenen la codificación <strong>de</strong> Gö<strong>de</strong>l <strong>de</strong> fórmulas aritméticaspor medio <strong>de</strong> números. Hoy en día, no sólo es quelos programas son códigos, sino que estamos acostumbradosa que toda la información sobre personas,aviones, relaciones, imágenes, sonido, etc., esté codificadapor números, porque <strong>de</strong> otra manera no sepodría introducir en el or<strong>de</strong>nador.Tenemos el resultado siguiente que muestra que noes posible <strong>de</strong>cidir si la ejecución <strong>de</strong> un programa dadosobre una palabra dada se parará o no, es <strong>de</strong>cir, elproblema <strong>de</strong> la parada no es <strong>de</strong>cidible.Teorema 7. El lenguaje <strong>de</strong> la paradaL p = { &w | P se para con entrada w}no es <strong>de</strong>cidible.Demostración. La i<strong>de</strong>a <strong>de</strong> la <strong>de</strong>mostración es suponerque existe un programa llamado sePara(p,w)(el primer parámetro son los bits antes <strong>de</strong>l &, y elsegundo, los <strong>de</strong> <strong>de</strong>spués) que se para siempre y reconoceel lenguaje <strong>de</strong> la parada, y emplearlo para construirun programa prueba(q) con el que seParano funciona bien, lo que nos lleva a una contradicción.Sea, entonces, el siguiente programa:programa prueba(q)q1:vectorcopiar(q,q1)sePara(q,q1)si leer(acepta) \= 1 llavorsescr(acepta,1)si_nomientras 0 = 0 hagafmientrasfsifiSuponemos que llamamos prueba()(es <strong>de</strong>cir, q contiene como entrada).Si sePara(,) aceptala entrada, entonces prueba() entraen un bucle infinito. Esto quiere <strong>de</strong>cir queprueba() no se para y, por tanto,sePara(,) no <strong>de</strong>bería haberaceptado.Entonces, sePara(,)no acepta la entrada pero se paraya que siempre se para; entonces,prueba() acepta la entrada y separa, y sePara(,) <strong>de</strong>beríahaber aceptado.Como ambos casos son imposibles, el programasePara(p,w) no pue<strong>de</strong> existir.3. Autómatas <strong>de</strong> pilaInformalmente, un autómata <strong>de</strong> pila es un programacon un vector, ent, para la entrada y un vector,pila, para hacer operaciones con una pila. Los autómatas<strong>de</strong> pila son programas restringidos: primero, elvector <strong>de</strong> entrada no pue<strong>de</strong> ser cambiado ni el punterose pue<strong>de</strong> mover a la izquierda; segundo, el vector<strong>de</strong> la pila pue<strong>de</strong> ser manipulado únicamente con lasoperaciones <strong>de</strong>finidas más a<strong>de</strong>lante que impi<strong>de</strong>n leerlas casillas a la <strong>de</strong>recha <strong>de</strong>l puntero.


336 Fundamentos teóricos <strong>de</strong> la informáticaLos tres objetivos para enseñar autómatas <strong>de</strong> pilason: apren<strong>de</strong>r a usar autómatas <strong>de</strong> pila, hacer unreconocedor <strong>de</strong> programas que es útil a la hora <strong>de</strong> escribirprogramas que interpretan programas (programasuniversales), y ver más aplicaciones prácticas <strong>de</strong>programas.Definición 8 (Autómata <strong>de</strong> pila). Un autómata <strong>de</strong>pila se <strong>de</strong>fine como un programa <strong>de</strong> dos vectores, el<strong>de</strong> entrada y el <strong>de</strong> la pila. Se permiten solamente dosoperaciones en el vector <strong>de</strong> entrada: leer(ent) y<strong>de</strong>r(ent); en el vector pila se permiten las operacionesbásicas siguientes:vacía() que tiene el valor 1 si la pila está vacía,cima() que tiene el valor <strong>de</strong> la cima <strong>de</strong> la pila y no lamodifica,<strong>de</strong>sapila() que <strong>de</strong>sapila el símbolo <strong>de</strong> la cima <strong>de</strong> lapila, yapila_pal(w) que aña<strong>de</strong> a la pila cada uno <strong>de</strong> lossímbolos <strong>de</strong> una palabra w <strong>de</strong> manera or<strong>de</strong>nada,<strong>de</strong>jando el primer símbolo <strong>de</strong> la palabra a lacima <strong>de</strong> la pila.A<strong>de</strong>más, permitimos dos extensiones <strong>de</strong> la sintaxis:1. las condiciones <strong>de</strong> las instrucciones si ymientras pue<strong>de</strong>n contener operadores <strong>de</strong>conjunción y disyunción, y2. pue<strong>de</strong>n haber otras variables <strong>de</strong> una sola casillaque se pue<strong>de</strong>n leer y modificar <strong>de</strong> la mismaforma que la variable acepta.Las últimas extensiones nos permiten escribir programasmás claros aunque se podrían simular usandola variable acepta con muchos símbolos que representenotras variables y resultados <strong>de</strong> combinaciones<strong>de</strong> expresiones.Si la pila es vacía, el valor <strong>de</strong> cima es # y<strong>de</strong>sapila no tiene ningún efecto.Las configuraciones <strong>de</strong> programas nos permitenrepresentar los contenidos <strong>de</strong> la entrada y <strong>de</strong> la pila.Por ejemplo, con la instrucción apila_pal(abc)tenemos el paso(n, abc<strong>de</strong>, 3, Zfg, 3, 0) ⊢(n + 1, abc<strong>de</strong>, 3, Zfgcba, 6, 0)ya que la cima <strong>de</strong> la pila la representamos a la posiciónmás a la <strong>de</strong>recha. Es <strong>de</strong>cir, cima() tiene el valora en la última configuración, y <strong>de</strong>sapila() <strong>de</strong>rivaa la configuración (n+2, abc<strong>de</strong>, 3, Zfgcb, 5, 0).Ejemplo 9. Consi<strong>de</strong>remos el lenguajeL 2 = {w2w t | w ∈ {0, 1} ∗ }.Un programa con pila para este lenguaje es:programa rec_w2wt(ent)pila:vectorescr(acepta,1)mientras leer(ent) /= 2y leer(ent) /= # hagaapila_pal(leer(ent))<strong>de</strong>r(ent)fmientrassi leer(ent) = 2 ent<strong>de</strong>r(ent)si_noescr(acepta,0)fsimientras vacía() = 0y cima()=leer(ent) haga<strong>de</strong>sapila()<strong>de</strong>r(ent)fmientrassi vacía() = 0 o leer(ent) \= # entescr(acepta,0)fsifinCon el fin <strong>de</strong> <strong>de</strong>finir automatas <strong>de</strong> pila no <strong>de</strong>terministas<strong>de</strong>finimos instrucciones no <strong>de</strong>terministas, unaintroducción sencilla al paralelismo.Definición 10 (Programa in<strong>de</strong>terminista). Un programano <strong>de</strong>terminista, o in<strong>de</strong>terminista, es un programadon<strong>de</strong> se permiten instrucciones <strong>de</strong> la formaparaleloS1 con S2 con ... con Smfparalelodon<strong>de</strong> S1, S2, ..., Sm son instrucciones.La semántica intuitiva es que una configuraciónque ejecuta un bloque <strong>de</strong> paralelismo se convierte enm configuraciones in<strong>de</strong>pendientes, todas iguales endatos excepto por la posición <strong>de</strong> la siguiente instruccióna ejecutar: cada configuración i-ésima comienza


XI Jornadas <strong>de</strong> Enseñanza Universitaria <strong>de</strong> la Informática 337en la posición <strong>de</strong> S i. Estas configuraciones generanm hilos <strong>de</strong> ejecución in<strong>de</strong>pendientes y, como es costumbreen los autómatas in<strong>de</strong>terministas, si uno <strong>de</strong>ellos acepta la entrada se dice que el programa aceptala entrada.Ejemplo 11. Queremos construir un programa queimplemente un autómata <strong>de</strong> pila para el lenguaje <strong>de</strong>la gramáticaP → pBfB → IB | λI → i | sBg | mBh.Esta gramática es una simplificación <strong>de</strong> la <strong>de</strong> los bloques<strong>de</strong> un programa y por eso tiene gran importancia.Usando el teorema que permite construir un autómata<strong>de</strong> pila no <strong>de</strong>terminista para una gramática[4, 1], tenemos el siguiente programa in<strong>de</strong>terminista.Una variable <strong>de</strong> la cima <strong>de</strong> la pila se reemplazapor cada una <strong>de</strong> sus posibles partes <strong>de</strong>rechas. Hay unhilo <strong>de</strong> ejecución diferente e in<strong>de</strong>pendiente para cadaposible reemplazo.programa recProg(ent)pila:vector1 escr(acepta,1)2 apilar(P)3 mientras vacía()=0 yleer(acepta)=1 haga4 si cima() = P ent5 <strong>de</strong>sapila()6 apila_pal(pBf)7 si_no8 si cim() = B ent9 <strong>de</strong>sapila()10 paralelo11 apila_pal(IB)12 con13 fparalelo14 si_no15 si cim() = I ent16 <strong>de</strong>sapila()17 paralelo18 apila_pal(i)19 con20 apila_pal(sBg)21 con22 apila_pal(mBh)23 fparalelo24 si_no25 si cim() en {p,f,i,s,g,m,h} ent26 si cim() = leer(ent) ent27 <strong>de</strong>sapila()28 <strong>de</strong>r(ent)29 si_no30 escr(acepta,0)31 fsi32 fsi fsi fsi fsi36 fmientras37 si leer(ent) /= # ent38 escr(acepta,0)39 fsi40 findon<strong>de</strong> el con <strong>de</strong> la instrucción 12 no hace nada porqueno se tiene que apilar nada en el caso B → λ.Aunque es una solución simple y directa basadaen la gramática es muy ineficiente por el no <strong>de</strong>terminismo.En este caso, es posible dar un programa<strong>de</strong>terminista que reconozca el lenguaje haciendo unaobservación importante: si se pue<strong>de</strong> <strong>de</strong>terminar cuál<strong>de</strong> las producciones se tiene que usar, en función <strong>de</strong>la entrada, entonces el bloque <strong>de</strong> paralelismo se pue<strong>de</strong>evitar.Nos <strong>de</strong>tenemos aquí esperando haber convencidoal lector <strong>de</strong> la facilidad <strong>de</strong> entendimiento que programascomo los anteriores tienen, en contraste con lastransiciones con estados las cuales requieren un dobleesfuerzo.4. DiscusiónHemos <strong>de</strong>finido equivalentes estructurados <strong>de</strong> máquinas<strong>de</strong> <strong>Turing</strong>, máquinas <strong>de</strong> <strong>Turing</strong> in<strong>de</strong>terministasy autómatas <strong>de</strong> pila. Las <strong>de</strong>finiciones permiten darlos mismos resultados teóricos tradicionales pero conla motivación adicional <strong>de</strong> ser más accesibles para losestudiantes <strong>de</strong>bido a su carácter estructurado.Estos conceptos se han usado por primera vez enuna asignatura <strong>de</strong> autómatas y lenguajes formales <strong>de</strong>este año. El resultado ha sido interesante: los estudiantesestán activos y atentos a hacer comentariossobre mejoras al programa o dudas sobre las operaciones;los estudiantes se sienten seguros al hacerpreguntas y comentarios. A<strong>de</strong>más, durante la <strong>de</strong>mostración<strong>de</strong> la in<strong>de</strong>cidibilidad <strong>de</strong>l problema <strong>de</strong> la parada,la contradicción les parecía que se <strong>de</strong>bía a una especie<strong>de</strong> error <strong>de</strong> programación superable porque no


338 Fundamentos teóricos <strong>de</strong> la informáticaveían ningún problema en los programas. Es <strong>de</strong>cir,la <strong>de</strong>mostración es tan directa que salta a la vista lacontradicción y choca con la intuición. Todo esto encontraste con su pasividad tradicional cuando se hacela <strong>de</strong>mostración numerando máquinas <strong>de</strong> <strong>Turing</strong>.Existen varios libros y artículos que hacen intentos<strong>de</strong> dar versiones para programadores <strong>de</strong> la teoría<strong>de</strong> la computación. Por ejemplo, Morales y otros [3]<strong>de</strong>finen un máquina contadora estructurada; el problema<strong>de</strong> usar enteros positivos como estructura básicaes que el manejo <strong>de</strong> programas codificados noes natural; a<strong>de</strong>más, no es un buen mo<strong>de</strong>lo en teoría<strong>de</strong> la complejidad porque no es natural suponer queen un paso se pue<strong>de</strong> incrementar un entero. El mejorlibro con un enfoque mo<strong>de</strong>rno es, sin duda, el <strong>de</strong>Jones [2]; no es, sin embargo, un libro <strong>de</strong> autómatassino <strong>de</strong> teoría <strong>de</strong> la computación en cuyo prefacio seapuesta por un enfoque a la computabilidad que evitelas máquinas <strong>de</strong> <strong>Turing</strong> y las funciones primitivasrecursivas y use las estructuras <strong>de</strong> datos mo<strong>de</strong>rnas <strong>de</strong>Lisp y la semántica <strong>de</strong>notacional <strong>de</strong> programas.No conocemos ningún libro que presente los resultadosteóricos <strong>de</strong> autómatas <strong>de</strong> pila con un enfoqueestructurado como el dado aquí.Referencias[1] J. Hopcroft, R. Motwani, J. Ullman. Introduccióna la teoría <strong>de</strong> autómatas, lenguajes y computación.Addison-Wesley, 2002.[2] N. Jones. Computability and Complexity: Froma Programming Perspective, MIT press, 1997.[3] R. Morales et al. Una alternativa docente a lamáquina <strong>de</strong> <strong>Turing</strong>, Memorias <strong>de</strong> JENUI 2003,pp 249-258, Ed. Thomson.[4] J. <strong>Rocha</strong>, F. Roselló Autòmatas, Gramàtiques iProgrames: Verificació i Concurrència , MaterialsDidàctics, UIB, 2a ed. en imprenta, 2005.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!