• Aucun résultat trouvé

Algorithmes efficaces de recherche pour une machine chimique pair-à-pair

N/A
N/A
Protected

Academic year: 2021

Partager "Algorithmes efficaces de recherche pour une machine chimique pair-à-pair"

Copied!
39
0
0

Texte intégral

(1)

HAL Id: dumas-00725210

https://dumas.ccsd.cnrs.fr/dumas-00725210

Submitted on 24 Aug 2012

HAL is a multi-disciplinary open access archive for the deposit and dissemination of sci-entific research documents, whether they are pub-lished or not. The documents may come from teaching and research institutions in France or abroad, or from public or private research centers.

L’archive ouverte pluridisciplinaire HAL, est destinée au dépôt et à la diffusion de documents scientifiques de niveau recherche, publiés ou non, émanant des établissements d’enseignement et de recherche français ou étrangers, des laboratoires publics ou privés.

Algorithmes efficaces de recherche pour une machine

chimique pair-à-pair

Matthieu Perrin

To cite this version:

Matthieu Perrin. Algorithmes efficaces de recherche pour une machine chimique pair-à-pair. Calcul parallèle, distribué et partagé [cs.DC]. 2012. �dumas-00725210�

(2)

Rapport de stage

master informatique sp´ecialit´e Recherche en informatique

Universit´e de Rennes I

Algorithmes efficaces de recherche pour une

machine chimique pair-`a-pair

Matthieu Perrin

´Ecole Normale Sup´erieure de Cachan, antenne de Bretagne matthieupierre.perrin@gmail.com

Stage r´ealis´e de F´evrier 2012 `a Juin 2012

Supervis´e par

Marin Bertier C´edric Tedeschi

Maˆıtre de conf´erences Maˆıtre de conf´erences INSA de Rennes Universit´e de Rennes I ´Equipe ASAP, IRISA, ´Equipe Myriads, IRISA,

INRIA Rennes Bretagne Atlantique INRIA Rennes Bretagne Atlantique Marin.Bertier@irisa.fr cedric.tedeschi@inria.fr

R´esum´e

La difficult´e de la programmation des syst`emes r´epartis `a large ´echelle est encore aujourd’hui un frein `a leur d´eveloppement. Le paradigme chimique fournit une abstraction de haut niveau adapt´ee `a la programmation de tels syst`emes. Cependant, l’ex´ecution de programmes

chimiques n´ecessite la recherche de tuples d’´el´ements d’un multi-ensemble v´erifiant une certaine propri´et´e. Le but de ce rapport est d’am´eliorer la complexit´e de cette op´eration.

Mots cl´es

(3)

Internship report

master of Computer Sciences speciality research in computer sciences

University of Rennes I

Efficient research algorithms for a peer-to-peer

chemical machine

Matthieu Perrin

´Ecole Normale Sup´erieure de Cachan, Brittany extension matthieupierre.perrin@gmail.com

Internship conducted from February 2012 to June 2012

Under the supervision of

Marin Bertier C´edric Tedeschi

Assistant professor Assistant professor INSA Rennes University of Rennes I ASAP teem, IRISA, Myriads teem, IRISA,

INRIA Rennes Bretagne Atlantique INRIA Rennes Bretagne Atlantique Marin.Bertier@irisa.fr cedric.tedeschi@inria.fr

Abstract

The difficulty of programming large scale distributed systems is still a limit for their developement. The chemical paradigm provides a high level abstraction appropriate to the programming of such systems. However, executing chemical programs requires being able to

find a tuple of elements satisfying a given property in a multiset. This report aims at presenting a new algorithm that improves the complexity of this operation.

Keywords

(4)

“Indeed, I believe that virtually every important aspect of programming arises somewhere in the context of sorting and searching !”

Donald E. Knuth,

(5)

Table des mati`eres

Introduction 5

1 La programmation chimique 6

1.1 Les mod`eles de la programmation chimique . . . 6

1.2 Programmer en chimique . . . 8

1.3 Les d´efis des machines chimiques . . . 9

2 ´Etude th´eorique 11 2.1 Formalisation de la recherche de r´eactions . . . 11

2.2 Carrure d’une r`egle . . . 15

2.3 Affectations . . . 18

2.4 Pr´esentation de l’algorithme . . . 21

3 Algorithme d´ecentralis´e 23 3.1 Construction de l’ensemble d’axiomes induits . . . 23

3.2 Recherche de r´eactifs . . . 28

3.3 D´etection de l’inertie . . . 32

Travaux futurs et conclusion 34 Pour aller plus loin . . . 34

Conclusion . . . 36

Remerciements . . . 36

(6)

Introduction

La construction de grosses applications r´eparties capables de s’adapter de fac¸on au-tonome `a l’´evolution de leur environnement est encore aujourd’hui un travail de titans. L’h´et´erog´en´eit´e, la distribution g´eographique et les faibles garanties de fiabilit´e offertes par les ressources disponibles imposent une gestion fine des donn´ees, des messages et des res-sources de calcul afin de garantir des propri´et´ees d’auto-organisation en une structure adapt´ee au probl`eme, d’auto-adaptation en fonction de la variation de performance de constituants de la plate-forme au cours du temps, et d’auto-r´eparation pour contrer le manque de fiabilit´e des machines.

Pour r´epondre `a ces difficult´es, de nouveaux paradigmes de programmation doivent ˆetre pens´es pour apporter des abstractions de haut niveau susceptibles de cacher la complexit´e inh´erente aux r´eseaux h´et´erog`enes, et donc simplifier la conception d’applications r´eparties.

Le paradigme de programmation chimique [4] permet de se repr´esenter des calculs comme des r´eactions chimiques apparaissant de fac¸on autonome et parall`ele parmi les mol´ecules de donn´ees afin de produire de nouvelles mol´ecules de r´esultat. Ex´ecuter des programmes chi-miques sur une plate-forme r´epartie revient `a effectuer des r´e´ecritures sur un multi-ensemble contenant les mol´ecules du calcul et distribu´e sur la plate-forme.

La construction d’un tel multi-ensemble dans une plate-forme dynamique pair-`a-pair `a large ´echelle a pour le moment seulement ´et´e initialis´ee, en se basant soit sur des tables de ha-chage distribu´ees [21, 19], soit sur des technologies de type gossip [11]. De nombreux probl`emes restent cependant ouverts dans ce domaine. En particulier, la recherche d’un sous-ensemble de mol´ecules satisfaisant la condition de r´eaction d’une r`egle est toujours bas´ee sur une exploraa-tion exhaustive de toutes les combinaisons possibles de mol´ecules, ce qui est particuli`erement peu efficace, surtout pour les r`egles prenant beaucoup d’arguments.

La question que l’on s’est pos´e pendant ce stage concernait la possibilit´e d’am´eliorer le temps de recherche de r´eactifs pour des r`egles compliqu´ees. La premi`ere partie de ce rapport expose plus en d´etail le principe de la programmation chimique. Nous ´etudierons en deuxi`eme partie comment une ´etude des r`egles sous un aspect plus th´eorique permet d’optimiser la re-cherche de r´eactifs. En troisi`eme partie, nous verrons comment les lec¸ons de l’´etude th´eoriques peuvent servir `a cr´eer une machine chimique r´epartie plus efficace. Enfin, nous terminerons par un expos´e du travail qu’il reste `a accomplir et nous concluerons.

(7)

Chapitre 1

La programmation chimique

Le but de ce chapitre est d’expliquer les principes de la programmation chimique. Nous verrons tout d’abord les principaux formalismes et langages bas´es sur ce paradigme, puis nous ´etudierons des exemples de programmes chimiques. Dans la derni`ere partie, nous entrerons plus dans les d´etails des probl`emes pos´es par la mise en œuvre de la programmation chimique.

1.1

Les mod`eles de la programmation chimique

Dans un v´eritable syst`eme chimique, des mol´ecules de toutes sortes entrent en contact et r´eagissent pour en former de nouvelles. Les r`egles qui r´egissent ces r´eactions sont `a l’origine de la vie et de tout ce que l’on peut trouver sur Terre.

Le paradigme de la programmation chimique est bas´e sur une m´etaphore de cet aspect particuli`erement productif de la nature. Les donn´ees `a traiter y sont compar´ees `a des mol´ecules et les algorithmes `a ex´ecuter sont repr´esent´es comme des r`egles de r´eaction sur ces mol´ecules. La chimie a inspir´e de nombreux formalismes [9] utiles dans de nombreux domaines tr`es diff´erents. Nous allons maintenant bri`evement pr´esenter quelques-uns des plus importants dans le domaine de la programmation chimique.

Le mod`ele Γ. Un programme ´ecrit en Γ [4, 15] est repr´esent´e par un couple (RΓ, AΓ) o `u RΓ

est la fonction bool´eenne des conditions de r´eactions, qui d´efinit si n mol´ecules peuvent r´eagir ou non, et AΓ est la fonction d’action, qui d´efinit les produits des r´eactions. Un programme

peut ˆetre ex´ecut´e sur un multi-ensemble M , contenant les mol´ecules `a faire r´eagir.

L’ex´ecution d’un programme s’apparente `a une suite de r´e´ecritures du multi-ensemble. Tant qu’il existe des mol´ecules dans M qui v´erifient la condition de r´eaction, ils sont remplac´es par le r´esultat de la fonction d’action, selon l’algorithme 1.

