SlideShare una empresa de Scribd logo
1 de 9
Descargar para leer sin conexión
PRÁCTICA 1-AFD (convocatoria de febrero) Autómatas y Lenguajes Formales 2011-2012 Página 1
PRÁCTICA 1:
Diseño e implementación de Autómatas Finitos Deterministas.
Aplicación en validación/análisis de cadenas y secuencias de tokens.
 Competencias:
1. Ser capaz de diseñar autómatas finitos deterministas (AFDs) con la herramienta JFLAP.
2. Implementar en lenguaje Java métodos para simular el funcionamiento de un AFD con objeto de resolver
problemas de validación y análisis de cadenas simples o estructuradas en tokens.
 Material necesario o que sea conveniente consultar en este módulo:
1. En la carpeta de Ayuda y Ejemplos: el documento Tutorial-metodosJavaBasicos.pdf y los ejemplos de
código que se incluyen en Ejemplos-CodigoJava->basicosJava .
Nota: se ruega leer la documentación a fondo antes de preguntar dudas por tutoría.
2. Algún tutorial de Java y entorno Eclipse como los que se recomiendan en el tutorial mencionado.
3. Se recuerda que no es competencia de esta asignatura aprender a programa en Java, es un objetivo que
ya se cubre en la asignatura de POO.
Contenido
Ejercicio 1: Implentación y prueba de métodos de validación para AFDs. ............................................................1
Ejercicio 2: Simulación de un juego modelado mediante un AFD...........................................................................4
Ejercicio 3: Detección de anomalías en secuencias de ECG mediante un AFD. .................................................7
Puntuación e instrucciones de entrega.........................................................................................................................9
Ejercicio 1: Implentación y prueba de métodos de validación para AFDs
En la carpeta librerias proporcionamos dos clases necesarias para esta práctica:
 Afd.java: permite crear un AFD a partir de un fichero de jflap, guardando los componentes (conjunto de
estados, estado inicial, función de transición, etc.) en estructuras de datos adecuadas. Proporciona métodos
varios necesarios para simular la ejecución del autómata, por ejemplo, para resetear el autómata,
recuperar/establecer el estado o símbolo actual y para obtener el estado siguiente para cierta combinación
de estado y símbolo según indica la función de transición representada el diagrama de un fichero jflap (ver
código comentado).
Hay dos métodos que están vacíos y que hay que implementar en este ejercicio, según indicamos luego.
 LectorAFD_JFLAP.java: es una clase que contiene el método leeFichero que se encarga de leer un
