Conversión de un autómata en una expresión regular
Veamos cómo convertir cualquier autómata finito en una expresión regular.
Descripción del algoritmo
Como entrada tenemos un AFND A. Primero lo convertimos en un AFND generalizado. En la segunda fase, en cada paso eliminamos un estado, modificamos adecuadamente la función de transición y repetimos hasta que solo queden dos estados: el inicial y el final. Entre ellos habrá una arista cuya etiqueta será una expresión regular, que será el resultado de todo el algoritmo. Todo el procedimiento consiste, pues, sobre todo en eliminar un estado y corregir después el autómata de modo que obtengamos un autómata equivalente.
Eliminación de un estado
Cómo se elimina un estado podemos mostrarlo con un ejemplo sencillo. Supongamos que una parte de nuestro autómata tiene este aspecto:
donde Ri son algunas expresiones regulares. ¿Qué aspecto tendría el autómata si eliminásemos el estado qr? Podemos imaginarlo así: estamos en el estado qi y nos preguntamos qué palabras somos capaces de generar en este tramo. Si vamos directamente del estado qi al estado qj, serán todas las palabras que corresponden a la expresión regular R4.
Pero si vamos al estado qr, podemos generar palabras de la forma R1. En el estado qr, sin embargo, podemos dar vueltas con la expresión regular R2, de modo que en realidad podemos generar palabras de la forma
Ahora sabemos que de esta parte del autómata pueden surgir palabras de la forma R4 o de la forma
Ya podemos eliminar sin más el estado qr y dejar solo los dos estados qi y qj, y en lugar de R4 escribimos la expresión regular que acabamos de calcular:
Este procedimiento lo aplicamos a cada arista de cada estado qi a algún estado qj, incluidos los bucles, es decir, incluido el caso en que qi = qj.
Tras eliminar un estado obtenemos un autómata equivalente: un autómata que reconoce el mismo lenguaje.
Algoritmo completo
Como entrada tenemos un AFND A = ⟨Q, Σ, δ, q0, F⟩.
- Convertimos el AFND A en un AFND generalizado Z = ⟨Q′, Σ, δ′, q0′, qf′⟩. En adelante denotaremos con la letra k el número de estados de Z.
- Si k = 2, el algoritmo termina y en la arista entre el estado inicial y el final está la expresión regular resultante.
- Si k>2, elegimos un estado cualquiera qr distinto del estado inicial y del final, es decir, qr ≠ q0′ y qr ≠ qf′. A continuación creamos un nuevo AFND generalizado Z′ = ⟨Q′′, Σ, δ′′,q0′,qf′⟩, para el cual se cumplirá:
y para todo qi ∈ Q′′ ∖ {qf′} y para todo qj ∈ Q′′ ∖ {q0′} sea donde R1 = δ′(qi,qr), R2 = δ′(qr,qr), R3 = δ′(qr, qj), R4 = δ′(qi, qj). Después continúa con el paso 2.
Ejemplo
Tomemos como entrada este autómata finito:
Primero lo convertimos en un AFND generalizado (las transiciones ∅ innecesarias no las representaremos):
Ahora aplicamos la segunda parte del algoritmo y eliminamos algún nodo. Empezamos con el nodo q2. Eliminamos el nodo q2 y añadimos una transición del estado q1 al estado qf. Esta transición la etiquetamos con b(a ∣ b)∗, porque desde el nodo q1 llegamos al estado q2 con palabras de la forma b, después podemos dar vueltas con a ∣ b, con lo que obtenemos (a ∣ b)∗, y por último pasamos a qf mediante la regla ε. Además se cumple que b(a ∣ b)∗ϵ = b(a ∣ b)∗. Obtenemos el autómata:
Nos queda eliminar el último estado, q1. Añadimos una arista del estado qs al estado qf. ¿Cómo la etiquetamos? Al estado q1 llegamos mediante la regla ε, que podemos omitir sin más. Después podemos dar vueltas con a, con lo que obtenemos la expresión regular a∗. Y por último, por la arista llegamos a qf, así que concatenamos la expresión con b(a ∣ b)∗. La arista la etiquetamos, pues, con la expresión regular a∗ b(a ∣ b)∗.
El autómata ya solo tiene dos estados, así que el algoritmo termina. En la arista está la expresión regular resultante.
Fuentes
- El ejemplo y la descripción del algoritmo proceden de M. Sipser: Introduction to the Theory of Computation
Capítulos: Expresiones regulares, Conversión de una expresión regular en un autómata, Autómata finito no determinista generalizado, Conversión de un autómata en una expresión regular