Le programme chimique est termin´e lorsque plus aucune r´eaction n’est possible. On parle alors d’´etat d’inertie du syst`eme. La programmation chimique est non-d´eterministe, car l’ordre dans lequel deux r´eactions concurentes sont ex´ecut´ees ne peut pas ˆetre pr´edit. Cela implique que l’unicit´e de l’´etat d’inertie, et donc du r´esultat du programme, ne peut ˆetre assur´ee que par le programmeur lui-mˆeme s’il souhaite que cette propri´et´e soit v´erifi´ee.

(8)

Algorithme 1: L’op´erateur Γ applique un programme (RΓ, AΓ) `a un multi-ensemble M Γ(RΓ, AΓ)(M ) : 1 if ∃x1,· · · , xn∈ M |RΓ(x1,· · · , xn) then 2 return Γ(RΓ, AΓ)(M − {x1,· · · , xn}) ∪ AΓ(x1,· · · , xn) 3 else 4 return M 5 end 6

Le γ-calcul. A l’instar du λ-calcul au regard de la programmation fonctionnelle, le γ-calcul` [6] est un syst`eme de calcul minimal d’ordre sup´erieur permettant de formaliser la program-mation chimique.

Un γ-terme est d´efini par la grammaire :

M ::= x variable

| (γ hxi .M ) γ−abstraction | (M1, M2) multi−ensemble

| hM i solution.

L’op´erateur ≪,≫, associatif et commutatif permet d’´enum´erer les mol´ecules, d’un

multi-ensemble. Certaines mol´ecules particuli`eres, les sous-soulutions, ont pour r ˆole d’isoler des mol´ecules du reste du multi-ensemble en formant des sous-solutions. Un γ-terme peut donc ˆetre vu comme une hi´erarchie de solutions contenant des mol´ecules.

En γ-calcul, les r`egles de r´eaction sont directement int´egr´ees dans la solution sous la forme de mol´ecules particuli`eres, les γ-abstractions. Il devient ainsi possible d’utiliser l’ordre sup´erieur, qui permet de modifier le comportement du programme au cours du temps. Par exemple, une r`egle qui n’est plus utilis´ee peut ˆetre supprim´ee, ou `a l’inverse de nouvelles r`egles peuvent ˆetre introduites.

Comme dans Γ, les r´eactions ont lieu jusqu’`a ce que l’inertie soit atteinte. Une sous-solution inerte peut alors ˆetre utilis´ee par une r`egle comme n’importe quelle mol´ecule.

Ce formalisme est Turing-complet, puisqu’il permet d’encoder le λ-calcul. Il est mˆeme plus expressif que ce dernier car il permet d’exprimer du non-d´eterminisme.

Le langage HOCL. HOCL [3] (pour Higher Order Chemical Language), est un langage utilisable bas´e sur le γ-calcul, mais ´etendu avec des types, des valeurs de base telles que les entiers, les bool´eens et les chaˆınes de caract`eres, ainsi que des expressions, des couples, la solution vide et la possibilit´e de nommer les mol´ecules.

Une r`egle de HOCL est d´efinie par la syntaxe

replace x1 :: T1,· · · xn:: Tnby P (x1,· · · xn) if C(x1,· · · xn)

qui signifie que, si elles v´erifient la conditon C(x1,· · · xn), les mol´ecules x1,· · · xnde types

res-pectifs T1,· · · Tndoivent ˆetre supprim´ees du multi-ensemble et ˆetre remplac´ees par les valeurs

(9)

L’impl´ementation s´equentielle du langage requiert une compilation les programmes HOCL en Java avant de les ex´ecuter. Pour cette raison, toute fonction Java est accept´ee pour P et les mol´ecules peuvent ˆetre des instances de classes Java.

1.2

Programmer en chimique

Apr`es avoir vu les principaux formalismes et langages de programmation du paradigme chimique, nous allons illustrer l’expressivit´e du paradigme grˆace `a quelques exemples.

Un exemple simple. L’algorithme 2, qui calcule le plus grand nombre pair d’un multi-ensemble, utilise tous les principaux aspects de HOCL.

Algorithme 2: Calcul du plus grand ´el´ement pair en HOCL let getEvens = replace x :: int by if x%2! = 0 in

1

let getM ax = replace x :: int, y :: int by x if x ≥ y in

2

let replaceRule = replace-one hgetEvens, ?ωi by hgetM ax, ωi in

3

let clean = replace-one hgetM ax, ?ωi by ω in

4

hreplaceRule, clean, hgetEvens, 2, 3, 5, 6, 8, 9ii

5

Initialement, la sous-solution n’est pas inerte. Seule la r`egle getEvens, qui supprime tous les nombres impairs, peut r´eagir pour arriver `a l’´etat hreplaceRule, clean, hgetEvens, 2, 6, 8ii, dans lequel la sous-solution est inerte. La r`egle replaceRule peut alors r´eagir, donnant l’´etat hclean, hgetM ax, 2, 6, 8ii, qui r´eagit pour donner le r´esultat hclean, hgetM ax, 8ii, puis h8i, qui est bien le plus grand nombre pair parmi ceux initialement dans le multi-ensemble.

Autres exemples. L’article [5] ouvre de nombreuses pistes pour impl´ementer des algorithmes de traitement de chaˆınes de caract`eres ou d’images ou de recherche du plus court chemin dans un graphe dans un contexte chimique.

Par ailleurs, le paradigme chimique se montre bien adapt´e `a la sp´ecification des appli-cations d´ecentralis´ees. Nous avons choisi deux exemples qui montrent des domaines o `u la programmation chimique a permis d’apporter un nouveau regard ces derni`eres ann´ees.

Un syst`eme informatique est dit autonome [17] s’il est capable de s’auto-organiser en res-pectant des propri´et´es d´efinies `a l’avance. Ces syst`emes s’occupent de leur propre compor-tement sans intervention ext´erieure. La principale difficult´e de conception d’un tel syst`eme vient de la transformation des propri´et´es que l’on cherche `a garantir en algorithmes r´eels. La programmation chimique peut ˆetre utilis´ee pour sp´ecifier [5], et mˆeme impl´ementer [2] de tels syst`emes.

L’Internet des services a pendant longtemps ´et´e consid´er´e comme le futur d’Inter-net, mais l’absence de moyens simples et d´ecentralis´es pour g´erer la composition de ser-vices en a empˆech´e le grand d´eveloppement pr´evu. Dans ce domaine, on a besoin de r´epondre `a certains challenges injectant des propri´et´es d’auto-organisation, d’auto-adaptation et d’auto-r´eparation, voire d’auto-optimisation. Pour cela, le mod`ele chimique, poss´edant in-trins`equement ces qualit´es, est prometteur. En particulier, il a r´ecement ´et´e montr´e [12] que le

(10)

paradigme chimique pouvait ˆetre utilis´e pour coordonner les services de mani`ere totalement d´ecentralis´ee.

1.3

Les d´efis des machines chimiques

Le paradigme chimique offre de nouveaux horizons `a l’inventivit´e des d´eveloppeurs grˆace `a des concepts simples et puissants. En principe, la recherche de r´eactions est largement pa-rall´elisable, en raison de la propri´et´e de localit´e : aucune propri´et´e d’ensemble ne peut ˆetre demand´ee sur le multi-ensemble en entier dans une condition de r´eaction. Il reste pourtant des probl`emes ouverts `a r´esoudre pour avoir une machine chimique compl`ete.

Ex´ecution d’un programme chimique. L’algorithme g´en´eral (algorithme 3), adapt´e des ar-ticles [5, 9] qui pr´esentent une solution g´en´erale `a la chimie artificielle, est compos´e d’une boucle de recherche de mol´ecules du multi-ensemble P pouvant r´eagir ensemble. Lorsque de telles mol´ecules sont d´ecouvertes, elles sont remplac´ees par le produit de leur r´eaction.

Algorithme 3: Algorithme g´en´eral d’ex´ecution d’un programme chimique while ¬Inert(P ) do 1 if ∃ (r =replace x1,· · · xnby y1,· · · ymif f (x1,· · · xn)) , x1,· · · xn∈ P s.t.f (x1,· · · , xn) 2 then P :=remove(P, x1,· · · xn); 3 P :=insert(P, y1,· · · ym); 4

Plusieurs processus qui partagent le mˆeme multi-ensemble de mol´ecules peuvent ex´ecuter cet algorithme en parall`ele. Cela pose trois sous-probl`emes.

– L’algorithme s’arrˆete lorsque la solution est inerte. En HOCL, cette situation d’inertie est atteinte quand toutes les conditions de r´eaction ne sont v´erifi´ees par aucun tuple de mol´ecules. Comme nous le verrons dans la partie 2.1, d´ecider si une solution est inerte est un probl`eme algorithmiquement difficile.

– Trouver les r´eactions possibles dans le multi-ensemble est le probl`eme dual du pr´ec´edent, puisque la terminaison est assur´ee si et seulement si aucune r´eaction n’est possible. Cependant, s´eparer les deux sous-probl`emes peut ˆetre pratique dans le cas d’un calcul parall`ele car il est possible qu’`a un instant donn´e, aucune r´eaction ne soit possible dans un processus en raison de verrouillages de certaines mol´ecules par d’autres proces-sus, sans que la r´eaction soit termin´ee pour autant.

– Le dernier probl`eme est la modification du multi-ensemble. `A chaque it´eration de l’algo-rithme, des mol´ecules sont retir´ees de la solution et d’autres y sont ajout´ees de mani`ere atomique.

Un algorithme de capture atomique. La capture atomique de mol´ecules peut ˆetre vu comme un probl`eme de synchronisation entre des processus dans lequel la propri´et´e de vivacit´e est que si plusieurs processus cherchent `a effectuer une r´eaction, au moins l’un d’eux pourra la faire. L’article [7] propose un algorithme bas´e sur deux protocoles. L’un, dit optimiste, est conc¸u pour minimiser l’utilisation du r´eseau en abandonnant une r´eaction d`es que l’un des r´eactifs qu’il envisageait pour sa r´eaction est ´egalement pris´e par un autre pair. Dans un syst`eme dans

(11)

lequel beaucoup de r´eactions sont possibles, la probabilit´e qu’un r´eactif soit pris´e par plusieurs pairs est faible, donc un pair optimiste garde l’espoir de pouvoir ex´ecuter des r´eactions. Un syst`eme de commutation permet de toujours choisir l’algorithme le plus avantageux des deux. Recherche de mol´ecules dans un multi-ensemble. La recherche de mol´ecules pouvant r´eagir dans le multi-ensemble est tr`es proche du probl`eme DisCSP [8] qui est presque tou-jours trait´e par une exploration exhaustive des nœuds du r´eseau, avec ´eventuellement une optimisation grˆace au back-tracking [10, 22].