fichero jflap y extraer los componentes del AFD. El método es invocado por el constructor de la clase
Afd.java. Esta clase no debe modificarse y no es necesario comprender cómo funciona.
Creación de un objeto Afd. El método constructor de la clase Afd.java permite construir un AFD a partir de un fichero
de jflap y lógicamente puede usarse en otra case para crear cualquier autómata que sea de tipo determinista.
Prerrequisito: se supone que el fichero corresponde a un AFD, no a un AFND ni a otro tipo de fichero, si no el
funcionamiento de los métodos de esta clase no será correcto.
Por ejemplo, en la carpeta Ficheros de prueba tenemos un fichero jflap correspondiente al siguiente AFD:
que usaremos para construir un objeto de la clase Afd:
Afd afdEjem= new Afd("ejem-aa-determinista.jff”);
Al no poner ruta, se supone que este fichero estará en la carpeta del proyecto eclipse que se creará para esta práctica
(donde esté el .project), que en principio contendrá las clases Afd.java y LectorAFD_JFLAP. Si no se encuentra ahí se
producirá una excepción de E/S.
PRÁCTICA 1-AFD (convocatoria de febrero) Autómatas y Lenguajes Formales 2011-2012 Página 2
Una vez creado el objeto afdEjem, pueden invocarse los métodos proporcionados. Por ejemplo:
 afdEjem.getEstadoActual(): si es la primera vez que se invoca devolverá el nombre del estado inicial, que en
este caso es el string “Q0”. En sucesivas llamadas devuelve el último estado alcanzado por el autómata.
 afdEjem.setEstadoActual(“Qaa”): hace que el estado actual pase a ser el que le pasamos como argumento,
en este caso el estado identificado por el string “Qaa”.
 De forma análoga, podemos obtener el símbolo actual con afdEjem.getSimboloActual() y podemos hacer
que cierto símbolo sea el actual con afdEjem.setSimboloActual(simbolo). El tipo del símbolo devuelto o el
que se pasa en el argumento puede ser un char (caso de símbolo tipo carácter) o un string (caso de símbolo
tipo token). El uso de distintos tipos de símbolos se explica más adelante.
 afdEjem.esFinal(estado): devuelve true si estado (un string con el nombre de un estado) es un estado final
del autómata afdEjem.
 afdEjem.transicion(“Q0”,`a’): devuelve el estado Qa, porque consulta la tabla de transición obtenida a partir
del diagrama de transición del AFD del fichero jflap leído y el diagrama indica que desde el estado Q0
leyendo el símbolo a se pasa al estado Qa.
Si no hubiera transición definida para el par de (estado, símbolo) que se le pasa como argumento entonces el
método transición devolvería null.
 afdEjem.reset(): hace que el atributo estadoActual tome como valor el string con el nombre del estado inicial
de afdEjem y el atributo simboloActual tome valor null (indicando que aún no se ha leído ningún símbolo). De
esa forma se prepara el autómata para que comience una nueva ejecución con una cadena.
 IMPLEMENTACIÓN DE MÉTODOS DE VALIDACIÓN EN LA CLASE Afd.java (para entregar)
1. Método de validación (caso de cadenas de símbolos tipo carácter):
public boolean esValida(String cadena)
 Es el método principal de la clase y simula el funcionamiento de un AFD, procesando la cadena del parámetro
carácter-a-carácter, de izda. a derecha, sin acceder dos veces al mismo símbolo y devolviendo true si la
cadena es aceptada por el AFD y false si la cadena es rechazada.
 Debe seguir la estructura del algoritmo general de simulación de AFD del tema 2 o similar, siempre
respetando el modo de funcionamiento de un AFD y usando los métodos listados anteriormente. El método
no debe contener instrucciones que no estén relacionadas con el proceso de validación común a cualquier
AFD.
 Se usarán los métodos de la clase String adecuados para acceder a cada carácter de la cadena de entrada y
para controlar que se ha terminado de recorrer la cadena (ver tutorial proporcionado). Este método retorna
anticipadamente en el momento en que se detecta una transición no definida.
2. Método público de validación (caso secuencias de símbolos tipo token):
public boolean esValida(Scanner secuencia)
En ocasiones, los símbolos de un alfabeto representan eventos o etiquetas que se procesan en secuencia y
conviene darle al símbolo un nombre significativo (un string), en lugar de usar caracteres para representar los
símbolos. A estos símbolos que se representan mediante un string los llamaremos tokens.
 El parámetro de este método es un objeto Scanner, que se supone contiene la cadena a validar y en este caso
es una secuencia de tokens separados por uno o más espacios (incluidos newlines). Estos espacios serán
ignorados en el proceso de validación.
 Ejemplo: supongamos que renombramos los símbolos de AFD "ejem-aa-determinista.jff” y al símbolo a le
llamamos alfa y al símbolo b le llamamos beta . Entonces el autómata así modificado acepta la secuencia
“betaalfaalfa” (compruébese). Aplicando este nuevo método de validación y considerando ese nuevo
autómata entonces el método debería devolver true cuando se le pasa esa misma secuencia, pero
separando los símbolos-token con espacios, como en la secuencia “beta alfa alfa”.
 Por lo demás la estructura es análoga a la del método de validación para el caso de símbolos tipo carácter,
sólo que ahora deberán usarse los métodos de la clase Scanner para extraer tokens de la secuencia uno a uno
(ver tutorial) y procesar la secuencia token- a- token en lugar de carácter-a-carácter como en el otro método.
Nota: podemos observar que se usan dos métodos con el mismo nombre y distinto tipo de parámetro (sobrecarga).
PRÁCTICA 1-AFD (convocatoria de febrero) Autómatas y Lenguajes Formales 2011-2012 Página 3
 IMPLEMENTACIÓN DE MÉTODO DE PRUEBA EN LA CLASE Afd.java (para entregar)
Incluir el método main al final de la clase. Este método sólo tiene por objeto probar los métodos de la clase Afd.java
con un autómata concreto, antes de pasar a usar los métodos de esta clase con autómatas más complejos como los de
los ejercicios siguientes. En main se hará lo siguiente:
 Prueba de método de validación con cadenas de símbolos tipo carácter:
1. Crear un Afd a partir del fichero jflap "ejem-aa-determinista.jff”.
2. Invocar al método de validación pasándole una cadena válida y una incorrecta . Para cada cadena de
prueba se imprimirá por consola un mensaje con la cadena procesada y el resultado de la validación (si
acepta o rechaza).
 Prueba de método de validación con secuencias de tokens:
1. Modificar el fichero jflap renombrando los símbolos como alfa y beta, como se ha dicho antes.
2. Crear un Afd a partir del fichero jflap modificado.
3. Crear strings de prueba como antes. Ahora los strings contendrán secuencias de tokens separadas
por espacios. Por ejemplo, uno de ellos puede contener la secuencia válida “beta alfa alfa”.
4. Crear un objeto Scanner a partir de cada string de prueba (ver cómo se hace en el tutorial
proporcionado).
5. Invocar al método de validación pasándole al menos un Scanner con una secuencia válida y otro
con la secuencia incorrecta . Para cada secuencia de prueba se imprimirá por consola un mensaje
con la secuencia procesada y el resultado de la validación (si acepta o rechaza).
PRÁCTICA 1-AFD (convocatoria de febrero) Autómatas y Lenguajes Formales 2011-2012 Página 4
Ejercicio 2: Simulación de un juego modelado mediante un AFD
Se trata de diseñar un AFD para modelar el mecanismo de control de un juego de canicas en una especie “máquina
tragaperras’’, que será simulado en el programa java que habrá que implementar en este ejercicio. Cada jugada
consiste en el lanzamiento de una secuencia de canicas por dos zonas de entrada a un laberinto sencillo y cada canica
tiene la posiblidad de caer por dos zonas de salida (GANA y PIERDE), como se muestra la siguiente figura:
Descripción del juego:
 Hay 3 palancas en el laberinto (P1, P2 y P3). Al inicio de una jugada las palancas están inclinadas hacia la izquierda
y se supone que la última canica que cayó por el laberinto perdió (en realidad al inicio no ha caído todavía ninguna
canica, pero por defecto se supone eso).
 Si una canica entra por la entrada A entonces siempre choca con la palanca P1 y eso hace que la palanca cambie y
se incline hacia el lado contrario. Si entra por B la palanca P3 se inclina hacia el lado contrario. La palanca P2 no
siempre cambia cuando entra una canica, depende de hacia dónde estén inclinadas las palancas P1 y P3. Si entra
por A y P1 está inclinada hacia la izquierda entonces P2 no se mueve porque la canica no choca con esa palanca;
sin embargo, si entra por A y P1 está inclinada hacia la derecha entonces la canica choca con P1 y también con P2
(tanto si P2 está inclinada hacia la izda. como si está hacia la derecha) y por tanto estas dos palancas cambian. De
forma análoga, cuando la canica entra por B y P3 está inclinada hacia la derecha entonces P2 no se mueve, pero
si entra por B y P3 está inclinada hacia la izquierda entonces la canica choca con P3 y también con P2 y ambas
cambian su inclinación.
 Cada jugada se representa mediante una cadena de A’s/ B’s. Por ejemplo: la cadena “BBAA” es una jugada que
indica que se lanzan 4 canicas: la primera entra por la entrada B, la segunda por la entrada B, la tercera por la A y
la cuarta por la A. De esta forma el símbolo A representa el evento que se produce cuando una canica entra por la
entrada A y el símbolo B representa el evento de entrada por B.
 Para cierta jugada, unas canicas caerán por la salida GANA y otras por PIERDE. En cierto instante de la jugada, el
hecho de que la canica actual caiga por una de las dos salidas depende de cómo estén situadas las palancas . Por
tanto hay que tener en cuenta la situación dada por la inclinación de cada una de las palancas y cómo se altera
esa situación cuando entra una canica al laberinto. También se requiere recordar en cierta situación si la canica
que acaba de caer dejando las palancas en la situación actual perdió (cayó por PIERDE) o ganó (cayó por GANA),
porque hay que llevar la cuenta de las canicas que ganan en cierta jugada.
En el siguiente esquema se muestra una simulación del juego con la jugada representada por la cadena BBAA: se
indica cómo van cambiando las palancas a medida que van entrando las canicas (según se lee cada símbolo de la
cadena BBAA) y se indica para cada canica si pierde o gana.
PRÁCTICA 1-AFD (convocatoria de febrero) Autómatas y Lenguajes Formales 2011-2012 Página 5
Objetivo del juego:
Se procesarán una serie de jugadas de lanzamiento de canicas (cada una es una cadena de A’s/B’s en la simulación).
Consideramos dos modalidades de juego:
1. Juego a ``gana la última’’: una jugada obtiene premio si la última canica cae por GANA (el autómata acepta la
cadena que representa la jugada). En ese caso decimos que la jugada es ganadora en modo “gana la última”.
2. Juego a ``gana la mayoría ’’: una jugada obtiene premio si el número de canicas que caen por GANA es mayor
que el que caen por PIERDE.
 MODELADO DE LA DINÁMICA DEL JUEGO CON UN AFD (para entregar)
Diseña en Jflap un AFD que sirva para comprobar si una jugada del juego de canicas, representada mediante una
cadena de A’s/ B’s, es o no una jugada ganadora en modo “gana la última”.
Pista: se necesitan más de 10 estados. Da nombres cortos aunque significativos a los estados (con set name en jflap)
para que el diseño sea más fácil, dado que hay un buen número de estados y en este autómata es inevitable que se
corten los arcos, por lo que resulta poco legible a simple vista y difícil de modificar si los estados no tienen nombre
adecuado. El estado inicial representa la situación de ``inicio de jugada’’ indicada en la figura de más arriba. Los
estados finales representan la situación en que la canica que acaba de pasar por el laberinto, dejando las palancas en
cierta posición, cayó por GANA.
PRÁCTICA 1-AFD (convocatoria de febrero) Autómatas y Lenguajes Formales 2011-2012 Página 6
 IMPLEMENTACIÓN DEL JUEGO (para entregar)
Implementa una clase ejecutable que haga lo siguiente:
 Crea un objeto de la clase Afd a partir del fichero jflap con el AFD del juego de las canicas que se pide en el
apartado anterior (se supone que el fichero jflap está en el directorio del proyecto eclipse de esta práctica, no
poner ruta).
 Imprime un mensaje para que el usuario introduzca su jugada. Puede ser sólo una, o bien varias jugadas
separadas unas de otras por una coma (sin espacios).
 Aplica el método split (ver tutorial) a la línea introducida por consola para obtener un array de cadenas
donde cada una representa una jugada. Se usará una coma como delimitador.
 Llama a los métodos que simulan el juego en el modo “gana la última” y en el modo “gana la mayoría”, como
se indica a continuación:
Método para simular varias jugadas en la modalidad “gana la última”.
o Recorre el array de jugadas y para cada una:
- Invoca al método de validación del objeto Afd creado e imprime un mensaje con la jugada
procesada y que diga si con esa jugada se gana o se pierde.
- No debe resolverse este ejercicio de otra forma, debe ser mediante el método de validación del
autómata.
Ejemplo: si tenemos en el array de jugadas los strings: “AB” y “ABA” entonces se procesa la cadena “AB” y el
autómata detecta que gana, porque la última canica entró por B y cayó por GANA, según la descripción del
juego y luego se simula la jugada “ABA” y según el autómata con esa jugada se pierde.
Método para simular varias jugadas en la modalidad “gana la mayoría”.
o Recorre el array de jugadas y para cada una:
o Simula la ejecución del autómata con la cadena correspondiente a la jugada, de forma
parecida a como se hace en el método de validación pero añadiendo instrucciones
adicionales para incrementar contadores o lo que sea necesario. No hay que modificar el
autómata diseñado en este modo de juego. Deben usarse los métodos públicos definidos
en la clase Afd para ir cambiando de estado a mediada que se leen los caracteres de la
cadena (entran las canicas al laberinto) y ahora interesa contar las canicas que caen por
GANA (se alcanza un estado final).
o Al terminar de recorrer la cadena, se imprimirá un mensaje indicando la jugada procesada y
para cada canica se indicará si pierde o gana y luego imprimirá el resultado final: si el
número de canicas que caen por GANA es mayor que el que caen por PIERDE entonces
gana, en otro caso pierde.
Ejemplo: si tenemos en el array dos cadenas: “BAAA” y “ABA” entonces se procesa la cadena “BAAA” y
ganan todas las canicas excepto la penúltima y la jugada es ganadora porque ganan más que pierden.
Luego se procesa la jugada “ABA” y en este modo también es una jugada ganadora porque ganan las dos
primeras y pierde la última.
Ejemplo de salida del programa: al introducir las jugadas AB,BAAA,ABA,BAB,BABA,AAABBBABABAB la salida que
debería ser algo así como: (puede variar la presentación, pero conteniendo la información que se pide)
Modo gana la última...
Jugada AB: GANA
Jugada BAAA: GANA
Jugada ABA: PIERDE
Jugada BAB: PIERDE
Jugada BABA: PIERDE
Jugada AAABBBABABAB: PIERDE
Modo gana la mayoría...
Jugada AB:
A(G) B(G) GANA
Jugada BAAA:
B(G) A(G) A(P) A(G) GANA
Jugada ABA:
A(G) B(G) A(P) GANA
Jugada BAB:
B(G) A(G) B(P) GANA
Jugada BABA:
B(G) A(G) B(P) A(P) PIERDE
Jugada AAABBBABABAB:
A(G) A(G) A(G) B(P) B(P) B(G) A(P) B(P) A(G) B(G) A(P) B(P) PIERDE
Jugada ABw3:
A(G) B(G) *** jugada no permitida*** PIERDE
PRÁCTICA 1-AFD (convocatoria de febrero) Autómatas y Lenguajes Formales 2011-2012 Página 7
Ejercicio 3: Detección de anomalías en secuencias de ECG con AFD
Plantemos ahora un problema que trata sobre la evolución en el tiempo de la señal de un electrocardiograma (ECG)
que, a alto nivel, puede interpretarse como un problema de análisis de secuencias de eventos representados con
símbolos tipo token y puede resolverse tomando como modelo un autómata finito determinista.
Figura 1: Ejemplo de registro de señal de ECG
El ECG es el procedimiento de diagnóstico cardíaco por excelencia. En realidad, es un registro gráfico de la actividad
eléctrica del corazón (Fig. 1). El ECG permite estudiar la duración, magnitud y dirección de las fuerzas eléctricas
responsables del funcionamiento del corazón.
Figura 2: trazado de señal de ECG diferenciando componentes
Existen diferentes componentes del trazado típico de señal de un ECG (Fig.2), entre otros los siguientes:
 Ondas: pueden ser P, Q, R, S y T.
 Segmentos: se distinguen los segmentos ST y PQ.
 Complejo QRS.
 Intervalos: PQ y QT.
La señal continua de ECG se somete a un proceso para convertirla en una secuencia de etiquetas, que llamamos
eventos de ECG. Cada evento se corresponde con un componente del trazado de señal del electrocardiograma.
Llamaremos secuencia de ECG a una secuencia de eventos que describe la actividad cardiaca durante un determinado
intervalo de tiempo. En esta secuencia aparecen de forma cíclica ciertas subsecuencias, que llamamos periodos de
ECG. Los periodos válidos del ECG se indican en la figura 3. Una secuencia de ECG normal está formada por uno o más
periodos válidos de ECG, en otro caso se trata de una secuencia anómala.
PRÁCTICA 1-AFD (convocatoria de febrero) Autómatas y Lenguajes Formales 2011-2012 Página 8
NOTA: los segmentos sST para cada tipo de periodo donde aparecen de manera explícita son opcionales. Es decir, si
no aparece alguno para ese periodo, la secuencia resultante se considera un periodo válido también.
Figura 3: Tipos de periodos normales de ECG
Planteamos en este ejercicio esencialmente el problema de comprobar si una secuencia de ECG es normal o
anómala.
Nota: este problema es una simplificación y no refleja la complejidad real del proceso de diagnóstico médico a través
de un ECG.
DISEÑO DE UN AFD QUE ACEPTA SECUENCIAS NORMALES DE ECG (a entregar)
 Diseña en Jflap un AFD que acepte el lenguaje formado por las secuencias normales de ECG. Los nombres
de eventos que aparecen en la figura 3 forman el vocabulario del autómata. Es un autómata con símbolos de
tipo token, por tanto cada arco se etiqueta con uno de estos símbolos, no con caracteres individuales. No hay
que olvidar que algunos segmentos son opcionales.
 Hacer una prueba de ejecución en Jflap, por ejemplo la secuencia “oPsPQiQToPcQRSoT”. Debe aceptarla.
Considera otros casos de secuencias válidas y anómalas para comprobar la corrección del diseño.
PROGRAMA PARA DETECCIÓN DE SECUENCIAS DE ECG ANÓMALAS (a entregar)
Implementa una clase ejecutable que haga lo siguiente:
 Crea un objeto Afd a partir del fichero jflap con el AFD del ECG que acepta secuencias normales.
 Repite los siguientes pasos hasta que el usuario pulsa enter al pedir el nombre del fichero (el nombre es
vacío).
1. Solicita por consola el nombre del fichero con la secuencia de ECG de un paciente (en la carpeta
comprimida Ficheros de prueba hay ficheros de ejemplo con secuencias de ECG normales y anómalas).
No cubren todos los casos, se recomienda diseñar un test de prueba más completo.
2. Crea un objeto File a partir del nombre de fichero y crea un Scanner a partir del File para extraer los
tokens (eventos de ECG) del fichero uno a uno (ver tutorial). Se supone que el fichero contiene la
secuencia de eventos de ECG separados por espacios. Por ejemplo: si contiene “oP sPQ iQT” esa
secuencia es normal, por lo que el método de validación devolverá true.
3. Aplica el método de validación del objeto Afd creado para comprobar si la secuencia de ECG que se le
pasa es normal o anómala e imprime un mensaje indicando el diagnóstico: normal o anómala (no hay
imprimir la secuencia leída porque el fichero puede ser largo).
 Si la secuencia es anómala entonces debe imprimir además un mensaje informativo de anomalía
con los siguientes datos: estado en que ha parado el autómata al finalizar la ejecución (último estado
alcanzado) y último evento de ECG leído. Por ejemplo, si tras leer “oP” estando el autómata en el
estado “q1”, se lee “oR” entonces se detecta que secuencia es anómala e imprime mensaje de
secuencia anómala junto con el estado “q1” y el evento “oR”. De esa forma nos hacemos una idea de
en que tramo de la secuencia de ECG se ha detectado la anomalía.
Nota: la ejecución no debe finalizar si se introduce un nombre de fichero inexistente. Sólo debe acabar
cuando el usuario pulsa enter.
oP
oP
sPQ
sPQ
oQ oR oS sST oT
cQRS sST oT
oP sPQ iQT
iPQ oQ oR oS sST oT
Tipo1
Tipo 2
Tipo 4
Tipo 3
PRÁCTICA 1-AFD (convocatoria de febrero) Autómatas y Lenguajes Formales 2011-2012 Página 9
Puntuación e instrucciones de entrega
1. Crea una carpeta que se llame Apellidos1-Apellidos2, donde Apellidos1 son los dos apellidos del primer alumno
de la pareja de prácticas (todo junto) y Apellidos2 son los dos apellidos del segundo alumno (si es que lo hay). Los
que tengan apellido muy largo pueden abreviar. El caso es que quede claro quienes son los autores de la práctica
por el nombre de la carpeta. Dentro de esta carpeta:
 Incluye las clase LectorAFD_JFLAP.java (original) y Afd.java (modificada) correspondiente al ejercicio 1.
 Incluye el fichero Jflap del autómata del ejercicio 2 y la clase con el simulador del juego.
 Incluye el fichero Jflap del autómata del ejercicio 3 y la clase con el programa que detecta anomalías en
secuencias de ECG.
 En cada clase debe aparecer el autor/autores de la práctica al principio, en los comentarios de la clase.
 Si alguna clase da errores de compilación o no hace prácticamente nada que no se incluya, porque no
contará nada. Es mejor así que entregar cualquier cosa.
 No debe aparecer la sentencia package en ninguna de las clases, ni deben incluirse subcarpetas ni .class.
Los fuentes (.java) tienen que leerse correctamente en eclipse de Windows. Si se hacen en Linux
convierte el formato para que no se vean caracteres extraños.
2. Selecciona la carpeta creada Apellidos1-Apellidos2 (la carpeta, no el contenido de la carpeta) y Enviar a
Carpeta comprimida (en zip). No debe entregarse un .rar.
3. En SAKAI sube el .zip para la tarea “PRÁCTICA: Autómatas Finitos Deterministas”:
 Cada compañero deben subir el mismo fichero para que quede constancia en el sistema.
4. En SAKAI envía un mensaje privado por grupo (no correo electrónico) a tu profesor con el asunto “Entregada
Práctica 1”.
 Únicamente un alumno (si son dos) debe enviar el mensaje.
 En el contenido del mensaje indica quiénes son los 2 miembros del grupo (si procede).
Fecha de entrega: la fecha de entrega son las siguientes:
Grupo 1 y 2 (Lunes y Martes): 25 de Noviembre 23:59h. Profesor: José M. Juárez
Grupo 3 (Miércoles): 2 de Diciembre 23:59h. Profesor: Antonio Morales.
Puntuación y criterio de evaluación:
Esta práctica vale 1.5 del total de 3.5 que se puede conseguir en prácticas. Se recuerda que esta nota ya esta
ponderada y suma directamente a la nota de examen (6.5 nota máxima).
Se exige una nota mínima de 0.5 en esta práctica. Aquellos que no lleguen a esa nota tendrán que presentar las
prácticas en otra convocatoria.
Los ejercicios 1 y 3 valen 0.4 puntos cada uno y el ejercicio 2 vale 0.7 puntos
Se restarán puntos por las siguientes deficiencias, según gravedad:
 El código contiene fallos de corrección o mal funcionamiento. Como es lógico se requiere que la solución
aportada para cada ejercicio sea correcta en general y no que valga para unos casos y falle con otros. La falta de
corrección puede suponer restar el total de puntos de un ejercicio.
 El código no se ajusta a la especificación establecida en cada ejercicio. Especialmente grave es resolver un
ejercicio sin basarse en el funcionamiento del AFD que modela el problema planteado. Esto supone un cero.
 El código no tiene comentarios o pocos. Al no pedir que se entregue una documentación, es importante que se
comente el código: comentario general de la clase, comentario que aclare lo que hace cada método (al estilo
javadoc) y aparte comentar las líneas principales. La ausencia de comentarios puede suponer restar la mitad de
lo que vale cada ejercicio, aunque sea correcto.
 El código es poco legible. Por ejemplo, con mal sangrado, abuso del scroll horizontal en lugar de partir líneas muy
largas, variables sin nombre significativo, etc.
 No sigue las instrucciones de entrega. Las instrucciones no son un capricho, tienen por objeto facilitar el trabajo
de corrección. Así que se penalizarán los “despistes”, con objeto de reforzar la atención.
En caso de plagio: la copia parcial o total de cualquier ejercicio supone SUSPENSO en prácticas para todas las
personas implicadas (los que se copian y los que se dejan copiar).

Más contenido relacionado

La actualidad más candente

Portafolio lenguajes y automatas unidad 3 - Autómatas finitos
Portafolio lenguajes y automatas unidad 3 - Autómatas finitosPortafolio lenguajes y automatas unidad 3 - Autómatas finitos
Portafolio lenguajes y automatas unidad 3 - Autómatas finitosHumano Terricola
 
Conceptos Unidad 1 Lenguajes Automatas Introducción a la Teoría de Lenguaje...
Conceptos Unidad 1 Lenguajes Automatas Introducción  a  la Teoría de Lenguaje...Conceptos Unidad 1 Lenguajes Automatas Introducción  a  la Teoría de Lenguaje...
Conceptos Unidad 1 Lenguajes Automatas Introducción a la Teoría de Lenguaje...Hugo Alberto Rivera Diaz
 
Autómata de pila (AP)
Autómata de pila (AP)Autómata de pila (AP)
Autómata de pila (AP)Rodrigo GC
 
LENGUAJES LIBRES DE CONTEXTO Y GRAMATICA LIBRES DE CONTEXTO
LENGUAJES LIBRES DE CONTEXTO Y GRAMATICA LIBRES DE CONTEXTO LENGUAJES LIBRES DE CONTEXTO Y GRAMATICA LIBRES DE CONTEXTO
LENGUAJES LIBRES DE CONTEXTO Y GRAMATICA LIBRES DE CONTEXTO Guillermo Iván Prisco Pérez
 
Algebra relacional
Algebra relacionalAlgebra relacional
Algebra relacionalLuis Jherry
 
Alfabeto, Cadenas, Lenguajes, y Problemas
Alfabeto, Cadenas, Lenguajes, y ProblemasAlfabeto, Cadenas, Lenguajes, y Problemas
Alfabeto, Cadenas, Lenguajes, y ProblemasRaul
 
Otras relaciones y modelos bases de datos
Otras relaciones y modelos bases de datosOtras relaciones y modelos bases de datos
Otras relaciones y modelos bases de datosEmer Gio
 
Autómatas de Pila
Autómatas de PilaAutómatas de Pila
Autómatas de PilaPablo Guerra
 
Lenguajes libre de contexto
Lenguajes libre de contextoLenguajes libre de contexto
Lenguajes libre de contextoVerónica Es'Loo
 

La actualidad más candente (20)

Portafolio lenguajes y automatas unidad 3 - Autómatas finitos
Portafolio lenguajes y automatas unidad 3 - Autómatas finitosPortafolio lenguajes y automatas unidad 3 - Autómatas finitos
Portafolio lenguajes y automatas unidad 3 - Autómatas finitos
 
Autómata de Pila
Autómata de Pila Autómata de Pila
Autómata de Pila
 
Conceptos Unidad 1 Lenguajes Automatas Introducción a la Teoría de Lenguaje...
Conceptos Unidad 1 Lenguajes Automatas Introducción  a  la Teoría de Lenguaje...Conceptos Unidad 1 Lenguajes Automatas Introducción  a  la Teoría de Lenguaje...
Conceptos Unidad 1 Lenguajes Automatas Introducción a la Teoría de Lenguaje...
 
Java io
Java ioJava io
Java io
 
Unidad1 2 Lenguajes y automatas
Unidad1 2  Lenguajes y automatasUnidad1 2  Lenguajes y automatas
Unidad1 2 Lenguajes y automatas
 
Autómatas de pila
Autómatas de pila Autómatas de pila
Autómatas de pila
 
Autómata de pila (AP)
Autómata de pila (AP)Autómata de pila (AP)
Autómata de pila (AP)
 
Programacion orientada a objetos Java
Programacion orientada a objetos JavaProgramacion orientada a objetos Java
Programacion orientada a objetos Java
 
LENGUAJES LIBRES DE CONTEXTO Y GRAMATICA LIBRES DE CONTEXTO
LENGUAJES LIBRES DE CONTEXTO Y GRAMATICA LIBRES DE CONTEXTO LENGUAJES LIBRES DE CONTEXTO Y GRAMATICA LIBRES DE CONTEXTO
LENGUAJES LIBRES DE CONTEXTO Y GRAMATICA LIBRES DE CONTEXTO
 
Algebra relacional
Algebra relacionalAlgebra relacional
Algebra relacional
 
Automatas de estado finito
Automatas de estado finitoAutomatas de estado finito
Automatas de estado finito
 
Sesion12-componentes Visuales java
Sesion12-componentes Visuales javaSesion12-componentes Visuales java
Sesion12-componentes Visuales java
 
LibreríAs De Java
LibreríAs De JavaLibreríAs De Java
LibreríAs De Java
 
Alfabeto, Cadenas, Lenguajes, y Problemas
Alfabeto, Cadenas, Lenguajes, y ProblemasAlfabeto, Cadenas, Lenguajes, y Problemas
Alfabeto, Cadenas, Lenguajes, y Problemas
 
Otras relaciones y modelos bases de datos
Otras relaciones y modelos bases de datosOtras relaciones y modelos bases de datos
Otras relaciones y modelos bases de datos
 
LENGUAJE TRANSACT SQL
LENGUAJE TRANSACT SQLLENGUAJE TRANSACT SQL
LENGUAJE TRANSACT SQL
 
Tabla de símbolos
Tabla de símbolosTabla de símbolos
Tabla de símbolos
 
Autómatas de Pila
Autómatas de PilaAutómatas de Pila
Autómatas de Pila
 
Lenguajes libre de contexto
Lenguajes libre de contextoLenguajes libre de contexto
Lenguajes libre de contexto
 
Registros del cpu
Registros del cpuRegistros del cpu
Registros del cpu
 

Similar a 71456126 enunciado-practica1-afd

Longitud de cadena y funciones en java
Longitud de cadena y funciones en javaLongitud de cadena y funciones en java
Longitud de cadena y funciones en javaRobert Wolf
 
Manuales ...
Manuales ...Manuales ...
Manuales ...elidetjc
 
Archivos java
Archivos javaArchivos java
Archivos javatazmania2
 
2introduccionallenguajejava 141109171757-conversion-gate02
2introduccionallenguajejava 141109171757-conversion-gate022introduccionallenguajejava 141109171757-conversion-gate02
2introduccionallenguajejava 141109171757-conversion-gate02Krizztiina Pacheko
 
2) introduccion al lenguaje java
2) introduccion al lenguaje java2) introduccion al lenguaje java
2) introduccion al lenguaje javaMargarita Romero
 
comandos
comandoscomandos
comandosarecerv
 
Sesion1 Php Basico
Sesion1 Php BasicoSesion1 Php Basico
Sesion1 Php BasicoHugo Flores
 
Programación java1
Programación java1Programación java1
Programación java1jbersosa
 
Clase n°2 3-4 java
Clase n°2 3-4 javaClase n°2 3-4 java
Clase n°2 3-4 javajbersosa
 
métodos procedimimientos estructuras de control java
métodos procedimimientos estructuras de control javamétodos procedimimientos estructuras de control java
métodos procedimimientos estructuras de control javaHenry Upla
 
1 1 3 Api De Java
1 1 3 Api De Java1 1 3 Api De Java
1 1 3 Api De JavaUVM
 
Presentación introducción a Matlab y su estructura
Presentación introducción a Matlab y su estructuraPresentación introducción a Matlab y su estructura
Presentación introducción a Matlab y su estructuraJOSUEANIBALCOCHOJILH
 

Similar a 71456126 enunciado-practica1-afd (20)

Longitud de cadena y funciones en java
Longitud de cadena y funciones en javaLongitud de cadena y funciones en java
Longitud de cadena y funciones en java
 
Manuales ...
Manuales ...Manuales ...
Manuales ...
 
Archivos java
Archivos javaArchivos java
Archivos java
 
2introduccionallenguajejava 141109171757-conversion-gate02
2introduccionallenguajejava 141109171757-conversion-gate022introduccionallenguajejava 141109171757-conversion-gate02
2introduccionallenguajejava 141109171757-conversion-gate02
 
INTRODUCCION LENGUAJE JAVA
INTRODUCCION LENGUAJE JAVAINTRODUCCION LENGUAJE JAVA
INTRODUCCION LENGUAJE JAVA
 
2) introduccion al lenguaje java
2) introduccion al lenguaje java2) introduccion al lenguaje java
2) introduccion al lenguaje java
 
comandos
comandoscomandos
comandos
 
Documeto compilardorcontadorletras
Documeto compilardorcontadorletrasDocumeto compilardorcontadorletras
Documeto compilardorcontadorletras
 
Clase 2 JAVA 2012
Clase 2 JAVA 2012Clase 2 JAVA 2012
Clase 2 JAVA 2012
 
Sesion1 Php Basico
Sesion1 Php BasicoSesion1 Php Basico
Sesion1 Php Basico
 
Programación java1
Programación java1Programación java1
Programación java1
 
Clase 4 JAVA 2012
Clase 4 JAVA 2012Clase 4 JAVA 2012
Clase 4 JAVA 2012
 
Clase 4 java 2011
Clase 4 java 2011Clase 4 java 2011
Clase 4 java 2011
 
Clase n°2 3-4 java
Clase n°2 3-4 javaClase n°2 3-4 java
Clase n°2 3-4 java
 
Articulo
ArticuloArticulo
Articulo
 
métodos procedimimientos estructuras de control java
métodos procedimimientos estructuras de control javamétodos procedimimientos estructuras de control java
métodos procedimimientos estructuras de control java
 
1 1 3 Api De Java
1 1 3 Api De Java1 1 3 Api De Java
1 1 3 Api De Java
 
Implementación de Aplicaciones Basadas en Texto
Implementación de Aplicaciones Basadas en TextoImplementación de Aplicaciones Basadas en Texto
Implementación de Aplicaciones Basadas en Texto
 
Presentación introducción a Matlab y su estructura
Presentación introducción a Matlab y su estructuraPresentación introducción a Matlab y su estructura
Presentación introducción a Matlab y su estructura
 
Clase 10 expresiones regulares
Clase 10 expresiones regularesClase 10 expresiones regulares
Clase 10 expresiones regulares
 

71456126 enunciado-practica1-afd

  • 1. PRÁCTICA 1-AFD (convocatoria de febrero) Autómatas y Lenguajes Formales 2011-2012 Página 1 PRÁCTICA 1: Diseño e implementación de Autómatas Finitos Deterministas. Aplicación en validación/análisis de cadenas y secuencias de tokens.  Competencias: 1. Ser capaz de diseñar autómatas finitos deterministas (AFDs) con la herramienta JFLAP. 2. Implementar en lenguaje Java métodos para simular el funcionamiento de un AFD con objeto de resolver problemas de validación y análisis de cadenas simples o estructuradas en tokens.  Material necesario o que sea conveniente consultar en este módulo: 1. En la carpeta de Ayuda y Ejemplos: el documento Tutorial-metodosJavaBasicos.pdf y los ejemplos de código que se incluyen en Ejemplos-CodigoJava->basicosJava . Nota: se ruega leer la documentación a fondo antes de preguntar dudas por tutoría. 2. Algún tutorial de Java y entorno Eclipse como los que se recomiendan en el tutorial mencionado. 3. Se recuerda que no es competencia de esta asignatura aprender a programa en Java, es un objetivo que ya se cubre en la asignatura de POO. Contenido Ejercicio 1: Implentación y prueba de métodos de validación para AFDs. ............................................................1 Ejercicio 2: Simulación de un juego modelado mediante un AFD...........................................................................4 Ejercicio 3: Detección de anomalías en secuencias de ECG mediante un AFD. .................................................7 Puntuación e instrucciones de entrega.........................................................................................................................9 Ejercicio 1: Implentación y prueba de métodos de validación para AFDs En la carpeta librerias proporcionamos dos clases necesarias para esta práctica:  Afd.java: permite crear un AFD a partir de un fichero de jflap, guardando los componentes (conjunto de estados, estado inicial, función de transición, etc.) en estructuras de datos adecuadas. Proporciona métodos varios necesarios para simular la ejecución del autómata, por ejemplo, para resetear el autómata, recuperar/establecer el estado o símbolo actual y para obtener el estado siguiente para cierta combinación de estado y símbolo según indica la función de transición representada el diagrama de un fichero jflap (ver código comentado). Hay dos métodos que están vacíos y que hay que implementar en este ejercicio, según indicamos luego.  LectorAFD_JFLAP.java: es una clase que contiene el método leeFichero que se encarga de leer un fichero jflap y extraer los componentes del AFD. El método es invocado por el constructor de la clase Afd.java. Esta clase no debe modificarse y no es necesario comprender cómo funciona. Creación de un objeto Afd. El método constructor de la clase Afd.java permite construir un AFD a partir de un fichero de jflap y lógicamente puede usarse en otra case para crear cualquier autómata que sea de tipo determinista. Prerrequisito: se supone que el fichero corresponde a un AFD, no a un AFND ni a otro tipo de fichero, si no el funcionamiento de los métodos de esta clase no será correcto. Por ejemplo, en la carpeta Ficheros de prueba tenemos un fichero jflap correspondiente al siguiente AFD: que usaremos para construir un objeto de la clase Afd: Afd afdEjem= new Afd("ejem-aa-determinista.jff”); Al no poner ruta, se supone que este fichero estará en la carpeta del proyecto eclipse que se creará para esta práctica (donde esté el .project), que en principio contendrá las clases Afd.java y LectorAFD_JFLAP. Si no se encuentra ahí se producirá una excepción de E/S.
  • 2. PRÁCTICA 1-AFD (convocatoria de febrero) Autómatas y Lenguajes Formales 2011-2012 Página 2 Una vez creado el objeto afdEjem, pueden invocarse los métodos proporcionados. Por ejemplo:  afdEjem.getEstadoActual(): si es la primera vez que se invoca devolverá el nombre del estado inicial, que en este caso es el string “Q0”. En sucesivas llamadas devuelve el último estado alcanzado por el autómata.  afdEjem.setEstadoActual(“Qaa”): hace que el estado actual pase a ser el que le pasamos como argumento, en este caso el estado identificado por el string “Qaa”.  De forma análoga, podemos obtener el símbolo actual con afdEjem.getSimboloActual() y podemos hacer que cierto símbolo sea el actual con afdEjem.setSimboloActual(simbolo). El tipo del símbolo devuelto o el que se pasa en el argumento puede ser un char (caso de símbolo tipo carácter) o un string (caso de símbolo tipo token). El uso de distintos tipos de símbolos se explica más adelante.  afdEjem.esFinal(estado): devuelve true si estado (un string con el nombre de un estado) es un estado final del autómata afdEjem.  afdEjem.transicion(“Q0”,`a’): devuelve el estado Qa, porque consulta la tabla de transición obtenida a partir del diagrama de transición del AFD del fichero jflap leído y el diagrama indica que desde el estado Q0 leyendo el símbolo a se pasa al estado Qa. Si no hubiera transición definida para el par de (estado, símbolo) que se le pasa como argumento entonces el método transición devolvería null.  afdEjem.reset(): hace que el atributo estadoActual tome como valor el string con el nombre del estado inicial de afdEjem y el atributo simboloActual tome valor null (indicando que aún no se ha leído ningún símbolo). De esa forma se prepara el autómata para que comience una nueva ejecución con una cadena.  IMPLEMENTACIÓN DE MÉTODOS DE VALIDACIÓN EN LA CLASE Afd.java (para entregar) 1. Método de validación (caso de cadenas de símbolos tipo carácter): public boolean esValida(String cadena)  Es el método principal de la clase y simula el funcionamiento de un AFD, procesando la cadena del parámetro carácter-a-carácter, de izda. a derecha, sin acceder dos veces al mismo símbolo y devolviendo true si la cadena es aceptada por el AFD y false si la cadena es rechazada.  Debe seguir la estructura del algoritmo general de simulación de AFD del tema 2 o similar, siempre respetando el modo de funcionamiento de un AFD y usando los métodos listados anteriormente. El método no debe contener instrucciones que no estén relacionadas con el proceso de validación común a cualquier AFD.  Se usarán los métodos de la clase String adecuados para acceder a cada carácter de la cadena de entrada y para controlar que se ha terminado de recorrer la cadena (ver tutorial proporcionado). Este método retorna anticipadamente en el momento en que se detecta una transición no definida. 2. Método público de validación (caso secuencias de símbolos tipo token): public boolean esValida(Scanner secuencia) En ocasiones, los símbolos de un alfabeto representan eventos o etiquetas que se procesan en secuencia y conviene darle al símbolo un nombre significativo (un string), en lugar de usar caracteres para representar los símbolos. A estos símbolos que se representan mediante un string los llamaremos tokens.  El parámetro de este método es un objeto Scanner, que se supone contiene la cadena a validar y en este caso es una secuencia de tokens separados por uno o más espacios (incluidos newlines). Estos espacios serán ignorados en el proceso de validación.  Ejemplo: supongamos que renombramos los símbolos de AFD "ejem-aa-determinista.jff” y al símbolo a le llamamos alfa y al símbolo b le llamamos beta . Entonces el autómata así modificado acepta la secuencia “betaalfaalfa” (compruébese). Aplicando este nuevo método de validación y considerando ese nuevo autómata entonces el método debería devolver true cuando se le pasa esa misma secuencia, pero separando los símbolos-token con espacios, como en la secuencia “beta alfa alfa”.  Por lo demás la estructura es análoga a la del método de validación para el caso de símbolos tipo carácter, sólo que ahora deberán usarse los métodos de la clase Scanner para extraer tokens de la secuencia uno a uno (ver tutorial) y procesar la secuencia token- a- token en lugar de carácter-a-carácter como en el otro método. Nota: podemos observar que se usan dos métodos con el mismo nombre y distinto tipo de parámetro (sobrecarga).
  • 3. PRÁCTICA 1-AFD (convocatoria de febrero) Autómatas y Lenguajes Formales 2011-2012 Página 3  IMPLEMENTACIÓN DE MÉTODO DE PRUEBA EN LA CLASE Afd.java (para entregar) Incluir el método main al final de la clase. Este método sólo tiene por objeto probar los métodos de la clase Afd.java con un autómata concreto, antes de pasar a usar los métodos de esta clase con autómatas más complejos como los de los ejercicios siguientes. En main se hará lo siguiente:  Prueba de método de validación con cadenas de símbolos tipo carácter: 1. Crear un Afd a partir del fichero jflap "ejem-aa-determinista.jff”. 2. Invocar al método de validación pasándole una cadena válida y una incorrecta . Para cada cadena de prueba se imprimirá por consola un mensaje con la cadena procesada y el resultado de la validación (si acepta o rechaza).  Prueba de método de validación con secuencias de tokens: 1. Modificar el fichero jflap renombrando los símbolos como alfa y beta, como se ha dicho antes. 2. Crear un Afd a partir del fichero jflap modificado. 3. Crear strings de prueba como antes. Ahora los strings contendrán secuencias de tokens separadas por espacios. Por ejemplo, uno de ellos puede contener la secuencia válida “beta alfa alfa”. 4. Crear un objeto Scanner a partir de cada string de prueba (ver cómo se hace en el tutorial proporcionado). 5. Invocar al método de validación pasándole al menos un Scanner con una secuencia válida y otro con la secuencia incorrecta . Para cada secuencia de prueba se imprimirá por consola un mensaje con la secuencia procesada y el resultado de la validación (si acepta o rechaza).
  • 4. PRÁCTICA 1-AFD (convocatoria de febrero) Autómatas y Lenguajes Formales 2011-2012 Página 4 Ejercicio 2: Simulación de un juego modelado mediante un AFD Se trata de diseñar un AFD para modelar el mecanismo de control de un juego de canicas en una especie “máquina tragaperras’’, que será simulado en el programa java que habrá que implementar en este ejercicio. Cada jugada consiste en el lanzamiento de una secuencia de canicas por dos zonas de entrada a un laberinto sencillo y cada canica tiene la posiblidad de caer por dos zonas de salida (GANA y PIERDE), como se muestra la siguiente figura: Descripción del juego:  Hay 3 palancas en el laberinto (P1, P2 y P3). Al inicio de una jugada las palancas están inclinadas hacia la izquierda y se supone que la última canica que cayó por el laberinto perdió (en realidad al inicio no ha caído todavía ninguna canica, pero por defecto se supone eso).  Si una canica entra por la entrada A entonces siempre choca con la palanca P1 y eso hace que la palanca cambie y se incline hacia el lado contrario. Si entra por B la palanca P3 se inclina hacia el lado contrario. La palanca P2 no siempre cambia cuando entra una canica, depende de hacia dónde estén inclinadas las palancas P1 y P3. Si entra por A y P1 está inclinada hacia la izquierda entonces P2 no se mueve porque la canica no choca con esa palanca; sin embargo, si entra por A y P1 está inclinada hacia la derecha entonces la canica choca con P1 y también con P2 (tanto si P2 está inclinada hacia la izda. como si está hacia la derecha) y por tanto estas dos palancas cambian. De forma análoga, cuando la canica entra por B y P3 está inclinada hacia la derecha entonces P2 no se mueve, pero si entra por B y P3 está inclinada hacia la izquierda entonces la canica choca con P3 y también con P2 y ambas cambian su inclinación.  Cada jugada se representa mediante una cadena de A’s/ B’s. Por ejemplo: la cadena “BBAA” es una jugada que indica que se lanzan 4 canicas: la primera entra por la entrada B, la segunda por la entrada B, la tercera por la A y la cuarta por la A. De esta forma el símbolo A representa el evento que se produce cuando una canica entra por la entrada A y el símbolo B representa el evento de entrada por B.  Para cierta jugada, unas canicas caerán por la salida GANA y otras por PIERDE. En cierto instante de la jugada, el hecho de que la canica actual caiga por una de las dos salidas depende de cómo estén situadas las palancas . Por tanto hay que tener en cuenta la situación dada por la inclinación de cada una de las palancas y cómo se altera esa situación cuando entra una canica al laberinto. También se requiere recordar en cierta situación si la canica que acaba de caer dejando las palancas en la situación actual perdió (cayó por PIERDE) o ganó (cayó por GANA), porque hay que llevar la cuenta de las canicas que ganan en cierta jugada. En el siguiente esquema se muestra una simulación del juego con la jugada representada por la cadena BBAA: se indica cómo van cambiando las palancas a medida que van entrando las canicas (según se lee cada símbolo de la cadena BBAA) y se indica para cada canica si pierde o gana.
  • 5. PRÁCTICA 1-AFD (convocatoria de febrero) Autómatas y Lenguajes Formales 2011-2012 Página 5 Objetivo del juego: Se procesarán una serie de jugadas de lanzamiento de canicas (cada una es una cadena de A’s/B’s en la simulación). Consideramos dos modalidades de juego: 1. Juego a ``gana la última’’: una jugada obtiene premio si la última canica cae por GANA (el autómata acepta la cadena que representa la jugada). En ese caso decimos que la jugada es ganadora en modo “gana la última”. 2. Juego a ``gana la mayoría ’’: una jugada obtiene premio si el número de canicas que caen por GANA es mayor que el que caen por PIERDE.  MODELADO DE LA DINÁMICA DEL JUEGO CON UN AFD (para entregar) Diseña en Jflap un AFD que sirva para comprobar si una jugada del juego de canicas, representada mediante una cadena de A’s/ B’s, es o no una jugada ganadora en modo “gana la última”. Pista: se necesitan más de 10 estados. Da nombres cortos aunque significativos a los estados (con set name en jflap) para que el diseño sea más fácil, dado que hay un buen número de estados y en este autómata es inevitable que se corten los arcos, por lo que resulta poco legible a simple vista y difícil de modificar si los estados no tienen nombre adecuado. El estado inicial representa la situación de ``inicio de jugada’’ indicada en la figura de más arriba. Los estados finales representan la situación en que la canica que acaba de pasar por el laberinto, dejando las palancas en cierta posición, cayó por GANA.
  • 6. PRÁCTICA 1-AFD (convocatoria de febrero) Autómatas y Lenguajes Formales 2011-2012 Página 6  IMPLEMENTACIÓN DEL JUEGO (para entregar) Implementa una clase ejecutable que haga lo siguiente:  Crea un objeto de la clase Afd a partir del fichero jflap con el AFD del juego de las canicas que se pide en el apartado anterior (se supone que el fichero jflap está en el directorio del proyecto eclipse de esta práctica, no poner ruta).  Imprime un mensaje para que el usuario introduzca su jugada. Puede ser sólo una, o bien varias jugadas separadas unas de otras por una coma (sin espacios).  Aplica el método split (ver tutorial) a la línea introducida por consola para obtener un array de cadenas donde cada una representa una jugada. Se usará una coma como delimitador.  Llama a los métodos que simulan el juego en el modo “gana la última” y en el modo “gana la mayoría”, como se indica a continuación: Método para simular varias jugadas en la modalidad “gana la última”. o Recorre el array de jugadas y para cada una: - Invoca al método de validación del objeto Afd creado e imprime un mensaje con la jugada procesada y que diga si con esa jugada se gana o se pierde. - No debe resolverse este ejercicio de otra forma, debe ser mediante el método de validación del autómata. Ejemplo: si tenemos en el array de jugadas los strings: “AB” y “ABA” entonces se procesa la cadena “AB” y el autómata detecta que gana, porque la última canica entró por B y cayó por GANA, según la descripción del juego y luego se simula la jugada “ABA” y según el autómata con esa jugada se pierde. Método para simular varias jugadas en la modalidad “gana la mayoría”. o Recorre el array de jugadas y para cada una: o Simula la ejecución del autómata con la cadena correspondiente a la jugada, de forma parecida a como se hace en el método de validación pero añadiendo instrucciones adicionales para incrementar contadores o lo que sea necesario. No hay que modificar el autómata diseñado en este modo de juego. Deben usarse los métodos públicos definidos en la clase Afd para ir cambiando de estado a mediada que se leen los caracteres de la cadena (entran las canicas al laberinto) y ahora interesa contar las canicas que caen por GANA (se alcanza un estado final). o Al terminar de recorrer la cadena, se imprimirá un mensaje indicando la jugada procesada y para cada canica se indicará si pierde o gana y luego imprimirá el resultado final: si el número de canicas que caen por GANA es mayor que el que caen por PIERDE entonces gana, en otro caso pierde. Ejemplo: si tenemos en el array dos cadenas: “BAAA” y “ABA” entonces se procesa la cadena “BAAA” y ganan todas las canicas excepto la penúltima y la jugada es ganadora porque ganan más que pierden. Luego se procesa la jugada “ABA” y en este modo también es una jugada ganadora porque ganan las dos primeras y pierde la última. Ejemplo de salida del programa: al introducir las jugadas AB,BAAA,ABA,BAB,BABA,AAABBBABABAB la salida que debería ser algo así como: (puede variar la presentación, pero conteniendo la información que se pide) Modo gana la última... Jugada AB: GANA Jugada BAAA: GANA Jugada ABA: PIERDE Jugada BAB: PIERDE Jugada BABA: PIERDE Jugada AAABBBABABAB: PIERDE Modo gana la mayoría... Jugada AB: A(G) B(G) GANA Jugada BAAA: B(G) A(G) A(P) A(G) GANA Jugada ABA: A(G) B(G) A(P) GANA Jugada BAB: B(G) A(G) B(P) GANA Jugada BABA: B(G) A(G) B(P) A(P) PIERDE Jugada AAABBBABABAB: A(G) A(G) A(G) B(P) B(P) B(G) A(P) B(P) A(G) B(G) A(P) B(P) PIERDE Jugada ABw3: A(G) B(G) *** jugada no permitida*** PIERDE
  • 7. PRÁCTICA 1-AFD (convocatoria de febrero) Autómatas y Lenguajes Formales 2011-2012 Página 7 Ejercicio 3: Detección de anomalías en secuencias de ECG con AFD Plantemos ahora un problema que trata sobre la evolución en el tiempo de la señal de un electrocardiograma (ECG) que, a alto nivel, puede interpretarse como un problema de análisis de secuencias de eventos representados con símbolos tipo token y puede resolverse tomando como modelo un autómata finito determinista. Figura 1: Ejemplo de registro de señal de ECG El ECG es el procedimiento de diagnóstico cardíaco por excelencia. En realidad, es un registro gráfico de la actividad eléctrica del corazón (Fig. 1). El ECG permite estudiar la duración, magnitud y dirección de las fuerzas eléctricas responsables del funcionamiento del corazón. Figura 2: trazado de señal de ECG diferenciando componentes Existen diferentes componentes del trazado típico de señal de un ECG (Fig.2), entre otros los siguientes:  Ondas: pueden ser P, Q, R, S y T.  Segmentos: se distinguen los segmentos ST y PQ.  Complejo QRS.  Intervalos: PQ y QT. La señal continua de ECG se somete a un proceso para convertirla en una secuencia de etiquetas, que llamamos eventos de ECG. Cada evento se corresponde con un componente del trazado de señal del electrocardiograma. Llamaremos secuencia de ECG a una secuencia de eventos que describe la actividad cardiaca durante un determinado intervalo de tiempo. En esta secuencia aparecen de forma cíclica ciertas subsecuencias, que llamamos periodos de ECG. Los periodos válidos del ECG se indican en la figura 3. Una secuencia de ECG normal está formada por uno o más periodos válidos de ECG, en otro caso se trata de una secuencia anómala.
  • 8. PRÁCTICA 1-AFD (convocatoria de febrero) Autómatas y Lenguajes Formales 2011-2012 Página 8 NOTA: los segmentos sST para cada tipo de periodo donde aparecen de manera explícita son opcionales. Es decir, si no aparece alguno para ese periodo, la secuencia resultante se considera un periodo válido también. Figura 3: Tipos de periodos normales de ECG Planteamos en este ejercicio esencialmente el problema de comprobar si una secuencia de ECG es normal o anómala. Nota: este problema es una simplificación y no refleja la complejidad real del proceso de diagnóstico médico a través de un ECG. DISEÑO DE UN AFD QUE ACEPTA SECUENCIAS NORMALES DE ECG (a entregar)  Diseña en Jflap un AFD que acepte el lenguaje formado por las secuencias normales de ECG. Los nombres de eventos que aparecen en la figura 3 forman el vocabulario del autómata. Es un autómata con símbolos de tipo token, por tanto cada arco se etiqueta con uno de estos símbolos, no con caracteres individuales. No hay que olvidar que algunos segmentos son opcionales.  Hacer una prueba de ejecución en Jflap, por ejemplo la secuencia “oPsPQiQToPcQRSoT”. Debe aceptarla. Considera otros casos de secuencias válidas y anómalas para comprobar la corrección del diseño. PROGRAMA PARA DETECCIÓN DE SECUENCIAS DE ECG ANÓMALAS (a entregar) Implementa una clase ejecutable que haga lo siguiente:  Crea un objeto Afd a partir del fichero jflap con el AFD del ECG que acepta secuencias normales.  Repite los siguientes pasos hasta que el usuario pulsa enter al pedir el nombre del fichero (el nombre es vacío). 1. Solicita por consola el nombre del fichero con la secuencia de ECG de un paciente (en la carpeta comprimida Ficheros de prueba hay ficheros de ejemplo con secuencias de ECG normales y anómalas). No cubren todos los casos, se recomienda diseñar un test de prueba más completo. 2. Crea un objeto File a partir del nombre de fichero y crea un Scanner a partir del File para extraer los tokens (eventos de ECG) del fichero uno a uno (ver tutorial). Se supone que el fichero contiene la secuencia de eventos de ECG separados por espacios. Por ejemplo: si contiene “oP sPQ iQT” esa secuencia es normal, por lo que el método de validación devolverá true. 3. Aplica el método de validación del objeto Afd creado para comprobar si la secuencia de ECG que se le pasa es normal o anómala e imprime un mensaje indicando el diagnóstico: normal o anómala (no hay imprimir la secuencia leída porque el fichero puede ser largo).  Si la secuencia es anómala entonces debe imprimir además un mensaje informativo de anomalía con los siguientes datos: estado en que ha parado el autómata al finalizar la ejecución (último estado alcanzado) y último evento de ECG leído. Por ejemplo, si tras leer “oP” estando el autómata en el estado “q1”, se lee “oR” entonces se detecta que secuencia es anómala e imprime mensaje de secuencia anómala junto con el estado “q1” y el evento “oR”. De esa forma nos hacemos una idea de en que tramo de la secuencia de ECG se ha detectado la anomalía. Nota: la ejecución no debe finalizar si se introduce un nombre de fichero inexistente. Sólo debe acabar cuando el usuario pulsa enter. oP oP sPQ sPQ oQ oR oS sST oT cQRS sST oT oP sPQ iQT iPQ oQ oR oS sST oT Tipo1 Tipo 2 Tipo 4 Tipo 3
  • 9. PRÁCTICA 1-AFD (convocatoria de febrero) Autómatas y Lenguajes Formales 2011-2012 Página 9 Puntuación e instrucciones de entrega 1. Crea una carpeta que se llame Apellidos1-Apellidos2, donde Apellidos1 son los dos apellidos del primer alumno de la pareja de prácticas (todo junto) y Apellidos2 son los dos apellidos del segundo alumno (si es que lo hay). Los que tengan apellido muy largo pueden abreviar. El caso es que quede claro quienes son los autores de la práctica por el nombre de la carpeta. Dentro de esta carpeta:  Incluye las clase LectorAFD_JFLAP.java (original) y Afd.java (modificada) correspondiente al ejercicio 1.  Incluye el fichero Jflap del autómata del ejercicio 2 y la clase con el simulador del juego.  Incluye el fichero Jflap del autómata del ejercicio 3 y la clase con el programa que detecta anomalías en secuencias de ECG.  En cada clase debe aparecer el autor/autores de la práctica al principio, en los comentarios de la clase.  Si alguna clase da errores de compilación o no hace prácticamente nada que no se incluya, porque no contará nada. Es mejor así que entregar cualquier cosa.  No debe aparecer la sentencia package en ninguna de las clases, ni deben incluirse subcarpetas ni .class. Los fuentes (.java) tienen que leerse correctamente en eclipse de Windows. Si se hacen en Linux convierte el formato para que no se vean caracteres extraños. 2. Selecciona la carpeta creada Apellidos1-Apellidos2 (la carpeta, no el contenido de la carpeta) y Enviar a Carpeta comprimida (en zip). No debe entregarse un .rar. 3. En SAKAI sube el .zip para la tarea “PRÁCTICA: Autómatas Finitos Deterministas”:  Cada compañero deben subir el mismo fichero para que quede constancia en el sistema. 4. En SAKAI envía un mensaje privado por grupo (no correo electrónico) a tu profesor con el asunto “Entregada Práctica 1”.  Únicamente un alumno (si son dos) debe enviar el mensaje.  En el contenido del mensaje indica quiénes son los 2 miembros del grupo (si procede). Fecha de entrega: la fecha de entrega son las siguientes: Grupo 1 y 2 (Lunes y Martes): 25 de Noviembre 23:59h. Profesor: José M. Juárez Grupo 3 (Miércoles): 2 de Diciembre 23:59h. Profesor: Antonio Morales. Puntuación y criterio de evaluación: Esta práctica vale 1.5 del total de 3.5 que se puede conseguir en prácticas. Se recuerda que esta nota ya esta ponderada y suma directamente a la nota de examen (6.5 nota máxima). Se exige una nota mínima de 0.5 en esta práctica. Aquellos que no lleguen a esa nota tendrán que presentar las prácticas en otra convocatoria. Los ejercicios 1 y 3 valen 0.4 puntos cada uno y el ejercicio 2 vale 0.7 puntos Se restarán puntos por las siguientes deficiencias, según gravedad:  El código contiene fallos de corrección o mal funcionamiento. Como es lógico se requiere que la solución aportada para cada ejercicio sea correcta en general y no que valga para unos casos y falle con otros. La falta de corrección puede suponer restar el total de puntos de un ejercicio.  El código no se ajusta a la especificación establecida en cada ejercicio. Especialmente grave es resolver un ejercicio sin basarse en el funcionamiento del AFD que modela el problema planteado. Esto supone un cero.  El código no tiene comentarios o pocos. Al no pedir que se entregue una documentación, es importante que se comente el código: comentario general de la clase, comentario que aclare lo que hace cada método (al estilo javadoc) y aparte comentar las líneas principales. La ausencia de comentarios puede suponer restar la mitad de lo que vale cada ejercicio, aunque sea correcto.  El código es poco legible. Por ejemplo, con mal sangrado, abuso del scroll horizontal en lugar de partir líneas muy largas, variables sin nombre significativo, etc.  No sigue las instrucciones de entrega. Las instrucciones no son un capricho, tienen por objeto facilitar el trabajo de corrección. Así que se penalizarán los “despistes”, con objeto de reforzar la atención. En caso de plagio: la copia parcial o total de cualquier ejercicio supone SUSPENSO en prácticas para todas las personas implicadas (los que se copian y los que se dejan copiar).