You are on page 1of 6

Formations en Informatique de Lille – 2005/2006

Syst`mes d’Inf´rences e e
septembre 2005

1

Introduction

Jess est un programme permettant la manipulation de syst`mes experts d’ordre 1. Il est ´crit e e en java, et poss`de de nombreuses connexions avec ce langage (utilisation d’objets java dans les e r`gles dans un sens, utilisation de syst`mes experts dans des programmes java dans l’autre sens). e e Il utilise l’algorithme Rete.

2

Le logiciel

Le programme, sous forme de fichier jar ex´cutable, peut se charger sur http://herzberg.ca. e 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´compressez le fichier, puis lancez le programme avec : java -classpath jess.jar jess.Main e ou java -classpath jess.jar jess.Main nom de fichier.clp

3

Les commandes

La syntaxe des commandes a l’int´rieur de Jess suit la syntaxe des langages fonctionnels (scheme, ` e vous vous rappelez ?) : toutes les commandes sont des fonctions entre parenth`ses. e Quelques commandes de base : e e – (batch ”nom de fichier”) : charge une base. Les fichiers se terminent g´n´ralement par le suffixe clp, d’apr`s CLIP, le pr´decesseur de Jess e e – (exit) : pour sortir du programme. – (reset) : pour pr´parer les d´ductions (lecture des faits, fixer un fait initial qui permettra de e e lancer la machine, rep´rage des r`gles d´clenchables, oubli des faits appris). e e e – (run) : pour lancer la d´duction. e – (facts) : pour voir la liste des faits (et leur num´ro) e – (watch all) : pour obtenir un maximum de verbosit´ lors des d´ductions (faits d´duits, r`gles e e e e applicables, r`gles appliqu´es . . .Les versions (watch rules), (watch compilations), (watch actie e vations) 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 . . .)

¦ §¥

£ ¡ ¤¢ 

Syst`mes experts JESS e

2 chaˆ ınes syntaxe standard

Formations en Informatique de Lille – 2005/2006 : Syst`mes d’Inf´rences e e

commentaires : pr´c´d´s d’un point virgule, courent jusqu’` la fin de la ligne. e e e a 4.1.2 Fonctions

Une fonction est une liste, dont le premier ´l´ment est le nom de la fonction, les arguments suivants ee en sont les param`tres : (+ x 3) : Jess ´value et retourne la valeur calcul´e. e e e Notez la syntaxe un peu bizarre de l’impression : printout t ‘‘texte ‘‘ 42 ‘‘ texte’’ crlf, le t au d´part et le crlf a la fin ´tant n´cessaire. Cette commande imprime un message sur l’´cran. e ` e e e 4.1.3 Variables

Pour utiliser une variable dans une fonction, il faut utiliser un identificateur pr´c´d´ d’un point e e e 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´finir des fonctions e

la syntaxe de la d´finition de fonctions est la suivante e (deffunction <function-name> [<doc-comment>] (<parameter>*) <expr>* [<return-specifier>]) 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´ris´es par leur premier ´l´ment : e e ee (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´triquement, la fonction retract permet d’enlever un fait de la base : e retract (fact-id 1)) Retire de la base le fait num´ro 1 (on peut connaˆ le num´ro d’un fait que l’on veut retirer de e ıtre e la base)

Syst`mes experts JESS e 4.2.2 Les faits structur´s e

3

On peut d´finir des faits contenant plusieurs champs. Il faut alors pr´alablement d´finir la structure e e e dans un template : deftemplate <deftemplate-name> [extends <classname>] [<doc-comment>] [(slot <slot-name> [(default | default-dynamic <value>)] [(type <typespec>))]*) 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´finition de type. Les slots sont les noms des diff´rents e e champs. On peut ajouter des faits structur´s a la base avec assert : e ` (assert (automobile (make Chrysler) (model LeBaron) (year 1997))) Cette voiture est blanche par d´faut. e On peut modifier la valeur d’un champ d’un fait structur´ existant avec la fonction modify : e Jess> (assert (automobile (make Chrysler) (model LeBaron) (year 1997))) <Fact-0> Jess> (modify (fact-id 0) (make Ford)) (Possible parce que l’on sait que le fait a le num´ro 0 : voir plus loin le cas g´n´ral) e e e 4.2.3 D´finir tous les faits initiaux e

Il serait laborieux de construire les faits a partir de la fonction assert. La fonction deffacts ` permet de d´finir tous les faits initiaux en une fois : e (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. `

4 4.2.4 Les r`gles e

Formations en Informatique de Lille – 2005/2006 : Syst`mes d’Inf´rences e e

Une r`gle est d´finie par la fonction defrule, qui ob´it a la syntaxe suivante : e e e ` (defrule nom ‘‘commentaire’’ premisse1 premisse2 ........ premisseN => action1 action2 actionP La r`gle se d´clenchera si chaque pr´misse peut ˆtre unifi´e avec un fait, ou si une condition est e e e e e v´rifi´e, par exemple : e e (defrule r3 (deplacer ?X ?Y ?Z) (proximite (un ?Z) (deux sol) (verite FALSE)) => (assert (sous ?Y ?Z)) ) se d´clenchera si X peut d´placer Y vers Z, et si Z n’est pas proche du sol. dans ce cas, on en e e d´duira que Y est sous Z (fait rajout´ a la base). e e` Notez l’utilisation de variables (commen¸ant par des points d’interrogation), qui permet de relier c entre elles les deux pr´misses par une condition. e 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`gle se d´clenchera si la premi`re pr´misse peut s’unifier avec un fait connu, par contre, e e e e la deuxi`me condition est un test, qui permettra d’activer la r`gle si la fonction courant d air e e retourne le bool´en TRUE. e Avant d’ˆtre utilis´es dans la fonction test, les variables ?x et ?y doivent avoir ´t´ unifi´es avec e e ee e des faits, il est donc important que les deux “pr´misses” soient d´finies dans cet ordre ! e e On peut fixer des conditions sur les variables apparaissant en partie gauche d’une r`gle (on en a e d´j` vue une : un mˆme nom de variable repr´sente le mˆme objet) : ea e e e – La diff´rence : (sous ?Y ?Z&~?X) : la pr´misse sera v´rifi´e quand ?Z sera diff´rent de ?X e e e e e – Le r´sultat (bool´en) d’un appel de fonction : (sous ?Y ?Z&:(> ?Z 10)) se d´clenchera si ?Z e e e est sup´rieur a 10 (` condition que le deuxi`me argument de sous soit un nombre !) e ` a e Voici un exemple plus ou moins explicite regroupant plusieurs possibilit´s : e 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`mes experts JESS e On peut utiliser les connecteurs logiques pour combiner les pr´misses : e 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))