Naturellement, la recherche de mol´ecules est donc ´egalement toujours trait´ee par une re-cherche exhaustive. On peut citer par exemple un algorithme utilisant une m´emoire partag´ee entre les cœurs de calcul [14], ou un syst`eme regroupant les mol´ecules en sacs dans lesquels tous les tests ont ´et´e effectu´es [16].

Nous pouvons enfin pr´esenter les travaux r´ealis´es dans [18], qui se basent sur un r´eseau pair-`a-pair non structur´e et des protocoles ´epid´emiques pour mod´eliser le mouvement brow-nien naturellement pr´esent dans une solution chimique r´eelle. Cependant, ce travail ne cherche pas `a d´etecter l’inertie, ce qui rend l’approche incompl`ete.

Ainsi, pour savoir si une solution contenant n mol´ecules et une r`egle d’arit´e k est inerte, tous ces algorithmes testeront toutes les combinaisons de k mol´ecules, parmi les n possibles.

Ce qu’il ressort de cette analyse est la difficult´e de trouver des algorithmes efficaces pour la recherche de r´eactifs dans une solution chimique. [16] fait mˆeme le postulat que la complexit´e en

 n k



qu’ils atteignent est une limite optimale. Nous nous proposons dans la suite du rapport d’´etudier le bien-fond´e de cette assertion.

(12)

Chapitre 2

´Etude th´eorique

Nous venons de voir combien le pardigme chimique ´etait prometteur en terme d’expres-sivit´e et d’adaptation aux probl`emes habituels de l’algorithmique r´epartie. Des syst`emes au-tonomes `a la programmation de l’internet des services, la programmation chimique simplifie de nombreux probl`emes apparamment tr`es complexes. Derri`ere la simplicit´e du paradigme se cache pourtant un grand probl`eme : comment trouver des mol´ecules capables de r´eagir entre elles, ou, `a l’inverse, comment montrer que plus aucune r´eaction n’est possible dans la solu-tion ? `A cette question, toutes les impl´ementations actuelles du langage se r´esignent `a tester toutes les combinaisons imaginables de mol´ecules, impliquant une complexit´e

 n k  ∼ n≫kn k

pour n mol´ecules et une r`egle d’arit´e k. Dans ce chapitre, nous allons chercher `a comprendre ce qui rend la recherche de r´eactions aussi compliqu´e, et en d´eduire un nouvel algorithme plus efficace.

2.1

Formalisation de la recherche de r´eactions

Le probl`eme que l’on cherche `a r´esoudre dans cette partie est la recherche de r´eactifs dans une r´eaction chimique. Plus pr´ecis´ement, on se place dans un contexte plus proche de Γ pour concevoir un algorithme prenant comme entr´ee :

– une r`egle chimique R = replace x1 :: T1,· · · , xk :: Tkby F (x1,· · · , xk) if C(x1,· · · , xk)

et

– un multi-ensemble M de mol´ecules ; et en sortie :

– ⊥ si M ∪ hRi est inerte,

– un k-uplet (m1,· · · mk) o `u {m1,· · · mk} ⊂ M , le type de mi est Ti pour tout i et

C(m1,· · · , mk) est v´erifi´ee, sinon.

On voit ici que la d´efinition du r´esultat que l’on cherche `a obtenir ne fait pas r´ef´erence aux produits de la r`egle, qui n’entrent effectivement pas en compte dans la recherche de r´eactifs. Aussi, `a partir de maintenant, nous d´esignerons la r`egle pr´ec´edente par

R= find x1 :: T1,· · · , xk:: Tksuch that C(x1,· · · , xk).

S’il n’y avait pas de condition de r´eaction, le probl`eme serait simple `a r´esoudre, puisqu’il suffirait de comparer le nombre de mol´ecules disponibles pour chaque type au nombre de

(13)

mol´ecules demand´ees. C’est donc sur l’´etude de cette condition que va porter l’essentiel de la suite de ce rapport.

R´eduction du probl`eme aux conjonctions de litt´eraux. Cette condition de r´eaction est une formule de la logique propositionnelle, dont les litt´eraux sont l’application d’une fonction bool´eenne aux variables x1 `a xk. La d´efinition de ces litt´eraux est laiss´ee tr`es libre, puisque

certaines impl´ementations du langage autorisent toutes les expressions Java, ce qui rend le probl`eme de la recherche de r´eactifs en th´eorie ind´ecidable. L’´evaluation de code Java ´etant tr`es ´eloign´e du sujet de ce rapport, nous faisons l’hypoth`ese que l’´evaluation des conditions de r´eaction termine, et nous ´evaluerons les complexit´es en fonction du nombre d’´evaluations d’une partie de celle ci.

Comme toute formule propositionnelle, une condition de r´eaction peut ˆetre mise sous forme normale disjonctive. On peut encore simplifier la formule pour ne garder qu’un seul litt´eral par sous-ensemble de variables dans chaque terme en remplac¸ant :

– ¬f (x1,· · · , xp) par (¬f )(x1,· · · , xp),

– f1(x1,· · · , xp) ∧ f2(x1,· · · , xp) par (f1∧ f2)(x1,· · · , xp), ou plus g´en´eralement si l’un des

deux ensembles de variables concern´es est inclus dans l’autre.

En outre, le type d’une mol´ecule peut ˆetre vu comme une condition sur cette mol´ecule. Notre formule est alors de la forme :

R= find x1,· · · , xksuch that M _ i=1 ^ X∈Qkj=1{ε,xj} fi,X(X).

Dans cette ´ecriture, les X doivent ˆetre vus comme des sous-ensemble deux `a deux disjoints des variables.

Les diff´erents termes de la disjonction peuvent faire l’objet d’une recherche s´epar´ee, puisque la r`egle find x1,· · · , xk such that C1(x1,· · · , xk) ∨ C2(x1,· · · , xk) peut s’appliquer

`a des mol´ecules x1,· · · , xk si et seulement si C1(x1,· · · , xk) ∨ C2(x1,· · · , xk) c’est `a dire

si et seulement si C1(x1,· · · , xk) ou C2(x1,· · · , xk), soit si et seulement si l’une des r`egles

find x1,· · · , xksuch that C1(x1,· · · , xk) ou find x1,· · · , xksuch that C2(x1,· · · , xk) peut

s’ap-pliquer. La r`egle R est donc ´equivalente `a l’ensemble de r`egles :

M [ i=1     

Ri= find x1,· · · , xksuch that

^ X∈Qk j=1{ε,xj} fi,X(X)     

Le nombre M de formules g´en´er´ees est potentiellement exponentiel par rapport `a k. Ce-pendant, en pratique :

– k est souvent de taille raisonnable, et est ind´ependant du multi-ensemble ;

– le passage `a l’exponentielle ne concerne pas toutes les formules, mais seulement celles pour lesquelles la recherche est th´eoriquement difficile, comme les formules SAT ; – la recherche peut ˆetre faite de mani`ere compl`etement parall`ele.

`

A partir de maintenant, nous pouvons restreindre l’analyse `a des r`egles de cette forme, que nous r´esumerons en R = find x1,· · · , xksuch that f1(X1) ∧ · · · ∧ fl(Xl).

Notations et d´efinitions. Sur ces consid´erations, nous allons maintenant nous abstraire du probl`eme. Consid´erons les ensembles suivants :

(14)

– V un ensemble d´enombrable de symboles, appel´es variables ; – M un ensemble d´enombrable de mol´ecules ;

– S l’ensemble des multi-ensembles finis de mol´ecules, appel´es solutions ; – F =T

n∈N(Mn7→ B) l’ensemble des fonctions bool´eennes sur des tuples de mol´ecules ;

