• Aucun résultat trouvé

Générateur de couples de tableaux de hauteurs

partie de la postcondition ligne 5). Les contraintes d’un tableau de hauteurs sont ensuite établies jusqu’au point de "retour au sol" (deux premières parties de la postcondition ligne 6). La dernière postcondition, bien que triviale, est nécessaire pour établir la propriété de progression de la fonction next_height.

La sous-fonction zigzag est présentée dans le listing 6.11 avec son contrat et ses an- notations ACSL. Les postconditions prouvées dans la sous-fonction descent sont re- prises en préconditions qui permettent d’établir la postcondition finale ensures is_- height(h,2*n); (ligne 4), grâce à l’invariant de boucle ligne 6.

1 /*@ requires n > 0∧ \valid(h+(0..2*n-1))∧ h[0] == 1 ∧ 0 ≤ gnd ≤ 2*n-1; 2 @ requires h[gnd] == 0∧ gnd%2 == 1 ∧ is_non_neg(h,gnd) ∧ is_diff_1(h,gnd); 3 @ assigns h[gnd+1..2*n-1];

4 @ ensures is_height(h,2*n); */ 5 void zigzag(int h[], int n, int gnd) {

6 /*@ loop invariant gnd+1 ≤ i ≤ 2*n ∧ is_zigzag(h,gnd+1,i); 7 @ loop assigns i, h[gnd+1..2*n-1];

8 @ loop variant 2*n-i; */

9 for (int i = gnd+1; i < 2*n; i++) h[i] = 1-i%2; 10 }

Listing 6.11 – Fonction zigzag avec contrat et annotations ACSL.

Cette postcondition permet de prouver la correction de la fonction next_height. Cette fonction étant une instanciation du patron de génération par révision du suffixe présenté dans le chapitre 3, la propriété de progression est également prouvée par WP.

Ce générateur va nous servir de base pour concevoir un générateur séquentiel de couples de tableaux de hauteurs représentant des mélanges de mots de Dyck, présenté dans la partie 6.5.

6.5 G

ÉNÉRATEUR SÉQUENTIEL DE COUPLES DE TABLEAUX DE

HAUTEURS

D’après la définition 22, unmélange de deux mots de Dyck wa ∈ Da et wb ∈ Db est un

mot s sur l’alphabet {a, ¯a, b, ¯b} dont les restrictions à {a, ¯a} et {b, ¯b} sont respectivement wa

et wb. Une représentation connue d’un mélange représente le mot wa par des étapes E

(pour a) et O (pour ¯a) sur l’axe des abscisses, et le mot wbpar des étapes N (pour b) et S

(pour ¯b) sur l’axe des ordonnées) [Bernardi, 2007]. Une telle représentation est donnée

FIGURE6.5 – Représentation du mélange de mots de Dyck ab¯abaa¯a¯ab¯b¯b¯b par un chemin

dans la figure 6.5 pour le mélange ab¯abaa¯a¯ab¯b¯b¯b de taille 6. Comme nous pouvons le voir, certaines étapes peuvent alors se superposer et la représentation perdre ainsi en lisibilité.

C’est pourquoi nous proposons une représentation d’un mélange par un chemin de Dyck bicolore dont chaque étape porte la couleur a ou b, représentée respectivement en traits pleins et en pointillés. Les restrictions aux traits pleins et aux pointillés de ce chemin de Dyck bicolore constituent respectivement les chemins de Dyck de wa et wb. Cette

représentation utilise le lemme suivant.

Lemme1. Les transformations b 7→ a et ¯b 7→ ¯a transforment tout mélange de S en un mot

de Dyck de Da.

Démonstration. Soit s un mélange de S. D’après la proposition 2, (i) dans s, le nombre de lettres a (resp. b) est égal au nombre de lettres ¯a (resp. ¯b), et (ii) dans tout préfixe de s, le nombre de lettres a (resp. b) est supérieur ou égal au nombre de lettres de ¯a (resp. ¯b). Dans le mot s′ résultant de l’application des transformations b 7→ a et ¯b 7→ ¯a sur s, si

l’on effectue la somme du nombre de lettres a et la somme du nombre de lettres ¯a (celles provenant des lettres b et ¯b transformées ajoutées à celles initialement présentes dans s), les propriétés (i) et (ii) restent vraies dans s′= w

a(s′). Ainsi, s′∈ Da. 

L’implémentation de cette représentation d’un mélange de deux mots de Dyck pourrait être composée d’un unique tableau de hauteurs, et d’un tableau de valeurs booléennes indiquant la couleur de chaque étape. Cependant, en considérant la seule hauteur glo- bale du mélange, nous perdons les hauteurs individuelles de chaque chemin de Dyck. Or, nous devons connaître individuellement les hauteurs correspondant à chaque mot waet

