A Python library for simulating and visualizing finite automata.
Documentation: https://rohaquinlop.github.io/automathon/
Source Code: https://github.com/rohaquinlop/automathon
PyPI: https://pypi.org/project/automathon/
- Python >= 3.10
- You also need to install Graphviz on your computer (download page, installation procedure for Windows, archived versions).Make sure that the directory containing the dot executable is on your systems’ path.
pip install automathon
pip install automathon --upgrade
Here is are some examples about what you can do with automathon, you can check the documentation about Deterministic Finite Automata and Non-Deterministic Finite Automata to know more about the functions and methods that are available.
This image was created using automathon.
Let's create the previous automata using the library:
from automathon import DFA
q = {'q0', 'q1', 'q2'}
sigma = {'0', '1'}
delta = { 'q0' : {'0' : 'q0', '1' : 'q1'},
'q1' : {'0' : 'q2', '1' : 'q0'},
'q2' : {'0' : 'q1', '1' : 'q2'}
}
initial_state = 'q0'
f = {'q0'}
automata = DFA(q, sigma, delta, initial_state, f)
automata.is_valid() # True
In this case, the automata is valid but if it wasn't, the library would raise an exception with the error message.
Errors that the library can raise are:
-
SigmaError:
- The automata contain an initial state, or a final state that's not defined in Q.
- The automata contain a delta transition that's not defined in Q nor Sigma.
-
InputError:
- The automata is trying to consume a letter that's not defined in sigma.
automata.accept("001001") # True
automata.accept("00100") # False
not_automata = automata.complement()
not_automata.accept("00100") #True
Note that this function returns a new automata, it doesn't modify the original one.
For both, DFA and NFA, the view method enables to visualize the automaton, receives as parameter a String as the file name for the png and svg files.
More information about the graphviz attributes here.
# Default styling
automata.view("DFA Visualization")
# If you want to add custom styling, you can use the following
automata.view(
file_name="DFA Custom Styling",
node_attr={'fontsize': '20'},
edge_attr={'fontsize': '20pt'}
)
If you want to explore more about the functions and methods of the DFA class, you can check the DFA documentation. And if you want to know more about the NFA class, you can check the NFA documentation.
Image taken from: r9paul.org
from automathon import NFA
## Epsilon Transition is denoted by '' -> Empty string
q = {'q1', 'q2', 'q3', 'q4'}
sigma = {'0', '1'}
delta = {
'q1' : {
'0' : {'q1'},
'1' : {'q1', 'q2'}
},
'q2' : {
'0' : {'q3'},
'' : {'q3'}
},
'q3' : {
'1' : {'q4'},
},
'q4' : {
'0' : {'q4'},
'1' : {'q4'},
},
}
initial_state = 'q1'
f = {'q4'}
automata = NFA(q, sigma, delta, initial_state, f)
automata.is_valid() # True
automata.accept("0000011") #True
automata.accept("000001") #False
not_automata = automata.complement()
not_automata.accept("000001") #True
# Default styling
automata.view("NFA Visualization")
# If you want to add custom styling, you can use the following
automata.view(
file_name="NFA Custom Styling",
node_attr={'fontsize': '20'},
edge_attr={'fontsize': '20pt'}
)
This project is licensed under the terms of the MIT license.