– P = F × P(V) (o `u P repr´esente l’ensemble des parties) l’ensemble des pr´edicats. Un litt´eral f (x1,· · · , xp) dans une r`egle peut ˆetre repr´esent´e comme un pr´edicat

(f, {x1,· · · , xp}). ´Etant donn´e un pr´edicat p = (f, E) ∈ P, on note F(p) = f et

arg(p) = E ;

– A = F × P(V × M) l’ensemble des propositions, qui sont l’´equivalent des pr´edicats pour les mol´ecules. Une proposition a = (f, {(x1, m1), ..., (xk, mk)}) ∈ A est appel´ee

axiome si f (m1, ..., mk) est vraie. On notera F(a) = f , arg(a) = {x1, ..., xk}, a(xi) = mi et

M(a) = {m1, ..., mk}. Par extension, si A ⊂ A, on notera M(A) =Sa∈AM(A) ;

– R = P(V) × P(P) l’ensemble des r`egles. Une r`egle

replace x1,· · · , xkby Y if f1(x1,1· · · , x1,a1) ∧ ... ∧ fl(xl,1· · · , xl,al)

sera repr´esent´ee dans ce formalisme par le couple

({x1,· · · , xk} , {(f1,{x1,1,· · · , x1,a1}) , · · · , (fl,{xl,1,· · · , xl,al})}) .

Pour R = (V, P ) ∈ R, on d´efinit les accesseurs V(R) = V et P(R) = P .

Le lecteur attentif aura remarqu´e l’utilisation de la lettre A, initiale du mot axiome, pour d´esigner l’ensemble des propositions. Comme nous cherchons `a v´erifier les conditions de r´eactions, seuls les axiomes que l’on peut tirer d’une solution nous int´eressent r´eellement. D´efinition (ensemble d’axiomes induits). Pour une solution S ∈ S et une r`egle R ∈ R, on d´efinit l’ensemble des axiomes induits par R dans S comme l’ensemble des axiomes dont les mol´ecules sont dans S et satisfont un pr´edicat de R :

A(R, S) =(F(p), {(xi, mi) : xi ∈ arg(p) ∧ mi∈ S}) : p ∈ P(R) ∧ F(p) m1, ..., m|arg(p)|

 (2.1) On peut remarquer une certaine correspondance entre le monde des r`egles et le monde des solutions. Les ´el´ements de base sont les variables pour les r`egles et les mol´ecules pour les solutions, et les ´el´ements de la logique sont les pr´edicats dans le monde des r`egles et les pro-positions dans le monde des solutions. Pour cette raison, on donne ci-dessous deux d´efinitions de la satisfaction d’un ´el´ement du monde des r`egles par un ´el´ement de celui des mol´ecules. D´efinition(satisfaction d’un pr´edicat). Soient p ∈ P et a ∈ A, on dit que a satisfait p, et on note a|= p, si les trois conditions suivantes sont r´eunies :

– a est un axiome, – F(a) = F(p), – arg(a) = arg(p).

D´efinition(satisfaction d’une variable). Soient P ⊂ P, x ∈ V, A ⊂ A et m ∈ M. On dit que m satisfait x dans A, et on ´ecrit (A, m) |= (P, x), ou simplement m |= x s’il n’y a pas d’ambigu¨ıt´e si

∀p ∈ P, x ∈ arg(p) ⇒ ∃a ∈ A, (x ∈ arg(a) ∧ a(x) = m ∧ a |= p). (2.2) Moins formellement, une mol´ecule ne satisfait pas une variable si l’on sait qu’il est impossible qu’elle soit affect´ee `a cette variable dans une r´eaction, par exemple si elle n’est pas du bon type.

(15)

´Etude de la complexit´e intrins`eque du probl`eme. Sous l’hypoth`ese de terminaison de l’´evaluation des conditions de r´eaction — en un temps alors n´ecessairement ind´ependant de n et k — le probl`eme de la recherche de r´eactifs est de classe NP, puisque faire tous les tests entre des mol´ecules de mani`ere non-d´eterministe permet de le r´esoudre en temps polynomial. Nous allons donc ´etudier la NP-difficult´e du probl`eme, qui n’avait jamais ´et´e formellement ´etablie. D´efinition(rang d’une r`egle). On appelle rang d’une r`egle R la plus grande arit´e des pr´edicats de R :

rg(R) = max

p∈P(R)| arg(p)|. (2.3)

Pour tout n, on appelle Rnl’ensemble des r`egles de rang inf´erieur ou ´egal `a n.

En programmation chimique, la grande majorit´e des r`egles que l’on peut trouver sont de rang 1 ou 2. Il est pourtant possible de cr´eer des r`egles de rang sup´erieur, comme par exemple la r`egle de rang k :

N ulSumk= find x1· · · xksuch that k

X

i=1

xi = 0

Une autre fac¸on de cr´eer de telles r`egles est d’utiliser l’interface entre Java et HOCL pour utiliser des m´ethodes de Java `a plusieurs arguments dans un programme chimique.

Propri´et´e 1 (difficult´e par rapport au rang). Le probl`eme de la recherche de r´eactifs est

NP-difficile en fonction du rang de la r`egle.

D´emonstration. Remarquons que la recherche de n mol´ecules dont la somme s’annule est un

probl`eme difficile. En effet, il rappelle le fameux probl`eme NP-complet de la somme de sous-ensembles : ´etant donn´e un ensemble d’entiers E de taille n, existe-t-il un sous-ensemble de Edont la somme des ´el´ements est nulle ? Supposons que l’on soit capable de savoir s’il existe kmol´ecules de somme 0 dans une solution de taille n en un temps inf´erieur `a a.np, o `u a est

un r´eel positif et p est ind´ependant de k. Alors si l’on effectue le test pour tous les 1 ≤ k ≤ n sur l’ensemble E, on peut r´esoudre le probl`eme de la somme de sous-ensembles en un temps inf´erieur `a a.np+1, c’est `a dire polynomial. On a donc bien r´eussi `a ramener la recherche de r´eactifs pour la r`egle N ulSumk `a celui de la somme de sous-ensembles, ce qui prouve bien

notre propri´et´e.

Il risque donc d’ˆetre difficile de trouver un algorithme plus efficace que |S|rg(R)dans le pire cas. Nous pouvons cependant chercher `a am´eliorer la recherche dans les cas o `u le rang d’une r`egle est inf´erieur `a son arit´e.

Comme nous l’avons signal´e pr´ec´edement, la plupart des r`egles de programmes r´eels en HOCL appartiennent `a R2. Cet ensemble peut ˆetre vu comme celui des graphes dont les

som-mets sont les variables et les arˆetes sont les pr´edicats. Nous r´eutiliserons donc naturellement des termes et des notations sur les r`egles h´erit´ees de la th´eorie des graphes, que nous ´etendrons aux r`egles de rang quelconque.

D´efinition(sous-r`egle). Soient R1, R2 ∈ R. On dit que la r`egle R1est une sous-r`egle de R2, not´e

R1 ⊂ R2, si V(R1) ⊂ V(R2) et P(R1) ⊂ P(R2).

D´efinition(connexit´e). On dit qu’une r`egle R est connexe si

∀x, y ∈ V(R), ∃x1,· · · , xn∈ V(R), x1 = x ∧ xn= y ∧ (∀i, ∃p ∈ P(R), {xi, xi+1} ⊂ arg(p)). (2.4)

(16)

D´efinition(clique). On dit qu’une r`egle R est une clique si

∀x, y ∈ V(R), ∃p ∈ P(R), {x, y} ⊂ arg(p). (2.5) Dans le cas de r`egles de rang 2, l’ensemble des axiomes induits peut ´egalement ˆetre vu comme un graphe dans lequel les nœuds sont les mol´ecules, et les arˆetes sont les axiomes. Trouver des r´eactifs revient `a rechercher un sous-graphe isomorphe `a celui de la r`egle dans le graphe des axiomes. Or ce probl`eme est lui aussi connu comme NP-complet, parce qu’il contient le probl`eme de la recherche de cliques.

Propri´et´e 2(NP-difficult´e pour le rang 2). Le probl`eme de la recherche de r´eactifs est NP-difficile, en

fonction de son arit´e, pour une r`egle de rang 2.

D´emonstration. Supposons que l’on connaisse un algorithme polynomial en k pour la recherche

de r´eactifs pour toute r`egle de rang 2.

Soit un graphe G = (V, E). On veut savoir s’il existe un sous graphe de G de k nœuds qui est une clique. On cr´ee le programme chimique dans lequel les mol´ecules sont les nœuds de G et l’unique r`egle cherche k mol´ecules toutes reli´ees les unes aux autres dans G :

*

find x1,· · · , xksuch that k−1 ^ i=1 k ^ j=i+1 (xi, xj) ∈ E, n ∈ V +

Selon notre hypoth`ese, ce programme chimique trouve une clique dans G en temps polyno-mial. On a bien r´eduit notre probl`eme `a celui de la recherche de cliques dans un graphe, ce qui montre la propri´et´e.

La r`egle utilis´ee pour montrer la propri´et´e 2 est une clique, c’est `a dire une r`egle compliqu´ee puisque sa condition de r´eaction poss`ede autant de litt´eraux qu’il y a de couples de variables. Il faudrait donc trouver une fac¸on de caract´eriser la complexit´e d’une r`egle. C’est ce que nous faisons dans la partie suivante, qui d´efinit la carrure d’une r`egle.

2.2

Carrure d’une r`egle

Nous venons d’ˆetre confront´es `a deux r´esultats n´egatifs qui peuvent donner une vision pessimiste de la difficult´e du probl`eme. Pourtant, la plupart des r`egles chimiques ne sont ni des cliques, ni de rang tr`es ´elev´e. Il nous manque une notion de complexit´e d’une r`egle pour identifier ce qui peut rendre la recherche compliqu´ee. Dans cette partie, nous introduisons la carrure d’une r`egle comme une mesure de cette complexit´e.

D´efinition(jointure d’une r`egle). On consid`ere que les variables d’une r`egle sont totalement tri´es selon une relation d’ordre ⋖. On d´efinit la jointure J⋖(R) de R selon l’ordre ⋖ comme

l’ensemble des variables qui ont plusieurs voisines plus petites qu’elles :

J⋖(R) = {x ∈ V(R) : |{p ∈ P(R) : ∃y ⋖ x, {x, y} ⊂ arg(p)}| ≥ 2} . (2.6)

