• Aucun résultat trouvé

L’algorithme basé sur le filtrage équationnel

Dans le document Courtage sémantique de services de calcul (Page 74-79)

À partir du système de Gallier et Snyder, nous avons réalisé une première version non typée de l’algorithme.

3.3.1 Le principe de base

Le principe de l’algorithme de Gallier et Snyder est d’appliquer les règles de trans-formations dans un ordre quelconque et tant que cela est possible. Il n’était évidemment pas envisageable de garder ce fonctionnement pour notre algorithme, car il est indéterministe et peut boucler avant d’avoir engendré toutes les solutions finies. Nous ne trouverions donc pas nécessairement les solutions finies en un temps fini. Dans l’optique d’un algorithme « exploitable », il fallait des garanties sur la terminaison de l’algorithme (nous introduisons

la notion de « quantité d’énergie », qui, si elle est finie, entraîne la terminaison de l’algo-rithme). De plus, l’ensemble des solutions acceptables ne sont pas les mêmes. Pour qu’une solution ait un sens dans notre cas, il faut que les variables du service soient assignées à une constante (du domaine ou de la requête), à un terme ne contenant que des constantes ou des variables libres (terme qui doit pouvoir être rendu à l’aide des services disponibles) ou à une variable libre (c’est-à-dire qu’aucune contrainte particulière n’est imposée à la variable, elle peut prendre une forme quelconque). Ces variables libres proviennent de l’application d’une équation dans le cas où les mêmes variables ne sont pas présentes dans les deux membres (voir définition 2.1.15, page 34).

L’algorithme de base est très simple. Une solution est obtenue par une suite de dé-compositions de termes et d’applications d’équations. Quand une de ces transformations est applicable sur un problème, l’algorithme l’applique. Si plusieurs transformations sont appli-cables, l’algorithme construit les différents arbres engendrés par l’application de toutes les transformations possibles. Cela conduit, en cas de réussite, à des solutions différentes. Les sous-problèmes obtenus sont traités de façon indépendante : les résultats obtenus lors du traitement d’un fils ne sont pas utilisés lors du traitement des fils suivants. Si les contraintes sur les variables obtenues dans chaque sous-problème sont compatibles, elles sont alors combinées pour construire la solution finale. Sinon il y a échec de la comparaison.

Décomposition Quand les symboles à la racine des deux termes sont égaux, une trans-formation applicable est une décomposition de ces termes pour comparer deux à deux les fils.

f(s1, ..., sp)=? f(r1, ..., rp) s1 =? r1 ... sp =? rp

Application d’équations À tout moment (cette condition sera modifiée par la suite en tenant compte de la quantité d’énergie et des contraintes sur la forme de l’équation) une équation peut être appliquée.

Application de l’équation(e1, e2): s=? r s=? e1 e2=? r

Quand une équation est appliquée, c’est une version de l’équation avec des nouvelles va-riables qui est choisie. Les vava-riables introduites par les équations sont appelées « vava-riables intermédiaires » et notéesxi. Ce sont elles qui relient les sous-problèmes entre eux.

Ces deux transformations sont appliquées jusqu’à obtenir des formes résolues.

Les formes résolues Les formes résolues sont les feuilless=? rtelles que :

– setrsont deux constantes identiques ; – sest une variable ;

– ourest une variable intermédiaire.

Si, dans une branche, il n’est pas possible d’atteindre une de ces formes résolues, la comparaison échoue.

Suppression des variables intermédiaires Nous construisons la solution à partir des formes résolues. Les équations introduisent des variables qui n’ont pas de sens dans notre problème, il faudra donc supprimer ces variables. Un graphe est créé à partir des dépen-dances obtenues en analysant la forme résolue. Puis, par parcours de ce graphe, les variables intermédiaires sont supprimées et les problèmes qui nécessitent un traitement supplémen-taire sont relancés.

Nous construisons un graphe orienté de la façon suivante. Quand une forme résolue est :

– s =? r, où set r sont deux constantes identiques, nous n’ajoutons rien à notre graphe ;

– s=? r, oùsest une variable, nous ajoutons les nœudssetr, s’ils ne sont pas déjà présents et l’arêtes→rau graphe ;

– s=? r, oùrest une variable intermédiaire etsest une constante, nous ajoutons les nœudssetr, s’ils ne sont pas déjà présents et l’arêter→sau graphe ;

– s=? r, oùr est une variable intermédiaire etsest une variable ou un terme, nous ajoutons les nœudssetr, s’ils ne sont pas déjà présents et l’arêtes→rau graphe.

Nous obtenons ainsi un graphe dont les entrées sont des variables du service ou des termes et les sorties sont des termes, des constantes ou des variables libres.

Relances Lors du parcours du graphe, nous pouvons être amenés à relancer l’algorithme sur différents problèmes :

– Dans le cas où une entrée du graphe est un terme et une sortie associée est un terme, il faut relancer l’algorithme sur ce nouveau problème.

– Nous vérifions également qu’il n’y a pas deux valeurs possibles pour une même variable (deux sorties différentes pour la même entrée). Sinon il faut relancer le problème pour vérifier si elles sont égales moduloE. Ce test s’effectue en utilisant notre algorithme, avec la quantité d’énergie restante et en vérifiant qu’une des so-lutions obtenues est l’identité. Néanmoins, lors de ces relances, nous pouvons être amenés à comparer deux termes contenant des variables libres. Nous n’avons alors plus un problème de filtrage équationnel, mais un problème d’unification équation-nelle.

Des exemples de constructions de graphes et de relances sont donnés dans la partie 3.4 (page 66).

