====== NFA Python Implementation ====== Consider the following encoding of an NFA: Example: 9 a b 4 0 EPS 1 0 a 5 0 b 0 1 EPS 2 1 b 3 5 2 EPS 4 2 a 2 3 3 a 3 3 b 3 4 EPS 4 7 8 5 a 6 5 b 5 6 EPS 7 6 a 6 7 EPS 6 7 b 4 You'll find in //nfa_skel.rar// a class that already reads the input and forms the NFA. Also, you can use the **graphvizNFA** method to get a graphical representation of the NFA, but you will have to install the //graphviz// library. pip install graphviz Implement (in Python) an NFA class that supports the following methods: 1. **step(configuration)** * returns a list with all reachable configurations in //one step//. * an epsilon transition is also considered a step. 2. **kstep(configuration, k)** * returns a list including all reachable configurations in //k steps// * an epsilon transition is also considered a step. * the final list contains only the states where we stopped, not the entire path to them. * if no transitions are available and $ k > 0 $, return an empty list 3. **accept(self, word: Word)** * True or False if the NFA accepts the given word. 4. **epsilonClosure(self, state: State)** * the set of all states where we can go from the current state by going through epsilon transitions 5. **emptyLanguage(self)** * True or False if the NFA's accepted language is the Empty Language {{:lfa:nfa_skel.rar|}}