====== 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|}}