• Aucun résultat trouvé

4.4.1 D´efinitions

4.4.1.1 Transition puits

On appelle transition puitstout triplet (q, σ, p) Q×Σ×Q pour lequel la fonction de transition δ1 ´echoue, i.e. δ1(q, σ) =p= 0. Elles sont donc ´etiquet´ees par Σ\~c(q) et pointent vers l’´etat nul ou puits. Par soucis de simplification, on limitera ces transitions `a une par ´etat ce qui revient `a int´egrer `a notre mod`ele d’automate le m´ecanisme d’´etat par d´efaut d´ecrit `a la section 2.2.5.1.

4.4.1.2 Curseur monodirectionnel

Le concept de curseur monodirectionnel raffine celui de curseur simple car c’est un pointeur sur une transition (q, σ, p)∈Q×Σ×Qde l’automate. Il permet non seulement l’acc`es `a cette transition mais aussi le parcours de l’ensemble des transitions sortant de l’´etat q soit δ2(q). On notera cδ un curseur pointant sur la transition δ= (q, σ, p).

Remarque Le curseur monodirectionnel est d´ej`a un curseur de parcours, mais sa politique d’it´eration est limit´ee `a des«descentes»dans l’automate dans le sens des transitions d´efinies. Des sch´emas d’it´eration plus ambitieux comme le parcours en profondeur qui n´ecessitent de

«remonter»dans l’historique des transitions travers´ees induisent d’autres concepts pr´esent´es dans les sections suivantes.

4.4.2 Propri´et´es

Un curseur monodirectionnel poss`ede des propri´et´es ´equivalentes `a celles du curseur d´efi-nies `a la section 4.3.2 mais g´en´eralis´ees aux transitions :

1. Un curseur monodirectionnel a une valeur singuli`ere lorsqu’il ne pointe sur aucune tran-sition ou sur une trantran-sition puits.

2. Il est assignable.

3. Il est constructible par d´efaut. Il poss`ede alors une valeur singuli`ere.

4. Il est incr´ementable et d´er´ef´eren¸cable s’il ne pointe pas sur une transition puits. 5. La relation d’´equivalence sur ces curseurs s’applique aux transitions et non plus

unique-ment aux ´etats sources :

≡cδ ⇔δ

6. La transition puits (q, ǫ,0) mat´erialise la position de fin de la s´equence des transitions sortant d’un ´etat q :

4.4. LE CURSEUR MONODIRECTIONNEL 57 Autrement dit, partant de la premi`ere transition (q, σ1, p1), un nombre fini d’incr´emen-tations, ´eventuellement nul, m`ene c en position fin de s´equence (q, ǫ,0). L’ordre dans lequel l’ensemble est parcouru n’est pas d´efini, il n’est cependant pas interdit d’en im-poser un `a des fins algorithmiques ou d’efficacit´e.

4.4.3 Comportement et interface

Un mod`ele de curseur monodirectionnel doit impl´ementer l’interface du curseur, c’est-` a-dire toutes les fonctionnalit´es concernant l’´etat source q de la transition point´ee (q, σ, p), plus le comportement relatif `a l’acc`es des transitions sortantes : le choix et l’acc`es `a l’´etiquetteσ

et `a l’´etat butp. La table suivante en r´esume les fonctionnalit´es :

M´ethode Expression S´emantique

´etat source x.src(); retourneq

source final x.src_final(); retournevrai siq ∈F

avancer par a x.forward(a); avance le long de la transition sortant de q ´etiquet´ee para. Retournevrai si

δ1(q, a)6= 0

existence x.exists(a); retournevrai siδ1(q, a)6= 0 nul x.sink(); retournevrai si q= 0. ´etat but x.aim(); retournep

lettre x.letter(); retourneσ

but final x.aim_final(); retournevrai sip∈F

comparaison (x == y) vrai sixrepr´esente la mˆeme transition quey

avancer x.forward(); avance le long de la transition point´ee parx

1`ere transition x.first_transition(); positionnexsur la premi`ere transition sortant de q

transition suivante x.next_transition(); positionnexsur la transition suivante de l’ensemble δ2(q)

trouver x.find(a); positionne xsur la transition ´etiquet´ee parasi elle existe

constructeur X x; xa une valeur singuli`ere. Seule par d´efaut l’affectation est autoris´ee constructeur X x = y; xest une copie de y de copie X x(y);

