SlideShare una empresa de Scribd logo
1 de 17
ECOLE NATIONALE D’INGENIEURS DE TUNIS




Compte redu système
      expert
       Application à JESS
                Dghaies Marwa
                 3ème Info 2
TP 1 Présentation de Jess

Exercice d’application

Suppose you wanted to write an expert system to determine how a mobile robot should
respond to a traffic light. The rules for the red and green light situations can be written as
follows.

(defrule red-light
(light red)
=>
(printout t "STOP" crlf)
)
(defrule green-light
(light green)
=>
(printout t "GO" crlf)
)

1. For all questions Write a command and describe what you see?
After the rules have been entered into Jess, assert a fact (light red) and run.
        Jess>defrule red-light
             (light red)
        =>
        (printout t "STOP" crlf)
        )
        Jess>(defrule green-light
        (light green)
        =>
        (printout t "GO" crlf)
        )
        Jess>(assert (light red))
        Jess>(run)

2. Watch fact
Jess> (watch facts)
TRUE
Jess> (reset)
==> f-0 (MAIN::initial-fact)
TRUE
Jess> (unwatch facts)
TRUE


3. Retract fact (light red) and run
   Jess> (retract 1)
   Jess> (facts)




                                                  2
4. Assert fact (light green) and run.
Jess>(assert (light green))
Jess> (facts)
Jess>(run)




                                            3
5. Create a Button in the Jess Language who “run” these rules.


Jess> (import java.awt.*)
Jess> (import java.awt.event.*)
Jess> ;; Create the widgets
(defglobal ?*f* = (new Frame "Button Demo"))
Jess> (defglobal ?*b* = (new Button "Hello"))
Jess> ;; Add a listener to the button
(?*b* addActionListener (implement ActionListener using (lambda (?name ?evt)
(run))))
Jess> ;; Assemble and display the GUI
(?*f* add ?*b*)
Jess> (?*f* pack)
Jess> (set ?*f* visible TRUE)
Jess> ;; Add a WINDOW_CLOSING listener
(import java.awt.event.WindowEvent)
(?*f* addWindowListener (implement WindowListener using (lambda (?name ?event)
(if (= (?event getID) (WindowEvent.WINDOW_CLOSING)) then
     (exit)))))




                                              4
TP 2 : Arbre généalogique
1) Comment faut-il modifier la première prémisse de chacune des 4 règles de calcul
d’ancêtre pour sélectionner l’individu à étudier ? Faites une exécution.

(deftemplate individu
(slot nom)
(slot pere)
(slot mere)
(slot a_etudier (default non))

)
((defrule startup

?f<-(initial-fact)
=>
(printout t "Indiquez l'individu dont vous recherchez un ancêtre (ou
tapez fin pour arrêter) : ")
(bind ?x (sym-cat (readline)))
(assert (a_etudier ?x))
  (retract ?f)
)

(defrule a_etudier
(a_etudier ?x)

?f<-(individu (nom ?x)(a_etudier non))
=>
(modify ?f (a_etudier oui))
)

(defrule ancetresinconnus
    (a_etudier ?x)

      (individu (nom ?x)(pere nil)(mere nil))
 =>
     (printout t ?x " n'a pas d'ancêtres connus" crlf)
)
(defrule imprime
   (declare (salience -10))
     (a_etudier ?y)
   (ancetre ?x ?y)
=>

  (printout t ?x " est un ancetre de " ?y crlf)
                                           5
)




2) Ecrire une règle qui permette de redemander un nom à l’utilisateur si jamais celui-ci a
indiqué un nom ne figurant pas dans la famille. Quelle priorité faut-il donner à cette règle
?


(defrule control_choix
(declare (salience 500))
      (a_etudier ?x)
      (not ( individu (nom ?x)))

       =>
       (printout t "Vous devez choisir un nom qui existe!" crlf)

)




3) Ecrire une règle permettant de stopper le moteur d’inférences si l’utilisateur indique «
fin » comme nom d’utilisateur. Quelle priorité faut-il donner à cette règle ?

(defrule control_fin
(declare (salience 700))

                                             6
(a_etudier fin)

      =>
      (exit))




4)  Ecrire une règle qui permette de demander un nouvel individu à l’utilisateur après que
le système ait affiché tous les ancêtres de l’individu précédent. Quelle priorité faut-il
donner à cette règle ?

(defrule selctionner
 (declare (salience -20))

=>
(printout t "Indiquez l'individu dont vous recherchez un ancêtre (ou
tapez fin pour arrêter) : ")
(bind ?x (sym-cat (readline)))
(assert (a_etudier ?x))
(run_boucle)
)
(deffunction run_boucle()
(reset)
(run)
)




Exercice pratique :
(deftemplate droite
      (slot a)
      (slot b)
      (slot c)

)

(deftemplate point
      (slot x)
      (slot y)

)

(defrule startup


=>
(printout t "entrez les coordonnées de votre droite : ")
                                            7
(bind ?x1 (sym-cat   (readline)))
(bind ?y1 (sym-cat   (readline)))
(bind ?z1 (sym-cat   (readline)))
(assert (droite (a   ?x1) (b ?y1) (c ?z1)))




(printout t "entrez les coordonnées du point : ")
(bind ?x2 (sym-cat (readline)))
(bind ?y2(sym-cat (readline)))

(assert (point (x ?x2) (y ?y2)))
)

(defrule calcul_distance

(droite (a ?x1 )(b ?y1) (c ?z1))
(point (x ?x2) (y ?y2))

=>
(calcul a b c x y)

)
(deffunction calcul (?a ?b ?c ?x ?y)

    (bind ?result (/ (+ (+ (* ?a ?x) (* ?b ?y)) c) (+ (* ?a ?a) (* ?b ?b))))

    (return ?result)


)
(reset)
(run)




                                              8
