• Aucun résultat trouvé

III.3.1 Tri `a bulles

p1 p2 p3 p4 p5 4 1 1 1 1 2 2 2 2 3 3 3 3 5 5 5 5 1 2 3 5 1 2 3 5 4 4 4 4 4 t t t t t point fixe

Fig. 2 – Une trace possible du tri d’une s´equence.

La transformation suivante permet d’impl´ementer un tri sur les s´equences : trans t = { x,y / y<x => y,x } ;;

fun tri s = t[’fixpoint] (s);;

Le motif filtre des ´el´ements voisins rang´es dans le mauvais ordre. De tels couples d’´el´ements seront replac´es dans le bon ordre (partie droite de la r`egle). Cette transformation doit ˆetre appliqu´ee sur une s´equence jusqu’`a ce qu’un point fixe soit atteint pour obtenir la s´equence tri´ee.

D´etaillons le fonctionnement de ce tri. Partons de la s´equence [4,1,3,5,2] (Fig. 2). L’al-gorithme de filtrage trouve les deux chemins correspondant aux couples d’´el´ements voisins mal rang´es : {[p1, p2]; [p4, p5]}. Ces deux chemins ne s’intersectant pas, ils sont tout deux s´el´ectionn´es pour ˆetre « transform´es ». Ainsi les valeurs en positions p1 et p2 sont remplac´ees respectivement par 1 et 4 et les valeurs en position p4 et p5 sont remplac´ees par 2 et 5. La transformation est

44 Exemples de programmes

ensuite appliqu´ee sur la nouvelle collection renvoy´ee : [1,4,3,2,5]. Deux chemins sont filtr´es avec succ`es : {[p2, p3]; [p3, p4]}. Leur intersection n’est pas vide. On doit donc en s´electionner un seul, par exemple [p2, p3] (ce choix est arbitraire). Donc 4 et 3 seront replac´es dans le bon ordre mais 2 reste inchang´e. La nouvelle collection est [1,3,4,2,5]. L’application suivante ne filtre qu’un chemin, ainsi que la suivante. Apr`es ces quatre applications, la s´equence est [1,2,3,4,5]. La s´equence ´etant tri´ee, la transformation ne trouve aucune instance du motif et renvoit donc cette mˆeme s´equence. Le point fixe est atteint et la s´equence tri´ee est renvoy´ee.

III.3.2 Le crible d’Eratosthene

Le principe est d’affiner l’algorithme de la section III.1.2 en utilisant une collection topo-logique de s´equence. Chaque ´el´ement i dans la s´equence correspond au ie nombre premier Pi calcul´e et est repr´esent´e par un enregistrement {prime = Pi}. Cet ´el´ement peut recevoir comme candidat un nombre n, qui est repr´esent´e par un enregistrement {prime = Pi, candidate = n}. Si le nombre candidat v´erifie le test, alors l’´el´ement se transforme en un enregistrement r = {prime = Pi, ok = n}. Si le voisin droit de r est de la forme {prime = Pi+1}, alors le nombre candidat n se d´eplace de r vers le voisin droit. Quand il n’existe plus de voisin `a la droite de r, alors le nombre n est un nombre premier et un nouvel ´el´ement est ajout´e `a la fin de la s´equence. Le premier ´el´ement de la s´equence est distingu´e des autres ´el´ements et produit les entiers candidats.

trans Erato = {

n:integer / ˜right n => n, {prime =n} ; (* Genere1 *) n:integer, {prime as x, ˜candidate , ˜ok }

=> n+1, { prime = x, candidate = n }; (* Genere2 *) {prime as x, candidate as y, ˜ok } / y mod x = 0

=>{prime = x} ; (* Test1 *)

{prime as x, candidate as y, ˜ok } / y mod x <> 0

=> {prime = x, ok = y} ; (* Test2 *)

{prime as x1, ok as y }, { prime as x2, ˜ok , ˜candidate }

=> {prime = x1}, {prime = x2, candidate = y} ; (* Next *) {prime as x, ok as y} as s / ˜right s

=> { prime =x}, {prime = y} ; (* NextCreate *)

} ;;

La figure 3 illustre le fonctionnement du programme. L’expression Eratos[N]((2, seq:())) ex´ecute N pas du crible d’Eratosthene. Par exemple, l’expression Eratos[100]((2, seq:())) calcule la s´equence : 42, {candidate =42, prime =2}, {ok =41, prime =3}, {prime =5}, {prime =7}, {prime =11}, {prime =13}, {ok =37, prime =17}, {prime =19}, {prime =23}, {prime =29}, {prime =31}, seq:().

prime = 7

candidate = 14

prime = 7

prime = 7 prime = 11 prime = 7 prime = 11

ok = 23 candidate = 23

prime = 7 prime = 7

ok = 23 candidate = 23

prime = 7 prime = 11 prime = 13 prime = 17

ok = 19 prime = 19 ok = 23 candidate = 23 Test1 Test2 Next

Fig. 3 – Le programme Erato. Quelques instanciations de r`egles et un fragment de s´equence construit par la transformation Erato.