D´efinition(carrure d’une r`egle). La carrure d’une r`egle est la taille de sa plus petite jointure par rapport `a tous les ordres possibles sur les r`egles.

C(R) = min

⋖ |J⋖(R)|.

(17)

1 ւ ց 2 ↓ 3 ց ւ 4 2 5 ւ ց ւ ց 1 7 4 ց ր ց ւ 3 6 2 ր ց 1 5 ւ ց ւ ց 3 8 6 ց ր ց ւ 4 9 ց ր 7

FIGURE2.1 – le pont, le huit et le treillis avec leur jointure minimale

Remarque. Trouver une jointure minimale de fac¸on efficace est un probl`eme toujours ouvert.

Cependant, celui-ci ne concerne que la r`egle elle-mˆeme, ind´ependament du reste du multi-ensemble. Ce calcul peut donc ˆetre r´ealis´e `a la compilation, et sa complexit´e n’influence pas le temps de recherche des r´eactifs.

Exemples. La carrure d’un arbre est nulle. En effet, par d´efinition, chaque ´el´ement d’un arbre poss`ede un unique p`ere, sauf la racine qui n’en a pas du tout. Par cons´equent, en suivant l’ordre topologique, on ne trouve aucun nœud dans la jointure.

La carrure d’un cycle vaut 1 car, quel que soit l’ordre que l’on choisit, le plus grand ´el´ement a comme p`eres son pr´ed´ecesseur et son successeur.

Comme autres exemples de graphes, on peut citer le pont et le huit qui ont une carrure de 1, et le treillis qui a une carrure de 2 (voir figure 2.1).

Propri´et´es de la carrure. La carrure a ´et´e introduite comme une mesure de la complexit´e d’une r`egle. Nous allons maintenant montrer quelques bornes sur la carrure.

Propri´et´e 3(croissance de C). Pour toutes r`egles R1et R2, si R1 ⊂ R2, alors C(R1) ≤ C(R2).

(18)

de P(R2) \ P(R1) un par un, puis ceux de V(R2) \ V(R1) pour arriver `a R1 depuis R2. On

commencera donc par une r´ecurrence sur |P(R2)| − |P(R1)|, puis on montrera que l’on peut

enlever simplement les variables non-contraintes.

Supposons V(R1) = V(R2). Si |P(R2)| − |P(R1)| = 0, on a R1 = R2 donc C(R1) = C(R2).

On suppose maintenant qu’il existe un n ≥ 0 tel que pour toutes r`egles R′1 et R′2 v´erifiant

V(R′1) = V(R′2) = V , P(R′2) ⊂ P(R′1) et |P(R′2)| − |P(R′1)| = n, on a C(R1′) ≤ C(R′2). Soient R1 et R2 v´erifiant P(R1) ⊂ P(R2) et |P(R2)| − |P(R1)| = n + 1. Soit p ∈ P(R2) \ P(R1). On

consid`ere la r`egle R telle que V(R) = V et P(R) = P(R1) ∪ {(f, A)}. On a |P(R2)| − |P(R)| = n

donc par hypoth`ese de r´ecurrence, C(R) ≤ C(R2).

Soit un ordre ⋖ sur les variables tel que J⋖(R) soit minimale. Pour tout x ∈ V ,

{p ∈ V : ∃y ⋖ x, {x, y} ⊂ arg(p)} ⊂ {p ∈ P(R) : ∃y ⋖ x, {x, y} ⊂ arg(p)} , donc J⋖(R1) ⊂ J⋖(R), et donc C(R1) ≤ |J⋖(R1)| ≤ |J⋖(R)| = C(R) ≤ C(R2).

D’apr`es le principe d’induction, on peut en d´eduire que pour toutes r`egles R1 ⊂ R2

poss´edant les mˆemes variables, C(R1) ≤ C(R2).

On consid`ere maintenant la suppression des variables. Soient R1 et R2 tels que P(R1) =

P(R2) = F et V(R1) ⊂ V(R2). Quel que soit l’ordre ⋖ consid´er´e, pour toute variable x ∈

V(R2) \ V(R1), |{p ∈ V : ∃y ⋖ x, {x, y} ⊂ arg(p)}| = 0, donc J⋖(R1) = J⋖(R2), donc C(R1) =

C(R2).

Pour conclure avec des r`egles quelconques R1⊂ R2, on a bien

C(R1) = C(V(R2), P(R1)) ≤ C(R2).

Essayons de comparer la carrure d’une r`egle `a son arit´e. Ici encore, le cas des r`egles de rang 2 est int´eressant pour commencer.

Th´eor`eme 1(carrure d’une r`egle de R2). Soit une R une r`egle de rang 2. Alors

C(R) + rg(R) ≤ |V(R)|

et l’´egalit´e est atteinte si et seulement si R est une clique.

D´emonstration. Soient R une r`egle de rang 2, et ⋖ un ordre sur V(R). Les deux plus petites

variables x et y ont au plus 1 voisin sup´erieur. Par cons´equent, ils ne font pas partie de J⋖(R),

donc C(R) ≤ |V(R)| − 2 = |V(R)| − rg(R).

Si R est une clique, toute variable z diff´erente de x et y a comme voisin sup´erieur au moins xet y, donc z ∈ J⋖(R), et |J⋖(R)| = |V(R)| − rg(R), donc C(R) = |V(R)| − rg(R).

Si au contraire R n’est pas une clique, alors il existe x et y qui ne sont pas reli´es. Consid´erons R′une clique dans laquelle on a supprim´e le lien entre x et y. Alors R est une sous-r`egle de R′. Soit z une variable diff´erente de x et y, et un ordre selon lequel les trois plus grands ´el´ements sont z ⋖ x ⋖ y dans cet ordre. Alors J⋖(R′) = k − 3. On en d´eduit C(R) ≤ C(R′) ≤ k − 3.

Pour une r`egle de rang sup´erieur, cette propri´et´e est fausse, et on n’a mˆeme pas C(R) ≤ |V(R)| − 2. Cela est d ˆu au fait que deux variables peuvent ˆetre reli´es par plusieurs pr´edicats.

(19)

FIGURE2.2 – Graphe d’une r`egle de rang 3 et de carrure 3

On peut prendre l’exemple de la r`egle suivante, dont le graphe est repr´esent´e sur la figure 2.2 : find x, y, z, t such that f (x, y, z) ∧ g(x, y, t) ∧ h(x, z, t) ∧ i(y, z, t).

On remarque que cette r`egle `a 4 arguments est de carrure 3, ce qui entre en contradiction avec le th´eor`eme 1. Cela montre que dans le cas de r`egles de rang sup´erieur, il est n´ecessaire d’assouplir ce th´eor`eme en utilisant la notion d’´equivalence de r`egles.

