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.