0% encontró este documento útil (0 votos)
122 vistas9 páginas

Automatas

Este documento presenta una introducción a los autómatas finitos y sus aplicaciones. Define formalmente un autómata finito determinista (AFD) y describe métodos para diseñar AFDs que reconozcan diferentes lenguajes regulares. También cubre temas como autómatas finitos no deterministas, equivalencia de autómatas, y simplificación de autómatas finitos.

Cargado por

Cesar Caceres
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
122 vistas9 páginas

Automatas

Este documento presenta una introducción a los autómatas finitos y sus aplicaciones. Define formalmente un autómata finito determinista (AFD) y describe métodos para diseñar AFDs que reconozcan diferentes lenguajes regulares. También cubre temas como autómatas finitos no deterministas, equivalencia de autómatas, y simplificación de autómatas finitos.

Cargado por

Cesar Caceres
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 9

Clase 4 - 5 Dr.

Oscar BRUNO

Autómata Finito

ER ab

a b
0- 1 2+

ER ab + aab

a b
0- 1 2+

b
3 4+

ER a +ab + aab
a b
0- 1+ 2+
a

b
3 4+

ER a*

a
0+
-

1
Clase 4 - 5 Dr. Oscar BRUNO

ER a*b
a

b
0- 1+

Ejemplo (aa+aba*)
AFD incompleto / completo
Todas las palabras de aes y/o bes que tienen por lo menos dos letras.
Todas las palabras sobre el alfabeto {a,b,c} que tienen por lo menos tres letras.

INTRODUCCIÓN A AUTÓMATAS FINITOS Y APLICACIONES


AUTÓMATAS FINITOS QUE RECONOCEN LENGUAJES REGULARES FINITOS
Autómata Finito
Herramienta abstracta que se utiliza para reconocer un determinado LR.
RECONOCER un LR significa aceptar cada cadena que es una palabra del LR y rechazar cada cadena
que no pertenece al lenguaje.
Cada AF reconoce un ÚNICO LR. Para un LR pueden existir muchos AFs que lo reconozcan
Estado inicial, estados intermedios, estados de aceptación estados de rechazo.
LR Finitos ab+aab; a+ab+aab; 01+10

AUTÓMATAS FINITOS QUE RECONOCEN LENGUAJES REGULARES INFINITOS


LR Infinitos a*; a*b; a*bb*a; a3 b+; (0+1)*; a(a+b)*c; (a+b+c+d)*; (ab)*;
AUTÓMATAS FINITOS DETERMINÍSTICOS
(a+b)*
AUTÓMATAS FINITOS NO DETERMINÍSTICOS
(a+b)*b
DEFINICIÓN FORMAL DE UN AFD
AFD
Formalmente, un AFD es una 5-upla (Q, Σ, T, q0, F), donde:
– Q es un conjunto finito de estados,
– Σ es el alfabeto de caracteres reconocidos por el autómata,
– q0 Ԑ Q es el estado inicial (único, no es un conjunto),
– F es el conjunto de estados finales, y
– T: Q x Σ  Q
AFD COMPLETO
UNA APLICACIÓN: VALIDACIÓN DE CADENAS
AF como reconocedor
AF reconocedor accionador
AF como analizador lexicográfico

2
Clase 4 - 5 Dr. Oscar BRUNO

Métodos de diseño de AFDs


Debe controlarse
Que “sobren palabras”
2. Que “falten palabras”

Una forma simple de diseño es determinar manera explıcita, que condicion “recuerda” cada
estado.
Diseñar un AFD que acepte las palabras en el alfabeto {a, b} en que la cantidad de a’s es impar.
Las condiciones relevantes para este problema -que deben ser “recordadas” por los estados
correspondientes- son:
El numero de a’s recibidas hasta el momento es par (estado P);
El numero de a’s recibidas hasta el momento es impar (estado I);

Diseñar un AFD que acepte exactamente el lenguaje en el alfabeto {0, 1} en que las palabras no
comienzan con 00.
Estado Condición
q0 No se han recibido caracteres
q1 Se ha recibido un cero al inicio
q2 Se han recibido dos ceros iniciales
q3 Se recibió algo que no son dos ceros iniciales

Diseño por conjunto de estados


Diseñar un AFD que acepte las palabras del lenguaje en {0, 1} donde las palabras no contienen la
subcadena 11 pero sı 00.
Se identifican las siguientes situaciones:
Las letras consumidas hasta el momento no contienen ni 00 ni 11.
Contienen 00 pero no 11
Contienen 11.

