• Aucun résultat trouvé

Chapitre 2. Conclusion conséquente et la production

2.4. Algorithmes de calcul de production

2.4.2. Algorithme avec coupure

subsume(nil, c) →

/ ;

subsume(l.c’, c) →

subsume(c’, c)

dans(l, c) ;

longueur-inferieure(c, infini) →

/ ;

longueur-inferieure(nil, l) → ;

longueur-inferieure(a.c, l) →

/

impasse ;

longueur-inferieure(a.c, l) →

val(sub(l, l), l’)

longueur-inferieure(c, l’) ;

2.4.2. Algorithme avec coupure

A toute étape de production, on essaie d’effacer le premier littéral de la première branche

d’arbre (le littéral à effacer). Pour ce faire, il faut choisir une clause candidate contenant

l’opposé de ce littéral et satisfaisant aux conditions de non répétition, en ôter tous les littéraux

immédiatement effaçables (qui ne satisfont pas aux conditions C2b), puis essayer d’effacer la

clause restante. Quand tous ces choix ont été effectués et résolus, il reste un choix

supplémentaire qui est de mettre en production le littéral à effacer.

Or, si le littéral à effacer a été, pour un certain choix, complètement effacé sans avoir eu

besoin d’installer des littéraux en productions supplémentaires, il est inutile d’effectuer les

choix restants. On peut formaliser ceci par une définition et une propriété.

Définition 2.13:

S’il existe un début de production, D, de dernière étape (j) :

...

(i)<p1, (l.s) B1>

...

(j)<p

2

, B

2

>

telle que B

1

= B

2

et p

1

= p

2

, on dira que le littéral l a été complètement effacé.

Propriété 2.7:

Dans ce cas toute production égale à D jusqu’à l’étape (i) incluse, ne pourra produire que

des clauses subsumées par d’autres clauses produites par les productions de début D.

Donc, d’après la structure de l’algorithme, qui à partir de l’étage (i+1), calcule toutes les

productions ayant ces (i) premières étapes avant de faire les autres choix pour l à l’étape

(i+1), il sera inutile si ce littéral est complètement effacé de faire ces autres choix. C’est

principalement pour cette raison que l’on essaie d’abord d’effectuer toutes les résolutions

possibles sur un littéral avant de mettre ce littéral en production (avant d’essayer d’effacer de

manière classique un littéral, on regarde s’il n’existe pas une clause contenant son opposé et

dont tous les littéraux sont immédiatement effaçables). Le choix inverse est possible mais

donne de moins bons résultats.

Démonstration :

Soit PR1 une production égale à D jusqu’à (i). Cette production aura une étape (j’) dont

l’arbre est B1, et peut donc s’écrire :

...

(i)<p1, (l.s) B1>

...

(j’)<q p1, B1>

...

(n’)<r q p

1

, 0>

PR1 produit la clause p = r q p

1

dans laquelle q et r sont des clauses éventuellement vides

(la notation inclut le cas où j’ = n’). Pour prouver le théorème, il faut construire à partir de

PR1 une production, PR2, dont le début est D et dont la clause produite subsume p.

Le début de PR2 est donc :

...

(i)<p1, (l.s) B1>

...

L’important est que, à l’étape (j’) de PR1 et à l’étape (j) de PR2, les arbres sont égaux. À

l’étape (j), la clause en production, p

1

, de PR2 est une sous clause de la clause en production à

l’étape (j’), q p1, de PR1.

Les étapes de PR2 qui suivent (j) sont construites à partir des étapes de PR1 qui suivent

(j’) telles que, si la clause appelée contient un littéral de r q alors ce littéral n’est pas

immédiatement effacé mais inséré dans l’arbre. Il sera mis en production à l’étape où il sera

littéral à effacer de l’arbre courant. Plus précisément :

1. L’étape (j+1) de PR2 est construite à partir de l’étape (j’+1) de PR1 telle que :

- si (j’+1) met en production le littéral à effacer, alors (j+1) mettra également en

production ce même littéral à effacer.

- si (j’+1) effectue une résolution sur une clause c, alors (j+1) effectuera également

une résolution sur cette même clause c. Les branches ajoutées à l’arbre B1 (dans

PR2) sont obtenues à partir des littéraux de c non immédiatement effaçables (dans

PR1). Mais les littéraux de c immédiatement effaçables dans PR2, sont les

littéraux de c immédiatement effaçables dans PR1, plus les littéraux de c, égaux à

un des littéraux de q (les ascendants et frères sont les mêmes dans PR1 et PR2 car

les arbres sont égaux à l’étape (i)). Donc les branches à ajouter dans PR2 sont les

branches à ajouter dans PR1, plus éventuellement un certain nombre de branches

dont les racines sont les littéraux de c qui ne sont pas dans q.

2. On répète l’opération pour les étapes suivantes de PR2, qui sont construites à partir

des étapes de PR1. Les clauses appelées sont les mêmes dans PR1 et PR2. La seule

différence est que dans les arbres correspondants (dans PR2) sont insérées un certain

nombre de branches supplémentaires, branches dont les racines seront toujours des

éléments de q. Quand le littéral à effacer (dans PR2) portera sur une de ces branches

supplémentaires, ce littéral sera mis en production. On insère donc un certain nombre

d’étapes qui sont toutes des mises en production de littéraux de q.

La suite de couples ainsi formée est bien une production, car comme PR1 en est une, on

en déduit que pour toutes les étapes de résolution de PR2 les clauses appelées satisfont aux

conditions de non répétition. En effet, ces étapes sont telles que :

- l’étape associée dans PR1 satisfait aux conditions de non répétition

- les ascendants sont les mêmes dans PR1 et PR2 car ces étapes sont des étapes de

résolution et ne portent donc pas sur les branches supplémentaires (on a dit que les

étapes portant sur les branches supplémentaires mettent en production un littéral).

- l’union des frères et littéraux en production de PR2 est incluse dans l’union des frères et

littéraux en production de PR2.

PR2 est donc bien une production et la clause produite par PR2 subsume bien celle

produite par PR1 car les littéraux mis en production dans PR1 et non dans PR2 sont tous dans

q.

Exemple 2.2:

C = {a b c, ¬a b, ¬a u, ¬u v, ¬v w}

On veut calculer toutes les productions d’origine a b c. L’algorithme construira, par ses

appels récursifs, la première production qui produit la clause c b :

1.

<0 ,(a) (b) (c)>

2. ¬a b <0 ,(b) (c)>

3. <b ,(c)>

4. <c b ,0>

Cette production est donnée par le choix de ¬a b à la deuxième étape. Il reste deux choix

à cette étape : soit appeler la clause ¬a u, soit mettre a en production. En fait ces choix sont

inutiles car ils ne pourront générer que des clauses subsumées par d’autres clauses produites

par la production effectuée auparavant. Le premier choix donne trois productions dont la

première est :

1.

<0 ,(a) (b) (c)>

2. ¬a u <0 ,(ua) (b) (c)>

3. ¬u v <0 ,(vua) (b) (c)>

4. ¬v w <0 ,(wvua) (b) (c)>

5. <w ,(b) (c)>

6. <b w ,(c)>

7. <c b w ,0>

En fait, c b w est subsumée par c b.

Documents relatifs