Está en la página 1de 5

201910632 1

Taller Diseño AF Python/Java


(julio de 2022)
Hovar S. Rincon

Resumen – En el presente documento se realiza la construcción algunos métodos con el fin de optimizar el código. Por otro
tanto de un AFD como un AFND haciendo uso de dos lenguajes de lado, para la programación del segundo caso de estudio, se usa
programación. Para poder realizar esto, se realiza una Python haciendo uso de la librería “automata-lib”, la cual
investigación con el fin de poder conocer las diferentes implementa estructuras y algoritmos para autómatas finitos. El
herramientas existentes para el diseño de autómatas finitos. Para uso de las librerías para cualquier lenguaje de programación
ambos casos, con el fin de probar el correcto funcionamiento del
programa realizado tanto en Java como en Python, se realizan
proporciona algunas ventajas dentro de las cuales se encuentran
pruebas con la herramienta JFLAP. [3]:
Para la codificación del primer caso de estudio correspondiente
al desarrollo de un AFD se hace uso del IDE Eclipse, y para el caso • Estructura y organización del código predeterminada.
de estudio correspondiente al desarrollo de un AFND se hace uso • Reutilización de código.
del IDE Spyder. • Agilidad y rapidez en el desarrollo.
• Optimización de código.
Índice de Términos – AFND, AFD, Python, Java, JFLAP.
II. MATERIALES Y MÉTODOS

I. INTRODUCCIÓN Para el desarrollo del presente documento, se realizó la


exploración de la documentación correspondiente a la librería

L os autómatas finitos son modelos matemáticos los cuales


“automata” de Python, la cual nos brinda la información
correspondiente sobre el correcto uso de esta. Luego de saber el
aceptan cadenas sobre un lenguaje definido, estos están correcto funcionamiento de esta, se realiza la programación de
formados por un conjunto finitos de estados de los cuales uno un caso de estudio de AFND en Python.
de estos debe ser el estado inicial y la cantidad de estados de
aceptación pueden ser uno o más. Las cadenas recibidas son Para poder realizar el autómata en Java se hace uso de algunos
evaluadas carácter por carácter por medio de las transiciones ya ciclos iterativos y de comparación presentes dentro del lenguaje
definida, esto se hace con el fin de analizar si la cadena conduce de programación. De estos ya se tienen conocimientos previos
desde el estado inicial al estado de aceptación [1]. Tanto los por lo que no es necesario leer documentación sobre estos.
autómatas finitos determinísticos como los autómatas finitos no
determinísticos están compuestos por una quíntupla, la cual está III. RESULTADOS Y ANÁLISIS
compuesta por: el alfabeto de aceptación del autómata, conjunto
de estados, estado inicial, estado(s) final(es) y la función de
transición. A. Construcción de un AF en Python

Si para cada uno de los estados del autómata existe como


Para la construcción tanto de autómatas finitos deterministas
máximo una transición definida para cada uno de los símbolos
como autómatas finitos no deterministas en Python, se hace uso
del alfabeto, se dice que este es un automata finito
de la librería “automata”, cabe resaltar que, para el correcto
determinístico (AFD).
funcionamiento de la misma se requiere usar Python 3.6 o
posterior [4].
Por otro lado, en los autómatas finitos no determinísticos
(AFND) la función de transición puede contar con la
Para el caso concreto de la construcción de un autómata finito
posibilidad de transitar a más de un estado con un mismo
no determinista (AFND) es necesario usar la clase NFA la cual
carácter, además de esto, la transición de un estado a otro no
es una subclase de FA (clase abstracta de la que heredan todos
necesariamente debe leer un carácter de la entrada, estas
los autómatas finitos [4]), cada NFA contiene las 5 propiedades
transiciones son denominadas transiciones-λ [2]. En este tipo de
descritas en la definición formal de los autómatas.
autómatas el estado inicial también puede a su vez ser un estado
de aceptación.
Dentro del lenguaje de programación Python haciendo uso de
la librería ya mencionada para la construcción de AFND se hace
Con lo mencionado anteriormente, en el presente documento se
uso de algunas palabras reservadas las cuales hacen referencia
realiza la programación de dos casos de estudios, el primero de
a las propiedades de los autómatas, además de estas, se
estos se realiza un autómata en Java, para esto, se hace uso de
201910632 2