wbafin de générer efficacement les mélanges. D’autre part, pour concevoir un générateur

de couples de tableaux de hauteurs codant les NCS, nous devons à nouveau connaître individuellement les hauteurs correspondant à chaque mot wa et wb afin de mettre en

évidence le motif croisé à exclure. C’est pourquoi nous proposons de représenter un mé- lange par un couple de tableaux de hauteurs (ha,hb), ha étant le tableau de hauteurs

de wa, et hble tableau de hauteurs de wb.

Définition 25 : Tableaux de hauteurs d’un mélange

Les tableaux de hauteurs d’un mélange de mots de Dyckw de taille n sont les tableaux ha[0..2n− 1] et hb[0..2n− 1] tels que ha[i](resp. hb[i]) représente l’excès

de lettres a (resp. b) par rapport aux lettres ¯a (resp. ¯b) dans un préfixe w[0..i] de w, c.a.d. dans les i + 1 premières lettres de w.

Cette représentation est illustrée par la figure 6.6, qui présente le mélange ab¯abaa¯a¯ab¯b¯b¯b de taille 6 constitué de deux mots de Dyck wa et wb, son chemin constitué d’étapes en

traits pleins pour wa et en pointillés pour wb, ainsi que ses deux tableaux de hauteurs ha

et hb.

Notons que la deuxième coordonnée des étapes si+1d’un chemin bicolore d’un mélange de mots de Dyck est égale à la somme des hauteurs ha[i]et hb[i]. De plus, contrairement

aux tableaux de hauteurs présentés dans la partie 6.3.3, les hauteurs peuvent commen- cer ici à 0 et peuvent rester constantes d’une étape à l’autre.

6.5. GÉNÉRATEUR DE COUPLES DE TABLEAUX DE HAUTEURS 97

0 1 2 3 4 5 6 7 8 9 1011 w= a b ¯a b a a ¯a ¯a b ¯b ¯b ¯b ha = 1 1 0 0 1 2 1 0 0 0 0 0

hb = 0 1 1 2 2 2 2 2 3 2 1 0

FIGURE 6.6 – Mélange de mots de Dyck avec son chemin bicolore et ses tableaux de

hauteurs.

Théorème2. Les tableaux h

a[0..2n− 1] et hb[0..2n− 1] sont les tableaux de hauteurs d’un

mélange de mots de Dyck w de taille n si et seulement si

(ha[0] = 1∧ hb[0] = 0)∨ (ha[0] = 0∧ hb[0] = 1), (6.5)

ha[2n− 1] = 0 ∧ hb[2n− 1] = 0, (6.6)

∀i. 0 ≤ i < 2n ⇒ (ha[i]≥ 0 ∧ hb[i]≥ 0) (6.7)

et

∀i. 0 ≤ i < 2n − 1 ⇒ ((ha[i + 1] = ha[i]∧ (hb[i + 1] = hb[i] + 1∨ hb[i + 1] = hb[i]− 1))

∨(hb[i + 1] = hb[i]∧ (ha[i + 1] = ha[i] + 1∨ ha[i + 1] = ha[i]− 1))).

(6.8)

Démonstration. Ce théorème est une conséquence du théorème 1 et de la définition 25. Les propriétés (6.6) et (6.7) découlent directement des propriétés (6.2) et (6.3). La propriété (6.5) découle de la propriété (6.1) car la première lettre d’un mélange de mots de Dyck peut commencer soit par a, soit par b. La complexité de la propriété (6.8) est liée au fait que les tableaux haet hbcomportent ici des paliers. En effet, les hauteurs d’un

tableau restent constantes lorsque les hauteurs de l’autre tableau varient. Ainsi, s’il existe un palier dans le tableau ha, on retrouve conjointement la propriété (6.4) vérifiée par le

tableau hb, et inversement, ce qui établit la propriété (6.8).  Nous proposons ici un générateur séquentiel qui construit tous les couples de tableaux de hauteurs correspondant aux mélanges de mots de Dyck d’une taille donnée selon l’ordre lexicographique induit par l’ordre b > a > ¯b > ¯a sur l’alphabet {a, ¯a, b, ¯b}. Selon cet ordre, le plus petit mot est (a¯a)n, et le plus grand mot est bn¯bn. Le processus de révision

du suffixe implémenté par la fonction de succession de ce générateur agit sur les deux tableaux haet hb.

