Implémenter un automate fini déterministe en Python pour déterminer des multiples de 3

La bibliothèque automata-lib facilite l'implémentation d'automutons en Python.

Que faire dans cet article

Utilisez l'automate fini déterministe en Python pour déterminer si un nombre binaire est divisible par 3. C'est un exemple que l'on trouve souvent dans les manuels. Si l'entrée est un multiple de 3, elle sera acceptée, sinon elle sera rejetée. Cela ressemble à ceci dans le diagramme de transition d'état. mod3dfa.png

Si c'est un devoir universitaire, vous devez l'implémenter vous-même, mais ici nous allons l'implémenter avec la bibliothèque automata-lib.

environnement

OS

Version Python

Python 3.8.1

Bibliothèque à utiliser

automata-lib automata-lib fonctionne avec Python 3.4 et supérieur.

Construire l'environnement

L'environnement a été construit avec pipenv.

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

Exemple d'exécution

La valeur numérique d'entrée (nombre décimal) est donnée comme premier argument. S'il est divisible par 3, il sera affiché comme «Résultat: Accepté», et s'il n'est pas divisible par 3, il sera affiché comme «Résultat: Rejeté». Après cela, la transition est également sortie. C'est pratique.

Exemple accepté

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

Exemples de rejet

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

La description

Définition d'automate

L'implémentation de l'automate fini déterministe utilise la classe DFA.

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 définit l'état de cet automate. --ʻInput_symbols définit les symboles d'entrée. --Définissez une règle qui passe de chaque état à un autre avec des «transitions». Par exemple, en prenant «q0» comme exemple, si l'entrée est 0, elle passera à «q0», et si l'entrée est 1, elle passera à «q1». --Spécifiez l'état de départ avec ʻinitial_state. --Spécifiez l'état d'acceptation avec final_state.

Exécuter automuton

Si vous voulez simplement déterminer si elle est acceptée, utilisez la méthode ʻaccept_input. S'il est accepté, il renvoie «True», et s'il est rejeté, il renvoie «False». Notez que l'argument de la méthode ʻaccept_input est une chaîne binaire.

>>> modulo.accepts_input('10')
False
>>> modulo.accepts_input('110')
True

Si vous voulez voir comment il transite, utilisez la méthode read_input_stepwise. Cette méthode renvoie la transition dans le générateur. S'il est rejeté, il renvoie une exception RejectionException.

Exemple accepté


>>> for i in modulo.read_input_stepwise('110'):
...   print(i)
...
q0
q1
q0
q0

Exemples de rejet


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

Vous pouvez le trouver ici. Licence MIT. https://github.com/bateleurX/qiita-modulo_three

Recommended Posts

Implémenter un automate fini déterministe en Python pour déterminer des multiples de 3
Comment déterminer l'existence d'un élément sélénium en Python
J'ai essayé d'implémenter le jeu de cartes de Trump en Python
J'ai essayé d'implémenter un pseudo pachislot en Python
Comment développer dans un environnement virtuel Python [Memo]
Comment obtenir une liste d'exceptions intégrées pour python
Une histoire sur la tentative d'implémentation de variables privées en Python.
J'ai essayé d'implémenter le blackjack du jeu Trump en Python
Essayez d'obtenir la liste des fils du bulletin d'information (je n'aime pas) avec Python.
Comment vérifier la taille de la mémoire d'une variable en Python
Comment vérifier la taille de la mémoire d'un dictionnaire en Python
J'ai essayé de mettre en œuvre un jeu de dilemme de prisonnier mal compris en Python
J'ai essayé d'implémenter PLSA en Python
J'ai essayé d'implémenter la permutation en Python
Afficher une liste d'alphabets en Python 3
J'ai essayé d'implémenter PLSA dans Python 2
J'ai essayé d'implémenter ADALINE en Python
J'ai essayé d'implémenter PPO en Python
Trouver un automate de produit direct (fini déterministe) en Python
Projet Euler # 1 "Multiple de 3 et 5" en Python
Comment envoyer une image visualisée des données créées en Python à Typetalk
[Python] Comment mettre n'importe quel nombre d'entrées standard dans la liste
Je veux colorer une partie de la chaîne Excel avec Python
Code Python pour déterminer les signaux mensuels pour les investissements de force relative
Comment bien formater une liste de dictionnaires (ou d'instances) en Python
J'ai fait un programme pour vérifier la taille d'un fichier avec Python
[Python] [Word] [python-docx] Essayez de créer un modèle de phrase de mot en Python en utilisant python-docx
Dessiner un graphique d'une fonction quadratique en Python
Essayez d'implémenter Oni Mai Tsuji Miserable avec python
Comment effacer un taple dans une liste (Python)
Comment incorporer des variables dans des chaînes python
Résumé de la façon d'importer des fichiers dans Python 3
Récupérer l'appelant d'une fonction en Python
Je veux créer une fenêtre avec Python
Comment implémenter la mémoire partagée en Python (mmap.mmap)
Comment créer un fichier JSON en Python
Copiez la liste en Python
Résumé de l'utilisation de MNIST avec Python
Réécrire des éléments dans une boucle de listes (Python)
Une manière intelligente de chronométrer le traitement avec Python
Comment implémenter un sélecteur de dégradé dans Houdini
Étapes pour développer une application Web en Python
J'ai essayé d'implémenter TOPIC MODEL en Python
Pour ajouter un module à python que vous mettez dans Julialang
Comment notifier les canaux Discord en Python
Créez un tracé de R semblable à un joyplot avec python
Sortie sous la forme d'un tableau python
Touchons une partie de l'apprentissage automatique avec Python
[Python] Comment dessiner un histogramme avec Matplotlib
J'ai essayé d'implémenter le tri sélectif en python
Environnement enregistré pour l'analyse des données avec Python
Différentes façons de lire la dernière ligne d'un fichier csv en Python
Comment passer le résultat de l'exécution d'une commande shell dans une liste en Python
Une histoire déroutante avec deux façons d'implémenter XGBoost en Python + notes générales
Tapez Python pour implémenter l'expansion algébrique (1) ~ Monoïdes, groupes, anneaux, anneaux entiers ~
J'ai essayé d'implémenter ce qui semble être un outil de snipper Windows avec Python
Comment obtenir une liste de fichiers dans le même répertoire avec python