Contenido Introducción Expresión regular .................................................... 5 Definición de una expresión regular ........................ 5 Propiedades de las expresiones regulares ................ 5 Solución al problema de síntesis .............................. 6 Algoritmo recursivo ................................................. 6 Conversión de Expresiones Regulares a AFND ......... 8 Conversión de AFND a AFD ...................................... 9 Conversión de AFD a Expresión Regular ................. 11 Ejemplos ................................................................. 12 Construcción de Autómatas “Ad Hoc” ..................... 14 REFERENCIAS BIBLIOGRÁFICAS .......................... 16
DISEテ前 Juan Peテアalver juan280274@hotmail.com
EDITORIAL Curso Especial de Grado Universidad de Oriente Nテコcleo de Monagas
Introducción Las expresiones regulares pueden definir de forma exacta los mismos lenguajes que describen los distintos tipos de autómatas: los lenguajes regulares. Sin embargo, las expresiones regulares ofrecen algo que los autómatas no proporcionan: una forma declarativa para expresar las cadenas que deseamos aceptar. Por tanto, las expresiones regulares sirven como lenguaje de entrada de muchos sistemas que procesan cadenas. Las expresiones regulares pueden definirse como un equivalente algebraico para un autómata, es utilizado en muchos lugares como un lenguaje para describir patrones en texto que son sencillos pero muy útiles. Pueden definir exactamente los mismos lenguajes que los autómatas, pueden describir: Lenguajes regulares. De igual manera, ofrecen algo que los autómatas no: Manera declarativa de expresar las cadenas que queremos aceptar. Al ser parecidos, nos permite llevar a cabo la conversión de una expresión regular a un autómata y viceversa sea el caso que requerimos, a continuación se ampliara el modo de hacerlo.
Expresión regular
E
l objetivo de las expresiones regulares es representar todos los posibles lenguajes definidos sobre un alfabeto Σ, en base a una serie de lenguajes primitivos, y unos operadores de composición. Las Expresiones Regulares permiten representar concisamente Lenguajes Regulares, de forma que resumen la descripción exhaustiva de un lenguaje. Como se ha estudiado en este capítulo, existe una equivalencia entre Gramáticas y Lenguajes Regulares y autómatas. En este apartado, se comprobará que las Expresiones Regulares permiten definir el lenguaje aceptado por un Autómata Finito, y se puede extraer el Lenguaje Regular aceptado por un Autómata Finito generando su Expresión Regular.
Definición
Dado un alfabeto Σ, los símbolos Ø, λ¸ y los operadores + (unión), • (concatenación) y * (Clausura), definimos (de forma recursiva) una expresión regular sobre el alfabeto Σ como: 1. El símbolo Ø es una expresión regular. 2. El símbolo λ¸ es una expresión regular. 3. Cualquier símbolo α ϵ Σ es una expresión regular 4. Si α y β son expresiones regulares, entonces también lo es α+β 5. si α y β son expresiones regulares entonces también lo es α • β 6. si α es una expresión regular entonces también lo es α*
Nota: El orden de prioridad de los operadores es, de mayor a menor: *, • +. Este orden puede alterarse mediante paréntesis, de forma análoga a como se hace con las expresiones aritméticas. Ejemplo: aa+b*a es una expresión regular sobre el alfabeto {a,b} (por simplicidad omitimos el operador •) y esta expresión regular es distinta a la expresión regular (aa + b*) a. Por otra parte, la cadena (+b*a) no es una expresión regular sobre {a,b}. La notación de conjuntos nos permite describir los lenguajes regulares, pero se utiliza una notación en que las representaciones de los lenguajes son simplemente texto (cadenas de caracteres). Así las representaciones de los lenguajes regulares son simplemente palabras de un lenguaje (el de las representaciones correctamente formadas). Con estas ideas se va a definir un lenguaje, el de las expresiones regulares, en que cada palabra va a denotar un lenguaje regular.
Propiedades
Existen muchas propiedades asociadas a las Expresiones Regulares. Algunas de ellas, se muestran a continuación: λ* = λ α* = λ+α•α* Ø•α = α•Ø = Ø (α*•β*) = (α+β)* = (α*+β*) Ø* = λ. α*.α*=α* α·α*=α*. α
5
Solución al problema de síntesis Existen dos algoritmos para pasar de una Expresión Regular, que representa a un Lenguaje Regular, a un autómata que reconozca dicho lenguaje. El primero es un algoritmo que asocia a cada regla de descripción de una Expresión Regular un autómata que la reconoce. El problema es que se generan autómatas muy grandes y es necesario luego minimizarlos para poder trabajar con ellos. El segundo algoritmo está basado en el concepto de derivada, que se definirá más adelante. Algoritmo recursivo: El algoritmo recursivo asocia a cada Expresión Regular, un autómata que reconoce el lenguaje descrito por dicha Expresión Regular.
a = 0: crear un nodo p inicial y otra q final y no conectarlos (figura 1).
Figura 1: Autómata que reconoce el lenguaje descrito por la Expresión Regular 0.
6
a = ε: crear un nodo p inicial y otro q final y conectarlos con un arco etiquetado con ε (figura 2).
Figura 2: Autómata que reconoce el lenguaje descrito por la Expresión Regular ε.
a = a, : crear un nodo P inicial y otro q final y conectarlos con un arco etiquetado con a (figura 3).
Figura 3: Autómata que reconoce el lenguaje descrito por la Expresión Regular .
se parte de dos grafos (uno que representa a (3 y otro a 0') ,uno que tiene como nodo inicial a Pi, nodo final a qi y están unidos por un grafo que representa a (3, y otro que tiene como nodo inicial a P2 , nodo final a q2 y están unidos por un grafo que representa a 0': crear un nodo inicial p, unido por un arco etiquetado con A a Pi y otro arco etiquetado con A a P2, y un nodo final q al que llegan arcos etiquetados con A desde qi y q2 , que dejan de ser nodos finales (figura 4).
Figura 4: Autómata que reconoce el lenguaje descrito por la Expresión Regular
, al igual que antes, se parte de dos grafos, uno que tiene como nodo inicial a p1, nodo final a q1 y están unidos por un grafo que representa a β, y otro que tiene como nodo inicial a p2 , nodo final a q2 y están unidos por un grafo que representa a σ: crear un arco etiquetado con λ desde q1 (que deja de ser nodo final del nuevo grafo) a p2, y poner como nodo final del nuevo grafo a q2 (figura 5).
Figura 6: Autómata que reconoce el lenguaje descrito por la Expresión Regular
Ejemplo: Si se tiene la Expresión Regular 1(0+1)*, las figuras 7, 8, 9, y 10 representan las diferentes fases de construcción del autómata que la reconoce. Como se puede comprobar, el autómata no es mínimo, pero se puede utilizar el algoritmo de construcción del autómata mínimo descrito en el apartado de AFDs para minimizarlo.
Figura 7: Autómatas que reconocen los lenguajes descritos por las Expresiones Regulares 1, 0 y 1. Figura 5: Autómata que reconoce el lenguaje descrito por la Expresión Regular y se parte de un grafo formado por un nodo inicial etiquetado con p1 conectado con un grafo que representa a β al nodo final q1 : crear un arco etiquetado con λ de p1 a q1 y otro igual de q1 a p1 (figura 6).
Figura 8: Autómatas que reconocen los lenguajes descritos por las Expresiones Regulares 1 y 0+1.
7
Figura 10: Autómata que reconoce el lenguaje descrito por la Expresión Regular 1(0+1)*. Figura 9: Autómatas que reconocen los lenguajes descritos por las Expresiones Regulares 1 y (0+1)*.
Conversión de Expresiones Regulares a AFND
8
El algoritmo para convertir expresiones regulares a AFNDs opera construyendo
recursivamente el AFND en base a las expresiones regulares particulares. Los
AFND a construir son los siguientes.
Nótese que en los constructores recursivos, el algoritmo asume que los conjuntos de estados de los AFND a combinar son disjuntos. Al aplicar
el algoritmo constructivamente esto puede garantizarse simplemente renombrando los estados de manera que nunca se
repitan. A continuación, algunas expresiones regulares y el AFND generado aplicando el algoritmo.
Conversión de AFDN a AFD Sea M =< Q, Σ, δ, q0, F > un AFND con λ-transiciones, se construye un AFD equivalente M’ =< Q’, Σ, δ’ , q’0 , F’ > tal que:
Q’ = 2Q, esto es los estados del AFD son los conjuntos del conjunto de partes de Q. Cada uno de los estados de M’ representa los posibles estados en los que se encuentra M en un momento particular de su ejecución. F’ = {s|s Q’ ∧ ∃f F ∧ f s}, esto es, cualquier estado en Q’ que contenga un estado final de M será estado final en M’. q'0 = [q0], esto es, el estado inicial de M’ es el estado que representa al conjunto {q0} donde q0 es el estado inicial de M. La notación [q] es equivalente a decir “el estado que representa al conjunto {q}” y es encontrada en la literatura con frecuencia. δ' ([q1, q2, . . . , qi ], a) = [p1, p2, . . . , pj ] ⇐⇒ δ({q1, q2, . . . , qi}, a) = {p1, p2, . . . , pj}, esto es, la
nueva función de transición se construye tomando la unión de los estados destino resultantes de aplicar δ en M a los estados representados en el estado q de M’ . Si el AFND tiene λ-transiciones, entonces debe calcular la λ − CLAUSURA del conjunto. Nótese que el algoritmo producirá muchos estados inalcanzables, sin embargo, si se construye la función δ’ comenzando desde el estado inicial y continuando solamente con los estados que aparezcan como resultado de la construcción (buscando en profundidad como en DFS), se obtienen sólo los estados alcanzables desde el inicial. A continuación, algunos AFND convertidos a AFD usando el algoritmo: 1. Sea el AFND M =< {p, q, r, s}, {0, 1},δ,p,{s}>con δ definida como:
9
Una representación gráfica del AFND sería:
Primero calculamos la nueva δ' partiendo del estado [p] que es el inicial de M’. Así nos queda:
2. Sea el M=<{p,q,r,s},{a,b},δ,p,{q,s}> definida como:
AFND con
Una representación gráfica del AFND sería:
Entonces, podemos construir el AFD M’ definitivo como: M’ =<{[p], [p,q], [p,q,r], [p,r], [p,q,r,s], [p,q,s], [p,r,s], [p,s]}, {0,1}, δ', [p], {[p,q,r,s], [p,q,s], [p,r,s], [p,s]}> cuya representación gráfica sería:
10
Primero calculamos la nueva δ’ partiendo del estado [p] que es el inicial de M’. Así nos queda:
Entonces, podemos construir el AFD M’ definitivo como: M’=<{[p],[q,s],[q],[r],[p,q,r],[q,r],[s], [q,r,s],[r,s]},{a,b},δ’ ,[p], {[q, s], [q], [p,q,r],[q, r], [s], [q, r, s], [r, s]} > cuya representación gráfica sería:
Conversión de AFD a Expresiones Regulares Si se tiene un AFD M =< Q, Σ, δ, q, F > y se desea saber la Expresión Regular que este acepta, puede aplicarse un algoritmo de construcción muy sencillo descrito informalmente como sigue: 1. Agregar un nuevo estado inicial i conectado con una λ-transición a q. 2. Agregar un nuevo estado final ƒ y agregar λ-transiciones desde todos los p € F hasta ƒ. 3. Seleccionar cualquier estado q del AFD extendido, salvo i o f, y eliminarlo del autómata. Al eliminarlo deben preservarse los caminos anteriores, sólo que las transiciones serán consideradas expresiones regulares y serán repuestas de la siguiente forma: a) Supongamos que existía una transición “entrante” desde algún p €
Q hasta q y que tal transición tenía la expresión e1. b) Supongamos que existía una transición “saliente” desde q hasta algún r € Q tal que tenía la expresión e2. c) Supongamos que q tiene un bucle con la expresión e3. d) Entonces, para eliminar el estado q, deben sustituirse la transición entrante, la transición saliente y el bucle, por una sola transición desde p hasta r que utilice la expresión e1e3* e2. Si ya existía una transición desde p hasta r con la expresión e4 entonces la nueva transición será e1e3*e2 + e4. 4. Repetir el paso anterior hasta que solamente quede una transición entre i y f. La expresión asociada a esa transición es la Expresión Regular reconocida por el AFD.
11
EJEMPLOS
12
13
Construcción de Autómatas “Ad Hoc” A veces es difícil encontrar una expresión regular para un conjunto que nos interesa reconocer. En esos casos suele ser más práctico construir un autómata “manualmente” y luego aplicar alguno de los algoritmos anteriores para encontrar la expresión regular específica. 1. Construir una expresión regular que reconozca cadenas sobre el alfabeto {a, b} solamente si la cantidad de ocurrencias de a es múltiplo de tres. Comenzamos por observar que los múltiplos de tres son 0, 3, 6, 9, . . . de modo que el autómata tendría que aceptar la palabra vacía. La manera de llegar al autómata final consiste en combinar las siguientes ideas:
14
El estado inicial q0 tiene que ser final, puesto que debe aceptar la palabra vacía. Si el autómata está en el estado inicial es porque ha consumido una cantidad de a que es múltiplo de tres, y la cantidad de b es irrelevante. Esto quiere decir que habría un ciclo de q0 a q0 consumiendo b. Si un número no es múltiplo de tres, entonces es congruente a 1 o a 2 módulo tres. Utilizaremos dos estados adicionales q1 y q2 para modelar ambos casos. Si el autómata se encuentra en el estado q0 y se consume una a, entonces debe pasar al estado q1 pues de ser congruente a 0 ahora es congruente a 1. Un razonamiento análogo nos lleva desde q1 hasta q2 y desde q2 hasta q0 nuevamente. En q1 y q2 cualquier cantidad de b
pueden ser consumidas, así que al igual que en q0 habría ciclos. Así, nos quedaría autómata como:
construir
el
Y nos resta obtener la expresión regular asociada. Los pasos para hacerlo quedan como ejercicio para el lector, siendo el resultado (b|ab*ab*a)*. 2. Construir una expresión regular que reconozca cadenas no vacías en {a, b} si la cantidad de ocurrencias de a es par o la cantidad de ocurrencias de b es impar. Comenzamos por observar que la palabra vacía no forma parte del lenguaje de manera explícita, así que el estado inicial no es final. Observamos que en cualquier configuración del autómata hay cuatro posibilidades: a) Se ha recibido una cantidad par de a y una cantidad par de b. Llamaremos PaPb a este estado. Más aún, ese estado es final pues tiene una cantidad par de a. b) Se ha recibido una cantidad par de a y una cantidad impar de b.
Llamaremos PaIb a este estado. Más aún, ese estado es final pues tiene una cantidad par de a o una cantidad impar de b. c) Se ha recibido una cantidad impar de a y una cantidad par de b. Llamaremos IaPb a este estado. Este estado no es final pues no cumple con ninguna de las dos condiciones de aceptación. d) Se ha recibido una cantidad impar de a y una cantidad impar de b. Llamaremos IaIb a este estado. Este estado es final pues tiene una cantidad impar de b. Establecidas éstas configuraciones, es trivial deducir las transiciones entre esos estados dependiendo de la entrada, e.g. estando en PaPb
si se recibe una a la cantidad se vuelve impar, por tanto el estado pasa a ser IaPb; análogamente, estando en PaPb si se recibe una b la cantidad se vuelve impar, por tanto el estado pasa a ser PaIb. El resto de las transiciones puede deducirlas el lector. Cuando se está en el estado inicial, se ha recibido la palabra vacía. La palabra vacía tiene un número par de a y b (cero, en ambos casos) pero no corresponde al estado PaPb sino al estado inicial. En ese estado inicial, si se recibe una a, debe pasarse a IaPb pues tendríamos la primera a (una en total, y uno es impar) y ninguna b (cero, que es par); análogamente, si se recibe una b, debe pasarse a PaIb por un razonamiento similar.
Así, nos quedaría construir el autómata como:
Y nos resta obtener la expresión regular asociada. Los pasos para hacerlo quedan como ejercicio para el lector.
15
REFERENCIAS BIBLIOGRÁFICAS Asasi Viñuela, P., Martinez Fernandez, P., & Borrajo Millan, D. (1997). Lenguajes, Gramaticas y Automatas: Un Enfoque Practico. Madrid, España: Adisson-Wesley. Hopcroft, J. E., Motwani, R., & Ullman, J. D. (2007). Teoria de Automatas, Lenguajes y Computacion. Madrid: Pearson Education. Kelley, D. (2001). Teoria de Automatas y Lenguajes Formales. Madrid: Pearson Education. Hernández-Novich, E. (2006). Conversión de expresiones regulares.
16