TP 3
Dans ce TP nous allons utiliser la programmation en jess pour crée dans une première
application un jeu très connu qui celui du « tictac » et dans une seconde application nous allons
traiter des calculs mathématiques que nous avons pris l’habitude de traiter couramment en java
ou encore en C++.




         1) Vous essayez d’exécuter le fichier « tictac.clp » avec l’instruction (batch nomfichier)
            Jess> (batch tictac.clp)



         2) Le programme ne s’arrête pas dans le cas où il n’y a pas de gagnant et toutes les cases
            sont remplies. Améliorer le code en ajoutant une règle à priorité réduite traitant ce cas.

(defrule check-notwin-backslash
      (declare (salience 10))

      (case 1 1 ?a)
      (case 1 2 ?b)
      (case 2 2 ?a)
      (case 3 2 ?a)
      (case 2 1 ?b)
      (case 1 3 ?a)
      (case 3 1 ?b)
      (case 2 3 ?b)
      (case 3 3 ?b)
      (test (neq ?a _))
(test (neq ?b _))

                                                  9
=>
         (printout t "Aucun gagneur "          crlf "Fin de la partie..." crlf)
(halt)

)




    3) Ajouter une règle permettant de demander si le joueur veut rejouer ou non.

       (deffunction run_n_time(?rep)

       (while (test (neq ?rep n)) do
       ((reset)
       (run)
       (printout t "Voulez vous rejouez?")
       (bind ?rep (read))
       )
       )
       )




                                          10
TP 4
; soduko.clp
; Fait par Sébastien Gagné
; Pour le cours de LOG625
;
; Utilisation : charger le fichier dans Jess
; Pour jouer son coup, il faut entrer la ligne et la colone avec un espace entre les
deux.
;
; 2008-05-28 : Version initiale

(clear)
; === Faits de base ===
; Les cases
(deffacts cases
      (case 1 1 _)
      (case 1 2 _)
      (case 1 3 _)
      (case 2 1 _)
      (case 2 2 _)
      (case 2 3 _)
      (case 3 1 _)
      (case 3 2 _)
      (case 3 3 _))

; Pour chager de case facilement
(deffacts prochain-joueur
      (next X X)
      )

;=== Règles ===
;Init rule
;Le read ici est pour que les readline suivants fonctionnent
(defrule startup
   (declare (salience 60))
      =>
      (printout t "Voulez vous jouer (O/N) ? " crlf)
      (bind ?x (read))
      (if(= ?x n) then (halt)
      else(while (eq ?x o) do

      (assert (tour X))
      (assert (show-grid))
      (run)
      (printout t "Voulez vous jouer (O/N) ? " crlf)
      (bind ?x (read))
      (reset)
      )
      (halt)
)
)

; Demander le coup du joueur
(defrule do-move
                                        11
(declare (salience 60))
      (tour ?a)
      (not (action ? ? ?))




        =>
        (printout t "Ou voulez-vous mettre votre chiffre ? (ligne colone chiffre)"
crlf)
        (assert (action (explode$ (readline))))
)

; "Effectuer" le tour et changer de joueur
(defrule go-next-player
      ?t <- (tour ?curPlayer)
      (next ?curPlayer ?next)
      ?a <- (action ?l ?c ?y)
      ?case <- (case ?l ?c ?)
      =>
      (retract ?t)
      (retract ?a)
      (retract ?case)

        (assert (case ?l ?c ?y))
        (assert (tour ?next))
        (assert (show-grid))
)

; Afficher la grille actuelle du jeu
(defrule show-grid-to-player
      (declare (salience 100))
      ?fact <- (show-grid)
      (case 1 1 ?a)
      (case 1 2 ?b)
      (case 1 3 ?c)
      (case 2 1 ?d)
      (case 2 2 ?e)
      (case 2 3 ?f)
      (case 3 1 ?g)
      (case 3 2 ?h)
      (case 3 3 ?i)
      =>
      (printout t crlf ?a " " ?b " " ?c crlf)
      (printout t ?d " " ?e " " ?f crlf)
      (printout t ?g " " ?h " " ?i crlf crlf)
      (retract ?fact)
)

;; Vérifier si on a un gagnant
(defrule check-win-cas1
      (declare (salience 50))
      (case 1 1 1)
      (case 1 2 3)
      (case 1 3 2)
      (case 2 1 3)
      (case 2 2 2)
      (case 2 3 1)
      (case 3 1 2)
      (case 3 2 1)
      (case 3 3 3)
      ;(test (neq ?a _))
      =>
      (printout t "Bravo, tu as gagné !" crlf "Fin de la partie..." crlf)
      (halt)
)
                                          12
(defrule check-win-cas2
      (declare (salience 50))
      (case 1 1 2)
      (case 1 2 1)



      (case 1 3 3)
      (case 2 1 1)
      (case 2 2 3)
      (case 2 3 2)
      (case 3 1 3)
      (case 3 2 2)
      (case 3 3 1)
      ;(test (neq ?a _))
      =>
      (printout t "Bravo, tu as gagné !" crlf "Fin de la partie..." crlf)
      (halt)
)




