• Aucun résultat trouvé

4.4

Unificateur mono-pièce

Dans le double but de simplifier le calcul des unificateurs et de diminuer le nombre d’unificateurs à calculer à chaque pas, la seconde idée clé de nos recherches a été de considérer uniquement des unificateurs mono-pièce, c’est-à-dire des unificateurs par pièce de la forme µ = (Q′, C, P ) où Qest une unique pièce selon glue(µ).

La restriction aux unificateurs mono-pièce ne conduit pas à manquer des réécritures puisque la réécriture produite en enchaînant des unificateurs mono-pièce est au moins aussi générale que celle produite par l’unificateur multi-pièce correspondant. Voici sur un exemple une illustration de ce principe.

Exemple 35 Soit R = p(x, y) → q(x, y) et Q = q(u, v) ∧ r(v, w) ∧ q(t, w).

Soit µ1 = (Q′1, C′, P1) un unificateur mono-pièce de Q avec R où Q′1 = {q(u, v)},

C′ = {q(x, y)} et P

1 = {{u, x}, {v, y}}. Soit µ2 = (Q′2, C′, P2) un unificateur mono-

pièce de Q avec R′ où Q

2 = {q(t, w)} et P2 = {{t, x}, {w, y}}. Soit µ3 = (Q′1 ∪

Q′

2, C′, P3) où P3 = {{u, t, x}, {v, w, y}}.

Si on applique successivement µ1 et µ2 on obtient Qs= p(u, v) ∧ r(v, w) ∧ p(t, w).

Si on applique µ3, on obtient Q3 = p(t, v) ∧ r(v, v) ∧ p(t, v) et on constate Qs est

plus générale que Q3.

Nous montrons d’abord que l’opérateur de réécriture basé sur les unificateurs mono-pièce les plus généraux est adéquat et complet. En revanche, il n’est pas éla- gable, il s’ensuit que l’ensemble de réécritures produit par l’algorithme 1 avec cet opérateur peut ne pas être complet. Pour retrouver l’élagabilité, nous présentons dans la section suivante un nouvel opérateur exploitant les unificateurs mono-pièce pour calculer des unificateurs mono-pièce agrégés. Cette section présente aussi un algorithme pour calculer l’ensemble des unificateurs mono-pièce les plus généraux entre une requête et une règle.

Définition 4.13 (Unificateur mono-pièce) Soit µ = (Q′, C, P ) un unificateur

par pièce, on dit que µ est mono-pièce si Q′ est une unique pièce par rapport à

glue(µ).

On appellera rewβ1+ l’opérateur de réécriture qui a une requête associe toutes les réécritures de cette requête calculables au moyen d’un unificateur mono-pièce le plus général. La complétude de l’opérateur rewβ1+ s’appuie sur le lemme suivant. Lemme 5 Pour tout unificateur par pièce µ de Q avec R, il existe un entier k et Qs une ≤k-réécriture de Q selon R et rewβ1+ telle que Qs≥ β(Q, R, µ).

Preuve : Pour prouver ce lemme, nous allons construire une séquence Q = Q0, Q1, . . . , Qk = Qs telle que Qs ≥ β(Q, R, µ) et que chaque Qi, 1 ≤ i ≤ k,

est une 1-réécriture par µi un unificateur mono-pièce le plus général de Qi−1 avec

Soit P c1, . . . , P ck les pièces de Q′ selon µ = (Q′, C′, P ). On construit chaque

µi = (Q′i, Ci′, Pi) de Qi−1 avec Ri de la manière suivante (Q′i sera un sous-ensemble

de Qi−1) :

• Ri est une copie de R obtenue en renommant chaque variable par une nouvelle

variable avec une substitution de renommage hi.

• C′

i est l’image par hi du sous-ensemble de C′ unifié par P avec P ci.

• Pi est obtenu de la partition hi(P ) en (1) la restreignant au termes de Q′i et Ci′

(2) l’affinant autant que possible en gardant la propriété que Pi(Q′i) = Pi(Ci′).

• Q′

1 = P c1 et pour i > 1, Q′i = Pi−1◦ (P ci) où Pi−1◦ est la jointure de P1, . . . Pi−1.

Nous supprimons de la séquence les unificateurs inutiles comme indiqué dans l’explication qui suit pour garantir les deux propriétés suivantes :

i) ∀i, P◦

i−1(P ci) ∩ Pi−1◦ (Q \ Q′) = ∅

ii) ∀i, ∀j > i, P◦

i−1(P ci) ∩ Pi−1◦ (P cj) = ∅

explication de la propriété i) : Si P◦

i−1(P ci) ∩ Pi−1◦ (Q \ Q′) 6= ∅, nous enlevons