3
Clase 4 - 5 Dr. Oscar BRUNO

Equivalencia de automatas finitos. Dos automatas que aceptan el mismo lenguaje son quivalentes.

4
Clase 4 - 5 Dr. Oscar BRUNO

Arbol de comparación de autómatas


1. Inicialmente la raız del arbol es el par ordenado (s, s0) que contiene los estados inicialesde
M y M0 respectivamente;
2. Si en el arbol hay un par (r, r0), para cada caracter añaden como hijos suyos los pares (r´,
r0’)
3. Si aparece en el arbol un par de estados incompatibles, se interrumpe la construccion .
Definicion. Dos estados q y q0 son compatibles si ambos son finales o ninguno de los dos es final.
En caso contrario, son estados incompatibles.

Simplificacion de Automatas finitos (método mecanico):

1. Estados
a. Compatibles
i. si ambos son finales o ninguno lo es y tienen igual comportamiento
b. Distinguibles
i. Si son incompatibles
ii. Si siendo compatibles no tienen el mismo comportamiento.
c. Equivalentes o redundantes (se pueden eliminar)
i. Si son indistinguibles
Una vez que se sabe que dos estados son equivalentes, se puede pensar en eliminar uno de ellos,
para evitar redundancias y hacer mas eficiente al AFD.
1. Las flechas que salen del estado eliminado son eliminadas;
2. Las flechas que llegan al estado eliminado son redirigidas hacia su estado equivalente.

Simplificacion mecanica por tabla de estados distinguibles


Simplificacion mecanica por clases de equivalencia

5
Clase 4 - 5 Dr. Oscar BRUNO

Clases de equivalencia organizadas en árbol.

6
Clase 4 - 5 Dr. Oscar BRUNO

Algo de C
CADENAS
unsigned strlen (const char*);
Cuenta los caracteres que forman la cadena dada hasta el 1er carácter '\0',
excluido. Retorna (longitud de la cadena).
char* strcat (char* s, const char* t);
Concatena la cadena t a la cadena s sobre s. Retorna (s).
char* strncat (char* s, const char* t, size_t n);
Concatena hasta n caracteres de t, previos al carácter nulo, a la cadena s; agrega
siempre un '\0'. Retorna (s).
char* strncpy (char* s, const char* t, size_t n);
Copia hasta n caracteres de t en s; si la longitud de la cadena t es < n, agrega
caracteres nulos en s hasta completar n caracteres en total; atención: no agrega
automáticamente el carácter nulo. Retorna (s).
char* strcpy (char* s, const char* t);
Copia la cadena t en s (es la asignación entre cadenas). Retorna (s).
char* strchr (const char* s, int c);
Ubica la 1ra. aparición de c (convertido a char) en la cadena s; el '\0' es
considerado como parte de la cadena. Retorna (ok ? puntero al carácter localizado :
NULL)
char* strstr (const char* s, const char* t);
Ubica la 1ra. ocurrencia de la cadena t (excluyendo al '\0') en la cadena s. Retorna
(ok ? puntero a la subcadena localizada : NULL).
int strcmp (const char*, const char*);
Compara "lexicográficamente" ambas cadenas. Retorna (0 si las cadenas son
iguales; < 0 si la 1ra. es "menor" que la 2da.; > 0 si la 1ra. es "mayor" que la 2da.)
int strncmp (const char* s, const char* t, size_t n);
Compara hasta n caracteres de s y de t. Retorna (como strcmp).
char* strtok (char*, const char*);
Separa en "tokens" a la cadena dada como 1er. argumento; altera la cadena
original; el 1er. argumento es la cadena que contiene a los "tokens"; el 2do.
argumento es una cadena con caracteres separadores de "tokens". Retorna (ok ?
puntero al 1er. carácter del "token" detectado : NULL).
Macros
NULL
Ver Definiciones Comunes.
EOF
Expresión constante entera con tipo int y valor negativo que es retornada por
varias funciones para indicar fin de archivo; es decir, no hay mas datos entrantes
que puedan ser leídos desde un flujo, esta situación puede ser porque se llegó al fin
del archivo o porque ocurrió algún error. Contrastar con feof y ferror.
SEEK_CUR
SEEK_END
SEEK_SET
Argumentos para la función fseek.
stderr
stdin
stdout
Expresiones del tipo FILE* que apuntan a objetos asociados con los flujos estándar
de error, entrada y salida respectivamente.
Acceso
FILE* fopen (
const char* nombrearchivo,
const char* modo
);