(defrule check-win-cas3
      (declare (salience 50))
      (case 1 1 2)
      (case 1 2 3)
      (case 1 3 1)
      (case 2 1 3)
      (case 2 2 1)
      (case 2 3 2)
      (case 3 1 1)
      (case 3 2 2)
      (case 3 3 3)
      =>
      (printout t "Bravo, tu as gagné !" crlf "Fin de la partie..." crlf)
      (halt)
)
(defrule check-win-cas4
      (declare (salience 50))
      (case 1 1 3)
      (case 1 2 2)
      (case 1 3 1)
      (case 2 1 2)
      (case 2 2 1)
      (case 2 3 3)
      (case 3 1 1)
      (case 3 2 3)
      (case 3 3 2)
      =>
      (printout t "Bravo, tu as gagné !" crlf "Fin de la partie..." crlf)
      (halt)
)
(defrule check-win-cas5
      (declare (salience 50))
      (case 1 1 3)
      (case 1 2 1)
      (case 1 3 2)
      (case 2 1 1)
      (case 2 2 2)
      (case 2 3 3)
      (case 3 1 2)
      (case 3 2 3)
                                        13
(case 3 3 1)
      =>
      (printout t "Bravo, tu as gagné !" crlf "Fin de la partie..." crlf)
      (halt)
)
(defrule check-win-cas6
      (declare (salience 50))
      (case 1 1 1)
      (case 1 2 2)
      (case 1 3 3)
      (case 2 1 2)
      (case 2 2 3)
      (case 2 3 1)
      (case 3 1 3)
      (case 3 2 1)
      (case 3 3 2)
      =>
      (printout t "Bravo, tu as gagné !" crlf "Fin de la partie..." crlf)
      (halt)
)




(defrule check-loose-cas1
      (declare (salience 600))
      ?a <- (action ?l ?c ?n)
      (case ?l ? ?n)
      ?b <- (tour ?x)
      =>
      (printout t "Too Baaaad" crlf)
      (retract ?a)
      (retract ?b)
      (assert (tour ?x))
)

(defrule check-loose-cas2
      (declare (salience 600))
      ?a <- (action ?l ?c ?n)
      (case ? ?c ?n)
      ?b <- (tour ?x)
      =>
      (printout t "Too Baaaad" crlf)
      (retract ?a)
      (retract ?b)
      (assert (tour ?x))
)



; Il faut valider qu'on choisi une case vide
(defrule valider-case-vide
      (declare (salience 500))
      ?a <- (action ?l ?c ?n)
      (case ?l ?c ?x)
      (test (neq ?x _))
      ?b <- (tour ?t)
      =>
      (printout t "Vous devez choisir une case vide !!!" crlf)
                                        14
(retract ?a)
      (retract ?b)
      (assert (tour ?t))
      (assert (show-grid))
)