µi de la séquence car il est inutile puisque Pi−1◦ (P ci) ⊆ Pi−1◦ (Q \ Q′). En effet, soit

a ∈ P◦

i−1(P ci) ∩ Pi−1◦ (Q \ Q′), il existe b ∈ P ci et b′ ∈ Q \ Q′, b 6= b′ tels que

P◦

i−1(b) = Pi−1◦ (b′) = a, donc term(b) ⊆ sep(P ci), donc {b} est une pièce selon

glue(µ), donc P ci = {b}. Par conséquent, Pi−1◦ (P ci) = {a} ⊆ Pi−1◦ (Q \ Q′) et donc il

serait inutile de considérer cet unificateur. La propriété ii) s’appuie sur des raisons similaires.

Nous allons maintenant montrer que : 1. µi est un unificateur par pièce

2. µi est un unificateur par pièce le plus général

3. µi est un unificateur mono-pièce

Pour le premier point : • Q′

i ⊆ Qi−1 puisque ∀i, Pi−1◦ (P ci) ∩ Pi−1◦ (Q \ Q′) = ∅ et ∀i, ∀j > i Pi−1◦ (P ci) ∩

P◦

i−1(P cj) = ∅, voir propriétés i) et ii).

• C′

i ⊆ concl(Ri) par construction.

• Pi satisfait les conditions de la définition de l’unificateur par pièce puisque P

4.4. UNIFICATEUR MONO-PIÈCE 57

Pour le second point, puisque Pi est la partition la plus fine associée à un unifi-

cateur par pièce de C′

i et Q′i, on est sûr que µi est un unificateur par pièce le plus

général.

Pour le troisième point, il faut remarquer que chaque atome de Q′

i correspond à

au moins un atome de P ci. Ainsi, si P ci est composé d’un unique atome, Q′i aussi

et donc forme une unique pièce. Sinon, P ci est une pièce qui contient plus d’un

atome ; chaque atome A de P ci contient une variable x qui dans P est dans la même

classe qu’une variable existentielle y, y vient du sous-ensemble C′ unifié par P avec

P ci. Ainsi, l’atome Pi−1◦ (A) dans Q′i est tel que la classe de Pi qui contient Pi−1◦ (x)

contient aussi la variable existentielle hi(y). Donc Q′i forme une pièce unique.

A la fin de la séquence, Qk ⊆ Pk◦(Q \ Q′) ∪

S

j∈1..k(Pk(. . . Pj(hyp(Rj)))). Soit Ph

la jointure de tous les hi(P ). Puisque Pk◦ et Ph sont définis sur le même ensemble

et que chaque classe des Pi est incluse dans une classe de hi(P ) donc de Ph, Pk◦

est plus fine que Ph. Ainsi, par la propriété 3, il existe une substitution s telle que

s(P◦

k(Q \ Q′)) = Ph(Q \ Q′).

Soit h la substitution obtenue en faisant l’union des inverses des hi, alors h(Ph(Q\

Q′)) = P (Q \ Q) donc h ◦ s est un homomorphisme de P

k(Q \ Q′) dans P (Q \ Q′).

Maintenant, nous prouvons que pour 1 ≤ j ≤ k, h(s(Pk(. . . Pj(hyp(Rj))))) =

P (hyp(R)). En effet, Pk(. . . Pj(hyp(Rj))) = Pk(. . . P1(hyp(Rj))) puisque les termes

de hyp(Rj) n’apparaissent pas dans Pi (i < j).

Pour conclure la preuve, on a h(s(Qk)) ⊆ P (hyp(R)) ∪ P (Q \ Q′) = β(Q, µ, R),

donc h ◦ s est un homomorphisme de Qk dans β(Q, µ, R), et Qk ≥ β(Q, µ, R). 

Il nous reste à conclure par le théorème d’adéquation et de complétude suivant. Théorème 8 L’opérateur de réécriture rewβ1+ est adéquat et complet.

Preuve : L’adéquation découle trivialement du fait que les unificateurs mono-pièce sont des unificateurs par pièce. Pour la complétude, grâce au théorème 6, il nous suffit de montrer par induction sur k la longueur de la séquence de réécritures, que : pour toute k-réécriture Qr de Q selon rewβ et R il existe Qs et i un entier telle que

Qs est une i-réécriture de Q selon rewβ1+ et que Qs ≥ Qr. Pour k = 0 la propriété est trivialement satisfaite.

Pour k ≥ 1, on a Qr = β(Q′r, R, µ), avec Q′r une (k-1)-réécriture de Q selon rewβ.

Par hypothèse d’induction, il existe Q′

s une i-réécriture de Q selon rewβ1+ telle que Q′

