Die automata-lib-Bibliothek erleichtert die Implementierung von Automutons in Python.
Verwenden Sie den deterministischen endlichen Automaten in Python, um festzustellen, ob eine Binärzahl durch 3 teilbar ist. Es ist ein Beispiel, das oft in Lehrbüchern zu finden ist. Wenn die Eingabe ein Vielfaches von 3 ist, wird sie akzeptiert, andernfalls wird sie abgelehnt. Im Zustandsübergangsdiagramm sieht es so aus.
Wenn es sich um eine Hausaufgabe an einer Universität handelt, sollten Sie sie selbst implementieren. Hier werden wir sie jedoch mit der automata-lib-Bibliothek implementieren.
OS
Python 3.8.1
automata-lib automata-lib funktioniert mit Python 3.4 und höher.
Die Umgebung wurde mit pipenv gebaut.
$ pipenv --python 3.8
$ pipenv install automata-lib
$ pipenv shell
Der eingegebene numerische Wert (Dezimalzahl) wird als erstes Argument angegeben. Wenn es durch 3 teilbar ist, wird es als "Ergebnis: Akzeptiert" ausgegeben, und wenn es nicht durch 3 teilbar ist, wird es als "Ergebnis: Abgelehnt" ausgegeben. Danach wird auch der Übergang ausgegeben. Es ist bequem.
$ ./modulo_three.py 12
12
Result: Accepted
Transitions
q0
q1
q0
q0
q0
$ ./modulo_three.py 11
11
Result: Rejected
Transitions
q0
q1
q2
q2
q2
Traceback (most recent call last):
File "./modulo_three.py", line 40, in <module>
for i in modulo.read_input_stepwise(entry):
File "/home/***/.local/share/virtualenvs/qiita-modulo_three-AeTt0v42/lib/python3.8/site-packages/automata/fa/dfa.py", line
105, in read_input_stepwise
self._check_for_input_rejection(current_state)
File "/home/***/.local/share/virtualenvs/qiita-modulo_three-AeTt0v42/lib/python3.8/site-packages/automata/fa/dfa.py", line
87, in _check_for_input_rejection
raise exceptions.RejectionException(
automata.base.exceptions.RejectionException: the DFA stopped on a non-final state (q2)
Die Implementierung des deterministischen endlichen Automaten verwendet die DFA-Klasse.
modulo_three.py
modulo = DFA(
states = {'q0', 'q1', 'q2'},
input_symbols = {'0', '1'},
transitions = {
'q0': {'0': 'q0', '1': 'q1'},
'q1': {'0': 'q2', '1': 'q0'},
'q2': {'0': 'q1', '1': 'q2'}
},
initial_state='q0',
final_states={'q0'}
)
--state
definiert den Zustand dieses Automaten.
input_symbols
.Wenn Sie einfach feststellen möchten, ob es akzeptiert wird, verwenden Sie die Methode "accept_input". Wenn es akzeptiert wird, gibt es "True" zurück, und wenn es abgelehnt wird, gibt es "False" zurück. Beachten Sie, dass das Argument der Methode "accept_input" eine binäre Zeichenfolge ist.
>>> modulo.accepts_input('10')
False
>>> modulo.accepts_input('110')
True
Wenn Sie sehen möchten, wie es übergeht, verwenden Sie die Methode "read_input_stepwise". Diese Methode gibt den Übergang im Generator zurück. Wenn es abgelehnt wird, wird eine "RejectionException" -Ausnahme zurückgegeben.
Akzeptiertes Beispiel
>>> for i in modulo.read_input_stepwise('110'):
... print(i)
...
q0
q1
q0
q0
Beispiele für Ablehnung
>>> for i in modulo.read_input_stepwise('10'):
... print(i)
...
q0
q1
q2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/***/.local/share/virtualenvs/qiita-modulo_three-AeTt0v42/lib/python3.8/site-packages/automata/fa/dfa.py", line
105, in read_input_stepwise
self._check_for_input_rejection(current_state)
File "/home/***/.local/share/virtualenvs/qiita-modulo_three-AeTt0v42/lib/python3.8/site-packages/automata/fa/dfa.py", line
87, in _check_for_input_rejection
raise exceptions.RejectionException(
automata.base.exceptions.RejectionException: the DFA stopped on a non-final state (q2)
Sie finden es hier. MIT-Lizenz. https://github.com/bateleurX/qiita-modulo_three
Recommended Posts