• Aucun résultat trouvé

Le concept de base de réparation présenté dans la section précédente se prête à quelques points de discussion. En particulier, le nombre de réparations principales possibles est potentiellement élevé, et la tâche de générer ces réparations peut donc s’avérer très coûteuse.

6.3.1 ALGORITHME DE BASE ET COMPLEXITÉ

L’algorithme montré dans 1 est un algorithme pour itérer toutes les réparations possibles d’une structure. Il énumère simplement toutes les transformations possibles : T ∈ 2TΣ. Il vérifie

d’abord si T est bien défini (c’est-à-dire que toute paire d’endomorphismes commute), et si une réparation générée précédemment (stockée dans l’ensemble TS) est un sous-ensemble de

l’actuelle. Il vérifie enfin si l’application de cette transformation corrige la structure d’origine. Il passe à la prochaine transformation candidate, si l’une de ces trois situations se produit. Sinon, il ajoute cette transformation à son ensemble et le renvoie comme son prochain élément.

Theorem 1 L’algorithme 1 est cohérent et complet.

Soit T une sortie de transformation par l’algorithme. Par construction, T est une réparation, puisqu’elle est bien définie et elle corrige la valeur de vérité de σ dans ϕ. De plus, au moment où T est sorti, aucun des éléments de TSn’est un sous-ensemble de T . Puisque TS

contient toutes les réparations de cardinalité inférieure à T , et que, par construction, toutes les transformations de cardinalité similaires ne peuvent pas être des sous-ensembles, il s’ensuit que T n’est incluse par aucune réparation existante et est donc principale. Cela prouve la

Algorithm 1 Algorithme générique pour l’itération des réparations primaires procedure COMPUTEREPAIRS(ϕ, σ , 2TΣ)

TS= /0

for all T ∈ 2TΣ do . Énumérés en cardinalité croissante

if ¬WELLDEFINED(T ) then skip end if if SUBSUMED(T, TS) then skip end if if T (σ0) 6|= ϕ then skip end if TS← TS∪ {T } yield T end for end procedure cohérence de l’algorithme.

Le fait que toutes ces réparations majeures soient finalement énumérées est garanti par le fait que tous les sous-ensembles de TΣ sont générés à un moment donné, ce qui prouve la complétude.

Cet algorithme a été implémenté en Java et est disponible publiquement1. En raison de sa simplicité et de sa généricité, l’implémentation des expressions, des structures et des itérations de réparation ne représente que 325 lignes de code. L’énumération des réparations est exposée à l’utilisateur sous la forme d’une classe classique Java Iterator, qui peut être utilisée par les méthodes traditionnelles hasNext() et next() pour passer à travers l’ensemble complet de réparations principales, dans l’ordre croissant de cardinalité. Les classes spécifiques au domaine définissants les constructions logiques propositionnelles et de premier ordre sont constituées d’environ 500 lignes de code supplémentaires. Il est facile de voir que le temps

d’exécution de cet algorithme est exponentiel en fonction de la taille de TΣ, qui peut elle-même

être exponentielle dans un autre facteur (dépendant du problème modélisé). Dans la logique du premier ordre (telle qu’utilisée par un fragment de Cornipickle), si a1, . . . , anest l’arité

respective de chaque prédicat dans la signature, le nombre d’endomorphismes est ∑i2|A|ai

pour un domaine donné A.

Malgré cela, il est possible de montrer que cet algorithme est limité par une borne inférieure théorique. Un ensemble d’endomorphismes TΣest dit complet si pour tout σ , σ0∈ Σ, il existe

une transformation bien définie T ⊆ TΣtel que T (σ ) = σ0.

Theorem 2 Étant donné un ensemble de structures Σ, un ensemble d’expressions de langage Φ et un ensemble complet de transformations TΣ, le problème du calcul des réparations

principales est aussi difficile que le problème de satisfiabilité pour Φ.

