Ver Mensaje Individual
  #2 (permalink)  
Antiguo 10/04/2010, 16:57
Avatar de razpeitia
razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: [Aporte] Autómatas en python

Ok ese día llego y hoy les muestro una muy reducida y mejorada versión de lo que era mi anterior código.

Código Python:
Ver original
  1. #coding: utf-8
  2.  
  3. class FSM:
  4.     def __init__(self):
  5.         self.__table = {}
  6.         self.__initial_states = []
  7.         self.__final_states = []
  8.  
  9.     def add_transition(self, state, symbol, new_states):
  10.         """
  11.            state = string
  12.            symbol = string, len = 1
  13.            new_states = list
  14.        """
  15.         if type(new_states) == str:
  16.             self.__table[state] = {symbol: [new_states]}
  17.         else:
  18.             self.__table[state] = {symbol: new_states}
  19.  
  20.     def add_initial_states(self, states):
  21.         """
  22.            state = list or str
  23.        """
  24.         if type(states) == str:
  25.             self.__initial_states.append(states)
  26.         else:
  27.             self.__initial_states.extend(states)
  28.  
  29.     def add_final_states(self, states):
  30.         """
  31.            states = list or str
  32.        """
  33.         if type(states) == str:
  34.             self.__final_states.append(states)
  35.         else:
  36.             self.__final_states.extend(states)
  37.            
  38.     def evaluate(self, string):
  39.         """
  40.            returns:
  41.                0 -> Match
  42.                1 -> No match
  43.        """
  44.         states = set(self.__initial_states)
  45.         for c in string:
  46.             new_states = set()
  47.             for state in states:
  48.                 try:
  49.                     self.__table[state][c]
  50.                 except KeyError:
  51.                     pass
  52.                 else:
  53.                     new_states.update(set(self.__table[state][c]))
  54.                
  55.                 try:
  56.                     self.__table[state][""]
  57.                 except KeyError:
  58.                     pass
  59.                 else:
  60.                     new_states.update(set(self.__table[state][""]))
  61.                    
  62.             states = new_states.copy()
  63.         return states
  64.  
  65.     def print_fsm(self):
  66.         print "Table:"
  67.         print self.__table
  68.         print "\nFinal States:"
  69.         print self.__final_states
  70.         print "\nInitial_states"
  71.         print self.__initial_states
  72.         print ""
  73.  
  74. fsm = FSM()
  75.  
  76. fsm.add_initial_states("q0")
  77.  
  78. fsm.add_transition("q0", "a", "q1")
  79. fsm.add_transition("q1", "a", "q1")
  80. fsm.add_transition("q2", "b", "q2")
  81.  
  82. fsm.add_final_states(("q1", "q0"))
  83.  
  84. fsm.print_fsm()
  85.  
  86. print fsm.evaluate("")
  87. print fsm.evaluate("a")
  88. print fsm.evaluate("aa")
  89. print fsm.evaluate("aaa")
  90. print fsm.evaluate("aaaa")
  91. print fsm.evaluate("aaaaa")
  92. print fsm.evaluate("aaaaaa")
  93. print fsm.evaluate("ba")

Faltan muchos detalles pero se los añadiré después.

Última edición por razpeitia; 10/04/2010 a las 17:54