AccueilđŸ‡«đŸ‡·Chercher

Automate Ă  pile

Un automate à pile est une machine abstraite utilisée en informatique théorique et, plus précisément, en théorie des automates.

Un automate Ă  pile est une gĂ©nĂ©ralisation des automates finis : il dispose en plus d'une mĂ©moire infinie organisĂ©e en pile (last-in/first-out ou LIFO). Un automate Ă  pile prend en entrĂ©e un mot et rĂ©alise une sĂ©rie de transitions. Il effectue pour chaque lettre du mot une transition, dont le choix dĂ©pend de la lettre, de l'Ă©tat de l'automate et du sommet de la pile ; il peut aussi modifier le contenu de la pile. Selon l'Ă©tat de l'automate et de la pile Ă  la fin du calcul, le mot est acceptĂ© ou refusĂ©.

Les langages reconnus par les automates à piles sont exactement les langages algébriques, c'est-à-dire ceux engendrés par une grammaire algébrique.

L'importance des automates à pile vient de leur emploi en analyse syntaxique des langages de programmation, et plus généralement dans la transformation de définitions ou d'algorithmes récursifs en leurs analogues itératifs.

Un automate à pile. Une unité de contrÎle finie agit en lisant la donnée sur la bande d'entrée (input tape), et en utilisant une mémoire auxiliaire en forme de pile (stack).

DĂ©finition formelle

Automate Ă  pile

