-
Notifications
You must be signed in to change notification settings - Fork 0
/
AFNToAFD.py
82 lines (72 loc) · 3.22 KB
/
AFNToAFD.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
from pprint import pprint
class AutomataNoDeterminista(object):
def __init__(self, **kargs):
self.estados = kargs['states']
self.simbolosDeEntrada = kargs['input_symbols']
self.transiciones = kargs['transitions']
self.estadoInicial = kargs['initial_state']
self.estadosFinales = kargs['final_states']
def getEstados(self):
return self.estados
def getSimbolosDeEntrada(self):
return self.simbolosDeEntrada
def getTransiciones(self):
return self.transiciones
def getEstadoInicial(self):
return self.estadoInicial
def getEstadosFinales(self):
return self.estadosFinales
def getTransicion(self, estado):
return self.transiciones[estado]
class CambiarDeAutomata(object):
def __init__(self, automataNoDeterminista):
self.automataNoDeterminista = automataNoDeterminista
self.estadoInicial = self.getClausura(self.automataNoDeterminista.getEstadoInicial())
self.estados = [self.estadoInicial]
self.simbolosDeEntrada = self.automataNoDeterminista.getSimbolosDeEntrada()
self.transiciones = {}
self.estadosFinales = set()
estadosSinRevisar = self.estados.copy()
while estadosSinRevisar:
estadoSinRevisar = estadosSinRevisar[0]
transiciones = {}
for simbolo in self.simbolosDeEntrada:
transiciones[simbolo] = set()
for estado in estadoSinRevisar:
transicion = self.automataNoDeterminista.getTransicion(estado)
if simbolo in transicion.keys():
for estadoEnTransicion in transicion[simbolo]:
transiciones[simbolo] |= self.getClausura(estadoEnTransicion)
if transiciones[simbolo] not in self.estados:
self.estados.append(transiciones[simbolo])
estadosSinRevisar.append(transiciones[simbolo])
self.transiciones[f'{estadoSinRevisar}'] = transiciones
estadosSinRevisar.pop(0)
for estado in self.estados:
if any([estadoFinalInAutomata in estado for estadoFinalInAutomata in self.automataNoDeterminista.getEstadosFinales()]):
self.estadosFinales |= estado
# print(f'estados: {self.estados}')
# print(f'simbolos de entrada: {self.simbolosDeEntrada}')
# print('transiciones:')
# pprint(self.transiciones)
# print(f'estadoInicial: {self.estadoInicial}')
# print(f'estados finales: {self.estadosFinales}')
pprint(self.__dict__)
def getClausura(self, estado):
transiciones = self.automataNoDeterminista.getTransicion(estado)
if '' not in transiciones.keys():
return {estado}
else:
return {estado} | transiciones['']
if __name__ == '__main__':
CambiarDeAutomata(AutomataNoDeterminista(
states={'q0', 'q1', 'q2'},
input_symbols={'0','1'},
transitions={
'q0': {'0': {'q0','q1'}, '1': {'q0'}},
'q1': {'1': {'q2'}},
'q2': {},
},
initial_state='q0',
final_states={'q2'}
))