SlideShare uma empresa 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

Mais conteúdo relacionado

Mais procurados

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
 

Mais procurados (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
 

Destaque

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
 

Destaque (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á
 

Semelhante a 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
 

Semelhante 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

Bernard Réquichot.pptx Peintre français
Bernard Réquichot.pptx   Peintre françaisBernard Réquichot.pptx   Peintre français
Bernard Réquichot.pptx Peintre françaisTxaruka
 
Annie Ernaux Extérieurs. pptx. Exposition basée sur un livre .
Annie   Ernaux  Extérieurs. pptx. Exposition basée sur un livre .Annie   Ernaux  Extérieurs. pptx. Exposition basée sur un livre .
Annie Ernaux Extérieurs. pptx. Exposition basée sur un livre .Txaruka
 
Cours SE Gestion des périphériques - IG IPSET
Cours SE Gestion des périphériques - IG IPSETCours SE Gestion des périphériques - IG IPSET
Cours SE Gestion des périphériques - IG IPSETMedBechir
 
LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...
LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...
LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...Faga1939
 
Cours SE Le système Linux : La ligne de commande bash - IG IPSET
Cours SE Le système Linux : La ligne de commande bash - IG IPSETCours SE Le système Linux : La ligne de commande bash - IG IPSET
Cours SE Le système Linux : La ligne de commande bash - IG IPSETMedBechir
 
SciencesPo_Aix_InnovationPédagogique_Conférence_SK.pdf
SciencesPo_Aix_InnovationPédagogique_Conférence_SK.pdfSciencesPo_Aix_InnovationPédagogique_Conférence_SK.pdf
SciencesPo_Aix_InnovationPédagogique_Conférence_SK.pdfSKennel
 
PIE-A2-P 5- Supports stagiaires.pptx.pdf
PIE-A2-P 5- Supports stagiaires.pptx.pdfPIE-A2-P 5- Supports stagiaires.pptx.pdf
PIE-A2-P 5- Supports stagiaires.pptx.pdfRiDaHAziz
 
Le Lean sur une ligne de production : Formation et mise en application directe
Le Lean sur une ligne de production : Formation et mise en application directeLe Lean sur une ligne de production : Formation et mise en application directe
Le Lean sur une ligne de production : Formation et mise en application directeXL Groupe
 
Principe de fonctionnement d'un moteur 4 temps
Principe de fonctionnement d'un moteur 4 tempsPrincipe de fonctionnement d'un moteur 4 temps
Principe de fonctionnement d'un moteur 4 tempsRajiAbdelghani
 
Cours de Management des Systèmes d'information
Cours de Management des Systèmes d'informationCours de Management des Systèmes d'information
Cours de Management des Systèmes d'informationpapediallo3
 
SciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdfSciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdfSKennel
 
Zotero avancé - support de formation doctorants SHS 2024
Zotero avancé - support de formation doctorants SHS 2024Zotero avancé - support de formation doctorants SHS 2024
Zotero avancé - support de formation doctorants SHS 2024Alain Marois
 
Bibdoc 2024 - Ecologie du livre et creation de badge.pdf
Bibdoc 2024 - Ecologie du livre et creation de badge.pdfBibdoc 2024 - Ecologie du livre et creation de badge.pdf
Bibdoc 2024 - Ecologie du livre et creation de badge.pdfBibdoc 37
 
SciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdfSciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdfSKennel
 
Bibdoc 2024 - Les maillons de la chaine du livre face aux enjeux écologiques.pdf
Bibdoc 2024 - Les maillons de la chaine du livre face aux enjeux écologiques.pdfBibdoc 2024 - Les maillons de la chaine du livre face aux enjeux écologiques.pdf
Bibdoc 2024 - Les maillons de la chaine du livre face aux enjeux écologiques.pdfBibdoc 37
 
Presentation de la plateforme Moodle - avril 2024
Presentation de la plateforme Moodle - avril 2024Presentation de la plateforme Moodle - avril 2024
Presentation de la plateforme Moodle - avril 2024Gilles Le Page
 
PIE-A2-P4-support stagiaires sept 22-validé.pdf
PIE-A2-P4-support stagiaires sept 22-validé.pdfPIE-A2-P4-support stagiaires sept 22-validé.pdf
PIE-A2-P4-support stagiaires sept 22-validé.pdfRiDaHAziz
 
SciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdfSciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdfSKennel
 
SciencesPo_Aix_InnovationPédagogique_Bilan.pdf
SciencesPo_Aix_InnovationPédagogique_Bilan.pdfSciencesPo_Aix_InnovationPédagogique_Bilan.pdf
SciencesPo_Aix_InnovationPédagogique_Bilan.pdfSKennel
 

Último (20)

Bernard Réquichot.pptx Peintre français
Bernard Réquichot.pptx   Peintre françaisBernard Réquichot.pptx   Peintre français
Bernard Réquichot.pptx Peintre français
 
Annie Ernaux Extérieurs. pptx. Exposition basée sur un livre .
Annie   Ernaux  Extérieurs. pptx. Exposition basée sur un livre .Annie   Ernaux  Extérieurs. pptx. Exposition basée sur un livre .
Annie Ernaux Extérieurs. pptx. Exposition basée sur un livre .
 
Cours SE Gestion des périphériques - IG IPSET
Cours SE Gestion des périphériques - IG IPSETCours SE Gestion des périphériques - IG IPSET
Cours SE Gestion des périphériques - IG IPSET
 
LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...
LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...
LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...
 
Cours SE Le système Linux : La ligne de commande bash - IG IPSET
Cours SE Le système Linux : La ligne de commande bash - IG IPSETCours SE Le système Linux : La ligne de commande bash - IG IPSET
Cours SE Le système Linux : La ligne de commande bash - IG IPSET
 
SciencesPo_Aix_InnovationPédagogique_Conférence_SK.pdf
SciencesPo_Aix_InnovationPédagogique_Conférence_SK.pdfSciencesPo_Aix_InnovationPédagogique_Conférence_SK.pdf
SciencesPo_Aix_InnovationPédagogique_Conférence_SK.pdf
 
DO PALÁCIO À ASSEMBLEIA .
DO PALÁCIO À ASSEMBLEIA                 .DO PALÁCIO À ASSEMBLEIA                 .
DO PALÁCIO À ASSEMBLEIA .
 
PIE-A2-P 5- Supports stagiaires.pptx.pdf
PIE-A2-P 5- Supports stagiaires.pptx.pdfPIE-A2-P 5- Supports stagiaires.pptx.pdf
PIE-A2-P 5- Supports stagiaires.pptx.pdf
 
Le Lean sur une ligne de production : Formation et mise en application directe
Le Lean sur une ligne de production : Formation et mise en application directeLe Lean sur une ligne de production : Formation et mise en application directe
Le Lean sur une ligne de production : Formation et mise en application directe
 
Principe de fonctionnement d'un moteur 4 temps
Principe de fonctionnement d'un moteur 4 tempsPrincipe de fonctionnement d'un moteur 4 temps
Principe de fonctionnement d'un moteur 4 temps
 
Cours de Management des Systèmes d'information
Cours de Management des Systèmes d'informationCours de Management des Systèmes d'information
Cours de Management des Systèmes d'information
 
SciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdfSciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdf
 
Zotero avancé - support de formation doctorants SHS 2024
Zotero avancé - support de formation doctorants SHS 2024Zotero avancé - support de formation doctorants SHS 2024
Zotero avancé - support de formation doctorants SHS 2024
 
Bibdoc 2024 - Ecologie du livre et creation de badge.pdf
Bibdoc 2024 - Ecologie du livre et creation de badge.pdfBibdoc 2024 - Ecologie du livre et creation de badge.pdf
Bibdoc 2024 - Ecologie du livre et creation de badge.pdf
 
SciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdfSciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdf
 
Bibdoc 2024 - Les maillons de la chaine du livre face aux enjeux écologiques.pdf
Bibdoc 2024 - Les maillons de la chaine du livre face aux enjeux écologiques.pdfBibdoc 2024 - Les maillons de la chaine du livre face aux enjeux écologiques.pdf
Bibdoc 2024 - Les maillons de la chaine du livre face aux enjeux écologiques.pdf
 
Presentation de la plateforme Moodle - avril 2024
Presentation de la plateforme Moodle - avril 2024Presentation de la plateforme Moodle - avril 2024
Presentation de la plateforme Moodle - avril 2024
 
PIE-A2-P4-support stagiaires sept 22-validé.pdf
PIE-A2-P4-support stagiaires sept 22-validé.pdfPIE-A2-P4-support stagiaires sept 22-validé.pdf
PIE-A2-P4-support stagiaires sept 22-validé.pdf
 
SciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdfSciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdf
 
SciencesPo_Aix_InnovationPédagogique_Bilan.pdf
SciencesPo_Aix_InnovationPédagogique_Bilan.pdfSciencesPo_Aix_InnovationPédagogique_Bilan.pdf
SciencesPo_Aix_InnovationPédagogique_Bilan.pdf
 

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