# Automate fini

Un automate fini ou automate avec un nombre fini d'états (en anglais finite-state automaton ou finite state machine ou FSM) est un modèle mathématique de calcul, utilisé dans de nombreuses circonstances, allant de la conception de programmes informatiques et de circuits en logique séquentielle aux applications dans des protocoles de communication, en passant par le contrôle des processus, la linguistique et même la biologie. Un automate fini est une construction mathématique abstraite, susceptible d'être dans un nombre fini d'états, mais étant un moment donné dans un seul état à la fois ; l'état dans lequel il se trouve alors est appelé l'« état courant ». Le passage d'un état à un autre est activé par un événement ou une condition ; ce passage est appelé une « transition ». Un automate particulier est défini par l'ensemble de ses états et l'ensemble de ses transitions.
On rencontre couramment des automates finis dans de nombreux appareils qui réalisent des actions déterminées en fonction des événements qui se présentent. Un exemple est un distributeur automatique de boissons qui délivre l'article souhaité quand le montant introduit est approprié. D'autres exemples sont les ascenseurs qui savent combiner les appels successifs pour s'arrêter aux étages intermédiaires, les feux de circulation qui savent s'adapter aux voitures en attente, les digicodes qui analysent la bonne suite de chiffres.
Les automates finis peuvent modéliser un grand nombre de problèmes, parmi lesquels la conception assistée par ordinateur pour l'électronique, la conception de protocoles de communication, l'analyse syntaxique de langages. Dans la recherche en biologie et en intelligence artificielle, les automates finis ou des hiérarchies de telles machines ont été employés pour décrire des systèmes neurologiques. En linguistique, ils sont utilisés pour décrire les parties simples de grammaires de langues naturelles. En vérification de programmes (model checking), des automates finis, avec parfois un nombre très important d'états (des milliards), sont employés.
Vus comme un modèle de calcul, les automates finis ont un potentiel faible ; ils ont bien moins de puissance de calcul qu'une machine de Turing. En d'autres termes, il y a des tâches qu'un automate fini ne peut pas accomplir alors qu'un automate à pile ou une machine de Turing le pourront. Ceci est principalement dû au fait qu'un automate fini a une mémoire limitée à son nombre d'états.
L'étude des automates finis est une branche de la théorie des automates.

## Exemples
### Un premier exemple : un portillon

Un exemple très simple d'un mécanisme que l'on peut modéliser par un automate fini est un portillon d'accès$^,$.
Un portillon, utilisé dans certains métros ou dans d'autres établissements à accès contrôlés, est une barrière avec trois bras rotatifs à hauteur de la taille. Au début, les bras sont verrouillés, bloquent l'entrée et empêchent les usagers de passer. L'introduction d'une pièce de monnaie ou d'un jeton dans une fente du portillon (ou la présentation d'un ticket ou d'une carte) débloque les bras et permet le passage d'un et un seul usager à la fois. Une fois l'usager entré, les bras sont à nouveau bloqués jusqu'à ce qu'un nouveau jeton soit inséré.
Un portillon, vu comme un automate fini, a deux états : verrouillé (« locked » en anglais) et déverrouillé (« unlocked » en anglais).
Deux « entrées » peuvent modifier l'état : la première si l'on insère un jeton dans la fente (entrée jeton) et la deuxième si l'on pousse le bras (entrée pousser). Dans l'état verrouillé, l'action de pousser n'a aucun effet : quel que soit le nombre de fois que l'on pousse, l'automate reste verrouillé. Si l'on insère un jeton, c'est-à-dire si l'on effectue une « entrée » jeton, on passe de l'état verrouillé à l'état déverrouillé. Dans l'état déverrouillé, ajouter des jetons supplémentaires n'a pas d'effet, et ne change pas l'état. Mais dès qu'un usager tourne le bras du portillon, donc fournit un pousser, la machine retourne à l'état verrouillé.
On peut représenter l'automate par un graphe orienté, appelé un diagramme états-transitions, comme donné ci-dessus. Chaque état est représenté par un sommet (visualisé par un cercle). Les arcs (représentés par des flèches) montrent les transitions d'un état à un autre. Chaque flèche porte une entrée qui déclenche la transition. Les données qui ne provoquent pas de changement d'état, comme un jeton pour l'état déverrouillé, sont représentées par des arcs circulaires (des boucles) qui tournent autour de l’état. La flèche qui entre dans l'état verrouillé depuis le point noir sert à indiquer que cet état est l'état initial, au début de la modélisation.
    État courant Entrée État suivant Sortie verrouillé jetondéverrouilléDéverrouille le portillon pour qu'un usager puisse passer pousserverrouilléRien déverrouillé jetondéverrouilléRien pousserverrouilléQuand l'usager est passé, verrouille le portillon
