#Definir estructura de datos (clase) para el arbol de busqueda class Arbol: def __init__(self, nodo): self.nodo = nodo self.subarbol=[] def __str__(self): return str(self.nodo) def agregar_hijo(self,regla,hijo): self.subarbol.append(tuple([regla,hijo])) def contiene_nodo(self,nodo): """contiene el arbol al argumento como nodo?""" if self.nodo==nodo: return True else: if self.subarbol!=[]: cn=False for i in self.subarbol: cn=cn or i[1].contiene_nodo(nodo) return cn else: return False def aplicar_reglas(self,arbol): #primero aplica todas las reglas al nodo raiz for i in range(0,len(reglas)): su0=reglas[i][0] su1=reglas[i][1] no=self.nodo if no.endswith(su0): nuevo = no[:no.rfind(su0)]+su1 if nuevo==T or not(arbol.contiene_nodo(nuevo)): self.agregar_hijo(i,Arbol(nuevo)) #luego se ramifica recursivamente para cada subarbol #(si hay subarboles hijos) if self.subarbol!=[]: for i in self.subarbol: i[1].aplicar_reglas(arbol) def recorrer_arbol(self,ruta): """recorre todo el arbol retornando las rutas que terminan en T""" global rutas if self.nodo==T: rutas.append(ruta) else: for i in self.subarbol: i[1].recorrer_arbol(ruta+[(i[0],i[1].nodo)]) def imprimir_rutas(): if rutas==[]: print "No es posible transformar",S,"en",T,"mediante esta gramatica." else: for i in range(0,len(rutas)): print "Transformacion",i+1,":" print S,"\t-->", for j in rutas[i]: print j[1],"\tRegla",j[0]+1,": (", print reglas[j[0]][0],"-->",reglas[j[0]][1],")" if not(j==rutas[i][-1]): print "\t-->", #PROGRAMA PRINCIPAL #Lee S, T y las reglas del archivo archivo=open("suffix.in","r") s=archivo.readline().split(" ") S=s[0] T=s[1] NR=int(s[2]) reglas=[] for i in range(0,NR): s=archivo.readline().strip().split(" ") reglas+=[tuple(s)] archivo.close() #Genera el arbol de busqueda ab=Arbol(S) ab.aplicar_reglas(ab) #recorre el arbol de busqueda para generar las rutas que #culminan en T rutas=[] ab.recorrer_arbol([]) imprimir_rutas()
Este script requiere de un archivo en donde se coloca la cadena inicial S, la cadena final T y el número de reglas (NR) en la primera línea, separados por espacio. Las siguientes NR líneas del archivo contienen las reglas gramaticales. Para probar el script, tome las siguientes líneas y cree con ellas un archivo llamado "suffix.in" en el mismo directorio que "suffix.py" (el script de arriba):
AA CB 6
C B
AB BA
AA CC
CC BB
C A
A B
C B
AB BA
AA CC
CC BB
C A
A B
Con esta data de entrada en el archivo "suffix.in", el programa generaría la siguiente salida:
Transformacion 1 :
AA --> CC Regla 3 : ( AA --> CC )
--> CB Regla 1 : ( C --> B )
Transformacion 2 :
AA --> CC Regla 3 : ( AA --> CC )
--> CA Regla 5 : ( C --> A )
--> CB Regla 6 : ( A --> B )
Guao, nunca me llegue a imaginar que se realizara asi. Ya veo que debo aprender muuucho mas.
ResponderEliminar