Teleme et les systèmes experts
Généralités
Un système expert est composé d'une base
de connaissance et d'un moteur d'inférences.
Le moteur d'inférences inclus dans Teleme est un
moteur
fonctionnant en logique d'ordre 1 (il est capable de traiter les
variables) et gère la négation.
Il a été développé
en javascript en
s'appuyant sur les principes décrits dans l'excellent livre
de
Jacques Gressier
: LOGO un
Langage d'Introduction à l'Intelligence Artificielle.
Nathan Informatique. Paris 1989.
Il vous revient, bien sûr, de concevoir les bases de
connaissances.
La Base connaissance
Lorsque vous avez créé une page de
système expert
vous êtes dans une autre organisation que sur une page
ordinaire.
Un bouton a été
généré
automatiquement "interrogations". En cliquant dessus vous pourrez
rédiger les questions que vous souhaitez poser au
système.
Sinon, vous n'avez qu'une possibilité, créer des
prédicats.
Les prédicats
Si vous cliquez sur "prédicat" deux nouveaux boutons
apparaissent: "faits" et "règles".
Si vous cliquez sur l'un de ces deux boutons, les système
s'interrompt et vous demande préalablement de donner un nom
au
prédicat. Le nom du prédicat permet de mettre
ensemble
tous les faits et toutes les règles qui permettent de
répondre à une même question.
Si l'on souhaite pouvoir poser la question "
?" (ce qui revient à dire : "De quel pays(*X) Paris est la
capitale ?"), il faudra que la base de connaissance comporte le
prédicat "Capitale".
Une fois que vous avez donné un nom au prédicat
tous les
faits et toutes les règles de ce prédicat
commenceront
par ce nom.
Les faits
Les faits sont des propositions vraies que l'on veut faire
connaître au système.
Par exemple: .
Les sous tirets ""
sont utilisés pour séparer les
différents éléments d'une
proposition.
Le premier élément d'une proposition doit
toujours
être le nom d'un prédicat, ça ne peut
jamais
être une variable. On l'appelle le "prédicat" de
la
proposition.
Les autres éléments s'appellent les arguments du
prédicat.
Ces éléments peuvent être des mots
comme "" ou bien "". Ils
peuvent être aussi des variables. Les variables commencent
par le signe
"". Ex ,
.
Le nombre d'arguments d'un prédicat s'appelle son
"arité". Pour un prédicat donné ce
nombre doit
toujours être le même.
Vous n'avez pas le droit d'écrire: puis
car la première proposition est d'arité 3 et la
seconde d'arité 2.
Les faits sont toujours placés au dessus des
règles. En
effet quand on pose une question il vaut mieux aller voir d'abord les
faits qui contiennent déjà des
réponses toutes
faites, plutôt que les règles qui auront besoin
d'un
calcul pour trouver - ou ne pas trouver - de réponse.
Par ce qu'ils des propositions vraies, les faits ne doivent pas
comporter de variables. Les variables, c'est simplement dans les
questions et dans les règles quand on cherche à
calculer
les réponses.
Dans Teleme les faits sont affichés en noir.
Les règles.
Une règle est composée de deux parties :
l'hypothèse et les conditions.
- L'hypothèse:
l'hypothèse constitue la tête de la
règle, c'est
elle que le système va essayer de prouver c'est pourquoi on
appelle aussi l'hypothèse le "but" de la règle
(on
l'appelle aussi parfois "conclusion", peu importe c'est ce qu'on essaie
de prouver). Elle commence toujours par le prédicat de la
règle.
Dans Teleme l'hypothèse est affichée en rouge.
Quand le système utilise la règle,
l'hypothèse
n'est pas encore vérifiée (c'est pour
ça que ce
n'est encore qu'une hypothèse). Pour quelle soit
vérifiée il faut que les conditions le soient
aussi.
- Les
conditions:
Les conditions constituent le "corps" de la
règle.
Pour désigner les conditions on utilise aussi le mot
"prémisses". Il n'y a pas de limite au nombre de conditions.
Dans Teleme les conditions sont affichées en bleu.
Rédaction des conditions:
Dans la rédaction d'un fait ou d'une hypothèse,
le
prédicat est imposé puisqu'il s'agit de
répondre
à une question portant sur ce prédicat
précis. Les
conditions elles font référence à
d'autres
éléments leur prédicat n'est donc pas
prédéfini.
Quatre cas de figure peuvent se présenter :
- La condition commence par un autre prédicat
existant :
- hypothèse:
- condition:
Si le prédicat "Siège du gouvernement" est
défini par des faits ou des règles, le
système essaie
d'utiliser ces faits et ces règles pour prouver
la condition. Quand toutes les conditions sont prouvées,
l'hypothèse l'est aussi.
- La condition commence par un prédicat qui n'est
défini nul part dans la base de connaissance.
Plutôt que de considèrer qu'il ne sait pas, le
système pose
une question à l'utilisateur
pour lui demander si la condition est vraie ou fausse. Si
"siège
du gouvernement" n'est défini nulle part, la question sera
posée à l'utilisateur.
Cette particularité est très importante, elle
permet de
concevoir une base de connaissances sans aucun fait. Le
système
devient alors un système de questionnement
raisonné qui
permet à l'usager d'apprendre la démarche de
résolution de problème.
- La condition commence par un prédicat primitif.
Ex: Sup (supérieur) ou = (égal).
Le système connaît en interne le calcul
à effectuer pour évaluer ces prédicats.
Ex: =_5_2 échouera mais Sup_5_3 réussira. Bien
entendu,
vous aussi vous êtes capables d'évaluer ces
propositions,
mais quand vous les rédigez dans une proposition elles se
présentent plutôt sous la forme : =_*X_*Y
C'est au cours du processus d'évaluation de la
règle que les variables seront remplacées par des
valeurs.
- La condition commence par une action primitive. Ex: Affiche.
En fait il ne s'agit alors plus d'une condition que l'on
évalue
mais d'une action que l'on demande au système
d'exécuter.
Les actions n'échouent jamais et elles n'ont aucune
incidence
sur le calcul de la règle.
Elles sont cependant bien utiles pour tracer un calcule ou renvoyer
à l'utilisateur un résultat
intermédiaire, voire
même le résultat final mais
rédigé de
façon un peu plus élégante que la
question
d'origine.
Attention : Dans certains cas une règle d'un certain
prédicat peut rappeler le même prédicat
dans ses
conditions. Cela induit ce qu'on appelle une définition
récursive. Le prédicat X se définit en
faisant
appel au prédicat X, qui se définit ....
ça peut
ne jamais s'arrêter et il arrive effectivement que cela ne
s'arrête jamais. D'une autre côté
certaines
catégories ne problèmes ne peuvent être
traités que comme cela.
Quelques précautions à prendre: Il doit
y avoir un
fait ou une règle qui puisse réussir sans avoir
besoin de
ré appeler le prédicat.
La règle qui ré appelle le prédicat
doit être
la dernière (celle que le système utilise quand
il n'a
aucune autre solution). on pourra être amené
à
utiliser le judicieusement le coupe-choix (cf infra).
- Le
coupe-choix.
Le coupe choix s'insère dans la liste des
conditions
d'une règle, le plus souvent à la fin de la
liste. Pour
placer un coupe-choix il vous suffit de taper un /
Le coupe-choix a pour effet d'interrompre le calcul. Si vous savez
qu'il n'y a qu'une seule réponse possible à la
question
vous pouvez mettre un coupe choix à la fin de la
règle
qui la calcule. Par exemple si la base de connaissance permet
d'identifier une pierre, une fois que l'on sait que c'est du marbre, ce
n'est pas la peine de se demander si c'est du granite.
En fait cela attire notre attention sur le fait que le moteur
d'inférences travaille de façon
indéterministe,
c'est à dire qu'il va essayer de donner toutes les
réponses possibles à une question
donnée. C'est
souvent bien utile, parfois gênant. Dans ce cas on utilise le
coupe-choix pour brider l'indéterminisme du
système.
La Négation
Il est possible d'intégrer dans une liste de conditions une condition négative.
La condition négative est introduite par .
Dans ce cas précis le prédicat arrive donc en deuxième position.
Exemple:
hypothese :
condition 1 :
condition 2 :
En arrivant sur la négation le moteur lancera
l'évaluation du prédicat "Capitale" et concluera à
un échec en cas de réussite et à une
réussite en cas d'échec.
Les Primitives
Prédicats
primitifs (évalués en terme de vrai
ou faux)
- différent de
rend VRAI; rend FAUX
-
égal
rend VRAI;
donne à *A la valeur 2 (Test en l'absence de variables,
affectation si une variable)
- addition
rend VRAI;
donne
à *A la valeur 5;
donne à *A la valeur 3
(suivant la présence et la position de la variable,
fonctionne en Test, en Addition ou en Soustraction).
-
multiplication
rend
VRAI;
donne à *A la valeur 15;
donne à *A la valeur 5
(suivant la présence et la position de la variable,
fonctionne en Test, en Multiplication ou en Division).
-
supérieur
Sup_5_3 rend VRAI
-
inférieur
Inf_3_5 rend VRAI
-
concaténation
*A prend la valeur "Jules César"
*A prend la valeur "Jules"
*A prend la valeur
"César".
Action primitive
(ne fait jamais échouer l'évaluation)
Provoque l'affichage de "Bonjour " suivi de la valeur prise par *A au
moment de l'affichage.
Important : n'étant pas un prédicat, "Affiche"
n'a pas d'arité définie. Il est suivi d'un nombre
quelconque d'arguments, variables ou non, qui seront
affichés en l'état. Il ne provoque jamais d'échec.
Action primitive
(ne fait jamais échouer l'évaluation)
Provoque l'affichage du message "Quelle est votre couleur préférée" suivi d'un petit menu déroulant.
Le premier argument contient le message.
Le deuxième argument contient le nom de la variable (sans être précédé d'une étoile) qui recevra les choix.
Le troisième argument contient les options du menu déroulant séparées par des virgules.
Le quatrième argument contient, entre parenthèses, le
fait qui sera généré par le choix effectué
dans le menu aprés que l'expression "var:A" (ou var:B si le
deuxieme argument avait été B) aura été
affectée.
Dans l'exemple ci-dessus, si l'usager choisit "le rouge" et "le jaune"
(on peut faire une sélection multiple), les faits "ma couleur_le
rouge" et "ma couleur_le bleu" sont générés.
Si dans une règle utilisée postérieurement
apparaît la condition "ma couleur_*couleur", *couleur pourra
prendre la valeur "le rouge" et la valeur "le bleu".
Analyse et coloration du code.
En même temps qu'il affiche la base de connaissance, Teleme analyse certains paramètres:
- L'arité (nombre d'arguments) des prédicats.
Le premier fait ou, à défaut, l'hypothèse de la
première règle d'un prédicat définit son
arité.
Si par la suite un fait, une hypothèse ou une condition portant
sur le prédicat présente un nombre d'arguments
différent un message d'erreur vient le signaler.
Par exemple "Erreur: il y a trop d'arguments".
En effet le moteur ne peut pas faire de calcul avec des prédicats d'arité variable.
- Dans les conditions, les prédicats sont affichés en vert.
Concrètement cela veut dire qu'une condition
intégralement affichée en bleu donnera lieu à une
question à l'utilisateur pour générer le
prédicat à la volée lors du calcul.
La question sera posée soit directement, soit préalablement par l'intermédiaire de la primitive "Pique".
- Toujours dans les conditions, les primitives sont affichées en rouge foncé.
Note: Si une condition qui devrait
débuter à votre avis par un prédicat ou une
primitive s'affiche intégralement en bleu, regardez s'il n'y a
pas un saut de ligne ou une balise html qui rend le début de la
condition méconnaissable pour le système.
Les interrogations
Les interrogations sont des propositions contenant ou non des variables.
On peut prévoir autant d'interrogations qu'on le souhaite.
Les interrogations peuvent être
déportées sur une page distincte de la base de
connaissances grâce à la fonction
spéciale "inclure".
L'interrogation ne peut être activée en mode
création mais seulement en mode Test ou utilisation.
Si l'on souhaite que l'utilisateur puisse définir un ou
plusieurs éléments de l'interrogation on les
placera entre crochets.
Ex: Type_*A_[Legio]
Par défaut la question sera posée sur "Legio",
mais avant de lancer l'évaluation, l'utilisateur pourra
remplacer cette forme par une autre.
Interrogation déportée (à partir d'une autre page).
{{s_e(nom du systeme expert , interrogation) libellé du lien}}
ex: (si la page du système expert s'appelle "latin") {{s_e(latin,Type_*A_[Legio]) trouver le type de Legio}}
Par défaut le résultat d'une interrogation s'affiche en insertion sous l'interrogation.
ex:

Interrogation précédée de "s/".
on
peut aussi souhaiter un fonctionnement silencieux du système et
préfèrer gérer l'affichage des solutions à l'intérieur même des règles
par la primitive "Affiche". Dans ce cas on fera précéder
l'interrogation de s/
Par exemple : {{s_e(famille,s/Tante_Martine_*X)de qui Martine est-elle la tante ?}}
Le traçage, interrogation précédée d'un "t/"
Aussi bien pour la mise au point de la base de connaissances que pour
comprendre le fonctionnement d'un moteur d'inférences il
peut être intéressant de faire le
traçage de l'évaluation d'une question.
Pour pouvoir tracer une question on la fait
précèder de
Ex:
Lorsqu'il ne s'agit pas d'une interrogation déportée, même ainsi le traçage n'est
systématique. Pour le déclencher on cliquera sur
le bouton avec un point d'interrogation avec le bouton droit de
la souris.
Le traçage déclenche, à chaque pas du
moteur, l'affichage des buts et des règles en cours.
Exemple:
| Terminaison de_Rosa_en AE au
génitif
singulier_~Affiche_Rosa_appartient à la Première
Déclinaison_~@2~Première
déclinaison_Rosa_~/_~@1~Type_Rosa_Rosa_~QED~Type_Rosa_Rosa_ |
2 : |
| Première
déclinaison_Rosa_~/_~@1~Type_Rosa_Rosa_~QED~Type_Rosa_Rosa_ |
1 : |
| Type_*A_Rosa_~QED~Type_*A_Rosa_ |
0 :Type_Dominus_Rosa_[Deuxième
déclinaison_Rosa_~Terminaison de_Rosa_en_US_au nominatif
singulier_~/_~]|Type_Puer_Rosa_[Deuxième
déclinaison_Rosa_~Terminaison de_Rosa_en_ER_au nominatif
singulier_~Terminaison de_Rosa_en_ERI_au génitif
singulier_~/_~]|Type_Ager_Rosa_[Deuxième
déclinaison_Rosa_~Terminaison de_Rosa_en_ER_au nominatif
singulier_~Terminaison de_Rosa_en_RI_au génitif
singulier_~/_~]|Type_Templum_Rosa_[Deuxième
déclinaison_Rosa_~Neutre_Rosa_~/_~]|Type_Consul_Rosa_[Troisième
déclinaison_Rosa_~Imparisyllabique_Rosa_~Non_Neutre_Rosa_~/_~]|Type_Flumen_Rosa_[Troisième
déclinaison_Rosa_~Imparisyllabique_Rosa_~Non_Terminaison
de_Rosa_en AR ou
AL_~Neutre_Rosa_~/_~]|Type_Civis_Rosa_[Troisième
déclinaison_Rosa_~Parisyllabique_Rosa_~Masculin_Rosa_~/_~]|Type_Civis_Rosa_[Troisième
déclinaison_Rosa_~Parisyllabique_Rosa_~Féminin_Rosa_~/_~]|Type_Civis_Rosa_[Troisième
déclinaison_Rosa_~Faux
imparisyllabique_Rosa_~/_~]|Type_Mare_Rosa_[Troisième
déclinaison_Rosa_~Parisyllabique_Rosa_~Neutre_Rosa_~/_~]|Type_Mare_Rosa_[Troisième
déclinaison_Rosa_~Imparisyllabique_Rosa_~Terminaison
de_Rosa_en AR ou
AL_~Neutre_Rosa_~/_~]|Type_Exercitus_Rosa_[Quatrième
déclinaison_Rosa_~Non_Neutre_Rosa_~/_~]|Type_Cornu_Rosa_[Quatrième
déclinaison_Rosa_~Neutre_Rosa_~/_~]|Type_Res_Rosa_[Cinquième
déclinaison_Rosa_~/_~]| |
En haut de chaque case de la colonne de droite le numéro indique le niveau de calcul du moteur. Ici il y a trois niveaux.
Le premier niveau (en bas) est celui de la question initiale. Elle est
indiquée dans la colonne de gauche qui contient les conditions
à vérifier. Ici la question est
répétée encadrant l'expression QED : Quid Erat
Demonstrandum (ce qu'il fallait démontrer). Au cours de son
calcul le moteur va placer en début de liste les conditions
nouvelles a vérifier en fonctions des règles qu'il
applique. Quand il a vérifié une condition il l'efface.
S'il arrive à tout effacer cela veut dire qu'il a tout
prouvé, il s'en rend compte quand il retouve le QED. Il ne lui
reste plus qu'à publier comme solution la question (qui
maintenant est une réponse) qui reste seule en fin de liste.
Ce mode de fonctionnement, guidé par les hypothèses, et
trouvant la solution par effacements successifs s'appelle le
chaînage arrière. En logique traditionnelle (bien avant
que les ordinateurs n'existassent) cela s'appelait le "modus tollens"
(la façon de faire en enlevant). Certains moteurs peuvent aussi
fonctionner en chaînage avant ou "modus ponens" (la façon
de faire en posant).
Au cours de son calcul le moteur va ajouter des
Dans la colonne de gauche apparaît ce que le système essaye de prouver, c'est à dire la liste des buts.
An niveau zéro dans la colonne de gauche on trouve la question
et dans la colonne de droite tous les faits et règles du
même prédicat que la question. Ici il n'y a que des
règles. On remarque qu'elles ont toutes été
réécrites avec le mot "Rosa" à la place des
variables.. La première règle "Type_Rosa_Rosa"
manque à l'appel car elle est déjà en cours
d'évaluation dans la colonne de gauche du niveau
supérieur.
Au niveau 1 il y avait originellement en colonne de droite une
règle "Première déclinaison" disponible pour
calculer la règle "Type ...", mais au point où nous en
sommes elle est déjà partie en colonne de gauche du
niveau supérieur pour évaluation.
En colonne de gauche au niveau supérieur le prédicat
"Terminaison de" ne dispose d'aucun fait ni d'aucune règle pour
le calculer. Le système va donc poser à l'utilisateur la
question "Terminaison de Rosa en AE au génitif ?".
Muni de son dictionnaire l'utilisateur répondra "VRAI".
La proposition "Terminaison de Rosa en AE au génitif" sera donc effacée puisqu'elle est vraie.
On tombera alors sur "Affiche ....". On a vu plus haut que
"Affiche" était une action et ne provoquait jamais
d'échec. L'affichage de "Rosa appartient à la
première Déclinaison" aura donc lieu, puis "Affiche" sera
également effacé.
On tombera alors sur "Première déclinaison Rosa" qui
maintenant est prouvé. (Le signe @n indique qu'il s'agit
d'une tête de règle ou hypothèse). Puisqu'il sera
prouve on l'effacera.
On tombe alors sur le "/" ou coupe-choix. Le système sait qu'il
ne doit plus désormais chercher de nouvelles règles.
On tombera ensuite sur "Type_Rosa_Rosa" qui sera effacé de la
même manière (On trouve à nouveau le signe @ qui
indique qu'il s'agit d'une tête de règle).
On tombera alors sur "QED" qui indique que c'était là la
question posée. Elle reste toute seule en fin de liste, il ne
reste plus qu'à afficher "Une solution est: Type_Rosa_Rosa" (On
l'aurait deviné mais avec "ancilla" ça marcherait aussi
;-) ).
Que ce serait-il passé si ?
S'il n'y avait pas eu de coupe-choix ? On aurait donné la
réponse Type_Rosa_Rosa et comme aux niveaux 2 et 1 il ne reste
plus de règle disponibles ont serait revenu au niveau 0 pour
activer la règle suivante "Type_Dominus_Rosa". Ce qui bien
sûr, comme nous connaissons le Latin est stupide c'est la raison
pour laquelle nous avons mis un coupe-choix.
Si on avait cherché "Type_*A_Legio", on aurait répondu "FAUX" à la question "Terminaison de Legio en AE au génitif".
Comme il ne restait aucune règle disponible dans la colonne de
droite aux niveaux 2 et 1, on serait retombé au niveau
zéro en activant la règle suivante "Type_Dominus_Legio".
Et ainsi de suite...