Funcion Extendida AFD November 22, 2017 # ================================================================ # NOMBRE: CALLASACA ACUN~A FERNANDO # CODIGO: 140989 # ALGORITMO: AFD equivalente a AFND # ================================================================ # Leemos Datos # Leemos los estados NE = int(input("Ingrese la cantidad de estados: ")) S = [] for k in range(NE): S.append(k) # Leemos le Alfabeto NA = int(input("Ingrese la cantidad de elementos del Alfabeto: ")) A = [] for k in range(NA): Elemento = str(input("Ingrese al Alfabeto "+str(k+1)+" : ")) A.append(Elemento) # Leemos el Estado Inicial NQo = int(input("Ingresa la cantidad de estados inciales que tiene el AFND: ")) Qo = [] for k in range(NQo): o = str(input("Ingrese el estado Inicial "+str(k+1)+" ( q(?) ): ")) Qo.append(o) # Leemos la cantidad de estados finales NF = int(input("Ingrese la cantidad de Estados Finales: ")) F = [] for k in range(NF): Elemento = int(input("Ingrese el Estado Final "+str(k+1)+" ( q(?) ): ")) F.append(Elemento) ConcaF = "" for k in range(len(F)): ConcaF+=str(F[k]) 1 F = ConcaF # Leemos la tabla de estados # Creamos una Lista E para que ahy esten una lista de listas de listas de estados E = [] for k in range(NE): # Creamos una lista L para guardar los elementos de cada estado con sus transformaciones L = [] for j in range(NA): # Pedimos cuantos estados estan mediante una transformacion mediante un alfabeto NumeroEstados = int(input("Cuantos Estados hay la TransFormacion del estado q("+str( # Creamos una Lista NumEs para guardar la cantidad de estados que van de un estado a NumEs = [] for i in range(NumeroEstados): # Leemos los estados individuales EleNu = int(input("Ingrese la "+str(i+1)+"° Transformacion del estado q("+str(k) NumEs.append(EleNu) L.append(NumEs) E.append(L) # Modulo para darle un estado grande y buscarlo en el conjunto de estados def BuscarEstado(E,Estado): Encontrado = False for k in range(len(E)): if(E[k]==Estado): Encontrado=True break return Encontrado ################### PROGRAMA PRINCIPAL ########################### # ---------- MODULO PRINCIPAL ----------# Modulo para hallar todos los estados del AFD # Dandole como parametros: # 1.- Tabla de Transiciones del AFND en lista de listas # 2.- El estado Inicial en String # 3.- El Alfabeto def ConseguirEstadosAFD(E,Qo,A,EE,Transiciones): PrimerEstadoAFD = "" for k in range(len(Qo)): PrimerEstadoAFD+=str(Qo[k]) EE.append(PrimerEstadoAFD) # h = contador infinito h=0 # L = lista donde guardaremos los estados 2 # # # # # que no se repiten para trabajar solo con ellos L = [] # El While lo PUSE un NUMERO GRANDE # asi me aseguro que siempre hallara todos los estados # teniendo en cuenta el ((BREAK)) cuando ya no necesite el ((h)) while(h<100000000000000000000): for k in range(len(Qo)): Aux = Qo[k] if(len(Aux)==1): Aux = int(Aux) for j in range(len(A)): P = E[Aux][j] Es = "" for i in range(len(P)): Es+=str(P[i]) Transiciones.append(Es) if(BuscarEstado(EE,Es)==False): EE.append(Es) L.append(Es) else: for m in range(len(A)): Con = [] for j in range(len(Aux)): AuxQ = int(Aux[j]) P = E[AuxQ][m] for i in range(len(P)): Con.append(P[i]) Con = set(Con) Con.union({}) Con = list(Con) Es = "" for n in range(len(Con)): Es+=str(Con[n]) Transiciones.append(Es) if(BuscarEstado(EE,Es)==False): EE.append(Es) L.append(Es) h+=1 if(len(L)==0): break Qo = L L = [] DATOS FINALES E = estados del AFND en lista de listas Qo = estados iniciales A = alfabeto (sigma) 3 # # # # # # F = estados finales del AFND Datos cuaderno E = [[[1,3],[2]],[[4],[1]],[[1],[4]],[[2,4],[3]],[[4],[2]]] A = ["x","y"] Qo = ["0"] F = "4" EE = [] Transiciones = [] ####################### ####################### EJECUCION DEL PROGRAMA OBTENGO EL (((EE)))) ESTADOS AFD ConseguirEstadosAFD(E,Qo,A,EE,Transiciones) ############ MODULO PARA IMPRIMIR EL EQUIVALENTE AFD def ImprimirEquivalenteAFD(EE,A,F,Transiciones): print() print("============================================") print("********** AFD EQUIVALENTE A AFND **********") print("============================================") print() print(" Alfabeto ") AA = A A = set(A) print(A) print() print(" Estados AFD ") print(EE) print() print(" Estado Inicial AFD ") print(EE[0]) print(" Estados Finales AFD ") Est = [] for k in range(len(EE)): Estado = EE[k] for j in range(len(Estado)): for i in range(len(F)): if(Estado[j]==F[i]): Est.append(Estado) break print(set(Est)) print(" Transiciones AFD ") Alfa = "" for j in range(len(AA)): 4 Alfa+=" "*(7)+str(AA[j]) print(Alfa) for k in range(len(EE)): Linea = "Q"+str(EE[k])+" "*(5-len(EE[k])) for j in range(len(A)): Linea += " Q"+Transiciones[k+k+j] print(Linea) ImprimirEquivalenteAFD(EE,A,F,Transiciones) 2 minutes ago 76.953 seconds Ingrese la cantidad de estados: 5 Ingrese la cantidad de elementos del Alfabeto: 2 Ingrese al Alfabeto 1 : x Ingrese al Alfabeto 2 : y Ingresa la cantidad de estados inciales que tiene el AFND: 1 Ingrese el estado Inicial 1 ( q(?) ): 0 Ingrese la cantidad de Estados Finales: 1 Ingrese el Estado Final 1 ( q(?) ): 4 Cuantos Estados hay la TransFormacion del estado q(0) mediante 2 Ingrese la 1° Transformacion del estado q(0) mediante (x): 1 Ingrese la 2° Transformacion del estado q(0) mediante (x): 3 Cuantos Estados hay la TransFormacion del estado q(0) mediante 1 Ingrese la 1° Transformacion del estado q(0) mediante (y): 2 Cuantos Estados hay la TransFormacion del estado q(1) mediante 1 Ingrese la 1° Transformacion del estado q(1) mediante (x): 4 Cuantos Estados hay la TransFormacion del estado q(1) mediante 1 Ingrese la 1° Transformacion del estado q(1) mediante (y): 1 Cuantos Estados hay la TransFormacion del estado q(2) mediante 5 (x): (y): (x): (y): (x): 1 Ingrese 1 Cuantos 1 Ingrese 4 Cuantos 2 Ingrese 2 Ingrese 4 Cuantos 1 Ingrese 3 Cuantos 1 Ingrese 4 Cuantos 1 Ingrese 2 la 1° Transformacion del estado q(2) mediante (x): Estados hay la TransFormacion del estado q(2) mediante (y): la 1° Transformacion del estado q(2) mediante (y): Estados hay la TransFormacion del estado q(3) mediante (x): la 1° Transformacion del estado q(3) mediante (x): la 2° Transformacion del estado q(3) mediante (x): Estados hay la TransFormacion del estado q(3) mediante (y): la 1° Transformacion del estado q(3) mediante (y): Estados hay la TransFormacion del estado q(4) mediante (x): la 1° Transformacion del estado q(4) mediante (x): Estados hay la TransFormacion del estado q(4) mediante (y): la 1° Transformacion del estado q(4) mediante (y): ============================================ ********** AFD EQUIVALENTE A AFND ********** ============================================ Alfabeto {'x', 'y'} Estados AFD ['0', '13', '2', '24', '1', '4', '14', '12'] Estado Inicial AFD 0 Estados Finales AFD {'4', '24', '14'} Transiciones AFD x y Q0 Q13 Q2 Q13 Q24 Q13 Q2 Q1 Q4 Q24 Q14 Q24 6 Q1 Q4 Q14 Q12 Q4 Q4 Q4 Q14 Q1 Q2 Q12 Q14 7