• Aucun résultat trouvé

L’impl´ementation de la figure 4.4 affiche l’ensemble des transitions sortant de l’´etat initial d’un automate Agrˆace au curseurc.

DFA A;

forward_cursor<DFA> c(A, A.initial()); if (c.first_transition()) {

do {

cout << c.src() << c.letter() << c.aim() << endl; } while (c.next_transition());

}

Fig. 4.4 – Affichage des transitions sortant de l’´etat initial deA

4.5 Trajectoire

Cette section introduit la notion de trajectoire qui g´en´eralise celle de chemin d´efinie `a la section 2.2.1. Elle unifie deux concepts distincts selon que l’on parle de parcours en profondeur (PEP) ou en largeur (PEL) et est indispensable au concept d’algorithme de parcours : `a une ´etape donn´ee d’un parcours, on appelle trajectoire la suite de transitions visit´ees jusqu’ici. Dans le cas du PEP, on a ´equivalence entre trajectoire et chemin classique et cette trajectoire est stock´ee dans une pile. Dans le cas du parcours en largeur la trajectoire est stock´ee dans une file.

Cette notion de trajectoire g´en´eralise la notion de curseur et donc d’it´erateur : elle mat´eria-lise l’´etape du calcul `a un instanttet sert `a d´efinir des intervalles d’application d’algorithme. En effet, soit A un algorithme et [x, y) un intervalle compos´e de deux «positions», une de d´epart x et une d’arriv´ee y.x mat´erialise les conditions de d´epart de Aet y sa condition d’arrˆet. Le calcul s’arrˆete lorsque, par incr´ementations successives dex, la condition(x == y) est v´erifi´ee. On peut donc construire une bijection entre les positions de l’it´erateur courant et les diff´erentes ´etapes de l’algorithme : `a toute ´etape deAon peut associer une unique position dans la s´equence, et chaque position dans la s´equence suffit pour retrouver l’unique ´etape de A qui lui correspond. On peut donc naturellement imaginer de g´en´eraliser cette notion aux algorithmes sur les automates en utilisant des curseurs sur des transitions mat´erialisant les intervalles. Les avantages de cette technique sont non-n´egligeables : couplage minimum entre l’algorithme et structure de donn´ees, masquage des donn´ees, application de l’algorithme sur tout ou partie de la s´equence permettant une plus grande libert´e de r´eutilisation.

Malheureusement, de simples positions dans l’automate ne permettent pas de construire la bijection d´ecrite plus haut : une transition seule ne peut suffire `a d´esigner sans ambigu¨ıt´e une ´etape d’un parcours comme nous allons le voir.

Imaginons que nous impl´ementions un algorithme affichant `a l’´ecran l’ensemble des mots reconnus par un automate en prenant garde de ne pas l’appliquer `a un automate cyclique au-quel cas le langage est infini et notre algorithme ne s’arrˆetera pas. En revanche, nous voulons

60 CHAPITRE 4. LES CURSEURS

pouvoir l’appliquer `a des automates dont le graphe orient´e poss`ede des ´etats convergeants, c’est-`a-dire des ´etats dont le nombre de transitions entrantes d´epasse 1 comme l’´etat 6 du DAG (Directed Acyclic Graph) de la figure 4.5. Un DAG est un automate dont le graphe sous-jacent ne poss`ede pas de cycle.

Imaginons maintenant que nous d´efinissions nos intervalles d’application d’algorithme avec

1 2 a 4 c 3 b 6 b 5 a b 7 c

Fig. 4.5 – Un DAG (Directed Acyclic Graph)

des positions dans l’automate : nous pourrions tout simplement utiliser un curseur sur la tran-sition (1, a,2) comme condition initiale du parcours. Par contre, quelle position choisir pour la condition d’arrˆet ? Comment construire avec de simples curseurs l’intervalle repr´esentant l’ensemble de l’automate et l’id´ee que le parcours doit comprendre toutes ses transitions ? C’est la premi`ere difficult´e qui n´ecessite l’introduction du concept de curseur de parcours. Dans le cas classique, l’intervalle [x,y) comprenant l’ensemble d’une s´equence a pour xun it´erateur sur le premier ´el´ement et pour y un it´erateur pointant derri`ere le dernier ´el´ement (voir figure 4.6), ce qui a l’avantage de d´efinir une convention standard homog`ene et coh´erente mˆeme dans le cas de la s´equence vide et de simplifier l’´ecriture du code exprimant la condi-tion d’arrˆet d’une boucle. L’impl´ementacondi-tion d’un tel it´erateur ne pose g´en´eralement pas de

L.end() L.begin()

Fig. 4.6 – Un intervalle sur une liste chaˆın´eeL `a quatre ´el´ements

