Les premiers faits de notre système expert
publication: 11 novembre 2024 / mis à jour 11 novembre 2024
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
:
- soient préalablement déclarés comme faits valides
- ou instanciés par une autre règle
- ou instanciés s'ils n'existent pas
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:
facts
est le vocabulaire destiné à recevoir tous les faits déclarés ou instanciés par l'exécution d'une règle;rules
est le vocabulaire dans lequel seron déclarés les règles;flog
est le vocabulaire das lequel on développera la mécanique propre à notre système expert
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