Autómatas, Gramáticas y Lenguajes Formales Problemas Resueltos
Autómatas, Gramáticas y Lenguajes Formales Problemas Resueltos
Tomás García Saiz Elena Gaudioso Vázquez
sanz y torres
AUTÓMATAS. GRAMÁTICAS Y LENGUAJES FORMALES: PROBLEMAS RESUELTOS Todos los derechos reservados. Queda prohibida, salvo excepción prevista en la ley, cualquier forma de reproducción, distribución, comunicación pública y transformación de esta obra sin contar con la autorización de los autores y/o editores. La infracción de los derechos mencionados puede ser constitutiva de delito contra la propiedad intelectual.
© Tomás García Saiz y Elena Gaudioso Vázquez
© EDITORIAL SANZYTORRES, S. L. cl Pinos Alta, 49 - 28029 Madrid ~902400415-913145599
www.sanzytorres.com
[email protected] www.sanzytorres.com/editorial
[email protected] ISBN: 978-84-92948-36-9 Depósito legal: M-52021-2010 Portada: Iván Pérez López Composición: Autores Impresión y encuadernación: FER Fotocomposición, cl Alfonso Gómez, 38, 3° C, 28037 Madrid
índice
1. Autómatas Finitos, Lenguajes, Gramáticas y Expresiones Regulares 1.1. Base Teórica. . . . . 1.2. Problemas resueltos . . . . . . . . . . . . . . . . . . . . . . . . . 2. Autómatas a Pila, Lenguajes y Gramáticas Independientes del Contexto 2.1. Base Teórica. . . . . 2.2. Problemas resueltos .
1 1 5 59 59 63
3. Máquinas de Thring 3.1. BaseTeórica.. 3.2. Problemas resueltos.
121 121 127
Referencias
165
1
índice de figuras
1.1. 1.2. 1.3. lA.
Ejemplo de transiciones en un autómata finito regular . . . . . . . . . . .. Ejemplo de transiciones a un estado de error . . . . . . . . . . . . . . . .. Diagrama con las transiciones entre los estados de aceptación y el nodo error Diagrama parcial del autómata que procesa los cinco primeros símbolos de una cadena . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.5. Primeros estados definidos para el autómata que reconoce el lenguaje L del ejercicio 1.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 1.6. Autómata finito parcial que reconoce el lenguaje L del ejercicio 1.2 . . . . 1.7. Autómata finito no determinista que reconoce el lenguaje del enunciado 1.2 1.8. Gramática que genera el lenguaje del ejercicio 1.2 . .. . . . . . . . . . .. 1.9. Autómata que reconoce la codificación de un número binario . . . . . . .. 1.10. Autómata que reconoce los operadores matemáticos, los paréntesis y los corchetes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.11. Autómata correspondiente al analizador léxico de una calculadora binaria 1.12. Estados del autómata que reconoce palabras que contienen las 5 vocales. 1.13. Transiciones del estado {aiu} . . . . . . . . . . . . . . . . . . . . . . . 1.14. Diagrama parcial del autómata que reconoce palabras que contienen las 5 vocales . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.15. Ejemplo de un autómata finito no determinista. . . . . . . . . . 1.16. Representación gráfica de un autómata finito no determinista . . 1.17. Diagrama de transiciones de un autómata finito no determinista . 1.18. Representación gráfica de los estados del autómata finito determinista equivalente al autómata finito no determinista de la figura 1.16 . . . . . 1.19. Transiciones deterministas obtenidas a partir de la transición (A, z, e). . III
6 6 8 9 14 14 15 18 20 20 21 26 27 28 33 34 36 37 37
1.20. Transiciones deterministas obtenidas a partir de la transición (B, y, e).. .. 1.21. Transiciones deterministas definidas a partir de las transiciones (A, x, A) y (A, x, B). . . . . . . . . . . . . . . 1.22. Autómata finito determinista . . . . . . . . . . 1.23. Autómata finito que reconoce e1lenguaje xy*x. 1.24. Autómata finito que reconoce el lenguaje x*yx* 1.25. Autómata finito que reconoce el lenguaje (xy*x).U (x*yx*) . 1.26. Autómata que reconoce el lenguaje (xy*x) . (x*yx*) 1.27. Autómata que reconoce múltiples repeticiones de las cadenas del lenguaje
38
xy*x . . . . . . . . . . . . . . . . . . . . . . 1.28. Autómata que reconoce el lenguaje (xy* x) *. . . . . . . 1.29. Autómata finito que reconoce el lenguaje xy ..... . 1.30. Autómata que reconoce el lenguaje ((xy*x)* U x*yx*) 1.31. Autómata que reconoce el lenguaje (xy. ((xy*x)* U (x*yx*))) 1.32. Autómata que reconoce el lenguaje (xy . ((xy*x)* U (x*yx*)) . xy) . 1.33. Autómata siwplificado que reconoce el lenguaje (xy· ((xy*x)* U (x*yx*))· xy) 1.34. Autómata finito que no reconoce la cadena xzxx .....
44 44 45 46 46 47 47 49 49 51 51 52 52 52
1.35. Autómata finito que reconoce el lenguaje del ejercicio 1.11 1.36. Autómata finito que reconoce el lenguaje (xy)* .. 1.37. Autómata finito que reconoce el lenguaje (xz U y) .... . 1.38. Autómata finito que reconoce el lenguaje (zz)* ..... . 1.39. Autómata finito que reconoce el lenguaje (xy)*(xz U y)(zz)* 1.40. Autómata finito simplificado que reconoce el lenguaje (xy)*(xz U y)(zz)* 1.41. Autómata finito que reconoce el lenguaje L = {wl w tiene un número par de
x} . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.42. Autómata finito que reconoce el lenguaje que contiene las cadenas con un número impar de x's . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 1.43. Autómata finito que resulta de la concatenación de los autómatas de las figuras 1.42 y 1.41 . . . . . . . . . . . . . . . . . . 1.44. Autómata finito que reconoce el lenguaje :B* . . . . . . . . . . . . . . . . 1.45. Autómata finito que reconoce el lenguaje (x U y)*xy . . . . . . . . . . . 1.46. Autómata finito que reconoce el lenguaje complementario de (x U y)*xy . 1.47. Autómata finito que reconoce el lenguaje {x, xy} . . . . . . . . . . . .. 1.48. Autómata finito que reconoce el lenguaje formado por la cadena vacía . . 1.49. Autómata finito que reconoce el lenguaje compuesto por todas las cadenas distintas de la cadena vacía . . . . . . . . . . . . . . . . . . . . . .. IV
38 39
40 41 42 43
54 54 55 56 56 57 57 58 58
2.1. Relación entre los lenguajes independientes del contexto deterministas, no deterministas y los lenguajes regulares.. . . . . . . . . . . . . . . . . . 2.2. Autómata a pila que reconoce el lenguaje {xnyn : n E N+}. . . . . . . 2.3. Autómata a pila que reconoce el lenguaje {xnym zP, m = n + p, O <
61 64
m,n,pEN}...............................
68
2.4. Ejemplo de las transiciones posibles cuando se lee una x de la entrada. . 70 2.5. Autómata que reconoce cadenas con un mismo número x's e y's. . . . . 71 2.6. Autómata finito regular que reconoce cadenas con al menos una consonante, una vocal y un número . . . . . . . . . . . . . . . . . . . . . . . . . . .. 73 2.7. Autómata a pila que reconoce el lenguaje formado por todas las cadenas que contienen al menos una consonante, una vocal y un número. 76 2.8. Autómata del analizador sintáctico LL(l) del ejercicio 2.5. 79 2.9. Autómata del analizador sintáctico LL(l) del ejercicio 2.6. . 82 2.10. Autómata del analizador sintáctico LR(1) del ejercicio 2.7. . 87 2.11. Autómata a pila que reconoce el lenguaje de las cadenas que representan operaciones matemáticas. . . . . . . . . . . . . . . . . . . . . . . . . . .. 90 2.12. Autómata a pila que reconoce el lenguaje {zxn zyn zln E N}. . . . . . . .. 97 2.13. Transiciones no deterministas del autómata que reconoce el lenguaje {xnym: n:S; m:S; 2n} . . . . . . . . . . . . . . . . . . . . . . . 99 2.14. Autómata a pila que reconoce el lenguaje {xnym: n:S; m :S; 2n} 100 2.15. Autómata a pila que reconoce el lenguaje {xnym: O < m < n} . 103 2.16. Autómata a pila que reconoce el lenguaje {xn+2yn : O < n E N} . 105 2.17. Autómata a pila que reconoce el lenguaje {xny2n} . . . . . . . . . 108 2.18. Autómata a pila que reconoce el lenguaje {xnym : n, m> O, n = mVm = 2n} 108 2.19. Autómata finito que reconoce el lenguaje {xnym : O :S; m :S; n y si n = O =? 2.20. 2.21. 2.22. 2.23.
m=O} . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ..
111
Autómata a pila equivalente a la gramática del enunciado 2.16. . . . . .. Autómata a pila que reconoce el lenguaje L = {wlw E {O, 1}*, w = vv R } Autómata a pila del enunciado 2.18 . . . . . . . . . . . . . Autómata finito que reconoce el lenguaje del enunciado 2.19
113 115 118 118
3.1. Relación entre los lenguajes independientes del contexto, los lenguajes regulares y los lenguajes estructurados por frases. . . . . . . . . . . . . .. 3.2. Máquina de Turing que reconoce el lenguaje {xnyn zn : O < n E N}. . . .. 3.3. Máquina de Turing que reconoce si en un determinado proceso, los eventos A y E están activos en el mismo momento. . . . . . . . . . . . . . . . .. 3.4. Máquina de Turing que se encarga de trasladar el primer sumando a la primera cinta y el segundo sumando a la segunda cinta . . . . . . . . . 3.5. Máquina de Turing que suma dos números escritos en notación binaria .
v
123 128 132 136 13 7
3.6. Máquina de Turing de dos cintas que busca la primera aparición de la cadena contenida en la segunda cinta dentro de la cadena contenida en la primera cinta 139 3.7. Autómata finito que reconoce el lenguaje formado por las cadenas de x's e y's que no empiezan por x . . . . . . . . . . . . . . . . . . . . . . . . .. 142 3.8. Diagrama de transiciones de la máquina SL . . . . . . . . . . . . . . . .. 146 3.9. Máquina de Turing que busca el patrón xy en la cinta de entrada y lo sustituye por zz siempre que los símbolos xy no sean los primeros símbolos de la cinta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 3.10. Máquina de Turing que busca el patrón xy en la cinta de entrada y lo sustituye por zz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 149 3.11. Diagrama de transiciones parcial de una máquina de Turing que desplaza un lugar a la izquierda los símbolos contenidos a la derecha de la celda actual. 151 3.12. Diagrama de transiciones de una máquina de Turing que desplaza de manera indefinida un lugar a la izquierda los símbolos contenidos en la cinta a la derecha de la celda actual. . . . . . . . . . . . . . . . . . . . . . . . . . . 152 3.13. Máquina de Turing de dos cintas que elimina la primera aparición de la cadena conte!?:ida en la segunda cinta dentro de la cadena contenida en la primera cinta. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 155 3.14. Máquina de Turing que reconoce el lenguaje {xnyn : n E N+}. . . . . . . 159 3.15. Máquina de Turing de dos cintas que reconoce el lenguaje {xnyn : n E N+}. 163
VI
Prólogo
La teoría de autómatas es una materia básica en el área de la computación. Esta materia se ocupa del estudio de las máquinas de estados finitos que se utilizan como reconocedores de lenguajes. En cuanto a reconocedores, suponen la base para la construcción de compiladores y para el estudio de la computabilidad, esto es, qué es capaz de computar una máquina actual y con qué complejidad. Por lo general, los textos que cubren esta materia, lo hacen desde un enfoque teórico proponiendo, para cada tema, una serie de ejercicios que debe resolver el lector. En esta materia es especialmente importante conocer la relación que existe entre las diferentes formas de representación de las diferentes máquinas teóricas existentes. El objetivo de este libro es el de plantear ejercicios que recorran, para un mismo problema, todas las posibilidades de representación y sus equivalencias. No es objetivo de este libro presentar la base teórica que permita resolver estos ejercicios. Este libro sirve por tanto, de complemento para otros textos de contenido teórico. En cada capítulo se enunciarán los conocimientos teóricos necesarios para la resolución de los problemas planteados, así como las referencias que se pueden consultar para alcanzar dichos conocimientos. El libro se completa con ejercicios más cortos de carácter teórico/práctico que permiten afianzar los conocimientos en esta materia. Como ayuda para la comprensión de los ejercicios expuestos en este texto se recomienda el uso de JFLAP, un programa gráfico implementado en Java que permite experimentar con lenguajes formales, gramáticas y autómatas (disponible en http://www.ia.uned.es/asignaturas/aglf/) Los autores
VII
CAPÍTULO
1
Autómatas Finitos, Lenguajes Regulares, Gramáticas Regulares y Expresiones Regulares
En este capítulo se tratarán problemas relacionados con las máquinas teóricas conocidas como autómatas finitos que, aunque tienen un poder limitado, son capaces de reconocer la clase de los lenguajes regulares. Los autómatas finitos y los lenguajes regulares se encuentran en el nivel más bajo de la jerarquía de máquinas y lenguajes. Sin embargo, son la base, por ejemplo, de la construcción de los analizadores léxicos en los compiladores. Estos analizadores son los encargados de reconocer cuáles son las cadenas de símbolos del programa fuente que deben considerarse como representaciones de patrones válidos, por ejemplo, nombres de variables, constantes numéricas o palabras reservadas.
1.1. Base Teórica Para la resolución de los problemas de este capítulo es necesario conocer: • Los autómatas finitos deterministas y no deterministas, su representación mediante un número finito de estados y transiciones entre los mismos y mediante tabla de transiciones. • Los lenguajes regulares reconocidos por los autómatas finitos y ejemplos de lenguajes regulares básicos tales como: el lenguaje vacío 0, el lenguaje formado por la cadena vacía {A}, cualquierlenguaje finito, {xnln E N+},{xnymlm, n E N+}, ... 1
1. Autómatas Finitos, Lenguajes, Gramáticas y Expresiones Regulares • Límites de los autómatas finitos y ejemplos de lenguajes no regulares, como por ejemplo, {xnynln E N+}. • Gramáticas regulares. Son las gramáticas que generan lenguajes regulares. Las gramáticas se definen mediante un conjunto de símbolos terminales y no terminales y un conjunto de reglas de reescritura o producciones. Las gramáticas regulares cumplen que, en el lado izquierdo de cada producción existe un único no terminal y en el lado derecho de cada producción existe un único terminal o un terminal seguido de un único no terminal o la cadena vacía. • Expresiones regulares. Para definir lenguajes regulares pueden usarse también una serie de bloques básicos denominados expresiones regulares que se combinan mediante las operaciones de unión, concatenación y estrella de Kleene. Dado un determinado alfabeto I: una expresión regular se define como [Brookshear, 1993]: • (/) es una expresión regular que representa al lenguaje vacío, esto es, al lenguaje que no contiene ninguna cadena. • Cada miembro del alfabeto I: es una expresión regular. • Si p Yq son expresiones regulares entonces también 10 son: p U q, p. q y p* . Donde U, . Y * representan las operaciones de unión, concatenación y estrella de Kleene respectivamente. • Conversión de un autómata finito a una gramática regular equivalente y viceversa. • Conversión de un autómata finito a una expresión regular equivalente y viceversa. Para cubrir los contenidos anteriores se pueden consultar numerosas referencias en la literatura, en concreto, las siguientes dos fuentes: • Capítulos 1, 2 Y 3 del libro Teoría de autómatas, lenguajes y computación. H. E. Hopcroft, R. Motwani, J. D. Ullman. Pearson. Addison Wesley. Tercera Edición, 2008 ([Hopcroft et al., 2008]). • Capítulo 1 del libro Teoría de la Computación: Lenguajes Formales, Autómatas y Complejidad. J.O. Brookshear. Addison-Wesley Iberoamericana, 1993([Brookshear, 1993]). La nomenclatura que se va a utilizar en este capítulo es la siguiente:
2
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
• Un autómata finito se representa formalmente, mediante la siguiente tupla: (S, ¿;, 8, T, F) donde S es un conjunto de estados, ¿; es el alfabeto de la máquina, 8 es un subconjunto de Sx¿;xS que representa la función de transición, T es un elemento de S y representa el estado inicial y Fes ún subconjunto de S y representa la colección de estados de aceptación. La función de transición define las transiciones del autómata. Así por ejemplo, 8(So, O) = SI indica que si el estado actual es So yel símbolo actual de la entrada es O, entonces, el autómata cambia al estado SI' Por tanto, a la hora de determinar las transiciones de un autómata, sólo se tiene en cuenta el estado actual y símbolo actual de la entrada. Cuando se represente el autómata mediante un diagrama de transiciones el estado inicial está representado de la siguiente manera:
Mientras que los estados finales o de aceptación se representarán:
® Las transiciones entre estados se representan mediante arcos etiquetados por el símbolo que es necesario leer de la entrada para pasar de un estado a otro. Las transiciones en las que el estado inicial y final coincidan, se representan mediante bucles. Así, por ejemplo, las transiciones definidas como 8(So, O) = SI Y8(So, 1) = So se representará en un diagrama de transiciones de la siguiente manera: 1
Se supone que cada autómata dispone de una cabeza lectora que se va desplazando hacia la derecha por la cinta de entrada para leer los símbolos de la cadena que está procesando. • Una gramática se representa por la siguiente tupla: (S, V, T, R) donde Ves un conjunto finito de no terminales, T es un conjunto finito de terminales, S E V es el símbolo inicial de la gramática y R es un conjunto finito de reglas de reescritura o producciones. Las letras mayúsculas del alfabeto A, B, ... , S, V, T, ... denotarán los símbolos no terminales de la gramática. El conjunto de símbolos terminales de la gramática
3
1. Autómatas Finitos, Lenguajes, Gramáticas y Expresiones Regulares
lo constituirán los símbolos del alfabeto y que usualmente se representan con letras minúsculas. Las reglas de reescritura de la gramática se representarán indicando la parte izquierda de la regla seguida de una flecha y seguida a su vez de la parte derecha de la regla, por ejemplo, S -+ lA. • Las expresiones regulares se representarán usando los símbolos del alfabeto así corno los operadores de unión (U), concatenación (-) y estrella de kleene (*). Corno ejemplo, la expresión regular (O . (O U 1)* . O) representa aquellas cadenas que comienzan y terminan en O. Nótese que en otros textos, corno por ejemplo [Hopcroft et al., 2008], el operador unión se representa mediante el símbolo + en vez de U. • Para representar las posiciones de cinta no escritas de la cinta de entrada se utilizará el símbolo A..
4
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
1.2.
Problemas resueltos
IEJERCICIO 1.11 Dado el siguiente lenguaje regular L = {w E {O,l}*1 cada bloque de 5 símbolos consecutivos de w contiene al menos dos ceros} construir el autómata finito que lo reconoce, así como la gramática regular que genera las cadenas pertenecientes a este lenguaje.
SOLUCIÓN El lenguaje del enunciado comprende todas las cadenas formadas por O's y l's en las que cada subcadena de 5 símbolos consecutivos contiene un mínimo de dos ceros. Algunos ejemplos de cadenas válidas de este lenguaje son: 00111, 101011, 0011100 Y 11001100110. Por el contrario, las siguientes cadenas no son válidas: 11111,011110, 111011110 Y 011011011. La cadena 011011011 es un ejemplo de cadena no válida puesto que, aunque su primera subcadena de 5 elementos (i.e. 01101) si es válida, la siguiente subcadena de 5 elementos, que se construiría eliminando el primer elemento de la cadena e incorporando el sexto elemento de la cadena inicial, sería 11011, que no cumple las condiciones del enunciado. En consecuencia, la cadena no pertenece al lenguaje. Para que un autómata finito sea capaz de distinguir las cadenas válidas de las que no 10 son, debería poder recordar cuáles son los últimos cinco elementos que ha leído. La única forma de almacenar está información dentro de un autómata finito es asociar a cada estado una única subcadena. Como este lenguaje tiene un alfabeto binario, el número de estados necesarios para almacenar todas las opciones de subcadenas de 5 símbolos será 25 = 32. Cada uno de estos 32 estados se ha nombrado con un número comprendido en el intervalo [O ... 31]. La biyección para saber qué cadena corresponde a cada uno de los estados, se ha definido considerando que la cadena de 5 elementos del alfabeto (i.e. O y 1), es un número natural escrito en notación binaria. De esta manera, dada una cadena, se le hace corresponder el número en notación decimal, que indica el número del estado correspondiente a dicha cadena. Una vez que el autómata ha leído los 5 primeros símbolos de una cadena, debería tratar los siguientes símbolos, volviendo a utilizar la biyección comentada anteriormente. La nueva subcadena que se considera es aquella que resulta de eliminar el primer elemento de la cadena anterior, añadiendo el nuevo símbolo que aparezca en la entrada. Como ejemplo, se supone que el autómata se encuentra en el estado VlO . Por tanto, los últimos 5 símbolos que ha leído componen la subcadena 01010. A continuación, en la entrada se puede encontrar un O o un 1. Si en la entrada se encuentra un O, la nueva cadena sería 10100. En ese caso, el autómata debería pasar del estado Vio al estado V20 (esto es, existiría una transición y por tanto, un arco que una los estados VlO y 1120)' Si por el contrario, el siguiente carácter a leer de la entrada
5
1. Autómatas Finitos, Lenguajes, Gramáticas y Expresiones Regulares
o
1
Figura 1.1: Transiciones que se producen cuando, estando en el estado VIO, se lee de la entrada los símbolos: O o 1. Nótese que los tres nodos son nodos de aceptación 0,1
.@
@__O_,l_ _
Figura 1.2: Transiciones al estado de error desde un estado de no aceptación (en este caso, el estado V27 ) fuera un 1, la nueva cadena sería 10101. En ese caso, el autómata debería pasar del estado VlO al estado V21 . Si el autómata llega a cualquiera de estos tres nodos, la cadena leída cumple las condiciones del lenguaje y por tanto deben ser nodos de aceptación. La figura 1.1 ilustra el ejemplo descrito. Un ejemplo de un estado de no aceptación, sería el nodo 1127' Este nodo se corresponde con la codificación decimal de la cadena 11011 que no es una cadena válida del lenguaje. Por tanto, una vez que se alcanza el estado 1127, el autómata no debe aceptar la cadena. En este caso, si el siguiente símbolo de la cadena es un 1, la nueva subcadena a analizar sería 10111 correspondiente al estado 1123. Por el contrario, si el siguiente símbolo es un O la nueva subcadena a analizar sería 10110 correspondiente al estado 1122 (que es un estado de aceptación). Siguiendo la metodología del ejemplo anterior, se deberían definir dos transiciones desde el estado 1127 a los estados V23 y V22 • No obstante, si se definen estas dos transiciones, el autómata aceptaría la cadena en el caso de que se lea un O de la entrada, lo cual es un error, porque una vez que el autómata alcanza el estado 1127, éste debe rechazar la cadena puesto que ya ha encontrado una subcadena no válida del lenguaje. Para resolver esta situación se define un nuevo estado de error (E). Este estado será el destino de todas las transiciones que partan de estados de no aceptación independientemente del símbolo que se lea de la entrada. En la figura 1.2 se ilustra este ejemplo. En la figura 1.3 se muestra el diagrama con todas las transiciones que se producen entre los estados de aceptación y el nodo error. Para completar el autómata que reconozca el lenguaje del enunciado, es necesario definir los estados y las transiciones que controlen la lectura de los cinco primeros símbolos de la cadena. En la figura 1.4, se muestra esta parte inicial del autómata. En esta figura, los estados 6
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
qi controlan los símbolos leídos hasta el momento. Así por ejemplo, el estado qo es el estado inicial en el que no se ha leído ningún símbolo, estado ql es el estado en el que se ha leído un y el esetado q2 es el estado en el que se ha leído el símbolo 1.
°
Ejemplos de ejecución del autómata Se van a considerar a continuación diferentes cadenas de entrada con el objetivo de ilustrar el funcionamiento del autómata . • Cadena de entrada: 00111
En este caso, la cadena de entrada sólo tiene 5 caracteres, por tanto, sólo se ejecutará la parte del autómata que se muestra en la figura 1.4. El estado inicial es el estado qo y por lo tanto antes de empezar a leer la cadena, el autómata estará posicionado en ese estado. Para controlar la porción de cadena que ya se ha leído, se subrayará el símbolo de la entrada que debe considerar el autómata en cada momento (que denominaremos símbolo actual). Al comienzo de la ejecución del autómata, la entrada sería la siguiente: Q011l. En la siguiente tabla se muestran las transiciones que va realizando el autómata (el símbolo). representa las posiciones de cinta no escritas que pudieran encontrarse en la cinta de entrada).
I Paso I
Cinta
o
Q0111)' OQ111). 00111), 00111), 00111). 00111¿
1 2 3 4
5
I Estado I Función de Transición I qo ql q3 qs q18 V7
o(qo, O) = ql O(ql' O) = q3 O(q3, 1) = qs o(qs, 1) = qlS O(q18, 1) = V7 Aceptar
Cada vez que se lee un símbolo de la entrada, la cabeza lectora del autómata se desplaza a la siguiente posición a la derecha del símbolo actual de la cinta. Por lo tanto, siguiendo las transiciones mostradas en la tabla anterior, al leer el primer el autómata pasa del estado qo al estado ql (esto es, se ha ejecutado la función de transición o(qo, O) = ql), además la cabeza lectora se desplaza y el símbolo actual ahora es el segundo cero de la cadena. Cada una de las siguientes acciones del autómata se interpretan de forma similar.
°
• Cadena de entrada: 11111 lt
I
Este es un ejemplo de una cadena no válida del lenguaje. En la siguiente tabla se muestra el funcionamiento del autómata con esta cadena de entrada.
.L............-----------------7
--
1. Autómatas Finitos, Lenguajes, Gramáticas y Expresiones Regulares
0,1 0,1 1 1
VI5
V31
1130 1129
° 1 O
O
° °
00 11 00
O
1 O
Figura 1.3: Diagrama con las transiciones entre los estados de aceptación y el nodo error. Nótese que existen estados de no aceptación a los que nunca se llega puesto que no existen transiciones para las que sean nodo destino
8
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
11:31 1 1
fQ
O O
1
"'29
1
~
"'27 O
1 1 O O
~
1 1 O O 1
O 1
1 O O
O Figura 1.4: Diagrama parcial del autómata que procesa los cinco primeros símbolos de una cadena
9
1. Autómatas Finitos, Lenguajes, Gramáticas y Expresiones Regulares
I Paso I Cinta I Estado I Función de Transición I o 11111.,\ qo Ó(qol1) = q2 1
2 3 4 5
11111.,\ 11111,\ 11111,\ 11111,\ 11111~
q2 q6 q14 q30 V:n
= q6 Ó(q6l 1) = q14 Ó(q14l 1) = q30 ó( q30, 1) = V:n
15 ( q2 1 1)
Rechazar
• Cadena de entrada: 0011100 Esta cadena es una cadena válida del lenguaje y tiene más de cinco caracteres. Por tanto, una vez leídos los primeros cinco símbolos de la entrada (ver figura 1.4), el autómata pasará a ejecutar las transiciones que se muestran en la figura 1.3. En la siguiente,!abla se muestra el funcionamiento del autómata con la cadena de entrada 0011100.
I Paso I o 1 2 3 4
5 6 7
Cinta Q011100,\ OQ11100,\ 0011100,\ 0011100,\ 0011100,\ 00111QO,\ 001110Q,\ 0011100~
I Estado I Función de Transición I qo ql q3 qs qlS V7 Vi4 V2S
Ó(qOlO) = ql Ó(qlJ O) = q3 Ó(q3l 1) = qs 15 ( qs 1 1) = qlS Ó(qlSl 1) = V7 Ó(V7l O) = V14 Ó(V14l O) = V2s Aceptar
• Cadena de entrada: 0110101110 Esta cadena es una cadena que no pertenece al lenguaje y que tiene más de cinco caracteres. El funcionamiento del autómata con esta cadena de entrada se muestra en la siguiente tabla: 10
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
j Paso j
o 1 2
3 4
5 6 7 8 9 10
I
Cinta Estado Q110101110,\ qo 0110101110,\ ql 0110101110,\ q4 011QlO111O,\ qlQ 0110101110,\ q21 01101Q1110,\ lr'í3 0110101110,\ V26 0110101110,\ V21 0110101110,\ Vn 011010111Q,\ E E 0110101110~
I Función de Transición I <5(qo, O) = ql <5(q¡, 1) = q4 <5(q4, 1) = qlQ <5(qlQ, O) = q21 <5(q21 , 1) = V13
<5(lr'í3' O)
=
V26
<5(V26' 1) = V21 <5(V21' 1) = lr'í1 <5 (lr'í 1 , 1) = E <5(E, 1) = E Rechazar
En este ejemplo, se puede observar que los últimos cinco caracteres de la cadena cumplen la propiedad del lenguaje (que es tener un mínimo de dos ceros en cada bloque de cinco símbolos consecutivos). No obstante, en el paso 9 ya se ha reconocido una subcadena"que no cumple la propiedad del lenguje. Por tanto, el autómata ha ejecutado una transición al estado de error en el que se mantiene independientemente de los símbolos restantes de la cadena.
Gramática El primer paso para la construcción de la gramática es la identificación de los símbolos terminales y no terminales. En este caso, los símbolos terminales se corresponden con los símbolos del alfabeto del lenguaje, ~ = {O, 1}. Por otro lado, para definir los símbolos no terminales se suele asociar a cada estado del autómata un símbolo no terminal, denotado por . una letra del alfabeto latino en mayúsculas. Sin embargo, en este caso, el número de estados del alfabeto es superior al número de letras del alfabeto latino y por tanto, en este ejercicio se ha utilizado una notación diferente. En concreto, el conjunto de símbolos no terminales sería: {qo, ql, q2, q3, q4, q5, q6, q7, q8, q9, qlQ, qn, q12, q13, q14, q15, q16, q17, q18, q19, q20, q21, q22, q23, q24, q25, q26, q27, q28, q29, q30, Va, VI, V2, 113, v,¡, V¡¡, \16, V7, vg, lig, lr'ío, lr'íl, V12 , V13 , lr'í4, lr'í5, V16 , V17 , V18 , VÍ9, V20, V21, V22, V23 , V24, V25 , V26, V27 , V28 , V29, 1130, 1131, E}. El símbolo inicial de la gramática se corresponde con el estado inicial del autómata. En concreto, como el estado inicial del autómata es qo, el símbolo inicial de la gramática será qo· Para definir las producciones de la gramática, se tiene en cuenta la función de transición del autómata. En primer lugar, a modo de ejemplo inicial, se definirán las producciones de la gramática asociadas a las transiciones que tienen su origen en el nodo lr'ío (ver figura 11
1. Autómatas Finitos, Lenguajes, Gramáticas y Expresiones Regulares
1.1). Los elementos de la función de transición que tienen su origen en el nodo VlO serían: Ó(Vío, O) = V2o, Ó(Vío,l) = V21. Ahora, a partir de cada uno de estos dos elementos, se definen dos producciones:
Ó(VlO , O)
= V20 : VlO
--+
OV2o
Ó(VlO , 1)
= V21 : VlO
--+
1V21
Ahora se pueden definir las producciones de la gramática que terminan las cadenas. Estas producciones se construyen a partir de los estados de aceptación. Por ejemplo, como el estado VlO es un estado de aceptación se debe generar la producción VlO --+ A A partir de la definición del autómata (ver figuras 1.3 y lA), el resto de producciones de la gramática se definen de manera similar, y se deja como ejercicio al lector. Una vez definida la gramática, se muestra a continuación, a modo de ejemplo, la derivación de la palabra 0011100.
I Paso I Producción I Palabra o 1 2 3 4
5 6 7 8
qo --+ Oql ql --+ Oq3 q3 --+ 1q8 q8 --+ 1q18 q18 --+ 1V7 V7 --+ OV14 Ví4 --+ 0V28 V28 --+ A
qo Oql 00q3 001q8 001lq18 00111V7 001110V14 0011100V28 0011100
Ejemplos para practicar con JFLAP Se sugiere al lector que teniendo en cuenta el autómata definido en este ejercicio, practique con las siguientes cadenas utilizando la herramienta JFLAP [Rodger y Finley, 2006].
• 101011 • 11001100110 • 011110 • 111011110
12
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
IEJERCICIO 1.2 1 Dado el siguiente lenguaje regular L = {w E {O, l}*lw contiene dos ceros separados por un número finito de dígitos que es múltiplo de cuatro}, construir el autómata finito que 10 reconoce, así como la gramática regular y la expresión regular equivalentes.
SOLUCIÓN El lenguaje del enunciado comprende todas las cadenas formadas por O's y l's que contienen dos ceros separados por un número finito (múltiplo de cuatro) de dígitos (esto es, O's y l's). Ejemplos de cadenas válidas del lenguaje son: 00,1000111, 10111101 o 10100101. Por el contrario, las siguientes cadenas no pertenecen al lenguaje del enunciado: 01,1111 0110111110. Un autómata finito que reconociera este lenguaje debería controlar que, cuando aparece el primer cero, la siguiente subcadena anterior a algún cero contendrá un número de símbolos que es múltiplo de cuatro (a la subcadena que cumple estas características las denominaremos subcadena válida). E.!l ese caso debería llegar al estado de aceptación. No obstante, puede ocurrir que después de un cero no podamos reconocer una subcadena válida, en ese caso, el autómata debería seguir leyendo símbolos de la entrada hasta encontrar el siguiente cero. Puesto que en un primer momento no se puede saber si al primer cero le seguirá una subcadena válida, la forma más sencilla de definir el autómata es hacerlo de manera no determinista. En primer lugar se definen tres estados, el estado inicial qo, ql Y el estado de aceptación q6. Al estado q6 se llegará en el momento en que el autómata haya leído de la entrada dos ceros separados por una subcadena válida. En ese caso ya no importa 10 que reste de la cadena, puesto que ésta será aceptada. Por tanto, del estado q6 saldrán dos transiciones hacia sí mismo correspondientes a los símbolos O y 1. Por otro lado, al comenzar a leer una cadena, puede ocurrir que se empiece a procesar un fragmento de una subcadena válida o no. Cualquier subcadena válida debe empezar por un cero, por tanto desde el estado inicial saldrá una transición al estado ql para comenzar a procesar la subcadena. Si se lee un 1, no es el comienzo de una subcadena válida, por tanto, la transición desde qo con el símbolo 1 volverá a qo. No obstante, también puede ocurrir que aún empezando por un O no sea una subcadena válida (por ejemplo, la cadena 1010), en ese caso, no debe realizarse la transición al estado ql, sino que debe mantenerse igualmente en el estado qo. Este es, por tanto, el primer punto de no determinismo. El autómata parcial construido hasta el momento puede verse en la figura 1.5. A partir del estado ql debe reconocerse una subcadena válida, esto es, cualquier subcadena formada por O's y 1's y cuya longitud sea múltiplo de cuatro. En este caso, es 13
---.-
1. Autómatas Finitos, Lenguajes, Gramáticas y Expresiones Regulares
1,0
° 1,0 Figura 1.5: Primeros estados definidos para el autómata que reconoce el lenguaje L del ejercicio 1.2 1,0
° "".,
1,0
°
q5
1,0 Figura 1.6: Autómata finito parcial que reconoce el lenguaje L del ejercicio 1.2 fácil controlar la longitud de la subcadena añadiendo nuevos estados al autómata, de manera que se pase de un estado a otro cuando se lea un símbolo. Se añaden al autómata los estados q2, q3, q4 Y q5 (puesto que se trata de leer cadenas cuya longitud sea múltiplo de cuatro). Puesto que la única restricción sobre la subcadena que se encuentre entre los dos ceros es su longitud, entre estos estados construiremos las mismas transiciones tanto si se lee un Ocomo si se lee un 1 (en la figura 1.6 se muestran las transiciones entre estos cuatro estados). El autómata llega al estado q5 cuando ha leído una subcadena que comienza por un O seguido por cuatro dígitos. Puesto que el autómata debe reconocer subcadenas cuya longitud sea múltiplo de cuatro, si desde el estado q5, en la entrada hay un 1, el autómata debe volver al estado q2· De esta forma, el autómata puede controlar que si la longitud de la subcadena es mayor que cuatro, dicha longitud sea múltiplo de cuatro. Si por el contrario, si en la entrada viene un Ola cadena ya puede ser aceptada, por lo tanto, desde el estado q5 habrá una transición al estado q6 etiquetada con O. El autómata completo que reconoce el lenguaje del enunciado puede verse en la figura 1.7. 14 -~----
-
.-
-"---~-_.~~,,-,,-
-,--~~--.,,-------,----------~-_.~-
- --
-- -----,-, ---0--
______ 0"
"-----.-----------'"'-'--~-. __ "' ______ •___
=- ---_ .._-----o,'-"'--o_~~"_~ __ ~ ______ ~_.
_ _ _ _~
I
J
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
1
1
o
1,0
o
1,0 Figura 1.7: Autómata finito no determinista que reconoce el lenguaje del enunciado 1.2
Ejemplos de ejecución del autómata Se van a considerar a continuación diferentes cadenas de entrada con el objetivo de ilustrar el funcionamiento del autómata. • Cadena de entr.ada: 00
En este caso, la cadena de entrada sólo tiene dos símbolos. Cumple la condición del lenguaje puesto que contiene dos ceros separados por un número de dígitos que es múltiplo de cuatro (en este caso cero dígitos). En la siguiente tabla se muestran las transiciones que va realizando el autómata.
I Paso I Cinta I Estado I Función de Transición I o 1
QO,\ OQ,\
2
OO~
%
q¡ q6
b(qo, O) = q¡ b(q¡, O) = q6 Aceptar
Nótese que al ser el autómata no determinista, tanto en el paso O como en el paso 1 se podrían haber ejecutado otras transiciones. Así, en la siguiente tabla, se muestra otro ejemplo de ejecución del autómata.
I Paso I Cinta I Estado I Función de Transición I O 1
QO,\ OQ,\
2
OO~
qo qo q¡
b(qo, O) = qo b(qo, O) = q¡ Rechazar
Otro ejemplo más de ejecución del autómata se muestra en la siguiente tabla. 15
1. Autómatas Finitos, Lenguajes, Gramáticas y Expresiones Regulares
I Paso I Cinta I Estado I Función de Transición I
° 1 2
UOA OUA
8(qo, O) = qo 8(ql, O) = q2 Rechazar
qo ql q2
OO~
A pesar de haber ejecuciones del autómata que lleven a rechazar la cadena, el criterio de aceptación de una cadena por parte de un autómata no determinista determina que basta con que haya un camino de ejecución del autómata que lleve a un estado de aceptación [Hopcroft et al., 2008], [Brookshear, 19931. Por tanto, en este caso la cadena es aceptada.
• Cadena de entrada: 1000111 Al igual que en el ejemplo anterior, en este caso puede haber diferentes ejecuciones del autómata para una misma cadena de entrada. En la siguiente tabla se muestra el ejemplo de ejecución que lleva al autómata a un estado de aceptación.
I Paso I
° 1 2
3 4
5 6 7
I
Cinta Estado 1000111A qo 1UOO111A qo 10UOl11A ql 100U111A q6 1000I11A q6 1000l11A q6 100011IA q6 1000111~ q6
I Función de Transición I 8(qo, 1) = qo 8(qo, O) = ql 8(qo, O) = q6 8(q6' O) = q6 8(q6, 1) = q6 8(q6, 1) = q6 8(q6, 1) = q6 Aceptar
• Cadena de entrada: 110111110 Al igual que en los ejemplos anteriores, puede haber diferentes ejecuciones del autómata para esta cadena de entrada. Sin embargo, en este caso, al no ser una cadena válida del lenguaje, no existe ninguna ejecución que lleve al autómata a un estado de aceptación. En la siguiente tabla se muestra un ejemplo de ejecución del autómata con esta cadena de entrada. 16 ._------
-
-
--
--
--
--
------
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
I Paso I
Cinta
o
110111110A 1l0111110A 11Q111110A 110111110A 110111110A 110111110A 110111110.\ 110111110.\ 11011111Q.\
1 2 3 4 5 6 7 8 9
110111110~
I Estado I Función de Transición I qo
% qo ql q2 q3 q4 q5 q2 q3
= qo = qo = ql = q2 Ó(q2' 1) = q3 Ó(q3' 1) = q4 Ó(q4, 1) = q5 Ó(q5, 1) = q2 Ó(q2, O) = q3
Ó(qo, 1) Ó(qo, 1) Ó(qo, O) Ó(ql, 1)
Rechazar
Gramática Teniendo en cuenta el autómata construido anteriormente, la gramática regular que genera el lenguaje del enunciado es la que se muestra en la figura 1.8. Un ejemplo de derivación de una cadena que ilustre el uso de esta gramática, es el siguiente (encima de la flecha, aparece la producción de la gramática que se aplica en cada paso): S -----+ OS s->~?' S -----+ 01S s->q~ S -----+ 010A A-+qr S -----+ 0100F F-+~r S -----+ 01001F F-+;~ S -----+ 01001
Expresión Regular Siguiendo el procedimiento de construcción de una expresión regular a partir de un autómata finito [Hopcroft et al., 2008, Brookshear, 1993], la expresión regular equivalente al autómata de este ejercicio sería la siguiente:
(OU 1)*(OOUO(IUO)(1 UO)(1 UO)(1 UO)(I(1 UO)(1 UO)(1 UO))*O)(OU 1)*
Ejemplos para practicar con JFLAP Se sugiere al lector que teniendo en cuenta el autómata definido en este ejercicio, practique con las siguientes cadenas utilizando la herramienta JFLAP [Rodger y Finley, 20061. • 00111110 • 011110 • 111100 17
~ !r. :' 1\,
• . !.,.,.,.•.
".'1
1. Autómatas Finitos, Lenguajes, Gramáticas y Expresiones Regulares S~OS s~
lS
S~OA
A~OF A~OB A~lB B~lC B~OC
C~lD C~OD D~OE D~lE E~lB
E~OF F~lF F~OF F~)"
Figura 1.8: Gramática que genera el lenguaje L = {w E {O, l}*lw contiene dos ceros separados por un número finito de dígitos que es múltiplo de cuatro } • 011 En este caso, al haber varios puntos de no determinismo, la herramienta JFLAP, ejecutará en paralelo y cuando sea necesario, todas las transiciones posibles.
I EJERCICIO 1.3
1
Construir el analizador léxico de una calculadora binaria que tome como entrada una expresión algebraica compuesta por dos números escritos en notación binaria y devuelva el resultado de dicha expresión. En este ejercicio no se contempla la existencia de un analizador sintáctico y por tanto el analizador léxico deberá comprobar todos los lexemas 1 de la cadena de entrada. En definitiva, el analizador léxico de este ejercicio es el componente que se encargará de comprobar que la cadena de entrada se corresponde con posibles elementos de una expresión 1Unidad
18
mínima con significado léxico
Autómatas, Gramáticas y Lenguajes fonnales: problemas resueltos algebraica correcta. Así mismo, el analizador léxico no puede ser capaz de comprobar que los paréntesis y los corchetes están balanceados, esto es, lo único que podrá comprobar es que los símbolos que aparecen en la expresión algebraica, son correctos. Una codificación válida de un número en formato binario, es aquella que comienza por un 1 seguido de cualquier combinación de o's y l's. El único caso particular que no cumple esta restricción es el cero, que se representa con un único O. Por último, la expresión algebraica de entrada tendrá la siguiente estructura:
. Para facilitar la construcción del analizador léxico, entre los operadores y los operandos deberá haber un espacio en blanco (en este caso se representará este símbolo blanco mediante el símbolo .6., para diferenciarlo del que se ha usado antes para representar las posiciones de cinta no escritas de la cinta de entrada).
SOLUCIÓN El analizador léxico de cualquier sistema deberá reconocer los siguientes componentes léxicos: • Palabras reservadas. • Identificadores. • Operadores. • Símbolos especiales. .• Constantes numéricas. • Constantes de carácter. En el caso del analizador léxico de una calculadora, éste deberá comprobar que la cadena de entrada contiene los elementos de una expresión algebraica correcta. Por tanto, en este caso el analizador léxico es una simplificación de un analizador léxico real y sólo deberá identificar: • Las constantes numéricas. • Los operadores matemáticos. • Los símbolos especiales, esto es, los paréntesis y los corchetes, que se utilizan para modificar la precedencia de los operadores. 19
1. Autómatas Finitos, Lenguajes, Gramáticas y Expresiones Regulares
o
Figura 1.9: Autómata que reconoce la codificación de un número binario
Qo
+,-,*,/,(,),[,]
~
Figura 1.10: Autómata que reconoce los operadores matemáticos, los paréntesis y los corchetes La construcción del analizador léxico se hará mediante la definición de un autómata finito. El lenguaje que deberá reconocer este autómata estará compuesto por cadenas que se corresponden con" elementos posibles de expresiones algebraicas correctas. Puesto que los números están codificados en notación binaria el alfabeto del lenguaje será ¿.; = {O,l, +, -, *, /, (,), [,]} U {,6.}. Dadas las especificaciones del analizador léxico del enunciado, algunos ejemplos de cadenas válidas del lenguaje que debe aceptar el autómata finito correspondiente son: 1001,6. + ,6.1001, +,6.0 y 101,6.(,6. + ,6.),6.101. Por el contrario, son ejemplos de cadenas no válidas: 1001 * 100 Y 0110,6. + ,6.1001. La cadena 1001 * 100 no es válida ya que no hay espacios en blanco entre el operando y el operador y la cadena 0110,6. + ,6.1001 no es válida, ya que el número 0110 no es una codificación válida de un número binario. La construcción del autómata finito se hará en base a la composición de dos autómatas más sencillos. Por un lado, uno de los autómatas será el encargado de comprobar que los operandos están codificados correctamente (representado en la figura 1.9). Por otro lado, el otro autómata reconocerá los operadores matemáticos y los símbolos especiales "+, -, * , /, (, ), [, 1". Para ello, basta con que el autómata lea de la entrada el símbolo correspondiente (ver figura 1.10). Para componer el autómata completo, basta con combinar los dos autómatas anteriores teniendo en cuenta que debe haber un espacio en blanco (esto es, un símbolo ,6.) entre los operandos, el operador y los símbolos especiales. En la figura 1.11 está representado el autómata completo (en esta figura, la transición etiquetada con ¿.; se ejecuta cuando se lee cualquier símbolo de la entrada, mientras que las transiciones etiquetadas con ¿.; - {,6.}, se ejecutan cuando se lee de la entrada cualquier símbolo excepto ,6.).
20
Autómatas,
Gramá~icas
y Lenguajes formales: problemas resueltos
o
+,-, *,/,(,),[,]
L:-{Ó}
L:-{Ó}
Figura 1.11: Autómata correspondiente al analizador léxico de una calculadora binaria
Ejemplos de ejecución del autómata Se van a considerar a continuación diferentes cadenas de entrada con el objetivo de ilustrar el funcionamiento del autómata .
• Cadena de
en~r.pda:
1001Ó + ÓlO01
Tal y como ya se ha hecho en ejercicios anteriores, el símbolo actual aparecerá subrayado. ASÍ, por ejemplo, al inicio, la cabeza lectora del autómata estará posicionada sobre el primer elemento de la cadena, y se representa de la siguiente manera: lOOlÓ + Ó1001. En la siguiente tabla se muestran los pasos de ejecución del autómata.
I Paso I
Cinta
o
lOOlÓ + Ó100l 1QOlÓ + Ó100l lOQ1Ó + Ó100l 100lÓ + Ó1001 100lÓ + Ó100l 100lÓ + Ó1001 1001Ó + Ó1001 1001Ó + ÓlOOl 100lÓ + Ó1Q01 100lÓ + Ó10Q1 100lÓ + Ó100l 100lÓ + Ó 100 1~.
1 2 3 4
5 6 7 8
9 10 11
I Estado I Función de Transición I Qo Q2 Q2 Q2 Q2 Qo Q3 Qo Q2 Q2 Q2 Q2
5(Qo, 1) = Q2 5(Q2, O) = Q2 5(Q2, O) = Q2 5(Q2, 1) = Q2 5(Q2,Ó) = Qo 5(QO,+)=Q3 5(Q3,Ó) = Qo 5(Qo, 1) = Q2 c5(Q2, O) = Q2 c5(Q2, O) = Q2 c5(Q2, 1) = Q2 Aceptar
21
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
OQ1
o(Qo, [) = Q3: Qo ~ [Q3
O(Qo, 1) = Q2: Qo ~ 1Q2
O(Qo, ]) = Q3 : Q3 ~lQ3
o(Qo, O)
O(Qo, +)
=
=
Q1: Qo
~
Q3: Qo ~ +Q3
0(Q1,~) =
O(Qo, -) = Q3: Qo ~ -Q3
Qo: Q1 ~ ~Qo
0(Q2, O) = Q2: Q2 ~ OQ2
O(Qo, *) = Q3: Qo ~ *Q3
0(Q2, 1)
=
O(Qo, /)
=
Q3: Qo ~ /Q3
O(Qo, ()
=
Q3: Qo ~ (Q3
0(Q2,~) =
O(Qo,))
=
Q3: Qo ~ )Q3
0(Q3,~)
Q2: Q2
~
1Q2
Qo: Q2
~ ~Qo
= Qo: Q3
~ ~Qo
El símbolo inicial de la gramática es Qo, que corresponde con el estado inicial del autómata. Por último las producciones tenninales de la gramática estarán asociados a los estados finales.
En la construcción de la gramática no se han considerado las transiciones al estado de error, E. En la siguiente tabla y a modo de ejemplo, se muestra la derivación de la cadena válida O~ + ~) con la gramática anterior.
I Paso I Producción I Palabra o 1 2 3 4 5 6
Qo ~ OQ1 Q1 ~ ~Qo Qo ~ +Q3 Q3 ~ ~Qo Qo ~)q3 Q3 ~ A
Qo OQ1 O~Qo 0~+Q3 O~+~Qo
+
O~ ~)Q3 O~+~)
Expresión regular Para la construcción de la expresión regular se deben seguir los mismos pasos empleados para la construcción del autómata. 23
1. Autómatas Finitos, Lenguajes, Gramáticas y Expresiones Regulares
En primer lugar, se empieza definiendo la expresión regular que representan los números naturales escritos en notación binaria, que será 1 (O U 1)*. Como también es necesario añadir el caso del número cero (cuya expresión regular es O), la expresión regular resultante sería OU (1 (O U 1) *). La expresión regular de los operadores matemáticos, junto con los paréntesis y corchetes es (+ U - U * U / U (U) U [U]). Por lo tanto, la expresión regular que reconoce una expresión algebraica con dos términos, sería:
OU (1 (O U 1)*) U + U - U * U / U (U) U [U] No obstante, como una expresión algebraica puede tener un número indeterminado de estos elementos, se utilizará la estrella de Kleene. El último símbolo que hay que considerar para la construcción de la expresión regular es el símbolo .6. que separa cada uno de los elementos de la expresión regular. Por tanto, el resultado final es:
(O U (1 (O U 1)*) U + U - U * U / U (U) U [U])· (.6. o (O U (1 (O U 1)*) U + U - U * U / U (U) U [U]))* ""_,'
Ejemplos para practicar con JFLAP Se sugiere al lector que teniendo en cuenta el autómata definido en este ejercicio, practique con las siguientes cadenas utilizando la herramienta JFLAP [Rodger y Finley, 2006].
• 101.6. * .6.(.6.10.6.
+ .6.11.6.)
• 101.6. + .6.(.6.10 • 101.6. * .6.(.6.10.6.
+ 11.6.).6.
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
IEJERCICIO 1. 4 1 Construir un autómata finito que compruebe si una palabra contiene las 5 vocales.
SOLUCIÓN Partiendo del alfabeto del idioma español (que coincidirá con el alfabeto del autómata), el lenguaje del enunciado estará compuesto por cadenas de cualquier longitud y resultantes de la concatenación de letras (con repetición o no). Las cadenas válidas del lenguaje serán aquellas, que contengan las 5 vocales {a, e, i, o, u} independientemente del orden de aparición. Si las cadenas no contienen las cinco vocales no serán validas. Para reconocer este lenguaje, basta con que el autómata lleve constancia de las vocales que va leyendo de la entrada mediante el uso de estados. Los estados del autómata serán: • El estado inicial 0 que indica que no ha reconocido ninguna vocal (mientras que el autómata esté en este estado si lee una consonante de la cadena permanecerá en él, al leer una vocal se desplazará a un nuevo estado). • Un conjunto de estados que sirvan para controlar las vocales que se han leído hasta el momento. Por ejemplo, para definir que se ha leído una vocal hacen falta 5 estados (cada uno de ellos para controlar que se ha leído cada una de las posibles vocales). Logicamente, estando en uno de estos estados, si se lee una vocal repetida o una consonante, el autómata permanecerá en ese mismo estado. En el caso, de leer una nueva vocal, el autómata cambiará de estado. Estos estados se nombran con la vocal a la que hacen referencia, esto es, a,e,i,o y u. De la misma forma, para controlar que se han leído dos vocales, harán falta 10 estados (posibles combinaciones de las 5 vocales tomadas de 2 en 2 sin tener en cuenta repeticiones ni órdenes de aparición) que se nombrarán de manera similar, esto es, ae,ai,ao,au,ei,eo,eu,~o,~u,ou.
El resto de estados del autómata se definirán de manera análoga. De esta forma, habrá otros 10 estados para definir la situación en la que se han leído tres vocales diferentes y 5 estados para el caso en que se hubieran reconocido 4 vocales. • Por último, se definirá un único estado final que representa el caso en el que se hayan leído las 5 vocales. En la figura 1.12 se presentan la totalidad de los estados del autómata. 25
1. Autómatas Finitos, Lenguajes, Gramáticas y Expresiones Regulares
8 8
-0
O
8 8
9
G G
8 9
8 8
@
0
0
8 8
@
8
0
8 8
(0
@
8 8 8 8 8
Figura 1.12: Estados del autómata que reconoce palabras que contienen las 5 vocales
26
i
1:
8
}, _._. __ ._.....~.~ -.-------.---~.
e
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
aiou Figura 1.13: Transiciones del estado {aiu} Una vez definidos los estados, es el momento de definir las transiciones del autómata. En este punto, es importante tener en cuenta que en la representación de todo autómata finito determinista debe existir una transición por cada elemento de alfabeto en cada uno de los estados (en este caso, se dice que el diagrama del autómata está saturado). A modo de ejemplo, en la figura 1.13 se muestran todas las transiciones asociadas al estado {aiu }. Este estado tendrá un bucle que se ejecutará si la siguiente letra que se lee de la entrada es una consonante o alguna de las vocales que definen el estado, es decir {a, i, u}. Para facilitar la interpretación del diagrama, esta transición está marcada con el símbolo ".". En la figura 1.13 también se observa una transición al estado {aeiu} en el caso en que el autómata lea una e de la entrada, o al estado {aiou} en el caso en que el autómata lea una o. En el caso particular de este ejercicio, dado el número de estados, y para facilitar la interpretación del diagrama, no se van a representar ciertas tansiciones, entre las que se encuentran los bucles asociados a cada uno de los estados y que se ha descrito en el caso del estado {aiu }. En la figura 1.14 se muestra el diagrama parcial del autómata en el que sólo se presentan algunas transiciones. El resto de transiciones, que se construyen tal y como se ha explicado con anterioridad, se dejan como ejercicio para el lector. Es importante destacar que, una vez que el autómata haya llegado al estado aeiou, la cadena ya será aceptada independientemente de los símbolos que resten por leer de la cadena de entrada.
Ejemplos de ejecución del autómata Se van a considerar a continuación diferentes cadenas de entrada con el objetivo de ilustrar el funcionamiento del autómata. • Cadena de entrada: ppieswoqauww Esta cadena es una cadena válida ya que contiene las 5 vocales, que por orden de aparición serían {i, e, o, a, u}. El autómata, cuando reconoce una constante, permanece en el estado en el que se encuentre, y sólo cuando reconoce una vocal no leída con anterioridad, cambia a un nuevo estado. En el ejemplo presentado el autómata empezará en el estado inicial 0. 27
1. Autómatas Finitos, Lenguajes, Gramáticas y Expresiones Regulares
Figura 1.14: Diagrama parcial del autómata que reconoce palabras que contienen las 5 vocales
28
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
Al leer la vocal i cambiará al estado i, al leer la vocal e cambiará al estado ei, al leer la vocal o cambiará al estado eio, al leer la vocal a cambiará al estado aeio, y por último al leer la vocal u cambiará al estado de aceptación aeiou. El autómata aceptará la cadena después de leer el último símbolo de la cadena, es decir después de leer la última w. En ese caso la cabeza lectora del autómata estará posicionada sobre el primer blanco que hay después de la cadena. Los diferentes pasos en la ejecución del autómata se muestran en la siguiente tabla.
I Paso I Cinta o
11
ppieswoqauww>. ppieswoqauww>. ppieswoqauww>. ppif:.swoqauww>. ppieQwoqauww>. ppieswoqauww>. ppieswQqauww>. ppieswoqauww>. ppieswoqª-uww>. ppieswoqaJJ.ww>. ppieswoqauww>. ppieswoqauww>.
12
ppieswoqauww~
1 2 3 4'~
5 6 7 8 9 10
I Estado I Función de Transición 0 0 0 {i} {ei} {ei} {ei} {eio} {eio} {aeio} {aeiou} {aeiou} {aeiou}
<5(0,p) = 0 <5(0,p) = 0
<5(0,i) = {i} <5({i},e) = {ei} <5({ei},s) = {ei} <5({ei},w) = {ei} <5( {ei}, o) = {eio} <5({eio},q) = {eio} <5 ({eio}, a) = {aeio} <5 ({aeio}, u) = {aeiou} <5 ({aeiou }, w) = {aeiou} <5 ({aeiou }, w) = {aeiou} Aceptar
• Cadena de entrada: ppuwwat
La cadena ppuwwat sólo contiene dos vocales ({u, a}) y por tanto no es una cadena válida del lenguaje. Durante el procesamiento de esta cadena, el autómata llega al estado au, y con el autómata situado en este estado se termina de leer la palabra. Como este estado no es de aceptación la cadena es rechazada. Los diferentes pasos en la ejecución del autómata se muestran en la siguiente tabla.
29
Ili
l
1. Autómatas Finitos, Lenguajes, Gramáticas y Expresiones Regulares
I Paso I Cinta o 1 2 3 4
5 6 7
ppuwwat).. ppuwwat).. PP11.wwat).. ppuwwat).. ppuwwat).. ppuww!J.t).. ppuwwat).. ppuwwat¿
I Estado I Función de Transición I 0 0 0 {u} {u} {u} {au} {au}
5(0,p) = 0 5(0,p) = 0 5(0,u) = {u} 5({u},w) = {u} 5({u},w) = {u} 5({u},a) = {au} 5({au},t) = {au} Rechazar
Gramática A la hora de definir la gramática hay que tener en cuenta que cada uno de los estados coincidirán con un símbolo no terminal de la gramática2 • Y para cada símbolo no terminal de la gramática hay que contruir una regla de producción para cada uno de los elementos del alfabeto, que se corresponderán con los símbolos terminales de la gramática. Dado el alfabeto del autómata, que coincide con el alfabeto español, existirán 27 producciones asociadas a cada símbolo no' terminal de la gramática, y como existen 32 símbolos no terminales, la gramática que define este lenguaje tendrá 27*32 = 864 producciones. Para reducir el tramaño de la gramática se utilizará el símbolo terminal "e" para representar la totalidad de las consonantes. Además sólo se desarrollarán las producciones de 6 estados, cada uno de ellos representativo del número de vocales que han sido reconocidas hasta ese momento.
o Vocales El único estado que representa el no haber leído ninguna vocal será el estado inicial Las producciones de la gramática asociada a este estado son:
5(0,c) = 0 5(0,a)={a} 5(0,e)={e}
0---+c0 0---+ aA 0---+eE
5(0,i) = {i} 5(0,0) = {o} 5(0,u)={u}
0.
0---+iJ 0---+00 0---+uU
1 Vocal
Los cinco estados que definen el haber leído una sola vocal son {a}, {e}, {i}, {o} y {u}. El autómata no cambiará de estado si, estando en cualquiera de estos estados, vuelve a leer 2La notación de los símbolos no terminales coincide con la notación de los estados del autómata pero en mayúsculas
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
la misma vocal o una consonante. En caso contrario, y dependiendo de la vocal que se lea de la entrada, el autómata cambiará al estado que indique que se han leído. A continuación, se utiliza el estado {i} como ejemplo para presentar cómo se construirían las producciones de la totalidad de los estados que caracterizan el hecho de haber leído dos vocales de la entrada.
6"({i},c) = {i} 6" ({i}, a) = {ai} 6" ({i}, e) = {ei}
6"({i},i) = {i} 6"({i},o) = {io} 6"({i},u) = {iu}
1 -+ el -+ a Al -+ e El
1 1
1
-+
1 1
-+
i 1 o lO
-+
u IU
2 Vocales El autómata necesita 10 estados para representar las diferentes alternativas que se pueden dar después de haber leído dos vocales. Como no importa el orden de aparición de las mismas, si el autómata estuviera en el estado {ei} no es posible saber en qué orden se encuentran esas dos vocales en la cadena de entrada. No obstante, este hecho es irrelevante puesto que lo único que importa es que se hayan leído esas dos vocales. A modo de ejemplo, se muestra a continuación las reglas de producción asociadas al estado { ei}.
6" ({ei} , e) = {ei} 6"( {ei}, a) = {aei} 6"({ei},e) = {ei}
El El El
-+ -+ -+
eEI aAEI e El
6"({ei},i) = {ei} 6"({ei},o) = {eio} 6"({ei},u) = {eiu}
El El El
-+
i El
-+
oEIO 1), EIU
-+
3 Vocales
A modo de ejemplo, se muestra a continuación las reglas de producción asociadas al estado {eiu}.
6" ({ei u } , e) = {ei u} 6"({eiu},a) {aeiu} 6"({eiu},e) = {eiu}
EIU EIU EIU
-+ -+ -+
eEIU 6"({eiu},i) = {eiu} a AEIU 6"({eiu},o) = {eiou} e EIU 6"({eiu},u) = {eiu}
EIU EIU EIU
-+
i EIU o EIOU
-+
u EIU
-+
4 Vocales
A modo de ejemplo, se muestra a continuación las reglas de producción asociadas al estado {aeiu }.
31
1. Autómatas Finitos, Lenguajes, Gramáticas y Expresiones Regulares
<5({aeiu},e) = {aeiu} <5 ( { aei u }, a) = {aei u} <5 ( { aei u}, e) = {aei u } <5({aeiu},i) = {aeiu} <5({aeiu},o) = {aeiou} <5 ( { aeí u } , u) = {aeí u}
AEIU - t AEIU - t AEIU - t AEIU - t AEIU - t AEIU - t
e AEIU a AEIU e AEIU i AEIU o AEIOU u AEIU
5 Vocales
El único estado que tendrá el autómata asociado al hecho de haber leído 5 vocales es el estado {aeíou}, que será el estado de aceptación del autómata. Una vez llega ahí, el autómata no cambia de estado mientras termina de leer la cadena de entrada para finalmente aceptarla. <5 ( { aeiou } , e) = {aeíou} <5 ( { aeíou } , a) = {aeíou} <5 ( { aeíou }, e) = {aeíou} <5( {aeíou}, í) = {aeiou} <5( {aeíou}, o} = {aeíou} <5 ( { aeíou } , u) = {aeiou} <5 ( { aeiou }, .\) = {aeiou}
AEIOU - t e AEIOU AEIOU - t a AEIOU AEIOU - t e AEIOU AEIOU - t í AEIOU AEIOU - t o AEIOU AEIOU - t u AEIOU AETOU - t .\
Ejemplos para practicar con JFLAP. Se sugiere al lector que, teniendo en cuenta el autómata definido en este ejercicio, practique con las siguientes cadenas utilizando la herramienta JFLAP [Rodger y Finley, 20061. • bareo • paraguay • hípotenusa
32
Autómatas, Gramáticas y Lenguajes fonnales: problemas resueltos
IEJERCICIO 1.5 1 ¿Cómo construir el autómata finito determinista equivalente, esto es, que reconozca el mismo lenguaje, que un autómata finito no determinista?
SOLUCIÓN Ya se ha visto que para definir formalmente un autómata finito determinista es necesario definir cada uno de los elementos de la tupla (8,~, o, T, F) donde: 8 es un conjunto de estados, ~ es el alfabeto de la máquina, es un subconjunto de 8x~x8 que representa la función de transición, T es un elemento de 8 que representa el estado inicial y F es un subconjunto de 8 que representa la colección de estados de aceptac;ión. Los autómatas deterministas y los no deterministas se diferencian en la función de transición. En un autómata no determinista puede ocurrir que, para un mismo estado y un mismo símbolo de entrada, se puedan ejecutar diferentes transiciones. Esta posibilidad hace que el conjunto disponga de varias tuplas en las que coincidan los dos elementos iniciales. Sirve a modo de ejemplo, el autómata de la figura 1.15. En este autómata, en el estado qo, si en la entrada se encuentra un símbolo x, el autómata puede cambiar bien al estado ql o bien al estado q2.
o
o
x
Figura 1.15: Ejemplo de un autómata finito no determinista Se dice que un autómata finito no determinista acepta una cadena, si es posible encontrar un conjunto de transiciones que, a partir del estado inicial, conduzcan a un estado de aceptación leyendo dicha cadena de la entrada. Puede ocurrir, por tanto, que para una misma cadena haya un conjunto de transiciones que no conduzcan a un estado de aceptación y otro conjunto de transiciones que sí lo haga. El conjunto de lenguajes que reconocen los autómatas finitos no deterministas coincide con el conjunto de lenguajes que reconocen los autómatas finitos deterministas, y por tanto, el no determinismo no amplía la capacidad de reconocimiento de cadenas de los autómatas finitos. Por consiguiente, para cada autómata finito no determinista se puede definir un autómata finito determinista equivalente, esto es, que reconoce el mismo lenguaje. Para ,
33
1. Autómatas Finitos, Lenguajes, Gramáticas y Expresiones Regulares x,y
x
x x,y
y
Figura 1.16: Representación gráfica de un autómata finito no determinista ilustrar este proceso de construcción, se considera el autómata finito no determinista de la figura 1.16 cuya definición formal es 3:
• S = {A, B, e} .~={x,y}
• 6={(A,y,e), (A,x,A), (A,x,B), (B,x,B), (B,y,B), (e,x,e), (e,y,e)} .T=A • F = {e}
A modo de ejemplo, se van a transformar en tranSICIones deterministas las tres transiciones que parten del estado A. El resto de transiciones se transformarían de igual manera. Así, el autómata finito determinista equivalente al autómata finito no determinista definido anteriormente, se definirá formalmente de la siguiente manera: • Conjunto de estados S. El conjunto de estados del autómata determinista se genera como el conjunto de partes del conjunto de estados del autómata no determinista. Por lo tanto, S = {0, A, B, e, AB, Ae, Be, ABe}. • Alfabeto de la máquina ~. El autómata determinista deberá reconocer el mismo lenguaje que el autómata no determinista, por lo tanto, el alfabeto será el mismo ~={x,y}. 3 Aunque la construcción del autómata finito determinista a partir del autómata finito no determinista de la figura 1.16 puede parecer trivial, en este ejercicio y a modo de ejemplo, se seguirán todos los pasos del proceso general de transformación
34
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos • Función de transición Ó. Para la construcción de la función de transición del autómata determinista se partirá de cada una de las transiciones del autómata no determinista, diferenciando si éstas son deterministas o no deterministas . • Transiciones deterministas: ó(A, y) = e es una transición determinista del autómata no determinista de la figura 1.16. Para construir las transiciones del autómata finito determinista se deberá tener en cuenta todos los nuevos estados que provengan del estado inicial de esta transición. Por lo tanto, como la transición del autómata no determinista tiene como estado inicial, el estado A, los estados iniciales de las nuevas transiciones serán {A, AB, Ae, ABe}. El estado final y el símbolo que se lee de la cinta son los mismos. Por tanto, las transiciones resultantes son: {ó(A, y) = e, ó(AB, y) = Be, ó(AC, y) = e, ó(ABe, y) = Be}. Estas transiciones se corresponden con las siguientes ternas: {(A, y, e), (AB, y, Be), (Ae, y, e), (ABe, y, Be)}. • Transiciones no deterministas: Como ya se ha comentado con anterioridad, la diferencia entre una transición determinista y una no determinista, es la posible existencia de múltiples estados finales para un mismo estado inicial y un mismo símbolo de la entrada. A la hora de transformar las transiciones no deterministas en transiciones deterministas se debe tener esto en cuenta, y por tanto, se debe definir el estado final como la composición de todos los posibles estados finales.
Para la definición del estado inicial de la transición se deben seguir las mismas indicaciones que en el caso anterior. Por tanto, la transición no determinista definida en el autómata de la figura 1.16, equivaldría AB, ó(AB, x) AB, ó(Ae,x) a la transición {ó(A,x) ABe, ó(ABe,x) = ABe}, representada mediante ternas de la siguiente manera: {(A, x, AB), (AB, x, AB), (Ae, x, ABe), (ABe, x, ABe)} . • Estado Inicial T. El estado inicial del autómata finito determinista es el mismo que el estado inicial del autómata finito no determinista, T = A . • Conjunto de estados finales F. Serán estados finales del autómata finito determinista todos aquellos estados que contengan a cualquiera de los estados finales del autómata finito no determinista. Así, por ejemplo, como el autómata finito no determinista del ejercicio, tiene por estado final al estado e, los estados finales del autómata finito determinista son F = {e, Ae, Be, ABe}.
35
1. Autómatas Finitos, Lenguajes, Gramáticas y Expresiones Regulares
IEJERCICIO
1.6'
Construir el autómata finito determinista que reconozca el mIsmo lenguaje que el siguiente autómata:
({A, B, C}, {x, y, z}, {(A,x,A), (A,x,B), (A,z,C), (B,y,Cn, A, {C}). SOLUCIÓN El diagrama de transiciones del autómata finito no determinista del enunciado se muestra en la figura 1.17. x
x y
z
Figura 1.17: Diagrama de transiciones de un autómata finito no determinista A continuación, se definirán cada uno de los elementos de la tupla que define el autómata finito determinista equivalente al autómata del enunciado: • Conjunto de estados S' El conjunto de estados del autómata no determinista es S = {A, B, C}, por lo tanto el conjunto de estados del autómata determinista equivalente es el conjunto de partes de S y por consiguiente S' = {0, A, B, C, AB, AC, BC, ABC}. En la figura 1.18 se muestra la representación gráfica de los estados contenidos en S'. • Alfabeto del autómata ¿; El alfabeto del autómata es el mismo, por lo tanto, ¿;
= {x, y, z}
• Función de transición J El autómata finito no determinista del enunciado tiene las siguientes transiciones J {(A, x, A), (A, x, B), (A, z, C), (B, y, De estas, las transiciones deterministas son (A, z, C), (B, y, C) y las no determinstas son (A, x, A), (A, x, B). A continuación, se muestra cómo determinar las transiciones del autómata finito determinista.
Cn.
36
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
o o o
@
@
Figura 1.18: Representación gráfica de los estados del autómata finito determinista equivalente al autómata finito no determinista de la figura 1.16
z z z
A
AB
Figura 1.19: Transiciones deterministas obtenidas a partir de la transición (A, z, C).
• Transición determinista (A, z, C) La transformación de una transición determinista es sencilla, ya que sólo hay que aplicarla a la totalidad de los nuevos estados que contengan el estado inicial de la transición original. En este ejercicio, en la transición (A, z, C) el estado inicial es A, y por tanto, hay que aplicar esta transición a los estados A, AB, AC, ABC. Por consiguiente las transiciones resultantes son (A, z, C), (AB, z, C), (AC, z, C), (ABC, z, C). Estas transiciones se han representado en la figura 1.19.
• Transición detérminista (B, y, C) De la misma forma, en la transición (B , y, C) el estado inicial es B, Ypor tanto, se debe aplicar esta transición a los estados B, AB, BC, ABC. Por consiguiente, las transiciones resultantes son (B, y, C), (AB, y, C), (BC, y, C), (ABC, y, C) (representadas gráficamente en la figura 1.20).
• Transiciones no deterministas (A, x, A), (A, x, B) En las transiciones (A, x, A) y (A, x, B) el estado inicial es A, y por tanto, se debe aplicar esta transición a los estados A, AB, AC, ABC. Los estados finales son A y B, y por consiguiente el estado final de 37
1. Autómatas Finitos, Lenguajes, Gramáticas y Expresiones Regulares
AB Figura 1.20: Transiciones deterministas obtenidas a partir de la transición (B, y, e). las transiciones será AB. De esta forma las transiciones resultantes serán (A, x, AB), (AB, x, AB), (Ae, x, AB), (ABe, x, AB) (representadas en la figura 1.21).
x
x Figura
1.21:
Transiciones deterministas
definidas
a partir de
las
transiciones
(A, .'E, A) y (A, x, B). • Estado Inicial T
El estado inicial del autómata finito determinista coincide con el estado inicial del autómata finito no determinista y por tanto T = A. • Conjunto de estados finales F
Para definir el conjunto de estados finales del autómata finito determinista, hay que tener en cuenta los estados finales del autómata finito no determinista (que, en el caso de este ejercicio, es el estado e). Por tanto, serán estados finales del autómata determinista todos aquellos estados que se hayan generado a partir del estado e, y por consiguiente, F = {e, Ae, Be, ABe}. Por último, se van a analizar ciertos estados del autómáta finito determinista. Por ejemplo, los estados {0, B, Ae, Be, ABe}, son estados a los que no llega ninguna transición.
38
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos Estos estados se han definido porque fonnan parte del conjunto de partes del conjunto de estados del autómata no determinista original, pero no introducen infonnación en el autómata y no intervienen en el reconocimiento de cadenas del lenguaje. Por consiguiente, se pueden eliminar junto con las transiciones que parten de ellos, sin perder capacidad de reconocimiento. Con el estado A ocurre algo parecido, puesto que no es el estado final de ninguna transición. No obstante, al ser el estado inicial, es fundamental en la definición del autómata. En la figura 1.22 se muestra la representación gráfica del autómata finito detenninista equivalente al autómata no determinista del enunciado.
x Figura 1.22: Autómata finito determinista A continuación, se va a comprobar que ambos autómatas (representados en las figuras 1.17 y 1.22) son equivalentes, esto es, reconocen el mismo lenguaje. El lenguaje aceptado por el autómata no detenninista del enunciado puede representarse mediante la expresión regular (x* xy U x* z). Esta expresión regular se puede descomponer en cadenas que tienen un único símbolo z, y cadenas con más de un símbolo, que serían cadenas fonnadas por cualquier número de x's tenninadas con la secuencia xy o en una z. A modo de ejemplo, se va a comprobar que las cadenas z y xxxy son reconocidas por el autómata detenninista que se ha construido en este ejercicio. Así, en la siguiente tabla se puede comprobar que la palabra z es reconocida por el autómata detenninista, de una fonna muy similar a como lo hubiera hecho el autómata no detenninista.
I Paso I Cinta I Estado I Función de Transición I A I o(A, z) = e o 1 Aceptar e De la misma fonna, en la siguiente tabla se puede comprobar que la cadena xxx y pertenece al lenguaje del autómata finito detenninista. En este caso, el punto de no detenninisto en el autómata del enunciado, se encontraba al leer las cadenas de x's, ya que no se podía comprobar cuál era el último símbolo x que se leía. La fonna de eliminar el no 39
1. Autómatas Finitos, Lenguajes, Gramáticas y Expresiones Regulares
y
Figura 1.23: Autómata finito que reconoce el lenguaje xy*x. determinismo es realizar en su lugar la comprobación de que se ha leído la primera x que es lo que realmente diferencia a las palabras terminadas con el símbolo y.
I Paso I o 1 2 3 4
IEJERCICIO
Cinta J¿xxy XJ¿xy XXJ¿y XXX Y xxxy21
I Estado I Función de Transición I A AB AB B
e
o(A,x) = AB o(AB,x) = AB o(AB,x) = AB o(B,y) = Aceptar
e
1.7'
Mostrar que la unión de dos lenguajes regulares es también un lenguaje regular. Para ello utilizar como ejemplo, los lenguajes generados por las siguientes expresiones regulares: (xy*x) y (x*yx*).
SOLUCIÓN Dados los lenguajes regulares definidos por la expresiones regulares xy*x y x*yx*, este ejercicio muestra cómo construir un autómata finito que reconozca la unión de los dos lenguajes. La propiedad que indica que la unión de dos lenguajes regulares es regular, se aplica a cualquier unión finita de lenguajes regulares. Inicialmente se definirán los autómatas que reconocen cada uno de los lenguajes: • Lenguaje generado por la expresión regular xy* x
Este lenguaje lo componen aquellas cadenas que empiezan y terminan por .1: y tienen un número arbitrario de y's en la parte central (la cadena xx que no contiene símbolos y también pertenece al lenguaje). El autómata finito que reconoce este lenguaje se muestra en la figura 1.23.
40
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
x
x
Figura 1.24: Autómata finito que reconoce el lenguaje x*yx* • Lenguaje generado por la expresión regular x*yx*
Este lenguaje lo componen las cadenas que tienen una y en la parte central, la cual está precedida y seguida de cualquier número de símbolos x (el número de x anteriores y posteriores al símbolo y no tiene por qué coincidir ni se relacionan de ninguna forma). El autómata que reconoce este lenguaje se muestra en la figura 1.24 . El lenguaje unión de los dos lenguajes del enunciado contiene las cadenas de uno u otro lenguaje indistintamente, pero no contiene cadenas que se pudieran constuir como composición de cadenas de ambos lenguajes. Por tanto, ante una determinada cadena de entrada, lo primero que tendría que hacer un autómata finito que reconozca el lenguaje unión, es determinar a qué lenguaje es posible que pertenezca y para ello, su estado inicial realizará la misma función que cada uno de los estados iniciales de los autómatas que reconocen cada uno de los lenguajes que componen la unión. Una vez que el autómata ha determinado a qué lenguaje es posible que pertenezca la cadena de entrada, basta con que realice las mismas operaciones que el autómata que reconoce dicho lenguaje. Por consiguiente, el autómata finito que reconoce la unión de dos lenguajes se construye como la composición de los autómatas finitos que reconocen cada uno de los lenguajes que componen la unión. Formalmente el autómata finito que reconoce la unión de dos lenguajes regulares se define mediante la tupla (S', ~', b', T', F') donde: • El conjunto de estados S' estará compuesto por la unión de los conjunto de estados de los dos autómatas junto con el nuevo estado inicial T' descrito anteriormente. • El alfabeto del autómata lenguajes.
~'
se definirá como la unión de los alfabetos de ambos
• El estado inicial T' permitirá determinar a qué lenguaje es posible que pertenezca una determinada cadena. Este estado será de aceptación si y solo si uno de los estados iniciales de los autómatas que reconocen los lenguajes de partida era de aceptación, esto es, si y solo si la cadena vacía pertenece al lenguaje unión. Lógicamente, los estados iniciales de los autómatas finitos iniciales dejarán de serlo. 41
1. Autómatas Finitos, Lenguajes, Gramáticas y Expresiones Regulares
• Puesto que un autómata finito que reconozca la unión de dos lenguajes sólo debe decidir a qué lenguaje es posible que pertenezca una determinada cadena, la función de transición 8' se definirá de la siguiente manera. Del nuevo estado inicial habrá una transición a cada uno de los estados que eran destino de una transición desde los estados iniciales de los autómatas originales y con el mismo símbolo en la entrada. Para el resto de transiciones 8', el nuevo autómata se comportará de la misma forma que las funciones de transiciones de los autómatas finitos originales . • El conjunto de estados finales será la unión de los conjuntos de estados finales de los autómatas finitos originales En la figura 1.25 se muestra el autómata que reconoce el lenguaje unión de los dos lenguajes del enunciado.
x
x
x
y
y
Figura 1.25: Autómata finito que reconoce el lenguaje (xy*x) U (x*yx*)
IEJERCICIO 1.8 1 Mostrar que la concatenación de dos lenguajes regulares es también un lenguaje regular. Para ello, utilizar como ejemplo los lenguajes generados por las siguientes expresiones regulares: (xy*x) y (x*yx*)
SOLUCIÓN Para demostrar que la concatenación de dos lenguajes regulares es un lenguaje regular, basta con mostrar cómo construir un autómata finito a partir de los autómatas que reconocen los lenguajes que componen la concatenación. 42
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos El lenguaje que resulta de la concatenación de dos lenguajes, contiene cadenas que se forman concatenando cadenas del primer lenguaje con cadenas del segundo lenguaje. La concatenación no es una operación conmutativa. Así por ejemplo, el lenguaje concatenación de los siguientes lenguajes LI = {xy, z} y L 2 = {yy, zx} será L = LI . L 2 = {xyyy, xyzx, zyy, zzx} mientras que L' = L 2 • LI = {yyxy, yyz, zxxy, zxz}. En este ejercicio, se considera LI el lenguaje regular que genera la expresión xy*x y TI el autómata finito que lo reconoce (mostrado en la figura 1.23). De la misma forma, L 2 es el lenguaje regular que genera la expresión x*yx* y T2 el autómata finito que lo reconoce (mostrado en la figura 1.24). Para construir el autómata que reconozca el lenguaje L = LI . L 2 , en primer lugar hay que modificar T2 para que su estado inicial deje de tener esta característica. El estado inicial del autómata será el estado inicial del autómata TI. Los estados de aceptación de TI seguirán siendo estados de aceptación si sólo si el estado inicial de T2 también es un estado de aceptación. A continuación, a partir de cada estado de aceptación de TI se define una transición hacia cada estado de T2 que sea el destino de un arco del estado inicial de T 2 (considerando corno argumento, el mismo símbolo de entrada que en la transición correspondiente de T 2 ). En la figura 1.26 se muestra el autómata que reconoce la concatenación de los lenguajes generados por las expresiones regulares del enunciado.
y
x
x
y Figura 1.26: Autómata que reconoce el lenguaje (xy*x) . (x*yx*)
IEJERCICIO 1. 9 1 Dado un determinado lenguaje, la estrella de Kleene de dicho lenguaje es una operación que, a diferencia de la unión o la concatenación, amplía un lenguaje en vez de combinar dos lenguajes [Brookshear, 1993]. La estrella de Kleene de un lenguaje, se construye formando todas las concatenaciones de cero o más cadenas del lenguaje que se amplía (puesto que se incluye la concatenación de cero cadenas, la cadena vacía será un miembro de la estrella de Kleene de cualquier lenguaje). Esta operación se representa mediante un símbolo *, así, dado Un lenguaje L, la estrella de Kleene de L se representa mediante L *.
1. Autómatas Finitos, Lenguajes, Gramáticas y Expresiones Regulares
Mostrar que la estrella de Kleene de un lenguaje regular es también un lenguaje regular. Utilizar como ejemplo el lenguaje generado por la expresión regular: xy*x.
SOLUCIÓN En la figura 1.23 se muestra el autómata finito que reconoce el lenguaje generado por la expresión regular xy*x. Parece lógico suponer que para construir un autómata que reconozca la estrella de Kleene de un determinado lenguaje, es suficiente concatenar el diagrama original consigo mismo para que una vez que ha terminado de leer una subcadena, vuelva a empezar a reconocer la siguiente. Para ello es necesario modificar el estado de aceptación de manera que se comporte de la misma forma que el estado inicial del autómata original (ver figura 1.27). y
x Figura 1.27: Autómata que reconoce múltiples repeticiones de las cadenas del lenguaje xy*x. Como además la cadena vacía se encuentra en la estrella de Kleene de cualquier lenguaje, hay que generar un nuevo estado inicial, que además de ser estado de aceptación, se comporte igual que el estado inicial del diagrama original. Lógicamente el estado inicial anterior perderá esta característica. En la figura 1.28 se muestra el diagrama de transiciones del autómata finito que reconoce el lenguaje generado por la estrella de Kleene del lenguaje xy*x (que a su vez puede representarse por la expresión regular (.'ry*x)*). y
Figura 1.28: Autómata que reconoce el lenguaje (xy*x)*.
44
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
IEJERCICIO 1.10 I Construir el autómata finito que reconozca el lenguaje generado por la expresión regular (xy· ((xy*x)* U (x*yx*)) . xy).
SOLUCIÓN Para construir el autómata finito que reconozca el lenguaje del enunciado, se va a descomponer el lenguaje en tres lenguajes más sencillos. Una vez construidos los autómatas que reconocen cada uno de estos lenguajes, se unirán teniendo en cuenta los operadores que intervienen en la expresión regular. Así, el lenguaje del enunciado resulta de la concatenación de los siguientes tres lenguajes: xy, ((xy*x)* U x*yx*) y otra vez xy. A su vez el lenguaje ((xy*x)* U x*yx*) resulta de la unión de los lenguajes (xy*x)* y x*yx*. Por tanto los lenguajes que se van a considerar son xy, xy*x y x*yx*. El autómata que reconoce el lenguaje xy es muy sencillo, sólo necesita tener tres estados, un estado inicial, del cual saldrá una transición x para llegar al segundo estado, y de éste saldrá una transición al tercer estado, que será de aceptación, al leer una y. El diagrama de transiciones de este autómata se muestra en la figura 1.29 y se utilizará al pincipio y al final del autómata que reconoce el lenguaje del enunciado.
Figura 1.29: Autómata finito que reconoce el lenguaje xy El segundo y el tercer lenguaje a considerar son xy*x y x*yx*. Estos lenguajes ya han sido estudiados con anterioridad y sus diagramas de transiciones se muestran en las figuras 1.23 y 1.24 respectivamente. No obstante, el lenguaje del enunciado incluye la estrella de Kleene de xy*x, esto es, (xy*x)*, y por tanto, se considerará el diagrama de la figura 1.28 en vez del de la figura 1.24. Para construir el autómata que se pide en el enunciado, la primera operación a realizar será la unión entre los lenguajes (xy*x)* y x*yx*. Para ello, se deben modificar los autómatas que componen la unión, eliminando el carácter de estado inicial de cada uno de los estados iniciales y definiendo un nuevo estado inicial que emula el trabajo que realizaban los estados anteriores. En la figura 1.30 se muestra el resultado. El siguiente paso a realizar es concatenar el autómata que reconoce el lenguaje xy (ver figura 1.29), con el autómata descrito anteriormente (ver figura 1.30). Para ello, se debe eliminar el carácter de estado inicial del estado inicial del segundo autómata, que sería el 45
1. Autómatas Finitos, Lenguajes, Gramáticas y Expresiones Regulares
x
x
x
y x
x
y
Figura 1.30: Autómata que reconoce el lenguaje (( xy*x)* U x*yx*)
x
y
Figura 1.31: Autómata que reconoce el lenguaje (xy. ((xy*x)* U (x*yx*))) estado nuevo que hemos incluido anteriormente. Así mismo, debe dejar de ser estado de aceptación el estado final del primer autómata. En la figura 1.31 se muestra el autómata resultante de estas operaciones. Por último, resta concatenar nuevamente el autómata que reconoce el lenguaje xy (ver figura 1.29) , al final del autómata que se acaba de definir. El resultado se muestra en la figura 1.32. A la transición 5(N, x) = M' se le debe dar el siguiente significado: tras haber leído, y reconocido, el par xy ahora se ha reconocido que se ha ejecutado cero veces la estrella de kleene sobre el lenguaje (xy* x ) * y por lo tanto la x que se lee de la entrada corresponde al par final xy. Una vez finalizado el proceso de construcción del autómata, los estados F, 1 Y L' terminan siendo estados no accesibles, y por tanto, se pueden eliminar junto a todas sus transiciones. En la figura 1.33 se muestra el autómata simplificado.
46
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
x
x
y Figura 1.32: Autómata que reconoce el lenguaje (xy . ((xy*x)* U (x*yx*)) . xy)
x
x
x
x
y x
x
x
x
y Figura 1.33: Autómata simplificado que reconoce el lenguaje (xy. ((xy*x)* U (x*yx*)) . xy)
47
1. Autómatas Finitos, Lenguajes, Gramáticas y Expresiones Regulares
IEJERCICIO 1.111 Dado el alfabeto ~ = {x, z}, construir un autómata finito que reconozca el lenguaje formado por las cadenas que contienen al menos una z, y en las que cada z está inmediatamente precedida y seguida por una x.
SOLUCIÓN El lenguaje del enunciado comprende todas las cadenas formadas por x's y z's que contienen al menos un símbolo z y que cumplen que cada símbolo z está inmediatamente precedido y seguido por una x. Ejemplos de cadenas válidas del lenguaje son: xzxx y xzxzx. Por el contrario, las siguientes cadenas no pertenecen al lenguaje del enunciado: zxzx o zx. Un autómata finito que reconociera este lenguaje debería controlar que cuando se encuentre un símbolo z en la entrada, debe haber leído antes una x y a continuación debe leer otro símbolo x de la entrada. Una vez realizada esta comprobación debería continuar leyendo la cadena ,ge entrada para comprobar que, en el caso de que haya más símbolos z en la cadena de entrada, se cumplen las condiciones del lenguaje (esto es, no basta con que se cumpla la condición del lenguaje para la primera ocurrencia del símbolo z). Para construir el autómata se consideran los siguientes cuatro estados: qO,qbq2 y q3. Los estados qo y q3 se corresponden con el estado inicial y el estado de aceptación respectivamente. En primer lugar, el autómata comprobará que el primer símbolo que se lea de la entrada sea una x, ya que, en caso contrario, en la cadena de entrada aparecería una z que no estaría precedida de ningún símbolo x y por tanto no sería una cadena válida del lenguaje. Del estado ql saldrá una transición etiquetada con el símbolo z y con destino q2. Ahí es donde se comprobará que el símbolo z está inmediatamente seguido por una x (por tanto, desde el estado q2 al estado de aceptación habrá una transición etiquetada con el símbolo x). Puesto que puede haber varios símbolos z en una cadena válida del lenguaje, será necesario definir transiciones, a partir del estado de aceptación q3 para comprobar que siguen cumpliendo las condiciones del lenguaje. Siguiendo estas especificaciones, en la figura 1.34 se muestra el diagrama de transiciones de un autómata finito, que aunque pueda parecerlo, no reconoce el lenguaje del enunciado ya que por ejemplo, no reconoce la cadena xzxx que es una cadena válida del lenguaje. El problema de este autómata es la transición <5 ( q3, x) = ql, ya que está obligando a que una vez que la leído el patrón xzx de la entrada, si sigue habiendo símbolos x, debe haber más símbolos z y esa no es una restricción del lenguaje. Para solucionar este problema, se modifica esta transición en la manera en que se muestra en la figura 1.35 48
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
x
x Figura 1.34: Autómata finito que no reconoce la cadena xzxx
x
x
Figura 1.35: Autómata finito que reconoce el lenguaje formado por las cadenas que contienen al menos una z, y cada z está inmediatamente precedida y seguida por una x
Ejemplos de eje~ución del autómata Se van a considerar a continuación diferentes cadenas de entrada con el objetivo de ilustrar el funcionamiento del autómata.
• Cadena de entrada: xzxx Esta es una cadena válida del lenguaje. En la siguiente tabla se muestran las transiciones que va realizando el autómata. Tal y como ya se ha hecho en ejercicios anteriores, el símbolo actual aparecerá subrayado
I Paso I Cinta I Estado I Función de Transición I o ;J2ZXXA qo eS(qo, x) = ql 1 2 3 3
X;;'XXA XZXXA XZX;J2A
xzxx¿
ql q2 q3 q3
eS (ql, z) = q2 eS (q2, x) = q3 eS (q3, x) = q3 Aceptar
• Cadena de entrada: xz Esta es una cadena no válida del lenguaje. En la siguiente tabla se muestran las transiciones que va realizando el autómata. 49
1. Autómatas Finitos, Lenguajes, Gramáticas y Expresiones Regulares
I Paso I Cinta I Estado I Función de Transición I o 1 2
;rZA
X~A XZ¿
qo ql q2
b(qo, x) = ql b(ql , z) = q2 Rechazar
Expresión Regular Siguiendo el procedimiento de construcción de una expresión regular a partir de un autómata finito [Hopcroft et al., 2008, Brookshear, 1993], la expresión regular equivalente al autómata de este ejercicio es la siguiente: xx* zxx* (zxx*)*
Ejemplos para practicar con JFLAP Se sugiere al lector que, teniendo en cuenta el autómata definido en este ejercicio, practique con las siguientes cadenas utilizando la herramienta JFLAP [Rodger y Finley, 2006J. • zzxz • xxxx • XXXZ.T
IEJERCICIO 1. 12 1 Indicar el lenguaje que genera la siguiente expresión regular (xy)* . (xz U y) . (zz)*, y construir el autómata finito equivalente.
SOLUCIÓN La expresión regular del enunciado genera cadenas que cumplen las siguientes condiciones. En primer lugar, son cadenas cuyo prefijo son concatenaciones de cero o más veces el patrón xy (puesto que en la expresión regular se indica la estrella de Kleene del patrón xy). A continuación pueden contener el patrón xz o el símbolo y (puesto que en la expresión regular aparece la unión de estos dos patrones). Finalmente, terminan con concatenaciones de cero o más veces el patrónzz (puesto que en la expresión regular aparece la estrella de Kleene de zz).
50
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos Puesto que es un lenguaje regular se puede construir un autómata finito que lo reconozca. Para facilitar la construcción de este autómata se va a descomponer el lenguaje en tres lenguajes más simples. Así, el lenguaje del enunciado se compone de la concatenación de tres lenguajes expresados por las siguientes expresiones regulares (xy)*, (xz U y) Y (zz)* cuyos autómatas finitos equivalentes se muestran en las figuras 1.36, 1.37 Y 1.38 respectivamente. A partir de estos autómatas se puede construir el autómata que reconozca la concatenación de los tres lenguajes siguiendo el procedimiento visto en otros ejercicios. Así, el autómata que reconoce el lenguaje del enunciado se muestra en la figura 1.39. Puesto que aparecen nodos a los que no les llegan ninguna transición, éstos se pueden eliminar, obteniendo como resultado el autómata cuyo diagrama aparece en la figura 1.40. Se deja como ejercicio al lector la justificación de por qué es posible eliminar el estado q5 del diagrama de la figura 1.39 cuando sí que es destino de alguna transición.
x
~ y Figu;~ 1.36: Autómata finito que reconoce el lenguaje (xy)*
Ejemplos de ejecución del autómata Se van a considerar a continuación diferentes cadenas de entrada con el objetivo de ilustrar el funcionamiento del autómata.
• Cadena de entrada: xzzz Esta es una cadena válida del lenguaje. En la siguiente tabla se muestran las transiciones que va realizando el autómata. Tal y como ya se ha hecho en ejercicios anteriores, el símbolo actual aparecerá subrayado
z
x y
Figura 1.37: Autómata finito que reconoce el lenguaje (xz U y)
51
1. Autómatas Finitos, Lenguajes, Gramáticas y Expresiones Regulares
z
~ . z Figura 1.38: Autómata finito que reconoce el lenguaje (zz)*
x x
z
z
z y
Figura 1.39: Autómata finito que reconoce el lenguaje (xy)*(xz U y)(zz)*
z
x
z z
y
Figura 1.40: Autómata finito simplificado que reconoce el lenguaje (xy)*(xz U y)(zz)*
52 -
------
----
~-
---
~-~~~
~---
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
I Paso I Cinta I Estado I Función de Transición I o
J2ZZZ)"
1 2
x~zz)..
3 4
xzz~)..
xz~z)..
xzzz~
qo q3 q4 q6 q4
8(qOl x) = q3 8(q3l z) = q4 8(q4l z) = q6 8(q6l z) = q4 Aceptar
En el paso O podría haberse ejecutado la transición 8 (qo 1 x) = ql que hubiera llevado al autómata a rechazar la cadena. Al ser un autómata no determinista, para aceptar la cadena, basta con que haya un camino que, leyendo la cadena de entrada, lleve al autómata a un estado de aceptación. Por tanto, en este caso, la cadena es aceptada. • Cadena de entrada: xy
Esta es una cadena no válida del lenguaje. En la siguiente tabla se muestran las transiciones que va realizando el autómata.
. , I Paso I Cinta I Estado I Función de Transición I O 1 2
J2Y)..
xy).. xy~
qó ql qo
8(qOl x) = ql 8(qll y) = qo Rechazar
En el paso O se podría haber ejecutado igualmente la transición 8(qOl x) = q3. En este caso, estando en el estado q3 y habiendo en la entrada un símbolo y, no habría transición aplicable con lo que la cadena sería rechazada igualmente.
Ejemplos para practicar con JFLAP Se sugiere al lector que teniendo en cuenta el autómata definido en este ejercicio, practique con las siguientes cadenas utilizando la herramienta JFLAP [Rodger y Finley, 2006]. • xzzz • yxz • xyxyy
1. Autómatas Finitos, Lenguajes, Gramáticas y Expresiones Regulares
IEJERCICIO 1. 13 1 Sea L un lenguaje regular del alfabeto I; y L' el lenguaje formado por todas las cadenas wv tales que w E L Y v E I;* - L. ¿Es L' un lenguaje regular? En caso afirmativo construir el autómata finito que reconozca el lenguaje L' donde I; = {x, y} y L = {w I w tiene un número par de x}
SOLUCIÓN Independientemente del alfabeto 2: y el lenguaje L que se consideren, si L es un lenguaje regular, entonces su complementario, 2:* - L, siempre es un lenguaje regular [Hopcroft et al., 2008] y [Brookshear, 1993] (ver siguiente problema). Así mismo, ya se ha visto que la concatenación de lenguajes regulares siempre es regular. Por tanto, si L es regular entonces L' es regular. Teniendo en cuenta el enunciado, el autómata finito que reconoce el lenguaje L se muestra en la figura 1.41 (se considera que las cadenas que no contienen ninguna x pertenecen al lenguaje L).
y
y
Figura 1.41: Autómata finito que reconoce el lenguaje L = {w I w tiene un número par de x} El lenguaje I;* - L es el lenguaje complementario de L y contendrá todas aquellas cadenas que tienen un número impar de x's (el diagrama de transiciones del autómata que reconoce el lenguaje complementario de L se muestra en la figura 1.42). Así, el autómata que reconoce el lenguaje L' resultará de la concatenación de los dos autómatas anteriores (ver figura 1.43). y
y
x
Figura 1.42: Autómata finito que reconoce el lenguaje que contiene las cadenas con un número impar de x's
Autómatas, Gramáticas y Lenguajes fanuales: problemas resueltos
y
y
x Figura 1.43: Autómata finito que resulta de la concatenación de los autómatas de las figuras 1.42 y 1.41 De hecho, en este caso, el lenguaje L' coincide con el complementario de L y contendrá aquellas cadenas con un número impar de x's. Se deja como ejercicio al lector construir la expresión regular y la gramática regular que generan el lenguaje L'
IEJERCICIO l.l:' I [Adaptado de [Brookshear, 1993]]. Demostrar o dar un contraejemplo de las siguientes afirmaciones. Se supone que todos los lenguajes a los que se refiere el enunciado, son sobre el mismo alfabeto ~ y que N es estrictamente positivo. Cuando corresponda, para cada ejemplo, construir el autómata, la gramática o la expresión regular que reconozca el lenguaje. (a). Todo subconjunto de un lenguaje regular es regular. (b). El complementario de un lenguaje regular es regular. (c). La unión infinita de lenguajes regulares es regular. (d). Todo lenguaje finito es regular. (e). Todo lenguaje cuyo complementario sea finito es regular. SOLUCIÓN (a). Todo subconjunto de un lenguaje regular es regular
Esta afirmación es falsa. Sea, por ejemplo, el lenguaje ~* que contiene todas las cadenas que se pueden formar con el alfabeto ~ = {x, y}. Este es un lenguaje regular que puede ser reconocido por el autómata de la figura 1.44.
55
1. Autómatas Finitos, Lenguajes, Gramáticas y Expresiones Regulares
x
y
Figura 1.44: Autómata finito que reconoce el lenguaje ~* Este lenguaje contiene a todos los lenguajes que se pueden formar con el alfabeto ~ y por tanto, contiene al lenguaje L = {xnyn : n E N} que es un lenguaje independiente del contexto no regular (ver capítulo 2). (b). El complementario de un lenguaje regular es regular
Esta afirmación es verdadera. Para demostrarlo basta con tomar el diagrama de transiciones del autómata finito que reconoce el lenguaje regular y modificarlo de manera que los estados de aceptación dejen de serlo mientras que los estados que antes no era de aceptación lo sean. El resultado que se obtiene de estas modificaciones es un autómata'finito que reconoce el lenguaje complementario del lenguaje original. Sea, por ejemplo, L el lenguaje generado por la siguiente expresión regular (xUy)*xy. La figura 1.45 muestra el autómata finito que lo reconoce. y
x
y Figura 1.45: Autómata finito que reconoce el lenguaje (x U y) *xy El lenguaje complementario de L (LC) será el conjunto de cadenas que no terminan en xy. Siguiendo las modificaciones que se han indicado anteriormente se obtiene el autómata de la figura 1.46 que reconoce LC. (c). La unión infinita de lenguajes regulares es regular
Esta afirmación es falsa. Como contraejemplo, sea Li = {Xiyi} siendo i un determinado número natural. Así, por ejemplo, L 2 = {X2y2}. La unión de todos los lenguajes Li desde O hasta +00 es el lenguaje independiente del contexto no regular {xnyn : n E N}.
56
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos y
x
y Figura 1.46: Autómata finito que reconoce el lenguaje complementario de (x U y)*xy
La unión de lenguajes regulares sólo es necesariamente regular para un conjunto finito de lenguajes. El método que permite la construcción del autómata que reconoce la unión de dos lenguajes regulares se ha visto anteriormente en este capítulo. (d). Todo lenguaje finito es regular
Esta afirmación es verdadera. Dado un lenguaje formado por un conjunto finito de cadenas, es fácil construir un autómata que reconozca cada una de estas cadenas. Sea por ejemplo, el lenguaje L = {x, xy} que es reconocido por el autómata de la figura 1.47.
x,y
Figura 1.47: Autómata finito que reconoce el lenguaje {x, xy} (e). Todo lenguaje cuyo complementario sea finito es regular Esta afirmación es verdadera. Supongamos que L es un lenguaje cuyo complementario, LC, es finito. Entonces LC es regular, y, por tanto, (LC)C también es regular. Como (LC)C = L, entonces L es regular. Un ejemplo obvio sería el lenguaje L compuesto por todas las cadenas distintas de vacío que se pueden formar con el alfabeto 2: = {x, y}. El complementario de LC será el lenguaje finito formado por una única cadena, la cadena vacía (así, LC = {).}). El autómata que reconoce este lenguaje se muestra en la figura 1.48 y el autómata que reconoce el lenguaje L se muestra en la figura 1.49.
1. Autómatas Finitos, Lenguajes, Gramáticas y Expresiones Regulares
x,y
Figura 1.48: Autómata finito que reconoce el lenguaje formado por la cadena vacía
x,y
Figura 1.49: Autómata finito que reconoce el lenguaje compuesto por todas las cadenas distintas de la cadena vacía
CAPÍTULO 2
Autómatas a Pila, Lenguajes Independientes del Contexto, Gramáticas Independientes del Contexto
En este capítulo se tratarán problemas relacionados con las máquinas teóricas conocidas como autómatas a pila, que son capaces de reconocer lenguajes independientes del contexto. Los autómatas a pila y los lenguajes independientes del contexto son la base para la construcción de los analizadores sintácticos de los compiladores. Estos analizadores son los encargados de reconocer sentencias correctas del lenguaje, como por ejemplo: sintaxis correcta de una sentencia i f.
2.1.
Base Teórica
Para la resolución de los problemas de este capítulo es necesario conocer: • Los autómatas a pila deterministas y no deterministas y su representación mediante diagramas de estados finitos. • Los lenguajes reconocidos por los autómatas a pila son los llamados lenguajes independientes del contexto. Es conveniente conocer también ejemplos de lenguajes independientes del contexto, tales como {xnyn : n E N}. • Límites de los autómatas a pila y ejemplos de lenguajes no independientes del contexto por ejemplo {xnyn zn : n E N}.
q
2. Autómatas a Pila, Lenguajes y Gramáticas Independientes del Contexto
• Relación entre los lenguajes independientes del contexto y los lenguajes regulares. El conjunto de los lenguajes independientes del contexto contiene al conjunto de los lenguajes regulares. ASÍ, todo lenguaje regular es un lenguaje independiente del contexto pero no todo lenguaje independiente del contexto es regular (por ejemplo el lenguaje {xnyn : n E N}). • Un autómata a pila acepta una cadena cuando, al terminar de leer el último símbolo de la cadena, se encuentra en un estado de aceptación. De esta definición se desprende que no es necesario que el autómata vaCÍe su pila antes de aceptar la cadena. No obstante, es posible modificar cualquier autómata a pila para que vaCÍe su pila antes de aceptar una cadena [Hopcroft et al., 2008] y [Brookshear, 19931 • La definición inicial de un autómata a pila es no determinista. Los autómatas a pila deterministas requieren una función de transición que, dado un estado, un símbolo de la entrada y un símbolo de la cima de la pila, determine unívocamente el estado al que cambia el autómata y la acción a realizar en la pila. Al contrario ~e los autómatas a pila no deterministas, existen autómatas a pila deterministas para los que no es posible encontrar un autómata a pila determinista equivalente (esto es, que acepte el mismo lenguaje) y que vaCÍe su pila al aceptar las cadena. La relación entre los diferentes tipos de lenguajes y máquinas vistos hasta el momento se muestra en la figura 2.1.
• Gramáticas independientes del contexto. Las gramáticas independientes del contexto son aquellas gramáticas que cumplen que el lado izquierdo de todas sus producciones contiene un único no terminal. A diferencia de las gramáticas regulares, no existe ninguna condición para el lado derecho de las producciones. • Analizadores sintácticos LR(k) y LL(k). • Procedimiento para construir un autómata a pila a partir de la gramática independiente del contexto equivalente y viceversa. Para cubrir los contenidos anteriores se pueden consultar numerosas referencias en la literatura y de nuevo, se recomiendan las siguientes dos fuentes: 60
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
Lenguajes independientes
de l contexto
A: Lengua jes aceptados por autóma t as a pi la determinis tas que deben vaciar su pi la antes de aceptar una ca dena B: Leng uajes independientes de! contexto deterministas
Figura 2.1: Relación entre los lenguajes independientes del contexto deterministas, no deterministas y los le'nguajes regulares. • Capítulos 5, 6 Y 7 del libro Teoría de autómatas, lenguajes y computación. H. E. Hopcroft, R. Motwani, J. D. Ullman. Pearson. Addison Wesley. Tercera Edición, 2008 ([Hopcroft et al., 2008]). • Capítulo 2 del libro Teoría de la Computación: Lenguajes Formales, Autómatas y Complejidad. J.G. Brookshear. Addison-Wesley Iberoamericana, 1993 ([Brookshear, 1993]). La nomenclatura que se va a utilizar en este capítulo será la siguiente: • Un autómata a pila se representa formalmente mediante la siguiente tupla: (S, ~, r , T , T, F) donde S es un conjunto de estados, ~ es el alfabeto de la máquina, r es la colección finita de símbolos de pila, T es una colección finita de transiciones, T es un elemento de S que representa el estado inicial y F es un subconjunto de S que representa la colección de estados de aceptación. En el caso de los autómatas a pila, las transiciones se definen mediante tuplas (so , a, b; SI , e) donde: So Y SI son los estados de partida y de destino de la transición, a representa el símbolo que se lee de la entrada, b representa el símbolo que se extrae de la cima de la pila y e representa el símbolo que se introduce en la pila.
61
2. Autómatas a Pila, Lenguajes y Gramáticas Independientes del Contexto
los dos primeros elementos indican el estado actual y el símbolo que se lee de la entrada, el tercer y el cuarto elemento indican el símbolo que se extrae de la cima de la pila y el estado al que se traslada el autómata. Para terminar, el último elemento de la tupla indica el símbolo que se introduce en la pila. • La representación del autómata a pila mediante un diagrama de transiciones es similar a la representación utilizada para los autómatas finitos salvo por la etiqueta de los arcos que representan las transiciones. En este caso, los arcos estan etiquetados por una tripleta a, b; e donde a representa el símbolo que se lee de la entrada, b representa el símbolo que se extrae de la cima de la pila y e representa el símbolo que se introduce en la pila. De nuevo, al igual que en el capítulo anterior, se representarán las posiciones no escritas de la cinta de entrada mediante el símbolo .A.. • Puede ocurrir que en algún caso, el autómata ejecute una transición entre estados, sin leer ningún símbolo de la cinta de entrada o sin realizar ninguna operación con la pila. En estos casos, se utilizará el símbolo E de la siguiente manera. Si el símbolo E, aparece en el primer elemento de la tripleta que define una transición en el diagrama de transiciones del autómata, significa que al ejecutarse esa transición no se lee ningún símbolo de la cinta de entrada. Si por el contrario el símbolo E aparece en el segundo elemento de la tripleta, significa que al ejecutarse esa transición no se lee el símbolo que se encuentra en la cima de la pila. Por último, si el símbolo E aparece en el tercer elemento de la tripleta, entonces al ejecutar esta transición el autómata no introduce ningún símbolo en la cima de la pila. En el caso especial en que un autómata de pila sólo tenga transiciones del tipo (So, x, E; SI, E), que sólo leen símbolos de la entrada pero no modifican la pila, se trata de un autómata de pila cuyo funcionamiento es igual al de un autómata finito puesto que ignora la existencia de la pila. • En algunas ocasiones se requiere que el autómata inserte de una vez (esto es, en una sóla transición) varios símbolos en la pila. En estos casos, el tercer elemento de la tripleta que define la transición no será un único símbolo sino una cadena de símbolos. El orden en el que se introducen los símbolos en la pila es importante puesto que el autómata a pila sólo tiene acceso a la cima de la pila. En este texto se representará este tipo de transiciones de la siguiente manera: (a, x; xyz) que indica que si se lee una a de la entrada y una x en la cima de la pila, entonces se introduce en la pila los símbolos x, y y z en ese orden (por tanto, en la cima de la pila se encontrará el símbolo z). Esta operación no supone ninguna ampliación de la capacidad reconocedora de los autómatas a pila, sino que es más bien una simplificación de sus diagramas de transiciones, ya que evitan utilizar transiciones que no leen símbolos de la cinta de entrada sino que únicamente realizan operaciones de introducción en la pila.
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
2.2. Problemas resueltos
IEJERCICIO 2.11 Construir el autómata a pila que reconoce el lenguaje L
=
{xnyn : n
> 0, n
E N}
SOLUCIÓN Este lenguaje se usa comúnmente para mostrar un ejemplo de lenguaje independiente del contexto no regular. Esto es, se puede construir un autómata a pila que lo reconozca pero no un autómata finito. Este lenguaje está compuesto por las cadenas que tienen un mismo número de x's y de y's y en las que, además, las x's preceden a las y's. Para demostrar que este lenguaje no es regular, esto es, no puede definirse un autómata finito que lo reconozca, se aplica el Lema de Bombeo [Hopcroft et al., 2008] y [Brookshear, 19931. El Lema del Bombeo aplicado a los autómatas finitos, indica que si un autómata fuera capaz de reconocer cadenas del lenguaje {xnyn : n E N} entonces también debería ser capaz de reconocer cadenas del lenguaje {xnym : n i= m n, m E N} que no pertenecen a L. De manera informal, un autómata que reconozca el lenguaje del enunciado debe saber cuántas x's hay en la cadena, para saber que a continuación, hay exactamente el mismo número de y's. Los autómatas a pila utilizan su pila a modo de memoria. Por tanto, la forma en la que el autómata será capaz de recordar cuántas x's ha leído de la entrada será introduciendo una marca en la pila por cada x leída. Para comprobar que hay el mismo número de y's, el autómata sacará una marca de la pila por cada y leída. Si al terminar de leer la totalidad de las y's se ha vaciado la pila, significa que hay el mismo número de x que de y. Para simplificar la gestión de la pila, a la hora de saber si se ha vaciado o no, se utiliza una marca de pila vacía (en este caso se utilizará el símbolo #). Este símbolo especial, se debe introducir en la pila antes de empezar a tratar la cadena. Si al terminar de leer la cadena en la pila sólo queda este símbolo, entonces el autómata ha terminado de leer la cadena y en la pila no quedan más símbolos. Formalmente, el autómata que reconoce el lenguaje del enunciado se define de la siguiente manera: • S = {0, X, Y, V, F} • ~={x,y}
•r=
{a, #} 63
2. Autómatas a Pila, Lenguajes y Gramáticas Independientes del Contexto y,a;E
X,E;a
0
E,E;U
A,~;E
[]
X,E;E
y,a;E
y,~;E
y,~;E
Figura 2.2: Autómata a pila que reconoce el lenguaje {xnyn : n E N+}.
•
T
=0
• F = {V}
• T = {(0, E, E; X, #), (X, x, E; X, a), (X, y, a; Y, E), (Y, y, a; Y, E), (Y, A, #; V, E), (X, y, #; F, E), {Y, X, E; F, E), (Y, y, #; F, E), (Y, A, a; F, E)}
La figura 2.2 muestra el diagrama de transiciones de este autómata. Se deja al lector como ejercicio, el modificar el autómata para que sea capaz de reconocer el lenguaje {xnyn : n E N} donde n puede cumplir n = O. Nótese que la única diferencia con el lenguaje del enunciado es que, en este caso, el autómata debe ser capaz de reconcer la cadena vaCÍa.
Ejemplos de ejecución del autómata Se van a considerar a continuación diferentes cadenas de entrada con el objetivo de ilustrar el funcionamiento del autómata.
• Cadena de entrada: xxxyyy En la siguiente tabla se muestran las transiciones entre estados y el estado de la cinta y de la pila para esta cadena de entrada. 64
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
I Estado I Pila I Función de Transición I I Paso I Cinta o ':E).;XYYY 5(0, E, E) = (X,~) 0 1
2
3 4 5 6 7
8
J;.xx yyy XJ;.I;yyy I;XJ;.yyy X.'Ex yyy xxxyyy xxxyyy :rxxyyy¿ xxxyyy¿
X X X X
~
Y Y Y V
~ aa
~a
5(X, x, E) = 5(X, x, E) = 5(X, x, E) = 5(X, y , a) = 5(Y, y , a) = 5(Y, y , a) =
~
5 ( Y, A ,~ ) =
~a ~ aa ~ aaa
(X , a) (X , a) (X , a)
(Y,E) (Y , E) (Y, E) (V,E)
Aceptar
• Cadena de entrada: .'E.'E yyy Este es un ejemplo de cadena no válida del lenguaje. En la siguiente tabla se muestra paso a paso la ejecución del autómata con esta cadena de entrada.
I Paso I Cinta -., O 1 2 3 4
5 6
I Estado I Pila I Función de Transición I J;.x yyy 5(0, E, E) = (X,~) 0 J;.x yyy XJ;.yyy xx yyy :rx yyy x.'Eyyy xxyyy¿
X X X
~
Y Y F
~a
~a ~ aa
~
5(X, x, E) = 5(X, x, E) = 5(X, y , a) = 5(Y, y , a) = 5(Y, y ,~ ) =
(X , a) (X , a) (Y, E) (Y, E) (F, E)
Rechazar
Gramática La gramática independiente del contexto que genera el lenguaje del enunciado es :
5 5
----+ ----+
x5y xy
donde se aprecia que la gramática tiene un único no terminal 5, dos no terminales x e y y las dos reglas de producción anteriores. A modo de ejemplo, se muestra a continuación la derivación de la cadena xxxyyy.
I Paso I Producción I Palabra I O 5 1 2 3
S S S
----+ ----+ ----+
x5y x 5y xy
x5y .'Ex5yy xxxyyy 65
2. Autómatas a Pila, Lenguajes y Gramáticas Independientes del Contexto Se deja al lector como ejercicio, el modificar la gramática para que sea capaz de generar la cadena vacía.
Ejemplos para practicar con JFLAP Se sugiere al lector que teniendo en cuenta el autómata definido en este ejercicio, practique con las siguientes cadenas utilizando la herramienta JFLAP [Rodger y Finley, 20061. • xxxxy • xxyyxxyy • yxxy • xxxxyyyy
En los tres primeros ejemplos se presentan ejemplos de cadenas no válidas del lenguaje del enunciado. De hecho cada una de ellas, se corresponden con las transiciones del autómata cuyo estado destino es el estado de error.
IEJERCICIO 2.21 Construir el autómata a pila que reconozca el lenguaje L > O; n, m,p E N}.
p; n, m,p
n+
SOLUCIÓN El objetivo de este ejercicio es mostrar que la pila de un autómata a pila se puede llenar y vaciar, incluso completamente, varias veces durante la evaluación de una cadena. Las cadenas pertenecientes al lenguaje L están compuestas por los símbolos x, y y z, donde las x's deben estar seguidas de las y's y a su vez, las y's deben estar seguidas de las z's. Además, el número de y's debe coincidir con la suma del número de x's y z's. Algunos ejemplos de cadenas válidas de este lenguaje son xxyyyz o xyyz. Por el contrario, las siguientes cadenas no pertenecen al lenguaje L: xyz, xz o la cadena vacía A. El autómata a pila que reconoce el lenguaje L puede definirse mediante la combinación de dos autómatas a pila que a su vez reconozcan lenguajes cuyas cadenas siguieran el patrón aCbd , donde a y b son dos símbolos determinados del alfabeto y c y d cumplen que c, d E 66
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
ar
o, :y,
)e
ta
+
N, c, d > OY c = d. De esta manera, las cadenas pertenecientes a L, se descompondrían en dos subcadenas, unasubcadena de la forma xnyn y otra subcadena de la forma yP zp. Esto es así puesto que debe cumplirse que m = n + p entonces ym = yn+p teniendo en cuenta que yn+p = ynyp. De esta manera, las cadenas del lenguaje L pueden representarse de esta otra forma {xnynypzp 10 < n,p E N}. Por tanto, de manera informal puede decirse que el autómata a pila que reconoce L debe realizar dos veces el mismo trabajo. No obstante, cuando el autómata lea de la entrada un símbolo y, debe ser capaz de decidir si está leyendo una y de la primera parte de la cadena (esto es, en la que tiene que comparar el número. de x's con el de y's) o por el contrario, está leyendo una y de la segunda parte de la cadena (esto es, en la que tiene que comparar el número de y's con el número de z's). Este control se va a realizar utilizando la pila de la siguiente manera. Mientras el autómata encuentre en la entrada el símbolo x, introducirá en la pila un símbolo a modo de contador (en este ejercicio se utiliza el símbolo a que no pertenece al alfabeto del lenguaje). A continuación, mientras el autómata encuentre en la entrada el símbolo y irá desapilando el símbolo a de la pila. Cuando encuentre el símbolo de pila vacía, habrá leído de la entrada el mismo número de x's que de y's, y por tanto, deberá comprobar a continuación, si lee el mismo número de y's que z's. El proceso será similar al anterior, peFO esta vez, mientras el autómata lea el símbolo y de la entrada, apilará el símbolo a en la pilal y, a continuación, mientras el autómata lea el símbolo z de la entrada irá des apilando el símbolo a de la pila. El autómata llegará a un estado de aceptación cuando encuentre el símbolo de pila vacía y llegará al estado de error en cualquier otro caso. Formalmente, el autómata que reconoce el lenguaje L se define de la siguiente manera:
• S={0,X,Y,Y',Z,V,F} .~={x,y,z}
•r
=
{a,#}
y
-T=0 le
• F
=
{V}
S. ),
n n
- El conjunto T se muestra en el diagrama de transiciones del autómata de la figura 2.3.
¡.Cuando el autómata lea la primera y de la segunda parte de la cadena, además de apilar el símbolo a, debe apilar el símbolo de pila vacía que ha desapilado anteriormente
67
2. Autómatas a Pila, Lenguajes y Gramáticas Independientes del Contexto
X,E;a
y,a;E y,a;E
o
Z,E;E
Z,a;E Z,a;E Figura 2.3: Autómata a pila que reconoce el lenguaje {xnym zP, m
y,E;a
=
n
+ p, O <
m, n, p E
N}.
Ejemplos de ejecución del autómata Se van a considerar a continuación diferentes cadenas de entrada con el objetivo de ilustrar el funcionamiento del autómata.
• Cadena de entrada: xxyyyz La cadena xxyyyz pertenece al lenguaje. En la siguiente tabla se muestra la ejecución del autómata con esta cadena de entrada. Paso
Cinta
Estado
O 1 2 3 4 5 6 7 8
;¡¿xyyyz ;¡¿xyyyz X;¡¿yyyz xxyyyz xxyyyz xxyyyz xxyyy;:¿ xxyyyz¿ xxyyyz¿
0
• Cadena de entrada: xxyyyy z
68
X X X'
y Y
y' Z V
Pila ~ ~a ~aa
~a
~ ~a
~
Función de Transición
0(0, E, E) = (X,~) o(X, X, E) = (X, a) o(X, x, E) = (X, a) o(X, y, a) = (Y, E) o(Y, y, a) = (Y, E) o(Y, y,~) = (Y', ~a) o(Y', z, a) = (Z, E) o(Z, '\J) = (V, E) Aceptar
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
La cadena xxyyyyz no pertenece al lenguaje L puesto que el número de y's es mayor que la suma del número de x's y de z's. En la siguiente tabla se muestra la ejecución del autómata con esta cadena de entrada.
I Paso I
Cinta
o
J¿xyyyyz J¿xyyyyz XJ¿yyyyz xxyyyyz xxyyyyz xxyyyyz xxyyyyz xXYYYYZc xxyyyyz¿ xxyyyyz¿
1 2 3 4
5 6 7 7 8
I Estado I Pila I Función de Transición I
~a
J(0, E, E) = (X,~) J(X, x, E) = (X, a) J(X, x, E) = (X, a) J(X, y, a) = (Y, E) J(Y, y, a) = (Y, E)
~
J(Y,y,~) = (Y',~a)
~a ~aa
J(Y',y,E) = (Y',a) J(Y',z,a) = (Z,E) J(Z,,\, a) = (F, E)
0 X X X Y Y
~
y' y' Z F
~a ~aa
~a
~a
Rechazar
Ejemplos para practicar con JFLAP Se sugiere al lector que teniendo en cuenta el autómata definido en este ejercicio, practique con las siguientes cadenas utilizando la herramienta JFLAP [Rodger y Finley, 20061.
• xxyy • yyzz • xxzz • xxxyz En estos cuatro ejemplos se presentan cadenas no válidas del lenguaje L.
69
2. Autómatas a Pila, Lenguajes y Gramáticas Independientes del Contexto
IEJERCICIO 2.31 Construir el autómata a pila que reconoce el lenguaje fonnado por aquellas cadenas que tienen el mismo número de x's y de y's.
SOLUCIÓN En los dos ejercicios anteriores, las cadenas pertenecientes a los lenguajes tenían que cumplir dos condiciones. En primer lugar, el orden en el que deberían aparecer los símbolos en las cadenas, es decir una serie de x's seguidas de una serie de y's. En segundo lugar, el número de apariciones de cada símbolo. Para controlar estas dos condiciones, los autómatas a pila correspondientes, añadían y eliminaban elementos de la pila. En este ejercicio, sólo es necesario controlar que el número de x's leídas de la entrada coincide con el número de y's, independientemente del orden en que aparezcan unas y otras. Para realizar este control, el autómata utilizará la pila de la siguiente manera. Para cada símbolo que el autómata lea de la entrada, el autómata comprobará el símbolo de la cima de la pila. Así, si en la cima de la pila encuentra el símbolo de pila vacía o el mismo símbolo que ha leído de la entrada, insertará dicho símbolo en la cima de la pila (de esta manera llevará un contador de los símbolos que lee de la entrada). En el caso en que el símbolo que el autómata lea de la entrada y el de la cima de la pila no coincidan, entonces el autómata se limitará a desapilar el símbolo de la cima de la pila (de esta fonna habrá controlado que ha leído dos símbolos distintos de la entrada y por tanto puede desestimarlos puesto que cumplen la condición del lenguaje del enunciado). A continuación, se muestra un ejemplo de las operaciones que se realizan en la pila en el caso de que el autómata lea una x de la entrada. Pila Vacía 8(Q,x,~) = (Q,~x) Hay una x en la cima de la pila 8 (Q, x, x) = (Q, xx) Hay y en la cima de la pila 8(Q, x, y) = (Q, E) En la figura 2.4 se muestra el diagrama con estas tres transiciones.
X,Y;@Ü;Ü X
Figura 2.4: Ejemplo de las transiciones posibles cuando se lee una x de la entrada. 70
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
A,y;E
o
A, x; E
A4 Figura 2.5: Autómata que reconoce cadenas con un mismo número x's e y's. Símbolo
Ao Al A2 A3 A4 A5 .~
Transición x, ~;~x x,x;xx X,y;E
y,~; ~y y,X;E y,y;yy
...
Tabla 2.1: Tabla de correspondencia entre los símbolos de los arcos del autómata a pila de la figura 2.5 y las transiciones del autotnáta El autómata que reconoce el lenguaje del enunciado será una ampliación del estado presentado en la figura 2.4, que incluye las transiciones que se producen cuando se lee una y de la entrada (ver figura 2.5) (la correspondencia entre los símbolos de los arcos y las transiciones del autómata se muestran en la tabla 2.1). Este autómata tiene un estado inicial encargado de inicializar la pila con el símbolo de pila vacía, un estado de aceptación al que se llega si al terminar de leer la cadena de entrada la pila vuelve a estar vacía, y un estado de error al cual se llega si al terminar de leer la cadena de entrada la pila no está vacía.
Ejemplos de ejecución del autómata Se van a considerar a continuación diferentes cadenas de entrada con el objetivo de ilustrar el funcionamiento del autómata. • Cadena de entrada: xyyyxyxx
La cadena xyyyxyxx pertenece al lenguaje. En la siguiente tabla se muestra la ejecución del autómata con esta cadena de entrada. 71
2. Autómatas a Pila, Lenguajes y Gramáticas Independientes del Contexto
I Paso I o
Cinta
I Estado I Pila I Función de Transición I
3 4 5 6 7 8 9 10
ó{0, E, E) = (Q, U)
0
JZJJYYXYxx JZJJYYXYxx xyyyxyxx xyyyxyxx xyyyxyxx xyyyXJjxx xyyyxyxx xyyYXYJ!..X XYYYXYXJ!.. xyyyxyxxll xyyyxyxxll
1 2
Q Q Q Q Q Q Q Q Q V
U Ux
U Uy Uyy Uy Uyy Uy
U
Ó(Q,x,U) = (Q,Ux) Ó(Q,y,x) = (Q,E) Ó(Q, y, U) = (Q, Uy) Ó(Q, y, y) = (Q, yy) Ó(Q,x,y) = (Q,E) Ó(Q, y, y) = (Q, yy) Ó(Q,x,y) = (Q,E) Ó(Q,x,y) = (Q,E) Ó(Q, A, U) = (V, E) Aceptar
• Cadena de entrada: xyyy La cadena xyyy no pertenece al lenguaje del enunciado puesto que el número de y's es mayor que el número de x's. En la siguiente tabla se muestra la ejecución del autómata con esta cadena-lle entrada.
I Paso I Cinta I Estado I Pila I Función de Transición I o 1 2 3
4 5 6
JZJJyy J!..YYY xyyy xyyy xyyy xYYYIl xYYYIl
0 Q Q
U Ux
Q
U
Q Q F
Uy Uyy
Ó(0,E,E) = (Q,U) Ó(Q,x,U) = (Q,Ux) Ó(Q,y,x) = (Q,E) Ó(Q, y, U) = (Q, Uy) Ó(Q, y, y) = (Q, yy) Ó(Q, A, y) = (F, E) Rechazar
Ejemplos para practicar con JFLAP Se sugiere al lector que teniendo en cuenta el autómata definido en este ejercicio, practique con las siguientes cadenas utilizando la herramienta JFLAP [Rodger y Finley, 2006].
• xxyy • yyxx • xyxy 72
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
• xxx y • yxx • yxyxx
IEJERCICIO 2.41 Diseñar un autómata a pila que compruebe si una palabra contiene al menos una consonante, una vocal y un número. El lenguaje que reconocerá esta autómata a pila, puede verse corno el conjunto de cadenas que se corresponden con una contraseña segura.
SOLUCIÓN Puesto que las cadenas de .-, la entrada podrán estar formadas por letras y números, el alfabeto del autómata será ¿; = {e, v, n} donde para simplificar, e representa cualquier consonante, v representa cualquier vocal, y n representa cualquier número. Una cadena pertenecerá al lenguaje cuando contenga al menos una consonante, una vocal y un número. El lenguaje del enunciado, en realidad, es un lenguaje regular que reconoce el autómata finito de la figura 2.6. c c,n
Figura 2.6: Autómata finito regular que reconoce cadenas con al menos una consonante, una vocal y un número. En este diagrama de transiciones e representa cualquier consonante, v representa cualquier vocal, y n representa cualquier número. 73
2. Autómatas a Pila, Lenguajes y Gramáticas Independientes del Contexto El objetivo de este ejercicio es mostrar cómo, utilizando un autómata a pila, se pueden reducir los estados del autómata que reconoce el lenguaje. Para ello, se supone que el autómata dispone de una pila que puede contener números naturales, además de la marca de pila vacía #. El objetivo del autómata a pila es controlar mediante la pila, en vez de mediante estados, si se ha leído un carácter de cada clase (vocal, consonante o número). Para ello, el autómata codificará en la pila los símbolos que vaya leyendo de la entrada. Como sólo hay que controlar que exista un símbolo de cada clase en la cadena de entrada, el autómata no necesita codificar nada más que la primera aparición de cada uno de estos símbolos. Por tanto, en este caso, se considera que: Primera consonante de la entrada : Se guarda en la pila el número 2 Primera vocal de la entrada : Se guarda en la pila el número 3 Primer número de la entrada : Se guarda en la pila el número 5
Por tanto, a la hora de procesar una cadena de entrada, el autómata considerará el contenido de la pila, el cuál puede expresarse mediante la expresión 2a * 3b * 5c donde las variables a, b, e E {O, 1}, tomarán el valor O si no hay ninguna consonante, vocal o número (respectivamente) en la entrada y el valor 1 en caso contrario. A continuación, la tabla 2.2, representa la codificación del contenido de la pila. En esta tabla, las columnas tituladas Consonante, Vocal y Número indican si en la entrada existe un símbolo de cada tipo. La columna Codificación se muestra la codificación correspondiente a cada situación. Por último, en la columna Elemento de la pila se indica el símbolo que se guarda en la pila de acuerdo a cada situación. De acuerdo a esta codificación, se puede interpretar que el autómata a pila simplemente necesita ir multiplicando el elemento que estuviera presente en la cabeza de la pila por un 2, un 3 o un 5. A continuación se presentan las transiciones necesarias para que el autómata realice las operaciones en la pila. En la tabla 2.3 se presenta el caso en el que estando en un estado Q, el autómata todavía no ha leído una consonante y en la entrada aparece la primera. Cada fila de la tabla, se corresponde a una situación de partida diferente. Así teniendo en cuenta la información de la tabla 2.2, puede darse el caso en que el autómata: todavía no hubiera leído ningún símbolo de la entrada (primera fila), sólo hubiera leído una vocal (segunda fila), sólo hubiera leído un número (tercera fila), hubiera leído ya una vocal y un número (cuarta fila). Tal y como se muestra en la tabla 2.4, en el caso en el que el autómata ya hubiera leído alguna consonante y se encontrara otra consonante en la entrada, las transiciones del autómata no deberían variar el contenido de la pila. 74
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
I Consonante I Vocal I Número I Codificación I Elemento de la Pila I No No Si No Si No No No Si Si Si No Si No Si Si Tabla 2.2: Codificación de la pila de entrada.
No No No Si No Si Si Si acuerdo
20 * 30 * 50 1 1 2 2 * 30 * 50 1 3 20 * 3 * 50 20 * 30 * 51 5 6 21 * 31 * 5° 1 10 2 * 30 * 51 1 15 20 * 3 * 51 1 1 30 2 * 3 * 51 a los diferentes tipos de símbolos de la cinta de
I Pila I Transición ."..
1 3 5 15
ó(Q, e, 1) = (Q, 2) ó(Q,e,3) = (Q,6) ó(Q, e, 5) = (Q, 10) ó(Q,e,15) = (Q,30)
Tabla 2.3: Transiciones que se aplican en el caso en que aparece la primera consonante en la cinta de entrada El resto de las transiciones del automáta se definirían de manera similar. Una vez especificadas las transiciones que manipulan el contenido de la pila, es necesario terminar de definir el autómata:
• S = {0,Q,F, V}. • ~ =
{e, n, v} donde e,n,v representan una consonante, un número y una vocal respectivamente.
•r •
=
T =
• F
=
{l, 2, 3, 5, 6,10,15,30, #}.
0. {V}.
• El conjunto T se muestra en el diagrama de transiciones del autómata de la figura 2.7 (la correspondencia entre los símbolos.de los arcos y las transiciones del autómata se muestran en la tabla 2.5). Por claridad, en la figura 2.7 se muestran sólo las transiciones 75
2. Autómatas a Pila, Lenguajes y Gramáticas Independientes del Contexto
I Pila I Transición 2 6 10 30
c5(Q, e, 2) = (Q, 2) c5(Q,e,6) = (Q,6) c5( Q, e, 10) = (Q, 10) c5 (Q, e, 30) = (Q, 30)
Tabla 2.4: Transiciones que se aplican en el caso en que el autómata se encontrara con una segunda consonante correspondientes a la sttuación en que se lee de la entrada la primera consonante. El resto de transiciones, correspondientes a la situación en que se lea de la entrada una vocal o un número, se dejan como ejercicio al lector.
>.., ----,30; E
F
>.., 30; E A5 Figura 2.7: Autómata a pila que reconoce el lenguaje formado por todas las cadenas que contienen al menos una consonante, una vocal y un número. En el estado inicial se marca la pila con un 1 para representar la situación inicial en que todavía no se ha leído ningún símbolo. En el estado Q se realizan todas las operaciones de la pila de acuerdo a los símbolos que vayan apareciendo en la entrada. El estado F es el estado de error al que se llegará si al terminar de leer la cadena la cima de la pila es distinto de 30 (representado en el diagrama como "----,30"). Por último, el estado V es el estado de aceptación al que llega el autómata cuando al terminar de leer la cadena, encuentra un 30 en la cima de la pila.
Ejemplos de ejecución del autómata Se van a considerar a continuación diferentes cadenas de entrada con el objetivo de ilustrar el funcionamiento del autómata. • Cadena de entrada: ab1
76
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
Símbolo
Aa
c,1;2 c,3;6 c,5; 10 c,15;30 c,2;2 c,6;6 c,10;10 c,30;30
Al
A2 A3 A4 A5 A6 A7
1 una
~.
Transición
El
una
Tabla 2.5: Tabla de correspondencia entre los símbolos de los arcos del automáta a pila de la figura 2.7 y las transiciones del autómata La cadena ab1 pertenece al lenguaje. En la siguiente tabla se muestra la ejecución del autómata con esta cadena de entrada.
I Paso I Cinta I Estado I Pila I FunciÓn de Transición I "0
lue
!ue
de el Ito
de ~n
le
1 2 3 4 5
º,b1 º,b1 aQ1 abl ab1} ab1}
8(f/J,E,E) = (Q,l)
f/J Q Q Q Q V
1
3 6
30
8(Q,a,1) = (Q,3) 8(Q,b,3) = (Q,6) 8(Q, 1, 6) = (Q,30) 8(Q,A,30) = (V, E) Aceptar
• Cadena de entrada: f f eig La cadena f f eig no pertenece al lenguaje del enunciado puesto que no contiene ningún número. En la siguiente tabla se muestra la ejecución del autómata con esta cadena de entrada.
I Paso I Cinta I Estado I Pila I Función de Transición I o 1 2 3 4
5 6 7
ffeig ffeíg ffeig f ft¿ig ffeig ffeig ffeig} ffeig}
8(f/J,E,E) = (Q, 1)
f/J Q Q Q Q Q Q F
1 2 2 6 6 6
8(Q, f, 1) = (Q,2) 8(Q,f,2) = (Q,2) 8(Q,e,2) = (Q,6) 8(Q,i,6) = (Q,6) 8(Q,g,6) = (Q,6) 8(Q, A, 6) = (F, E) Rechazar 77
2. Autómatas a Pila, Lenguajes y Gramáticas Independientes del Contexto
Ejemplos para practicar con JFLAP Se sugiere al lector que, teniendo en cuenta el autómata definido en este ejercicio, practique con las siguientes cadenas utilizando la herramienta JFLAP [Rodger y Finley,
20061 • ab1a
• 1234 • aa1
IEJERCICIO 2.5 I Construir el analizador sintáctico LL(k) para la siguiente gramática independiente del contexto:
s -+ xSz S -+ ySz S-+z SOLUCIÓN , El objetivo de este ejercicio difiere de los anteriores en los que se buscaba construir un autómata a pila que reconociera un determinado lenguaje. En este caso, se parte de una determinada gramática independiente del contexto y se busca construir el analizador sintáctico LL(k) que la reconoce [Brookshear, 1993]. El primer objetivo es determinar el número de símbolos de preanálisis que se deben considerar. Esto es así en los casos en los que se trabaja con gramáticas no deterministas, y en los que es necesario poder conocer de antemano los k símbolos que siguen al símbolo actual en la entrada (esos k símbolos son los que se conocen corno símbolos de preanálisis). Para determinar el número de símbolos de preanálisis que son necesarios, se construye el llamado conjunto conflicto que recoge aquellas producciones de la gramática que se podrían aplicar en un determinado momento. En el caso de la gramática de este ejercicio, corno las tres producciones tienen el mismo elemento no terminal en la parte izquierda de la producción, las tres formarían parte del conjunto conflicto. Corno la parte derecha de las tres producciones de la gramática se diferencian en el primer elemento, sólo es necesario un 78
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
símbolo de preanálisis para saber qué producción elegir. Así, en este caso, k = 1 Ypor tanto, el analizador que se va a construir es un analizador LL(1). La forma de tratar la cadena será diferente a la manera en la que se ha hecho hasta el momento. En este caso, el analizador irá construyendo la cadena en la pila, sirviéndose, para ello, de las producciones de la gramática. Una determinada cadena será aceptada si coincide con la que ha ido construyendo el analizador en la pila. Para ello, se irán guardando ordenadamente en la pila, las producciones que se vayan aplicando. Un autómata a pila que se corresponda con un analizador sintáctico LL(k), tendrá los siguientes estados: • Un estado inicial cuya función será marcar la pila como vacía e introducir en la misma el símbolo inicial de la gramática. • Un estado de aceptación al que se llegará si se termina de leer la cadena justo en el momento en el que se vacía la pila. • Un estado intermedio en el que el autómata permanecerá mientras trabaja con la pila. Si el símbolo de la ci@a de la pila es un símbolo no terminal de la gramática, se extrae de la pila y se introduce la parte derecha de la producción en la que este símbolo aparece en el lado izquierdo (habrá una transición por cada producción). Si en la cima de la pila hay un símbolo terminal entonces, el autómata lo comparará con el siguiente símbolo de la cadena de entrada. De esta forma, en la parte inferior de la pila, se guardarán aquellos elementos de la producción que todavía no han sido resueltos. En la figura 2.8 se muestra el autómata construido de esta forma y correspondiente a la gramática del enunciado (la correspondencia entre los símbolos de los arcos y las transiciones del autómata se muestran en la tabla 2.6). Al
A2
o
E, E; ~s
A,~; E r;;'\ F-------.{~
A4 A5 Figura 2.8: Autómata del analizador sintáctico LL(1) del ejercicio 2.5. Como se puede observar en la figura 2.8, las transciones del estado Q que se corresponden con las producciones de la gramática, insertan en la pila, el lado derecho de dichas producciones. El orden de los símbolos terminales y no terminales en la transición no coinciden con el orden en el que aparecen en la producción. Esto es así, porque el orden
79
2. Autómatas a Pila, Lenguajes y Gramáticas Independientes del Contexto
Símbolo
Ao Al A2 A3 A4 A5
Transición E, S; zSx E, S; zSy
E,S; Z X,X;E
y, y; E Z,Z;E
Tabla 2.6: Tabla de correspondencia entre los símbolos de los arcos del automáta a pila de la figura 2.8 y las transiciones del automáta en el que se leerán los símbolos de la pila debe coincidir con el orden en el que aparecen en la producción. De esta manera, el último elemento que entra en la pila es el primero en ser utilizado (ver apartado 2.1).
Ejemplos de ei~cución del autómata Se van a considerar a continuación diferentes cadenas de entrada con el objetivo de ilustrar el funcionamiento del autómata. • Cadena de entrada: zzzzyxy
La cadena zzzzyxy no pertenece al lenguaje generado por la gramática del enunciado. En la siguiente tabla se muestra la ejecución del autómata con esta cadena de entrada. En esta tabla se marcarán los símbolos de preanálisis con una llave sobre dichos símbolos. Como en este caso, sólo hay un símbolo de preanálisis, coincidirá con el símbolo actual y, por tanto, se representará de la siguiente forma: ~.
I Paso I Cinta O
1 2 3
~
Z.- zzzyxy
~
Z.- zzzyxy
~
Z.- zzzyxy ~
z Z.- zzyxy
I Estado I Pila I Función de Transición I 0 Q Q Q
US Uz
U
<5(0, E, E) = (QJS) 5(Q, E, S) = (Q, z) 5(Q,z,z) = (Q,E) Rechazar
Al ser este autómata no determinista, podrían haberse aplicado diferentes transiciones. Se deja como ejercicio al lector, el comprobar que cualquier camino de ejecución de este autóamta lleva a rechazar la cadena. 80
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
• Cadena de entrada: yxyzzzz La cadena yxyzzzz pertenece al lenguaje generado por la gramática del enunciado. En la siguiente tabla se muestra la ejecución del autómata con esta cadena de entrada.
I Paso I Cinta I Estado I Pila o y xyzzzz 0 ,.-A-.,.
1 2
3 4
5 6 7
8 9 10 11
,.-A-.,.
y xyzzzz y xyzzzz ,.-A-.,. y :.f yzzzz ,.-A-.,. Y :.f yzzzz ,.-A-.,. yx y zzzz ,.-A-.,. yx y zzzz ,.-A-.,. yxy ~ zzz ,.-A-.,. yxy ~ zzz yxyz--'¡' zz ,.-A-.,. yxyzz ~ z ,.-A-.,. yxyzzz ~
,.-A-.,.
Q Q Q
~S
Q Q Q Q Q
~zzSx
Q Q Q
~zzz
~z
J(0, E, E) = (Q, ~S) J(Q,E,S) = (Q,zSy) J(Q,y,y) = (Q,E) J(Q,E,S) = (Q,zSx) J(Q,x,x) = (Q,E) J(Q, E, S) = (Q, zSy) J(Q, y, y) = (Q, E) J(Q, E, S) = (Q, z) J(Q,z,z) = (Q,E) J(Q,z,z) = (Q,E) J(Q,z,z) = (Q,E) J(Q,z,z) = (Q,E)
Q
~
J(Q,A,~)
~zSy
~zS
~zzS ~zzzSy
~zzzS ~zzzz ~zz
,.-A-.,.
12
I Función de Transición I
yxyzzzz ¿
= (V,E)
,.-A-.,.
13
yxyzzzz ¿
V
Aceptar
I EJERCICIO 2.61 Construir el analizador sintáctico LL(k) para la siguiente gramática independiente del contexto:
S S
--+ --+
S --+
axSz aySz az
SOLUCIÓN Este ejercicio es similar al ejercicio anterior, salvo que en este caso, en el lado derecho de las producciones se encuentra además el símbolo a. En este caso, son necesarios 2 símbolos de 81
2. Autómatas a Pila, Lenguajes y Gramáticas Independientes del Contexto
o
E, ;~S
A4 Figura 2.9: Autómata del analizador sintáctico LL(I) del ejercicio 2.6. Símbolo Al
Transición E,S; zSxa E, S; zSya
A2 A3 A4 A5 A6
E,S;za X,X;E y,y;E Z,Z;E a,a;E
Ao
Tabla 2.7: Tabla de correspondencia entre los símbolos de los arcos del automáta a pila de la figura 2.9 Y sus transiciones preanálisis ya que en cada momento será necesario leer dos símbolos de la cadena de entrada para saber cuál de las producciones genera dicha cadena. El autómata a pila que es necesario definir para construir el analizador sintáctico se muestra en la figura 2.9 (la correspondencia entre los símbolos de los arcos y las transiciones 'del autómata se muestran en la tabla 2.7). Este autómata es similar al del ejercicio anterior, salvo por las transiciones en el estado Q que, lógicamente, ahora incluyen el símbolo a. Además, existe una nueva transición que controla los símbolos a que se leen de la entrada. De nuevo, el orden de los símbolos terminales y no terminales en la transición no coinciden con el orden en el que aparecen en la producción. Esto es así, porque el orden en el que se leerán los símbolos en la pila debe coincidir con el orden en el que aparecen en la producción. De esta manera, el último elemento que entra en la pila es el primero en ser utilizado (ver apartado 2.1).
Ejemplos de ejecución del autómata Se van a considerar a continuación diferentes cadenas de entrada con el objetivo de ilustrar el funcionamiento del autómata. • Cadena de entrada: ayaxazzz
82
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
La cadena ayaxazzz pertenece al lenguaje generado por la gramática del enunciado. En la siguiente tabla se muestra la ejecución del autómata con esta cadena de entrada. En la tabla se marcarán los símbolos de preanálisis con una llave sobre los símbolos (por ejemplo,
c;:y).
I Paso I Cinta o 1 2 3 4
5 6 7 8 9
10
I Estado I Pila
~
º,-y axazzz º,-y axazzz ~ º,-y axazzz a~ ya xazzz ay ~ º,-X azzz ~ ay º,-x azzz aya ~ ;r;a zzz af/ax {iZ' zz ayax ~ º,-Z zz ayaxa ~ ;{Z z ayaxaz ~ ;{Z ~
~
11
12 13
ayaxazz ;{A ayaxazz ayaxazz
~
~A
I Función de Transición
Q Q Q Q
~S
Q Q Q Q Q Q
~zzSxa
~zz
8(0, E, E) = (Q, ~S) 8(Q,E,S) = (Q,zSya) 8(Q,a,a) = (Q,E) 8(Q,y,y) = (Q,E) 8(Q,E,S) = (Q,zSxa) 8(Q,a,a) = (Q,E) 8(Q, x, x) = (Q, E) 8(Q,E,S) = (Q,za) 8(Q,a,a) = (Q,E) 8(Q, z, z) = (Q, E) 8(Q,z,z) = (Q,E)
Q
~z
8(Q,z,z) = (Q,E)
Q
~
8(Q,A,~)
0 ~zSya
~zSy
~zS ~zzSx
~zzS ~zzza ~zzz
= (V,E)
~
~A
V
Aceptar
Como se puede ver en la tabla, los símbolos de preanálisis permiten decidir qué producción aplicar en cada paso. Así, por ejemplo, en el paso 1, se elige la producción S ---7 aySz porque los dos simbolos de preanálisis son ay (otros ejemplos se muestran en los pasos 4 y 7).
• Cadena de entrada: axz La cadena axz no pertenece al lenguaje generado por la gramática del enunciado. En la siguiente tabla se muestra la ejecución del autómata con esta cadena de entrada.
83
2. Autómatas a Pila, Lenguajes y Gramáticas Independientes del Contexto
I Paso I Cinta I Estado I Pila I Función de Transición o 1
2 3 4
r""--. QX z r""--. QX z r""--. QX z r""--. a ;!2Z r""--.
ax Z-A
0 Q Q Q Q
15(0, E, E) = (Q, ~S) Ó(Q,E,S) = (Q,zSxa) Ó(Q,a,a) = (Q,E) Ó(Q,x,x) = (Q,E)
~S
UzSxa ~zSx
Rechazar
UzS
I EJERCICIO 2.71 Construir el analizador sintáctico LR(k) para la siguiente gramática independiente del contexto:
s ----> xSz S ----> ySz S---->z
SOLUCIÓN En este problema se vuelve a plantear la construcción de un autómata partiendo de una determinada gramática. En este caso, se pide la construcción de un analizador LR(k) [Brookshear, 1993], y dada la gramática del enunciado, se necesitará un único símbolo de preanálisis. Los estados del autómata de un analizador sintáctico LR, se corresponden con una determinada derivación de la gramática. Los estados de aceptación se corresponden con situaciones en las que el autómata ha reconocido una derivación válida de la gramática. Por tanto, en cada estado se indica para cada producción de la gramática, la parte que ya se ha reconocido y la parte que queda por identificar. Así por ejemplo, si se supone que de la producción S ----> xSz ya se ha reconocido la x, el autómata debería poder controlar que resta por reconocer la subcadena que se obtendría al derivar el no terminal S. Para facilitar la comprensión del funcionamiento del autómata, se marcará la producción con un indicando qué posibilidades de derivación hay en ese estado. Por lo tanto, en este ejemplo, la producción se representaría de esta forma S ----> x S z. Para el ejemplo de esta producción, al estado del autómata, se le añadirán las transiciones correspondientes a las producciones que contengan el símbolo no terminal S en la parte izquierda, por lo tanto el estado del autómata (que será el estado D en la representación gráfica del autómata) queda definido por: A
A
84
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
A continuación se describe el proceso de definición del resto de estados del autómata. El estado inicial, marcado con A, contendrá una producción extra que solamente genera el símbolo inicial de la gramática, por lo tanto el estado queda definido por las siguientes producciones:
• S'
---+
A
S
Otro estado, el estado B, indica que se ha reconocido la producción S' ---+ S. Para ello, se representará el estado poniendo el símbolo detrás de la producción (S' ---+ SA). El estado B es un estado de aceptación. El estado e, al que se accede cuando en la cinta de entrada hay un símbolo y y se está reconociendo la producción S ---+ ySz. Este estado se define: A
Otro estado, el estado D se ha definido al principio del ejercicio como ejemplo. El estado E, al que se accederá cuando se reconozca un símbolo z de la producción S ---+ z, es un estado de aceptación. Este estado de aceptación representa la situación en la que se ha reconocido la producción S ---+ z y por tanto, el autómata debe regresar al estado donde se empezó a reconocerla y dar por reconocido el símbolo no terminal S. Al estado F se accederá después de reconocer el símbolo no terminal S en la producción S ---+ ySz y por lo tanto el estado estará definido por S ---+ ySA z. Como el único elemento
85
< 2. Autómatas a Pila, Lenguajes y Gramáticas Independientes del Contexto
I Estado I
x
A B C D E F G H 1
desplazar D
y desplazar C
desplazar D desplazar D
desplazar C desplazar C
z
s
FDC
B
desplazar E Aceptar desplazar E desplazar E S-+z desplazar G S -+ ySz desplazar 1 S -+ xSz
F H
S-+z S
-+
ySz
S
-+
xSz
Tabla 2.8: Tabla de transición del autómata de un analizador LR(1)
de la producción que queda por identificar es un símbolo terminal, no se introduce ninguna producción más en ~~te estado. Al estado G, se llega después de reconocer el símbolo terminal z en la producción S ySz, y por tanto es un estado de aceptación que reconoce esta producción. El estado H, es similar al estado F solo que con la producción S
-+
-+
AXS Z •
Por su parte, el estado 1, es equivalente al estado G solo que con la producción S AXS Z •
-+
Para terminar de representar cada estado se utilizará la tabla 2.8. En esta tabla, se representa qué acció realizar para cada estado y para cada símbolo de preanálisis. Los símbolos de preanálisis son los elemnetos terminales del lenguaje, junto con la marca de Final de cadena (FDC). Cuando en la tabla aparece la acción "desplazar" el autómata leerá de la cinta de entrada el símbolo actual y lo apilará en la pila junto con el estado que acompaña a la acción "desplazar". Además, se utilizará la pila para ir introduciendo los elementos terminales que se van leyendo, de forma que se irá constuyendo dentro de la pila la producción que se está resolviendo. Cuando se ha reconocido integramente la parte izquierda de una producción, se desapilan todos sus elementos y se apila la parte derecha de la producción. También se introduce en la pila una marca para saber sobre qué estado se está realizando el trabajo, ya que cada vez que se reconoce una producción, se debe volver al estado en el cual se ha empezado a reconocer la producción para continuar con el reconocimiento de la cadena. En la figura 2.10 se muestra el diagrama de transiciones del autómata correspondiente al analizador LR(l) del enunciado. 86
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
y
s
F l----=z-~@J
x
x
Figura 2.10: Autómata del analizador sintáctico LR(I) del ejercicio 2.7.
Ejemplo de ejecución del autómata
A continuación se va a considerar la cadena de entrada yxy zzzz con el objetivo de ilustrar el funcionamiento del autómata.
Esta cadena pertenece al lenguaje generado por la gramática del enunciado. En la siguiente tabla se muestra la ejecución del autómata con esta cadena de entrada, teniendo en cuenta, además, la tabla de transiciones de la tabla 2.8
En los pasos 5,8 Y 11 se han reconocido derivaciones válidas de la gramática, razón por la cual la pila se ha vaciado hasta llegar al estado previo al comienzo del reconocimiento de estas producciones. En estos pasos, se ha leído de la pila pero no de la entrada. De esta forma, sabiendo en qué estado estaba el autómata y cuál era el simbolo no terminal de la gramática, el autómata se ha transladado al estado adecuado sin necesidad de leer ningún elemento de la cinta. 87
2. Autómatas a Pila, Lenguajes y Gramáticas Independientes del Contexto
I Paso I o 1 2 3 4
5 6
7 8
9 10 11 12 13 14
Cinta
yxyzzzz y;]¿yzzzz yxyzzzz yxy±.zzz yxyz±.zz yxyz±.zz yxyz±.zz yxyzz±.z yxyzz±.z yxyzz±.z yxyzzz±. yxyzzz±. yxyzzz±. yxyzzzz~
yxyzzzz~
I Estado I Pila A C D E E C F G D H 1 C F G B
yC yCxD yCxDyC yCxDyCzE yCxDyCSF yCxDyCSF yCxDyCSFzG yCxDSH yCxDSH yCxDSHzI yCSF yCSF yCSFzG SB
I Tabla de Transición I desplazar C desplazar D desplazar C desplazar E
S-7Z desplazar G
S
-7
ySz
desplazar 1
S
-7
xSz
desplazar G
S
-7
ySz
Aceptar
.....
IEJERCICIO 2.SI Construir un autómata a pila que compruebe la sintaxis de una operación matemática. En este caso, se considerarán las operaciones de suma, resta, multiplicación y división. Además, podrán contener paréntesis para poder modificar el orden de precedencia de los operadores.
SOLUCIÓN El lenguaje con el que trabajará el autómata del enunciado serán las fórmulas matemáticas que expresen operaciones matemáticas correctas. El autómata a pila que reconozca este lenguaje tendrá que realizar dos tareas diferentes. Por una parte, debe comprobar que los elementos de la operación están en el orden adecuado (debe comprobar, por ejemplo, que después de un operando viene un operador y a continuación otro operando). Por otra parte debe comprobar que los paréntesis (si los hubiera) están correctamente balanceados, esto es, que después de abrir un paréntesis éste se cierra y que no se cierra un paréntesis sin antes abrirlo. Para la primera tarea, basta un autómata finito, como por ejemplo el de la figura 1.11. Para la segunda tarea, se utilizará la pila, de manera que cada vez que se lea un símbolo de paréntesis abierto en la entrada, se mete este símbolo en la pila, y cada vez que se lea un 88
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
símbolo de paréntesis cerrado de la entrada, se saca el símbolo de paréntesis abierto de la pila. Formalmente, el autómata que reconoce el lenguaje del enunciado se definiría de la siguiente manera:
• S = {0, Número, Operador, PCerrado, PAbierto, V} En este caso, cada estado no se anota con un único símbolo sino con cadenas que representan su significado. Así el . estado Número indica el estado al que llega el autómata en el caso en que ha leído un dígito de la entrada. El estado Operador indica que el autómata ha leído un operador de la entrada. Los estados PC errado y P Abierto indican que el autómata ha leído de la entrada un paréntesis cerrado o un paréntesis abierto, respectivamente. Por último, el estado 0 es el estado inicial y el estado V es el estado final del autómata. • ~ =
{Dig, Oper} Para simplificar el diagrama de transiciones del autómata, se ha utilizado el símbolo Dig para representar cualquier dígito que aparezca en la cadena de entrada y el símbolo Oper para representar cualquier operador que pueda venir en la cadena de entrada.
• r={(,#}
.T=0 • F = {V} • El conjunto T se muestra en el diagrama de transiciones del autómata de la figura 2.11.
Ejemplos de ejecución del autómata Se van a considerar a continuación diferentes cadenas de entrada con el objetivo de ilustrar el funcionamiento del autómata. • Cadena de entrada: (4 + 6)
*8
La cadena (4+6) *8 pertenece al lenguaje. En la siguiente tabla se muestra la ejecución del autómata con esta cadena de entrada. 89
2. Autómatas a Pila, Lenguajes y Gramáticas Independientes del Contexto
),(;E
),(;E
Oper,E;
Dig,E;E
(,E;(
(,E; ( Figura 2.11: Autómata a pila que reconoce el lenguaje de las cadenas que representan operaciones matemáticas.
90
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
I Paso I Cinta (4 + 6) * 8 (4 + 6) * 8 (4+6) * 8 (4 + n) * 8 (4 + 6) * 8 (4 + 6).!8 (4 + 6) *.a (4 + 6) * 8~ (4 + 6) * 8~
O 1 2
3 4 5 6 7 8
I Estado
I Pila I Función de Transición
0 PAbierto Número Operador Número PCerrado Operador Número V
U( U( U( U( U U U
8(0, (, E) = (P Abierto, U( ) 8(PAbierto, 4, E) = (Número, E) 8(Número, +, E) = (Operador, E) 8(Operador, 6, E) = (Número, E) 8(Número,), () = (PCerrado, E) 8(PCerrado, *, E) = (Operador, E) 8(Operador, 8, E) = (Número, E) 8(Número, A, U) = (V, E) Aceptar
• Cadena de entrada: (3 + 6
Esta cadena no pertenece al lenguaje puesto que aparece un paréntesis abierto pero la cadena no contiene el símbolo de paréntesis cerrado. En la siguiente tabla se muestra la ejecución del autómata con esta cadena de entrada.
I Paso I Cinta I Estado O 1 2 3
4
{3+6 (3+6 (3+6 (3+n
I Pila I Función de Transición
0
PAbierto Número Operador (3+6~ Número
U( U( U( U(
8(0, (, E) = (P Abierto, U( ) 8(PAbierto, 3, E) = (Número, E) 8(Número, +, E) = (Operador, E) 8(Operador, 6, E) = (Número, E) Rechazar
Ejemplos para practicar con JFLAP Se sugiere al lector que, teniendo en cuenta el autómata definido en este ejercicio, practique con las siguientes cadenas utilizando la herramienta JFLAP [Rodger y Finley, 2006].
• ((2 + 3) * 6) + 7 • (3 * (3 + 3)(
• ((2 + 3) + (8 * 9)) • )4 + 5(
91
2. Autómatas a Pila, Lenguajes y Gramáticas Independientes del Contexto
IEJERCICIO 2.91 Construir la forma normal de Chomsky de la gramática
A -7 xBy B-7C C -7 yCx C-7A
SOLUCIÓN El objetivo de este ejercicio es mostrar que una gramática independiente del contexto que genere un lenguaje que no contenga la cadena vacía, puede modificarse de manera que sus producciones se ajusten a una determinada representación denominada Forma Normal de Chomsky. Así, se dice que una gramática está en forma normal de Chomsky, cuando el lado derecho de sus producciones sólo contiene dos no terminales o un único terminal. Para convertir una gramática en forma normal de Chomsky se siguen los siguientes pasos: • Eliminar las producciones a vacío (como por ejemplo, C -7 A). Si el lenguaje que genera la gramática no contiene la cadena vacía, las reglas de reescritura A o producciones a vacío no son necesarias y pueden eliminarse modificando ligeramente la gramática. • Modificar las producciones sustituyendo los terminales que aparecen en el lado , derecho de las producciones por no terminales que derivan a los terminales a los que sustituyen. • Convertir las producciones con más de dos no terminales en su lado derecho (como por ejemplo, C - 7 y C X) en producciones con dos no terminales en su lado derecho. • Eliminar las producciones con un sólo no terminal (B
-7
C).
A continuación, se realizan cada uno de estos pasos para la gramática del enunciado.
Eliminar las producciones a vacío La gramática del enunciado tiene la producción C -7 A. Puesto que el lenguaje generado por esta gramática no contiene la cadena vacía esta producción puede eliminarse modificando consecuentemente la gramática para que ésta no pierda capacidad de representación. Para . ello, se consideran las producciones en cuyo lado derecho aparece el no terminal que deriva
92
Autómatas, Gramáticas y Lenguajes fomales: problemas resueltos en A. Por ejemplo, considerando la gramática del enunciado, puesto que C es el único no terminal que deriva en A, sólo será necesario considerar las producciones B --+ C y C --+ yCx. Estas producciones se modifican, eliminando el no terminal C de su lado derecho. Esta operación es equivalente a derivar el no terminal C a la cadena vacía aplicando la producción C --+ A. El resultado de esta modificación se muestra a continuación:
I Producción inicial I Producción transformada I C
--+
yCx
C
--+
yx
Al modificar la segunda producción, se ha generado una producción a vacío, y por tanto, se procedrá de la misma manera (asÍ sucesivamente hasta que no queden producciones a vacío en la gramática). En este caso, la producción que hay que modificar es B --+ A Y por tanto el no terminal a e1imiar de la parte derecha de las producciones será B; en concreto, en la producción A --+ xBy. Por tanto, la nueva producción obtenida será A --+ xv. Estas nuevas producciones obtenidas, se añaden a la gramática inicial. En la siguiente tabla se puede observar la nueva gramática transformada en comparación con la gramática inicial. o.,
I Gramática inicial I Gramática Paso 1 I A
--+
xBy
B--+C C
--+
yCx
A --+ xBy A --+ xy B--+C C --+ yCx C --+ yx
C--+A
. Modificar las producciones sustituyendo los terminales que aparecen en el lado derecho de las producciones, por no terminales En este paso, se modifican las producciones de manera que sólo queden en la gramática, producciones cuyo lado derecho contengan no terminales o bien un único terminal. Para ello, se sustituye cada terminal de la gramática por nuevos no terminales (no contenidos antes en la gramática) y se añaden las producciones que permitan derivar esos no terminales en el terminal correspondiente. Así por ejemplo, la gramática del ejercicio contiene los terminales x e y, por 10 tanto, se necesitan dos nuevos no terminales, no utilizados en la gramática. En este ejemplo se utilizarán los no terminales X e Y, y por consiguiente se añadirán las producciones X --+ x y Y --+ y. Ahora se debe modificar la gramática introduciendo estas nuevas producciones y sustituyendo en las producciones resultantes del paso anterior, todas las apariciones de los
93
2. Autómatas a Pila, Lenguajes y Gramáticas Independientes del Contexto terminales por los nuevos no terminales correspondientes. El resultado se observa en la siguiente tabla.
I Gramática Paso 1 I Gramática Paso 2 xBy xy
A A
---+
c ---+ yCx
C
---+
A
---+
A
---+
C
---+
yx
---+
I
XBY XY
YCX C---+YX
Y---+y
Convertir las producciones con más de dos no terminales en su lado derecho en producciones con dos no terminales en su lado derecho Como resultado del paso anterior se han obtenido dos producciones que tienen tres elementos no terminales en el lado derecho de la producción. Estas producciones (A ---+ X BY Y C ---+ Y C X) no cumplen la definición de forma normal de Chomsky, por lo tanto, hay que modificarlas convenientemente para no variar el lenguaje generado por la gramática inicial. Como ejemplo, se tomará la producción A ---+ X BY, Y se trabajará solamente con su parte derecha X BY. Los pasos a seguir son: • Se separa la parte derecha en grupos de un único no terminal a excepción de los dos últimos no terminales que se agruparán conjuntamente, con lo que el resultado es. ~,-A-.,
X BY.
• Se introduce un nuevo no terminal que derive en el grupo anterior de dos no terminales. En este ejemplo, se introduce el nuevo no terminal M y la producción M ---+ BY. • Por último, se modifica la producción original convenientemente. En este ejemplo, A ---+ XM. Si se realiza un trabajo equivalente con la producción C ---+ Y C X utilizando el nuevo no terminal N, las nuevas producciones que se obtienen son C ---+ Y N Y N ---+ CX. En la siguiente tabla se observa la gramática resultante de estas acciones. 94
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
I Gramática Paso 2 I Gramática Paso 3 I A -t XBY A-tXY B-tC
C -t YCX C-tYX X -tX Y-tY
A-tXM M-tBY A-tXY B-tC C-tYN N-tCX C-tYX X -t X Y-ty
Eliminar las producciones con un sólo no terminal El último paso para asegurar que la gramática cumple la forma normal de Chomsky consiste en eliminar las producciones que contengan un sólo no terminal en su lado derecho. Considerando la gramát.i,ca de este ejercicio, la producción B -t C se encuentra en esta situación. Corno C es un no terminal, consituirá el lado izquierdo de alguna producción, por lo tanto, se podrá sustituir el lado derecho de la producción B -t C, por los lados derechos de las producciones en las que C se encuentre en el lado izquierdo. En el ejemplo, C es el lado izquierdo de las producciones C -t y N Y C -t y X, por lo tanto, se obtendrán las producciones B -t Y N Y B -t Y X. En la siguiente tabla se muestra la forma normal de Chomsky de la gramática del enunciado.
I Gramática Paso 3 I Forma Normal de Chomsky I A-tXM M-tBY A-tXY B-tC C-tYN N-tCX C-tYX X -tX Y-tY
A-tXM M-tBY A-tXY B-tYN B-tYX C-tYN N-tCX C-tYX X -tX Y-tY
Por último, cabe destacar que las gramáticas independientes del contexto que generen lenguajes que sí contengan la cadena vacía, pueden modificarse tal y corno se ha visto en este ejercicio pero asegurando lógicamente que generan también la cadena vacía. Para ello, 95
2. Autómatas a Pila, Lenguajes y Gramáticas Independientes del Contexto se siguen los mismos pasos vistos hasta el momento en este ejercicio solo que al final se añade un nuevo no terminal, que además será el símbolo inicial de la gramática. Este nuevo no terminal A', además de derivar la cadena vacía, simula el símbolo inicial de la gramática original. Así para el caso de este ejercicio, el nuevo símbolo inicial sería A' y se añadirían las siguientes nuevas producciones: A' --+ A, A' --+ X M Y A' --+ XY.
IEJERCICIO 2.10 I Construir un autómata a pila que reconozca el lenguaje L = {zxn zyn z: n E N}.
SOLUCIÓN Las cadenas contenidas en L están compuestas por el mismo número de x e y enmarcadas entre un símbolo z. Así, son ejemplos de cadenas válidas del lenguaje las siguientes cadenas: zxxxzyyyz, zxxzyyz, zzz. (esta última cadena es válida ya que n puede ser igual a O). Por otra parte, son ejemplos de cadenas no válidas las siguientes cadenas: zxxxxzyyyz, zxxzyyyz, zyzxz. La diferencia entre este lenguaje y el lenguaje xnyn es la existencia de los símbolos z. Si se utiliza la pila en el autómata para marcar cuántos símbolos x se han leído de la entrada (introduciendo símbolos en la pila a medida que se leen x's de la entrada, a modo de contador) y de esta manera, poder comparar cuántos símbolos y es necesario leer de la entrada (extrayendo símbolos de la pila a medida que se leen y's de la entrada), los símbolos z p~rmiten marcar el momento en el que se debe cambiar el modo de proceder en la pila, ya que para reconocer los símbolos z no es necesario realizar ningún trabajo sobre la pila. Para construir el autómata a pila que reconozca el lenguaje del enunciado (ver figura 2.12), se debe diferenciar entre la parte del autómata dedicada a reconocer las z y la parte del autómata dedicada a reconocer las cadenas de x's e y's. Para comprobar que la cadena contiene el mismo número de x's que de y's, se utiliza la pila (de la manera mencionada anteriormente), mientras que para reconocer los símbolos z es suficiente con definir tres transiciones, una por cada símbolo z que debe aparecer en la entrada. El autómata de este ejercicio es un ejemplo de autómata a pila determinista cuya pila se vacía antes de aceptar la cadena.
Ejemplos de ejecución del autómata Se van a considerar a continuación diferentes cadenas de entrada con el objetivo de ilustrar el funcionamiento del autómata.
96
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos X,E;a
y,a;E
Figura 2.12: Autómata a pila que reconoce el lenguaje {zxnzynzln E N} .
• Cadena de entrada: zxxzyyz Esta cadena pertenece al lenguaje. En la siguiente tabla se muestra la ejecución del autómata con la cadena zxxzyyz.
I Paso I
Cinta
o
~xxzyyz
0
~xxzyyz
Z X X X Y Y Y V
1 2
3 4
.~
I Estado I Pila I Función de Transición I
Z;!2Xzyyz ZX;!2zyyz zxx~yyz
zxxzyyz zxxzyyz
5
6 7 8
zxxzyy~
zxxzyyz~
U U Ua Uaa Uaa Ua
U U
8(0, E, E) = (Z, U) 8(Z, z, E) = (X, E) 8(X, x, E) = (X,a) 8(X, x, E) = (X, a) 8(X, z, E) = (Y, E) 8(Y, y, a) = (Y, E) 8(Y, y, a) = (Y, E) 8(Y, z, U) = (V, U) Aceptar
• Cadena de entrada: zyzxz Esta cadena no pertenece al lenguaje. En la siguiente tabla se muestra la ejecución del autómata la cadena zyzxz.
I Paso I Cinta I Estado I Pila I Función de Transición I o 1 2
~yzxz
0
~yzxz
Z Z
zyzxz
U U
8(0, E, E) = (Z, U) 8(Z, z, E) = (X, E) Rechazar
• Cadena de entrada: zxzy Esta cadena no pertenece al lenguaje. En la siguiente tabla se muestra la ejecución del autómata la cadena zxzy.
97
2. Autómatas a Pila, Lenguajes y Gramáticas Independientes del Contexto
I Paso I Cinta I Estado I Pila I Función de Transición I o
~xzy
0
1 2 3
~xzy
Z
U
ZJ¿zy
U
4 5
zxzyA zxzy¿
X X Y y
zx~y
Ua Ua U
c5(0,E,E) = (Z,U) c5(Z, Z, E) = (X, E) c5(X, X, E) = (X, a) c5(X, Z, E) = (Y, E) c5(Y,y,a) = (Y,E) Rechazar
En el caso de esta cadena se puede ver que, aunque el autómata vacíe la pila porque ha leído el mismo número de x's que de y's, éste debe seguir procesando la cadena de entrada para leer la última z. Como ésta no está presente, entonces, el autómata rechaza la cadena.
Ejemplos para practicar con JFLAP •., Se sugiere al lector que teniendo en cuenta el autómata definido en este ejercicio, practique con las siguientes cadenas utilizando la herramienta JFLAP [Rodger y Finley, 2006].
• zxxzyyz • zxyxyz • zxxyyz • zzzzzz
98
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
~JERCICIO 2.111 Constuir el autómata a pila que reconozca el lenguaje {xnym: n::; m ::; 2n}. ¿Es determinista la solución aportada? En caso negativo, razonar si es posible construir el autómata a pila determinista equivalente.
SOLUCIÓN El lenguaje del enunicado contiene aquellas cadenas formadas por un número de símbolos x's seguidos de un número de símbolos y's. El número de símbolos que aparecen en cada cadena cumple una doble condición. Por una parte, el número de y's debe ser mayor o igual que el número de x's. Por otra parte, el número de y's debe ser menor o igual que el doble del número de x's. Para reconocer las cadenas de este lenguaje, un autómata a pila deberá controlar cada una de estas condiciones. No obstante, con una única pila el autómata puede controlar una de las condiciones pero no las dos. Para ello, se va a introducir no determinismo, de manera que el autómata realice las dos comprobaciones de manera no determinista. De esta forma, y según los casos, el autómata introducirá un símbolo en la pila (para comprobar la primera condición) o dos símbolos en la pila (para comprobar la segunda condición). El funcionamiento del autómata es simple. Debe ir leyendo la subcadena de x's e ir introduciendo marcas en la pila a medida que lee cada símbolo. Posteriormente, por cada y que lee, debe sacar una marca de la pila. El único problema que realmente tiene el autómata es decidir si debe introducir una marca o dos en la pila (para comprobar la primera o la segunda condición). Este punto es el de no determinismo del autómata y se muestra en la figura 2.13. X,E;a
X,E;aa Figura 2.13: Transiciones no deterministas del autómata que reconoce el lenguaje {xnym: n::; m ::; 2n}
El autómata a pila que reconoce el lenguaje del enunciado se completa con un estado inicial en el que se marca el inicio de la pila con un símbolo de pila vacía, un estado en el que se desapila las marcas de la pila según se van leyendo símbolos y de la entrada y por último, un estado de aceptación al que se llega cuando se ha terminado de leer la cadena de entrada y la pila se encuentra vacía (ver figura 2.14).
99
2. Autómatas a Pila, Lenguajes y Gramáticas Independientes del Contexto X,E;a
y,a;E
X,E;aa
Figura 2.14: Autómata a pila que reconoce el lenguaje {xnym: n:S rn :S 2n}
Ejemplos de ejecución del autómata Se van a considerar a continuación diferentes cadenas de entrada con el objetivo de ilustrar el funcionamiento del autómata.
• Cadena de entrada: xxyyy Esta cadena pertenece al lenguaje. En la siguiente tabla se muestra la ejecución del autómata con la cadena xxyyy.
I Paso I Cinta o 1 2 3
4 5 6 7
;¡¿xyyy ;¡¿xyyy X;¡¿yyy xxyyy xxyyy xxyyy xxyyy,1 xxyyy,1
I Estado I Pila I Función de Transición I 0 X X X Y Y Y V
5(0, E, E) = (X, U) 5(X, x, E) = (X, a) U 5(X, x, E) = (X, aa) Ua Uaaa 5(X, y, a) = (Y, E) Uaa 5(Y, y, a) = (Y, E) 5(Y, y, a) = (Y, E) Ua 5(Y,,\,U) = (V,E) U Aceptar
En el paso 1 se ha ejecutado la transición 5(X, x, E) = (X, a) , aunque se podría haber ejecutado igualmente la transición 5(X, x, E) = (X, aa). Si se hubiera ejecutado esta otra transición en el paso 1, para poder aceptar la cadena, se debería haber ejecutado la transición 5(X, x, E) = (X, a) en el paso 2. Puesto que un autómata a pila no determinista reconoce una cadena de un lenguaje si existe un recorrido del autómata que lleve a un estado de aceptación, en este caso, existen dos posibles recorridos y cualquiera de los dos es válido.
• Cadena de entrada: xxxyy Esta cadena no pertenece al lenguaje. En la siguiente tabla se muestra la ejecución del autómata con la cadena xxxyy. 100
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
I Paso I Cinta I Estado I Pila I Función de Transición I o
5
J2XXYY J2XXYY XJ2XYY xXJ2YY xXXYY xXXYY
6
xxxyy~
1 2 3
4
0 X X X X Y Y
~ ~a ~aa ~aaa ~aa
~a
ó(0, E, E) = (X,u) Ó(X, X, E) = (X, a) Ó(X, x, E) = (X, a) Ó(X, x, E) = (X, a) Ó(X, y, a) = (Y, E) Ó(Y, y, a) = (Y, E) Rechazar
En los pasos 1, 2 Y 3 se ha decidido ejecutar la transición Ó(X, x, E) = (X, a), aunque se podría haber ejecutado igualmente la transición Ó(X, x, E) = (X, aa). Se ha empleado esta transición por ser la que más se aproximaba a la posible solución del problema, pero independientemente de la que se hubiera utilizado, al terminar de leer la cadena de entrada, la pila seguiría conteniendo símbolos y por tanto la cadena se rechazaría. Se deja como ejercicio al lector, comprobar las diferentes ejecuciones del autómata para confirmar que la cadena de entrada es rechazada .
• Cadena de entrada: xyyyy Esta cadena no pertenece al lenguaje. En la siguiente tabla se muestra la ejecución del autómata con la cadena xyyyy.
I Paso I Cinta I Estado I Pila I Función de Transición I o J2YYYY ó(0, E, E) = (X,~) 0 1 2 3 4
J2YYYY XYYYY XYYYY xXXYY
X X Y Y
~ ~aa
~a
~
Ó(X, X, E) = (X, aa) Ó(X, y, a) = (Y, E) Ó(Y, y, a) = (Y, E) Rechazar
En el paso 1 se ha decidido ejecutar la transición ó(X, x, E) = (X, aa), aunque se podría haber ejecutado igualmente la transición Ó(X, x, E) = (X, a). Se deja como ejercicio al lector, comprobar las diferentes ejecuciones del autómata para confirmar que la cadena de entrada es rechazada. 101
2. Autómatas a Pila, Lenguajes y Gramáticas Independientes del Contexto
Ejemplos para practicar con JFLAP Se sugiere al lector que teniendo en cuenta el autómata definido en este ejercicio, practique con las siguientes cadenas utilizando la herramienta JFLAP [Rodger y Finley,
20061 • xxyyyy • xxxyyy • xxxxxy • xxyyxy
¿Es posible construir el autómata a pila determinista equivalente? Como ya se ha comentado anteriormente, para poder construir el autómata a pila determinista que reconociera el lenguaje del enunciado, se necesitaría saber con anterioridad cuántas transiciones de cada tipo se deberían ejecutar en el estado X (ver figura 2.13). No obstante, esta información depende de cada una de las cadenas de entrada, y por tanto, sólo es posible obtenerla una vez leída toda la cadena. Se puede afirmar, por tanto, que existen lenguajes reconocibles por autómatas a pila no deterministas que no son reconocibles por autómatas a pila deterministas (ver el apartado 2.1). En el caso de este ejercicio, se podría pensar que el autómata se podría definir utilizando sólo una de las dos transiciones no deterministas mostradas en la figura 2.13. No obstante, en el caso de que únicamente se utilizará la transición 8(X, x, E) = (X, a) sólo se podría asegurar que el número de y's de la cadena de entrada es superior al número de x's. Esto es así puesto que se hubiera vaciado la pila antes de terminar de leer la entrada y, por tanto, la cadena xyyyy sería una cadena válida del lenguaje. Si por el contrario, se hubiera utilizado la transición 8(X, x, E) = (X, aa), sólo se podría asegurar que el número de y de la cadena de entrada es inferior al doble del número de x's ya que se hubiera terminado de leer la cadena de entrada antes de vaciar la pila, y en este caso, la cadena xxxyy sería considerada una cadena válida del lenguaje sin serlo. Por tanto, en este caso, no es posible construir el autómata a pila determinista equivalente.
102
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
IEJERCICIO 2.12 1 Constuir el autómata a pila que reconozca el lenguaje {xnym: O < m < n}.
SOLUCIÓN
Las cadenas pertenecientes al lenguaje del enunciado están formadas por un número determinado de x's seguidas de un número determinado de y's, donde se debe cumplir que el número de x's es mayor estricto que el número de y's. El autómata a pila que reconozca este lenguaje debe contabilizar el número de x's y de y's que se van leyendo de la entrada. Así, para controlar que se han leído más x's que y's, cada vez que se lea un símbolo x de la entrada se introducirá un símbolo en la pila. Por el contrario cada vez que se lea un símbolo y de la entrada se extraerá un símbolo de la pila. Si al terminar de leer una cadena de entrada la pila no está vacía, entonces se han leído más x's que y's y la cadena será a'Ceptada. La cadena de entrada se rechazaría en cualquier otro caso. En la figura 2.15 se muestra el autómata que reconoce el lenguaje del enunciado. X,E;a
y,a;E
Figura 2.15: Autómata a pila que reconoce el lenguaje {xnym: O < m < n}
Ejemplos de ejecución del autómata Se van a considerar a continuación diferentes cadenas de entrada con el objetivo de ilustrar el funcionamiento del autómata.
• Cadena de entrada: xxxyy
Esta cadena pertenece al lenguaje. En la siguiente tabla se muestra la ejecución del autómata con la cadena xxxyy. 103
2. Autómatas a Pila, Lenguajes y Gramáticas Independientes del Contexto
I Paso I Cinta I Estado I Pila I Función de Transición I J;.xxyy J;.xxyy XJ;.xyy xXJ;.yy xxxyy xxxy'}L xxxyy¿ xxxyy¿
O 1 2 3 4
5 6 7
0 X X X X Y Y V
~ ~a ~aa ~aaa
~aa
~a ~a
Ó(0,E,E) = (X,~) Ó(X, x, E) = (X, a) Ó(X, x, E) = (X, a) Ó(X, x, E) = (X, a) Ó(X, y, a) = (Y, E) Ó(Y, y, a) = (Y, E) Ó(Y,,\,a) = (V,a) Aceptar
• Cadena de entrada: xxyyy Esta cadena no pertenece al lenguaje. En la siguiente tabla se muestra la ejecución del autómata con la cadena xxyyy.
I Paso [.Cinta I Estado I Pila I Función de Transición I O 1 2
3 4 5
J;.xyyy J;.xyyy XJ;.yyy xX'}LYY xxyyy xXYY'}L
0 X X Y Y Y
~
~a
~aa ~a
~
15(0, E, E) = (X,~) Ó(X, x, E) = (X, a) Ó(X, x, E) = (Y, a) Ó(Y, y, a) = (Y, E) Ó(Y, y, a) = (Y, E) Rechazar
Ejemplos para practicar con JFLAP Se sugiere al lector que teniendo en cuenta el autómata definido en este ejercicio, practique con las siguientes cadenas utilizando la herramienta JFLAP [Rodger y Finley,
20061
• xxyyyy • xxxyyy • xxxxxy • xxyyxy
104
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
IEJERCICIO 2.13 1 Construir un autómata a pila que acepte el lenguaje {xn+2yn : O < n E N}
SOLUCIÓN Este ejercicio es similar a otros vistos anteriormente en los que se utiliza la pila del autómata para controlar el número de símbolos de cada tipo que se leen de la entrada. Así, en este caso, se trata de controlar que las cadenas de entrada están formadas por x's seguidas por y's y además cumplen que el número de x es igual al número de y más 2. Como en otras ocasiones, cada vez que se lea una x de la entrada se introducirá en la pila un símbolo que hará las veces de contador (en este caso el símbolo z) y se extraerá un símbolo z cada vez que se lea una y de la entrada. Como el autómata debe leer exactamente dos x's más que y's no puede limitarse a incrementar el contador cuando lea un símbolo x de la entrada, puesto que luego, al terminar de leer los símbolos y de la entrada, la pila no estará vacía (ya que toda cadena válida del lenguaje contiene más x que y). En este caso, y dado que un autómata a pila soiamente puede acceder a la cima de su pila, no podrá determinar si quedan exactamente dos símbolos, más o menos. Por tanto, se va a construir un autómata a pila no determinista, que tendrá la opción de ir leyendo una x de la entrada, incrementando el contador en la pila o adelantarse a la lectura de las y's decrementando el contador de la pila. El diagrama de transiciones de este autómata se muestra en la figura 2.16. X,E;
z
y, z; E
Figura 2.16: Autómata a pila que reconoce el lenguaje {xn+2yn : O < n E N} Se deja como ejercicio al lector, comprobar si es posible construir el autómata a pila determinista equivalente y caso afirmativo construirlo.
Ejemplos de ejecución del autómata Se van a considerar a continuación diferentes cadenas de entrada con el objetivo de ilustrar el funcionamiento del autómata. • Cadena de entrada: xxxy 105
2. Autómatas a Pila, Lenguajes y Gramáticas Independientes del Contexto
Esta cadena pertenece al lenguaje. En la siguiente tabla se muestra la ejecución del autómata con la cadena xxxy.
I Paso I Cinta I Estado I Pila I Función de Transición I o
;t2xxy ;t2xxy X;t2xy XX;t2y xxxy xxxy¿ xxxy¿
1 2 3 4
5 6
0 X X X Y
y
~ ~z ~zz ~z
~
J(0, E, E) = (X,~) J(X, x, E) = (X, z) J(X, x, E) = (X, z) J(X, x, z) = (Y, E)
J(Y, y, z) = (Y, E) J(Y, A,~) = (V, E) Aceptar
V
En este caso, en el paso 3 se podría haber ejecutado igualmente la transición J(X, x, E) = (X, z) que habría llevado a rechazar la cadena. Corno es un autómata no determinista, basta con que haya un camino a un estado de aceptación para aceptar la cadena.
• Cadena de entrada: xxy
.,.
Esta cadena no pertenece al lenguaje. En la siguiente tabla se muestra la ejecución del autómata con la cadena xxy.
I Paso I Cinta I Estado I Pila I Función de Transición I o 1 2 3
;t2xy ;t2xy X;t2y xxy
0 X X X
~ ~z ~zz
J(0, E, E) = (X,~) J(X, x, E) = (X, z) J(X, x, E) = (X, z) Rechazar
En este caso, en el paso 2 se podría haber ejecutado igualmente la transición J(X, x, z) = (Y, E) con lo que la tabla de ejecución del autómata sería de la siguiente forma:
I Paso I Cinta I Estado I Pila I Función de Transición I o 1 2 3 4
;t2xy ;t2xy x;t2y xxy xxy
0 X X Y V
~z
J(0, E, E) = (X,~) J(X, x, E) = (X, z) J(X, x, z) = (Y, E)
~
J(Y, E,~) = (V, E)
~
Rechazar
En el paso 4 se rechaza la cadena puesto que no hay transición aplicable desde el estado V y todavía no se ha terminado de leer la cadena. 106
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
emplos para practicar con JFLAP Se sugiere al lector que teniendo en cuenta el autómata definido en este ejercicio, con las siguientes cadenas utilizando la herramienta JFLAP [Rodger y Finley,
• xxxxyy • xxyy
IEJERCICIO 2. 14 1 Describir el lenguaje generado por la siguiente gramática:
s
-+ SI SI -+ XSIY SI -+ xY S -+ S2 S2 -+ XS2YY S2 -+ xYY
Construir el autómata a pila equivalente.
SOLUCIÓN Puesto que el símbolo inicial de la gramática S, deriva en dos símbolos no terminales SI y S2 diferentes, parece que el lenguaje que genera esta gramática está formado por la unión de dos lenguajes. En primer lugar, las cadenas que se derivan del no terminal SI son aquellas que están formadas por x's seguidas de y's y que tienen el mismo número de x y de y. Por otra parte, las cadenas que se derivan del no terminal S2, son aquellas que están formadas por x's seguidas de y's y que tienen el doble número de y's que de x's. Por último, esta gramática no deriva la cadena vacía. Son ejemplos de cadenas válidas del lenguaje las siguientes: xy, xyy, xxyy y xxyyyy. Por el contrario, las cadenas xx o xyyy son ejemplos de cadenas no válidas del lenguaje. Si L es el lenguaje generado por la gramática del enunciado, L se podría representar como L = L 1 U L 2 donde L 1 = {xnyn : n > O} Y L 2 = {xnym : n, m > O Y m = 2n}. Por tanto, L puede expresarse como L = {xnym : n, m > O, n = m V m = 2n}. 107
2. Autómatas a Pila, Lenguajes y Gramáticas Independientes del Contexto
y,a;E
X,E;aa y,a;E
o
Figura 2.17: Autómata a pila que reconoce el lenguaje {x ny2n}
X,E; a
y, a; E
X,E;a
E,Ü;E
X,E;aa
E,Ü;E
0 X,E; aa y, a; E Figura 2.18: Autómata a pila que reconoce el lenguaje {xnym : n, m
> 0, n = m V m = 2n}
El autómata a pila que reconozca el lenguaje L estará compuesto por los autómatas que reconocen los lenguajes Ll y L 2 • Estos autómatas son similares a otros vistos en ejercicios anteriores y se muestran en las figuras 2.2 y 2.17. Por tanto, el autómata que reconozca el lenguaje L será el que se muestra en la figura 2.18
Ejemplos de ejecución del autómata Se van a considerar a continuación diferentes cadenas de entrada con el objetivo de ilustrar el funcionamiento del autómata.
• Cadena de entrada: xyy La cadena xyy pertenece al lenguaje. En la siguiente tabla se muestra la ejecución del autómata con esta cadena de entrada. 108
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
I Paso I Cinta I Estado I Pila I Función de Transición I o 1 2 3 3 4
J¿YY J¿YY XYY XYY xyy~ xyy~
0 X Y Z Z V
~ ~aa
~a
~
8(0, E, E) = (X,~) 8(X, x, E) = (Y, aa) 8(Y, y, a) = (Z, E) 8(Z, y, a) = (Z, E) 8(Z, E,~) = (V, E) Aceptar
En el paso 1 se podría haber ejecutado la transición 8(X, x, E) = (A, a) que hubiera llevado a rechazar la cadena, tal y como se ve en la siguiente tabla.
I Paso I Cinta I Estado I Pila I Función de Transición I o 1 2 3 3
'"
J¿YY J¿YY XYY XYY XYY
0 X A B
~ ~a
~
V
8(0, E, E) = (X,~) 8(X, x, E) = (A, a) 8(A, y, a) = (B, E) 8(B,E,~) = (V, E) Rechazar
• Cadena de entrada: xx La cadena xx no pertenece al lenguaje. En la siguiente tabla se muestra la ejecución del autómata con esta cadena de entrada.
I Paso I Cinta I Estado I Pila I Función de Transición I o 1 2 3
J¿X J¿X XJ¿ xx~
0 X A A
~ ~a ~aa
8(0, E, E) = (X,~) 8(X, x, E) = (A, a) 8(A, x, E) = (A, a) Rechazar
En el paso 1 se podría haber ejecutado la transición 8(X, x, E) = (Y, aa) que también hubiera llevado a rechazar la cadena, tal y como se ve en la siguiente tabla.
I Paso I Cinta I Estado I Pila I Función de Transición I o J¿X 8(0, E, E) = (X,~) 0 1 2 3
J¿X XJ¿ xx~
X Y Y
~ ~aa ~aaaa
8(X, x, E) = (Y, aa) 8(Y, x, E) = (Y, aa) Rechazar
Puesto que leyendo la cadena xx en la entrada no se llega a un estado de aceptación, el autómata a pila debe rechazarla. 109
2. Autómatas a Pila, Lenguajes y Gramáticas Independientes del Contexto
Ejemplos para practicar con JFLAP Se sugiere al lector que teniendo en cuenta el autómata definido en este ejercicio, practique con las siguientes cadenas utilizando la herramienta JFLAP [Rodger y Finley,
20061 • xyyy • xx • xxyyyy • xxyy
IEJERCICIO 2. 15 1 Construir el autómata a pila que reconoce el lenguaje L = {xnym : n
a :s; m :s;
n y si
= a =? m = a} SOLUCIÓN
El lenguaje del enunciado es similar al de otros ejercicios salvo por las condiciones que se imponen en la cadena. En este caso, tanto n como m pueden ser igual a O, pero si n = a entonces necesariamente m = a. Además, los símbolos x siempre deben ir delante de los símbolos y y siempre debe haber más x's que y's. ASÍ, son ejemplos de cadenas válidas del lenguaje las siguientes: A, x,xy y xxy. Por el contrario, las cadenas yx o xyy son ejemplos de cadenas no válidas del lenguaje. Al igual que en ejercicios similares, este tipo de controles se realizará en base a un contador en la pila del autómata, mientras que el control de que n = a o m = O se hará mediante los estados del autómata. ASÍ, el autómata que reconoce el lenguaje del enunciado se definirá formalmente mediante la tupla (8,~, r, T, T, F) donde: • Conjunto de estados: El conjunto de estados 8 está formado por los estados 8 { qo, ql, q2, q3} • Alfabeto: El alfabeto del autómata es ~ = {x, y} • Conjunto de símbolos de pila: El conjunto de símbolos de pila es r = {x, rt}.
110
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
y,X;E
Figura 2.19: Autómata finito que reconoce el lenguaje {Xnym : O :S m :S n y si n = O ::::}
m=O} • Estado inicial: El estado inicial del autómata es qo • Conjunto de estados finales: El conjunto de estados finales es F = {ql, q2, q3} • Conjunto de Transiciones: El conjunto de transiciones T puede verse en el diagrama de transiciones de la figura 2.19. El autómata a pila de este ejercicio puede aceptar cadenas sin vaciar su pila. Se deja al lector como ejercicio determinar el subconjunto de cadenas de L que este autómata a pila acepta vaciando su pila.
Ejemplos de ejecución del autómata Se van a considerar a continuación diferentes cadenas de entrada con el objetivo de ilustrar el funcionamiento del autómata.
• Cadena de entrada: xxy La cadena xxy pertenece al lenguaje. En la siguiente tabla se muestra la ejecución del autómata con esta cadena de entrada.
I Paso I Cinta I Estado I Pila I Función de Transición I o 1 2 3 4
;KXy ;KXy x;Ky xxy xxy¿
qo
ql ql ql ql
~ ~x ~xx ~x
5(qo, E,E) = (ql,~) 5(ql , X, E) = (ql' x) 5 (ql , x, E) = (ql' x) 5(ql, y, x) = (q2' E)
Aceptar
• Cadena de entrada: xyy La cadena xyy no pertenece al lenguaje. En la siguiente tabla se muestra la ejecución del autómata con esta cadena de entrada. 111
2. Autómatas a Pila, Lenguajes y Gramáticas Independientes del Contexto
I Paso I Cinta I Estado I Pila I Función de Transición I O
*yy
4
xyy
qo
8(qo, E, E)
=
(ql, U)
Rechazar
Ejemplos para practicar con JFLAP Se sugiere al lector que teniendo en cuenta el autómata definido en este ejercicio, practique con las siguientes cadenas utilizando la herramienta JFLAP [Rodger y Finley,
20061 • xyyy • xx • xxyyyy • xxyy
IEJERCICIO 2. 16 1 Construir un autómata a pila que reconozca el lenguaje generado por la siguiente gramática independiente del contexto.
S --t aAA A --t bS A --t aS A--ta SOLUCIÓN En este ejercicio se va a construir el autómata a pila que reconoce el lenguaje generado por la gramática del enunciado siguiendo el procedimiento mostrado anteriormente para construir el autómata de un analizador LL(k) dada una determinada gramática. Así, el autómata a pila se definirá formalmente mediante la tupla (S,~, f, T, T, F) donde: 112
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
A4 A5 Figura 2.20: Autómata a pila equivalente a la gramática del enunciado 2.16. Símbolo
Transición
Ao Al A2 A3 A4 A5
E,S;AAa E,A;Sb E,A;Sa E,A;a a,a;E b,b;E
Tabla 2.9: Tabla de correspondencia entre los símbolos de los arcos del automáta a pila de la figura 2.20 y las transiciQnes del automáta
• Alfabeto: El alfabeto del autómata está formado por los terminales de la gramática, E = {a,b} • Conjunto de símbolos de pila: r = {a, b, S, A} • Conjunto de estados: Los estados del autómata son S = {T, p, q, ¡}. • Estado inicial: El estado inicial es T. • Conjunto de estados finales: El conjunto de estados finales está formado únicamente por el estado f. • Conjunto de transiciones: Las transiciones del autómata a pila se muestran en la figura 2.20 (la correspondencia entre los símbolos de los arcos y las transiciones del autómata se muestran en la tabla 2.9). Es importante recordar el orden en que se introducen los símbolos en la pila, cuando en una transición se introducen más de un símbolo en la pila (ver sección 2.1).
Ejemplos de ejecución del autómata Se van a considerar a continuación diferentes cadenas de entrada con el objetivo de ilustrar el funcionamiento del autómata. 113
2. Autómatas a Pila, Lenguajes y Gramáticas Independientes del Contexto
1
• Cadena de entrada: aaa
I
,
J
La cadena aaa pertenece al lenguaje. En la siguiente tabla se muestra la ejecución del autómata con esta cadena de entrada.
I Paso I Cinta I Estado I Pila I Función de Transición I o 1 2 3 4
5 6 7 8 9
ª-aa ª-aa ª-aa ª-aa aª-a aª-a aaªaaª-
8(7, E, E) = (p, U)
7
aaa~
p q q q q q q q
aaa~
f
U US UAAa UAA UAa UA Ua
U
8(p,E,E) = (q,S) 8(q, E, S) = (q, AAa) 8(q, a, a) = (q, E) 8(q, E, A) = (q, a) 8(q, a, a) = (q, E) 8(q, E, A) = (q, a) 8(q, a, a) = (q, E) 8(q,E,U) = (J,E) Aceptar
En esta ejecución del autómata existen varios puntos de no determinismo. Se deja como ejerciciO al lector, determinarlos y construir la tabla de ejecución del autómata correspondiente.
• Cadena de entrada: ab La cadena ab no pertenece al lenguaje. En la siguiente tabla se muestra la ejecución del autómata con esta cadena de entrada.
I Paso I Cinta I Estado I Pila o 1 2 3
4 5 6 7
ª-b ª-b ª-b ª-b aQ aQ ab~ ab~
8(7, E, E) = (p, U)
7
p q q q q q q
I Función de Transición I
U US UAAa UAA UASb UAS UAAAa
8(p, E, E) = (q, S) 8(q, E, S) = (q, AAa) 8(q, a, a) = (q, E) 8(q, E, A) = (q, Sb) 8(q, b, b) = (q, E) 8(q, E, S) = (q, AAa) Rechazar
Se deja como ejercicio al lector determinar los puntos de no determinismo en la ejecución de este autómata y construir la tabla de ejecución correspondiente. Al hacerlo comprobará que con la cadena de entrada ab no existe un camino que lleve al autómata al estado de aceptación y por tanto, el autómata debe rechazar la cadena.
114
1
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
ICIO
2.17
Construir el autómata a pila que reconoce el lenguaje L = {w Iw E {O, 1} *, w = vv R } v R es la cadena inversa de v. Así por ejemplo, si v es la cadena 011 entonces v R es 110. tanto, este lenguaje contiene a los palíndromos de longitud par del alfabeto ~ = {O, 1}.,
SOLUCIÓN
°
Tal y como se comenta en el enunciado, el lenguaje contiene todas aquellas cadenas de y 1 de longitud par Yque puede leerse de la misma forma de izquierda a derecha que de derecha a izquierda. Son ejemplos de cadenas válidas del lenguaje las siguientes: 0110,010010 o 100l. Por el contrario, las siguientes cadenas son ejemplos de cadenas no válidas del lenguaje: 101, 10 o 000. La cadena 101 aún siendo un palíndromo, no es una cadena válida del lenguaje puesto que no tiene longitud par. El autómata a pila que reconoce el lenguaje del enunciado se definirá formalmente mediante la tupla (8, I:, f, T, T, F) donde:
• Alfabeto: El alfabeto del autómata está formado por los terminales de la gramática, ~={0,1}
• Conjunto de símbolos de pila: f
= {O, 1, Ü
• Conjunto de estados: Los estados del autómata son 8 = {0, qo, ql, q2}. • Estado inicial: El estado inicial es
0.
• Conjunto de estados finales: El conjunto de estados finales está formado por el estado q2· • Conjunto de transiciones: Las transiciones del autómata a pila se muestran en la figura 2.21. O,O;E 0, E;
°
1,E; 1 1,1;E Figura 2.21: Autómata a pila que reconoce el lenguaje L = {wlw E {O, 1}*, w = vv R } Se deja como ejercicio al lector modificar el diagrama de la figura 2.21 para que acepte también palíndromos de longitud impar. 115
2. Autómatas a Pila, Lenguajes y Gramáticas Independientes del Contexto
Ejemplos de ejecución del autómata Se van a considerar a continuación diferentes cadenas de entrada con el objetivo de ilustrar el funcionamiento del autómata.
• Cadena de entrada: 0110 La cadena 0110 pertenece al lenguaje. En la siguiente tabla se muestra la ejecución del autómata con esta cadena de entrada.
I Paso I Cinta I Estado I Pila I Función de Transición I O 1 2 3 4
5 6
QllO QllO 0110 0110 0110 OllQ 01l0~
7 " 01l0~
0 qo qo qo ql ql ql q2
U UO U01 U01 UO U
8(0,E,E) = (qo, U) 8(qo, O, E) = (qo, O) 8(qo, 1, E) = (qo, 1) 8(qo, E, E) = (qh E) 8(ql' 1, 1) = (ql, E) 8(ql' O, O) = (ql, E) 8(ql,E,U) = (q2,E) Aceptar
En este caso, en el paso 3 se podría haber ejecutado igualmente la transición 8 ( qo, 1, E) = (qo, 1) que habría llevado a rechazar la cadena. Como es un autómata no determinista, basta con que haya un camino a un estado de aceptación para aceptar la cadena.
• Cadena de entrada: 010 La cadena 010 no pertenece al lenguaje. En la siguiente tabla se muestra la ejecución del autómata con esta cadena de entrada.
I Paso I Cinta I Estado I Pila I Función de Transición I O 1 2 3
Q10 Q10 010 01Q
4 5
010~ 010~
0 qo qo qo qo ql
8(0, E, E) = (qo, U) 8(qo, O, E) = (qo, O) U 8(qo, 1, E) = (qo, 1) UO 8(qo, O, E) = (qo, O) »01 »010 8(qo, E, E) = (ql' E) U010
Rechazar
En este caso, en cualquiera de los pasos en los que el estado actual es qo se podría haber ejecutado la transición 8(qo, E, E) = (ql' E), que hubiera llevado igualmente a rechazar la cadena. 116
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
Ejemplos para practicar con JFLAP Se sugiere al lector que teniendo en cuenta el autómata definido en este ejercicio, practique con las siguientes cadenas utilizando la herramienta JFLAP [Rodger y Finley, 20061 • 01010
• 001100
IEJERCICIO 2. 18 1 Indicar si el lenguaje aceptado por el siguiente autómata a pila: • Conjunto de estados: S = {qo, ql, q2} • Alfabeto: ¿; = {x, y} '"
• Conjunto de símbolos de pila:
r=
{.'L, y,
n
• Estado inicial: T = qo • Conjunto de estados finales: F = {q2} • Transiciones: (qo, E, E, ql, ~), (ql, X, E, ql, x), (ql, y, x, E, ql), (ql, E,~, q2, E) puede expresarse mediante la siguiente expresión regular: (xy) *
SOLUCIÓN En primer lugar se comprobará el lenguaje que acepta el autómata (cuyo diagrama de transiciones se muestra en la figura 2.22). El autómata del enunciado utiliza la pila para mantener un contador que controle el número de x leídas y que permita leer el mismo número de y's. Otra condición que deben cumplir las cadenas que acepta este autómata es que siempre debe haber leído al menos una x antes de leer una y de la entrada. La expresión regular del enunciado, por su parte, genera cadenas que resultan de la concatenación de cero o más veces el patrón xy. Por consiguiente, las condiciones que imponen a las cadenas que reconocen el autómata y la expresión no regular no coinciden. De hecho, el autómata reconoce la cadena xxyy, que no pertenece al lenguaje generado por la expresión regular del enunciado. De hecho, Si se considera que L es el lenguaje generado por la expresión regular y L' es el lenguaje que acepta el autómata a pila, entonces se cumple que L e L'.
117
2. Autómatas a Pila, Lenguajes y Gramáticas Independientes del Contexto
X,E;X
y,X;E
Figura 2.22: Autómata a pila del enunciado 2.18
IEJERCICIO 2. 19 1 Construir el autómata a pila que reconozca el lenguaje formado por todas aquellas cadenas en las que, al ser leídas de izquierda a derecha, el número de y's nunca supera al de x's leídas.
SOLUCIÓN A diferencia de ejercicios anteriores, el lenguaje del enunciado no indica que las cadenas deban tener el mismo número de x's que de y's ni que todas las x's de la cadena deban ir al principio antes de las y's. Son ejemplos de cadenas válidas las siguientes: xxy, xxyxy y xx. Por el contrario, las siguientes cadenas yx o xyyx son ejemplos de cadenas no válidas del lenguaje. Como es habitual en este tipo de ejercicios, para llevar el control de los símbolos leídos en la cadena de entrada, el autómata utilizará la pila a modo de contador. Así, cada vez que lea una x en la entrada, introducirá una x de la pila. En el caso en el que el autómata encuentre un símbolo y en la entrada, deberá comprobar que hay alguna x en la pila, puesto que de 10 contrario, significa que en ese momento está leyendo más y's que x's. El autómata que reconoce el lenguaje del enunciado se muestra en la figura 2.23. X,E;X
{:
y,X;E
Figura 223: Autómata finito que reconoce el lenguaje del enunciado 2.19 118
d
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
El autómata a pila de este ejercicio acepta cadenas sin necesidad de vaciar su pila. Se deja al lector como ejercicio indicar el subconjunto de cadenas que acepta este autómata vaciando su pila.
Ejemplos de ejecución del autómata Se van a considerar a continuación diferentes cadenas de entrada con el objetivo de ilustrar el funcionamiento del autómata.
• Cadena de entrada: xxy La cadena xxy pertenece al lenguaje. En la siguiente tabla se muestra la ejecución del autómata con esta cadena de entrada.
I Paso I Cinta I Estado I Pila I Función de Transición I o 1 2
J
;fXy X;fy xxy xxy2l
qo qo qo qo
x xx x
5(qo, x, E) 5(qo, x, E) 5(qo, y, x)
(qo, x)
= (qo, x) = (qo, E)
Aceptar
• Cadena de entrada: xyyx La cadena xyyx no pertenece al lenguaje. En la siguiente tabla se muestra la ejecución del autómata con esta cadena de entrada.
I Paso I Cinta I Estado I Pila I Función de Transición I o 1 2
;fyyx xyyx xyyx
qo qo qo
x
5(qo, x, E) = (qo, x) 5(qo, y, x) = (qO, E) Rechazar
Ejemplos para practicar con JFLAP Se sugiere al lector que teniendo en cuenta el autómata definido en este ejercIcIo, practique con las siguientes cadenas utilizando la herramienta JFLAP [Rodger y Finley,
20061 • xxyxy • xxxyyyyx • xxx
119
CAPÍTULO 3
Máquinas de Turing
En este capítulo se tratarán problemas relacionados con las máquinas de Turing. Las máquinas de Turing son las máquinas teóricas más potentes y marcan el límite de los problemas computables (es lo que se conoce corno Tesis de Turing)
3.1.
Base Teórica
Para la resolución de los problemas de este capítulo es conveniente conocer: • Las máquinas de Turing y su representación mediante diagramas de estados finitos. Además del estado inicial, las máquinas de Turing tienen un estado de parada. Cuando la máquina de Turing llega a su estado de parada, detiene sus cálculos, aunque no se haya terminado de leer la cadena de entrada. Esta es una de las diferencias del estado de parada y los estados de aceptación de los autómatas finitos y de pila, donde el autómata podía continuar su funcionamiento aunque hubiera llegado al estado de aceptación. • El estado de parada debe ser diferente al estado inicial, por tanto, las máquinas de Turing siempre tienen al menos dos estados. • Las máquinas de Turing pueden desplazar su cabeza de lectura/escritura una posición hacia la derecha o una posición hacia la izquierda. Además pueden escribir un símbolo en la posición actual. En ese caso, la máquina de Turing reemplaza el símbolo de la celda actual con otro símbolo y cambia de estado (que puede ser el mismo en el que 121
3. Máquinas de Turing estaba antes). Al igual que ocurría con los autómatas a pila, las máquinas de Turing disponen de un conjunto finito de símbolos de cinta además del alfabeto que contiene los símbolos que componen las cadenas de entrada. El conjunto de símbolos de cinta, contiene los símbolos que el autómata puede escribir en la cinta. Normalmente, este conjunto contiene a los símbolos del alfabeto junto con un conjunto de símbolos especiales. Entre estos símbolos se encuentra el símbolo A utilizado anteriormente en este texto. En el caso de que la máquina de Turing quiera borrar un símbolo de la entrada, basta con que escriba el símbolo A en la posición actual. • Dado el funcionamiento de la cabeza de lectura/escritura de una máquina de Turing, puede ocurrir que al desplazarse por la cinta hacia la izquierda rebase el inicio de la cinta. En este caso se dice que la máquina de Turing tiene una terminación anormal. Igualmente puede ocurrir que la máquina de Turing entre en un bucle y continue desplazándose indefinidamente hacia la derecha en la cinta (incluso habiendo terminado de leer la cadena). • Existen dos criterios de aceptación de una cadena por parte de una máquina de Turing. Las máquinas de., Turing aceptan una cadena, bien cuando llegan a un estado de parada o bien cuando llegan a un estado de parada y han escrito antes un mensaje de aceptación en la cinta. Salvo que se especifique 10 contrario, en este texto, se supone que una máquina de Turing acepta una cadena si llega a un estado de parada. • Los lenguajes aceptados por máquinas de Turing son los llamados lenguajes estructurados por frases. Los lenguajes estructurados por frases contienen a los lenguajes independientes del contexto. Un ejemplo de lenguaje estructurado por frases y que no es independiente del contexto es: {xnyn : n > O, n E N} (ver figura 3.1). • Cuando una máquina de Turing actúa como reconocera de un lenguaje, se considera la siguiente configuración inicial en la cinta de entrada. En el primer lugar a la izquierda de la cinta se sitúa un espacio en blanco (representado por el símbolo A). A continuación se sitúa la cadena del lenguaje que se quiere reconocer. Por último, se sitúan a la derecha de la cadena un número indefinido de espacios en blanco (A). Como es habitual, el símbolo actual de la cinta (que en este caso es el primer espacio en blanco que aparece a la izquierda de la cinta), aparecerá subrayado. Así, para averiguar si una determinada máquina de Turing reconoce una determinada cadena w, la configuración inicial de la cinta de entrada será ¿w AA. • Para cada alfabeto existe al menos un lenguaje que no es un lenguaje estructurado por frases. • Diferencia entre los lenguajes estructurados por frases aceptables y decidibles. 122
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
Lenguajes estructurados por frases
Figura 3.1: Relación entre los lenguajes independientes del contexto, los lenguajes regulares y los lenguajes estructurados por frases.
• Se pueden definir Máquinas de Turing con varias cintas. Aunque este hecho simplifica el trabajo de la máquina, no aumenta el poder de reconocimiento de la máquina. Así, para cada máquina de Turing de varias cintas, existe una máquina de Turing de una sola cinta que reconoce el mismo lenguaje. • Se pueden definir Máquinas de Turing no deterministas que tampoco amplían el poder de reconocimiento de lenguajes. • Los lenguajes reconocidos por las máquinas de Turing son aquellos que pueden generar las gramáticas menos restrictivas, las gramáticas estructuradas por frases. A diferencia de las gramáticas regulares y las gramáticas independientes del contexto, las gramáticas estructuradas por frases no imponen ninguna restricción en la estructura de sus producciones. • Gracias a que una máquina de Turing puede desplazarse libremente por la cinta, las máquinas de Turing no necesitan tratar los símbolos de la cinta en el momento de leerlos. Además, una máquina de Turing puede ir introduciendo marcas en la cinta indicando qué parte ha sido ya evaluada y cuál no. Para cubrir los contenidos anteriores se pueden consultar numerosas referencias en la literatura, de nuevo recomendamos las siguientes dos fuentes: 123
3. Máquinas de Turing
• Capítulos 8 del libro Teoría de autómatas, lenguajes y computación. H. E. Hopcroft, R. Motwani, J. D. Ullman. Pearson. Addison Wesley. Tercera Edición, 2008 ([Hopcroft et al., 2008]). • Capítulo 3 del libro Teoría de la Computación: Lenguajes Formales, Autómatas y Complejidad. J.G. Brookshear. Addison-Wesley Iberoamericana, 1993 ([Brookshear, 1993]). La nomenclatura que se va a utilizar en este capítulo será la siguiente: • Una máquina de Turing se representa formalmente mediante la siguiente tupla: (8,~, f, 8, T, F) donde 8 es un conjunto de estados, ~ es el alfabeto de la máquina, f es la colección finita de símbolos de cinta, 8 define la función de transición de la máquina, T representa el estado inicial de la máquina y F =1 T representa el estado de parada. • Al definir la función de transición se debe tener en cuenta las diferentes operaciones que puede realizar la máquina de Turing, esto es, desplazarse a la izquierda o a la derecha una posición en la cinta y escribir un símbolo en la cinta. Así:
• 8(p, x)
=
(q, y, ~) significa que, estando en el estado p y leyendo un símbolo x
de la cinta, la máquina de Turing cambiará al estado q escribiendo un símbolo y en la cinta y desplazándose una posición a la izquierda.
• 8(p, x)
= (q, y, --+) significa que, estando en el estado p y leyendo un símbolo x de la cinta, la máquina de Turing cambiará al estado q escribiendo un símbolo y en la cinta y desplazándose una posición a la derecha..
• 8(p, x)
=
(q, y, stop) significa que, estando en el estado p y leyendo un símbolo
x de la cinta, la máquina de Turing cambiará al estado q escribiendo un símbolo y en 'la cinta sin desplazar la cabeza de lectura/escritura por la cinta. • Los diagramas de transiciones de una máquina de Turing serán similares a los vistos hasta el momento, notando los estados iniciales y el de parada de la siguiente manera:
Representación del estado inicial 124
Representación del estado de parada
Autómatas, Gramáticas y Lenguajes fonnales: problemas resueltos
• Las transiciones en los diagramas de las máquinas de Turing se representarán de la siguiente forma, (x,y,D), donde x es el símbolo actual de la cinta, y es el símbolo que la máquina escribirá en la cinta y D indica la dirección en que la máquina desplazará su cabeza de lectura/escritura (puede ser -+ o ~) o bien stop que indica que la máquina no desplaza su cabeza de lectura/escritura. • En ocasiones se utilizan bloques de construcción básicos de máquinas de Turing [Brookshear, 1993] que permiten combinar diferentes máquinas de Turing sencillas para crear una más compleja. Así por ejemplo, la máquina R denota la máquina de Turing que desplaza la cabeza un lugar a la derecha. Por otra parte, la máquina L denota la máquina de Turing que desplaza la cabeza un lugar a la izquierda. Otro ejemplo, es la máquina Rx que denota a la máquina que desplaza su cabeza a la derecha hasta que encuentra la primera aparición del símbolo x en la cinta. Por último, un bloque de construcción bastante común es aquél que se encarga de escribir un símbolo determinado en la celda actual de la cinta sin mover su cabeza de lectura/escritura. Este bloque se representa por el símbolo que se quiere escribir en la cinta (así por ejemplo, la máquina x escribe un símbolo x en la celda actual sin cambiar de posición en la cinta). A continuación se muestran los diagramas de transiciones de estos ejemplos:
Diagrama de transiciones de la máquina R: Diagrama de transiciones de la máquina L: Diagrama de transiciones de la máquina Rx:
Diagrama de transiciones de la máquina x: Puede ocurrir, en los casos en los que una transición se etiqueta con más de un símbolo, que interese saber qué símbolo se ha leído realmente. En estos casos la transición se etiquetará de la siguiente forma: x,y,z.
}
w
125
3. Máquinas de Turing
donde se indica que la transición se ejecutará siempre que se lea de la entrada un símbolo x, y o Z, y que el símbolo que se lea se guardará en la variable w. Así, en el siguiente ejemplo: R x,~}
w • Rw
en primer lugar se ejecutará una máquina R, a continuación, si se lee un símbolo x, y o Z se ejecuta la transición (y se guardará el símbolo que se lea en la variable w) que lleva a la máquina de Turing a ejecutar una máquina R y una máquina w. Esta última máquina escribirá en la celda actual de la cinta de entrada el símbolo que haya leído en la transición anterior. Cuando una máquina de Turing se representa mediante bloques de construcción básicos y ocurre que, después de ejecutarse un determinado bloque, no hay una transición aplicable, entonces se supone que la máquina ha llegado a un estado de parada y termina sus cálculos.
126
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
3.2. Problemas resueltos
IEJERCICIO 3.11 Construir la máquina de Turing que reconozca el lenguaje L
= {xnyn zn, O < n
E N}.
SOLUCIÓN La máquina de Turing que reconozca el lenguaje L del enunciado funcionará de la siguiente manera. Una vez que ha leído una x de la entrada, busca una y y a continuación una z. A continuación deberá marcar estos símbolos como leídos (escribiendo en su lugar los símbolos a para las x's, b para las y's y e para las z's). Si no es capaz de leer alguno de estos símbolos es porque hay distinto número de x's, y's o z's y en ese caso la cadena no pertenece al lenguaje. Una vez leído este conjunto de tres símbolos regresa al principio de la cinta para continuar procesando la cadena. Formalmente, esta máquina de Turing se definiría de la siguiente manera:
• S = {0, X, Y, Z, Regresar, Comprobar, V}. En el estado Regresar la máquina de Turing retrocede en la cinta de entrada hasta posicionarse en la celda que contiene el primer símbolo x que todavía no ha leído. En el estado Comprobar la máquina de Turing comprueba que en la cinta de entrada sólo hay símbolos a,b o e y en ese caso, cambia al estado de parada y termina la ejecución aceptando la cadena. • ~ =
{x,y,z}
• r = ~U{a,b,c} •
T
• F
= =
{0} {V}
• 8 es la función de transición de la máquina de Turing. En la figura 3.2 se muestra el diagrama de transiciones de esta máquina de Turing. Con el objetivo de aclarar la comprensión del diagrama, las transiciones están etiquetadas con ciertos símbolos cuya correspondencia con las transiciones de la máquina se encuentra en la tabla 3.1. Ya se ha mencionado en el apartado 3.1 que existen dos criterios de aceptación por parte de una máquina de Turing. En el caso de la máquina de Turing que reconoce el lenguaje L, se considera que la cadena de entrada es aceptada si la máquina llega al estado de parada, cuando lee la última aparición de la letra a y que no la acepta en cualquier otro caso. En el 127
3. Máquinas de Turing
A
R K
1
Figura 3.2: Máquina de Turing que reconoce el lenguaje {xnynzn : O < n E N}.
I Símbolo I Transición A B
C D E F G H
L 1 K
J M N
R O
P Q
8r0,x) = (X,a,~) 8(X, x) = (X,x,~) 8(X,b) = (X,b,~) 8(X, y) = (Y,b,~) 8(Y, y) = (Y, y, ~ ) 8(Y, e) = (Y,e,~) 8(Y,z) = (Z,e,~) 8(Z, z) = (Regresar, z, +-) 8(Regresar, e) = (Regresar, e, +-) 8(Regresar,y) = (Regresar,y,+-) 8(Regresar, b) = (Regresar, b, +-) 8(Regresar, x) = (Regresar, x, +-) 8(Regresar, a) = (0, a, ~) 8(Z,A) = (Comprobar,A,+-) 8(Comprobar,e) = (Comprobar,e,+-) 8(Comprobar,b) = (Comprobar,b,+-) 8(Z,a) = (Comprobar,a,+-) 8(Comprobar,a) = (V,a,stop)
I Etiqueta (x,a,~) (x,x,~)
(b, b,~) (y,b,~) (y,y,~) (e,e,~) (z,e,~)
(z,z,+-) (e,e,+-) (y,y,+-) (b,b,+-) (x,x,+-) (a,a,~)
(\ A, +-) (e,e,+-) (b,b,+-) (a,a,+-) (a, a, stop)
Tabla 3.1: Tabla de correspondencia entre los símbolos de los arcos de la máquina de Turing de la figura 3.2 y las transiciones
128
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
caso de que la máquina de Turing no llegue al estado de parada o no haya transición aplicable para un determinado estado y símbolo de cinta, entonces se supone que la máquina llega a un estado de error y se queda en este estado independientemente de los símbolos que vengan de la entrada. En el diagrama de la máquina de Turing de la figura 3.2 no aparece el estado de error para simplificar su comprensión.
Ejemplos de ejecución de la máquina de Turing Se van a considerar a continuación diferentes cadenas de entrada con el objetivo de ilustrar el funcionamiento de la máquina.
• Cadena de entrada: xyy La cadena xyy no es una cadena válida del lenguaje. En la siguiente tabla se muestran las transiciones entre estados y el estado de la cinta para esta cadena de entrada.
I Paso I Cinta I Estado I Función de Transición I o J¿YY 15(0,x) = (X,a,----7) 0 1 2 3
xyy xby xby¿
X Y Y
15(X,y) = (Y,b,----7) 5(Y, y) = (Y, y, ----7 ) Rechazar
En el paso 3, la máquina de Turing rechaza la cadena puesto que no tiene transición aplicable y el estado Y no es un estado de parada. En este caso, se supone que la máquina de Turing cambiaría a un estado de error en el que permanecería indefinidamente sin parar y por tanto no aceptaría la cadena de entrada.
• Cadena de entrada: xxyyzz Esta es una cadena válida del lenguaje. En la siguiente tabla se muestran las transiciones entre estados y el estado de la cinta para la cadena xxyyzz. 129
3. Máquinas de Turing
I Paso I Cinta o 1 2 3
4 5 6 ,
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
i' '
;KXyyzz a;Kyyzz axyyzz axbyzz axby~z axbyc~
axby[;.z axbycz aXQYcz a;Kbycz ª-xbycz a;Kbycz aaf2ycz aabycz aabb[;.z 'aabbc~
aabbccll aabbc[;. aabb[;.c aabQcc aaQbcc aª-bbcc aª-bbcc
I Función de Transición 8(0, x) = (X, a, -+) 0 X 8(X, x) = (X, x, -+) X 8(X, y) = (Y, b, -+) Y 8(Y, y) = (Y, y, -+) Y 8(Y, z) = (Z, e, -+) Z 8(Z, z) = (Regresar, z, f-) Regresar 8(Regresar, c) = (Regresar, c, f-) Regresar 8(Regresar, y) = (Regresar, y, f-) Regresar 8(Regresar, b) = (Regresar, b, f-) Regresar 8(Regresar, x) = (Regresar, x, f-) Regresar 8(Regresar, a) = (0, a, -+) 8(0, x) = (X, a, -+) 0 X 8(X, b) = (X, b, -+) X 8(X, y) = (Y, b, -+) Y 8(Y, c) = (Y, c, -+) Y 8(Y, z) = (Z, c, -+) Z 8(Z, A) = (Comprobar, A, f-) Comprobar 8(Comprobar, c) = (Comprobar, c, f-) Comprobar 8(Comprobar,c) = (Comprobar,c,f-) Comprobar 8(Comprobar, b) = (Comprobar, b, f-) Comprobar 8(Comprobar,b) = (Comprobar,b,f-) Comprobar 8(Comprobar, a) = (V, a, stop) Aceptar V Estado
Ejemplos para practicar con JFLAP Se sugiere al lector que teniendo en cuenta la máquina de Turing definida en este ejercicio, practique con las siguientes cadenas utilizando la herramienta JFLAP [Rodger y Finley, 20061.
• A • xyxzzy • yyxxzz
130
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
IEJERCICIO 3.21 Construir una máquina de Turing que compruebe si en un determinado proceso los eventos A y E están activos en el mismo momento.
SOLUCIÓN La máquina de Turing que se pide en el enunciado, tiene que estar continuamente en ejecución para poder recibir eventos y así comprobar que A y E están activos en el mismo momento. Este tipo de máquinas pueden ser útiles a la hora de detectar situaciones potencialmente alarmantes en un proceso, caracterizadas por diferentes eventos que se producen al mismo tiempo (por ejemplo, que en una planta depuradora la medida de dos sustancias supere un determinado umbral). En consecuencia, el lenguaje definido en el enunciado, tiene la característica de ser un lenguaje aceptable no decidible, ya que las cadenas que no pertenezcan al lenguaje que acepta esta máquina de Turing, no pueden provocar que ésta pare la ejecución. Por tanto, la máquina de Turing deberá leer constantemente la entrada, e irá cambiando de estado. Los estados -de la máquina controlarán los tipos de evento que aparecen en la entrada. Formalmente, esta máquina de Turing se definiría de la siguiente manera: • L:;=f={a,b,c,d,e,j,g,h,i,j}.Donde
a Empieza a producirse el evento A. b Deja de producirse el evento A. e Se reconoce que se está produciendo el evento A. d Se reconoce que deja de producirse el evento A e Empieza a producirse el evento E. f Deja de producirse el evento E.
g Se reconoce que se está produciendo el evento E. h Se reconoce que deja de producirse el evento E. i No hay eventos. j Se reconoce que no hay eventos.
Las cadenas, potencialemente infinitas, que forman el lenguaje son cadenas que contendrán inicialmente cualquier combinación de los elementos {a, b, e, j, i}. Para que la cadena sea considerada válida debe contener una a seguida, no tiene porque ser inmediatamente, de una e. No obstante, deben cumplir las siguientes condiciones: 131
3. Máquinas de Turing
(i,j,-t) (i,j,-t)
(e,g,-t)
(e,g,-t)
(j, h,-t) (a,c,-t) (e, g, ----+)
(b, d, ----+)
(a,c,----+) Figura 3.3: Máquina de Turing que reconoce si en un determinado proceso, los eventos A y E están activos en el mismo momento • Si el símbolo a aparece en primer lugar, no puede haber, entre los símbolos a y e, una b. • Si el símbolo e aparece en primer lugar, no puede haber, antes del símbolo a, un símbolo f . • Conjunto de estados S. Corno la máquina de Turing debe reconocer solamente 2 eventos, se necesitarán 22 estados para representar la información relativa a si se está produciendo o no cada uno de los eventos. Por tanto, los estados de la máquina de Turing son:
o No se está dando ningún evento. A Se está produciendo el evento A. E Se está produciendo el evento E. V Se están produciendo los dos eventos. •
T
= {0}
• F = {V} • b es la función de transición de la máquina de Turing que puede verse en el diagrama de transiciones de la máquina de la figura 3.3.
132
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
Ejemplos de ejecución de la máquina de Turing Se van a considerar a continuación diferentes cadenas de entrada con el objetivo de ilustrar el funcionamiento de la máquina.
• Cadena de entrada: iiabieíea La cadena iiabieíea es una cadena válida del lenguaje. En la siguiente tabla se muestran las transiciones entre estados y el estado de la cinta para esta cadena de entrada.
I Paso I o 1 2 3 ...4 ,
5 6 "1 I
8 9
I Estado I Función de Transición I
Cinta
0 0 0
iíabieíea jiabieiea jj{1bieiea jjcQieíea jjcdieiea jjcdjf¿iea jjcdjgiea jjcdjgjf¿a jjcdjgjg{1
A
0 0
jjcdjgjgc~
E E E V
5(0, i) = (0, j, -+ ) 5(0, i) = (0, j, -+) 5(0, a) = (A, c, -+) 5(A, b) = (0, d, -+) 5(0, i) = (0, j, -+) 5(0, e) = (E,g,-+) 5(E, i) = (E, j, -+) 5(E, e) = (E, g, -+) 5(E, a) = (V, c, -+) Parar
• Cadena de entrada: iabiei La cadena iabiei no es una cadena válida del lenguaje puesto que entre el símbolo a y el símbolo e hay un símbolo b que indica que ha dejado de producirse el evento A y por tanto, ambos eventos no se producen al mismo tiempo. En la siguiente tabla se muestran las transiciones entre estados y el estado de la cinta para esta cadena de entrada.
I Paso I
Cinta
o
5
iabiei j{1biei jCQiei jcdiei jcdjf¿i jcdjgi
6
jcdjgj~
1 2 3 4
I Estado I Función de Transición I 0 0 A
0 0 E E
5(0, i) = (0, j, -+) 5(0,a) = (A,c,-+) 5(A,b) = (0,d,-+) 5(0, i) = (0, j, -+) 5(0, e) = (E, g, -+) 5(E, i) = (E,j, -+) No Parar 133
3. Máquinas de Turing
En el paso 6 la máquina de Turing no ha encontrado que los dos eventos se hayan producido en el mismo momento. Como la máquina de Turing debe localizar en qué momento se producen ambos eventos, tiene que esperar indefinidamente la llegada de más información proveniente de la cadena de entrada. Por tanto, y en este caso, se supone que la máquina de Turing permanece indefinidamente en un determinado estado sin parar su ejecución.
Ejemplos para practicar con JFLAP Se sugiere al lector que teniendo en cuenta la máquina definida en este ejercicio, practique con las siguientes cadenas utilizando la herramienta JFLAP [Rodger y Finley, 2006].
• iiaibiieiieiia • iieifaie • iieiifa • iiaiib
IEJERCICIO 3.31 Construir una máquina de Turing que realice la suma de dos números binarios.
SOLUCIÓN El objetivo de este ejercicio es comprobar la capacidad de cómputo de las máquinas de Turing. Por tanto, su objetivo difiere del del resto de ejercicios del libro, cuyo objetivo fundamental es el de comprobar si una determinada cadena pertenece o no a un determinado lenguaje. La suma o adición binaria es análoga a la de los números decimales. La diferencia radica en que en los números binarios se produce un acarreo cuando la suma excede de uno mientras que en la suma decimal, se produce un acarreo cuando la suma excede de nueve(9). Las reglas que rigen la suma binaria son:
134
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
Regla 1 Regla 2
0+0=0 0+1=1
Regla 3 Regla 4
1+0=1 1 + 1 = OY acarreo 1
Para reducir el tamaño de la máquina de Turing del enunciado, se va a plantear la solución del problema mediante la construcción de una máquina de Turing de 3 cintas. Aunque podría pensarse que el potencial de procesamiento de lenguajes de las máquinas de Turing, aumentaría según se aumentara el número de cintas, esto no es así. De hecho, para cada máquina de Turing de varias cintas, existe una máquina de Turing de una sóla cinta que reconoce el mismo lenguaje (ver Teorema 3.1 en la Página 162 de [Brookshear, 1993] o apartado 8.4.2 de [Hopcroft et al., 2008]). La descripción a alto nivel del funcionamiento de una máquina de Turing de tres cintas que pueda realizar la suma de dos números binarios es como sigue. La máquina de Turing tendrá almacenado, en la primera cinta, el primer sumando. En la segunda cinta tendrá almacenado el segundo sumando y en la tercera cinta escribirá el resultado de la suma. Tanto los sumandos como el resultado serán números naturales escritos en notación binaria. Las transiciones de la máquina de Turing serán las encargadas de contener la información relativa a la suma. Para J?oder representar las acciones que realiza la máquina de Turing en cada una de sus tres cintas, se utilizará la siguiente notación: cada transición de la máquina de Turing estára representada por una tripleta. Cada elemento de la tripleta representará la acción a realizar en cada una de las cintas. Así por ejemplo, cada transición tendrá la forma: [(leer,escribir,mover),(leer,escribir,mover),(leer,escribir,mover)] donde el primer paréntesis se refiere a la acción a realizar en la primera cinta y así sucesivamente. Como ejemplo, supongamos la suma de dos unos, en notación binaria. El resultado sería O y acarreo 1. Las transiciones de la máquina de Turing son, por tanto, de la forma [(l,l,+-),(1,1,+- ),(A,O,+-)]. Además, cuando la suma es cero, la máquina de Turing escribe un Oen la tercera cinta, y si hay acarreo se controla mediante un estado que indique que el acarreo es 1. Para llegar a esta configuración, a partir de una cadena de entrada compuesta por dos sumandos separados por el operador suma, la máquina de Turing deberá trasladar el segundo sumando a la segunda cinta y dejar en la primera cinta únicamente el primer sumando. En la figura 3.4 se muestra la máquina de Turing que realiza estas operaciones (esta máquina lógicamente, sólo hará operaciones sobre la primera y la segunda cinta). Para más claridad, no se han etiquetado las transiciones de la máquina de acuerdo a las tripletas descritas anteriormente. En su lugar, se han utilizado símbolos cuya correspondencia con dichas tripletas se muestra en la tabla 3.2. Al finalizar la máquina la cabeza de lectura y escritura de las dos primeras cintas debe encontrarse encima del último dígito del sumando. Suponiendo que la configuración de la máquina de Turing es la descrita anteriormente (esto es, en la primera cinta se encuentra el primer sumando y en la segunda cinta se encuentra el segundo sumando), la máquina de Turing del enunciado se define formalmente, de la siguiente manera: 135
3. Máquinas de Turing
Aa A2
A5
Figura 3.4: Máquina de Turing que se encarga de trasladar el primer sumando a la primera cinta y el segundo sumando a la segunda cinta. Nótese que, en primer lugar, la máquina de Turing debe escribir en todas las cintas un símbolo en blanco para marcar el inicio de la cinta Símbolo
Aa Al A2 As A4 A5 A6
Transición
[(A, A, --t), (A, A, --t), (A, A, --t)] [(0,0, --t), (A, 0, --t), (A, A, --t)] [(1,1, --t), (A, 1, --t), (A, A, --t)] [( +, A, --t), (A, A, stop), (A, A, stop)] [(0,0, --t), (A, A, stop), (A, A, --t)] [(1,1, --t), (A, A, stop), (A, A, --t)] [(A, A, +-), (A, A, +-), (A, A, +-)]
Tabla 3.2: Tabla de correspondencia entre los símbolos de los arcos de la máquina de Turing de la figura 3.5 y la representación de las transiciones en base a tripletas
• S
=
• ~ =
{O, 1, V}
r =
{O, 1}. Las tres las cintas de esta máquina de Turing tienen el mismo conjunto de símbolos de cinta.
•
T
• F
= =
{O} {V}
• 8 es la función de transición de la máquina de Turing que puede verse en el diagrama de transiciones de la máquina de la figura 3.5. En la figura 3.5 se muestra la máquina de Turing del enunciado. De nuevo, para más claridad, no se han etiquetado las transiciones de la máquina de acuerdo a las tripletas descritas anteriormente. En su lugar, se han utilizado símbolos cuya correspondencia con dichas tripletas se muestra en la tabla 3.3. 136
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
F,G,H N,?
A,B,C R
E,M,O
Q
0
I,J,K,L Figura 3.5: Máquina de Turing que suma dos números escritos en notación binaria
I Símbolo I Transición A B
C D E
F G
H 1 J
K L M N
O ? Q R
[( O, O, <--), (O, O, <--), (A, O, <--)] [(1,1, <--), (O, O, <--), (A, 1, <--)] [(O, O, <--), (1,1, <--), (A, 1, <--)] [(1,1, <--), (1, 1, <--), (A, O, <--)] [(O, O, <--), (O, O, <--), (A, 1, <--)] [(1,1, <--), (O, O, <--), (A, O, <--)] [(O, O, <--), (1, 1, <--), (A, O, <--)] [(1,1, <--), (1, 1, <--), (A, 1, <--)] [(O, O, <--), (A, A, stop), (A, O, <--)] [(1, 1, <-- ), (A, A, stop), (A, 1, <--)] [(A, A, stop), (O, O, <--), (A, O, <--)] [(A, A, stop), (1, 1, <--), (A, 1, <--)] [(O, O, <--), (A, A, stop), (A, 1, <-- )] [(1,1, <--), (A, A, stop), (A, O, <--)] [(A, A, stop), (O, O, <--), (A, 1, <--)] [(A, A, stop), (1, 1, <--), (A, O, <--)] [(A, A, stop), (A, A, stop), (A, A, stop)] [(A, A, stop), (A, A, stop), (A, A, stop)]
Tabla 3.3: Tabla de correspondencia entre los símbolos de los arcos de la máquina de Turing de la figura 3.5 y la representación de las transiciones en base a tripletas
137
3. Máquinas de Turing
Ejemplo de ejecución de la máquina de Thring A continuación se muestra un ejemplo de ejecución de la máquina de Turing con la cadena 01 +10. El resultado debe ser la cadena 1I. En primer lugar, la máquina de Turing que se encarga de preprocesar la cadena de entrada (ver figura 3.4), terminará con la siguiente configuración en las tres cintas: [OlA, 1QA, A~A] donde cada elemento de la tripleta representa el contenido de cada una de las cintas. Esta es la configuración de entrada con la que la máquina de Turing del enunciado (ver figura 3.5) realizará los cálculos que se muestran en la siguiente tabla, donde la columna "Transición" muestra la transición que se aplica en cada paso teniendo en cuenta las correspondencias de la tabla 3.3: Paso O 1 2
Cinta [A01, A1Q, AA~] [AQ1, AIO, A~l] [~01, ~10, ~11]
Estado O O O
Transición B
e Parar
Ejemplos para practicar con JFLAP Se sugiere al lector que, teniendo en cuenta la máquina de Turing definida en este ejercicio, practique con las siguientes cadenas utilizando la herramienta JFLAP [Rodger y Finley, 20061. Para ello tenga en cuenta la configuración de las cintas después del preprocesado de la cadena de entrada explicado anteriormente.
• 01 + 10 • 11 + 10 • 11 + 01
IEJERCICIO 3.41 Dado el alfabeto ¿:; = {x, y}, construir una máquina de Turing de dos cintas que busque la primera aparición de la cadena contenida en la segunda cinta dentro de la cadena contenida en la primera cinta. Para la resolución del ejercicio se supone que la cabeza de lectura/escritura de cada una de las dos cintas está situada sobre la primera posición de cada una de las cadenas. Esto no quiere decir que la cadenas estén situadas al inicio de la cinta. De hecho, y para facilitar 138
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
( Y,Y,~ )
( y,y,---t) Y,Y,---t
Y,Y,~
(
E,E,~
X,X,---t X,X,---t (
X,
x, ---t
(
E. ' E, ---t )
A, A, ---t
S ( X,X,---t ) X,X,---t
)
y,y,stop (
)
A,A,~
M
~
(x,x,~ ) x,x,~
E, E, ---t---t )
A, A, ---t
( y,y,~) y,y,~
~.
( X,X,~) X,X,~
Figura 3.6: Máquina de Turing de dos cintas que busca la primera aparición de la cadena contenida en la segunda cinta dentro de la cadena contenida en la primera cinta. En este caso, se representan las transiciones mediante dos tripletas, una encima de otra. La tripleta de arriba representa la acción a realizar en la primera cinta, mientras que la de abajo representa la acción a realizar en la segunda cinta 'el ejercicio se supone que en la segunda cinta y a la izquierda de la cadena, hayal menos un símbolo blanco A. Se supone igualmente que ambas cintas son potencialmente infinitas en ambas direcciones. También se supone que una vez localizada la cadena, las cabezas de lectura/escritura se quedarán apuntando a la posición donde empieza la cadena buscada.
SOLUCIÓN La máquina de Turing debe ir recorriendo la cadena de la cinta 1, e ir comprobando si coinicide o no con la cadena de la cinta 2. Si no coinicide, se desplaza a la siguiente posición a la derecha de la cinta, y si coincide comprueba si el siguiente elemento de la cinta 1 coincide con el siguiente elemento de la cinta 2. Este proceso se repite hasta que termine la cinta 2, o se encuentre una diferencia. En ambos casos se debe volver atrás en la cinta. En la figura 3.6 se puede observar el diagrama de transiciones de esta máquina de Turing. 139
3. Máquinas de Turing
Ejemplos de ejecución de la máquina de Turing Se van a considerar a continuación diferentes cadenas de entrada con el objetivo de ilustrar el funcionamiento de la máquina de Turing .
• Cadena de entrada: Cinta l:yyyy, Cinta 2:x En este ejemplo la cadena de la cinta 2 no está contenida dentro de la cadena de la cinta 1. En la siguiente tabla se muestra la ejecución de la máquina de turing.
I Paso I"Cinta 1 I Cinta 2 I Estado I Función de Transición y
Y,-t
o
JLYYY
12
0
6 ( 0, x
1
YJLYY
12
0
6 ( 0,
2
YYJLY
12
0
Y,-t 6 0, Y ) = (0, X x, stop
3
YYYJL
12
0
6 0, ; ) = (0, Y,-t ) x, stop
4
yyyy2l
12
0
Error
y x
--
0,
--
0,
x, stop
Y,-t x, stop
)
• Cadena de entrada: Cinta 1:yyxxyxx, Cinta 2:xyx En este ejemplo la cadena de la cinta 2 está contenida dentro de la cadena de la cinta 1. En la siguiente tabla se muestra la ejecución de la máquina de turing. Nótese que en el paso número 4, si la cadena de la cinta 2 no estuviera precedida por un símbolo blanco A, se produciría una terminación anormal en la máquina (ver sección 3.1).
140
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
I Paso I Cinta 1
I Cinta 2 I Estado I Función de Transición
1 VJ,
x"
==
VJ,
<5
(0,
xy
=
0,
x,s op
<5
(0, Xx
=
(e, x
e,
X,-+ X,-+
= R, x, +-
2
yyJ¿xyxx
J¿yx
o o o
3
yyXJ¿yxx
x'1L.x
e
<5
4
yyJ¿xyxx
J¿yx
R
<5 (
R
<5
o
'1L.yxxyxx
J¿yx
a.
<5
y
y X
R, x
==
( R, y\
=
A
6
yyXJ¿yxx
J¿YX
o
<5
7
yyxx'1L.xx
x'1L.x
e
<5
8
yyxxyJ¿X
XYJ¿
e
<5
9
yyxxyXJ¿ xyx¿
e
10
yyxyJ¿X
XYJ¿
s
11
yyx'1L.xx
x'1L.x
s
12
yy;t¿yXX
J¿yx
s
J¿YX
s v
14
yy;t¿yXX
(0, XX (0, yy (0, Xx
b(
y,-+
a.
X,S
t op
y'-+t
y,+x, +R, x,+a.
VJ,
y,-+-+) \ A,-+
= e, X,-+
X,-+
= e, y,-+ y,-+
=
e, X,-+ X,-+
+s,'XX==X s, , x,+-
y,+y,+x,+- '\ x, +- ) <5
(s, ~
1=
1 v, y,-+ y,-+
Aceptar
141
< 3. Máquinas de Turing
IEJERCICIO 3.51 Dado el alfabeto ~ de Turing?
= {x, y}. ¿Es regular el lenguaje aceptado por la siguiente máquina x ---·R
Nótese que para representar esta máquina de Turing se está utilizando una representación basada en bloques de construcción básicos (ver sección 3.1). En este caso, además, no se ha etiquetado el bucle de la segunda máquina R, para indicar que esta transición se producirá en cualquier caso independientemente del contenido de la cinta de entrada.
SOLUCIÓN
'o,;
El objetivo de este ejercicio es mostrar el funcionamiento de las máquinas de Turing que se representan mediante bloques de construcción básicos. En este caso es una máquina de Turing muy sencilla: que se compone de dos máquinas R cuya descripción se encuentra en la sección 3.1. x y
x y
x y Figura 3.7: Autómata finito que reconoce el lenguaje formado por las cadenas de x's e y's que no empIezan por x
Puesto que el objetivo de este ejercicio es averiguar si el lenguaje reconocido por esta máquina de Turing es un lenguaje regular, se considera que para cualquier cadena que se quiera reconocer, w, la configuración inicial de la cinta de entrada será: ¿w AAA. La máquina de Turing del enunciado ejecuta en primer lugar una máquina R, con 10 que, para cualquier cadena de entrada, la primera acción de la máquina de Turing será desplazar la cabeza de lectura/escritura un lugar hacia la derecha. A continuación, si el símbolo que lee es una x, entonces la máquina de Turing ejecutará una máquina R indefinidamente 142
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
independientemente del símbolo que lea de la cinta de entrada (puesto que ejecuta el bucle de la segunda máquina R). Por el contrario, si en la entrada aparece un símbolo distinto de x entonces se supone que la máquina llega a un estado de parada y, por tanto, en este caso acepta la cadena. Por consiguiente, el lenguaje aceptado por la máquina de Turing del enunciado, está formado por todas las cadenas que no empiezan por x incluida lógicamente, la cadena vaCÍa. Este lenguaje es regular y lo reconoce el autómata finito de la figura 3.7.
IEJERCICIO 3.61 Teniendo en cuenta la representación de máquinas de Turing en base a bloques de construcción básicos, la siguiente figura muestra la máquina que se conoce como SR. Esta máquina, desplaza una celda hacia la derecha a los símbolos contenidos en las celdas situadas entre la celda actual, y la primera celda en blanco que se encuentra a la izquierda de la celda actual.
Ilustrar el funcionamiento de esta máquina de Turing con los siguientes ejemplos de configuración inicial de la cinta de entrada: AAX1LYXAAA . . .;AAA1LYXAAA . ..
SOLUCIÓN El objetivo de este ejercicio es mostrar el funcionamiento de una máquina de Turing que se representa en base a bloques de construcción básicos. A continuación se muestra el funcionamiento de esta máquina con las configuraciones de cinta propuestas en el enunciado .
• Configuración inicial de la cinta:AAx1LYXAAA ... En la siguiente tabla se muestra, para cada paso, la máquina que se ejecuta y la configuración de la cinta. Nótese que en este tipo de representaciones, puede ocurrir que se ejecuten consecutivamente varias máquinas de Turing sin importar el símbolo 143
3. Máquinas de Turing
actual de la cinta de entrada, o que se ejecute una determinada transición. Para facilitar su comprensión, en las últimas columnas de la siguiente tabla se mostrará, o bien la máquina de Turing que se vaya a ejecutar o bien la transición que se vaya a considerar (en esta última columna se mostrará también el valor que vayan tomando las variables en las transiciones (ver sección 3.1)).
Paso
Cinta
Máquina de Turing
o 1
x,y,z. } W=X
'":
4
5
A,1XAYXAAA ... A,1XAYXAAA ...
6 7 8 Configuración
La configuración final de la cinta es aquella que resulta cuando la máquina de Turing ha terminado sus cálculos, esto es, ha llegado a un estado de parada. Recordemos que cuando se representa una máquina de Turing mediante bloquees básicos esto ocurre cuando no hay transición aplicable.
• Configuración inicial de la cinta:AAAlf...yxAAA ... Esta configuración inicial es un caso especial para la máquina SR puesto que al haber sólo símbolos en blanco a la izquierda de la celda actual, esta máquina simplemente sobreescribe el contenido de la celda actual por un símbolo A. En la siguiente tabla se muestra los diferentes pasos de ejecución de la máquina de Turing con esta configuración de la cinta de entrada. 144
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
Paso
Cinta
Máquina de Turing
o 1
IEJERCICIO 3.7' Dado el alfabeto ~ = {x, y, z} indicar si es independiente del contexto el lenguaje aceptado por la máquina de Turing de la figura.
w o SL -- R x,y,z} • ---'-__
-,w
o ·R
SOLUCIÓN El objetivo de este ejercicio es comprobar si el lenguaje que acepta esta máquina de Turing es independiente del contexto. Uno de los bloques de los que está compuesto esta máquina de Turing es la máquina S L. La máquina S L es similar a la máquina SR vista en el ejercicio anterior sólo que, en este caso, la máquina desplaza una celda hacia la izquierda a los símbolos contenidos en las celdas situadas entre la celda actual, y la primera celda en blanco que se encuentra a la derecha de la celda actual. La figura 3.8 muestra el diagrama de bloques de la máquina SL. Puesto que el enunciado trata sobre el lenguaje que reconoce esta máquina de Turing, se considerará que cualquier cadena de entrada w que pudiera reconocer la máquina, se dispondría en la cinta de entrada con la siguiente configuración inicial: ~w AA. 145
3. Máquinas de Turing
x, y .} __w_-... R
~ x, y .} a. Lu R
lA LAL>.w Figura 3.8: Diagrama de transiciones de la máquina SL
En primer lugar, se va a considerar el caso en que la cadena de entrada esté formada por un único símbolo, por ejemplo, la cadena x. La configuración inicial de la cinta de entrada será: ¿XAA .... Tal y como se hizo en ejercicios anteriores, en la siguiente tabla se muestra para cada paso de ejecución del autómata, la máquina o la transición que se ejecuta y la configuración de la cinta.
Paso
Cinta
Máquina de Turing
o
¿XAA ...
R
x,y,Z. } __w_..... SL 1
w=X Configuración final
Se puede ver como, en el paso final, ya no hay transición aplicable puesto que el símbolo de la celda actual es A y sólo hay transición para el caso en que el símbolo sea ,A. En ese caso la máquina de Turing para su ejecución y acepta la cadena. Se va a considerar ahora el caso en que la cadena de entrada tenga más de un símbolo, por ejemplo, la cadena xyx. La configuración inicial será, por tanto, ¿XyXAA. En la siguiente tabla se muestra para cada paso de ejecución del autómata, la máquina o la transición que se ejecuta y la configuración de la cinta.
146
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
Paso O
Cinta ~XyxAA
Máquina de Turing R
w 1 2
• SL
w=x -.A
3 4
AyXAA AA
5
AyX~A
• R)..L
6 7 8 9
10
w =y
La ejecución del autómata finaliza en el paso 12 puesto que el símbolo de la celda actual es un símbolo en blanco A. Por tanto, la máquina de Turing para su ejecución y acepta la cadena. A la vista de los ejemplos, esta máquina, en primer lugar, lee el primer símbolo de la cadena (ejecutando la máquina R), guarda ese valor y lo descarta de la cinta (ejecutando la máquina SL)' A continuación, se traslada al final de la cadena (buscando el primer símbolo A que haya a la derecha de la celda actual y ejecutando a continuación una máquina L). En ese punto, compara el símbolo final de la cadena con el primer símbolo de la cadena (a través de la variable w). Si coinciden, borra el último símbolo de la cadena (sobreescribiendo un símbolo blanco) y volviendo al principio de la cadena (buscando el primer símbolo A de 147
3. Máquinas de Turing la cinta de entrada mediante la ejecución de una máquina L).). Si no coinciden, la máquina ejecuta indefinidamente una máquina R con lo que la cadena no sería aceptada. Esta máquina reconoce, por tanto, las cadenas cuyos símbolos iniciales coinciden con los finales y así sucesivamente. Reconoce por tanto, el lenguaje formado por los palíndromos del alfabeto ~ = {x, y, z} que es un lenguaje independiente del contexto. Se deja al lector como ejercicio construir el autómata a pila equivalente (ver capítulo 2).
IEJERCICIO 3.8' Dado el alfabeto ~ = {x, y, z} se quiere construir una máquina de Turing que busque en su cinta la secuencia xy, la sustituya por zz y se detenga en cuanto haya realizado esta operación. Si no encuentra esa secuencia, la máquina de Turing no debe parar su ejecución. Además, es suficiente con que haga esta sustitución una vez, aunque en la cinta aparezcan varias secuencias xy.
SOLUCIÓN En este ejercicio no se considera que la máquina de Turing actue como reconocedora de lenguajes, por tanto, no se presupone ninguna condición sobre las configuraciones de la cinta de entrada. No obstante, en este ejercicio se va a considerar que la celda actual en la configuración inicial de la cinta, es la primera celda situada a la izquierda en la cinta. Por tanto, las cadenas se explorarán de izquierda a derecha en busca del patrón indicado en el enunciado. Para realizar las operaciones que se piden en el enunciado, la máquina de Turing deberá buscar, en primer lugar, la primera x en la cinta de entrada. A continuación, debe comprobar si el siguiente símbolo es una y. En caso afirmativo, debe sustituir ambos símbolos por zz y terminar su ejecución. En caso contrario, debe buscar el siguiente símbolo x en la cinta de entrada. Si no encontrara el patrón xy la máquina no debe parar su ejecución. Una máquina de Turing representada mediante bloques de construcción básicos y que realiza estas operaciones se muestra en la figura 3.9. Esta máquina de Turing ejecuta, en primer lugar, una máquina Rx para buscar el primer símbolo x en la cinta. A continuación comprueba si el siguiente símbolo a la derecha es una y. En caso afirmativo, 10 sustituye por un símbolo z, se desplaza a la izquierda y sustituye el símbolo x por una z también. No obstante, esta máquina de Turing no se detiene nunca si la cinta de entrada tiene la siguiente configuración inicial: J¿y AAA ... puesto que la máquina Rx no se detendría. 148
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
n x
y
--- Rx R----· zLz
\J z
Figura 3.9: Máquina de Turing que busca el patrón xy en la cinta de entrada y lo sustituye por zz siempre que los símbolos xy no sean los primeros símbolos de la cinta
Figura 3.10: Máquina de Turing que busca el patrón xy en la cinta de entrada y lo sustituye por zz
Para asegurar que se lee el primer símbolo de la cinta y así poder comprobar si es un símbolo x, se ha modificado la máquina de la figura 3.9. El resultado se muestra en la figura 3.10.
En la siguiente tabla se muestra un ejemplo de ejecución de la máquina de Turing de la figura 3.10 con la configuración inicial ;l2ZYXYYY A. A. .•. 149
3. Máquinas de Turing
Paso
Máquina de Turing
o
R
1
2
3
:¡¿zyxyyyAA . .. :¡¿zyxyyy AA ...
4
5
.6
X;{yxyyyAA . .. xzy:¡¿yyyAA . ..
7 8
9
L
10 Configuración final
Z
~.
xzy;{zyyAA . ..
Se deja al lector como ejercicio, que compruebe que la máquina de Turing de la figura 3.10 no se detendría nunca si en la cinta de entrada no apareciera el patrón xy, por ejemplo, para la configuración inicial :¡¿ZZXAA ...
IEJERCICIO 3.91 Construir una máquina de Turing de dos cintas que elimine la primera aparición de la cadena contenida en la segunda cinta dentro de la cadena contenida en la primera cinta. Para ello, considere el alfabeto ¿; = {x) y} .
SOLUCIÓN En este ejercicio, se supone que la cabeza de lectura/escritura de las cintas están posicionadas sobre el primer elemento de la cadena a eliminar en ambas cintas. Esto se puede suponer, gracias a que ya se ha definido una máquina de Turing que busca la cadena que se debe eliminar (ver figura 3.6). La forma más sencilla de eliminar un elemento de la cadena contenida en la cinta sin dejar un espacio en blanco a la mitad, es desplazando una posición a la izquierda, los símbolos contenidos en las celdas situadas entre la celda actual y la primera celda en blanco que se 150
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
(\ y, -'T-'T) Figura 3.11: Diagrama de transiciones parcial de una máquina de Turing que desplaza un lugar a la izquierda los símbolos contenidos a la derecha de la celda actual.
encuentre a la derecha de la celda actual. La figura 3.11 muestra el diagrama de transiciones de una máquina de Turing de una sola cinta que traslada una posición a la izquierda los símbolos contenidos en la cinta a la derecha de la celda actual. Se puede comprobar cómo la máquina de Turing debe trasladarse a un estado diferente en función de si lee una x o una y de la entrada, para saber que es lo que tiene que escribir en el momento de regresar. Para que la máquina de turing pueda trabajar con el siguiente símbolo de la cadena, la máquina debe posicionarse sobre dicho símbolo y, para ello, se realiza dos movimientos hacia la derecha. Formalmente se necesitaría definir un estado que realizara este segundo movimiento, pero para tener una máquina de Turing más compacta se ha decidido indicar esos dos movimientos con las dos flechas contenidas en la transición (-'T-'T ). Esta máquina de Turing desplaza una sola posición toda la subcadena. Si se quiere desplazar más posiciones, la máquina de Turing debe posicionarse al principio de la cadena trasladada y comenzar de nuevo su ejecución. Por último, para poder regresar a la celda actual, se necesita marcar la primera posición y ejecutar la máquina sobre el segundo símbolo. Como el primer símbolo de la cadena puede ser una x o una y, se necesita recordar qué símbolo es, para que, al regresar, se pueda eliminar la marca y escribir el símbolo correspondiente (ver figura 3.12 1). La máquina de Turing presentada realiza indefinidamente la acción de desplazar la subcadena de la derecha una posición a la izquierda. Por tanto, si se ejecuta esta máquina sobre una cinta que contuviera un número infinito de símbolos en blanco a la derecha de la subcadena, acabaría sobreescribiendo toda la subcadena. Para que la máquina de Turing ejecute exactamente lo pedido se necesita que sólo se ejecuten estas acciones para lEn la figura 3.8 se muestra esta misma máquina de Turing pero representada en base a bloques de construcción básicos.
151
3. Máquinas de Turing
(x,x, ~) (y,y,~) (A,A,~)
(x,A,~)
~---.r
ql
(A, x, ---+---+) (y,A,~)
(x, A, ---+)
(a, x, stopL, (A, A, ~)
(x,a,---+)
(A, y, ---+---+ )
(y,a,---+) (y,A,---+)
(x,A, ~)
~---.r
(x,x,~) (y,y,~)
(a, y, stop)
(A, A, ~)
(A, A, ~)
(A, x, ---+---+ ) (y,A,~)
(A, y, ---+---+ ) Figura 3.12: Diagrama de transiciones de una máquina de Turing que desplaza de manera indefinida un lugar a la izquierda los símbolos contenidos en la cinta a la derecha de la celda actual.
152
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
la subcadena que se debe eliminar. Por tanto, se utilizará una segunda cinta para controlar la ejecución de la máquina. En la figura 3.13 se puede observar la máquina de Turing completa (la correspondencia entre los símbolos de los arcos de la figura 3.13 y las transiciones se muestran en la tabla 3.4. En este caso, cada transición (representada por un paréntesis) indica las operaciones a realizar en cada una de las cintas. Así el símbolo A se corresponde con la transición (
x, a, --+t ) X,X,S op
y con la transición ( y, a, --+t )). y,y,s op
Tabla 3.4: Tabla de correspondencia entre los símbolos de los arcos de la máquina de Turing de la figura 3.13 y las transiciones Símbolo
Transiciones
A
x,a,--+ X,X, stop
y,a,--+ y,y, stop
B
X,A,--+ X,X, stop
X,A,--+ y,y, stop
e
y,A,--+ X,X, stop
y,A,--+ y,y, stop
D
X,A,+X,X, stop
X,A,+y,y, stop
E
A,X,--+--+ x, x,stop
A, x,--+--+ y, y,stop
F
y,A,+X,X, stop
y,A,+-. y,y,stop
G
A, y,--+--+ X,X, stop
A, y,--+--+ y, y,stop
H
X,A,+X, x, stop
X,A,+y, y,stop
1
A, X,--+--+ x,x,stop
A, X,--+--+ y,y, stop
J
y,A,+X, x, stop
y,A,+y, y,stop
K
A, y,--+--+ x,x,stop
A, y,--+--+ y, y, stop
L
A,A,+X, x, stop
A,A,+y,y,stop
Continúa en la página siguiente 153
3. Máquinas de Turing
Tabla 3.4: Tabla de correspondencia entre los símbolos de los arcos de la máquina de Turing de la figura 3.13 y las transiciones Continuación M N
o
p
Q R
s T
Ejemplo de ejecución de la máquina de Turing En la tabla 3.5 se muestra un ejemplo de ejecución de la máquina de Turing con la cadena yyxxyxx.
154
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
N
D
ql
E L F
P
R
B
G
A
q7
e
T
s
S
o
H
Q
q~
I
J
M K
q~
Figura 3.13: Máquina de Turing de dos cintas que elimina la primera aparición de la cadena contenida en la segunda cinta dentro de la cadena contenida en la primera cinta.
155
9 3. Máquinas de Turing
Tabla 3.5: Ejemplo de ejecución de la máquina de la figura 3.13 con la cadena de entrada yyxxyxx Paso
Cinta 1
Cinta 2
Estado
Función de Transición X a , -* 8 ( q6, X = q7, X 1 stop
O
yyxx..yxx
x..yx
q6
1
yyxaJLxx
x..yx
=
qOl
x, stop
2
yyxaAx..x
x..yx
,
A, f--
=
qIl x, stop
3
yyxa¿Ax
x..yx
=
qOl x, stop
4
yyxaxAx..
x..yx
=
qIl x, stop
5
yyxax¿A
x..yx
-
qOl
6
yyxaxxA¿
x..yx
7
yyxaxx¿
x..yx
q9
8
yyxaxx..
x..yx
q9
9
yyxax..x
x..yx
10
yyxª-xx
x..yx
,
q~
q~
8 q9, 8 q9,
q9
8 q9,
x X X X
a X
X , -*-*
,
A, f--
,
X , -*-*
)
x, stop
~
Q6,
x , -* A,-*
q7, y, stop
12
yyxax..x
xJLx
13
yyxaAx..
xJLx
A,-*
qO, y, stop
A,f--
=
qI, y, stop
=
qO, y, stop
yyxaxA¿
xJLx
=
qS, y, stop
A, f--
Contmúa en la págma sIgUIente
I
1
X, -*-*
14
156
A,-*
A,f-x, stop A, f-X, stop x,f-= q9, X, stop X, f-= q9, X, stop y, stop
11
15
,
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
Tabla 3.5: Ejemplo de ejecución de la máquina de la figura
3.13 Continuación 16
yyxax~
17
yyxax.
18
yyxQx
19
yyxx.x
xyx.
20
yyxax.
xyx.
21
yyxaA~
xyx.
22
yyxa--¿
xyx.
23
yyxQ
xyx.
24
yyxx.
25
yyxx.
).., f -
)
y,stop X, f -
)
y, stop x, stop) y,-t ).., - t
\
x, stop
I
).., - t
)
x, stop ).., f -
)
x, stop
A, f x, stop
(8
(6
6 q,xa ) = q,
X,
)
stop)
X-t ,
x ) ( x,stop ) lambda = qlO, A, stop Parar
Ejemplos para practicar con JFLAP Se sugiere al lector que, teniendo en cuenta el autómata definido en este ejercicio, practique con las siguientes cadenas utilizando la herramienta JFLAP [Rodger y Finley,
20061. • Cinta 1: xyxyyxx Cinta 2: yy • Cinta 1: xyxx Cinta 2: xxx
157
3. Máquinas de Turing
IEJERCICIO 3.10 I Dado el alfabeto ~ = {.T, y} construir una máquina de Turing que reconozca el lenguaje {xnyn : n E N + }. Para simplificar el ejercicio, en este caso, se supone que la cabeza de la cinta está situada sobre el primer elemento de la cadena. Además, se considera que la cinta es potencialmente infinita en ambas direcciones y evitar aSÍ, terminaciones anormales.
SOLUCIÓN
Para la resolución de este ejercicio se tendrá en cuenta la capacidad que tiene la máquina de Turing para recorrer la cinta sin tener que tratar los elementos de la cadena de entrada en un primer recorrido. Por tanto, la máquina de Turing que se va a diseñar simplemente tendrá que desplazarse de izquierda a derecha buscando en cada desplazamiento una x a la izquierda y una y a la derecha y eliminándolos. Como esta máquina de Turing elimina los símbolos de la cinta según los va reconociendo, se considera que la cadena pertenece al lenguaje si, al parar la maquina de Turing, no queda ningún símbolo en la cinta. Por el contrario, se considera que no pertenece al lenguaje, si queda algún símbolo distinto de blanco en la cinta. Por tanto, en este caso, el criterio de aceptación de la máquina de Turing varía con respecto a ejercicios anteriores. ASÍ, en este ejercicio, la máquina de Turing llega siempre a un estado de parada, pero, dependiendo del contenido final de la cinta, acepta o rechaza la cadena. Este es, por tanto, un ejemplo de un lenguaje decidible. En la figura 3.14 se muestra el diagrama de transiciones de la máquina de Turing que reconoce el lenguaje del enunciado.
Ejemplos de ejecución de la máquina de Turing Se van a considerar a continuación diferentes cadenas de entrada con el objetivo de ilustrar el funcionamiento de la máquina de Turing.
• Cadena de entrada: xxyy La cadena xxyy pertenece al lenguaje. En la siguiente tabla se muestra la ejecución del autómata con esta cadena de entrada. 158
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
(x;x,---+)
ql
(y;y,---+) (y;y,---+)
(A; x, stop)
(X;A,---+)
(A;A,~)
(x; x, stop) (]j'; y, stop) (..\; A, stop)
~
q3
(x;x,~) (y;y,~)
(y; A, ~)
Figura 3.14: Máquina de Turing que reconoce el lenguaje {xnyn : n E N+}.
159
3. Máquinas de Turing
I Paso I Cinta I Estado I Función de Transición o 1 2 3
4 5 6 7 8 9
10 11
12 13
-
14 15
;J2xyy ;J2yy xyy xyy xyy¿ xyy xy ;J2y ¿xy ;J2y Y y¿ Y
¿ ¿ ¿
qo ql ql q2 q2 q3 q4 q4 q4 qo ql q2 q3 q4 qo q5
8(qo,x) = (ql,A,---+) 8(ql, x) = (ql, x, ---+) 8 (ql , y) = (q2, y, ---+ ) 8(q2, y) = (q2, y, ---+) 8 (q2, A) = (q3, A, +--) 8(q3,y) = (q4,A, +--) 8(q4,y) = (q4,y, +--) 8(q4,X) = (q4,X,+--) 8(q4,A) = (qo,A,---+) 8(qo,x) = (ql,A,---+) 8(ql, y) = (q2, y, ---+) 8(q2, A) = (q3, A, +--) 8(q3,y) = (q4,A,+--) 8(q4,A) = (qo,A,+--) 8(qo, A) = (q5, A, stop) Aceptar
• Cadena de entrada: xxy La cadena xxy no pertenece al lenguaje, ya que tiene más x' s que y' s. En la siguiente tabla se muestra la ejecución del autómata con esta cadena de entrada.
I Paso I Cinta I Estado I Función de Transición I O 1 2 3 4 5 6 7 8 9
;J2xy ;J2y xy xy¿ xy
qo ql ql
;J2
q2 q3 q4 q4 qo
¿
ql
;J2
q5
;J2
¿x
8(qo,x) = 8 (ql, x) = 8 (ql , y) = 8(q2, A) = 8(q3, y) = 8(q4, x) = 8(q4,A) = 8(qo, x) = 8(ql, A) =
(ql,A,---+) (ql, x, ---+ ) (q2, y, ---+ ) (q3, A, +--) (q4, A, +--) (q4, x, +--) (qo,A,---+) (ql, A, ---+) (q5, x, stop)
Rechazar
La cadena se rechaza puesto que en la cinta de entrada hay un símbolo x.
160
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos • Cadena de entrada: xyy
La cadena xyy no pertenece al lenguaje, ya que tiene más y' s que x' s. En la siguiente tabla se muestra la ejecución del autómata con esta cadena de entrada.
I Paso I Cinta I Estado I Función de Transición I o 1 2 3 4 5 6 7
8
x..yy yy yy YYIl YY Y IlY y Y
qo ql q2 q2 q3 q4 q4 qo q5
6(qo, x) = 6(ql' y) = 6(q2, y) = 6(q2, A) = 6(q3, y) = 6(q4, y) = 6(q4,A) = 6(qo, y) =
(qI, A, -7) (q2, y, -+) (q2, y, -7) (q3, A, +-) (q4, A, +-) (q4, y, +-) (qo,A,-7) (q5, y, stop)
Rechazar
• Cadena de entrada: xyxy
La cadena xyxy no pertenece al lenguaje, puesto que, aunque contiene el mismo número de y' s que x' s, éstas no están adecuadamente ordenadas. En la siguiente tabla se muestra la ejecución del autómata con esta cadena de entrada.
I Paso I Cinta I Estado I Función de Transición o 1 2 3
x..yxy yxy yx..y yx..y
qo ql q2 q5
6(qo, x) 6(ql' y) 6(q2, x)
= = =
(ql, A, -7) (q2, y, -7) (q5' x, stop)
Rechazar
Ejemplos para practicar con JFLAP Se sugiere al lector que, teniendo en cuenta el autómata definido en este ejercicio, practique con las siguientes cadenas utilizando la herramienta JFLAP [Rodger y Finley,
20061. • xxyyx • xxxyyy
161
3. Máquinas de Turing
IEJERCICIO 3.111 Construir una máquina de Turing de dos cintas que reconozca el lenguaje {xnyn : n E N+}.
SOLUCIÓN
En este ejercicio se va a simular el trabajo de un autómata a pila, mediante el uso de una segunda cinta en la que se emulen las operaciones que se hacen en la pila. Por tanto, en este caso y a diferencia de otros ejercicios anteriores, la máquina de Turing deberá tratar cada uno de los símbolos que se lean de la cinta de entrada en el momento en que se leen. En la figura 3.15 se muestra el diagrama de transiciones de la máquina de turing del enunciado. Se supone que la cinta 1 contiene la cadena que se desea reconocer. En este caso, la cabeza de lectura/escritura de la primera cinta estará situada sobre el primer símbolo de la cadena de entrada. La cinta 2 estará inicialmente vacía, pero, para simular las operaciones en la pila, lo primero que se hará, es marcar la pila cOn el símbolo de pila vacía #. También se debe recordar que la cabeza de la segunda cinta debe apuntar a la cima de la pila, y por lo tanto, hay que desplazar, Una posición a la derecha, la cabeza de la pila antes de hacer la inserción. Por esta razón, la máquina de Turing contiene al estado q4 que nO está definido en el autómata a pila.
Ejemplos de ejecución de la máquina de Thring Se van a considerar a continuación diferentes cadenas de entrada con el objetivo de ilustrar el funcionamiento de la máquina de Turing.
• Cadena de entrada: xxyy
En este caso, la cadena contenida en la cinta 1 pertenece al lenguaje {xnyn : n E N+}. En la siguiente tabla se muestra la ejecución del autómata con la cadena xxyy. 162
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
¡ 1 A' A -+ e;~,~top
y;y,-+
( A; A, -+
¡
x; x, stop
e; e, stop )
a; e, stop
1
(
y;y,-+ )
#; e, stop
#; #,-+~.
x; x, stop
( A; A, -+
a;a,-+
( qo
)
a; e, stop
( X; x, stop) A; #, stop i-'---------+{
(
~:~:: ) ( y;y,-+ ) a;
A, f -
y;y,-+ )
#; e, stop
( A; A, stop ) #; A, stop ~
~
Figura 3.15: Máquina de Turing de dos cintas que reconoce el lenguaje {xnyn : n E N+}.
163
3. Máquinas de Turing
I Paso I Cinta 1 I Cinta 2 I Estado I Función de Transición o 1
Ó ( qo,
x.xyy
#A
X) A
=
ql,
x,stop
X
Ó(
ql,
#
=
#,----+
q4,
x,----+ ) a, stop
2 3
x, stop
#, stop
xx.yy
#g).
4
Ó(
X
q4, A
x, stoP) a,----+ x, ----+ ( = q¡, a, stop
5
6 7
8
Aceptar
• Cadena de entrada: xyy La cadena xyy no pertenece al lenguaje, ya que tiene más y' s que x' s. En la siguiente tabla se muestra la ejecución del autómata con esta cadena de entrada.
I Paso I Cinta 1 I Cinta 2 I Estado I Función de Transición
~)
x, stop)
o
x.yy
¿A
qo
Ó (qO'
1
x.yy
#A
ql
Ó
2
x.yy
#¿A
q4
Ó (q4'
~)
x, ----+ ) = ql, a,stop
3
x1LY
#ª-A
ql
Ó (ql'
: )
y,----+ ) = q2, A,+-
4
xyy
#A
q2
(
ql,
= ( ql, #, stop
stop ) #x) = ( q4, x,#,----+
Rechazar
Ejemplos para practicar con JFLAP
:~
Se sugiere al lector que, teniendo en cuenta el autómata definido en este ejercicio, practique con las siguientes cadenas utilizando la herramienta JFLAP [Rodger y Finley,
1,
~;:',
164
: ¡.:";,
t¡:fJ~;. ,
s
Autómatas, Gramáticas y Lenguajes formales: problemas resueltos
2006].
• xxxyy • xyxy
165
Referencias
[Brookshear, 1993] J.G. Brookshear. Teoría de la Computación: Lenguajes Formales, Autómatas y Complejidad. Addison-Wesley Iberoamericana, 1993. [Hopcroft et al., 2008] H.E. Hopcroft, R. Motwani y J.D. Ullman. Teoría de Autómatas, lenguajes y computación. Pearson-Addison Wesley, 2008. [Rodger y Finley, 2006] S. H. Rodger y T. W. Finley. JFLAP: An Interactive Formal Languages and Automata Package. Jones & Bartlett Publishers. http://www.cs.duke.edu/csed/jftap/, 2006.
167