Compte rendu jess

  • View
    245

  • Download
    2

Embed Size (px)

Text of Compte rendu jess

Compte redu systme expert

Ecole nationale dingnieurs de tunisCompte redu systme expertApplication JESS

Dghaies Marwa 3me Info 2

TP 1 Prsentation de Jess

Exercice dapplication

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)TRUEJess> (reset)==> f-0 (MAIN::initial-fact)TRUEJess> (unwatch facts)TRUE

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

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

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)))))

TP 2 : Arbre gnalogique

1) Comment faut-il modifier la premire prmisse de chacune des 4 rgles de calcul danctre pour slectionner lindividu tudier ? Faites une excution.

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

)((defrule startup

?f(printout t "Indiquez l'individu dont vous recherchez un anctre (outapez fin pour arrter) : ")(bind ?x (sym-cat (readline)))(assert (a_etudier ?x)) (retract ?f))

(defrule a_etudier(a_etudier ?x)

?f(modify ?f (a_etudier oui)))

(defrule ancetresinconnus (a_etudier ?x) (individu (nom ?x)(pere nil)(mere nil)) => (printout t ?x " n'a pas d'anctres connus" crlf))(defrule imprime (declare (salience -10)) (a_etudier ?y) (ancetre ?x ?y)=> (printout t ?x " est un ancetre de " ?y crlf))

2) Ecrire une rgle qui permette de redemander un nom lutilisateur si jamais celui-ci a indiqu un nom ne figurant pas dans la famille. Quelle priorit faut-il donner cette rgle ?

(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 rgle permettant de stopper le moteur dinfrences si lutilisateur indique fin comme nom dutilisateur. Quelle priorit faut-il donner cette rgle ?

(defrule control_fin(declare (salience 700)) (a_etudier fin) =>(exit))

4) Ecrire une rgle qui permette de demander un nouvel individu lutilisateur aprs que le systme ait affich tous les anctres de lindividu prcdent. Quelle priorit faut-il donner cette rgle ?

(defrule selctionner (declare (salience -20)) =>(printout t "Indiquez l'individu dont vous recherchez un anctre (outapez fin pour arrter) : ")(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 coordonnes de votre droite : ")(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 coordonnes 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)

TP 3Dans ce TP nous allons utiliser la programmation en jess pour cre dans une premireapplication un jeu trs connu qui celui du tictac et dans une seconde application nous allonstraiter des calculs mathmatiques que nous avons pris lhabitude de traiter couramment en javaou encore en C++.

1) Vous essayez dexcuter le fichier tictac.clp avec linstruction (batch nomfichier) Jess> (batch tictac.clp)

2) Le programme ne sarrte pas dans le cas o il ny a pas de gagnant et toutes les cases sont remplies. Amliorer le code en ajoutant une rgle priorit rduite 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 _))=>(printout t "Aucun gagneur " crlf "Fin de la partie..." crlf)(halt)

)

3) Ajouter une rgle 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)))))

TP 4; soduko.clp; Fait par Sbastien 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))

;=== Rgles ===;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 (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 (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)(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