6.2
Mise en place de la compilation
Compilation de règles hiérarchiques Pour la compilation de règles hiérar- chiques, on utilise une matrice bi-valeur représentant le pré-ordre ≤p sur les prédi-
cats calculé à partir des règles hiérarchiques et induisant le pré-ordre sur les atomes. A chaque prédicat de la base, nous associons un nombre, la case (i, j) de la matrice est à 1 si le prédicat i est supérieur au prédicat j et à 0 sinon.
Nous allons maintenant détailler la mise en œuvre de l’amélioration avec les règles compilables.
6.2.1
Saturation
Pour calculer la saturation d’un ensemble de règles, nous effectuons un calcul de point fixe. Nous calculons d’abord l’ensemble de règles inférées par toutes les paires de règles, puis nous supprimons les règles tautologiques et les règles subsu- mées. L’ensemble obtenu est appelé l’ensemble de règles inférées au rang 1. Ensuite, nous utilisons l’ensemble de règles inférées au rang 1 et l’ensemble de règles initial pour obtenir l’ensemble de règles inférées au rang 2 après avoir supprimé les règles tautologiques et les règles subsumées. Ce processus est répété jusqu’à ce que plus aucune nouvelle règle ne soit obtenue.
Exemple 59
Voici le détails du calcul de la saturation pour les règles compilables de l’exemple 50. R1 = r(x, y) → t(x, y) R2 = s(x, y) → t(y, x) R′ 2 = t(x, y) → s(y, x) R3 = t(x, y) → q(x) R4 = t(x, y) → q(y) R5 = p(x, y, z) → r(x, z) R6 = p(x, x, z) → s(x, x)
Les règles inférées au rang 1 sont les suivantes : R1• R′2 = r(x, y) → s(y, x) R1• R3 = r(x, y) → q(x) R1• R4 = r(x, y) → q(y) R2• R′2 = s(x, y) → s(x, y) est tautologique R2• R3 = s(x, y) → q(y) R2• R4 = s(x, y) → q(x) R′ 2• R2 = t(x, y) → t(x, y) est tautologique R5• R1 = p(x, y, z) → t(x, z) R6• R2 = p(x, x, z) → t(x, x)
Les règles inférées au rang 2 sont les suivantes : R5• R1 • R′2 = p(x, y, z) → s(z, x)
R5• R1 • R3 = p(x, y, z) → q(x)
R5• R1 • R4 = p(x, y, z) → q(z)
R6• R2 • R3 = R6• R2• R4 = p(x, x, z) → q(x) est subsumée par R5• R1 • R3
La seule règle inférée au rang 3 est la suivante :
R5• R1 • R′2• R2 = p(x, y, z) → t(x, z) est subsumée par R5• R1
Comme aucune règle inférée au rang 3 n’est conservée, la saturation est terminée.
La saturation d’un ensemble de règles peut prendre un temps relativement long. Nous conservons donc dans un fichier texte, le résultat de la saturation de l’ensemble de règles afin d’éviter de la recalculer à chaque test.
6.2.2
Codage
Chaque règle compilable peut être codée d’une part en explicitant les co- occurences de terme dans l’hypothèse par des égalités sur les positions du prédicat de l’atome en hypothèse, et d’autre part, en indiquant à quelle variable de l’hypo- thèse correspond une variable de la conclusion en donnant pour chaque position du prédicat de l’atome en conclusion la plus petite position du prédicat en hypothèse contenant cette variable.
Définition 6.4 (Codage d’une règle ) Soit R : p(x1, . . . xk) → q(x′1, . . . x′k′) une
règle compilable. Le codage de R est cod(R) = (p, q, Ep, Lq), où Ep est l’ensemble
d’égalités {i = j|i 6= j, xi = xj}, où i est la plus petite position telle que xi = xj (ceci
assure l’unicité du codage) et Lq est une liste de positions (pos1, . . . , posk′) telle que posi est la position du premier terme de hyp(R) identique à x′i.
Exemple 60 Soit R = p(x, x, y) → q(y, y). Alors cod(R) = (p, q, {1 = 2}, (3, 3)) La saturation de l’ensemble de règles est stockée dans une structure codant une relation binaire sur les prédicats. Dans le but de coder le pré-ordre sur les atomes, nous avons pour chaque pairs (p, q) de prédicats, une liste (possiblement vide) de conditions à vérifier afin de savoir si a 4 b, où a et b sont deux atomes donnés ayant pour prédicat p et q respectivement. Chaque condition code une règle inférée de la forme ai → bi où ai a pour prédicat p et bi a pour prédicat q.
Exemple 61 (Suite de l’exemple 59) La table 6.1, illustre la table obtenue avec l’ensemble de règles saturé calculé dans l’exemple 59 :
6.2. MISE EN PLACE DE LA COMPILATION 101 R1 = r(x, y) → t(x, y) R2 = s(x, y) → t(y, x) R′ 2 = t(x, y) → s(y, x) R3 = t(x, y) → q(x) R4 = t(x, y) → q(y) R5 = p(x, y, z) → r(x, z) R6 = p(x, x, z) → s(x, x) R1• R′2 = r(x, y) → s(y, x) R1• R3 = r(x, y) → q(x) R1• R4 = r(x, y) → q(y) R2• R3 = s(x, y) → q(y) R2• R4 = s(x, y) → q(x) R5• R1 = p(x, y, z) → t(x, z) R6• R2 = p(x, x, z) → t(x, x) R5• R1• R′2 = p(x, y, z) → s(z, x) R5• R1• R3 = p(x, y, z) → q(x) R5• R1• R4 = p(x, y, z) → q(z) 4 q r s t p R5• R1 • R3 : {}, (1) R5 : {}, (1, 3) R6 : {1 = 2}, (1, 1) R5• R1 : {}, (1, 3) R5• R1 • R4 : {}, (3) R5• R1• R′2 : {}, (3, 1) R6• R2 : {1 = 2}, (1, 1) r R1• R3 : {}, (1) R1 • R′2 : {}, (2, 1) R1 : {}, (1, 2) R1• R4 : {}, (2) s R2• R4 : {}, (1) R2 : {}, (2, 1) R2• R3 : {}, (2) t R3 : {}, (1) R′2 : {}, (2, 1) R4 : {}, (2)
Table 6.1 – Compilation des règles de l’exemple 50.
6.2.3
Intégration du pré-ordre sur les atomes
Cette section présente la manière dont est pris en compte le pré-ordre sur les atomes dans les algorithmes d’homomorphisme et d’unification. L’opération de base consistera à vérifier si un atome est 4 ou non à un autre. Ceci permettra de calculer les 4-unificateurs par pièce et les images possibles d’un atome du fait source lors du calcul d’homomorphisme.
Vérifier que a 4 b. La comparaison de deux atomes a et b de prédicats p et q respectivement, est faite de la manière suivante. Soit C une liste de codages de règles représentant les conditions associées à la paire (p, q). La relation a 4 b est vérifiée s’il existe (p, q, Ep, Lq) ∈ C telle que :
• pour tout i = j dans Ep, le terme en position i dans a est identique au terme
en position j dans a ;
• pour tout j ∈ [1 . . . arité(q)], le terme en position j dans b est identique au terme en position Lq[j] dans a.
L’accès à la liste de conditions associée aux deux atomes se fait en temps constant. La complexité de la vérification dépend donc principalement du nombre de condi- tions associées à la paire de prédicats, mais en pratique, ce nombre reste très bas, on peut donc considérer que la vérification est en temps constant.
Calculer les 4-unificateurs par pièce. Pour le calcul des 4-unificateurs par pièce, nous reprenons le même principe que pour le calcul des unificateurs par pièce classique. La notion de pré-unificateur est étendue à celle de pré-4-unificateur. Définition 6.5 (pré-4-unificateur) Soit Q une requête, R une règle, Q′ ⊆ Q,
C′ ⊆ concl(R), et P une partition sur term(Q′) ∪ term(C′). Alors µ = (Q′, C′, P )
est un pré-4-unificateur de Q avec R si (1) P est valide, et (2) P (C′) 4 P (Q′).
La propriété suivante, similaire à celle proposée pour les unificateurs par pièce, assure qu’un pré-4-unificateur dont l’ensemble des variables liantes et l’ensemble des variables séparatrices sont disjoints (voir définition 4.10) est un 4-unificateur par pièce et réciproquement. La preuve est similaire à celle de la propriété 13. Propriété 14 Soit Q une requête, R une règle, Q′ ⊆ Q, C′ ⊆ concl(R), et P une
partition sur term(Q′) ∪ term(C′). µ = (Q′, C′, P ) est un 4-unificateur par pièce de
Q avec R si et seulement si µ est un pré-4-unificateur et glue(µ) ∩ sep(Q′) = ∅.
Pour calculer les 4-unificateurs par pièce entre une requête Q et une règle R, il nous faut donc modifier notre algorithme 3 de calcul des pré-unificateurs atomiques pour obtenir l’algorithme 6 qui calcule l’ensemble des pré-4-unificateurs atomiques les plus généraux, c’est-à-dire AP U = {µ = ({a}, {b}, P ) | a ∈ Q, b ∈ concl(R), et µ est un pré-4-unificateur de Q avec R }. Pour cela, nous nous appuyons sur la définition suivante qui pour deux atomes a et b permet de calculer une partition P telle que P (a) 4 P (b).
Définition 6.6 (Partition de codage) Soit a et b deux atomes et c = (pred(a), pred(b), Ea, Lb) un codage d’une règle. La partition de codage associée à a
et b selon c, notée par Pc(a, b, c), est la partition la plus fine sur term(a) ∪ term(b)
telle que :
• pour chaque i = j ∈ Ea, les termes de a apparaissant en position i et j sont
dans une même classe de Pc(a, b, c).
• soit Lb = (p1, . . . , pk), pour chaque pi ∈ Lb, le termes de a apparaissant en
position pi et le terme de b apparaissant en position i sont dans une même
classe de Pc(a, b, c).
Exemple 62 Soit a = p(x, y, z) et b = q(u, v) deux atomes et c = (p, q, {1 = 3}, (2, 1)) le codage d’une règle. La partition de codage associée à a et b selon c est la partition {{x, z, v}, {y, u}}. Les variables x et z sont dans la même classe car 1 = 3, u est dans la même classe que y la 2ème
variable de a et v est dans la même classe que x la 1ère
6.2. MISE EN PLACE DE LA COMPILATION 103
Algorithme 6 : pré-unificateur
Données : Une requête Q, une règle R, C une liste de codages de règles Résultat : L’ensemble des pré-4-unificateurs les plus généraux d’un atome
de Q avec un atome de concl(R). début
AP U ← ∅;
pour chaque a ∈ concl(R) faire pour chaque b ∈ Q faire
pour chaque c = (pred(a), pred(b), Ea, Lb) ∈ C faire
si Pc(a, b, c) est valide alors
AP U ← AP U ∪ {({a}, {b}, Pc(a, b, c)}; fin si fin pour fin pour fin pour retourner APU; fin
6.2.4
Déploiement d’une requête
Lors du déploiement d’une requête (voir 5.6), nous avons besoin de connaître les atomes 4 à un atome de la requête. Nous allons voir comment il est possible de construire à partir d’un atome a tous les atomes a′ les plus généraux tel que a′ 4a.
Soit q le prédicat de a, on construit la liste des atomes a′ 4a en prenant, pour tout
prédicat p, Cp une liste de codages de règles représentant les conditions associées à la
paire (p, q). On choisit tous les (p, q, Ep, Lq) ∈ Cp, avec Lq = (p1, . . . , pm), tels qu’on
a pour chaque pi = pj le ieme et le jeme termes de a qui sont identiques. A partir de
ces (p, q, Ep, Lq), on construit l’atome a′ = p(t1, . . . tk) de la manière suivante :
1. soit Lq = (p1, . . . , pm) pour tout i ∈ [1, m] le terme de a′ en position pi est
identique au terme de a à la position i. 2. pour chaque i = j ∈ Ep, ti = tj dans a′
3. Pour tous les termes de a′ dont la valeur n’a pas été définie par les deux
conditions précédentes, on crée une nouvelle variable.
Exemple 63 Soit a = q(x, y) un atome et c = (p, q, {1 = 4}, (2, 1)) une condition où p est d’arité 4. l’atome, a′ 4 a construit à partir de c est a′ = p(y, x, z, y) où z
est une nouvelle variable. x est identique à la 2ème
variable de a′, y est identique à
la 1ière
et la 4ème
variable de a′ est identique à la 1ère
donc à y, enfin la 3ème
position n’est concernée par aucune des conditions donc on crée une nouvelle variable.