L'automate d'un portillon peut être représenté par une table de transition d'états qui montre, pour chaque état, le nouvel état et la sortie (l'action) pour une entrée donnée.

### Un autre exemple : le loup, la chèvre et le chou

L'exemple que voici illustre les possibilités qui s'offrent à un passeur qui doit faire traverser, d'une rive à l'autre, un loup, une chèvre et un chou (c'est une variante des nombreux problèmes de passage de rivière). Sa barque ne lui permet que d'emporter un seul des trois objets à la fois et, bien entendu, il ne peut laisser ensemble loup et chèvre ni chèvre et chou. Dans le diagramme ci-contre, un état représente ce que le passeur a déjà pu transporter sur l’autre rive (« P » représente le passeur, « L » le loup, « C » la chèvre, et le chou a été noté par « S ») : au début rien, à la fin tout. Sur les flèches, les objets transportés (et lui-même). Une des deux séquences de transport est CPLCSPC, l'autre est CPSCLPC. Bien entendu, on néglige les aller-retour-aller inutiles.

## Concepts et terminologie

Un état est la description de la configuration d'un système en attente d'exécuter une transition. Une transition est un ensemble d'actions à exécuter lorsqu'une condition est remplie ou lorsqu'un événement est reçu. Par exemple, une chaîne audio peut être dans un état « radio » et, quand elle reçoit un stimulus du genre « suivant », passe à la station radio suivante. Si le système est dans l'état « CD » et reçoit le stimulus « suivant », il passe à la piste suivante du CD en cours. Les mêmes stimuli peuvent donc déclencher des actions différentes, si l'état courant n'est pas le même.
Dans certaines représentations de machines finies, il est possible d'associer des actions à un état :
* action d'entrée : réalisée lorsque l'on « entre » dans l'état ;
* action de sortie : réalisée lorsque l’on « quitte » l'état ;
* action de transition : réalisée lors d'une transition

## Représentations
### Table états-transitions

Plusieurs types de tables de transition d'état sont utilisées. Ces diagrammes sont très populaires en UML notamment. La représentation la plus courante est illustrée ci-dessous ; la combinaison de l'état courant (par exemple B) et d'une entrée (par exemple Y) montre l'état suivant (dans l’exemple C). L'information complète associée à une action n'est pas décrite dans la table et peut être ajoutée par des annotations. Une définition d'une machine finie avec actions est possible au moyen de tables de transition dans le modèle plus élaboré d'automate fini virtuel (en).
    Table de transitions EntréeÉtatEntrée XEntrée YEntrée Z État A ……… État B …État C… État C ………

### Automates UML

Le langage de spécification Unified Modeling Language (UML) a une notation propre pour décrire des automates. Ce sont des diagrammes comportementaux particuliers qui permettent de dépasser les limitations de machines finies traditionnelles tout en conservant leurs avantages principaux. Les machines ou automates UML introduisent les notions nouvelles de diagramme de structure composite, d'états hiérarchiques et d'agrégation, tout en étendant la notion d'action. Les machines finies UML ont à la fois les propriétés des machines de Mealy et des machines de Moore décrites plus bas. Elles supportent des actions qui dépendent à la fois de l'état du système et de l'événement déclenchant, comme dans les machines de Mealy, et aussi des actions d'entrée et de sortie associées à des états, comme dans les machines de Moore.

### Machines SDL

Le langage de spécification et de description appelé Specification and Description Language ou SDL est une norme élaborée par l'Union internationale des télécommunications (UIT). La norme contient un ensemble de symboles graphiques permettant de décrire les actions dans une transition :
* envoi d'un message ;
* réception d'un message ;
* démarrage d'un temporisateur (timer) ;
* arrêt d'un temporisateur ;
* lancement d'une machine concurrente ;
* prise de décision.
Un SDL contient des types de base, mais surtout des types de données abstraits (TDA) et une syntaxe de manipulation qui permet de décrire le système de manière formelle, possiblement de manière complète et non ambiguë.

### Autres diagrammes d'états

Il existe de nombreuses variantes de diagrammes d'états-transitions, comme le diagramme d'un automate à deux états donné plus haut.

## Utilisation

Les automates sont des systèmes réactifs, réagissant aux impulsions reçues. Ils jouent un rôle important dans de nombreux champs différents, comprenant l'électrotechnique, la linguistique, l'informatique , la philosophie, la biologie, les mathématiques, et la logique. Les automates finis constituent une classe d'automates étudiée en théorie des automates et en informatique théorique.
En informatique, les automates finis sont largement utilisés en modélisation du comportement d'applications, en conception matérielle, en électronique numérique, en génie logiciel, en compilation, en protocoles de communication, dans l'étude des modèles de calcul et des langages formels. Les dictionnaires linguistiques aussi peuvent être représentés par un automate fini. Le gain de place, pour un dictionnaire de Scrabble anglais, peut atteindre 80 %, et encore plus pour des dictionnaires de mots fléchés du français.

## Classification

Les automates finis peuvent être classés principalement en deux catégories, les accepteurs et les transducteurs. Les accepteurs analysent la structure de la donnée fournie, et l'acceptent si elle est conforme à la spécification décrite par l'automate. Les transducteurs au contraire traduisent une chaîne de symboles en une autre, là encore selon l'algorithme codé dans l'automate. Dans certains cas, on peut rencontrer des variantes appelées classificateurs et séquenceurs$^,$.

### Accepteurs ou reconnaisseurs

Les accepteurs, également appelés reconnaisseurs produisent une sortie binaire, indiquant si l'entrée reçue est acceptée ou non. Chaque état d'un tel automate est soit un état d'acceptation, aussi appelé final ou terminal, ou un état de rejet. Si l'état courant, après la lecture de la totalité de l'entrée, est un état d'acceptation, l'entrée est acceptée, sinon elle est rejetée. L'entrée est généralement une suite de symboles (des lettres); il n'y a pas d'actions associées. L'exemple de la figure 4 montre un automate fini qui accepte le mot « nice ». Dans cet automate, seul l'état 7 est acceptant.
Une machine peut aussi être décrite comme définissant un langage formel. Ce langage est composé des mots acceptés par la machine, et d'aucun mot rejeté par elle. Par définition, les langages acceptés par un automate fini sont appelés les langages reconnaissables. Par le théorème de Kleene, ce sont les langages réguliers ou rationnels, décrits par des expressions régulières ou rationnelles.
Le problème de déterminer le langage accepté par un automate fini donné est une instance d'un problème plus général appelé le problème algébrique de cheminement (« algebraic path problem »), qui lui-même est une extension des problèmes de cheminement dans des graphes dont les arcs portent des poids pris dans un demi-anneau arbitraire$^,$.

#### État initial

L'état initial est en général indiqué en traçant une flèche qui pointe vers cet état « à partir de n'importe où ».

#### États d'acceptation, finaux, ou terminaux

Un état d'acceptation (aussi appelé état acceptant, final ou terminal) est un état dans lequel la machine déclare que la chaîne d'entrée traitée jusqu'alors appartient au langage qu'elle reconnaît. Graphiquement les états d'acceptation sont fréquemment représentés par des cercles doublés. Une autre façon, symétrique à celle adoptée pour l'état initial, consiste à faire sortir une flèche « pointant vers nulle part » d'un tel état.
L'état initial peut aussi être un état final ; dans ce cas, l'automate accepte la chaîne vide. Si l'état initial n'est pas un état d'acceptation, et s'il n'existe pas d'arc vers un état final, l'automate n'accepte aucun mot.
La figure 5 est l'exemple d'un automate fini déterministe. Cet automate accepte les suites binaires qui comportent un nombre pair de chiffres 0. L'état S$_1$ est à la fois l'état initial et l'état terminal. L'automate termine dans l'état S$_1$ si la chaîne lue contient un nombre pair (éventuellement nul) de 0 : chaque 0 fait basculer d'un état vers l'autre, alors qu'un 1 laisse l'état inchangé. Des exemples de chaînes acceptées sont ε , le mot vide, puis 1, 11, 11…, 00, 010, 1010, 10110, etc.

### Transducteurs

Les transducteurs finis génèrent en sortie des mots en fonction d'un mot d'entrée donné et d'actions associées aux états. Ils sont utilisés par exemple dans des applications de contrôle et dans le domaine de la linguistique informatique. On distingue deux types de transducteurs, les machines de Moore et les machines de Mealy. Elles diffèrent par les modalités qui déterminent les sorties. On peut démontrer qu'elles ont la même puissance d'expression.

#### Machine de Moore

    Dans le modèle de Moore, qui utilise seulement des actions d'entrée, la sortie dépend uniquement de l’état courant. Comparé au modèle de Mealy, le modèle de Moore a l'avantage de la simplicité et de facilité de compréhension. Considérons par exemple une porte d'ascenseur, modélisée par une machine qui reconnaît deux commandes : « ouvrir » et « fermer », commandes qui peuvent être données par un utilisateur. L'action d'entrée (E:) dans l'état d'« en cours d'ouverture » fait démarrer un moteur qui ouvre la porte, et dans l'état « en cours de fermeture » fait démarrer un moteur qui ferme la porte. Les états « ouvert » et « fermé » arrêtent le moteur quand la porte est entièrement ouverte ou entièrement fermée. Ils signalent par ailleurs cette situation vers l’extérieur par « porte ouverte » ou « porte fermée ».

#### Machine de Mealy

    Dans le modèle de Mealy, qui utilise également des actions d'entrée, la sortie dépend à la fois de l'entrée et de l'état. L'usage de machines de Mealy réduit souvent le nombre d'états. En contrepartie, le fonctionnement d'un automate est plus complexe et plus difficile à appréhender. La figure 7 montre un automate de Mealy qui a le même comportement que l’automate de Moore. Il y a deux actions d'entrée (I:): « démarrer le moteur pour fermer la porte quand la commande de fermeture arrive », et la commande symétrique pour l'ouverture. Les états intermédiaires « en cours d'ouverture » et « en cours de fermeture » ne sont pas nécessaires.

### Variantes

Les variantes suivantes sont d'un emploi assez rare. Un classificateur est similaire à un accepteur, mais possède au moins deux états terminaux. Un tel automate peut donc accepter plusieurs langages simultanément, selon la catégorie d'états à laquelle appartient l'état terminal atteint en fin de lecture. Un séquenceur ou générateur est un cas particulier d'automate, opérant sur un alphabet d'entrée à une seule lettre. Un tel automate produit une seule séquence qui peut être interprétée comme le résultat d'un transducteur ou d'un classificateur.
Un automate fini avec un état unique est appelé parfois « combinatoire » ; il utilise uniquement des actions d'entrée. Cette notion peut servir lorsque plusieurs automates finis sont censés travailler de concert, en communiquant ; il peut alors être commode de considérer des automates combinatoires comme une brique dans un outil de conception.

### Déterminisme

Une distinction supplémentaire importante est celle entre automates finis déterministes et non déterministes. Dans un automate déterministe, chaque état possède au plus une transition pour chaque symbole d'entrée (et même exactement une dans le cas où l'automate est complet). Dans un automate non déterministe, un symbole d'entrée peut étiqueter une, plusieurs ou aucune transition pour un état donné. Cette distinction est importante en pratique, mais moins en théorie parce qu'il existe un algorithme (la construction par sous-ensembles) qui permet de transformer un automate fini non déterministe en un automate fini déterministe avec la même fonctionnalité. Toutefois, et c'est là un biais qui peut entraver l'efficacité, l'algorithme de construction par sous-ensembles peut produire un automate dont la taille est exponentielle par rapport à la taille de l'automate de départ. C'est pourquoi certains algorithmes (comme le programme grep de Unix) tentent des compromis.