affectation x = y; post-condition : xest une copie de y affectation d’un x = p; post-condition : xpointe sur l’´etatp ´etat

Les m´ethodes first_transitionetnext_transitionimpl´ementent l’it´eration sur les tran-sitions sortant de l’´etat source. Elles renvoient toutes les deux une valeur bool´eenne indiquant l’´etat du curseur apr`es l’op´eration : faux si l’ensemble des transitions est ´epuis´e, ce qui si-gnifie que le curseur pointe sur la transition puits (q, ǫ,0), qu’il a une valeur singuli`ere et que jusqu’`a ce qu’il soit repositionn´e sur une transition valide, seules les op´erations concernant

58 CHAPITRE 4. LES CURSEURS

l’´etat source q sont autoris´ees. De mˆeme, la m´ethode find recherche la transition ´etiquet´ee par a, le positionne dessus et renvoie vrai si elle existe. Dans le cas contraire, le curseur se retrouve sur la transition puits.

La m´ethodeforward()ne renvoie pas de valeur et ne doit ˆetre utilis´ee que lorsque la transition point´ee est bien d´efinie, c’est-`a-dire apr`es que l’invocation d’une m´ethode de positionnement a renvoy´e vrai.

Remarque Un acc`es s´equentiel d´eterministe1 aux transitions sortant d’un ´etat suppose une relation d’ordre sur les couples (σ, p)∈Σ×Q. Cette relation impose l’ordre dans lequel l’ensembleδ2(q) = ((σ1, p1), ...,(σn, pn),(ǫ,0)) sera parcouru par appels successifs `a la m´ethode next_transition:

i < j⇔(σi, pi)<(σj, pj)

Beaucoup d’algorithmes se contentent d’un acc`es non d´eterministe, c’est-`a-dire sans ordre pr´ed´efini mˆeme d’une it´eration sur l’autre, mais il arrive que l’efficacit´e repose sur l’existence de la relation d’ordre. Par exemple, les op´erations ensemblistes effectuent le parcours des transitions sortant d’un ´etat en temps lin´eaire grˆace `a la relation d’ordre d´efinie sur Σ :

(σ, p)<(σ, p)⇔σ < σ

ce qui signifie un acc`es `a la s´equence des transitions dans l’ordre alphab´etique des lettres les ´etiquetant2, dans le cas contraire la complexit´e est quadratique. La nature de la relation d’ordre d´epend de la repr´esentation en m´emoire du container d’automate et du comportement du curseur.

Le concept de forward cursor pr´epare le terrain aux curseur de parcours et aux algorithmes plus sophistiqu´es. La structure non s´equentielle des automates oblige `a introduire le concept de trajectoire et `a distinguer position dans l’automate et position dans l’algorithme.

4.4.4 Param`etres d’instanciation

Bien que conceptuellement un curseur monodirectionnel contienne un curseur simple et adapte son comportement, pour des raisons de coh´erence et de simplification d’utilisation3, le patron de curseur monodirectionnel standard est param´etr´e par la classe d’automate. Ce patron h´erite de l’interface et de l’impl´ementation de la classe cursor:

template <class DFA>

class forward_cursor : public cursor<DFA> {

... };

1

Ici d´eterministe d´esigne un acc`es aux transitions dans un ordre bien d´efini et immuable tant que le container n’a pas effectu´e explicitement d’op´erations `a effet de bord, `a ne pas confondre avec la propri´et´e de d´eterminisme des automates.

2

On consid`ereσ < σ′comme la relation d’ordre alphab´etique classique. 3

L’impl´ementation duforward_cursorrepose sur celle ducursor. L’utilisation de toute autre classe pos-s´edant un comportement mˆeme tr`es l´eg`erement diff´erent peut provoquer des incoh´erences car les suppositions sur les invariants, les pr´e et post-conditions des m´ethodes peuvent alors s’av´erer ´erron´ees. C’est pourquoi on force leforward_cursorofficiel `a utiliser la classe officiellecursoret qu’il n’est pas possible d’en changer. En outre, deux param`etres d’instanciation auraient rendu son utilisation malais´ee.

4.5. TRAJECTOIRE 59