Professional Documents
Culture Documents
APP Assignment
APP Assignment
ABHISESHA
KUMAARA
REG NO :
RA2211026010487
SECTION : Z2
Week 13- Tutorial Assignment
def add_state(self,
state):
self.states.add(state)
def set_start_state(self, state):
self.start_state = state
self.add_state(state)
def add_accept_state(self, state):
self.accept_states.add(state)
self.add_state(state)
def add_transition(self, from_state, symbol, to_state):
if from_state not in self.states:
self.add_state(from_state)
if to_state not in self.states:
self.add_state(to_state)
if (from_state, symbol) in self.transitions:
self.transitions[(from_state, symbol)].add(to_state)
else:
self.transitions[(from_state, symbol)] = {to_state}
def is_accepted(self, input_string):
current_states = {self.start_state}
for symbol in input_string:
next_states = set()
for state in current_states:
if (state, symbol) in self.transitions:
next_states.update(self.transitions[(state, symbol)])
current_states = next_states
return bool(current_states.intersection(self.accept_states))
def add_state(self,
state):
self.states.add(state)
def set_start_state(self, state):
self.start_state = state
self.add_state(state)
def add_accept_state(self, state):
self.accept_states.add(state)
self.add_state(state)
current_states = next_states
return bool(current_states.intersection(self.accept_states))
def is_accepted_by_nfa(input_string):
nfa = NFA()
nfa.set_start_state(0)
nfa.add_accept_state(1)
nfa.add_accept_state(2)
nfa.add_transition(0, 'a', 1)
nfa.add_transition(0, 'b', 3)
nfa.add_transition(1, 'b', 2)
nfa.add_transition(3, 'a', 2)
return nfa.is_accepted(input_string)
def convert_nfa_to_dfa(nfa):
dfa = NFA()
• Initialize the DFA with the epsilon closure of the start state of
the NFA dfa_start_state = epsilon_closure({nfa.start_state})
dfa.set_start_state(tuple(sorted(dfa_start_state)))
• Create a queue to keep track of unprocessed DFA states
state_queue = [dfa_start_state]
while state_queue:
current_dfa_state = state_queue.pop(0)
for symbol in set(s for s, _ in nfa.transitions.keys() if s != ''):
next_states = set()
for nfa_state in current_dfa_state:
if (symbol, nfa_state) in nfa.transitions:
next_states.update(nfa.transitions[(symbol, nfa_state)])
epsilon_next_states = epsilon_closure(next_states)
if epsilon_next_states:
dfa_state = tuple(sorted(epsilon_next_states))
dfa.add_transition(current_dfa_state, symbol, dfa_state)
if dfa_state not in dfa.states:
dfa.states.add(dfa_state)
state_queue.append(dfa_state)
return dfa
self.transitions = {}
def add_state(self, state):
self.states.add(state)
def set_start_state(self, state):
self.start_state = state
self.add_state(state)
def add_accept_state(self, state):
self.accept_states.add(state)
self.add_state(state)
def add_transition(self, from_state, symbol, to_state):
if from_state not in self.states:
self.add_state(from_state)
if to_state not in self.states:
self.add_state(to_state)
self.transitions[(from_state, symbol)] = to_state
def is_accepted(self, input_string):
current_state = self.start_state
for symbol in input_string:
if (current_state, symbol) in self.transitions:
current_state = self.transitions[(current_state, symbol)]
else:
return False
return current_state in self.accept_states
• Develop a Python function that takes an NFA and returns the set of
states that can be reached from a given state on a specific input symbol.
class NFA:
def __init__(self):
self.states = set()
self.start_state = None
self.accept_states =
set() self.transitions =
{}
• Example usage:
nfa = NFA()
• ... (Define your NFA)
start_state = 'A' # Replace with the actual start state
input_symbol = 'a' # Replace with the desired input symbol
reachable_states = get_states_on_input_symbol(nfa,
input_symbol, {start_state})
print("States reachable on input symbol", input_symbol,
"from state", start_state, "are:", reachable_states)