s ≥ Q′r. Par le lemme 3, soit Q′s ≥ Qr, soit il existe un unificateur par pièce µ′

de Q′

s avec R tel que β(Q′s, R, µ′) ≥ Qr. Dans le dernier cas, grâce au lemme 5, il

existe Qs une j-réécriture de Q′s selon rewβ1+ telle que Qs≥ β(Q

s, R, µ′) ≥ Qr. 

Malheureusement, même s’il est adéquat et complet, nous allons voir au travers de quelques exemples que l’opérateur rewβ1+ n’est pas élagable et que l’ensemble retourné par l’algorithme 1 peut ne pas être complet. Pour corriger ce problème, on pourrait avoir envie d’enlever le calcul de couverture à chaque étape pour ne la

faire qu’une fois toutes les réécritures calculées mais comme le montre l’exemple 24, l’ensemble des réécritures peut-être infinie alors que la couverture est finie. Dans ces cas là, l’algorithme ne s’arrêterait pas alors qu’il se serait arrêté en calculant la couverture à chaque pas. Une autre solution serait de savoir à quel moment une réécriture qui n’est pas la plus générale doit être gardée car elle est l’unique moyen de produire une réécriture appartenant à la couverture finale. Malheureusement, nous n’avons réussit à concevoir aucun moyen pour le déterminer.

Exemple 36 Soit Q1 = {p(y), r(x, y), r(x, a)} et Q2 = {p(a), r(z, a)} deux

requêtes, on a Q1 ≥ Q2. Soit R = s(u, v) → r(u, v). Il y a un

unificateur mono-pièce µ2 = ({r(z, a)}, {r(u, v)}, {{z, u}, {a, v}}) de Q2 avec

R qui produit une requête Q′

2 = {p(a), s(z, a)}. Il y a deux unifica-

teurs mono-pièce de Q1 avec R µ11 = ({r(x, y)}, {r(u, v)}, {{x, u}, {y, v}}) et

µ12 = ({r(x, a)}, {r(u, v)}, {{x, u}, {a, v}}) qui produisent respectivement Q′11 =

{p(y), s(x, y), r(x, a)} et Q′

12 = {p(y), r(x, y), s(x, a)}. Ni Q′11 ni Q′12 ni Q1 elle-

même ne sont plus générales que Q′

2 donc rewβ1+ n’est pas élagable.

Non seulement, l’opérateur rewβ1+ n’est pas élagable mais en plus, si on l’utilise

dans l’algorithme 1, la sortie peut être incomplète. En effet, la restriction aux uni- ficateurs mono-pièce n’est pas compatible avec la sélection des réécritures les plus générales à chaque pas comme le fait l’algorithme.

Exemple 37 (Exemple simple) Soit Q = p(y, z) ∧ p(z, y) et R = r(x, x) → p(x, x). Il y a deux unificateurs mono-pièce de Q avec R, µ1 =

({p(y, z)}, {p(x, x)}, {{x, y, z}}) et µ2 = ({p(z, y)}, {p(x, x)}, {{x, y, z}}), qui

mènent à la même réécriture Q1 = r(x, x) ∧ p(x, x). Il y a aussi un unificateur par

pièce composé de deux pièces µ = (Q, {p(x, x)}, {{x, y, z}}), qui produit Q′ = r(x, x).

Une requête équivalente à Q′ peut être obtenue à partir de Q

1 par un pas supplémen-

taire d’unification mono-pièce. Maintenant, si on considère que l’on se restreint aux unificateurs mono-pièce et que l’on ne garde que les réécritures les plus générales à chaque pas, Q1 ne sera pas gardée puisque Q ≥ Q1. Si Q1 n’est pas gardée, Q′ ne

sera jamais générée, alors qu’elle est incomparable à Q, donc l’ensemble de sortie sera incomplet.

Dans l’exemple précédent, soit P1, respectivement P2, les partitions associées à

µ1, respectivement µ2, on peut noter que P1(Q) est redondant ainsi que P2(Q) donc

le problème pourrait être réglé en calculant u1(Q) \ u1(Q′) à la place de u1(Q \ Q′) et

en rendant P1(Q) non redondant, c’est-à-dire identique à p(x, x), avant de calculer

u1(Q) \ u1(Q′) qui donc serait vide. Cependant, le problème est plus profond comme

l’illustre l’exemple suivant.

Exemple 38 (Prédicats ternaires) Soit Q = r(u, v, w) ∧ r(w, t, u) et R = p(x, y) → r(x, y, x). De nouveau, il y a deux unificateurs mono-pièce de Q avec R : µ1 = ({r(u, v, w)}, {r(x, y, x)}, {{u, w, x}, {v, y}}) et µ2 =