probl`eme : un pointeur `a NULL peut-ˆetre consid´er´e comme d´esignant la position suivante du dernier ´el´ement d’une liste chaˆın´ee, ou bien l’adresse du dernier ´el´ement d’un tableau incr´e-ment´ee de 1. Sur un automate, cette notion ne serait ni intuitive du point de vue conceptuel ni ´evidente du point de vue de l’impl´ementation. Quel sens pourrait-on donner `a un«curseur pointant derri`ere la derni`ere transition de l’automate»? Quelle que soit la s´emantique choisie, elle ne ferait qu’obscurcir le concept et compliquer la mise en œuvre.

La deuxi`eme difficult´e ´enonc´ee plus haut, vient de ce qu’on ne peut construire de bijec-tion entre les posibijec-tions simples dans l’automate, c’est-`a-dire des transitions, et les ´etapes de l’algorithme. L’extraction du langage requiert l’utilisation d’un algorithme de parcours en

4.5. TRAJECTOIRE 61 profondeur d´ecrit `a la section 2.3.2. La figure 4.7 d´ecrit l’´etat de la pile des transitions `a chaque ´etape du parcours lors de l’extraction du langage du DAG de la figure 4.5. Chaque repr´esentation de pile est sous-titr´ee par le num´ero de l’´etape et les num´eros des actions en-treprises `a cette ´etape.

On voit qu’on peut associer `a la position (6, c,7) quatre ´etapes de l’algorithme : les ´etapes

1 a 2 1 a 2 3 b 6 2 b 3 1 a 2 2 b 3 1 a 2 1 c 4 1 c 4 4 a 5 5 b 6 1 c 4 4 a 5 1 c 4 4 a 5 5 b 6 1 a 2 3 b 6 1 a 2 3 b 6 1 a 2 3 b 6 2 b 3 1 c 4 4 a 5 1 c 4 1 c 4 4 a 5 5 b 6 1 c 4 4 a 5 5 b 6 1 a 2 2 b 3 ETAPE 1 ACTION 1 2 ACTION 1 3 ACTION 1

ACTION 2 ACTION 1 ACTION 1

6 c 7 ACTION 1 2 b 3 6 c 7 4 ACTION 1 2 b 3 6 c 7 ACTIONS 2, 3 ACTIONS 2, 3 PILE VIDE ACTIONS 2, 3 ACTIONS 2, 3 6 c 7 5 ACTIONS 2, 3 6 7 8 9 ACTION 1 10 11 12 13 14 15 16 17 ACTIONS 2, 3 ACTIONS 2, 3

Fig. 4.7 – L’´etat de la pile `a chaque ´etape du parcours en profondeur du DAG

4, 5, 12 et 13 o`u le sommet de la pile contient cette transition car c’est `a ce moment l`a que le traitement de la transition s’effectue. Il est normal de retrouver chaque transition au moins deux fois en sommet de pile : une fois au cours de la phase descendante (´etapes 4 et 12 avec action 1) et une fois au cours de la phase ascendante (´etapes 5 et 13 avec actions 2 et 3). Si nous prenons comme convention qu’une transition d´esigne l’´etape o`u elle apparaˆıt lors de la descente car elle est cens´ee mat´erialiser les conditions de d´epart du parcours, (6, c,7) d´esigne encore deux ´etapes : 4 et 12. Il est impossible pour l’algorithme de d´eterminer `a laquelle de ces deux positions le parcours d´emarrera. On ne peut donc associer sans ambigu¨ıt´e une position `

a une ´etape de l’algorithme.

Ceci am`ene `a faire la distinction entre position dans l’automate et position dans l’algorithme : une position dans l’automate d´esigne une transition alors qu’une position dans l’algorithme d´esigneun ´etat de la pile. Dans le cas particulier des it´erateurs et des algorithmes s´equentiels,

62 CHAPITRE 4. LES CURSEURS

les deux notions de position sont confondues mais sur les automates ces deux concepts dis-tincts sont mat´erialis´es par deux mod`eles diff´erents. La figure 4.7 «aplanit» la structure de l’automate et ram`ene le probl`eme au cas classique de la s´equence. La d´efinition d’un intervalle sur une s´equence implique deux it´erateurs repr´esentant `a la fois deux positions dans cette s´e-quence et deux ´etapes pr´ecises de l’algorithme car deux positions suffisent pour mat´erialiser les conditions de d´epart et d’arrˆet du calcul. Par exemple, l’intervalle de la figure 4.8 s’´etend sur la premi`ere moiti´e de la liste chaˆın´ee. D´efinir un intervalle dans la s´equence des ´etapes de

L.end() L.begin()

Fig. 4.8 – L’intervalle d´esignant la premi`ere moiti´e de la liste L

calcul, ici entre 1 et 17 signifie fournir deux piles, une pour les pr´econditions et une pour la condition d’arrˆet. Muni de ces conventions, il est ais´e d’appliquer un parcours soit :

– `a l’ensemble des transitions de l’automate grˆace `a l’intervalle d´efini par les ´etapes 1 et 17.

– `a un sous-automate, par exemple celui de la figure 4.9 grˆace `a l’intervalle d´efini par les ´etapes 1 et 9. 1 2 a