especifican las transiciones correspondientes entre estados,


estas son: Para el desarrollo del caso de estudio anteriormente
mencionado, primero se grafica el AFND con la herramienta
• state: Hace referencia a los estados validos del AFND JFLAP para que así, al momento de realizar la programación de
los cuales deben representarse como una cadena. dicho autómata sea más sencilla y clara. Dicho esto, el autómata
• input_symbols: Se refiere a los símbolos de entrada resultante se puede ver en la Imagen 3. AFND caso de estudio
validos (alfabeto aceptado por el autómata), este en Python.
también se debe representar como una cadena.
• initial_state: Corresponde al estado inicial de AFND.
• final_states: Corresponde a los estados finales del
AFND.
• transitions: Consta de las posibles transiciones que
puede tener cada uno de los estados del AFND.

Imagen 1. Ejemplo descripción AFND Python. [4]

En la Imagen 1. Ejemplo descripción AFND Python se puede


observar la forma correcta en la que se deben definir cada una Imagen 3. AFND caso de estudio en Python
de las características del AFND. El ejemplo mostrado
Luego de tener el gráfico del AFND del caso de estudio se
corresponde a un autómata que contiene 3 estados (q0, q1, q2),
procede a identificar cada uno de los elementos necesarios
acepta el lenguaje (‘a’, ‘b’), tiene como estado inicial (q0),
(states, input_symbols, intial_state, final_states, transitions), las
estado final (q1) y las transiciones para este se pueden ver en la
cuales se describieron anteriormente, esto se hace para poder
Tabla I Transiciones AFND ejemplo:
empezar a programarlo en Python.
TABLA I
TRANSICIONES AFND EJEMPLO • states: {q0, q1, q2, q3, q4}
Entrada • input_symbols: {1, 2, 3}
Estado
a b lambda • initial_state: {q0}
q0 q1 • final_state: {q4}
q1 q1 q2
Las transiciones correspondientes para el AFND propuesto se
q2 q0
pueden ver en la Tabla II Transiciones AFND caso de estudio.

Para poder validar que la entrada sea aceptada por el autómata TABLA II
TRANSICIONES AFND CASO DE ESTUDIO
se hace uso de la función “accepts_input”, esta función se
Entrada
encuentra dentro de la subclase NFA, a la cual se le debe Estado
1 2 3
ingresar la cadena a evaluar. Esto se puede observar en la q0 q0, q1, q2 q0, q1, q2, q3 q0, q3
Imagen 2. Ejemplo validación entrada AFND.
q1 q4
q2 q2 q4
q3 q3 q3 q4

Teniendo estos elementos claros se procede a realizar la


programación del AFND en Python. Para poder hacer uso de la
Imagen 2. Ejemplo validación entrada AFND. [4]
librería NFA se debe importar la librería NFA la cual se
B. Caso de estudio AFND en Python encuentra dentro de la clase “automata” de Python. Esto se
puede observar en la Imagen 4. Importación de librería.
Diseñar un autómata finito no determinístico el cual acepte
cadenas sobre el alfabeto {1, 2, 3} de tal forma que, el último
Imagen 4. Importación de librería
símbolo aparezca previamente, sin ninguna intervención de un
símbolo más alto entre la aparición del último símbolo.
201910632 3

Luego de realizar la importación de la librería NFA se pueden


