Autres articles / Other articles

Les premiers faits de notre système expert

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

Read this page in english

 


Dans un système expert, il y a les faits et les règles. Les faits sont les postulats de départ déclarés comme vrais. Ici, un simple circuit logique:

Si je veux décrire en langage naturel le comportement de la première porte logique, je pourrais énoncer:

  si IN1  et IN2  alors OUT3

Ici, nous avons trois prédicats (ou faits): IN1, IN2 et OUT3.

Pour que notre règle fonctionne, il faut que nos prédicats IN1 et IN2:

Nous allons déjà étudier le cas des faits préalablement déclarés valides.

Déclaration de faits valides

L'idée est de déclarer des faits valides en utilisant un mot FAIT: de cette manière:

FAIT: IN1 
FAIT: IN2 

On pourrait simplement utiliser value. Mais, rappelez-vous, nous cherchons le moyen d'éviter la création répétitive d'un même mot dans le dictionnaire. Et pour plus d'élégance, il serait souhaitable d'isoler les faits dans un vocabulaire spécifique:

vocabulary facts 
facts definitions 
-1 value IN1 
-1 value IN2 

A ce stade, on pourrait définir FAIT: ainsi:

: FAIT: 
    -1 value ; 
vocabulary facts 
facts definitions 
FAIT: IN1 
FAIT: IN2 

Mais cette version ne dispose d'aucune sécurité si on recrée un même fait:

FAIT: IN1 
FAIT: IN2 
FAIT: IN1 

Dans cette situation, on se retrouve avec les mots IN1 IN2 IN1.

Création de faits uniques

Pour éviter qu'un fait soit déclaré deux fois, on va étoffer le mot FAIT:.

\ create a new fact in facts vocabulary 
: FACT:  ( comp: --  | exec: -- fl ) 
    >in @ >r 
    bl parse find 0= 
    if 
        r> >in ! 
        -1 value 
    else 
        r> drop 
    then 
  ; 
: FAIT:    \  FACT: in french 
    FACT:  ; 

A ce stade, si on exécute à nouveau cette séquence:

FAIT: IN1 
FAIT: IN2 
FAIT: IN1 

Le fait IN1 ne sera créé qu'une seule fois!

Gestion du vocabulaire facts

Un système expert se doit d'être bien organisé. Pour celà, on définit trois vocabulaires distincts:

vocabulary facts 
vocabulary rules 
 
vocabulary flog 
    flog definitions 

Rôle de ces vocabulaires:

A l'exécution de FAITS:, les faits doivent être déclarés exclusivement dans le vocabulaire facts. C'est le rôle du mot in-facts qui sélectionnera ce vocabulaire facts:

\ select vocs: facts flog forth, compile in facts vocabulary 
: in-facts ( -- ) 
    forth also flog also 
    facts definitions 
  ; 
 
: in-flog ( -- ) 
    only forth flog 
  ; 

Le mot in-facts force la sélection du vocabulaire facts et la définition des faits dans ce vocabulaire.

Le mot in-flog désélectionne les autres vocabulaire et restreint la recherche aux vocabulaires forth et flog.

La sélection et désélection de ces vocabulaires est susceptible d'évoluer en fonction des contraintes de développement de notre système expert.

La nouvelle version de FAIT: gère maintenant le contenu du vocabulaire facts:

\ create a new fact in facts vocabulary 
: FACT:  ( comp: --  ) 
    in-facts            \ compile fact in facts vocabulary 
    >in @ >r 
    bl parse find 0= 
    if 
        r> >in ! 
        -1 value 
    else 
        r> drop 
    then 
    in-flog 
  ; 
: FAIT:                 \ FACT: in french 
    FACT:  ; 

Test de cette dernière version de FAIT::

FAIT: IN1 
FAIT: IN2 
FAIT: IN1 
facts vlist    \ display: 
IN2 IN1 

Ici, un autre test avec un prédicat pré-défini autrelment que par FAIT::

facts definitions 
0 value IN1 
flog 
FAIT: IN2 
FAIT: IN1 
facts vlist    \ affiche: 
IN2 IN1 

Dans ce second exemple, le fait IN1 n'a pas été recréé. Or, si un fait est déclaré et pré-existant, il faut modifier son contenu et le rendre vrai.

Le mot set-fact-true rend vrai un fait déjà déclaré, ce quelque soit sa valeur initiale:

\ test if next word is in facts vocabulary 
: find-fact  (  -- xt|0 ) 
    facts 
    bl parse find 
    flog 
  ; 
 
\ set fact to TRUE 
: set-fact-true  ( xt -- ) 
    -1 swap >body ! 
  ; 

On réécrit encore une fois FACT::

\ create a new fact in facts vocabulary 
: FACT:  ( comp: --  | exec: -- fl ) 
    >in @ { toIn } 
    find-fact 
    { factXt }          \ store copy of xt in local variable factXt 
    factXt 0= if        \ create a new value set TRUE 
        toIn >in !  
        only facts definitions 
        -1 value 
        in-flog 
    else                \ set fact TRUE 
        factXt set-fact-true  
    then 
    in-flog 
  ; 

Retrouvez le code source de ce projet de système expert ici:
  https://github.com/MPETREMANN11/eForth-Windows/tree/main/flog

Le code du projet FLOG est susceptible d'évoluer indépendamment du contenu de cet article.

Test de cette dernière version de FAIT::

facts definitions 
flog 
0 value IN1 
IN1 .           \ affiche 0 
FAIT: IN2 
FAIT: IN1 
facts 
IN1 .           \ affiche -1 
IN2 .           \ affiche 0 

Fin de cet article. Nous verrons dans les prochains chapitre comment gérer la syntaxe de notre système expert.


Legal: site web personnel sans commerce / personal site without seling