Formations en Informatique de Lille – 2005/2006
Syst` emes d’Inf´ erences
septembre 2005
Syst` emes experts JESS 1
Introduction
Jess est un programme permettant la manipulation de syst`emes experts d’ordre 1. Il est ´ecrit en java, et poss`ede de nombreuses connexions avec ce langage (utilisation d’objets java dans les r`egles dans un sens, utilisation de syst`emes experts dans des programmes java dans l’autre sens). Il utilise l’algorithme Rete.
2
Le logiciel
Le programme, sous forme de fichier jar ex´ecutable, peut se charger sur http://herzberg.ca. sandia.gov/jess/ La documentation en ligne se trouve a` l’adresse http://herzberg.ca.sandia.gov/jess/docs/ 70/, ou encore sur http://herzberg.ca.sandia.gov/jess/manual.pdf D´ecompressez le fichier, puis lancez le programme avec : java -classpath jess.jar jess.Main ou java -classpath jess.jar jess.Main nom de fichier.clp
3
Les commandes
La syntaxe des commandes a` l’int´erieur de Jess suit la syntaxe des langages fonctionnels (scheme, vous vous rappelez ?) : toutes les commandes sont des fonctions entre parenth`eses. Quelques commandes de base : – (batch ”nom de fichier”) : charge une base. Les fichiers se terminent g´en´eralement par le suffixe clp, d’apr`es CLIP, le pr´edecesseur de Jess – (exit) : pour sortir du programme. – (reset) : pour pr´eparer les d´eductions (lecture des faits, fixer un fait initial qui permettra de lancer la machine, rep´erage des r`egles d´eclenchables, oubli des faits appris). – (run) : pour lancer la d´eduction. – (facts) : pour voir la liste des faits (et leur num´ero) – (watch all) : pour obtenir un maximum de verbosit´e lors des d´eductions (faits d´eduits, r`egles applicables, r`egles appliqu´ees . . .Les versions (watch rules), (watch compilations), (watch activations) et (watch facts) sont un peu moins loquaces.
4 4.1 4.1.1
Ecrire des bases Basiques Composants de base
atomes sont des noms d’identificateurs nombres syntaxe standard (entiers, double . . .)
Formations en Informatique de Lille – 2005/2006 : Syst`emes d’Inf´erences
2 chaˆınes syntaxe standard
commentaires : pr´ec´ed´es d’un point virgule, courent jusqu’` a la fin de la ligne. 4.1.2
Fonctions
Une fonction est une liste, dont le premier ´el´ement est le nom de la fonction, les arguments suivants en sont les param`etres : (+ x 3) : Jess ´evalue et retourne la valeur calcul´ee. Notez la syntaxe un peu bizarre de l’impression : printout t ‘‘texte ‘‘ 42 ‘‘ texte’’ crlf, le t au d´epart et le crlf a` la fin ´etant n´ecessaire. Cette commande imprime un message sur l’´ecran. 4.1.3
Variables
Pour utiliser une variable dans une fonction, il faut utiliser un identificateur pr´ec´ed´e d’un point d’interrogation. Pour donner une valeur a` une variable, on utilise la fonction bind : Jess> (bind ?x 123) 123 Jess>?x 123 4.1.4
D´ efinir des fonctions
la syntaxe de la d´efinition de fonctions est la suivante (deffunction [<doc-comment>] (<parameter>*) <expr>* []) Comme par exemple, dans : Jess> (deffunction max (?a ?b) (if (> ?a ?b) then (return ?a) else (return ?b))) On peut ensuite l’appeler partout dans le programme : (max 3 5)
4.2 4.2.1
La base de connaissances Les faits simples
Les faits sont des listes caract´eris´ees par leur premier ´el´ement : (habile singe) (proche singe sol) (poids chaise 25) On utilise la fonction assert pour ajouter un ou des faits a` la base : (assert (sur singe sol) (proche banane chaise)) Sym´etriquement, la fonction retract permet d’enlever un fait de la base : retract (fact-id 1)) Retire de la base le fait num´ero 1 (on peut connaˆıtre le num´ero d’un fait que l’on veut retirer de la base)
Syst`emes experts JESS 4.2.2
3
Les faits structur´ es
On peut d´efinir des faits contenant plusieurs champs. Il faut alors pr´ealablement d´efinir la structure dans un template : deftemplate <deftemplate-name> [extends ] [<doc-comment>] [(slot <slot-name> [(default | default-dynamic )] [(type ))]*) Comme dans : (deftemplate automobile "A specific car." (slot make) (slot model) (slot year (type INTEGER)) (slot color (default white))) Jess recommande de ne pas utiliser la d´efinition de type. Les slots sont les noms des diff´erents champs. On peut ajouter des faits structur´es a` la base avec assert : (assert (automobile (make Chrysler) (model LeBaron) (year 1997))) Cette voiture est blanche par d´efaut. On peut modifier la valeur d’un champ d’un fait structur´e existant avec la fonction modify : Jess> (assert (automobile (make Chrysler) (model LeBaron) (year 1997))) Jess> (modify (fact-id 0) (make Ford)) (Possible parce que l’on sait que le fait a le num´ero 0 : voir plus loin le cas g´en´eral) 4.2.3
D´ efinir tous les faits initiaux
Il serait laborieux de construire les faits a` partir de la fonction assert. La fonction deffacts permet de d´efinir tous les faits initiaux en une fois : (deffacts my-facts "La base de faits" (habile singe) (sur singe sol) ............. ............. (inerte chaise) (proximite (un banane) (deux sol) (verite FALSE)) ) Ces faits seront introduits dans la base a` chaque commande reset.
Formations en Informatique de Lille – 2005/2006 : Syst`emes d’Inf´erences
4 4.2.4
Les r` egles
Une r`egle est d´efinie par la fonction defrule, qui ob´eit a` la syntaxe suivante : (defrule nom ‘‘commentaire’’ premisse1 premisse2 ........ premisseN => action1 action2 actionP La r`egle se d´eclenchera si chaque pr´emisse peut ˆetre unifi´ee avec un fait, ou si une condition est v´erifi´ee, par exemple : (defrule r3 (deplacer ?X ?Y ?Z) (proximite (un ?Z) (deux sol) (verite FALSE)) => (assert (sous ?Y ?Z)) ) se d´eclenchera si X peut d´eplacer Y vers Z, et si Z n’est pas proche du sol. dans ce cas, on en d´eduira que Y est sous Z (fait rajout´e a` la base). Notez l’utilisation de variables (commen¸cant par des points d’interrogation), qui permet de relier entre elles les deux pr´emisses par une condition. Un autre exemple : (defrule r4 (explore ?x ?y FALSE) (test (courant_d_air ?x ?y)) => (printout t "Un courant d’air en " ?x " "?y crlf) (assert (explore ?x ?y TRUE) (vent ?x ?y)) ) Ici, la r`egle se d´eclenchera si la premi`ere pr´emisse peut s’unifier avec un fait connu, par contre, la deuxi`eme condition est un test, qui permettra d’activer la r`egle si la fonction courant d air retourne le bool´een TRUE. Avant d’ˆetre utilis´ees dans la fonction test, les variables ?x et ?y doivent avoir ´et´e unifi´ees avec des faits, il est donc important que les deux “pr´emisses” soient d´efinies dans cet ordre ! On peut fixer des conditions sur les variables apparaissant en partie gauche d’une r`egle (on en a d´ej` a vue une : un mˆeme nom de variable repr´esente le mˆeme objet) : – La diff´erence : (sous ?Y ?Z&~?X) : la pr´emisse sera v´erifi´ee quand ?Z sera diff´erent de ?X – Le r´esultat (bool´een) d’un appel de fonction : (sous ?Y ?Z&:(> ?Z 10)) se d´eclenchera si ?Z est sup´erieur a` 10 (` a condition que le deuxi`eme argument de sous soit un nombre !) Voici un exemple plus ou moins explicite regroupant plusieurs possibilit´es : Jess> (defrule example-3 (not-b-and-c ?n1&~b ?n2&~c) (different ?d1 ?d2&~?d1) (same ?s ?s) (more-than-one-hundred ?m&:(> ?m 100)) (red-or-blue red|blue) => (printout t "Found what I wanted!" crlf))
Syst`emes experts JESS
5
On peut utiliser les connecteurs logiques pour combiner les pr´emisses : Jess> (defrule or-example-1 (or (a) (b) (c)) =>) Jess>(defrule or-example-2a (and (or (a) (b)) (c)) =>) Jess> (defrule example-7 (person ?x) (not (married ?x)) => (printout t ?x " is not married!" crlf))
La deuxi`eme d´efinition de r`egle a peu d’int´erˆet (on suppose par d´efaut que l’on fait la conjonction des pr´emisses), mais permet des combinaisons quelconques d’op´erateurs bool´eens. Remarquez dans la troisi`eme r`egle que la variable ?x a besoin d’ˆetre d’abord substitu´ee dans person avant de pouvoir ˆetre utilis´ee dans not. test, d´ej` a rencontr´e, permet de prendre des d´ecisions en fonction de la valeur d’une fonction : Jess> (defrule rule_1 (foo ?X) (test (> ?X 3)) =>) D´eclenchera la r`egle si ?X v´erifie foo et si ?X est plus grand que 3.
5
Utiliser Jess
Pour un probl`eme donn´e, il vous faudra : – Coder le probl`eme. – D´efinir les fonctions auxiliaires, les structures ´eventuelles de faits. – D´efinir les faits initiaux. – D´efinir les r`egles. Ensuite, vous pouvez tester votre syst`eme dans Jess : – lancer Jess – Charger votre fichier : (batch "fichier") – Demander qu’il vous affiche ce qu’il fait : (watch all) – Pr´eparer le syst`eme : (reset) – Lancer : (run) Question 5.1 : Ecrivez un ensemble de r`egles inspir´e du monde du Wumpus : on se place dans un monde sans danger (un damier 4x4). Le chasseur est en (1,1), il doit parcourir toutes les cases (version 2 : ne pas repasser par la mˆeme case . . .) Question 5.2 : Le monde devient un peu plus hostile : il y a un puits (` a une position que vous fixez, mais le chasseur ne la connaˆıt pas) : une fonction courantdair lui permet de savoir si une case donn´ee est parcourue ou non par un courant d’air. Ecrivez un ensemble de r`egles qui permet
Formations en Informatique de Lille – 2005/2006 : Syst`emes d’Inf´erences
6
au chasseur de se d´eplacer sur les cases sans danger. Question 5.3 : Compl´etez l’ensemble de r`egles pr´ec´edent pour que le chasseur puisse, au moins approximativement, deviner la position des puits.
Plus dur Question 5.4 : On change d’animal : codez le probl`eme du singe et des bananes !
1. Si on est habile et proche d’un objet, alors on peut l’atteindre. 2. Si on est sur un objet P1 , qui lui-mˆeme se trouve sous un objet P2 , alors on est proche de P2 3. D´eplacer un objet vers un objet qui est loin du sol, c’est le placer dessous. 4. Si X peut bouger, et qu’il est proche d’un objet, alors il peut monter dessus. 5. Si X est anim´e et est proche d’un objet P1 , pos´e sur le sol, alors X peut d´eplacer P1 vers n’importe quel objet P2 6. SI X est anim´e, il peut aller vers tout objet pos´e sur le sol. 7. Si on se dirige vers un objet, alors on devient proche de lui (et ´eloign´e de tout objet dont on ´etait proche . . .) 8. Si X est anim´e, et juch´e sur un objet P , il peut en descendre (et devient alors proche de P ) 9. Le singe est sur le sol. 10. Les bananes sont accroch´ees au plafond. 11. il y a une chaise (pos´ee sur le sol). 12. Lorsque le singe est sur la chaise, il peut attraper les bananes. Fig. 1 – Le probl`eme du singe
Question 5.5 : Comment pourrait-on programmer le Tic-Tac-Toe ?