empezar a usar los métodos necesarios para la construcción del
AFND. Como primera medida se empieza definiendo los
estados del autómata, luego se define el alfabeto que acepta el TABLA III
CADENAS A PROBAR
AFND, las transiciones correspondientes entre estados, estado
Cadena Resultado JFLAP Resultado programa
inicial y estado final del autómata. Esto se puede ver en la
1233123 Accept Cadena Aceptada
Imagen 5. Definición autómata.
221231232 Reject Cadena NO Aceptada
123123 Accept Cadena Aceptada
1231321 Reject Cadena NO Aceptada
2133213213 Accept Cadena Aceptada
213213 Accept Cadena Aceptada
1233112 Accept Cadena Aceptada
123331 Reject Cadena NO Aceptada

Imagen 5. Definición autómata Estos resultados se pueden ver en la Imagen 8. Cadenas en


JFLAP y en la Imagen 9. Cadenas en el programa diseñado en
Para finalizar, en una variable se guarda la cadena que se quiere Python.
se quiere validar, para posteriormente, hacer uso de la función
“nfa.accepts_input”, la cual recibe por parámetro la variable en
la que se guarda la cadena. Esto se observa en la Imagen 6.
Definición cadena y comprobación de la misma.

Imagen 8. Cadenas en JFLAP

Imagen 6. Definición de cadena y comprobación de la misma

El código del programa desarrollado en Python para el caso de


estudio mencionado anteriormente se puede ver en la Imagen 7.
Código caso de estudio. El cual ya queda listo para ejecutarse
probar las cadenas deseadas.

Imagen 9. Cadenas en el programa diseñado en Python

Con esto se puede observar que las cadenas probadas tanto en


JFLAP como en el programa diseñado en Python tienen el
mismo resultado de aceptación por el autómata.

C. Construcción de un AF en Java

En el caso de la realización de un AFD en Java basta con hacer


uso de algunos de los ciclos iterativos presentes dentro de este
lenguaje de programación. Lo primero que se debe realizar es
Imagen 7. Código caso de estudio definir cual es el estado inicial y estado final del autómata, para
posteriormente poder empezar a usar el ciclo “while”, dentro de
Con el fin de probar el correcto funcionamiento del autómata se este se debe empezar a realizar las respectivas comparaciones
hacen las respectivas pruebas de 2 cadenas tanto en la entre los estados y cada uno de los caracteres presentes dentro
herramienta JFLAP como en el programa desarrollado, las de la cadena a evaluar, para sí poder determinar cual es el estado
cadenas que se probaron se pueden ver en la Tabla III. Cadenas
final de la cadena. Luego de obtener el valor del estado final
a probar.
resultante se realiza la comparación de este con el estado de
201910632 4

aceptación del autómata. este, poder realizar la comparación con el estado de aceptación
del autómata, en el caso de que estos dos sean iguales, se retorna
un mensaje el cual muestra que la cadena ingresada es aceptada,
D. Caso de estudio AFD en Java en caso contrario, se muestra un mensaje el cual muestra que la
cadena ingresad NO es aceptada.
Realizar un autómata finito no determinista que acepte cadenas
sobre el alfabeto {x, y} tal que las cadenas empiecen en “x” y Con el fin de poder realizar las pruebas respectivas para el
terminen con “xy”. correcto funcionamiento del autómata programado se realiza la
Con el fin de poder entender de mejor manera el creación de un ArrayList el cual cuenta con 28 cadenas, estas
funcionamiento del AFND como primera medida, se realiza el mismas cadenas se prueban en el AFD realizado en JFLAP, los
diseño gráfico de este en JFLAP para así poder determinar resultados se pueden ver en la Imagen 11. Pruebas AFD JFLAP
todos los elementos necesarios para realizar la programación de y en la Imagen 12. Prueba AFD en Java.
este en Java. La representación gráfica de este se puede ver en
la Imagen 10. AFD caso de estudio Java.

Imagen 11. Pruebas AFD JFLAP

Imagen 10. AFD caso de estudio Java

Con la realización del diseño se puede ver los elementos


necesarios para realizar la programación correspondiente en
Java, los cuales son:

