Ejemplo n.º 1
0
	def Union_Especial (self, automatas):
		#Se crea un AFN vacío para guardar el resultado
		Nuevo_Automata = AFN ()
		#Se crea un nuevo estado inicial
		Nuevo_Inicio = Estado ()
		for a in automatas:
			#Se agregan todos los estados al nuevo automata
			Nuevo_Automata.Estados = (Nuevo_Automata.Estados).union (a.Estados)
			#Se crea el alfabeto del nuevo automata con la union de alfabetos de los otros automatas
			Nuevo_Automata.Alfabeto = (Nuevo_Automata.Alfabeto).union (a.Alfabeto)
			#Se agrega una transición del nuevo estado inicial a los estados iniciales de los automatas
			Nuevo_Inicio.AddTransition (a.Estado_Inicial, '')
			
		#Agregar el nuevo estado de inicio al conjunto de estados del nuevo AFN
		(Nuevo_Automata.Estados).add (Nuevo_Inicio)
		#Se asigna el nuevo estado inicial del AFN
		Nuevo_Automata.Estado_Inicial = Nuevo_Inicio
		token = 10
		for a in automatas:
			for e in a.Estados_Aceptacion:
				#Se agregan los estados de aceptación al conjunto de estado de aceptación de los AFN
				(Nuevo_Automata.Estados_Aceptacion).add (e)
				#Se asigna un token distinto a cada estado de aceptación
				e.Token = token
				token = token + 10
		return Nuevo_Automata
Ejemplo n.º 2
0
def read_line_first(line):
	global i_line, has_changed, Estados, pos_estado, pos_estado_atual, all_have_eps
	i_line = 1
	estado = splitNT(line)
	if exists_estado(estado):
		pos_estado_atual = search_pos_estado(estado)
	else:
		Est = Estado()
		Est.nome = estado
		Estados.append(Est)
		pos_estado_atual = len(Estados)-1

	while (line[i_line] == ' ' or line[i_line] == '>' or line[i_line] == ':'
			or line[i_line] == '='):
		i_line += 1

	while line[i_line] != '\n':
		while line[i_line] != ' ' and line[i_line] != '\n':
			if read_production_first(line) == True:
				break

		while line[i_line] != '|':
			if line[i_line] == '\n': return #Current line is over, end function
			i_line += 1
		i_line += 1
		while line[i_line] == ' ':
			i_line += 1
Ejemplo n.º 3
0
    def sucesores(self, state):
        actual = state.get_posicionActual  # Obtenemos la posicion actual y la marcamos como el origen
        sucesores = []  # Creamos una lista vacia de sucesores
        listadenodos = self.graph.adyacentesnodo(actual)

        #Ver cuando listadenodos es NoneType
        if listadenodos is None:
            return sucesores

        for sucesor in listadenodos:  # Para cada nodo:
            destino = sucesor[1]  # marcamos el sucesor como destino
            #accM = 'Ir por ' + self.graph.get_nombrecalle(actual, destino)
            accM = '(' + self.graph.get_nombrecalle(actual, destino) + ')'
            costAcci = float(sucesor[3])
            #costAcci = self.graph.get_coste(actual, destino)  # buscamos el coste en el grafo entre esos dos nodos
            try:
                listadenodos.remove(actual)
            except ValueError:
                pass
            estadoNuevoM = Estado(
                destino, list.copy(state.listaNodos)
            )  # Creamos el nuevo estado desde el nodo destino
            actual = destino  # Cambiamos la posicion actual
            sucesores.append([
                accM, estadoNuevoM, costAcci
            ])  # Añadimos el sucesor a la lista en el formato pedido
        return sucesores
Ejemplo n.º 4
0
	def Unir_AFN (self, AFN_2):
		#Se crea un nuevo estado inicial
		Nuevo_Inicio = Estado ()
		#Se crea un nuevo estado final
		Nuevo_Fin = Estado ()
		#Se agrega una transición del nuevo estado inicial al estado inicial del AFN_1
		Nuevo_Inicio.AddTransition (self.Estado_Inicial, '')
		#Se agrega una transición del nuevo estado inicial al estado inicial del AFN_2
		Nuevo_Inicio.AddTransition (AFN_2.Estado_Inicial, '')
		#Agregar una transición con epsilon de todos los estados finales al nuevo fin
		for e in self.Estados_Aceptacion:
			e.AddTransition (Nuevo_Fin, '')
			e.Estado_Aceptacion = False
		#Agregar una transición con epsilon de todos los estados finales al nuevo fin
		for e in AFN_2.Estados_Aceptacion:
			e.AddTransition (Nuevo_Fin, '')
			e.Estado_Aceptacion = False
		#Eliminar los estados de aceptación de ambos automatas
		self.Estados_Aceptacion = set ()
		AFN_2.Estados_Aceptacion = set ()
		#Agregar el nuevo estado de inicio al conjunto de estados del nuevo AFN
		self.Estados.add (Nuevo_Inicio)
		#Agregar el nuevo estado final al conjunto de estados del nuevo AFN
		self.Estados.add (Nuevo_Fin)
		#Se hace la union de alfabetos
		self.Estados = self.Estados.union (AFN_2.Estados)
		#Se asigna el estatus de estado de aceptación al nuevo estado final
		Nuevo_Fin.Estado_Aceptacion = True
		#Se agrega el nuevo estado final al conjunto de estados de aceptación
		self.Estados_Aceptacion.add (Nuevo_Fin)
		#Se actualiza el estado inicial del AFN
		self.Estado_Inicial = Nuevo_Inicio
		#Se actualiza el alfabeto del AFN con la unión de los alfabetos
		self.Alfabeto = (self.Alfabeto).union (AFN_2.Alfabeto)
		return self
