Implementieren Sie einen deterministischen endlichen Automaten in Python, um Vielfache von 3 zu bestimmen

Die automata-lib-Bibliothek erleichtert die Implementierung von Automutons in Python.

Was ist in diesem Artikel zu tun?

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. mod3dfa.png

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.

Umgebung

OS

Python-Version

Python 3.8.1

Bibliothek zu verwenden

automata-lib automata-lib funktioniert mit Python 3.4 und höher.

Umwelt schaffen

Die Umgebung wurde mit pipenv gebaut.

$ pipenv --python 3.8
$ pipenv install automata-lib
$ pipenv shell

Ausführungsbeispiel

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.

Akzeptiertes Beispiel

$ ./modulo_three.py 12
12
Result: Accepted
Transitions
q0
q1
q0
q0
q0

Beispiele für Ablehnung

$ ./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)

Erläuterung

Definition des Automaten

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.

Führen Sie automuton aus

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)

Code

Sie finden es hier. MIT-Lizenz. https://github.com/bateleurX/qiita-modulo_three

Recommended Posts

Implementieren Sie einen deterministischen endlichen Automaten in Python, um Vielfache von 3 zu bestimmen
So bestimmen Sie die Existenz eines Selenelements in Python
Ich habe versucht, Trumps Kartenspiel in Python zu implementieren
Ich habe versucht, einen Pseudo-Pachislot in Python zu implementieren
So entwickeln Sie in einer virtuellen Python-Umgebung [Memo]
So erhalten Sie eine Liste der integrierten Ausnahmen für Python
Eine Geschichte über den Versuch, private Variablen in Python zu implementieren.
Ich habe versucht, das Blackjack of Trump-Spiel mit Python zu implementieren
Versuchen Sie, die Thread-Liste der Nachrichten (Abneigung) mit Python zu erhalten.
So überprüfen Sie die Speichergröße einer Variablen in Python
So überprüfen Sie die Speichergröße eines Wörterbuchs in Python
Ich habe versucht, ein missverstandenes Gefangenendilemma in Python zu implementieren
Ich habe versucht, PLSA in Python zu implementieren
Ich habe versucht, Permutation in Python zu implementieren
Zeigen Sie eine Liste der Alphabete in Python 3 an
Ich habe versucht, PLSA in Python 2 zu implementieren
Ich habe versucht, ADALINE in Python zu implementieren
Ich habe versucht, PPO in Python zu implementieren
Finden Sie (deterministische endliche) direkte Produktautomaten in Python
Projekt Euler # 1 "Vielfaches von 3 und 5" in Python
So senden Sie ein visualisiertes Bild der in Python erstellten Daten an Typetalk
[Python] So fügen Sie eine beliebige Anzahl von Standardeingaben in die Liste ein
Ich möchte einen Teil der Excel-Zeichenfolge mit Python einfärben
Python-Code zur Bestimmung der monatlichen Signale für Investitionen mit relativer Stärke
So formatieren Sie eine Liste von Wörterbüchern (oder Instanzen) in Python
Ich habe ein Programm erstellt, um die Größe einer Datei mit Python zu überprüfen
[Python] [Word] [python-docx] Versuchen Sie, mit python-docx eine Vorlage für einen Wortsatz in Python zu erstellen
Zeichnen Sie in Python ein Diagramm einer quadratischen Funktion
Versuchen Sie, Oni Mai Tsuji Miserable mit Python zu implementieren
So löschen Sie einen Taple in einer Liste (Python)
Einbetten von Variablen in Python-Strings
Zusammenfassung zum Importieren von Dateien in Python 3
Holen Sie sich den Aufrufer einer Funktion in Python
Ich möchte mit Python ein Fenster erstellen
So implementieren Sie Shared Memory in Python (mmap.mmap)
So erstellen Sie eine JSON-Datei in Python
Kopieren Sie die Liste in Python
Zusammenfassung der Verwendung von MNIST mit Python
Umschreiben von Elementen in einer Listenschleife (Python)
Eine clevere Möglichkeit zur Zeitverarbeitung mit Python
So implementieren Sie eine Verlaufsauswahl in Houdini
Schritte zum Entwickeln einer Webanwendung in Python
Ich habe versucht, TOPIC MODEL in Python zu implementieren
So fügen Sie Python ein Modul hinzu, das Sie in Julialang eingefügt haben
So benachrichtigen Sie Discord-Kanäle in Python
Machen Sie mit Python eine Joyplot-ähnliche Handlung von R.
Ausgabe in Form eines Python-Arrays
Lassen Sie uns einen Teil des maschinellen Lernens mit Python berühren
[Python] Wie zeichnet man mit Matplotlib ein Histogramm?
Ich habe versucht, eine selektive Sortierung in Python zu implementieren
Aufgezeichnete Umgebung für die Datenanalyse mit Python
Verschiedene Möglichkeiten, die letzte Zeile einer CSV-Datei in Python zu lesen
So übergeben Sie das Ergebnis der Ausführung eines Shell-Befehls in einer Liste in Python
Eine verwirrende Geschichte mit zwei Möglichkeiten, XGBoost in Python + zu implementieren
Geben Sie Python ein, um die algebraische Erweiterung zu implementieren (1) ~ Monoide, Gruppen, Ringe, ganzzahlige Ringe ~
Ich habe versucht, ein scheinbar Windows-Snipper-Tool mit Python zu implementieren
So erhalten Sie mit Python eine Liste der Dateien im selben Verzeichnis