D´efinition( ´Equivalence de r`egles). On d´efinit ≡ comme la plus petite relation d’´equivalence sur les r`egles v´erifiant :

∀R ∈ R, P(R) = {(f1, E1), (f2, E2)} ∪ P ⇒ R ≡ (V(R), {(f1∧ f2, E1∪ E2)} ∪ P ).

Autrement dit, deux r`egles sont ´equivalents si elles correspondent `a la mˆeme r`egle du pro-gramme chimique, mais que le d´ecoupage de la condition de r´eaction en litt´eraux a ´et´e faite diff´erement.

Th´eor`eme 2(borne sur C). Pour toute r`egle R, il existe une r`egle R≡ R telle que C(R′) + rg(R′) ≤ |V(R′)|.

D´emonstration. Soient une r`egle R et ⋖ un ordre sur V(R). Consid´erons R′ = 

V(R),nV

f∈P(R)f

o

≡ R. Une seule fonction est pr´esente, donc la carrure est nulle. Or rg(R′) ≤ |V(R′)| , donc C(R′) + rg(R′) ≤ |V(R′)|.

Remarque. La r`egle R′ici d´efinie n’est g´en´eralement pas celle qui minimise C(R′) + rg(R′). Elle est simplement donn´ee `a titre d’illustration.

2.3

Affectations

Dans la partie pr´ec´edente, nous avons d´efini une notion de complexit´e des r`egles. Pour les r`egles de rang 2, nous avons pu voir le lien qui unissait la carrure, les cliques et l’arit´e d’une r`egle. Il reste `a pr´esent `a voir comment on peut tirer parti de cette nouvelle notion en pratique.

(20)

D´efinition(ensemble pur d’axiomes). Soient P ⊂ P et A ⊂ A. On dit que A est pur au regard de P si

∀m ∈ M(A), ∃x ∈ V, (A, m) |= (P, x) (2.7)

D´efinition(affectation). Soient A ⊂ A, P ⊂ P, x1,· · · , xp ∈ V et m1,· · · , mp ∈ M. On appelle

affectation de m1,· · · , mp `a x1,· · · , xp, not´e A[x1 := m1,· · · , xp := mp], la r´eunion de tous les

sous-ensembles purs au regard de P de {a ∈ A : ∀i, xi ∈ arg(a) ⇒ a(xi) = mi}.

Propri´et´e 4(caract´erisation de l’affectation). A′ = A[x1 := m1,· · · , xp := mp] est le plus grand

sous-ensemble pur de A, au sens de l’inclusion, v´erifiant ∀1 ≤ i ≤ p, (A′, m) |= (P, xi) ⇒ m = mi.

D´emonstration. Trois choses sont `a d´emontrer dans cette propri´et´e :

– la puret´e de l’affectation,

– la propri´et´e ∀i, m |= xi ⇒ m = mi,

– et le fait que ce soit le plus grand tel ensemble.

Notons B = {a ∈ A : ∀i, xi∈ arg(a) ⇒ a(xi) = mi} l’ensemble qui a servi `a d´efinir

l’affecta-tion.

Soient A1et A2deux sous-ensembles purs de B. Soit m ∈ M(A1∪ A2) = M(A1) ∪ M(A2).

Si m ∈ M(A1), ∃x ∈ V, (A1, m) |= (P, x), donc ∃x ∈ V, (A1∪ A1, m) |= (P, x). On a le mˆeme

r´esultat si m ∈ M(A2). On en d´eduit que A1∪A2est pur. Comme le nombre de sous-ensembles

de B est fini, on peut en d´eduire que A est pur.

De plus, A′ ⊂ B. Par cons´equent, ∀i, ∀a, xi ∈ arg(a) ⇒ a(xi) = mi, donc ∀i, m |= xi⇒ m =

mi.

Enfin, soit A′′ un sous-ensemble pur de A v´erifiant ∀i, m |= xi ⇒ m = mi. Alors A′′est un

sous-ensemble pur de B. Donc par d´efinition de l’affectation, A′′ ⊂ A′.

Propri´et´e 5(Calcul de l’affectation). L’algorithme 4 retourne A[x1 := m1,· · · , xn:= mn].

Algorithme 4: Calcul de A[x1 := m1,· · · , xn:= mn]

A′← {a ∈ A : ∀i, xi ∈ arg(a) ⇒ a(xi) = mi};

1

repeat /* Computes a biggest fix point */

2

removed ← {a ∈ A′: ∃x ∈ arg(a), a(x) 6|= x};

3

A′ ← A′\ removed ; /* Remove the points that cannot be in A[· · · ] */

4

until removed = ∅;

5

return A

6

D´emonstration. Montrons tout d’abord qu’`a chaque it´eration de la boucle,

A′[x1 := m1,· · · , xp := mp] demeure inchang´e. Soient A1 = A′[x1 := m1,· · · , xp := mp] et

A2 = (A′\removed)[x1 := m1,· · · , xp:= mp]. On a A2 ⊂ A1par construction. R´eciproquement,

soit B un sous-ensemble pur de A1. Comme B est pur, removed ∩ B = ∅, donc B ⊂ A2. Par

cons´equent, la r´eunion de tels B est identique, donc A1 = A2.

Soit B la valeur retourn´ee par l’algorithme 4. On peut d´eduire du paragraphe pr´ec´edent que B[x1 := m1,· · · , xp := mp] = A[x1 := m1,· · · , xp := mp]. Or, si B n’´etait pas pur, par

d´efinition de la puret´e, ∃m ∈ M(B), ∀x ∈ V, m 6|= x. Cette mol´ecule apparait dans une certaine propri´et´e a avec une certaine variable x, donc ∃a ∈ B, ∃x ∈ arg(a), a(x) 6|= x. Mais alors lors

(21)

de la derni`ere it´eration, ce a doit ˆetre mis dans removed. Cela est absurde puisque removed = ∅ lors de la derni`ere it´eration. Par cons´equent, B est pur, donc

B = B[x1 := m1,· · · , xn:= mn] = A[x1:= m1,· · · , xn:= mn]

et l’algorithme est correct.

Les deux propri´et´es suivantes, qui manipulent l’arithm´etique des affectations, montrent la souplesse du calcul sur les affectations. Elles introduisent ´egalement A[ ], appel´e l’´epur´e de A ou l’affectation vide, qui est le plus grand sous-ensemble pur de A.

Propri´et´e 6(S´eparation des variables affect´ees). Si X d´esigne≪x1 := m1,· · · , xx := mxet Y

d´esigne≪y1 := n1,· · · , yy := ny, on a A[X, Y ] = A[X][Y ] = A[Y ][X] = (A[X] ∩ A[Y ])[ ].

D´emonstration. Soit A′ ⊂ A pur. Les conditions suivantes sont ´equivalentes : (m |= xi ⇒ m = mi) ∧ (n |= yi ⇒ n = ni) s.s.i. A′ ⊂ A[X, Y ]

s.s.i. (A′ ⊂ A[X]) ∧ (n |= y

i⇒ n = ni) s.s.i. A′ ⊂ A[X][Y ]

s.s.i.

(A′ ⊂ A[X]) ∧ (A′ ⊂ A[Y ]) s.s.i. A′ ⊂ A[X] ∩ A[Y ]

On en d´eduit que A[X, Y ][ ] = A[X][Y ][ ] = (A[X]∩A[Y ])[ ], puis le r´esultat ´enonc´e par sym´etrie entre X et Y , et grˆace `a la propri´et´e 4.

Propri´et´e 7. Aet A[ ] ont les mˆemes affectations.

D´emonstration. Soit X ≡ ≪ x1 := m1,· · · , xn:= mn ≫. D’apr`es la propri´et´e 6, on a A[ ][X] =

A[X][ ], et d’apr`es la propri´et´e 4, A[X][ ] = A[X]. On en d´eduit A[ ][X] = A[X].

D´efinition(affectation maximale). Une affectation A′ = A[x1 := m1,· · · , xn := mn] est

maxi-male si ∀x ∈ V(R), |{m ∈ M : (A′, m) |= (P, x)}| ≤ 1. En particulier A′est maximale lorsqu’une mol´ecule a ´et´e choisie pour chaque variable.

D´efinition(affectation valide). Une affectation A′ = A[x1 := m1,· · · , xn := mn] est valide si

∀x ∈ V(R), |{m ∈ M : (A′, m) |= (P, x)}| ≥ 1.

Propri´et´e 8. Si R ∈ R est connexe non vide, une affectation A= A[x

1 := m1,· · · , xn := mn]

au regard de P(R) est valide si et seulement si ∃x ∈ V(R), |{m ∈ M : (A′, m) |= (P, x)}| ≥ 1, si et

seulement si Aest non vide.

D´emonstration. Supposons que R est connexe, et soit A′ = A[x1 := m1,· · · , xn := mn] une

affectation.

Si A′ est valide, alors ∀x ∈ V(R), |{m : m |= x}| ≥ 1 donc puisque R n’est pas vide, ∃x ∈ V(R), |{m : m |= x}| ≥ 1.

R´eciproquement, supposons ∃x ∈ V(R), |{m : m |= x}| ≥ 1. Supposons par l’absurde que A′ n’est pas valide, alors ∃y ∈ V(R), |{m : m |= y}| = 0. Or R est connexe, donc il existe un chemin x1,· · · , xpavec x1= x et xp = y. Il existe donc un indice i pour lequel |{m : m |= xi}| >

0 et |{m : m |= xi+1}| = 0, ainsi qu’un pr´edicat p ∈ P(R) tel que {xi, xi+1} ⊂ arg(p). Soit

mi |= xi. (f, {(xi, mi), (xj, mj) · · · }) ∈ P(R), et donc (mj |= xj). Ceci est absurde puisque

(22)

D’apr`es ces deux d´efinitions, une affectation est valide et maximale si ∀x ∈ V(R), |{m ∈ M : (A′, m) |= (P, x)}| = 1. Cette affectation d´efinit alors de mani`ere imm´ediate

une r´eaction possible. Inversement, une r´eaction d´efinit une affectation valide maximale. Le probl`eme de la recherche de r´eactifs peut donc ˆetre red´efini comme la recherche d’une af-fectation valide maximale dans l’ensemble des axiomes induits par une r`egle sur un multi-ensemble.

2.4

Pr´esentation de l’algorithme

Nous avons maintenant tous les outils th´eoriques pour exposer l’algorithme de recherche de r´eactifs.

Th´eor`eme 3(maximisabilit´e de l’affectation de la jointure). Soient R une r`egle d’arit´e k dont les

variables sont ordonn´ees par ⋖, {x1,· · · , xc} = J⋖(R) et m1,· · · , mc ∈ M.

A[x1 := m1,· · · , xc := mc] est valide si et seulement si il existe mc+1,· · · , mk ∈ M telles que

A[x1 := m1,· · · , xn:= mk] est valide maximale.

D´emonstration. Supposons qu’il existe mc+1,· · · , mk tels que A[x1 := m1,· · · , xk := mk] est

valide, alors

A[x1 := m1,· · · , xk:= mk] = A[x1 := m1,· · · , xc := mc][xc+1:= mc+1,· · · , xk:= mk]

⊂ A[x1 := m1,· · · , xc := mc].

Comme A′ = A[x1 := m1,· · · , xk := mk] est valide, alors ∀x ∈ J⋖(R), |{m ∈ A′ : m |= x}| ≥ 1,

donc A[x1 := m1,· · · , xc := mc] est ´egalement valide.

Algorithme 5: Maximisation de A′= A[x1:= m1,· · · , xc := mc] selon ⋖

for xi= x1⋖· · · ⋖ xkdo 1 switch {p ∈ P(R) : ∃y ⋖ xi,{xi, y} ⊂ F(p)} do 2 case ∅: mi ∈ {m : m |= xi}; 3

case {p}: mi ∈ {m : m |= xi∧ ∃a |= p, a(xi) = m ∧ ∀xj⋖xi, a(xj) = mj};

4

case : mi ∈ {m : m |= xi};

5

return A′[x1 := m1,· · · , xk:= mk];

6

R´eciproquement, supposons que A′ = A[x1 := m1,· · · , xc := mc] est valide, alors

l’algo-rithme 5 retourne une affectation valide maximale. En effet, l’affectation est bien maximale, il reste donc `a montrer qu’elle est valide, c’est `a dire que les mol´ecules choisis par l’algorithme existent bien et qu’elles forment un graphe pur.

´Etudions les trois cas de l’algorithme.

– Si xi n’a pas de voisine plus petite qu’elle, il existe une valeur mod´elisant xi car A′ est

valide.

– Si un unique pr´edicat p relie xi `a des voisines plus petites, qui ont donc ´et´e d´ej`a choisies,

il existe un axiome a |= p reliant ces voisines car A′ est valide. On choisit la mol´ecule a(xi) pour l’un de ces axiomes.

– Dans le dernier cas, xi ∈ J⋖(R), et est donc affect´ee dans A′. Comme cette affectation est

valide, {m : m |= xi} contient une et une seule valeur mi, qui est convient bien avec tous

(23)

Dans les trois cas, l’existence est assur´ee. De plus, la puret´e du graphe est v´erifi´ee par construc-tion.

Nous pouvons maintenant assembler tous les ´el´ements pour construire un algorithme com-plet qui r´esout le probl`eme de la recherche de r´eactifs. L’algorithme 6 r´esout ce probl`eme pour une pour une r`egle R dans laquelle les variables sont tri´ees selon ⋖ et un ensemble d’axiomes A.

Algorithme 6: Recherche d’une affectation maximale valide dans R.

forall m1|= x1,· · · , mc |= xcdo /* Chose values for J⋖(R) = (x1,· · · , xc) */

1

if valid(A[x1 := m1,· · · , xc := mc]) then /* Check the affectation */

2

return maximize(A[x1 := m1,· · · , xc := mc]) /* there is a solution */

3

return ⊥ /* there is no solution */

4

Propri´et´e 9(Correction). L’algorithme 6 renvoie une affectation maximale valide si il en existe une et ⊥ sinon.

D´emonstration. Si l’algorithme ne retourne pas ⊥, il termine `a la ligne 3. Dans ce cas, A[x1 :=

m1,· · · , xc := mc] est valide, donc d’apr`es le th´eor`eme 3, il existe une jointure maximale valide,

qui est celle retourn´ee par l’algorithme.

R´eciproquement, si l’algorithme retourne ⊥, montrons par l’absurde qu’il n’existe pas d’affectation maximale valide. Supposons donc qu’il existe une affectation maximale valide A[x1 := m1,· · · , xk := mk]. Les valeurs m1,· · · , mc sont test´ees par l’algorithme, mais

au-cune valeur n’a ´et´e renvoy´ee, puisque la ligne 4 a ´et´e atteinte. On en d´eduit que A[x1 :=

m1,· · · , xc := mc] n’est pas valide. Cela est absurde puisque A[x1 := m1,· · · , xk := mk] est

valide.

Propri´et´e 10(Complexit´e). L’algorithme 6 s’execute en O |M(A)||J⋖(R)|+rg(R) op´erations dans le

pire cas.

D´emonstration. Soit n = |M(A)| le nombre de mol´ecules dans A. Si la solution est inerte, ce

qui correspond au pire cas, il y a exactementQ

x∈J⋖(R)|{m |= x}| ≤ n

|J⋖(R)| ex´ecutions de la

boucle principale. Or, chaque it´eration n´ecessite le calcul d’une affectation, dont la complexit´e est proportionnelle par rapport au nombre d’axiomes dans A, soit inf´erieur `a nrg(R), puis la v´erification d’une validit´e et le calcul d’une maximisation qui peuvent ˆetre faits en temps pro-portionnel au nombre de variables dans R, c’est `a dire n´egligeable par rapport `a la taille de A. On en d´eduit que la complexit´e est O n|J⋖(R)|+rg(R).

Remarque. Si l’ordre ⋖ d´efinit une jointure minimale, et si on a choisi R pour que le th´eor`eme 2

soit v´erifi´e, la complexit´e dans le pire cas de l’algorithme est O nC(R)+rg(R) pour n mol´ecules dans le multi-ensemble. D’apr`es le th´eor`eme 2, C(R) + rg(R) ≤ |V(R)|, et le gain peut mˆeme ˆetre ´evalu´e `a la compilation.

L’algorithme 6 permet d’am´eliorer la complexit´e de la recherche de r´eactifs dans la plupart des cas. Cependant, il s’agit d’un algorithme s´equentiel. Dans la partie suivant, nous allons voir comment on peut utiliser ces r´esultats dans le cadre d’un syst`eme d´ecentralis´e.

(24)

Chapitre 3

Algorithme d´ecentralis´e

Dans le chapitre pr´ec´edent, nous avons vu qu’il ´etait possible d’am´eliorer la complexit´e de la recherche de r´eactifs en ´etudiant les conditions de r´eaction des r`egles.

On se propose de r´esoudre le mˆeme probl`eme dans le cas d’un syst`eme d´ecentralis´e de type pair-`a-pair dans lequel les pairs communiquent en s’envoyant des messages d´elivr´es de fac¸on asynchrone. Nous faisons l’hypoth`ese que le r´eseau et les pairs sont fiables, c’est `a dire que, d’une part, tout message envoy´e sera d´elivr´e, et d’autre part, les pairs ne peuvent pas crasher et ex´ecutent fid`element les algorithmes fournis.

Dans cette partie, nous ne consid`ererons que les r`egles de rang 2. Dans ce contexte, l’en-semble des axiomes induit est un graphe dans lequel les nœuds sont les mol´ecules et les arˆetes sont les axiomes. Les pairs participant au stockage du graphe poss`edent en m´emoire une liste de mol´ecules ainsi que la liste des identifiants de leurs voisines, permettant de contacter les pairs qui les h´ebergent. Pour augmenter la localit´e, des migrations de mol´ecules sur les pairs voisins sont organis´es.

Le but de ce chapitre est de montrer que la recherche de r´eactifs et la d´etection de l’iner-tie peuvent ˆetre r´esolus dans ce contexte en utilisant l’algorithme introduit dans le chapitre pr´ec´edent. Le principe de cet algorithme est de rechercher des affectations valides dans l’en-semble des axiomes induits. Il est donc n´ecessaire de commencer par construire cet enl’en-semble. Trois sous-probl`emes doivent ˆetre r´esolus pour obtenir un algorithme complet.

1. La construction du graphe des axiomes induits, pr´esent´ee dans la premi`ere section, re-quiert l’´evaluation de tous les pr´edicats n´ecessaires.

2. L’algorithme 6, pr´esent´e dans le chapitre pr´ec´edent, doit ensuite ˆetre ex´ecut´e sur le graphe ainsi construit. La deuxi`eme section expliquera comment on peut faire les choix et les affectations de fac¸on d´ecentralis´ee.

3. Il est enfin n´ecessaire de regrouper toutes les informations n´ecessaires `a la d´etection de l’inertie de la sous-solution. Cela sera abord´e dans la derni`ere section.

3.1

Construction de l’ensemble d’axiomes induits

Le temps d’ex´ecution de l’´evaluation des propositions est impr´edictible. Pour cette rai-son, nous prendrons le nombre d’´evaluations comme une mesure de la complexit´e. Dans ce contexte, il convient d’effectuer tous les tests n´ecessaires une et une seule fois.

(25)

Principe g´en´eral de la construction du graphe. Imaginons tout d’abord que l’on veuille tes-ter deux-`a-deux toutes les mol´ecules entre elles. Une fac¸on de s’en sortir serait d’utiliser un sac de mol´ecules entre lesquelles tous les tests ont d´ej`a ´et´e effectu´es. Ce sac est initialement vide, et lors de l’ajout d’une mol´ecule m1, celle ci est confront´ee `a toutes les mol´ecules du sac tout

en y ´etant ins´er´ee.

Que se passe-t-il si une deuxi`eme mol´ecule m2 est ins´er´ee avant que m1 ait termin´e son

travail ? Dans ce cas, le nombre de tests entre m1 et m2 d´epend de l’ordre de parcours du

sac. Si la mol´ecule est ins´er´ee avant d’effectuer les tests, celui entre m1 et m2 risque d’ˆetre

ex´ecut´e deux fois. Or, cette situation o `u de nombreuses mol´ecules doivent ˆetre ins´er´ees en mˆeme temps correspond bien `a la phase d’initialisation, puis de l’insertion des produits d’une r´eaction produisant plusieurs nouvelles mol´ecules. Plus grave encore, si les mol´ecules sont ins´er´ees apr`es les tests, ce dernier risque de ne pas ˆetre du tout effectu´e, ce qui rendrait des r´eactions introuvables et rendrait faux l’ensemble du dispositif.

L’enseignement que nous pouvons tirer de cette r´eflexion est qu’une synchronisation est n´ecessaire lors de l’insertion d’une mol´ecule. On peut r´esoudre ce probl`eme grˆace `a une liste de mol´ecules. Une mol´ecule est ins´er´ee en d´ebut de liste et est test´ee avec toutes les mol´ecules plac´ees derri`ere elle dans la liste. Ainsi, deux mol´ecules seront toujours ajout´ees l’une apr`es l’autre `a l’extr´emit´e de la chaˆıne, et le test entre les deux sera bien effectu´e une unique fois.

Ici, nous ne voulons pas tester tous les couples de mol´ecules, mais seulement les mol´ecules pouvant ˆetre pass´ees en arguments d’un mˆeme pr´edicat. Aussi, on consid`ere l’utilisation d’une liste diff´erente pour chaque variable. La synchronisation doit alors ˆetre faite entre les extr´emit´es de toutes les listes.

Une structure en arbres pour la construction du graphe. C’est ce principe que nous pro-posons d’adapter pour la construction r´epartie du graphe des mol´ecules. Les ensembles de mol´ecules de chaque variable sont r´eparties sur plusieurs pairs. L’un de ceux-ci joue le r ˆole de l’extr´emit´e de la liste dans le mod`ele pr´ec´edent. Il doit donc ˆetre facilement accessible.

Nous proposons d’organiser les pairs en arbres, un par variable, dont les racines sont les points d’insertion. Pour faciliter le raisonnement, nous consid`ererons que les arbres sont bi-naires, bien que le nombre de fils ne soit pas vraiment important.

Plus pr´ecis´ement, chaque nœud de l’arbre h´eberge trois ensembles de mol´ecules. Lors-qu’une nouvelle mol´ecule est ajout´ee dans la solution, elle est plac´ee dans l’ensemble U, pour

unregistered, qui regroupe les mol´ecules qui n’ont pas encore ´et´e ins´er´ees dans l’ensemble R,

pour registered, des mol´ecules enregistr´ees. Le troisi`eme ensemble, appel´e T, pour to test, re-groupe les mol´ecules enregistr´ees pour lesquelles il reste des tests `a effectuer.

Chemin suivi par une mol´ecule. Lorsqu’une nouvelle mol´ecule est ajout´ee dans la solution, elle est plac´ee dans l’ensemble U de n’importe quel nœud de n’importe quel arbre. Au fil du temps, elle monte dans l’arbre jusqu’`a atteindre la racine. Alors, elle est transf´er´ee `a la racine de l’arbre g´erant la variable `a laquelle elle est rattach´ee pour y ˆetre enregistr´ee dans l’ensemble R, ainsi qu’`a l’ensemble T de toutes les racines correspondant `a des variables pour lesquelles le test est n´ecessaire. La mol´ecule dans R descend ensuite dans l’arbre pour laisser la place aux nouvelles inscriptions, tandis que les copies de la mol´ecule dans T sont diffus´ees `a tous les nœuds de l’arbre pour faire les tests. Il est n´ecessaire d’empˆecher les mol´ecules de R de doubler celles de T pour garantir l’existence et l’unicit´e des tests.

(26)

FIGURE3.1 – L’organisation des pairs qui participent `a la construction du graphe : chaque pair poss`ede un ensemble de mol´ecules `a enregistrer, un ensemble de mol´ecules d´ej`a enregistrer et un ensemble de mol´ecules `a tester `a transmettre aux fils. Les racines ont un r ˆole particulier puisqu’elles doivent initier les tests entre mol´ecules.

L’algorithme 7 pr´esente cette migration du point de vue d’un nœud de l’arbre. `A l’instar des protocoles de gossip, chaque pair ex´ecute le mˆeme algorithme p´eriodiquement. Les racines des arbres et les autres nœuds ex´ecutent des protocoles diff´erents, dont nous allons `a pr´esent expliquer les grandes lignes.

Le but des racines est d’enregistrer le plus possible de mol´ecules pour d´ebuter les r´eactions. Nous venons de voir qu’il ´etait n´ecessaire d’ajouter une phase de synchronisation entre les racines. Celle-ci est g´er´ee par un jeton qui tourne entre les racines selon un ordre pr´ed´efini. P´eriodiquement, donc, la racine qui poss`ede le jeton enregistre les mol´ecules de U dont le type est le mˆeme que celui de l’arbre dont elle est la racine et contacte les autres racines pour leur transmettre :

– l’ensemble des mol´ecules qu’elles doivent elles-mˆeme enregistrer pour faire corres-pondre les types,

– l’ensemble des mol´ecules qu’elle a enregistr´e au d´ebut de la p´eriode pour lesquelles des tests doivent ˆetre effectu´es

– et le jeton `a la racine de l’arbre du type suivant.

De leur c ˆot´e, les autres nœuds doivent permettre aux mol´ecules pas enregistr´ees de re-joindre la racine, et aux autres de descendre dans l’arbre. Cela est effectu´e grˆac´e `a trois mes-sages. Premi`erement, un fils contacte son p`ere dans l’arbre, en lui envoyant des informations `a propos de sa charge personnelle et d’autres utiles `a la d´etection de l’inertie (voir section 3.3).

`

A la r´eception de ce message, le p`ere calcule le nombre de mol´ecules `a ´echanger. Le choix de ce nombre peut permettre la mise en œuvre d’une politique, visant par exemple `a maximi-ser la taille des messages o `u `a ´equilibrer la charge entre les nœuds de l’arbre. Les mol´ecules de T doivent ˆetre envoy´ees en priorit´e sur celles de R pour assurer l’unicit´e des tests. Dans

(27)

l’algorithme 7 `a la ligne 29, on utilise la fonction T.get once f or each son(n, son) qui retourne min(n, |T |) mol´ecules de T, tout en assurant que chaque mol´ecule soit retourn´ee une et une seule fois pour chaque fils. Lorsqu’une mol´ecule a ´et´e retourn´ee pour tous les fils, elle est supprim´ee de l’ensemble. `A la ligne 30, la fonction R.get and remove(n, son) retourne un en-semble de mˆeme taille, mais supprime les mol´ecules qui ont ´et´e retourn´ees, ind´ependament du fils qui a effectu´e la requˆete. Ainsi, la r´eponse du p`ere `a son fils comprend un ensemble de mol´ecules `a tester, un ensemble de mol´ecules enregistr´ees et le nombre de mol´ecules `a envoyer en retour.

`

A son tour, le fils rec¸oit le message et fait les tests entre les nouvelles mol´ecules `a tester et les mol´ecules enregistr´ees dont il avait d´ej`a la charge. Les tests entre les mol´ecules envoy´ees par le p`ere ont d´ej`a ´et´e effectu´es, et ils ne doivent donc pas ˆetre refaits. En retour, le fils envoie le nombre de mol´ecules pas enregistr´ees demand´e.

Lorsqu’un nouvel axiome est d´ecouvert, la version enregistr´ee des deux mol´ecules doit ˆetre notifi´ee. Il est donc n´ecessaire de rechercher la mol´ecule dans l’arbre. Comme nous allons le voir `a pr´esent, la structure d’arbres que nous venons de d´efinir est particuli`erement bien adapt´ee `a cette recherche.

Recherche d’une mol´ecule dans l’arbre. La mol´ecule est toujours enregistr´ee `a la racine, mais elle migre ensuite dans l’arbre. Il ne suffit donc pas d’une adresse pour la retrouver. Nous proposons donc de nous servir de la structure pr´ec´edement d´ecrite comme d’une table de hashage distribu´ee. Au moment de leur cr´eation, les mol´ecules rec¸oivent un identifiant unique form´e de l’identifiant de leur cr´eateur et d’un num´ero unique au cr´eateur qui servent `a identifier la mol´ecule, ainsi qu’un nombre r´eel tir´e al´eatoirement selon une loi uniforme entre 0 et 1 qui permet de la retrouver dans l’arbre.

`

A chaque nœud d’un arbre est associ´e un intervalle de [0, 1] tel que : – l’intervalle de la racine est [0, 1],

– les intervalles de deux fils d’un mˆeme nœud sont disjoints,

– la r´eunion des intervalles des fils d’un nœud est ´egale `a l’intervalle du nœud.

Une valeur typique pour ces intervalles dans un arbre binaire est [0, 1] pour la racine, [0; 0, 5] et ]0, 5; 1] pour ses fils, les quatre intervalles de longueur 14 pour ses petits fils, et ainsi de suite. Nous voulons faire en sorte que toutes les mol´ecules de R pr´esentes sur un nœud aient la partie al´eatoire de leur identifiant comprise dans l’intervalle du nœud. En cons´equence, cela est ´egalement vrai pour toutes les mol´ecules du sous arbre dont le nœud est la racine. Pour obtenir ce r´esultat, il suffit de n’envoyer `a chaque fils que les mol´ecules dont la partie al´eatoire correspond.

Pour trouver une mol´ecule dans l’arbre, il suffit donc d’envoyer un message `a la racine, qui la recherche parmi les mol´ecules qu’elle h´eberge, et transmet le message au fils dont l’in-tervalle correspond si elle ne la trouve pas. Celui-ci r´ep`ete l’op´eration, et ainsi de suite jusqu’`a ce que la mol´ecule soit trouv´ee. La complexit´e dans le pire cas est donc ´egale `a la hauteur de l’arbre en terme de messages ´echang´es. Une am´elioration consiste `a r´epondre en communi-quant l’adresse trouv´ee au pair qui a initi´e la requˆete. Ainsi, lors de la demande suivante, le haut de l’arbre n’aura pas besoin d’ˆetre explor´e. Si h est la hauteur de l’arbre, la complexit´e pour n requˆetes par le mˆeme pair est donc r´eduite `a 1 + hn −→

n→∞1 message.

Cependant, l’algorithme tel qu’il vient d’ˆetre introduit n’est pas suffisant. En effet, il est possible que la recherche d’une mol´ecule soit effectu´ee en parall`ele de la migration de cette

