Logo Studenta

ADA 3 3 - Programa conversor AFN - AFDFinal

¡Estudia con miles de materiales!

Vista previa del material en texto

Instituto Tecnológico Superior Progreso 
1 
 
 
 
 
 
 
 
 
 
 Instituto Tecnológico Superior Progreso 
CARRERA: 
Ingeniería en Sistemas Computacionales 
 
MATERIA: 
Lenguajes y Autómatas I 
TAREA: 
ADA 3.3 - Programa conversor AFN – AFD 
 
MAESTRO: 
Holzen Atocha Martínez García 
Alumnos: 
Madera Poot Wilberth Rafael 
Vivas Cetz Juan Alejandro 
Couho Pérez Kevin Antonio 
Flores Montero Geovanny Alessandro 
De la cruz Centeno Miguel Ángel 
SEMESTRE:6 
 
 
 
 
 
 
 
 
Instituto Tecnológico Superior Progreso 
2 
 
 
 
 
 
 
 
 
Codigo: 
# Definición de la clase Autómata Finito No Determinístico (AFN) 
class AFN: 
 def __init__(self, Q, Sigma, delta, q0, F): 
 self.Q = Q # Conjunto de estados 
 self.Sigma = Sigma # Alfabeto de entrada 
 self.delta = delta # Función de transición 
 self.q0 = q0 # Estado inicial 
Instituto Tecnológico Superior Progreso 
3 
 
 self.F = F # Conjunto de estados finales 
 
# Definición de la clase Autómata Finito Determinístico (AFD) 
class AFD: 
 def __init__(self, Q, Sigma, delta, q0, F): 
 self.Q = Q # Conjunto de estados 
 self.Sigma = Sigma # Alfabeto de entrada 
 self.delta = delta # Función de transición 
 self.q0 = q0 # Estado inicial 
 self.F = F # Conjunto de estados finales 
 
# Función para obtener el conjunto de estados alcanzables desde un estado con 
un símbolo de entrada 
def transicion(afn, estados, simbolo): 
 resultado = set() 
 for estado in estados: 
 resultado |= set(afn.delta.get((estado, simbolo), [])) 
 return resultado 
 
# Función para convertir un AFN a un AFD 
def afn_a_afd(afn): 
 q0 = frozenset([afn.q0]) # Estado inicial del AFD 
 Q = set([q0]) # Conjunto de estados del AFD 
 Sigma = afn.Sigma # Alfabeto de entrada del AFD 
 F = set() # Conjunto de estados finales del AFD 
Instituto Tecnológico Superior Progreso 
4 
 
 delta = {} # Función de transición del AFD 
 
 por_procesar = [q0] # Lista de estados que aún no han sido procesados 
 while por_procesar: 
 estado_actual = por_procesar.pop(0) 
 for simbolo in Sigma: 
 nuevo_estado = frozenset(transicion(afn, estado_actual, simbolo)) 
 if nuevo_estado not in Q: 
 Q.add(nuevo_estado) 
 por_procesar.append(nuevo_estado) 
 delta[(estado_actual, simbolo)] = nuevo_estado 
 if afn.F.intersection(nuevo_estado) and nuevo_estado not in F: 
 F.add(nuevo_estado) 
 
 return AFD(Q, Sigma, delta, q0, F) 
 
# Ejemplo de uso 
afn = AFN( 
 Q = {'q0', 'q1', 'q2'}, 
 Sigma = {'0', '1'}, 
 delta = { 
 ('q0', '0'): ['q0', 'q1'], 
 ('q0', '1'): ['q0'], 
 ('q1', '0'): ['q2'], 
 ('q1', '1'): ['q2'], 
Instituto Tecnológico Superior Progreso 
5 
 
 ('q2', '0'): ['q2'], 
 ('q2', '1'): ['q2'] 
 }, 
 q0 = 'q0', 
 F = {'q1'} 
) 
 
afd = afn_a_afd(afn) 
 
print("AFN:") 
print("Q =", afn.Q) 
print("Sigma =", afn.Sigma) 
print("delta =", afn.delta) 
print("q0 =", afn.q0) 
print("F =",) 
Funcionamiento del código: 
Ambas clases tienen los mismos atributos: el conjunto de estados Q, el alfabeto de 
entrada Sigma, la función de transición delta, el estado inicial q0 y el conjunto de 
estados finales F. A continuación, definimos una función de transición (affn, 
estados, símbolo) que acepta como argumentos AFN el conjunto de estados y el 
símbolo del símbolo de entrada. La función devuelve una matriz de estados a los 
que se puede acceder desde cualquier estado leyendo el ID de entrada en el 
estado especificado. Para ello se transporta el estado de cada estado y se obtiene 
el número de estados a los que se puede llegar leyendo el símbolo AFN con la 
función de transición AFN. La transformación se realiza mediante el algoritmo de 
construcción AFN y AFD, que consiste en iniciar el AFN desde un estado inicial 
con un conjunto de estados alcanzables y computar recursivamente los estados 
alcanzables de cada conjunto de estados ya procesados, leyéndolos todos. En 
cada iteración del algoritmo, se construyen nuevos estados del DFA y se agregan 
a la tabla de transición delta. Para implementar el algoritmo de construcción DFA, 
la lista to_process se utiliza para realizar un seguimiento de los estados que aún 
Instituto Tecnológico Superior Progreso 
6 
 
no se han procesado. Luego itera sobre los conjuntos de estados en la lista 
to_process y calcula nuevos estados para cada estado alcanzado cuando se lee 
cada símbolo del alfabeto de entrada usando la función de transición. Si el nuevo 
estado aún no se ha procesado, se agrega a la lista to_process.

Continuar navegando