Compiladores e Interpretes
Autómatas Finitos Deterministas (DFA)
Autómatas Finitos No Deterministas (NFA)
UNET 2012
Definición formal de un autómata finito determinista (DFA)
Los autómatas con un número finito de estados, que tienen un único estado inicial, y para cada estado una, y solo una transición para cada símbolo, se denominan autómatas finitos deterministas y para
poderlo definir se requiere conocer:
•
Cuál es el conjunto de estados.
•
Cuál de estos estados es su estado inicial.
•
Cuáles son los estados aceptadores.
•
Cuál es el alfabeto de la palabra que se escribe en la cinta.
•
Una manera de determinar el nuevo estado en función del símbolo
leído y del estado actual.
Definición formal de un autómata finito determinista (DFA)
Definición formal de un autómata finito determinista (DFA)
Como ejemplo de esta definición consideraremos el
siguiente autómata sobre ∑ = {a,b}
Definición formal de un autómata finito determinista (DFA)
Ejercicio para la casa: escribir el Algoritmo en lenguaje C
para este autómata finito, que lea una palabra carácter
por carácter indicando si la palabra es aceptada o no
Lenguajes regulares y lenguajes reconocidos por los DFA
El lenguaje regular y el reconocido por un DFA son expresiones sinónimas, pero es
importante tener en cuenta que un lenguaje
es regular, si y sólo si, existe un DFA que lo
reconozca.
Lenguajes regulares y lenguajes reconocidos por los DFA
•
Muchos lenguajes son reconocidos como regulares, pero para demostrar que un lenguaje es regular basta con exhibir un autómata que lo reconozca
•
Pero es preciso asegurarse que el lenguaje reconocido por el
autómata es exactamente el que dice que es.
Lenguajes regulares y lenguajes reconocidos por los DFA
A continuación se presentan algunos ejemplos de lenguajes
regulares, sobre ∑={a,b} y su DFA correspondiente.
Lenguajes regulares y lenguajes reconocidos por los DFA
Ejercicio:
Cree el DFA correspondiente a los siguientes lenguajes:
Lenguajes regulares y lenguajes reconocidos por los DFA
Solución:
Ejercicios
•
Encontrar un DFA que reconozca los siguientes lenguajes definidos en el alfabeto ∑={a,b}:
1. L = {abba}
1
Ejercicios
•
Encontrar un DFA que reconozca los siguientes lenguajes definidos en el alfabeto ∑={a,b}:
2. L = {abba,ababba}
2
Ejercicios
•
Encontrar un DFA que reconozca los siguientes lenguajes definidos en el alfabeto ∑={a,b}:
3. L = {a}*={a
n|n ≥ 0 } = { w | |w|
b= 0}
3
Ejercicios
•
Encontrar un DFA que reconozca los siguientes lenguajes definidos en el alfabeto ∑={a,b}:
4. L = {a}
+4
Ejercicios
•
Encontrar un DFA que reconozca los siguientes lenguajes definidos en el alfabeto ∑={a,b}:
5. L = { w | |w| ≥ 3}
5
Ejercicios
•
Encontrar un DFA que reconozca los siguientes lenguajes definidos en el alfabeto ∑={a,b}:
6. L = { w | |w| < 4}
6
Ejercicios
•
Encontrar un DFA que reconozca los siguientes lenguajes definidos en el alfabeto ∑={a,b}:
7. L = { w | |w|
a= 3}
7
Ejercicios
•
Encontrar un DFA que reconozca los siguientes lenguajes definidos en el alfabeto ∑={a,b}:
8. L = { w | |w|
b= 4n, n ≥ 0 }
8
Ejercicios
•
Encontrar un DFA que reconozca los siguientes lenguajes definidos en el alfabeto ∑={a,b}:
9. L = { w | |w|
b= 4n, n > 0 }
9
Lenguajes No Regulares
•
No todos los lenguajes son regulares
•
De hecho estos últimos representan una minoría (infinita) entre todos los lenguajes, es por esto que debemos razonar sobre la existencia de lenguajes que no son regulares
•
Es decir lenguajes que no pueden ser reconocidos por ningún DFA.
•
Concretamente nos podemos conseguir con lenguajes que para ser
reconocidos necesitarían autómatas con un número infinito de estados,
como por ejemplo:
Lenguajes No Regulares
•
Para comprender este problema hay que situarnos en el hecho de que una palabra que sea reconocida como perteneciente a este lenguaje requiere tener la misma cantidad de as y bs.
•
Por lo tanto es indispensable recordar el número de símbolos a,
para verificar el número de símbolos b, pero ¿Cómo puede un
autómata finito recordar algo?
Lenguajes No Regulares
¿Qué tendría que hacerse para que aceptara la palabra aaaabbbb.?
Autómatas finitos Indeterministas
¿Qué es un autómata finito indeterminista (NFA)?
Son una forma especial de autómatas finitos que facilitan la tarea de construcción de los DFA.
El mismo se da cuando se cumple algunas de estas tres condiciones:
1.
Tiene más de un estado inicial.
2.
Tiene transiciones definidas de forma múltiple.
3.
Tiene transiciones no definidas.
Autómatas finitos Indeterministas
Por ejemplo:
Y si es una b
Aceptación de una palabra en los Autómatas finitos Indeterministas
Es similar al de los DFA, pero teniendo en cuenta las siguientes
consideraciones:
Aceptación de una palabra en los Autómatas finitos Indeterministas
Por ejemplo si consideramos la palabra abaabb y el NFA:
•
Vemos que si ante el primer símbolo se opta hacia el estado b, no habrá transición definida, por el contrario si se opta por quedarse en el estado a, la palabra puede evolucionar hasta su aceptación.
•
Por esto debemos concluir que la palabra es aceptada por el
autómata porque como mínimo, hay una secuencia de transiciones
que lo llevan hacia un estado aceptador.
Autómatas finitos Indeterministas
Ejemplos paradigmáticos.
Autómatas finitos Indeterministas
Ejemplos paradigmáticos.
Autómatas finitos Indeterministas
Ejemplos paradigmáticos.
Autómatas finitos Indeterministas
Ejemplos paradigmáticos.
Autómatas finitos Indeterministas:
Definición formal
Ejercicios
•
Encontrar un NFA que reconozca los siguientes lenguajes definidos en el alfabeto ∑={a,b}:
1. L = {abba}
1
Ejercicios
•
Encontrar un NFA que reconozca los siguientes lenguajes definidos en el alfabeto ∑={a,b}:
2. L = {abba,ababba}
2
Ejercicios
•
Encontrar un NFA que reconozca los siguientes lenguajes definidos en el alfabeto ∑={a,b}:
3. L = { w | Ǝ x , y Є ∑* (w=xy ˄ Ǝz Є ∑
2(y=az)) } = ∑*{a}{a,b}
2,
=
es decir las palabras cuyo antepenúltimo símbolo es una a3
Ejercicios
•
Encontrar un NFA que reconozca los siguientes lenguajes definidos en el alfabeto ∑={a,b}:
4. Como se podría convertir el NFA del ejercicio 1 en un DFA.
1
4
Diferencias Autómatas finitos
Indeterministas y Deterministas
1. El DFA tiene un único estado inicial, mientras que en un NFA puede tener más de uno.
2. En un DFA, la función de transición
determina un nuevo estado para cada pareja estado-símbolo, mientras que en un NFA,
para cada pareja estado símbolos tenemos
un conjunto de estados.
Diferencias Autómatas finitos
Indeterministas y Deterministas
Ejemplo:
Coincidencias Autómatas finitos Indeterministas y Deterministas
•
Los lenguajes reconocidos por los autómatas finitos deterministas son los llamados lenguajes regulares.
•
Los lenguajes que los autómatas finitos indeterministas pueden reconocer son exactamente los mismos que los deterministas, los lenguajes regulares.
•
Un hecho importante es que con un proceso especial conocido
como determinización, ser puede convertir un NFA en un DFA.
Determinización de autómatas no deterministas
• Un DFA y un NFA se pueden considerar equivalentes:
• Por un lado los DFA pueden considerarse un caso particular de los NFA.
• Por otro lado, cualquier NFA puede convertirse en un DFA que acepta el mismo lenguaje mediante un procedimiento algorítmico denominado determinización.
• Y aunque son equivalentes por un lado, por otro no son equivalentes en todos los sentidos:
• La construcción de NFA es más simple.
• El indeterminismo es una cualidad poco deseable.
• Por estas razones la mayoría de autómatas se crean
indeterministas, se determinizan, y se utiliza su versión
determinada.
Determinización de autómatas no deterministas
• La clave del proceso de determinización es la siguiente: Cada estado de un autómata determinista se corresponde con un subconjunto de los estados del autómata indeterminista. Concretamente:
• El estado inicial del autómata determinista es el conjunto de los estados iníciales del indeterminista (I).
• Los estados aceptadores del determinista son aquellos que contienen algún aceptador del indeterminista.
• La función de transición del determinista tiene en consideración todas las transiciones definidas para cada uno de los estados del autómata indeterminista que componen un estado del autómata determinista.
Determinización de autómatas no deterministas
•
Por ejemplo, consideremos el autómata indeterminista y veamos su
determinización paso a paso:
Determinización de autómatas no deterministas
•
En primer lugar, el estado inicial del autómata determinista se
corresponderá con los estados iníciales del indeterminista {A,D}:
Determinización de autómatas no deterministas
La función de transición del estado {A,D} con el símbolo a debe recoger las transiciones tanto del estado A como del estado D con este símbolo.
Concretamente, la transición para A con a es hacia el estado B (δ(A,a)={B}) y, para D con a no esta definido (δ(D,a)={ɸ}).
Así la transición para {A,D} con a es hacia el estado {B} U {ɸ} = {B}:
Determinización de autómatas no deterministas
Para el estado A,D y el símbolo b se procede de la misma forma δ(A,b)={ɸ}
y
(δ(D,b)={E}).
Así la transición para {A,D} con b hacia el estado {ɸ} U {E} = {E}
Determinización de autómatas no deterministas
El mismo proceso que se seguido con el estado {A,D} se debe seguir con los nuevos estados que han aparecido {B} y {E}:
En relación con {B}, tenemos que δ(B,a)={B}
y que
δ(B,b)={B,C}
Determinización de autómatas no deterministas
Del mismo modo, para {E} tenemos que δ(E,a)={E,F}
y que
δ(E,b)={E}
Determinización de autómatas no deterministas
• El mismo proceso se repite para los estados {B,C} y {E,F} por lo que tenemos que:
• δ(B,a)={B} y δ(C,a)={ɸ}, así la transición para {B,C} con a es hacia {B}.
• δ(B,b)={B,C} y δ(C,b)={ɸ}, así la transición para {B,C} con b es hacia {B,C}.
• δ(E,a)={E,F} y δ(F,a)={ɸ}, así la transición para {E,F} con a es hacia {E,F}.
• δ(E,b)={E} y δ(F,b)={ɸ}, así la transición para {E,F} con b es hacia {E}.
Determinización de autómatas no deterministas
Detalles Finales:
• Como ya no queda ningún nuevo estado por considerar, el autómata resultante es la versión determinista del autómata indeterminista original.
• Se debe prestar atención a que {B,C} y {C,F} han sido
marcados como estados aceptadores, siendo esto así porque
contienen estados aceptadores del autómata indeterminista
(C,F).
Determinización de autómatas no deterministas
Generalmente la determinación no se hace construyendo gráficamente el autómata determinista resultante, lo
más habitual es construir la tabla de función de transición del DFA a partir
del NFA.
Determinización de autómatas no deterministas
Por ejemplo, veamos la determinación del autómata que vemos a continuación:
que posee la tabla:
Determinización de autómatas no deterministas
Iniciamos la construcción de la tabla del DFA a partir de lo que será su estado inicial: el estado unión de los estados iníciales del NFA:
Y solo ha sido necesario “unir” las filas correspondientes al
estado A y al estado D:
Determinización de autómatas no deterministas
Han aparecido dos nuevos estados {B,E} y {C,F}, por lo que es necesario incorporarlos a la tabla de función de transición del DFA y calcular sus
transiciones:
Determinización de autómatas no deterministas
El estado {A, D, G} resultante de la unión de las transiciones de los estados C y F con el símbolo a, no ha aparecido antes en la tabla, por lo que lo incorporamos y obtenemos:
Observemos {A,D,G} es un estado final, porque contiene a
G, que es un estado final del NFA.
Determinización de autómatas no deterministas
El proceso de incorporación de estados nuevos a la tabla y calcular sus transiciones a partir de las transiciones de la tabla del NFA se repite hasta que ya no aparece ninguno nuevo
más.
NFA
DFA
Determinización de autómatas no deterministas
¿Cuál es el precio que se debe pagar por la determinización de un autómata indeterminista?
• La respuesta es simple, tomando en cuenta que cada estado del determinista es un conjunto de estados del
indeterminista.
• En otras palabras cada estado del determinista es un
subconjunto de estados del indeterminista, si el NFA tiene N estados, el determinista puede llegar a 2
N. Por lo que el
crecimiento en el número de estados puede ser exponencial, y este es el precio a pagar por eliminar el indeterminismo.
Minimización de estados de un DFA
•
La versión mínima de un DFA es otro DFA que reconoce
exactamente el mismo lenguaje que el primero pero lo hace con el menor número de estados posibles.
•
La idea de la minimización es que existen grupos de DFA que se comporten de la misma manera, y cuando uno de estos sea encontrado se puede reducir a un único estado.
•
Una característica importante es la unicidad del autómata mínimo que no es otra cosa que: dado un lenguaje regular, el autómata mínimo que lo reconoce es único.
Si desea profundizar en el tema debe:
Investigar autómata cociente y como sirven para la minimización de estados de un DFA.
Repasando: Autómatas finitos
•
Son un manera matemática para describir clases particulares de algoritmos (o “máquinas”), en nuestro caso específicamente los mismos se utilizan para describir el proceso de reconocimiento de patrones en cadenas de entrada, y de este modo se pueden usar para construir analizadores léxicos.
•
Sus principales componentes son: los estados, las transiciones, el estado inicial y los estados de aceptación.
•
Existen dos tipos principales de autómatas finitos:
• Los determinísticos (DFA).
• Los no determinísticos (NFA).
Implementación de autómatas finitos en código fuente:
• Existen diversas maneras de implementar un DFA o NFA en código, sin embargo todos los métodos no serán útiles para implementar un analizador léxico.
• Consideremos nuestro ejemplo de un DFA que acepte identificadores compuestos de una letra seguido por una secuencia de letras o números, en su versión corregida.
1 2
+
letra
dígito
letra [Otro] 3
ID de retorno
Implementación de autómatas finitos en código
Primera forma de implementación
Es la más sencilla y es la siguiente:
{iniciando en el estado 1}
If el siguiente carácter es una letra then avanza en la entrada;
{Ahora en el estado 2}
while el siguiente carácter es una letra o dígito do avanza en la entrada;
{permanece en estado 2}
end while;
{ir al estado 3 sin avanzar en la entrada}
aceptar;
else
{error u otros casos}
end if;
Comentarios:
• Se usa la posición en el código para mantener el estado implícitamente.
• Útil si no hay
demasiados estados.
• Cada DFA se tiene que implementar de forma diferente.
•La complejidad
aumenta a medida que se eleva el número de estados.
Implementación de autómatas finitos en código
Ejercicio para la casa PRIMERA FORMA DE IMPLEMENTACION
Lleve a cabo la implementación del autómata de las constantes numéricas en notación científica mediante el uso de Java .
2 digito
3
+
digito 1
+
- digito
4 5
+
digito
. digito
7 digito
8
+
digito 6
+
- digito E
E
Implementación de autómatas finitos en código
Segunda forma de implementación
Esta forma usa una variable para mantener el estado actual y escribe las transiciones como una sentencia case doblemente anidada dentro de una iteración, donde la primera sentencia case prueba el estado actual y el segundo nivel anidado prueba el carácter de entrada, lo que da el estado.
estado := 1; {inicio}
while estado = 1 o 2 do case estado of
1: case carácter de entrada of letra: avanza en la entrada;
estado:=2;
else estado:= … {error u otro estado}
end case;
2: case carácter de entrada of
letra, dígito: avanza en la entrada;
{innecesario realmente} estado:=2;
else estado:= 3;
end case;
end case;
end while;
If estado=3 then aceptar else error;
Comentarios:
• Refleja el DFA de manera directa, las transiciones corresponden con la asignación de un nuevo estado a la variable estado y avanza en la entrada,
excepto en el caso de transiciones que no
consumen por ejemplo del estado 2 al 3.
•Se puede cambiar el case exterior para que tenga los caracteres de entrada y los internos basados en el estado actual.
Ejercicio para la casa SEGUNDA FORMA DE IMPLEMENTACION
Lleve a cabo la implementación del autómata de las constantes numéricas en notación científica mediante el uso de Java .
Implementación de autómatas finitos en código
2 digito
3
+
digito 1
+
- digito
4 5
+
digito
. digito
7 digito
8
+
digito 6
+
- digito E
E
Implementación de autómatas finitos en código
Tercera forma de implementación
Es posible expresarlo también como una estructura de datos y entonces escribir un código “genérico” que tomara sus
acciones de la estructura de datos (ej. Tabla de transición)
Caracteres en el alfabeto ∑ (c)
Estados s
Estados representando
transiciones T(s,c)
Implementación de autómatas finitos en código
Tercera forma de implementación
El DFA para identificadores entonces se puede
representar como la tabla de transiciones, donde los espacios en blanco representan transiciones que no se muestran en el DFA (a estados de error u otros procesamientos)
Carácter de Entrada Estado
letra digito otro
1 2
2 2 2 3
3
Implementación de autómatas finitos en código
Tercera forma de implementación
Si a la tabla de transiciones, agregamos la información acerca de cuales estados son aceptadores y cuales transiciones no
consumen sus entradas en esta misma estructura obtenemos:
Carácter de Entrada Estado
letra digito otro aceptación
1 2 No
2 2 2 [3] No
3 Sí
Implementación de autómatas finitos en código
Tercera forma de implementación
Ahora podemos escribir el código en una forma que implementara cualquier DFA, dadas las entradas y estructuras de datos apropiadas, el siguiente ejemplo supone que las transiciones se mantienen en un arreglo de transición T, indexado por
estados y caracteres de entrada, que aquellas que hacen avanzar la entrada (sin [ ]) están dadas por el arreglo booleano avanzar, indexado también por estados y
caracteres de entrada; y que los estados de aceptación están dados por el arreglo booleano Aceptar indexado por estados:
estado:=1;
ch:= siguiente carácter de entrada;
while not Aceptar[estado] and not error(estado) do nuevoestado:=T[estado,ch];
if Avanzar[estado,ch] then ch:= siguiente carácter de entrada;
estado := nuevoestado;
end while;
If Aceptar[estado] then aceptar;
Comentarios:
•Se denomina algoritmo controlado por tabla.
•El tamaño del código se reduce.
•Servirá el mismo código para muchos DFA diferentes
•En DFA grandes tienden a ser poco eficientes.
Expresiones Regulares
Todo esto nos ha traído hacia un tipo de expresiones que
proporcionan una manera simple, sencilla y precisa de un lenguaje regular y las cuales son conocidas como expresiones regulares.
Tarea Casa: Buscar en internet información relacionada con las expresiones regulares, su funcionamiento, principales usos, etc.
Mínimo leer articulo de wikipedia sobre el tema.