III.3.3 Croissance d’un organisme uni-dimensionnel `a la fa¸con des L-syt`emes

Nous reprenons ici un exemple paradigmatique de formalisation d’un processus de crois-sance en L-syst`eme [Lin68]. Les ´etats du d´eveloppement d’un organisme filamentaire « uni-dimensionnel » sont donn´es `a travers la d´efinition d’un L-syst`eme d´ecrit dans [Mic96] que nous impl´ementerons ensuite en MGS. Les r`egles d´ecrivant l’´evolution de l’organisme permettent `a ses cellules de rester dans le mˆeme ´etat, de changer d’´etat, de se diviser en plusieurs cellules ou bien de disparaˆıtre.

Pour chaque cellule, deux ´etats a et b sont possibles. L’´etat a correspond `a une division cel-lulaire imminente, alors que l’´etat b correspond `a un ´etat d’attente durant une ´etape de division. Les r`egles de production et les quatre premi`eres d´erivations sont :

ω : br t0 : br

p1 : ar → albr t1 : ar p2 : al → blar t2 : albr p3 : br→ ar t3 : blarar

p4 : bl→ al t4 : alalbralbr

Les suffixes l et r indiquent la polarit´e des cellules. Un arbre de d´erivation du processus de croissance est illustr´e par la figure 4 (emprunt´ee `a [PH92]). Les r`egles de changement de polarit´e de cet exemple sont tr`es proches de celles de la bact´erie bleue-verte Anabaena catenula [WMS73, dKL87].

Une impl´ementation des r`egles de production en MGS est imm´ediate si l’on choisit la s´equence comme topologie :

trans Ana = {

"ar" => "al" , "br" ; "al" => "bl" , "ar" ; "br" => "ar" ;

46 Exemples de programmes a b a b b a a a a b a b t t t t t 0 1 2 3 4

Fig. 4 – Les quatre premi`eres d´erivations du processus de croissance de la bact´erie Anabaena catenula mod´elis´e par un L-syst`eme (la polarit´e des cellules est indiqu´ee avec une fl`eche).

"bl" => "al" ; } ;;

L’expression MGS suivante calcule les quatre premi`eres ´etapes du d´eveloppement : Ana[4]( "br" :: seq:() );;

L’application en parall`ele des r`egles de la transformation Ana fait que l’on obtient bien le r´esultat sp´ecifi´e par le L-syst`eme.

III.3.4 Propagation de la chaleur sur une barre

On simule la diffusion de la chaleur H le long d’une fine barre de m´etal. L’´equation diff´erentielle partiele parabolique ∂H∂t = α∂x2H2 d´ecrivant le processus de diffusion peut ˆetre discr´etis´ee :

H(x, t + ∆t) = (1 − 2c)H(x, t) + c(H(x − 1, t) + H(x + 1, t))

o`u H(x, t) est la temp´erature de l’´el´ement x de la s´equence `a l’instant t et le param`etre c d´epends de la caract´eristique de diffusion α de la barre de m´etal (c est inf´erieur a 0.5). On peut ajouter `a ce mod`ele des conditions aux bornes. Le programme MGS correspondant qui calcule l’´evolution de la temp´erature dans la barre de m´etal est facilement ´ecrit :

trans diffuse[c=0.25, Hleft=0, Hright=0] = { x / (left(x) == <undef>) => Hleft; x / (right(x) == <undef>) => Hright; x => (1-2*c)*x + c*(right(x) + left(x)) } ;;

Les deux premi`eres r`egles g`erent les conditions aux bornes donn´ees par les param`etres Hleft et Hright. Les op´erateurs right et left permettent d’acc´eder aux voisins d’un ´el´ement dans une s´equence. La valeur sp´eciale <undef> est retourn´ee comme valeur associ´ee `a une position qui n’a pas de valeur. Le trac´e sur la figure 5 illustre le r´esultat de l’ex´ecution.

Fig.5 –R´esultat de la diffusion de la chaleur. Les extr´emit´es de la barre sont maintenues `a la temp´erature de 0◦C. Initialement, on ne chauffe que le tiers central de la barre. Le temps s’´ecoule de l’arri`ere vers l’avant.