Autres articles / Other articles

Prémices d'un système expert

publication: 10 novembre 2024 / mis à jour 10 novembre 2024

Read this page in english

 


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