## Autres représentations

Il existe d'autres moyens de représenter des machines à états. Il existe par exemple des outils de modélisation et de conception de la logique de contrôleurs embarqués. Ils combinent des états hiérarchiques de UML, de graphes de flots de contrôle, et des tables de vérité en un seul langage, ce qui donne un formalisme différent et un ensemble de sémantiques propre. Ces diagrammes sont similaires aux représentations initialement introduites par David Harel ; ils supportent des états hiérarchiquement imbriqués, des régions orthogonales au sens de UML, des actions sur les états et sur les transitions.

## Modèle mathématique

Les définitions formelles sont les suivantes :
Un automate fini déterministe ${\mathcal {A}}=(\Sigma ,S,s_{0},\delta ,F)$ est composé de :
* $\Sigma$, un ensemble fini, non vide de lettres qui est l’alphabet d'entrée,
* $S$, un ensemble fini, non vide d'états,
* $s_{0}$, l'état initial, élément de $S$. Dans un automate non déterministe, $s_{0}$ peut être un ensemble d'états.
* $\delta$, la fonction de transition d'états: $\delta :S\times \Sigma \rightarrow S$ (dans un automate non déterministe, c'est une fonction $\delta :S\times \Sigma \rightarrow {\mathfrak {P}}(S)$, donc à valeur dans l'ensemble des parties de $S$, en d'autres termes $\delta$ retourne un ensemble d'états).
* $F$ est l'ensemble des états terminaux, un sous-ensemble (éventuellement vide) de $S$.
Pour les automates déterministes ou non, il est fréquent de considérer le cas où $\delta$ est une fonction partielle, donc où $\delta (q,a)$ n'est pas défini pour toute combinaison d'un état $q\in S$ et d'un symbole $a\in \Sigma$. Si $\delta (q,a)$ n'est pas défini, l'automate signale une erreur et l’entrée est rejetée. Cette variante est utile dans la spécification d'une machine, mais certains algorithmes qui nécessitent que les fonctions soient totales, demandent une transformation préliminaire qui, au moyen de l'ajout d'un état supplémentaire, rendent la fonction de transition totale.
Un automate fini est une machine de Turing très particulière, où la tête ne peut effectuer que des opérations de lecture (et pas d'écriture), et de plus se déplace toujours de la gauche vers la droite (et ne peut donc pas revenir en arrière).
Un transducteur fini ${\mathcal {T}}=(\Sigma ,\Gamma ,S,s_{0},\delta ,\omega )$, est composé de :
* $\Sigma$, un ensemble fini, non vide de lettres qui est l’alphabet d'entrée.
* $\Gamma$, un ensemble fini, non vide de lettres qui est l’alphabet de sortie.
* $S$, un ensemble fini, non vide d'états.
* $s_{0}$, l'état initial, élément de $S$. Dans un automate non déterministe, $s_{0}$ peut être un ensemble d'états.
* $\delta$ est la fonction de transition d'états : $\delta :S\times \Sigma \rightarrow S$.
* $\omega$ est la fonction de sortie.
Si la fonction de sortie est fonction des états et de l'entrée ($\omega :S\times \Sigma \rightarrow \Gamma$) la définition correspond à celle du modèle de Mealy; si en revanche la fonction de sortie ne dépend que de l'état, ($\omega :S\rightarrow \Gamma$), on est en présence du modèle de Moore.
Il n'est pas difficile de transformer un automate de Moore en un automate de Mealy en faisant ne dépendre la fonction de sortie que de l’état d'arrivée. La conversion réciproque, d'un automate de Mealy en un automate de Moore, est également possible, mais demande d'introduire des états supplémentaires.

## Optimisation

L'optimisation d'un automate fini signifie ici la recherche d'un automate fini déterministe avec le moins d'états réalisant la même fonction. L'algorithme le plus rapide est l'algorithme de Hopcroft datant de 1971$^,$. D'autres techniques sont l'algorithme de Moore et un algorithme de Brzozowski. Les automates finis acycliques, qui reconnaissent des ensembles finis de mots comme des dictionnaires peuvent être minimisés en temps linéaire. Des études poussées ont été menées pour la comparaison en moyenne, dans le pire des cas, et pour la complexité générique de ces méthodes. L'optimisation d'un automate au sens de la recherche d'un automate fini déterministe ou non avec un nombre minimum d'états est plus complexe.

## Implémentation
### Applications matérielles

En électronique numérique, un automate fini peut être construit comme circuit logique programmable, ou un automate programmable industriel, avec des fonctions logiques réalisées par bascules ou relais. Une implémentation matérielle demande en général un registre pour stocker les variables d'état, un circuit de logique combinatoire qui détermine les transitions d'états, et un deuxième bloc de logique combinatoire qui détermine les sorties de l'automate. Une implémentation courante est le Richards controller (en).
Un cas particulier des automates de Moore, où la sortie est directement connectée aux états, est connu sous le nom d'automate de Medvedev. Il est par ailleurs recommandé, dans la conception de chipsets, de ne pas placer de circuit logique entre les entrées-sorties primaires et les registres, afin de minimiser les délais entre chipsets qui sont habituellement longs et ralentissent la fréquence des automates. On peut aussi optimiser les automates en vue de minimiser la consommation d'énergie par des techniques spécifiques (en).

### Applications logicielles

Les concepts suivants sont fréquemment employés dans la construction d'applications utilisant des automates finis :
* Programmation fondée sur des automates (en)
* Automate fini dirigé par événements (en)
* Automate fini virtuel (en)
* État (patron de conception)

### Automates finis et compilateurs

Les automates finis sont souvent utilisés au début du processus de compilation dans les compilateurs de langages de programmation. Une telle entité peut comporter plusieurs automates finis, qui implémentent l'analyse lexicale.
Partant d'une séquence de caractères, un analyseur lexical construit une suite de lexèmes, tels que les mots réservés, les identificateurs, les littéraux ; à partir de cette suite, l'analyseur syntaxique construit l'arbre syntaxique. L'analyseur lexical et l'analyseur syntaxique gèrent la partie régulière et algébrique de la grammaire d'un langage de programmation.

## Articles liés

* Automate à jetons
* Automate à pile
* Automate à file
* Automate cheminant
* Automate d'arbres
* Automates finis communicants (en)
* Automate fini déterministe
* Automate fini non déterministe
* Automate pondéré
* Automate quantique
* Diagramme états-transitions
* Discrete Event System Specification
* État (patron de conception)
* Intelligence artificielle
* Langage rationnel
* Logique séquentielle
* Machine à états abstraits (ASM)
* Machine de Turing
* Model checking
* Modèle de Markov caché
* Réseau de Petri
* SCXML
* Specification and Description Language
* Stratégie de régulation
* Système de transition d'états
* Table de décision
* Théorie des automates
* UML