Ejemplo n.º 5
0
	def Cerradura_Opcional (self):
		#Se crea un nuevo estado inicial
		Nuevo_Inicio = Estado ()
		#Se crea un nuevo estado final
		Nuevo_Fin = Estado ()
		#Se agrega una transición del nuevo estado inicial al estado inicial del AFN
		Nuevo_Inicio.AddTransition (self.Estado_Inicial, '')
		#Se agrega una transición del nuevo estado inicial al nuevo estado final
		Nuevo_Inicio.AddTransition (Nuevo_Fin, '')
		#Agregar una transición con epsilon de todos los estados finales al nuevo estado final
		for e in self.Estados_Aceptacion:
			e.AddTransition (Nuevo_Fin, '')
			e.Estado_Aceptacion = False
		#Eliminar los estados de aceptación del AFN
		self.Estados_Aceptacion = set ()
		#Agregar el nuevo estado de inicio al conjunto de estados del nuevo AFN
		self.Estados.add (Nuevo_Inicio)
		#Agregar el nuevo estado final al conjunto de estados del nuevo AFN
		self.Estados.add (Nuevo_Fin)
		#Se asigna el estatus de estado de aceptación al nuevo estado final
		Nuevo_Fin.Estado_Aceptacion = True
		#Se agrega el nuevo estado final al conjunto de estados de aceptación
		self.Estados_Aceptacion.add (Nuevo_Fin)
		#Se actualiza el estado inicial del AFN
		self.Estado_Inicial = Nuevo_Inicio
		return self
Ejemplo n.º 6
0
 def creaEdo(self, raiz, token):
     """Crea un estado y lo agrega al AFN"""
     e = Estado(str(len(self.K)), raiz, token)
     self.K.append(e)
     if e.Raiz:
         self.S = e
     if e.Token > -1:
         self.Z = e
     return e
Ejemplo n.º 7
0
 def agregar_estado(self, nombre):
     if self.alfabeto_vacio and self.estados_vacio:
         nuevo_estado = Estado.Estado(nombre)
         self.estados.append(nuevo_estado)
     else:
         for x in self.alfabeto:
             if x == nombre:
                 print(
                     "Este estado ya esta ingresado como parte del alfabeto"
                 )
                 input("Presione enter")
                 os.system("cls")
                 return
         for y in self.estados:
             if y.nombre == nombre:
                 print("Este estado es repetido")
                 input("Presione enter")
                 os.system("cls")
                 return
         nuevo_estado = Estado.Estado(nombre)
         self.estados.append(nuevo_estado)
Ejemplo n.º 8
0
 def __init__(self, simbolo=''):
     #Si no se recibe ningun simbolo, se inicializa todo a vacío
     if (len(simbolo) == 0):
         #Inicialización del estado inicial a 'null'
         self.Estado_Inicial = None
         #El conjunto del alfabeto se inicializa como un conjunto vacío
         self.Alfabeto = set()
         #El conjunto de estados se inicializa como un conjunto vacío
         self.Estados = set()
         #El conjunto de estados de aceptación se inicializa como un conjunto vacío
         self.Estados_Aceptacion = set()
     #Si se recibe un simbolo, se crea un AFN básico
     else:
         #Se crea un estado inicial de tipo Estado como atributo del AFN
         self.Estado_Inicial = Estado()
         #Se crea un estado final de tipo Estado
         Estado_Final = Estado()
         #Se cambia el estado de la bandera a true para saber que es estado final
         Estado_Final.Estado_Aceptacion = True
         #El conjunto del alfabeto se inicializa como un conjunto vacío
         self.Alfabeto = set()
         #Se agrega el símolo al alfabeto del AFN (si es un rango, se añaden todos los simbolos)
         if (len(simbolo) == 1):
             self.Alfabeto.add(simbolo)
             #Se agrega una transición del estado inicial al estado final con el caracter 'simbolo'
             (self.Estado_Inicial).AddTransition(Estado_Final, simbolo)
         else:
             (self.Estado_Inicial).AddTransition(Estado_Final, simbolo[0],
                                                 simbolo[2])
             for i in range(ord(simbolo[0]), ord(simbolo[2]) + 1):
                 self.Alfabeto.add(chr(i))
         #El conjunto de estados se inicializa como un conjunto vacío
         self.Estados = set()
         #Se agregan los estados al conjunto de Estados del AFN
         self.Estados.add(self.Estado_Inicial)
         self.Estados.add(Estado_Final)
         #El conjunto de estados de aceptación se inicializa como un conjunto vacío
         self.Estados_Aceptacion = set()
         #Se agrega el estado final del AFN como un estado de aceptación
         self.Estados_Aceptacion.add(Estado_Final)
Ejemplo n.º 9
0
    def __init__(self, file):
        with open(file) as f:  # Leemos el archivo json
            data = json.load(f)
        graphmlfile = data[
            "graphlmfile"] + '.xml'  # Cogemos el nombre del fichero para construir el grafo y
        # arreglamos el nombre añadiendo al final ".xml" que es como de verdad se llaman los ficheros

        nodoini = data['IntSt']['node']  # Capturamos el nodo inicial
        nodosproblem = data['IntSt'][
            'listNodes']  # Capturamos los nodos que quedan por recorrer
        ide = data['IntSt']['id']
        self.estadoinicial = Estado(
            nodoini, nodosproblem,
            ide)  # Guardamos el estado inicial del problema
        self.espacioDeEstados = EspacioEstados(graphmlfile)
Ejemplo n.º 10
0
    def __init__(self):

        # Insere o primeiro estado na fila de execução, sendo o estado inicial do problema (3 Canibais, 3 Missionarios, 1 Barco na margem Esquerda)
        self.fila_execucao = [Estado(3, 3, 1)]
        self.solucao = None