La figure 6.7(a) présente le mélange ab¯abaa¯a¯ab¯b¯b¯b de taille 6 constitué des deux mots de Dyck wa = a¯aaa¯a¯a et wb = bbb¯b¯b¯b, son chemin bicolore, ainsi que ses deux tableaux de hauteurs ha et hb. La figure 6.7(b) présente le mélange w′ = ab¯abaa¯a¯b¯a¯ba¯a, succes-

seur du mélange présenté dans la figure 6.7(a) obtenu par application de la fonction de succession, son chemin et ses deux tableaux de hauteurs h′

a et h′b. Le mélange w a été

modifié à partir de l’abscisse 7. Notons que ce mélange n’appartient pas à NCS car le remplacement de ¯a par ¯b a créé un motif croisé qui apparaît aux indices 3, 4, 7 et 8.

0 1 2 3 4 5 6 7 8 9 1011 w= a b ¯a b a a ¯a ¯a b ¯b ¯b ¯b ha = 1 1 0 0 1 2 1 0 0 0 0 0

hb = 0 1 1 2 2 2 2 2 3 2 1 0

(a) mélange de mots de Dyck de taille 6.

0 1 2 3 4 5 6 7 8 9 1011 w′= a b ¯a b a a ¯a ¯b ¯a ¯b a ¯a h′a= 1 1 0 0 1 2 1 1 0 0 1 0 h′b= 0 1 1 2 2 2 2 1 1 0 0 0

(b) mélange successeur immédiat.

FIGURE6.7 – Exemple de mélange de mots de Dyck (a) et son successeur immédiat (b)

après la révision de son suffixe, avec leurs chemins et leurs tableaux de hauteurs. La fonction de succession next_s présentée dans le listing 6.12 est similaire à celle présentée dans la partie 6.4, mais elle comporte davantage de cas.

Nous allons détailler cet algorithme au niveau des manipulations des lettres composant un mélange, et faire la correspondance avec les manipulations des tableaux haet hb, tout

en faisant le lien avec l’implémentation montrée dans le listing 6.12.

Nous suivons les mêmes étapes que pour l’algorithme présenté dans la partie 6.4.1. Cependant, il existe ici plusieurs manières de modifier la lettre située au point de révision, afin d’obtenir le successeur selon l’ordre b > a > ¯b > ¯a. Ainsi, la détermination du point de révision et la modification des hauteurs au point de révision sont rassemblées dans la boucle for présentée lignes 3-11. Le principe de détermination du point de révision revest le suivant : lors d’un parcours de droite à gauche du mélange, trouver la première lettre qui peut être remplacée par une lettre supérieure selon l’ordre b > a > ¯b > ¯a, et la remplacer. On distingue les cas suivants, selon la lettre rencontrée et selon les hauteurs à l’indice courant. Dès que les conditions d’un cas sont remplies, le point de révision est cet indice courant, et la lettre située à cet indice est remplacée par une lettre supérieure. Si aucune de ces conditions n’est vraie, on passe à l’indice précédent.

1. Si l’on rencontre la lettre a, la seule manière d’incrémenter le mot est de la rem-

placer par une lettre b (ligne 4). Au niveau des tableaux de hauteurs, cela revient à décrémenter ha[rev]de 1 et incrémenter hb[rev]de 1.

2. Si l’on rencontre la lettre ¯b, nous la remplaçons par une lettre a si l’on dispose

d’assez de place d’ici la fin du mot pour y placer son matching ¯a (ligne 5-6). Cette condition se traduit par ha[rev] + hb[rev] + 2 <= 2n− 1 − rev pour les tableaux des

hauteurs. Cela revient à incrémenter de 1 à la fois ha[rev]et hb[rev].

3. Si l’on rencontre la lettre ¯a (ligne 7), deux possibilités s’offrent. Si le mot comporte

une lettre b qui n’a pas encore son matching dans le préfixe du mot (condition hb[rev] > 0) , nous remplaçons ¯a par ce matching ¯b (ligne 8). Cela revient à incré-

menter ha[rev]de 1 et décrémenter hb[rev]de 1.

4. Dans le cas contraire, on remplace la lettre ¯a par une lettre a si l’on dispose d’assez

de place d’ici la fin du mot pour y placer son matching ¯a (ligne 9). Cela revient à incrémenter ha[rev]de 2 et garder hb[rev]égal à hb[rev− 1]. Un remplacement par

une lettre b ne donnant pas le plus petit successeur, les différentes possibilités sont épuisées.

Dans l’exemple présenté dans la figure 6.7, le point de révision a pour abscisse 7. En effet les conditions des lignes 4 et 5 ne sont pas remplies, tandis que celle de la ligne 7 l’est