Prémices d'un système expert
publication: 10 novembre 2024 / mis à jour 10 novembre 2024
Au début était FORTH, un langage impératif, mais souple, car extensible.
Si on veut créer un système expert, commençons par voir les moyens dont dispose FORTH pour traiter la logique d'un système expert.
Notion de prédicat
Qu'est-ce qu'un prédicat dans un système expert?
Un prédicat, dans le contexte d'un système expert, est une propriété ou une relation qui peut être vraie ou fausse pour un ensemble d'objets ou d'entités.
Prenons un système expert médical pour diagnostiquer des maladies. Un prédicat pourrait être:
0 value fievre
Ici, la valeur fievre
est une valeur booléenne. Telle qu'elle est définie, il n'y a pas de fièvre, donc le
patient n'est pas malade.
On peut tester la température du patient:
: fievre? ( r:temperature -- ) 37.8E F> if -1 to fievre else 0 to fievre then ; 37.4E fievre? fievre . \ affiche 0 38.5E fievre? fievre . \ affiche -1
Rajoutons deux prédicats:
-1 value malDeTete 0 value grippe : grippe? ( -- ) fievre malDeTete and if -1 to grippe else 0 to grippe then ; grippe? grippe . \ display -1
Ici, dans le mot grippe?
nous effectuons un test logique binaire simple sur deux prédicats,
fievre
et malDeTete
.
Le souci, avec le langage FORTH, c'est qu'on ne peut agir que sur des prédicats préalablement déclarés.
Mais un vrai système expert se retrouve rapidement avec des dizaines de prédicats, certains induits par le résultat de tests sur d'autres prédicats.
Par exemple, on aimerai tester malAuVentre
même si cette valeur n'existe pas encore.
Test ou création de mots
En langage FORTH, si on définit deux fois un même mot, on se retrouve avec deux versions de ce même mot dans le dictionnaire:
0 value malAuVentre 0 value malAuVentre
Notre idée serait de pouvoir créer une seule fois malAuVentre
:
0 fact: malAuVentre -1 fact: malAuVentre
Analyse du flux d'entrée FORTH
A chaque fois que vous tapez un mot FORTH, l'interpréteur commence par isoler ce mot dans le flux d'entrée:
: test
bl parse ;
test myTest \ on stack: 134428837 6
Les données déposées sur la pile correspondent à la chaîne texte isolée dans le flux d'entrée. Modifions test
pour afficher cette chaîne:
: test bl parse type ; test myTest \ display: myTest test otherTest \ display: otheTest
Le prochain mot FORTH qui nous intéresse est find
. Ce mot cherche un mot dans le dictionnaire depuis
une chaîne de caractères:
s" dup" find \ push 140701567247160 on stack s" drup" find \ push 0 on stack
Le souci, avec la séquence bl parse
, c'est que le pointeur d'interprétation >in
est altéré.
Si on enregistre cette position avant analyse de la chaîne, on peut restaurer la valeur de >in
si nécessaire:
: test ( comp: --) >in @ >r bl parse find 0= if r> >in ! create exit then r> drop ; test drop \ don't create DROP test malAuVentre \ create new word malAuVentre test malAuVentre \ don't re-create malAuVentre
Ici, le mot test
trouve le mot drop
et ne le recrée pas dans le dictionnaire.
Ensuite, il ne trouve pas le mot malAuVentre
, il le crée dans le dictionnaire.
Enfin, test
trouve malAuVentre
précédemment défini. Il ne le recrée pas.
Ce mécanisme de test/création sera au coeur du système expert.
Legal: site web personnel sans commerce / personal site without seling