class DFA: def __init__(self): self.states = {} self.sigma = Alphabet() self.delta = list() self.initial_state = None self.final_state = list() def add_states(self, state): if isinstance(state, State) and state.name not in self.states: self.states[state.name] = state return True else: return False def add_alphabet(self, symbols): for s in symbols: self.sigma.add_symbol(s) def add_initial_state(self, init_state): if init_state in self.states: self.initial_state = init_state else: print("O estado inicial nao pertence ao conjunto de estados") def add_final_state(self, *elements): for x in elements: if x in self.states: self.final_state.append(x) else: print("O estado final nao pertence ao conjunto de estados") def add_transitions(self): destiny_state = None for i in self.states: for j in self.sigma.symbols: while (True): destiny_state = input( f"Estando no estado: {i} e simbolo: {j}. Qual o seu estado destino? " ) if destiny_state in self.states: self.delta.append(Transition(i, j, destiny_state)) break else: print("Digite novamente (um estado conhecido)!") self.delta = self.delta def execute_transition(self, string_w): state_origin = self.initial_state state_destiny = list() for w in string_w: for x in range(len(self.delta)): if w == self.delta[x].symbol and (state_origin in self.delta[x].origin): print( f"origin: {self.delta[x].origin} - symbol: {self.delta[x].symbol} - destiny: {self.delta[x].destiny}" ) state_destiny = (self.delta[x].destiny) state_origin = state_destiny break print(f"A string digitada chegou ao estado final: {state_destiny}") if state_destiny in self.final_state: print("Aceita") else: print("Rejeita") def __str__(self): print(f"\nEstado inicial: {self.initial_state}") print(f"Estado final: {self.final_state}") print("\nFunção de transição (Q x E) -> Q") for x in range(len(self.delta)): print( f"origin: {self.delta[x].origin} - symbol: {self.delta[x].symbol} - destiny: {self.delta[x].destiny}" ) def print_dfa(self): for key in sorted(list(self.states.keys())): print(key + str(self.states[key].neighbors))
class NFA: def __init__(self): self.states = State() self.sigma = Alphabet() self.delta = list() self.delta_nfa = list() self.initial_state = None self.final_state = list() def add_states(self, states): for s in states: self.states.add_states(s) def add_alphabet(self, symbols): for s in symbols: self.sigma.add_symbol(s) def add_initial_state(self, init_state): states = self.states.get_states() if init_state in states: self.initial_state = init_state else: print("O estado inicial nao pertence ao conjunto de estados") def add_final_state(self, *elements): states = self.states.get_states() for x in elements: if x in states: self.final_state.append(x) else: print("O estado final nao pertence ao conjunto de estados") def get_transitions_nfa(self): nfa = pd.read_csv("nfa.csv", header=None) aux = [] for i, values in nfa.iteritems(): self.delta = (nfa[i].values[0:]) for x in range(len(self.delta)): aux = self.delta[x] self.delta[x] = self.delta[1:] origin, symbol, destiny = aux self.delta_nfa.append(Transition(origin, symbol, destiny)) def execute_transition(self, string_w): state_origin = self.initial_state state_destiny = list() for w in string_w: for x in range(len(self.delta)): if w == self.delta_nfa[x].symbol and ( state_origin in self.delta_nfa[x].origin): print( f"origin: {self.delta_nfa[x].origin} - symbol: {self.delta_nfa[x].symbol} - destiny: {self.delta_nfa[x].destiny}" ) state_destiny = (self.delta_nfa[x].destiny) state_origin = state_destiny print(f"A string digitada chegou ao estado final: {state_destiny}") if state_destiny in self.final_state: print("Aceita") else: print("Rejeita") def __str__(self): print(f"Estado inicial: {self.initial_state}") print(f"Estado final: {self.final_state}") def __delta__(self): print("Função de transição (Q x E) -> Q") for x in range(len(self.delta)): print( f"origin: {self.delta_nfa[x].origin} - symbol: {self.delta_nfa[x].symbol} - destiny: {self.delta_nfa[x].destiny}" )