(28)

Algorithme 7: Algorithme simplifi´e de la construction du graphe peer: father; 1 peer[ ]: sons; 2 sethmoleculei: R, U, T; 3

boolean: is root, has token;

4

maphtype, peeri: roots;

5 type: type; 6 periodically: 7 ifis root then 8

ifhas token then 9

foralltypet do 10

sethmoleculei: good type = {m ∈ U : m |= t};

11

sethmoleculei: need test = {m ∈ U : m |= type ∧ type ↔ t};

12

sendcontact roots(good type, need test, t = type+1) to roots(t);

13 R← R ∪ {m ∈ U : m |= type}; 14 U ← ∅; 15 else 16

sendcontact father(R.size(), U.size(), T.size()) to father;

17

end

18

receivingcontact roots(sethmoleculei good t, sethmoleculei test, boolean token) :

19

has token← token;

20

U ← U ∪ good t;

21

T ← T ∪ test;

22

forallMolecule m ∈ test do

23 forallMolecule mr ∈ R do 24 DoTest(m, mr); 25 end 26

receivingcontact father(int sizeU, int sizeR, int sizeT) from son :

27

int×int: (send, send back) = f (sizeU, sizeR, sizeT, U.size, R.size, T.size);

28

sethmoleculei: sendT = T.get once f or each son(send, son);