Un automate Ă  pile (non dĂ©terministe) est un 7-uplet , oĂč :

  • est l'ensemble d'Ă©tats ;
  • est l'alphabet d'entrĂ©e ;
  • est l'alphabet de pile ;
  • est la fonction de transition (la notation dĂ©signe l'ensemble des parties) ;
  • est le symbole de fond de pile ;
  • est l'Ă©tat initial ;
  • est l'ensemble des Ă©tats terminaux.

Au lieu de la fonction , on rencontre fréquemment l'ensemble défini par

Les éléments de sont les rÚgles de transitions. Lorsque , on parle d'une -rÚgle. Tous les ensembles dans la définition sont finis.

Une configuration interne de l'automate est un couple . Une configuration de l'automate est un triplet . Un calcul de l'automate sur un mot est une suite de transitions Ă  partir de la configuration initiale . Il y a transition de la configuration , oĂč et vers la configuration et on Ă©crit :

lorsque . Lorsque , le mot d'entrĂ©e ne change pas. On parle alors d'une -transition ou d'une transition spontanĂ©e. Dans tous les cas, pour qu'une transition soit possible, la pile ne doit pas ĂȘtre vide.

On dit qu'un mot est accepté par l'automate s'il existe une série de transitions qui conduit à une configuration acceptante. Plusieurs modes de reconnaissance existent :

  • Reconnaissance par pile vide. Les configurations acceptantes sont les configurations de la forme oĂč est un Ă©tat quelconque. Autrement dit, il est possible d'arriver Ă  vider entiĂšrement la pile au moment oĂč on termine la lecture du mot.
  • Reconnaissance par Ă©tat final. Les configurations acceptantes sont les configurations de la forme oĂč est un Ă©tat final. La pile n'est donc pas nĂ©cessairement vide Ă  la fin de la lecture du mot.
  • Reconnaissance par pile vide et Ă©tat final. Les configurations acceptantes sont les configurations de la forme oĂč est un Ă©tat final. La pile est vide Ă  la fin de la lecture du mot.

Le langage reconnu par l'automate est l'ensemble des mots de qui sont acceptés.

Les trois modes d'acceptation sont Ă©quivalents, au sens que si un langage est reconnu par un automate Ă  pile d'une espĂšce, on peut construire un automate reconnaissant ce langage, des autres espĂšces.

Commentaires

Un automate à pile est composé de deux parties qui interagissent : la partie automate, avec un nombre fini d'états, et une mémoire auxiliaire infinie, organisée en pile. On s'attendrait donc d'avoir deux opérations sur la pile, une pour empiler un symbole, une pour en dépiler un. La définition mathématique adoptée consiste à remplacer ces deux opérations par une seule qui les combine et qui, dans des cas particuliers, donne les opérations d'empilement et de dépilement. En effet, si on applique une rÚgle de transition

,

on dépile d'abord le symbole , puis on empile le mot , donc est remplacé par . Si le mot est vide, l'opération consiste donc simplement à dépiler ; si le mot commence par , donc si , l'opération revient à empiler, par-dessus , une autre mot . Un troisiÚme avantage de cette notation compactée est que l'on peut tester quelle est la nature du symbole en haut de pile, simplement en le lisant et en le remettant.

Dans le formalisme présenté, on ne peut pas tester si la pile est vide, car si la pile est vide, tout calcul (qui doit commencer par un dépilement) est impossible. Une façon de contourner cette difficulté est d'utiliser un symbole spécial de fond de pile que l'on n'enlÚve pas.

Automate à pile déterministe

Un automate à pile est déterministe lorsque la fonction de transition est une fonction partielle vérifiant une condition supplémentaire.

Plus précisément, est une fonction partielle . De plus, lorsque est définie, alors n'est définie pour aucune lettre . Ainsi, si une transition spontanée est possible, aucune autre transition ne l'est à partir de cette configuration.

Les modes de reconnaissance, par état final ou par pile vide, ne sont plus équivalents. Un langage algébrique déterministe est un langage algébrique pour lequel il existe un automate à pile déterministe par état final qui le reconnaßt. Les automates déterministes avec reconnaissance par pile vide reconnaissent exactement les langages algébriques déterministes qui sont préfixes (aucun mot du langage n'est préfixe d'un autre mot du langage).

Par exemple, le langage est préfixe, et est reconnu par les deux types d'automates déterministes, mais le langage ne l'est que par automate déterministe par état final.

Un exemple

Automate reconnaissant le langage .

L'automate a deux états ; l'état est initial, il n'y a pas d'état terminal. La reconnaissance est par pile vide. Le symbole de fond de pile est . Il y a un seul symbole de pile supplémentaire, noté . Les transitions sont :

(1)
(2)
(3)
(4)

La troisiĂšme rĂšgle est une -rĂšgle. Elle dit que, de l'Ă©tat , on peut passer Ă  l'Ă©tat sans rien lire, et sans changer la pile.

représentation d'un automate à pile

On commence par lire le premier caractĂšre :

  • si le mot est vide, on a fini et le mot est rejetĂ© car la pile n’est pas vide ;
  • si c'est un , on remplace le fond de pile par ;
  • si c'est un , le mot est rejetĂ© parce qu'aucune rĂšgle ne s'applique.

Ensuite, à chaque lu, on empile un additionnel par la rÚgle (2). AprÚs avoir lu lettres consécutivement, la pile contient . Si on voit un , tout en étant dans l'état , la machine se bloque parce qu'aucune rÚgle ne s'applique.

Dans l'Ă©tat , la rĂšgle (3) fait passer dans l'Ă©tat , sans lecture de lettre ni de modification de la pile. Ensuite, seule la rĂšgle (4) s'applique, et on peut l'appliquer tant que la pile n'est pas vide, c'est-Ă -dire autant de fois que l’on a lu des lettres . L'acceptation par pile vide signifie que le mot lu est acceptĂ© quand la pile est vide, donc quand le mot a la forme .

L'exemple serait plus compliqué si on voulait éviter la -rÚgle.

Propriétés

Chaque langage défini par une grammaire algébrique est reconnu par un automate à pile et réciproquement.

En conséquence, le problÚme de l'appartenance d'un mot à un langage algébrique est décidable : il existe un algorithme qui, étant donnés la description d'une grammaire non contextuelle et un mot, répond en temps fini à la question de l'appartenance de ce mot au langage défini par cette grammaire (plus précisément, on peut le tester en un temps pour un mot de longueur n, grùce à l'algorithme CYK).

La classe des langages rationnels (reconnus par des automates finis) est strictement incluse dans la classe des langages algĂ©briques dĂ©terministes (reconnus par automate Ă  pile dĂ©terministe par Ă©tat final), elle-mĂȘme strictement incluse dans la classe des langages algĂ©briques (reconnus par des automates Ă  pile non dĂ©terministes). Par exemple, le langage est algĂ©brique dĂ©terministe mais non rationnel, et le langage des mots palindromes est algĂ©brique mais pas algĂ©brique dĂ©terministe.

Restrictions et extensions

Modes d'acceptation

D'autres variantes d'acceptation existent. C'est pourquoi on rencontre parfois une formulation qui sépare la définition en deux : d'une part, une machine à pile est définie sans préciser le mode d'acceptation. D'autre part, une automate est spécifié par la donnée des configurations internes d'acceptation. Par exemple :

  • l'ensemble dĂ©crit l'acceptation par pile vide ;
  • l'ensemble dĂ©crit l'acceptation par Ă©tat final ;
  • l'ensemble dĂ©crit l'acceptation par Ă©tat final et pile vide.

Automate en temps réel

Un automate Ă  pile est dit en temps rĂ©el (realtime en anglais) s'il ne possĂšde pas de -rĂšgles. Un automate Ă  pile est simple s'il ne possĂšde qu'un seul Ă©tat. On peut montrer[1] que tout langage algĂ©brique propre (c'est-Ă -dire ne contenant pas le mot vide) peut ĂȘtre reconnu par un automate Ă  pile en temps rĂ©el et simple.

En revanche, tout langage dĂ©terministe ne peut pas ĂȘtre reconnu par un automate Ă  pile dĂ©terministe en temps rĂ©el. Par exemple, le langage

est algĂ©brique et dĂ©terministe, mais ne peut ĂȘtre reconnu par un automate Ă  pile dĂ©terministe en temps rĂ©el[1].

Langage de pile

Le langage de pile d'un automate Ă  pile est l'ensemble des mots qui apparaissent sur la pile lors d'un calcul rĂ©ussi, c'est-Ă -dire dans une configuration d'une suite de transitions Ă  partir de la configuration initiale vers une configuration acceptante. Pour tout automate Ă  pile, et quel que soit le mode d'acceptation, le langage de pile est un langage rationnel[1]. La nature du langage de pile – et plus gĂ©nĂ©ralement du langage des mĂ©morisations intermĂ©diaires – a Ă©tĂ© Ă©tudiĂ©e systĂ©matiquement par Oscar H. Ibarra et IanMcQuillan[2].

Automates Ă  deux piles

Un automate Ă  deux piles ou plus a la mĂȘme puissance de calcul qu'une machine de Turing. En effet, les automates Ă  deux piles sont une gĂ©nĂ©ralisation des machines Ă  deux compteurs, elles-mĂȘmes Ă©quivalentes aux machines de Turing. On peut aussi le dĂ©montrer de maniĂšre plus directe : un automate Ă  deux piles peut simuler une machine de Turing, en faisant en sorte que la partie du ruban situĂ©e Ă  gauche de la tĂȘte de lecture soit enregistrĂ©e dans la premiĂšre pile, et que la partie du ruban situĂ©e Ă  droite de la tĂȘte de lecture soit enregistrĂ©e sur la seconde.

L'équivalence des automates à pile déterministes

Géraud Sénizergues a prouvé, en 2001, que l'équivalence de deux automates à pile déterministes est décidable. Ce problÚme était ouvert depuis la définition des automates déterministes dans les années 1970. Géraud Sénizergues a obtenu le prix Gödel pour cette preuve.

Applications

La plupart des langages de programmation sont dĂ©crits par une grammaire algĂ©brique. L'analyse syntaxique d'un programme, qui est une des premiĂšres opĂ©rations effectuĂ©es par un compilateur, peut donc ĂȘtre effectuĂ©e par un automate Ă  pile. Si la grammaire du langage est une grammaire algĂ©brique dĂ©terministe, il suffit de construire un automate Ă  pile dĂ©terministe ; sinon, on doit construire un automate Ă  pile non dĂ©terministe.

Il existe des outils pour construire automatiquement un automate à pile à partir d'une description de la grammaire d’un langage (par exemple, ANTLR).

Implémentation d'un automate à pile

Le programme suivant (en langage C) vĂ©rifie que l'expression entrĂ©e respecte le langage des parenthĂšses oĂč toute parenthĂšse ouvrante doit correspondre Ă  une parenthĂšse fermante :

#include <stdlib.h>
#include <stdio.h>
#define POP       -1  /* DĂ©piler l'Ă©tat               */
#define ACCEPT    -2  /* Accepter l'expression entrée */
#define ERROR     -3  /* Refuser l'expression entrée  */
#define ALPHABET 3    /* Grandeur*/
/*
    Push-down automation
    Symbol   | (       | )        | \0
    ---------+---------+--------+-----------
    State 0  | PUSH 1  | ERROR  | ACCEPT
    State 1  | PUSH 1  | POP    | ERROR
*/
int states[2][ALPHABET*2] =
{
    /* Valeur d'entrée    Action     */
    {
            '(',          1 /* PUSH 1 */,
            ')',          ERROR,
            '\0',         ACCEPT
    },
    {
            '(',          1 /* PUSH 1 */,
            ')',          POP,
            '\0',         ERROR
    }
};
int main( int argc, char** argv )
{
    int    stack[100]  = { 0 };
    int    i           = 0;
    int    action      = 0;
    int*   tos         = stack;
    char   s[80+1];
    char*  p           = s;
    /* Chaine de donnée */
    printf("Entrez l'expression : ");
    fgets( &s , 80 , stdin);     // modification pour éviter les débordements de mémoire
    /* État initial 0 mis dans la pile : */
    *(tos++) = 0;
    /* Sortie */
    do
    {
        /* Recherche de l'action correspondant au symbole d'entrée courant... */
        action = ERROR; /* Action par défaut si le symbole n'est pas trouvé. */
        for( i = 0; i < ALPHABET; i++ )
        {
            if( states[*(tos-1)][i*2] == *p )
            {
                /* CaractÚre entré trouvé */
                action = states[*(tos-1)][i*2+1];
                break;
            }
        }
        /* Effectuer l'action associée au symbole d'entrée courant... */
        if( action == ERROR )
        {
            printf("Erreur inattendue Ă  la position %d", p-s);
            break;
        }
        else if( action == ACCEPT )
            printf("Sortie acceptée !");
        else if( action == POP )
            tos--;             /* DĂ©piler l'Ă©tat */
        else
            *(tos++) = action; /* Empiler l'état spécifié */
        /* Données supplémentaires... */
        p++;
    }
    while( action != ACCEPT );
    getchar();
    return 0;
}

Notes et références

Notes

  1. Autebert, Berstel, Boasson (1997), p. 34 : « The fact that any proper context-free language can be generated by a context-free grammar in Greibach normal form implies that realtime pda's, (and even simple pda's), recognize exactly proper context-free languages. ».
  2. Oscar H. Ibarra et Ian McQuillan, « On store languages of language acceptors », Theoretical Computer Science, vol. 745,‎ , p. 114-132 (DOI 10.1016/j.tcs.2018.05.036).

Références

Références générales
  • Olivier Carton, Langages formels, calculabilitĂ© et complexitĂ©, [dĂ©tail de l’édition] (lire en ligne)
  • Jean-Michel Autebert, Jean Berstel et Luc Boasson, « Context-free languages and pushdown automata », dans G. Rozenberg, A. Salomaa (Ă©diteurs), Handbook of Formal Languages, vol. 1 : Word, Language, Grammar, Springer Verlag, (ISBN 978-3540604204), p. 111--174
Sur l'équivalence des automates à pile déterministe

Annexes

Articles connexes

Cet article est issu de wikipedia. Text licence: CC BY-SA 4.0, Des conditions supplĂ©mentaires peuvent s’appliquer aux fichiers multimĂ©dias.