Traductores e Intérpretes UCAB : Automata Finito
This page last changed on Jan 14, 2007 by juanca.
Los autómatas finitos tienen muchas aplicaciones. Aplicados a la traducción de lenguajes, ellos se emplean como medio sistemático y eficiente de reconocer los lexemas que concuerdan con las expresiones regulares asociadas a los componentes léxicos de un lenguaje. Los autómatas finitos son una manera eficiente de implementar un analizador léxico. Podemos ver un autómata finito como una máquina de estados con un lector de símbolos. Un autómata se encuentre en un principio en un estado inicial. El autómata lee cada símbolo en la secuencia entrada, y cambia de estado de acuerdo al símbolo. El autómata se detiene si llega a un estado final y la entrada está agotada. Si la secuencia de entrada se agota y el estado no es final el autómata produce un error. También se produce un error si no hay una transición de estados definida para el estado actual y el símbolo leído. Secuencias Reconocidas/Aceptadas por un AFUn autómata finito reconoce/acepta una secuencia de entrada si luego de leída toda la secuencia el autómata se encuentra en un estado final. Diagramas de EstadoUn autómata finito puede representarse y visualizarse mediante un diagrama de estados. Un diagrama de estado es un grafo dirigido donde cada vértice representa un estado, y cada arista está etiquetada con un símbolo del alfabeto de entrada y representa la transición entre estados que se produce cuando ese símbolo es el siguiente leído. Estado InicialEl estado inicial se denota llamándolo q0 o usando el símbolo:
Estados FinalesLos estados finales se denotan usando un doble círculo:
EjemplosEl siguiente diagrama de estados representa a un autómata finito que reconoce todas las secuencias con un número par de ceros y unos:
Este es un ejemplo de un autómata finito no-determinista que acepta el mismo lenguaje que la expresión regular (ba)*(a+|b)b*:
Lenguaje Definido por un A.F.Un autómata finito M define un lenguaje L(M) el cual es el conjunto de todas las secuencias reconocidas/aceptadas por dicho autómata. Se puede demostrar que los lenguajes definidos por los autómatas finitos son exactamente los lenguajes regulares. Es decir, todo lenguaje regular es reconocido por algún autómata finito, y todo lenguaje aceptado por un autómata finito es un lenguaje regular. Como veremos más adelante, los autómatas finitos se clasifican en deterministas y no- deterministas. Los lenguajes definidos por ambos tipos de autómatas son los mismos. Es más, para cada autómata finito no-determinista existe por lo menos un autómata finito determinista que acepta el mismo lenguaje. Autómata Finito No-DeterministaUn autómata finito no-determinista (AFN) es una tupla:
donde:
Un autómata finito no-determinista puede "estar en más de un estado" a la vez. Nótese que para los autómatas finitos permitimos transiciones δ(q, ε) que no consumen símbolos de la entrada. Autómata Finito DeterministaUn autómata finito M=(Q, Σ, δ, q0, F) es determinista (AFD) si:
es decir, cada transición lleva a lo sumo un único estado. Si |δ(q,a)| = 1 ∀ a ∈ Σ decimos que el AFD está completamente especificado. Por definición todo AFD es un AFN. ConfiguraiónUna configuración de un AFD es un par (q, w) donde q ∈ Q y w ∈ Σ*. Decimos que (q0, w) es una configuración inicial. Decimos que (qf, ε) es una configuración final, si qf ∈ F. Escribimos una transición entre dos configuraciones de la siguiente manera:
también podemos escribir:
para indicar que ocurrió más de una transición. Estados Inaccesibles
Equivalencia entre AFNs y AFDsDado un autómata finito no-determinista M=(Q, Σ, δ, q0, F) podemos encontrar un autómata finito determinista M'=(Q', Σ, δ', q0', F') que acepta el mismo lenguaje. Primero ampliamos la función δ para que acepte conjuntos de estados como primer parámetro:
ClausuraLa clausura de un estado κ(q) se define como todos los estados que pueden ser alcanzados desde q por transiciones ε, incluido el mismo q. Por extensión, definimos la clausura sobre un conjunto de estados así:
AlgoritmosPodemos calcular la clausura de cada estado q ∈ Q iterativamente, de la siguiente manera:
Calculamos el juego de estados Q' del nuevo AFD iterativamente, usando el siguiente algoritmo:
Luego definimos:
Expresiones Regulares y Autómatas FinitosMétodo de ThompsonLa clase de lenguajes aceptados por los autómatas finitos\ es exactamente la de los lenguajes regulares\. Es decir, para cada Automata Finito M existe una Expresion Regular que define L(M), y para cada Expresion Regular r existe un Automata Finito N tal que L(r) es el lenguaje aceptado por el autómata. El Método de Thompson es una manera sistemática de construir un Automata Finito M que acepta el mismo lenguaje que una Expresion Regular dada. Para una expresión regular s Hacemos la transformación N(s) sobre un árbol de sintaxis abstracta de la expresión recorriendo los nodos en orden de profundidad primero (depth first).
EjemploPara la expresión regular:
Construimos el siguiente árbol de sintaxis abstracta: Para los nodos ε, a, y b, construimos los siguientes autómatas: Para el nodo | construimos el siguiente autómata: Para el nodo * hacemos: Para el nodo ⋅ hacemos: Finalmente, para el * en el nodo raíz hacemos: Expresiones Regulares a Partir de Autómatas
El lenguaje descrito por la Expresion Regular resultante es el mismo que el lenguaje reconocido por el AFN original. Ejercicios
Minimzación de AFDEl Problema de Minimización
Estados No Alcanzables
Estados Equivalentes o Indistinguibles
Detectando la Equivalencia
Algoritmo de Minimización
EjemplosEjemplo del libro
Tabla de transiciones δ
Búsqueda de estados equivalentes:
Nueva tabla de transiciones:
Lema de BombeoNo todos los Lenguajes son RegularesUn autómata finito que aceptara el lenguaje L={akbk | k ≥ 0} tendría que contar el número de 'a' en cada cadena para asegurarse de que el número de 'b' es el mismo. No hay límite a cuanto el autómata tendría que contar para aceptar una cadena de este lenguaje. Pero un autómata con memoria finita solo puede contar en proporción al tamaño de su memoria: el número de sus estados. Ese es un argumento intuitivo de por qué este lenguaje no es regular, pero no es una prueba. Para probar que un lenguaje no es regular usamos un resultado llamado el lema de bombeo para lenguajes regulares. El Lema de BombeoSea L un lenguaje regular. Existe un entero n tal que para cualquier w ∈ L con |w| ≥ n (la longitud de w es mayor o igual a n), w puede ser escrita como xyz, cumpliendo con las siguientes condiciones:
Comprobación IntuitivaTodo lenguaje regular es aceptado por un autómata finito determinista. Si dicho autómata posee n estados, entonces cualquier paso de longitud n debe visitar por lo menos n+1 estados, y por lo tanto contiene un ciclo. En Resumen
Cómo usar el Lema de BombeoEl Lema de Bombeo describe una propiedad de todos los lenguajes regulares infinitos. Si podemos mostrar que un lenguaje no posee esta propiedad, sabemos entonces que el lenguaje no es regular. La estrategia a usar es la prueba por contradicción (reducción al absurdo). Asumimos que el lenguaje en cuestión posee la propiedad descrita por el Lema de Bombeo, y luego mostramos que eso produce una contradicción. Dada la contradicción, se concluye que el lenguaje no es regular. Ejemplos de Lenguajes No Regulares
Suponemos que existe n. Tomamos la cadena anbn que pertenece al lenguaje. La parte a repetir, y, tiene que consistir en una o más a. Repitiendo a's, (yi) no obtenemos nuevas cadenas pertenecientes al lenguaje, por lo tanto el lenguaje no es regular.
Construcción de Gramáticas Regulares a partir de AFDExiste un algoritmo que permite obtener una gramática regular que genera un lenguaje regular dado a partir del autómata finito que reconoce ese lenguaje. Los pasos a seguir son los siguientes:
L = { x | x ∈ {0, 1}* ∧ x contiene la subcadena 00 ∨ x contiene la subcadena 11} El lenguaje es reconocido por le siguiente autómata finito:
Como al estado inicial no entran arcos, se asocia únicamente el símbolo distinguido S. Primero asignamos un símbolo no-terminal a cada estado, comenzando por el estado inicial:
La gramática correspondiente a este lenguaje es: G = ({S, A, B, C}, {0, 1}, P, S), siendo P el siguiente conjunto: S → 0A ya que δ(p0, 0) = p1* y S y A están asociados a p0 y p1 respectivamente.
automata_qf.gif (image/gif)
afd_0_1_par.gif (image/gif) af_inicial.gif (image/gif) afn.PNG (image/png) |
Document generated by Confluence on Oct 04, 2010 11:24 |