29

sethmoleculei: sendR = R.get and remove(send − sendT.size, son);

30

sendanswer son(sendT, sendR, send back) to son;

31

end

32

receivinganswer son(sethmoleculei sendT, sethmoleculei sendR, int send back) :

33

T ← T ∪ sendT ;

34

forallMolecule m ∈ sendT do

35 forallMolecule mr ∈ R do 36 DoTest(m, mr); 37 R← R ∪ sendR; 38

sendack father(U.get and remove(sendBack)) to father;

39

end

40

receivingack father(sethmoleculei sendU) :

41

U ← U ∪ sendT ;

42

end

Références

Documents relatifs

[r]

Je constate qu’avec les deux timbres de la collection i, je peux effectuer n’importe quel affranchissement dont la valeur enti` ere en centimes d’euro est sup´ erieure ` a un

Proposez des implantations des algorithmes de Kruskal et de Prim permettant de r´esoudre le probl`eme de l’arbre de poids minimum dans cette classe de graphes et analysez-en

(configuration space and related spaces +

avec utilisation de 8 532 colonies d’Abeilles, ont confirmé les résultats obtenus par l’Institut de Recherches apicoles et ont montré que l’installation de ruches à

[r]

M´ ethode : Pour un nombre d’´ evaluation fix´ e, ex´ ecuter plusieurs fois la recherche al´ eatoire (au moins 30 fois), puis calculer les statistiques de la qualit´ e des

Une fois la solution courante dans un optimum local, Perturbation (grande modification) de la solution courante pour initier une nouvelle recherche locale ` a partir de