Introduction de symboles Comme nous venons de le voir, ce second type de relances engendre des problèmes d’unification équationnelle. Pour pouvoir les traiter correctement et tenir compte du fait que les variables libres peuvent prendre une forme quelconque, nous ajoutons les deux décompositions suivantes, oùf(t)est un terme etxune variable libre :

f(t)=? x

{x7→f(x1, ..., xn)}(f(t))=? f(x1, ..., xn)

x=? f(t)

f(x1, ..., xn)=? {x7→f(x1, ..., xn)}(f(t))

Cette transformation n’est utilisée que dans le cas très précis des relances et que lorsquexest une variable libre. Les variablesxi sont des nouvelles variables, elles mêmes considérées comme des variables libres.

Une fois tous les problèmes relancés, la suppression des variables intermédiaires pro-duit une liste d’affectations (variable du service / terme, constante de la requête ou du do-maine ou variable libre). Cette solution est celle qui nous intéresse. Dans le cas où il y a une affectation à un terme, le problème global est relancé avec ce terme comme requête, car celui-ci nécessite au moins une composition.

3.3.2 Preuve de la correction

Notre algorithme consiste à appliquer les règles de Gallier et Snyder dans un ordre particulier.

En effet, la décomposition de l’arbre est l’application de la règle Term Decompo-sition du système de Gallier et Snyder. À partir d’un nœudf(u1, ..., un) =? f(v1, ..., vn), nous générons les sous-problèmes {u1 =? v1,...,un=? vn}.

L’application d’une équation est l’application de la règle Root Rewriting du système de Gallier et Snyder. Comme dans leur règle, deux sous-problèmes sont engendrés et liés par les nouvelles variables de l’équation. Nous verrons dans la suite que nous avons les mêmes contraintes sur les symboles à la racine que celles liées à l’application de cette règle.

La suppression des variables intermédiaires s’effectue par propagation des valeurs associées à ces variables. Cela équivaut à appliquer la substitution qui permet de les élimi-ner. Il s’agit de l’application de la règle Variables Elimination. La différence est que, dans notre algorithme, les variables intermédiaires disparaissent car elles n’ont pas de sens dans le problème initial.

La transformation d’introduction d’un symbole pour les variables libres est l’applica-tion de la règle Root Imital’applica-tion.

Une fois que les variables intermédiaires ont été supprimées, les formes résolues sont les mêmes que celles de Gallier et Snyder. Donc, si l’algorithme abouti à une de ces formes, il existera une suite de transformations dans le système de Gallier et Snyder conduisant à cette forme. La solution sera donc un unificateur équationnel de la requête et du service.

Les contraintes spécifiques à notre problème (sur la forme des substitutions solutions) étant explicitement vérifiées par l’algorithme, celui-ci est correct.

3.3.3 Discussion sur la complétude

Nous souhaitions utiliser la preuve de complétude du système de Gallier et Snyder pour prouver cette même propriété sur notre algorithme. En effet, notre problème est un sous-problème du leur et notre algorithme implante une heuristique particulière d’ordre d’application de leurs règles.

La difficulté principale est liée à une définition non constructive des solutions que l’application des règles permet de construire (σ tel queσ(s) =E σ(r)). Il n’était ainsi pas simple d’adapter la notion de solution au sous-ensemble qui nous concerne et de montrer que notre ordre d’application des règles engendre bien toutes les solutions qui nous intéressent.

Nous n’avons pas réussi à conclure en un temps raisonnable que notre ordre particu-lier d’application des règles, pour la forme particulière de notre problème, n’entraînait pas la suppression de solutions. Pourtant, toutes leurs règles apparaissent dans notre algorithme, seul le moment où nous les appliquons change et certaines contraintes ont été durcies. Ces changements sont liés au fait que nos solutions ne sont qu’un sous-ensemble des leurs et que nos problèmes initiaux sont un sous-ensemble des problèmes possibles.

Néanmoins, nous avons fait une première étude pour déterminer l’impact de l’ordre dans lequel sont appliquées les transformations du système de Gallier et Snyder dans notre algorithme. Cette étude a été présentée dans [HP06] et complétée dans [HP05]. À l’aide d’un calcul sur les langages réguliers, qui représentent les traces d’applications des trans-formations, nous avons montré que tous les ordres étaient possibles, comme dans le cas du système de Gallier et Snyder. Le résultat découle de la simplification effectuée en ne considérant ni les contraintes d’applications des règles, ni les positions d’application des équations. L’objectif était de détecter d’éventuels oublis (mise au point de l’algorithme) et ne permettait pas d’assurer la complétude. nous n’avons ensuite pas poursuivi dans cette voie car la prise en compte de ces contraintes ne permettait plus de disposer de langages réguliers dont la comparaison était simple.

3.3.4 Traitement des équations

Dans l’algorithme que nous venons de présenter, une seule équation est appliquée sur un problème. Or, afin de réduire les possibilités dans le choix des équations, il est intéressant d’appliquer une suite d’équations. Nous avons ainsi la possibilité d’imposer des contraintes d’égalité sur les symboles à la racine des membres des équations de cette suite d’équations.

Sur les sous-problèmes issus de l’application d’une transformation, une équation ne pourra pas être appliquée si une décomposition n’a pas été réalisée avant.

Un problème de la forme :

s=? r

s=? e1 e2=? r e2 =? e3 e4 =? r

est en fait traité de la façon suivante :

s=? r

s=? e1 e2=? e3 e4=? r

Et un problème de la forme :

s=? r s=? e3

s=? e1 e2=? e3

e4 =? r

est également traité de la façon suivante : s=? r

s=? e1 e2=? e3 e4=? r

Il est évident que ces deux méthodes de traitement des équations sont équivalentes, puisque les sous-problèmes engendrés sont identiques.

Dans le document Courtage sémantique de services de calcul (Page 74-79)