• Aucun résultat trouvé

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 a4a.

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.

6.3

Structures de données et optimisations pra-