5

La deuxi`me d´finition de r`gle a peu d’int´rˆt (on suppose par d´faut que l’on fait la conjonction e e e ee e des pr´misses), mais permet des combinaisons quelconques d’op´rateurs bool´ens. e e e Remarquez dans la troisi`me r`gle que la variable ?x a besoin d’ˆtre d’abord substitu´e dans e e e e person avant de pouvoir ˆtre utilis´e dans not. e e test, d´j` rencontr´, permet de prendre des d´cisions en fonction de la valeur d’une fonction : ea e e Jess> (defrule rule_1 (foo ?X) (test (> ?X 3)) =>) D´clenchera la r`gle si ?X v´rifie foo et si ?X est plus grand que 3. e e e

5

Utiliser Jess

Pour un probl`me donn´, il vous faudra : e e – Coder le probl`me. e – D´finir les fonctions auxiliaires, les structures ´ventuelles de faits. e e – D´finir les faits initiaux. e – D´finir les r`gles. e e Ensuite, vous pouvez tester votre syst`me dans Jess : e – lancer Jess – Charger votre fichier : (batch "fichier") – Demander qu’il vous affiche ce qu’il fait : (watch all) – Pr´parer le syst`me : (reset) e e – Lancer : (run) Question 5.1 : Ecrivez un ensemble de r`gles inspir´ du monde du Wumpus : on se place dans e e 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ˆme case . . .) e Question 5.2 : Le monde devient un peu plus hostile : il y a un puits (` une position que vous a fixez, mais le chasseur ne la connaˆ pas) : une fonction courantdair lui permet de savoir si une ıt case donn´e est parcourue ou non par un courant d’air. Ecrivez un ensemble de r`gles qui permet e e

6

Formations en Informatique de Lille – 2005/2006 : Syst`mes d’Inf´rences e e

au chasseur de se d´placer sur les cases sans danger. e Question 5.3 : Compl´tez l’ensemble de r`gles pr´c´dent pour que le chasseur puisse, au moins e e e e approximativement, deviner la position des puits.

Plus dur
Question 5.4 : On change d’animal : codez le probl`me du singe et des bananes ! e

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ˆme se trouve sous un objet P2 , alors on est proche de P2 e 3. D´placer un objet vers un objet qui est loin du sol, c’est le placer dessous. e 4. Si X peut bouger, et qu’il est proche d’un objet, alors il peut monter dessus. 5. Si X est anim´ et est proche d’un objet P1 , pos´ sur le sol, alors X peut d´placer P1 vers e e e n’importe quel objet P2 6. SI X est anim´, il peut aller vers tout objet pos´ sur le sol. e e 7. Si on se dirige vers un objet, alors on devient proche de lui (et ´loign´ de tout objet dont on e e ´tait proche . . .) e 8. Si X est anim´, et juch´ sur un objet P , il peut en descendre (et devient alors proche de P ) e e 9. Le singe est sur le sol. 10. Les bananes sont accroch´es au plafond. e 11. il y a une chaise (pos´e sur le sol). e 12. Lorsque le singe est sur la chaise, il peut attraper les bananes. Fig. 1 – Le probl`me du singe e

Question 5.5 : Comment pourrait-on programmer le Tic-Tac-Toe ?