; Validation pour les faits "action" mal formées
(defrule valider-action-invalide0
      (declare (salience 500))
      ?a <- (action)
      ?b <- (tour ?x)
      =>
      (printout t "Action invalide, vous devez entrer la ligne et la colonne et le
chiffre séparée d'un espace" crlf)
      (retract ?a)
      (retract ?b)
      (assert (tour ?x))
)
(defrule valider-action-invalide1
      (declare (salience 500))
      ?a <- (action ?)
      ?b <- (tour ?x)
      =>
      (printout t "Action invalide, vous devez entrer la ligne et la colonne et le
chiffre séparée d'un espace" crlf)
      (retract ?a)
      (retract ?b)
      (assert (tour ?x))
)



(defrule valider-action-invalide2
      (declare (salience 500))
      ?a <- (action ? ?)
      ?b <- (tour ?x)
      =>
      (printout t "Action invalide, vous devez entrer la ligne et la colonne et le
chiffre séparée d'un espace" crlf)
      (retract ?a)
      (retract ?b)
      (assert (tour ?x))
)


(defrule valider-action-invalide4
      (declare (salience 500))
      ?a <- (action ? ? ? ?)
      ?b <- (tour ?x)
      =>
      (printout t "Action invalide, vous devez entrer la ligne et la colonne et le
chiffre séparée d'un espace" crlf)
      (retract ?a)
      (retract ?b)
      (assert (tour ?x))
)
(defrule valider-action-invalide5
      (declare (salience 500))
      ?a <- (action ? ? ? ? ?)
      ?b <- (tour ?x)
      =>
      (printout t "Action invalide, vous devez entrer la ligne et la colonne et le
chiffre séparée d'un espace" crlf)
      (retract ?a)
      (retract ?b)
      (assert (tour ?x))
                                        15
)

; Valider qu'on choisisse une case qui existe
(defrule valide-case-existe




      (declare (salience 500))
      ?a <- (action ?l ?c ?y)
      (not (case ?l ?c ?))
      ?b <- (tour ?x)
      =>
      (printout t "Vous devez choisir une case qui existe!" crlf)
      (retract ?a)
      (retract ?b)
      (assert (tour ?x))
)


; Démarrer la partie !
(reset)
(run)




                                        16
17

Más contenido relacionado

La actualidad más candente

La actualidad más candente (18)

Johnny-Five : Robotique et IoT en JavaScript
Johnny-Five : Robotique et IoT en JavaScriptJohnny-Five : Robotique et IoT en JavaScript
Johnny-Five : Robotique et IoT en JavaScript
 
Développement informatique : Programmation fonctionnelle, décorateur et génér...
Développement informatique : Programmation fonctionnelle, décorateur et génér...Développement informatique : Programmation fonctionnelle, décorateur et génér...
Développement informatique : Programmation fonctionnelle, décorateur et génér...
 
Développement informatique : Algorithmique I : Récursion et arbre
Développement informatique : Algorithmique I : Récursion et arbreDéveloppement informatique : Algorithmique I : Récursion et arbre
Développement informatique : Algorithmique I : Récursion et arbre
 
Quickie Incanter/Clojure à Devoxx France 2012
Quickie Incanter/Clojure à Devoxx France 2012Quickie Incanter/Clojure à Devoxx France 2012
Quickie Incanter/Clojure à Devoxx France 2012
 
Librairies Java qui changent la vie
Librairies Java qui changent la vieLibrairies Java qui changent la vie
Librairies Java qui changent la vie
 
Sthack 2015 - David Berard & Vincent Fargues - Attack the cache to get some cash
Sthack 2015 - David Berard & Vincent Fargues - Attack the cache to get some cashSthack 2015 - David Berard & Vincent Fargues - Attack the cache to get some cash
Sthack 2015 - David Berard & Vincent Fargues - Attack the cache to get some cash
 
Programmation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulationProgrammation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulation
 
C++ 11/14
C++ 11/14C++ 11/14
C++ 11/14
 
Sthack 2015 - Aris "@aris_ada" Adamantiadis - DUAL_EC_DRBG : Une histoire de ...
Sthack 2015 - Aris "@aris_ada" Adamantiadis - DUAL_EC_DRBG : Une histoire de ...Sthack 2015 - Aris "@aris_ada" Adamantiadis - DUAL_EC_DRBG : Une histoire de ...
Sthack 2015 - Aris "@aris_ada" Adamantiadis - DUAL_EC_DRBG : Une histoire de ...
 
Python avancé : Lecture et écriture de fichiers
Python avancé : Lecture et écriture de fichiersPython avancé : Lecture et écriture de fichiers
Python avancé : Lecture et écriture de fichiers
 
Javascript #4.2 : fonctions for pgm
Javascript #4.2 : fonctions for pgmJavascript #4.2 : fonctions for pgm
Javascript #4.2 : fonctions for pgm
 
Python avancé : Interface graphique et programmation évènementielle
Python avancé : Interface graphique et programmation évènementiellePython avancé : Interface graphique et programmation évènementielle
Python avancé : Interface graphique et programmation évènementielle
 
Développement informatique : Gestion de projet, versioning, debugging, testin...
Développement informatique : Gestion de projet, versioning, debugging, testin...Développement informatique : Gestion de projet, versioning, debugging, testin...
Développement informatique : Gestion de projet, versioning, debugging, testin...
 
Change mind about JS
Change mind about JSChange mind about JS
Change mind about JS
 
Python avancé : Ensemble, dictionnaire et base de données
Python avancé : Ensemble, dictionnaire et base de donnéesPython avancé : Ensemble, dictionnaire et base de données
Python avancé : Ensemble, dictionnaire et base de données
 
Composition, agrégation et immuabilité
Composition, agrégation et immuabilitéComposition, agrégation et immuabilité
Composition, agrégation et immuabilité
 
Python avancé : Classe et objet
Python avancé : Classe et objetPython avancé : Classe et objet
Python avancé : Classe et objet
 
Arbre et algorithme de recherche
Arbre et algorithme de rechercheArbre et algorithme de recherche
Arbre et algorithme de recherche
 

Destacado (9)

Numeros arabigos y su logica
Numeros arabigos y su logicaNumeros arabigos y su logica
Numeros arabigos y su logica
 
Oracion de agradecimiento
Oracion de agradecimientoOracion de agradecimiento
Oracion de agradecimiento
 
Tianmen Mountains Chinadinvora
Tianmen Mountains ChinadinvoraTianmen Mountains Chinadinvora
Tianmen Mountains Chinadinvora
 
Alfred y sus diferencias
Alfred y sus diferenciasAlfred y sus diferencias
Alfred y sus diferencias
 
Hong Qiao Market Part II
Hong Qiao Market Part IIHong Qiao Market Part II
Hong Qiao Market Part II
 
η βυζαντινή τέχνη
η βυζαντινή τέχνηη βυζαντινή τέχνη
η βυζαντινή τέχνη
 
Экскурсия по школе
Экскурсия по школеЭкскурсия по школе
Экскурсия по школе
 
Pan Jie Yuan Market Part V
Pan Jie Yuan Market Part VPan Jie Yuan Market Part V
Pan Jie Yuan Market Part V
 
Canadá
CanadáCanadá
Canadá
 

Similar a Compte rendu jess

Coffee script
Coffee scriptCoffee script
Coffee script
antho1404
 

Similar a Compte rendu jess (20)

Coffee script
Coffee scriptCoffee script
Coffee script
 
Cours-Intelligence-artificielle-55.pdf
Cours-Intelligence-artificielle-55.pdfCours-Intelligence-artificielle-55.pdf
Cours-Intelligence-artificielle-55.pdf
 
20080610 04 - Explorations visuelles de programmes
20080610 04 - Explorations visuelles de programmes20080610 04 - Explorations visuelles de programmes
20080610 04 - Explorations visuelles de programmes
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScript
 
ALF 8 - Generation du code
ALF 8 - Generation du codeALF 8 - Generation du code
ALF 8 - Generation du code
 
Algorithmique Amp Programmation (R Sum
Algorithmique  Amp  Programmation (R SumAlgorithmique  Amp  Programmation (R Sum
Algorithmique Amp Programmation (R Sum
 
Le langage C
Le langage CLe langage C
Le langage C
 
Algorithmique programmation2018
Algorithmique programmation2018Algorithmique programmation2018
Algorithmique programmation2018
 
Javascript #4.1 : fonctions for noobs
Javascript #4.1 : fonctions for noobsJavascript #4.1 : fonctions for noobs
Javascript #4.1 : fonctions for noobs
 
Corrige exercices pascal_fenni_2018
Corrige exercices pascal_fenni_2018Corrige exercices pascal_fenni_2018
Corrige exercices pascal_fenni_2018
 
Tql 2011 2012
Tql 2011 2012Tql 2011 2012
Tql 2011 2012
 
Récursivité
RécursivitéRécursivité
Récursivité
 
UML OCL : Cheat Sheet - 10
UML OCL : Cheat Sheet - 10UML OCL : Cheat Sheet - 10
UML OCL : Cheat Sheet - 10
 
jeu de serpent (Snake)
jeu de serpent (Snake)jeu de serpent (Snake)
jeu de serpent (Snake)
 
Theme 7
Theme 7Theme 7
Theme 7
 
L'impact des incriments des séquences de tri Shell. Expérimentation des séque...
L'impact des incriments des séquences de tri Shell. Expérimentation des séque...L'impact des incriments des séquences de tri Shell. Expérimentation des séque...
L'impact des incriments des séquences de tri Shell. Expérimentation des séque...
 
Introduction Clojure - Geneva JUG - Octobre 2012
Introduction Clojure - Geneva JUG - Octobre 2012Introduction Clojure - Geneva JUG - Octobre 2012
Introduction Clojure - Geneva JUG - Octobre 2012
 
ALF 11 - Diagramme de flux de contrôle et WebAssembly
ALF 11 - Diagramme de flux de contrôle et WebAssemblyALF 11 - Diagramme de flux de contrôle et WebAssembly
ALF 11 - Diagramme de flux de contrôle et WebAssembly
 
Javascript : fondamentaux et OOP
Javascript : fondamentaux et OOPJavascript : fondamentaux et OOP
Javascript : fondamentaux et OOP
 
Trucs et astuces PHP et MySQL
Trucs et astuces PHP et MySQLTrucs et astuces PHP et MySQL
Trucs et astuces PHP et MySQL
 

Último

Bilan énergétique des chambres froides.pdf
Bilan énergétique des chambres froides.pdfBilan énergétique des chambres froides.pdf
Bilan énergétique des chambres froides.pdf
AmgdoulHatim
 
Copie de Engineering Software Marketing Plan by Slidesgo.pptx.pptx
Copie de Engineering Software Marketing Plan by Slidesgo.pptx.pptxCopie de Engineering Software Marketing Plan by Slidesgo.pptx.pptx
Copie de Engineering Software Marketing Plan by Slidesgo.pptx.pptx
ikospam0
 
Cours Préparation à l’ISO 27001 version 2022.pdf
Cours Préparation à l’ISO 27001 version 2022.pdfCours Préparation à l’ISO 27001 version 2022.pdf
Cours Préparation à l’ISO 27001 version 2022.pdf
ssuserc72852
 

Último (20)

Formation échiquéenne jwhyCHESS, parallèle avec la planification de projet
Formation échiquéenne jwhyCHESS, parallèle avec la planification de projetFormation échiquéenne jwhyCHESS, parallèle avec la planification de projet
Formation échiquéenne jwhyCHESS, parallèle avec la planification de projet
 
Les roches magmatique géodynamique interne.pptx
Les roches magmatique géodynamique interne.pptxLes roches magmatique géodynamique interne.pptx
Les roches magmatique géodynamique interne.pptx
 
Formation qhse - GIASE saqit_105135.pptx
Formation qhse - GIASE saqit_105135.pptxFormation qhse - GIASE saqit_105135.pptx
Formation qhse - GIASE saqit_105135.pptx
 
L application de la physique classique dans le golf.pptx
L application de la physique classique dans le golf.pptxL application de la physique classique dans le golf.pptx
L application de la physique classique dans le golf.pptx
 
La nouvelle femme . pptx Film français
La   nouvelle   femme  . pptx  Film françaisLa   nouvelle   femme  . pptx  Film français
La nouvelle femme . pptx Film français
 
Apolonia, Apolonia.pptx Film documentaire
Apolonia, Apolonia.pptx         Film documentaireApolonia, Apolonia.pptx         Film documentaire
Apolonia, Apolonia.pptx Film documentaire
 
Boléro. pptx Film français réalisé par une femme.
Boléro.  pptx   Film   français   réalisé  par une  femme.Boléro.  pptx   Film   français   réalisé  par une  femme.
Boléro. pptx Film français réalisé par une femme.
 
Intégration des TICE dans l'enseignement de la Physique-Chimie.pptx
Intégration des TICE dans l'enseignement de la Physique-Chimie.pptxIntégration des TICE dans l'enseignement de la Physique-Chimie.pptx
Intégration des TICE dans l'enseignement de la Physique-Chimie.pptx
 
Bilan énergétique des chambres froides.pdf
Bilan énergétique des chambres froides.pdfBilan énergétique des chambres froides.pdf
Bilan énergétique des chambres froides.pdf
 
Chapitre 2 du cours de JavaScript. Bon Cours
Chapitre 2 du cours de JavaScript. Bon CoursChapitre 2 du cours de JavaScript. Bon Cours
Chapitre 2 du cours de JavaScript. Bon Cours
 
La mondialisation avantages et inconvénients
La mondialisation avantages et inconvénientsLa mondialisation avantages et inconvénients
La mondialisation avantages et inconvénients
 
RAPPORT DE STAGE D'INTERIM DE ATTIJARIWAFA BANK
RAPPORT DE STAGE D'INTERIM DE ATTIJARIWAFA BANKRAPPORT DE STAGE D'INTERIM DE ATTIJARIWAFA BANK
RAPPORT DE STAGE D'INTERIM DE ATTIJARIWAFA BANK
 
Sidonie au Japon . pptx Un film français
Sidonie    au   Japon  .  pptx  Un film françaisSidonie    au   Japon  .  pptx  Un film français
Sidonie au Japon . pptx Un film français
 
Conférence Sommet de la formation 2024 : Développer des compétences pour la m...
Conférence Sommet de la formation 2024 : Développer des compétences pour la m...Conférence Sommet de la formation 2024 : Développer des compétences pour la m...
Conférence Sommet de la formation 2024 : Développer des compétences pour la m...
 
les_infections_a_streptocoques.pptkioljhk
les_infections_a_streptocoques.pptkioljhkles_infections_a_streptocoques.pptkioljhk
les_infections_a_streptocoques.pptkioljhk
 
Copie de Engineering Software Marketing Plan by Slidesgo.pptx.pptx
Copie de Engineering Software Marketing Plan by Slidesgo.pptx.pptxCopie de Engineering Software Marketing Plan by Slidesgo.pptx.pptx
Copie de Engineering Software Marketing Plan by Slidesgo.pptx.pptx
 
Cours ofppt du Trade-Marketing-Présentation.pdf
Cours ofppt du Trade-Marketing-Présentation.pdfCours ofppt du Trade-Marketing-Présentation.pdf
Cours ofppt du Trade-Marketing-Présentation.pdf
 
Cours Préparation à l’ISO 27001 version 2022.pdf
Cours Préparation à l’ISO 27001 version 2022.pdfCours Préparation à l’ISO 27001 version 2022.pdf
Cours Préparation à l’ISO 27001 version 2022.pdf
 
Computer Parts in French - Les parties de l'ordinateur.pptx
Computer Parts in French - Les parties de l'ordinateur.pptxComputer Parts in French - Les parties de l'ordinateur.pptx
Computer Parts in French - Les parties de l'ordinateur.pptx
 
GIÁO ÁN DẠY THÊM (KẾ HOẠCH BÀI DẠY BUỔI 2) - TIẾNG ANH 6, 7 GLOBAL SUCCESS (2...
GIÁO ÁN DẠY THÊM (KẾ HOẠCH BÀI DẠY BUỔI 2) - TIẾNG ANH 6, 7 GLOBAL SUCCESS (2...GIÁO ÁN DẠY THÊM (KẾ HOẠCH BÀI DẠY BUỔI 2) - TIẾNG ANH 6, 7 GLOBAL SUCCESS (2...
GIÁO ÁN DẠY THÊM (KẾ HOẠCH BÀI DẠY BUỔI 2) - TIẾNG ANH 6, 7 GLOBAL SUCCESS (2...
 

Compte rendu jess

  • 1. ECOLE NATIONALE D’INGENIEURS DE TUNIS Compte redu système expert Application à JESS Dghaies Marwa 3ème Info 2
  • 2. TP 1 Présentation de Jess Exercice d’application Suppose you wanted to write an expert system to determine how a mobile robot should respond to a traffic light. The rules for the red and green light situations can be written as follows. (defrule red-light (light red) => (printout t "STOP" crlf) ) (defrule green-light (light green) => (printout t "GO" crlf) ) 1. For all questions Write a command and describe what you see? After the rules have been entered into Jess, assert a fact (light red) and run. Jess>defrule red-light (light red) => (printout t "STOP" crlf) ) Jess>(defrule green-light (light green) => (printout t "GO" crlf) ) Jess>(assert (light red)) Jess>(run) 2. Watch fact Jess> (watch facts) TRUE Jess> (reset) ==> f-0 (MAIN::initial-fact) TRUE Jess> (unwatch facts) TRUE 3. Retract fact (light red) and run Jess> (retract 1) Jess> (facts) 2
  • 3. 4. Assert fact (light green) and run. Jess>(assert (light green)) Jess> (facts) Jess>(run) 3
  • 4. 5. Create a Button in the Jess Language who “run” these rules. Jess> (import java.awt.*) Jess> (import java.awt.event.*) Jess> ;; Create the widgets (defglobal ?*f* = (new Frame "Button Demo")) Jess> (defglobal ?*b* = (new Button "Hello")) Jess> ;; Add a listener to the button (?*b* addActionListener (implement ActionListener using (lambda (?name ?evt) (run)))) Jess> ;; Assemble and display the GUI (?*f* add ?*b*) Jess> (?*f* pack) Jess> (set ?*f* visible TRUE) Jess> ;; Add a WINDOW_CLOSING listener (import java.awt.event.WindowEvent) (?*f* addWindowListener (implement WindowListener using (lambda (?name ?event) (if (= (?event getID) (WindowEvent.WINDOW_CLOSING)) then (exit))))) 4
  • 5. TP 2 : Arbre généalogique 1) Comment faut-il modifier la première prémisse de chacune des 4 règles de calcul d’ancêtre pour sélectionner l’individu à étudier ? Faites une exécution. (deftemplate individu (slot nom) (slot pere) (slot mere) (slot a_etudier (default non)) ) ((defrule startup ?f<-(initial-fact) => (printout t "Indiquez l'individu dont vous recherchez un ancêtre (ou tapez fin pour arrêter) : ") (bind ?x (sym-cat (readline))) (assert (a_etudier ?x)) (retract ?f) ) (defrule a_etudier (a_etudier ?x) ?f<-(individu (nom ?x)(a_etudier non)) => (modify ?f (a_etudier oui)) ) (defrule ancetresinconnus (a_etudier ?x) (individu (nom ?x)(pere nil)(mere nil)) => (printout t ?x " n'a pas d'ancêtres connus" crlf) ) (defrule imprime (declare (salience -10)) (a_etudier ?y) (ancetre ?x ?y) => (printout t ?x " est un ancetre de " ?y crlf) 5
  • 6. ) 2) Ecrire une règle qui permette de redemander un nom à l’utilisateur si jamais celui-ci a indiqué un nom ne figurant pas dans la famille. Quelle priorité faut-il donner à cette règle ? (defrule control_choix (declare (salience 500)) (a_etudier ?x) (not ( individu (nom ?x))) => (printout t "Vous devez choisir un nom qui existe!" crlf) ) 3) Ecrire une règle permettant de stopper le moteur d’inférences si l’utilisateur indique « fin » comme nom d’utilisateur. Quelle priorité faut-il donner à cette règle ? (defrule control_fin (declare (salience 700)) 6
  • 7. (a_etudier fin) => (exit)) 4) Ecrire une règle qui permette de demander un nouvel individu à l’utilisateur après que le système ait affiché tous les ancêtres de l’individu précédent. Quelle priorité faut-il donner à cette règle ? (defrule selctionner (declare (salience -20)) => (printout t "Indiquez l'individu dont vous recherchez un ancêtre (ou tapez fin pour arrêter) : ") (bind ?x (sym-cat (readline))) (assert (a_etudier ?x)) (run_boucle) ) (deffunction run_boucle() (reset) (run) ) Exercice pratique : (deftemplate droite (slot a) (slot b) (slot c) ) (deftemplate point (slot x) (slot y) ) (defrule startup => (printout t "entrez les coordonnées de votre droite : ") 7
  • 8. (bind ?x1 (sym-cat (readline))) (bind ?y1 (sym-cat (readline))) (bind ?z1 (sym-cat (readline))) (assert (droite (a ?x1) (b ?y1) (c ?z1))) (printout t "entrez les coordonnées du point : ") (bind ?x2 (sym-cat (readline))) (bind ?y2(sym-cat (readline))) (assert (point (x ?x2) (y ?y2))) ) (defrule calcul_distance (droite (a ?x1 )(b ?y1) (c ?z1)) (point (x ?x2) (y ?y2)) => (calcul a b c x y) ) (deffunction calcul (?a ?b ?c ?x ?y) (bind ?result (/ (+ (+ (* ?a ?x) (* ?b ?y)) c) (+ (* ?a ?a) (* ?b ?b)))) (return ?result) ) (reset) (run) 8
  • 9. TP 3 Dans ce TP nous allons utiliser la programmation en jess pour crée dans une première application un jeu très connu qui celui du « tictac » et dans une seconde application nous allons traiter des calculs mathématiques que nous avons pris l’habitude de traiter couramment en java ou encore en C++. 1) Vous essayez d’exécuter le fichier « tictac.clp » avec l’instruction (batch nomfichier) Jess> (batch tictac.clp) 2) Le programme ne s’arrête pas dans le cas où il n’y a pas de gagnant et toutes les cases sont remplies. Améliorer le code en ajoutant une règle à priorité réduite traitant ce cas. (defrule check-notwin-backslash (declare (salience 10)) (case 1 1 ?a) (case 1 2 ?b) (case 2 2 ?a) (case 3 2 ?a) (case 2 1 ?b) (case 1 3 ?a) (case 3 1 ?b) (case 2 3 ?b) (case 3 3 ?b) (test (neq ?a _)) (test (neq ?b _)) 9
  • 10. => (printout t "Aucun gagneur " crlf "Fin de la partie..." crlf) (halt) ) 3) Ajouter une règle permettant de demander si le joueur veut rejouer ou non. (deffunction run_n_time(?rep) (while (test (neq ?rep n)) do ((reset) (run) (printout t "Voulez vous rejouez?") (bind ?rep (read)) ) ) ) 10
  • 11. TP 4 ; soduko.clp ; Fait par Sébastien Gagné ; Pour le cours de LOG625 ; ; Utilisation : charger le fichier dans Jess ; Pour jouer son coup, il faut entrer la ligne et la colone avec un espace entre les deux. ; ; 2008-05-28 : Version initiale (clear) ; === Faits de base === ; Les cases (deffacts cases (case 1 1 _) (case 1 2 _) (case 1 3 _) (case 2 1 _) (case 2 2 _) (case 2 3 _) (case 3 1 _) (case 3 2 _) (case 3 3 _)) ; Pour chager de case facilement (deffacts prochain-joueur (next X X) ) ;=== Règles === ;Init rule ;Le read ici est pour que les readline suivants fonctionnent (defrule startup (declare (salience 60)) => (printout t "Voulez vous jouer (O/N) ? " crlf) (bind ?x (read)) (if(= ?x n) then (halt) else(while (eq ?x o) do (assert (tour X)) (assert (show-grid)) (run) (printout t "Voulez vous jouer (O/N) ? " crlf) (bind ?x (read)) (reset) ) (halt) ) ) ; Demander le coup du joueur (defrule do-move 11
  • 12. (declare (salience 60)) (tour ?a) (not (action ? ? ?)) => (printout t "Ou voulez-vous mettre votre chiffre ? (ligne colone chiffre)" crlf) (assert (action (explode$ (readline)))) ) ; "Effectuer" le tour et changer de joueur (defrule go-next-player ?t <- (tour ?curPlayer) (next ?curPlayer ?next) ?a <- (action ?l ?c ?y) ?case <- (case ?l ?c ?) => (retract ?t) (retract ?a) (retract ?case) (assert (case ?l ?c ?y)) (assert (tour ?next)) (assert (show-grid)) ) ; Afficher la grille actuelle du jeu (defrule show-grid-to-player (declare (salience 100)) ?fact <- (show-grid) (case 1 1 ?a) (case 1 2 ?b) (case 1 3 ?c) (case 2 1 ?d) (case 2 2 ?e) (case 2 3 ?f) (case 3 1 ?g) (case 3 2 ?h) (case 3 3 ?i) => (printout t crlf ?a " " ?b " " ?c crlf) (printout t ?d " " ?e " " ?f crlf) (printout t ?g " " ?h " " ?i crlf crlf) (retract ?fact) ) ;; Vérifier si on a un gagnant (defrule check-win-cas1 (declare (salience 50)) (case 1 1 1) (case 1 2 3) (case 1 3 2) (case 2 1 3) (case 2 2 2) (case 2 3 1) (case 3 1 2) (case 3 2 1) (case 3 3 3) ;(test (neq ?a _)) => (printout t "Bravo, tu as gagné !" crlf "Fin de la partie..." crlf) (halt) ) 12
  • 13. (defrule check-win-cas2 (declare (salience 50)) (case 1 1 2) (case 1 2 1) (case 1 3 3) (case 2 1 1) (case 2 2 3) (case 2 3 2) (case 3 1 3) (case 3 2 2) (case 3 3 1) ;(test (neq ?a _)) => (printout t "Bravo, tu as gagné !" crlf "Fin de la partie..." crlf) (halt) ) (defrule check-win-cas3 (declare (salience 50)) (case 1 1 2) (case 1 2 3) (case 1 3 1) (case 2 1 3) (case 2 2 1) (case 2 3 2) (case 3 1 1) (case 3 2 2) (case 3 3 3) => (printout t "Bravo, tu as gagné !" crlf "Fin de la partie..." crlf) (halt) ) (defrule check-win-cas4 (declare (salience 50)) (case 1 1 3) (case 1 2 2) (case 1 3 1) (case 2 1 2) (case 2 2 1) (case 2 3 3) (case 3 1 1) (case 3 2 3) (case 3 3 2) => (printout t "Bravo, tu as gagné !" crlf "Fin de la partie..." crlf) (halt) ) (defrule check-win-cas5 (declare (salience 50)) (case 1 1 3) (case 1 2 1) (case 1 3 2) (case 2 1 1) (case 2 2 2) (case 2 3 3) (case 3 1 2) (case 3 2 3) 13
  • 14. (case 3 3 1) => (printout t "Bravo, tu as gagné !" crlf "Fin de la partie..." crlf) (halt) ) (defrule check-win-cas6 (declare (salience 50)) (case 1 1 1) (case 1 2 2) (case 1 3 3) (case 2 1 2) (case 2 2 3) (case 2 3 1) (case 3 1 3) (case 3 2 1) (case 3 3 2) => (printout t "Bravo, tu as gagné !" crlf "Fin de la partie..." crlf) (halt) ) (defrule check-loose-cas1 (declare (salience 600)) ?a <- (action ?l ?c ?n) (case ?l ? ?n) ?b <- (tour ?x) => (printout t "Too Baaaad" crlf) (retract ?a) (retract ?b) (assert (tour ?x)) ) (defrule check-loose-cas2 (declare (salience 600)) ?a <- (action ?l ?c ?n) (case ? ?c ?n) ?b <- (tour ?x) => (printout t "Too Baaaad" crlf) (retract ?a) (retract ?b) (assert (tour ?x)) ) ; Il faut valider qu'on choisi une case vide (defrule valider-case-vide (declare (salience 500)) ?a <- (action ?l ?c ?n) (case ?l ?c ?x) (test (neq ?x _)) ?b <- (tour ?t) => (printout t "Vous devez choisir une case vide !!!" crlf) 14
  • 15. (retract ?a) (retract ?b) (assert (tour ?t)) (assert (show-grid)) ) ; Validation pour les faits "action" mal formées (defrule valider-action-invalide0 (declare (salience 500)) ?a <- (action) ?b <- (tour ?x) => (printout t "Action invalide, vous devez entrer la ligne et la colonne et le chiffre séparée d'un espace" crlf) (retract ?a) (retract ?b) (assert (tour ?x)) ) (defrule valider-action-invalide1 (declare (salience 500)) ?a <- (action ?) ?b <- (tour ?x) => (printout t "Action invalide, vous devez entrer la ligne et la colonne et le chiffre séparée d'un espace" crlf) (retract ?a) (retract ?b) (assert (tour ?x)) ) (defrule valider-action-invalide2 (declare (salience 500)) ?a <- (action ? ?) ?b <- (tour ?x) => (printout t "Action invalide, vous devez entrer la ligne et la colonne et le chiffre séparée d'un espace" crlf) (retract ?a) (retract ?b) (assert (tour ?x)) ) (defrule valider-action-invalide4 (declare (salience 500)) ?a <- (action ? ? ? ?) ?b <- (tour ?x) => (printout t "Action invalide, vous devez entrer la ligne et la colonne et le chiffre séparée d'un espace" crlf) (retract ?a) (retract ?b) (assert (tour ?x)) ) (defrule valider-action-invalide5 (declare (salience 500)) ?a <- (action ? ? ? ? ?) ?b <- (tour ?x) => (printout t "Action invalide, vous devez entrer la ligne et la colonne et le chiffre séparée d'un espace" crlf) (retract ?a) (retract ?b) (assert (tour ?x)) 15
  • 16. ) ; Valider qu'on choisisse une case qui existe (defrule valide-case-existe (declare (salience 500)) ?a <- (action ?l ?c ?y) (not (case ?l ?c ?)) ?b <- (tour ?x) => (printout t "Vous devez choisir une case qui existe!" crlf) (retract ?a) (retract ?b) (assert (tour ?x)) ) ; Démarrer la partie ! (reset) (run) 16
  • 17. 17