7
Clase 4 - 5 Dr. Oscar BRUNO

Abre el archivo cuyo nombre es la cadena apuntada por nombrearchivo asociando


un flujo con este según el modo de apertura. Retorna (ok ? puntero al objeto que
controla el flujo : NULL).
int fclose (FILE* flujo);
Vacía el buffer del flujo apuntado por flujo y cierra el archivo asociado. Retorna
(ok ? 0 : EOF)
Entrada / Salida Formateada
Flujos en General
int fprintf (FILE* f, const char* s, ...);
Escritura formateada en un archivo ASCII. Retorna (ok ? cantidad de caracteres
escritos : < 0).
int fscanf (FILE* f, const char*, ...);
Lectura formateada desde un archivo ASCII. Retorna (cantidad de campos
almacenados) o retorna (EOF si detecta fin de archivo).
Entrada / Salida de a Caracteres
int fgetc (FILE*); ó
int getc (FILE*);
Lee un carácter (de un archivo ASCII) o un byte (de un archivo binario). Retorna (ok
? carácter/byte leído : EOF).
int getchar (void);
Lectura por carácter desde stdin. Retorna (ok ? próximo carácter del buffer : EOF).
int fputc (int c, FILE* f); ó
int putc (int c, FILE* f);
Escribe un carácter (en un archivo ASCII) o un byte (en un archivo binario). Retorna
(ok ? c : EOF).
int putchar (int);
Eescritura por carácter sobre stdout. Retorna (ok ? carácter transmitido : EOF).
int ungetc (int c, FILE* f);
"Devuelve" el carácter o byte c para una próxima lectura. Retorna (ok ? c : EOF).
Entrada / Salida de a Cadenas
char* fgets (char* s, int n, FILE* f);
Lee, desde el flujo apuntado f, una secuencia de a lo sumo n-1 caracteres y la
almacena en el objeto apuntado por s. No se leen más caracteres luego del carácter
nueva línea o del fin del archivo. Un carácter nulo es escrito inmediatamente
después del último carácter almacenado; de esta forma, s queda apuntando a una
cadena. Importante su uso con stdin. Si leyó correctamente, s apunta a los
caracteres leídos y retorna s. Sí leyó sólo el fin del archivo, el objeto apuntado por s
no es modificado y retorna NULL. Si hubo un error, contenido del objeto es
indeterminado y retorna NULL. Retorna ( ok ? s : NULL).
int fputs (const char* s, FILE* f);
Escribe la cadena apuntada por s en el flujo f. Retorna (ok ? último carácter escrito
: EOF).
Entrada / Salida de a Bloques
unsigned fread (void* p, unsigned t, unsigned n, FILE* f);
Lee hasta n bloques contiguos de t bytes cada uno desde el flujo f y los almacena
en el objeto apuntado por p. Retorna (ok ? n : < n).
unsigned fwrite (void* p, unsigned t, unsigned n, FILE* f);
Escribe n bloques de t bytes cada uno, siendo el primero el apuntado por p y los
siguientes, sus contiguos, en el flujo apuntado por f. Retorna (ok ? n : < n).
Posicionamiento
int fseek (
FILE* flujo,
long desplazamiento,
int desde

8
Clase 4 - 5 Dr. Oscar BRUNO

);
Ubica el indicador de posición de archivo del flujo binario apuntado por flujo,
desplazamiento caracteres a partir de desde. desde puede ser SEEK_SET,
SEEK_CUR ó SEEK_END, comienzo, posición actual y final del archivo
respectivamente. Para flujos de texto, desplazamiento deber ser cero o un valor
retornado por ftell y desde debe ser SEEK_SET. En caso de éxito los efectos de
ungetc son deshechos, el indicador de fin de archivo es desactivado y la próxima
operación puede ser de lectura o escritura. Retorna (ok ? 0 :  0).
long ftell (FILE* flujo);
Obtiene el valor actual del indicador de posición de archivo para el flujo apuntado
por flujo. Para flujos binarios es el número de caracteres (bytes ó posición) desde
el comienzo del archivo. Para flujos de texto la valor retornado es sólo útil como
argumento de fseek para reubicar el indicador al momento del llamado a ftell.
Retorna (ok ? indicador de posición de archivo : 1L).

También podría gustarte