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ù Q′ est 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 =