La mutation d'un dispositif consiste en la réévaluation des valeurs de ses attributs à la suite d'une modification de son paramétrage, dans le but d'assurer sa consistance. Cette réévaluation n'est nécessaire que dans la mesure où ce dispositif est mutable. Le mécanisme de mutation d'un dispositif est décrit par l'algorithme B.1.
L'algorithme de mutation met à jour les slots du dispositif en fonction du m-paramétrage, en supprimant, en ajoutant, ou en mettant à jour le type des slots. L'emploi de slots absents évite la suppression de connexions à la suite d'une mutation. En particulier, un slot supprimé puis créé à nouveau conservera ses connexions.
L'algorithme distingue six cas possibles pour chaque slot: Les slots s-mutables
de
qui sont absents du m-paramétrage sont supprimés s'ils ne sont pas
connectés (slots
) et transformés en slots absents s'ils sont
connectés (slots
). Les nouveaux slots s-mutables décrits par le
m-paramétrage sont ajoutés s'ils n'existent pas en tant que slots absents
(valuations
), et dérivés des slots absents dans le cas contraire (slots
). Enfin, l'algorithme met à jour les types des slots t-mutables
(slots
) et des slots s-mutables qui sont présents à la fois sur le
dispositif et dans le m-paramétrage (slots
). À la fin de
l'algorithme,
comprend l'ensemble des slots ayant changé de type, qui
servira à la propagation des mutations.
La mutation d'un dispositif
est provoquée par une ou plusieurs des causes
élémentaires suivantes:
En outre, la mutation de
a pour résultat une ou plusieurs conséquences
élémentaires qui peuvent être classées en quatre catégories:
![]() |
Par l'intermédiaire des connexions, les conséquences de type 1 et 2 peuvent provoquer sur d'autres dispositifs des causes de type 1 et y déclencher des mutations: la mutation est alors propagée (figure B.2). La mutation d'un dispositif est susceptible d'être propagée à tous les dispositifs directement connectés, indépendamment du sens des connexions. Ce mécanisme de propagation est décrit par l'algorithme B.2.
L'algorithme B.2 consiste à appliquer l'algorithme
de mutation sur un ensemble de dispositifs, en se servant de la valeur de
retour
pour déterminer l'ensemble des dispositifs vers lesquels les
mutations doivent être propagées. L'algorithme est à nouveau appliqué sur ce
dernier ensemble, et ainsi de suite jusqu'à ce qu'il n'y ait plus de
dispositifs candidats. Notons que la propagation des mutations peut monter ou
descendre dans l'arbre des configurations, à travers les slots i-connectés
(voir section A.4.5).
Il est également important de noter que cet algorithme récursif opère en largeur d'abord plutôt qu'en profondeur d'abord: les dispositifs cibles de la propagation sont stockés au lieu d'être mutés immédiatement. Au niveau du slot, c'est l'algorithme de mutation (algorithme B.1) qui se charge du stockage des propagations. La propagation en largeur d'abord a pour avantage d'éviter des déclenchements inutiles de mutations (figure B.3).
![]() |
Bien que les connexions d'une configuration d'entrée ne génèrent pas de dépendance cyclique, ce n'est pas le cas des mutations, qui se propagent indépendamment de l'orientation des connexions. Lorsque les mutations comportent des dépendances cycliques, l'algorithme B.2 peut ne pas se terminer, mais peut également converger.
L'algorithme B.3 est une variante de
l'algorithme B.2, qui se termine toujours. Le
nombre de mutations sur chaque dispositif est limité à
. Lorsqu'un
dispositif a muté
fois, celui-ci est considéré comme non stabilisé. À
terme, l'algorithme fournit dans
l'ensemble des dispositifs non
stabilisés. Si cet ensemble est non vide, la propagation est considérée comme
non stabilisée dans son ensemble.
De par sa propriété de terminaison, l'algorithme B.3 est de loin préférable à l'algorithme B.2. Deux stratégies sont possibles pour l'exploiter: soit interdire les connexions qui induisent une propagation non stabilisée, soit autoriser provisoirement (hors exécution) les dispositifs non stabilisés dans une configuration. Un éditeur interactif pourrait par exemple mettre en évidence les « erreurs » dans l'espoir que l'utilisateur les corrige. Une manière de stabiliser la partie problématique de la configuration consiste à insérer des dispositifs « typeurs », dont les types en entrée et en sortie sont fixés par paramétrage: cela équivaut à ajouter des contraintes à un problème sous-contraint.
Le système de mutations, très général, peut se décliner en un certain nombre de mécanismes de spécialisation concrets. Parmi ceux-ci, nous donnerons un exemple de typage, de spécialisation structurelle par paramétrage, et d'adaptation bi-directionnelle. D'autres exemples peuvent être donnés, tels que la spécialisation structurelle par connexion, ou le typage par paramétrage.
Voici un exemple de dispositif dont les slots prennent le type int lorsque les slots d'entrée sont connectés à des entiers et le type double dans les autres cas:
Soit un dispositif mutable
ayant deux slots d'entrée nommés
et
, un slot de sortie nommé
, et ne comportant pas de paramètre.
,
et
sont t-mutables et possèdent comme supertype double. Les
slots déclencheurs sont
et
. La fonction de mutation
de
ce dispositif est la suivante:
avec:
Voici un exemple de dispositif dont le nombre de slots de sortie et d'entrée est paramétrable:
Soit un dispositif mutable
comportant deux paramètres
respectivement nommés
et
. Le dispositif ne comporte pas
d'autre slot que les slots s-mutables générés par la fonction de mutation. La
fonction de mutation
de ce dispositif est la suivante:
avec:
Enfin, voici un exemple de dispositif de type « adaptateur », dont les types s'adaptent en entrée et en sortie:
Soit un dispositif mutable
comportant un slot d'entrée et un slot de
sortie respectivement nommés
et
, et ne comportant pas de paramètre.
et
sont déclencheurs et t-mutables, et possèdent comme supertype
any. La fonction de mutation
de ce dispositif est la
suivante: