def build_basic_struct(value): state1 = 1 state2 = 2 basic = Automata() basic.set_start_state(state1) basic.add_final_states(state2) basic.add_transitions(state1, state2, value) return basic
def dot_construct(automata_1, automata_2): [automata_1, m1] = automata_1.copy(1) [automata_2, m2] = automata_2.copy(m1) state1 = 1 state2 = m2 - 1 dot = Automata() dot.set_start_state(state1) dot.add_final_states(state2) dot.add_transition(automata_1.final_states[0], automata_2.start_state, Automata.empty()) dot.add_transitions(automata_1.transitions) dot.add_transitions(automata_2.transitions) return dot
def build_plus_struct(a: Automata, b: Automata): a, m1 = a.new_build_from_number(2) b, m2 = b.new_build_from_number(m1) plus = Automata() plus.set_start_state(1) plus.add_final_states(m2) plus.add_transitions(plus.start_state, a.start_state, Automata.EPSILON) plus.add_transitions(plus.start_state, b.start_state, Automata.EPSILON) plus.add_transitions(a.final_states[0], plus.final_states[0], Automata.EPSILON) plus.add_transitions(b.final_states[0], plus.final_states[0], Automata.EPSILON) plus.add_transition_dict(a.transitions) plus.add_transition_dict(b.transitions) return plus
def star_construct(automata_1): [automata_1, m1] = automata_1.copy(2) state1 = 1 state2 = m1 star = Automata() star.set_start_state(state1) star.add_final_states(state2) star.add_transition(star.start_state, automata_1.start_state, Automata.empty()) star.add_transition(star.start_state, star.final_states[0], Automata.empty()) star.add_transition(automata_1.final_states[0], star.final_states[0], Automata.empty()) star.add_transition(automata_1.final_states[0], automata_1.start_state, Automata.empty()) star.add_transitions(automata_1.transitions) return star
def build_dot_struct(a: Automata, b: Automata): a, m1 = a.new_build_from_number(1) b, m2 = b.new_build_from_number(m1) dot = Automata() dot.set_start_state(1) dot.add_final_states(m2 - 1) # to remove eps-transitions trans = b.transitions.pop(b.start_state) for key, value in trans.items(): b.add_transitions(a.final_states[0], key, value) # with eps-transitions # #dot.add_transitions(a.final_states[0], b.start_state, Automata.EPSILON) dot.add_transition_dict(a.transitions) dot.add_transition_dict(b.transitions) return dot
def plus_construct(automata_1, automata_2): [automata_1, m1] = automata_1.copy(2) [automata_2, m2] = automata_2.copy(m1) state1 = 1 state2 = m2 plus = Automata() plus.set_start_state(state1) plus.add_final_states(state2) plus.add_transition(plus.start_state, automata_1.start_state, Automata.empty()) plus.add_transition(plus.start_state, automata_2.start_state, Automata.empty()) plus.add_transition(automata_1.final_states[0], plus.final_states[0], Automata.empty()) plus.add_transition(automata_2.final_states[0], plus.final_states[0], Automata.empty()) plus.add_transitions(automata_1.transitions) plus.add_transitions(automata_2.transitions) return plus
def build_star_struct(a: Automata): a, m1 = a.new_build_from_number(2) star = Automata() star.set_start_state(1) star.add_final_states(m1) star.add_transitions(star.start_state, a.start_state, Automata.EPSILON) star.add_transitions(star.start_state, star.final_states[0], Automata.EPSILON) star.add_transitions(a.final_states[0], star.final_states[0], Automata.EPSILON) star.add_transitions(a.final_states[0], a.start_state, Automata.EPSILON) star.add_transition_dict(a.transitions) return star
def _build_DFA(self, nfa: Automata): all_states = {} e_closure = {} count = 1 state1 = nfa.get_e_closure(nfa.start_state) e_closure[nfa.start_state] = state1 dfa = Automata(nfa.language) dfa.set_start_state(count) states = [[state1, count]] all_states[count] = state1 count += 1 while len(states): [state, from_index] = states.pop() for char in dfa.language: tr_states = nfa.get_transitions(state, char) for s in list(tr_states)[:]: if s not in e_closure: e_closure[s] = nfa.get_e_closure(s) tr_states = tr_states.union(e_closure[s]) if len(tr_states): if tr_states not in all_states.values(): states.append([tr_states, count]) all_states[count] = tr_states to_index = count count += 1 else: to_index = [k for k, v in all_states.items() if v == tr_states][0] dfa.add_transitions(from_index, to_index, char) for value, state in all_states.items(): if nfa.final_states[0] in state: dfa.add_final_states(value) return dfa