Soit ϕ ∈ Φ une expression du langage. Si ϕ est satisfaisable, alors il existe une structure σ ∈ Σ telle que σ |= ϕ. Prenons une structure arbitraire σ0∈ Σ. Puisque TΣ est complet, il existe

au moins une transformation T ⊆ TΣ telle que T (σ0) = σ . Prenons le plus petit ensemble

de ce genre ; par définition, il s’agit d’une réparation principale et sera finalement énumérée par l’algorithme 1. Puisque l’algorithme est complet, au contraire, aucune réparation ne sera trouvée si ϕ n’est pas satisfaisable.

6.3.2 RÉDUCTION DU NOMBRE DE SOLUTIONS CANDIDATES

Ces résultats de complexité de base justifient une discussion sur la réduction du nombre de réparations potentielles qui doivent être explorées.

Suppression des endomorphismes

Le nombre de transformations potentielles peut d’abord être réduit en supprimant les endomor- phismes dont on sait qu’ils sont impossibles, en fonction du contexte. Par exemple, supposons que les symboles propositionnels a et b dans l’exemple 6.2.2 correspondent respectivement aux assertions « le client paie pour un objet » et « le client reçoit l’article ». On pourrait supposer qu’une évaluation où a est vraie ne peut pas être modifiée en la rendant fausse ; cela correspondrait au fait qu’une action effectuée par un acteur ne peut être annulée. Dans un tel contexte, seuls les endomorphismes réglant les fausses variables à vrai seraient considérés. Dans le cas des graphes, comme dans l’exemple 6.2.2, on pourrait imposer des restrictions sur les changements qui lui sont autorisés ; par exemple, on pourrait dire que les arêtes existantes doivent rester inchangées, ou que seuls des sommets spécifiques peuvent être coloriés différemment. Ceci, encore une fois, a pour effet de préférer certaines transformations aux autres, et réduit globalement le nombre de réparations disponibles.

Transformations en groupes

La granularité des endomorphismes disponibles peut également être modifiée. Dans le cas de l’exemple de coloriage de graphe, il est évident qu’aucune réparation ne consistera jamais en un seul endomorphisme {τqi(x)7→>}. La raison est que l’expression ϕ1requiert que chaque

sommet ait exactement une couleur ; assigner qi à > pour un sommet implique que le qj

appropriées au contexte, représentant les changements de couleur : TC= [ x∈A [ i∈[1,3] j6=i k6= j6=i {{τqi(x)7→>, τqj(x)7→⊥, τqk(x)7→⊥}}

De même, comme la relation d’adjacence est symétrique, mettre p(x, y) à > (resp. ⊥) ne peut pas être fait sans mettre p(y, x) à > (resp. ⊥). Au lieu de considérer les changements individuels aux seules entrées de p, on peut définir un ensemble de changements de bord :

TE = [ x∈A [ y∈A [ b∈{>,⊥} {{τp(x,y)7→b, τp(y,x)7→b}}

On pourrait alors utiliser TC∪ TE comme l’ensemble des transformations, au lieu de TΣ. Bien

que cela ne change rien à la théorie sur les solutions actuelles, le fait que TC∪ TE soit plus petit

que TΣa un effet positif sur la performance d’un algorithme d’énumération dans la pratique.

La même chose peut être dite des endomorphismes de l’exemple 6.2.2. Plutôt que de considérer tous les changements individuels des coordonnées (x, y) des quatre coins de chaque élément, on pourrait définir des sous-ensembles correspondants à des modifications plus intuitives ; par exemple, l’ensemble des déplacements horizontaux pourrait être défini comme :

TH= [

e∈E

[

p∈P

{{τleft(e) 7→ p, τright(e) 7→ (τright(e) − p)}}

On peut alors limiter la recherche pour les réparations à celles qui sont faites uniquement des déplacements (horizontaux ou verticaux), ou des redimensionnements (horizontaux ou verticaux) d’éléments, etc.

(a) Le résultat attendu

(b) Problème d’alignement.

Figure 6.5 – Éléments mal alignés : capture et suggestion de correction