On l'a dit, les expressions rationnelles ne permettent pas de représenter tous les langages.
Exemple : Le langage défini par $\{ a^n b^n | n \in \mathbb{N}^* \}$ n'est pas représentable par une expression rationnelle.
Exercice : Déterminez d'autres langages non reconnus par expression rationnelle.
On souhaite maintenant étudier « une plus grande classe» de langages, et voir ce qu'il manque à nos automates pour pouvoir les associer à ces langages.
Dans l'exemple précédent, il faudrait « noter quelque part » le nombre de $a$ rencontrés, pour s'assurer qu'il y aura bien autant de $b$. On peut imaginer y arriver avec une pile jointe à un automate non déterministe.
Remarque : Très précisément, les automates à pile vont jouer pour les langages dits non contextuels (voir chapitre suivant) le rôle des automates finis pour les langages rationnels (: représentables par expressions rationnelles).
Définition (Automate à pile)
Un automate à pile est donné par
Remarque : Le symbole de pile initial n'est pas toujours noté $p_0$.
Définition (Transition)
Lorsque $((e,x,p),(e',q))$ appartient au graphe de la relation $t$, on parle de la transition $(e,x,p) \longmapsto (e',q)$.
Elle indique que, lorsque l'automate se trouve :
alors il évolue
Comme $t$ est une relation, il est possible, dans le cas d'un automate à pile non déterministe, qu'il y ait plusieurs transitions possibles dans la même situation (même état, même entrée, même symbole de sommet de pile).
Exemple : [Automate à pile non déterministe]
Ici, l'alphabet d'entrée est $\{0,1\}$, le fond de pile est $T$ et alphabet de pile $\{T,Z,A\}$ :
Cet automate reconnaît, par pile vide, l'ensemble $\{0^n 1^m, n \geqslant m > 0 \}$
Remarque : Si un automate à états finis reconnaît un mot lorsqu'il s'arrête dans un état d'acceptation, il n'en est pas de même pour les automates à pile : on verra par la suite que ceux-ci ont plusieurs critères pour décider si un mot est reconnu ou non.
Le critère de reconnaissance par pile vide fait partie de ceux-ci: lorsque l'automate s'arrête avec une pile vide, le mot est accepté.
On remarque que les mots 01, 001, 0011 sont acceptés par cet automate. Il n'en est pas de même pour 011.
Définition (Automate à pile déterministe)
Dans le cas d'un automate à pile déterministe, $t$ est une fonction sur son domaine de définition, et $(e',q) = t(e,x,p)$.
Remarque : En particulier si $t$ est définie pour le triplet $(e,x,p)$, $t(e,x,p)$ est unique.
Exemple : [Automate à pile déterministe] Ici, l'alphabet d'entrée est $\{0,1\}$, le fond de pile est $Z$ et alphabet de pile $\{Z,A\}$ :
Remarque : Cet automate à pile déterministe reconnaît, par état final, le même langage que l'exemple précédent.
Il est fondamental de comprendre qu'une transition d'un automate à pile, quelle qu'elle soit, exige toujours de dépiler un symbole de pile.
Remarque : Autrement dit, si la pile vient à se vider, l'automate se bloque et ne peut plus évoluer, même si le mot d'entrée n'a pas été entièrement lu.
Ceci explique le « symbole de pile initial» , la plupart du temps sans intérêt autre que celui de permettre le début du calcul dans l'automate.
Remarque : On admet des « transitions vides» , du type $(e,\varepsilon,p) \longmapsto )$, qui permettent de ne pas avancer sur le mot d'entrée, par exemple pour vider la pile. Il faut les utiliser avec précautions.
Définition (Configuration)
On appelle configuration d'un automate à pile un triplet $(e,w,q)$ où
Définition (Dérivation valide)
Si
alors, après application de cette transition, la nouvelle configuration de l'automate est $(e',w',q q')$ et la correspondance $(e,w,q) \vdash (e',w',q q')$ est appelée une dérivation valide dans l'automate.
Définition (Calcul valide)
Un calcul valide dans l'automate est une famille de dérivations $(e_1,w_1,q_1) \vdash (e_2,w_2,q_2) \vdash \vdash (e_n,w_n,q_n) $.
On dit que ce calcul valide mène de la configuration $(e_1,w_1,q_1) $ à la configuration $ (e_n,w_n,q_n) $
Notation: On peut noter cela : $(e_1,w_1,q_1) \stackrel{*}{\vdash} (e_n,w_n,q_n) $.
Définition (Mot reconnu)
On dit qu'un mot $w$ est reconnu par un automate à pile (état initial $e_0$, symbole de pile initial $p_0$) lorsqu'il existe un calcul valide $(e_0,w,q_0) \stackrel{*}{\vdash} (e,\varepsilon,q) $ tel que, au choix
Remarque : On peut envisager des reconnaissances par combinaison de deux de ces conditions, voire les trois simultanément.
On démontre que...
Théorème
Tous ces types de reconnaissance peuvent se ramener à la seule reconnaissance par pile vide (éventuellement avec un automate beaucoup plus compliqué ).
C'est pourquoi nous n'envisagerons plus que cette dernière dans la suite. Enfin,
Définition (Langage reconnu)
Le langage reconnu par automate est l'ensemble des mots reconnus par cet automate (par le même mode de reconnaissance).
Exemple :
Automate à pile (non déterministe) reconnaissant, par pile vide, l'ensemble des mots de la forme $ww^t$, concaténation de $w$ (constitué de 0 et de 1) et de son image miroir :
(Alphabet d'entrée $\{0,1\}$, fond de pile $Z$, alphabet de pile $\{Z,A,B\}$.)
Exemple :
Automate à pile reconnaissant, par pile vide, l'ensemble des mots de la forme $wcw^t$, concaténation de $w$ (constitué de 0 et de 1) et de son image miroir séparés par le caractère $c$ :
(Alphabet d'entrée $\{0,1,c\}$, fond de pile $Z$, alphabet de pile $\{Z,A,B\}$.)
Le principe est le suivant :
Voici les transformations :
Exercice : Représentez cet automate.
On peut évidemment utiliser la méthode « directe\fg, comme dans l'exemple précédent.
Pour les langages plus complexes, il peut être nécessaire d'avoir recours à un algorithme. Nous l'aborderons par l'exemple de la grammaire écrite pour les expressions algébriques élémentaires :
$<expression> $ | $ ::= $ | $ <terme>$ |
$ | $ ::= $ | $ <terme> ~ '+' ~ <expression>$ |
$<terme> $ | $::=$ | $ <facteur>$ |
$ | $::=$ | $ <facteur> ~ '*' ~ <terme>$ |
$<facteur> $ | $::=$ | $ ~ '(' ~ <expression> ~')'$ |
$ | $ ::=$ | $ <variable>$ |
en omettant la définition du SNT « variable», inutile ici.
On introduit un nouveau symbolisme (développé dans la suite) pour cette même grammaire ; il se comprend aisément :
$E $ | $ -> $ | $T$ |
$E $ | $ -> $ | $T + E$ |
$T $ | $ -> $ | $F$ |
$T $ | $ -> $ | $F * T$ |
$F $ | $ -> $ | $( E )$ |
$F $ | $ -> $ | $a$ |
$F $ | $ -> $ | $b$ |
... | ||
$F $ | $ -> $ | $ z$ |
...en admettant comme symboles de variables les caractères alphabétiques minuscules.
Le principe est de construire un automate à pile non déterministe qui admet des transitions vides :
On obtient les transitions suivantes :
$(1) $ | $ (e_0,\varepsilon,p_0) $ | $\longmapsto $ | $(e_0,E)$ |
$(2) $ | $ (e_0,\varepsilon,E) $ | $\longmapsto $ | $(e_0,T)$ |
$(3) $ | $ (e_0,\varepsilon,E) $ | $\longmapsto $ | $(e_0,T+E)$ |
$(4) $ | $ (e_0,\varepsilon,T) $ | $\longmapsto $ | $(e_0,F)$ |
$(5) $ | $ (e_0,\varepsilon,T) $ | $\longmapsto $ | $(e_0,F*T)$ |
$(6) $ | $ (e_0,\varepsilon,F) $ | $\longmapsto $ | $(e_0,(E))$ |
$(7) $ | $ (e_0,a,F) $ | $\longmapsto $ | $(e_0,\varepsilon)$ |
$\vdots $ | $ \vdots $ | $ \vdots $ | $ \vdots $ |
$(8) $ | $ (e_0,z,F) $ | $\longmapsto $ | $(e_0,\varepsilon)$ |
$(9) $ | $ (e_0,+,+) $ | $\longmapsto $ | $(e_0,\varepsilon)$ |
$(10) $ | $ (e_0,*,*) $ | $\longmapsto $ | $ (e_0,\varepsilon)$ |
$(11) $ | $ (e_0,(,() $ | $\longmapsto $ | $ (e_0,\varepsilon)$ |
$(12) $ | $ (e_0,),)) $ | $\longmapsto $ | $ (e_0,\varepsilon)$ |
Exercice : Soit l'automate à pile défini par $\Sigma=\{a,b\}$, $E=\{q_0,q_1,q_2\}$, $P=\{p_, A\}$ et les transitions suivantes
$(q_0,a,p_0) \mapsto (q_1,A) $
$(q_1,b,A) \mapsto (q_2,\epsilon)$
$(q_1,a,p) \mapsto (q_1,Ap)$
$(q_2,b,A) \mapsto (q_2,\epsilon)$
Exercice : Pour $u \in \Sigma^*$ , on note $|u|_a$ le nombre de $a$ dans $u$ et $|u|_b$ le nombre de $b$ dans $u$.
Donner un automate à pile qui reconnaît $L = \{u \in \Sigma^*, |u|_a = |u|_b \}$.
Exercice : Soit $\Sigma = \{0, 1\}$. Donner un automate à pile qui accepte un mot $u \in \Sigma^*$ ssi aucun préfixe de $u$ ne contient plus de 1 que de 0. Préciser si l’automate est déterministe.
Exercice : Soit $\Sigma = \{1, 2\}$. Donner un automate à pile qui reconnaît le langage suivant : $\{1^n 2^n | n \geqslant 0\}\cup \{1^n 2^{2n} | n \geqslant 0\}$ Préciser si l’automate est déterministe.
Exercice : Soit $\Sigma = \{a, b, c\}$. Donner un automate à pile qui reconnaît le langage suivant : $\{a^i b^j c^k | i = j \textrm{ ou } j = k\}$ Préciser si l’automate est déterministe.
Exercice : Soit $G$ la grammaire suivante : $S \rightarrow aAB ~~~ A \rightarrow aAB | a ~~~ B \rightarrow bBA | aC ~~~ C \rightarrow BaA.$
Exercice : Soit $G$ la grammaire suivante : $S \rightarrow aAB ~~~ A \rightarrow aAB | a ~~~ B \rightarrow bBA | aC | b ~~~ C \rightarrow BaA.$ Donner un automate à pile qui reconnaît le langage généré par la grammaire $G$.