SlideShare une entreprise Scribd logo
1  sur  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

Contenu connexe

Tendances

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...ECAM Brussels Engineering School
 
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 arbreECAM Brussels Engineering School
 
Quickie Incanter/Clojure à Devoxx France 2012
Quickie Incanter/Clojure à Devoxx France 2012Quickie Incanter/Clojure à Devoxx France 2012
Quickie Incanter/Clojure à Devoxx France 2012Claude Falguiere
 
Librairies Java qui changent la vie
Librairies Java qui changent la vieLibrairies Java qui changent la vie
Librairies Java qui changent la viecluelessjoe
 
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 cashStHack
 
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 encapsulationECAM Brussels Engineering School
 
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 ...StHack
 
Javascript #4.2 : fonctions for pgm
Javascript #4.2 : fonctions for pgmJavascript #4.2 : fonctions for pgm
Javascript #4.2 : fonctions for pgmJean Michel
 
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ènementielleECAM Brussels Engineering School
 
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...ECAM Brussels Engineering School
 
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éesECAM Brussels Engineering School
 

Tendances (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
 

En vedette

Numeros arabigos y su logica
Numeros arabigos y su logicaNumeros arabigos y su logica
Numeros arabigos y su logicaiesballesterg
 
Oracion de agradecimiento
Oracion de agradecimientoOracion de agradecimiento
Oracion de agradecimientojuanlema91
 
Tianmen Mountains Chinadinvora
Tianmen Mountains ChinadinvoraTianmen Mountains Chinadinvora
Tianmen Mountains ChinadinvoraJanak Shah
 
Alfred y sus diferencias
Alfred y sus diferenciasAlfred y sus diferencias
Alfred y sus diferenciasPatricia Rossi
 
Экскурсия по школе
Экскурсия по школеЭкскурсия по школе
Экскурсия по школеUrikoS
 

En vedette (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á
 

Similaire à Compte rendu jess

Coffee script
Coffee scriptCoffee script
Coffee scriptantho1404
 
Cours-Intelligence-artificielle-55.pdf
Cours-Intelligence-artificielle-55.pdfCours-Intelligence-artificielle-55.pdf
Cours-Intelligence-artificielle-55.pdfinformatiquehageryah
 
20080610 04 - Explorations visuelles de programmes
20080610 04 - Explorations visuelles de programmes20080610 04 - Explorations visuelles de programmes
20080610 04 - Explorations visuelles de programmesLeClubQualiteLogicielle
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScriptMicrosoft
 
Algorithmique Amp Programmation (R Sum
Algorithmique  Amp  Programmation (R SumAlgorithmique  Amp  Programmation (R Sum
Algorithmique Amp Programmation (R SumAmy Isleb
 
Algorithmique programmation2018
Algorithmique programmation2018Algorithmique programmation2018
Algorithmique programmation2018salah fenni
 
Javascript #4.1 : fonctions for noobs
Javascript #4.1 : fonctions for noobsJavascript #4.1 : fonctions for noobs
Javascript #4.1 : fonctions for noobsJean Michel
 
Corrige exercices pascal_fenni_2018
Corrige exercices pascal_fenni_2018Corrige exercices pascal_fenni_2018
Corrige exercices pascal_fenni_2018salah fenni
 
UML OCL : Cheat Sheet - 10
UML OCL : Cheat Sheet - 10UML OCL : Cheat Sheet - 10
UML OCL : Cheat Sheet - 10megaplanet20
 
jeu de serpent (Snake)
jeu de serpent (Snake)jeu de serpent (Snake)
jeu de serpent (Snake)chamhi
 
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...Soumia Elyakote HERMA
 
Introduction Clojure - Geneva JUG - Octobre 2012
Introduction Clojure - Geneva JUG - Octobre 2012Introduction Clojure - Geneva JUG - Octobre 2012
Introduction Clojure - Geneva JUG - Octobre 2012Pablo Tamarit
 
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 WebAssemblyAlexandru Radovici
 
Javascript : fondamentaux et OOP
Javascript : fondamentaux et OOPJavascript : fondamentaux et OOP
Javascript : fondamentaux et OOPJean-Pierre Vincent
 
Trucs et astuces PHP et MySQL
Trucs et astuces PHP et MySQLTrucs et astuces PHP et MySQL
Trucs et astuces PHP et MySQLDamien Seguy
 

Similaire à 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
 

Dernier

666148532-Formation-Habilitation-ELECTRIQUE-ENTREPRISE-MARS-2017.pptx
666148532-Formation-Habilitation-ELECTRIQUE-ENTREPRISE-MARS-2017.pptx666148532-Formation-Habilitation-ELECTRIQUE-ENTREPRISE-MARS-2017.pptx
666148532-Formation-Habilitation-ELECTRIQUE-ENTREPRISE-MARS-2017.pptxSAID MASHATE
 
A3iFormations, organisme de formations certifié qualiopi.
A3iFormations, organisme de formations certifié qualiopi.A3iFormations, organisme de formations certifié qualiopi.
A3iFormations, organisme de formations certifié qualiopi.Franck Apolis
 
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.pdfachrafbrahimi1
 
Mécanique Automobile LE TURBOCOMPRESSEUR.ppt
Mécanique Automobile LE TURBOCOMPRESSEUR.pptMécanique Automobile LE TURBOCOMPRESSEUR.ppt
Mécanique Automobile LE TURBOCOMPRESSEUR.pptssusercbaa22
 
Approche-des-risques-par-l’analyse-des-accidents-1.pptx
Approche-des-risques-par-l’analyse-des-accidents-1.pptxApproche-des-risques-par-l’analyse-des-accidents-1.pptx
Approche-des-risques-par-l’analyse-des-accidents-1.pptxssusercbaa22
 
Formation M2i - Intelligence Artificielle Comment booster votre productivité ...
Formation M2i - Intelligence Artificielle Comment booster votre productivité ...Formation M2i - Intelligence Artificielle Comment booster votre productivité ...
Formation M2i - Intelligence Artificielle Comment booster votre productivité ...M2i Formation
 
SUPPORT DE SUR COURS_GOUVERNANCE_SI_M2.pptx
SUPPORT DE SUR COURS_GOUVERNANCE_SI_M2.pptxSUPPORT DE SUR COURS_GOUVERNANCE_SI_M2.pptx
SUPPORT DE SUR COURS_GOUVERNANCE_SI_M2.pptxssuserbd075f
 
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çaisTxaruka
 
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.Txaruka
 
presentation l'interactionnisme symbolique finale.pptx
presentation l'interactionnisme symbolique  finale.pptxpresentation l'interactionnisme symbolique  finale.pptx
presentation l'interactionnisme symbolique finale.pptxMalikaIdseaid1
 
COURS SVT 3 EME ANNEE COLLEGE 2EME SEM.pdf
COURS SVT 3 EME ANNEE COLLEGE 2EME SEM.pdfCOURS SVT 3 EME ANNEE COLLEGE 2EME SEM.pdf
COURS SVT 3 EME ANNEE COLLEGE 2EME SEM.pdfabatanebureau
 
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çaisTxaruka
 
gestion des conflits dans les entreprises
gestion des  conflits dans les entreprisesgestion des  conflits dans les entreprises
gestion des conflits dans les entreprisesMajdaKtiri2
 
Bolero. pptx . Film de A nnne Fontaine
Bolero. pptx . Film   de  A nnne FontaineBolero. pptx . Film   de  A nnne Fontaine
Bolero. pptx . Film de A nnne FontaineTxaruka
 
MaintenanceLa Maintenance Corrective.ppt
MaintenanceLa Maintenance Corrective.pptMaintenanceLa Maintenance Corrective.ppt
MaintenanceLa Maintenance Corrective.pptssusercbaa22
 

Dernier (16)

666148532-Formation-Habilitation-ELECTRIQUE-ENTREPRISE-MARS-2017.pptx
666148532-Formation-Habilitation-ELECTRIQUE-ENTREPRISE-MARS-2017.pptx666148532-Formation-Habilitation-ELECTRIQUE-ENTREPRISE-MARS-2017.pptx
666148532-Formation-Habilitation-ELECTRIQUE-ENTREPRISE-MARS-2017.pptx
 
A3iFormations, organisme de formations certifié qualiopi.
A3iFormations, organisme de formations certifié qualiopi.A3iFormations, organisme de formations certifié qualiopi.
A3iFormations, organisme de formations certifié qualiopi.
 
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
 
Mécanique Automobile LE TURBOCOMPRESSEUR.ppt
Mécanique Automobile LE TURBOCOMPRESSEUR.pptMécanique Automobile LE TURBOCOMPRESSEUR.ppt
Mécanique Automobile LE TURBOCOMPRESSEUR.ppt
 
Approche-des-risques-par-l’analyse-des-accidents-1.pptx
Approche-des-risques-par-l’analyse-des-accidents-1.pptxApproche-des-risques-par-l’analyse-des-accidents-1.pptx
Approche-des-risques-par-l’analyse-des-accidents-1.pptx
 
Formation M2i - Intelligence Artificielle Comment booster votre productivité ...
Formation M2i - Intelligence Artificielle Comment booster votre productivité ...Formation M2i - Intelligence Artificielle Comment booster votre productivité ...
Formation M2i - Intelligence Artificielle Comment booster votre productivité ...
 
Evaluación Alumnos de Ecole Victor Hugo
Evaluación Alumnos de Ecole  Victor HugoEvaluación Alumnos de Ecole  Victor Hugo
Evaluación Alumnos de Ecole Victor Hugo
 
SUPPORT DE SUR COURS_GOUVERNANCE_SI_M2.pptx
SUPPORT DE SUR COURS_GOUVERNANCE_SI_M2.pptxSUPPORT DE SUR COURS_GOUVERNANCE_SI_M2.pptx
SUPPORT DE SUR COURS_GOUVERNANCE_SI_M2.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
 
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.
 
presentation l'interactionnisme symbolique finale.pptx
presentation l'interactionnisme symbolique  finale.pptxpresentation l'interactionnisme symbolique  finale.pptx
presentation l'interactionnisme symbolique finale.pptx
 
COURS SVT 3 EME ANNEE COLLEGE 2EME SEM.pdf
COURS SVT 3 EME ANNEE COLLEGE 2EME SEM.pdfCOURS SVT 3 EME ANNEE COLLEGE 2EME SEM.pdf
COURS SVT 3 EME ANNEE COLLEGE 2EME SEM.pdf
 
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
 
gestion des conflits dans les entreprises
gestion des  conflits dans les entreprisesgestion des  conflits dans les entreprises
gestion des conflits dans les entreprises
 
Bolero. pptx . Film de A nnne Fontaine
Bolero. pptx . Film   de  A nnne FontaineBolero. pptx . Film   de  A nnne Fontaine
Bolero. pptx . Film de A nnne Fontaine
 
MaintenanceLa Maintenance Corrective.ppt
MaintenanceLa Maintenance Corrective.pptMaintenanceLa Maintenance Corrective.ppt
MaintenanceLa Maintenance Corrective.ppt
 

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