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 "Capitale_Paris_de_*X ?" (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: Capitale_Rome_de_Italie.

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 "Rome" ou bien "de". Ils peuvent être aussi des variables. Les variables commencent par le signe "*". Ex *X, *Ville .

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: Capitale_Paris_de_France puis Capitale_Angleterre_Londres
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.

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. 

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 :
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).

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 Non.
Dans ce cas précis le prédicat arrive donc en deuxième position.

Exemple:
hypothese : Ville de province_*Ville_de_*Pays
condition 1 : Ville_*Ville_de_*Pays
condition 2 : Non_Capitale_*Ville_de_*Pays

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)

Action primitive (ne fait jamais échouer l'évaluation)

Action primitive (ne fait jamais échouer l'évaluation)

Analyse et coloration du code.


En même temps qu'il affiche la base de connaissance, Teleme analyse certains paramètres:

  1. 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.
  2. 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".
  3. 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 t/ Ex: t/Type_*A_Legio
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...