7. Validation de connaissances
Nous avons déjà eu l'occasion d'insister
sur la notion de contexte (5.4.4.) et de
"non dit" (5.4.3.). Par
exemple, si l'on considère le dimensionnement de roulements à billes, celui qui
travaille pour l'automobile a des règles complètement différentes de celui qui
travaille pour le spatial, parce que pour le premier il est évident que les
roulements baignent dans l'huile, alors que pour le second il est évident qu'ils
frottent "à sec". Et même dans le spatial, celui qui s'occupe de la turbo-pompe
qui tourne à 40.000 t/mn pendant 8 minutes n'a pas du tout les mêmes règles que
celui qui s'occupe d'un satellite qui tourne à 1 t/h pendant 15 ans.
On
obtiendra donc des règles parfaitement contradictoires, qui ne seront
utilisables que si on précise leur contexte d'utilisation.
Autre exemple :
celui qui conçoit une moto vous dira que sur le moyeu de la roue avant il faut
mettre un boulon de 13. Or le calcul montre que du 10 serait largement
suffisant. L'explication ne relève pas de la Mécanique : c'est simplement que,
puisque sur la roue arrière on a besoin d'un boulon de 13, en mettre un aussi
sur la roue avant diminue le besoin d'outillage.
On a donc besoin de détecter
les contradictions dans les Bases de Connaissances. D'autre part,
il serait vain de croire que l'expert pensera à énumérer tous les cas : il faut
donc pouvoir détecter des lacunes. Ensuite, il est inévitable
qu'il se répète, qu'il donne une règle pour un cas particulier et la même pour
le cas général. Cela fera perdre du temps. Il faut donc pouvoir détecter les
redondances. Enfin, une erreur peut toujours se glisser, faisant
qu'une règle est inapplicable (ses conditions ne peuvent jamais être réunies).
Il convient donc de savoir détecter les incompatibilités entre
prémisses.
Comme pour les programmes
traditionnels, il est indispensable de soumettre un SBC à des jeux
d'essai. En d'autres termes, on va fabriquer des Bases de Faits, et
faire tourner le système dessus, puis analyser le résultat.
Une technique
semi-automatique de fabrication de jeux d'essais consiste à s'intéresser aux
extrèmes : décrire une situation dans laquelle la température est la plus basse
de celles mentionnées dans les règles, la pression la plus haute possible,
etc.
Il est important que l'expert qui a fourni les règles soit tenu à
l'écart de la constitution d'au moins une partie des jeux d'essais, car son bon
sens l'empècherait d'en construire certains. En d'autres termes, on cherche
avant tout à violer les règles qu'il n'a pas données.
La validation dynamique, bien
qu'indispensable, est coûteuse. Il est intéressant, avant de s'y livrer, de
vérifier statiquement la BdC, comme on relit un programme avant de le tester.
Nous allons donc regarder de quelles méta-connaissances on a besoin pour
vérifier une Base de Connaissances.
Nous faisons l'hypothèse que
notre BdC est constituée de règles du Calcul des Prédicats du Premier Ordre (2.3.2.).
Chaque prémisse et chaque conséquent est constitué d'un prédicat, éventuellement
nié, portant sur des variables et/ou des constantes. P(?x ?y) ^ non Q(a ?y) ^ R(?x ?z) ^ ... -> S(?x) ^ T(?x ?y) ^ ...
Nous faisons d'autre part l'hypothèse que les constantes présentes dans
les règles, et celles par lesquelles on va instancier les variables, sont des
"objets", liés entre eux par des relations, et sur lesquels on peut faire porter
des propriétés. Entre autres relations, nous supposons qu'on a un arbre
d'héritage : tout objet, sauf un, "est-un" autre objet.
Nous faisons enfin
l'hypothèse que les prédicats sont eux-mêmes des objets, sauf quelques prédicats
numériques tels qu < , =, etc.
Dans la quasi-totalité des cas, nous
traiterons des prédicats à deux places ; la première place sera appelée "sujet"
et la seconde "complément".
Dans plusieurs des méthodes
qui seront exposées ci-après, nous ferons référence au "type" des variables.
Cette notion est liée à la relation "est-un" mentionnée ci-dessus. Considérons
la règle : est-un(?x véhicule) ^ a-pour-bougie(?x ?y) ^ ...
Pour nous, il est évident que ?y ne peut être instancié que par quelque
chose qui "est-un" "bougie". Parce que nous interprètons (2.1.5.) la
règle. Mais pour le moteur d'inférence, qui travaille, faut-il le rappeler, au
niveau syntaxique du Système Formel, rien de tel. Cependant, nous pouvons
construire un outil qui retrouve ce résultat : il suffit qu'il aille explorer le
réseau des objets, pour découvrir que tous les objets sur lesquels pointe la
relation "a-pour-bougie" ont la propriété d'hériter directement de l'objet
"bougies".
Dans ce qui suit, nous
serons amenés à manipuler trois notions de type :
- type "strict" : l'objet immédiatement au-dessus dans la relation "est-un"
- "plus petit type commun" : l'objet le plus bas dont héritent des objets
qui n'ont pas tous le même type strict. Par exemple, si b1 est une bougie et
p1 un pneu, leur pptc sera "composant".
- type "large" : n'importe lequel des objets au-dessus.
Muni de ces
notions, on peut donc automatiquement détecter, de proche en proche, le type
strict ou le pptc de chaque variable de la règle (le type strict de chaque
constante étant bien entendu immédiatement connu). On s'appuie pour cela sur
deux considérations :
- le pptc des cibles des relations (compléments)
- le pptc des origines des relations (sujets)
Ces ensembles peuvent
être mis à jour au fur et à mesure qu'on utilise le système, en étudiant chaque
nouvelle Base de Faits
Nous considérons pour l'instant
une règle isolée, sans nous préoccuper de ses éventuels conflits avec d'autres
règles.
L'algorithme ci-dessus peut
arriver à un pptc vide. a-pour-bougie(?x ?y) ^ est-gonflé-à-la-pression(?y ?z) ^ ...
dénote probablement une faute de frappe sur ?y. En tout cas, la règle ne
sera jamais déclenchable.
Lors de la construction de
l'ontologie, on peut associer à certains objets des limitations sur les valeurs
possibles de certaines de leurs propriétés ; on peut de même associer
directement ces limitations aux objets-propriétés. Ces limitations peuvent être
faites soit en intension (intervalles obligatoires ou interdits), soit en
extension (listes de valeurs permises ou interdites).
L'algorithme de typage
peut alors, parallèlement, tenir à jour cette contrainte, et en détecter des
violations, moyennant éventuellement la connaissance de la sémantique des
prédicats numériques : est-un(?x Ferrari) ^ a-pour-couleur(?x ?y) ^ est-un(?z pneu) ^
a-pour-couleur (?z ?y)
est-un (?x humain) ^ a-pour-age(?x ?y) ^ >(?y 150)
On peut également
indiquer, lors de l'élaboration, des incompatibilités entre prédicats.
Un prédicat est dit
monovalué si, pour chaque valeur de son sujet, il y a au plus une valeur du
complément. Sinon, le prédicat est dit multivalué.
Exemples :
a-pour-taille est monovalué, a-pour-enfants multivalué.
Donc,
si un prédicat est monovalué, on ne peut pas le trouver à gauche et à droite
d'une règle avec le même sujet. ... ^ taille(?x ?y) ^ ... -> taille(?x ?z)
Remarque importante : ce contrôle n'est possible que si on est en Logique
Monotone, ou si le prédicat est marqué comme étant monotone : position(?x ?y) ^ déplacement (?x ?z) ^ +(?y ^?z ^?t) -> position(?x ?t)
La règle ayant passé les
contrôles locaux, nous allons à présent la confronter à celles qui sont déjà
dans la base.
Une première
tâche consiste à rechercher les règles qui lui ressemblent. Cela est facilité
par la tenue à jour du réseau des interventions des prédicats, gràce à des
méta-prédicats tels que "apparait-dans-la-partie-gauche-de". Grace au typage des
variables et à ce réseau, on peut déterminer que la règle R porte sur les mêmes
types, des sous-types, ou des sur-types d'une règle Ri. On peut alors
affiner, en fonction des prédicats communs, et découvrir qu'elle porte
exactement sur les mêmes objets, ou sur une généralisation ou sur une
spécification de ces objets. On fait le même travail sur la partie droite.
Pour chaque prédicat de la partie
gauche, on cherche des règles ayant le même prédicat en partie droite. On
vérifie alors la cohérence des types. Si l'intersection est vide,
- Il manque des règles, ou
- le prédicat est supposé affirmé dans la BdF, et il convient de le marquer
comme tel
On fait de même pour les prédicats de la partie droite, ce
qui permet de détecter qu'il manque des règles, ou que le prédicat est réservé à
la solution.
Une "bonne" ontologie
contient des contraintes : les choses qui doivent toujours être vérifiées, et
celles qui sont interdites. Par exemple, l'age d'un humain doit être inférieur à
150, une voiture ne vole pas, etc.
Pour montrer qu'une règle viole une
contrainte, une technique consiste à construire une BdF virtuelle
: on réifie les variables, en respectant leur type, et en leur associant les
propriétés énoncées par la règle. Puis on applique à cette BdF toutes les règles
possibles, en vérifiant au passage les contraintes. Lorsque ce processus de
saturation s'épuise, on repart en chainage arrière, cherchant les
objets qui ont pu produire ceux de la BdF. On alterne ainsi les deux processus,
jusqu'à ce qu'une contrainte soit violée ou que plus aucune règle ne
s'applique.
Remarquer que ce procédé se complique terriblement lorsque
certaines règles sont non monotones ; on est alors obligé de gérer une pile de
BdF virtuelles.
Si les contraintes sont
énoncées sous la même forme que les règles, on peut les vérifier avec le même
outil.
Lorsque le système donne une réponse
fausse, ou surprenante, nous avons vu au 2.2.3. que
l'on pouvait lui demander d'expliquer son raisonnement. Il va donc nous exhiber
une séquence de règles. Parmi celles-ci, il est possible que nous en trouvions
une "manifestement fausse". La question est alors : "d'où sort-elle?". La
réponse n'est possible que si nous avons pris la précaution d'associer à chaque
règle sa source : "NASA report 88-03-156, saisi par JMF le 12/3/97". On ira
immédiatement vérifier la source, vérifier que la traduction est
correcte.
Mais, avec le développement incrémental, il est possible que la
règle en question soit le résultat de modifications successives. Il est
fondamentalement important d'enregistrer celles-ci : "modifié par X le Y, pour
telle raison". Dès lors, il devient possible de mettre le doigt sur l'origine de
l'erreur. Et, par exemple, de se dire : "reprenons tout ce qui a été modifié par
X, il a un point de vue complètement différent de notre objectif". Cela,
moyennant une certaine discipline et quelques petits logiciels, est relativement
facile, et rapporte extrèmement gros.
On peut également envisager des
méta-connaissances du style : tel auteur commet fréquemment telle erreur.
Une autre question que l'on peut se poser
face à un résultat insatisfaisant, est : "pourquoi n'a-t-il pas trouvé telle
solution?". Cette question est beaucoup plus délicate, et n'a été abordée, à ma
connaissance, que par très peu de chercheurs, dont Brigitte Saffar.
Chapitre précédent Chapitre suivant Table des matières
© Jean-Marc Fouet,
Aout 1999