• Estado_inicial: 1
• Estado_final: 5
• Alfabeto: {x, y}

La tabla de transiciones correspondiente se puede ver en la


Tabla IV Transiciones AFD caso de estudio.

TABLA IV
TRANSICIONES AFD CASO DE ESTUDIO
Entrada
Estado
x y
1 3 2
2 2 2
3 3 4
4 5 4 Imagen 12. Pruebas AFD en Java

5 3 4
Con el resultado de las imágenes anteriores se puede observar
que las cadenas ingresadas tanto en JFLAP como en Java tienen
Luego de tener claras las transiciones del AFD se realiza la el mismo resultado de aceptación del autómata.
definición tanto del estado final como del estado inicial, en este
caso, estos se guardan dentro de una variable tipo “int”. Ya Con el fin de realizar pruebas con cadenas diferentes a las
sabiendo esto, se procede a realizar las respectivas transiciones ingresadas de manera predeterminada se realiza un pequeño
del autómata las cuales se encuentran se describen en la Tabla menú el cual cuenta con tres opciones:
IV Transiciones AFD caso de estudio. Estas se realizan
haciendo uso del ciclo iterativo “while” y dentro de este se • 1 para verificar cadenas predeterminadas.
empiezan a comparar cada uno de los caracteres y los estados • 2 para verificar una nueva cadena.
del autómata para saber cuá006C es el siguiente estado al que • 3 para salir.
tiene que pasar la cadena a evaluar, luego de realizar la
comparación de todos los caracteres de la cadena, el método Esto se puede observar en la Imagen 13. Menú de opciones
retorna el valor del estado en el que termina la cadena para con
201910632 5

REFERENCIAS
[1] “AUTOMATAS FINITOS”.
[2] “G H D.”
https://www.institucional.frc.utn.edu.ar/sistemas/ghd/
T-M-AFD.htm (accessed Jul. 07, 2022).
[3] tiThink, “Framework o librerías: ventajas y
desventajas View Larger Image.” Framework o
librerías: ventajas y desventajas View Larger Image
(accessed Jul. 07, 2022).
[4] “autómatas-lib · PyPI.”
https://pypi.org/project/automata-lib/#class-nfafa
Imagen 13.Menú de opciones
(accessed Jul. 06, 2022).
Si el usuario selecciona la opción 1 el resultado que se mostrará
en pantalla se puede ver en la Imagen 12. Prueba AFD en Java.
Mientras que, para el caso de la opción 2, se mostrará una
ventana en la cual el usuario debe escribir la cadena la cual
quiere evaluar, luego de esto, se mostrará un mensaje que puede
ser: Aceptado o No aceptado. Esto se puede ver en la Imagen
14. Comprobación cadena ingresada por el usuario.

Imagen 14. Comprobación cadena ingresada por el usuario

IV. CONCLUSIONES
• La programación de un AFND en Python resulta
bastante sencilla gracias a la implementación de la
librería correspondiente.
• Con el uso de la librería que brinda Python para
realizar AFD y AFDN los programas desarrollados
brindan más optimización y sencillez en el código.
• Se determinó, que para el desarrollo de los dos
programas desarrollados fue necesario identificar cada
uno de los elementos de la quíntupla que compone un
autómata ya que estos son necesarios a la hora de
realizar la codificación del código.
• Se logró evidenciar que suele ser conveniente la
implementación de diferentes métodos a la hora de
desarrollar un programa, ya que, a la hora de realizar
modificaciones dentro del programa es más sencillo
poder encontrar la parte a modificar, mientras que, si
se hace el código de manera secuencial, estas
modificaciones se vuelven más tediosas y toman más
tiempo.
• Se identificó que, para la programación de un AFD
como un AFND es más recomendable hacer uso de
Python ya que este cuenta con librerías para realizar
estos diseños, haciendo que el programa sea más
entendible y optimo.

También podría gustarte