rapport du mini-projet systeme expert droits d`utilisation des logiciels
Transcription
rapport du mini-projet systeme expert droits d`utilisation des logiciels
Mini-projet Système Expert – Droits sur les logiciels RAPPORT DU MINI-PROJET SYSTEME EXPERT DROITS D’UTILISATION DES LOGICIELS EN LISP Elève-Ingénieur : Soufiane ATTIF Filière : 2 GI 05/06/2006 Soufiane ATTIF 2 GI 1 Mini-projet Système Expert – Droits sur les logiciels 1. Définition des structures : Suite aux explications que vous m avez donné dans la dernière séance, ai pu mettre en uvre une stratégie de raisonnement sur le projet. Il s agit dans cette stratégie de : Ø Déterminer le type du logiciel (freeware, shareware ou libre) en utilisant un moteur d inférence en chaînage arrière qui au fur eu à mesure, et selon les règles introduites, pose des questions à utilisateur sur les droits qu il a. Il donnera en fin le type du logiciel il arrive à le connaître en se basant sur les réponses de l utilisateur et les règles d inférence. Ø Vérifier les droits d utilisation pour un logiciel donné existant dans la base des faits, et ce en se basant sur un moteur d inférence en chaînage avant. En ce qui suit les formalisation de la base des règles et la base des faits stockées dans des fichiers qui doivent être dans le répertoire C:\. § Base des faits : #S(LOGICIEL NOM "windows" TYP SHAREWARE DROITS (UTILISATION)) #S(LOGICIEL NOM "linux" TYP SHAREWARE DROITS (UTILISATION)) #S(LOGICIEL NOM "realplayer" TYP FREEWARE DROITS (COPIE UTILISATION)) #S(LOGICIEL NOM "msn" TYP LIBRE DROITS (UTILISATION COPIE MODIFIER)) Soufiane ATTIF 2 GI 2 Mini-projet Système Expert – Droits sur les logiciels § Base des règles : #S(REGLE RG (FREEWARE (TELECHARGÉ LICENCE))) #S(REGLE RG (SHAREWARE (ACHETÉ LICENCE))) #S(REGLE RG (LIBRE (TELECHARGÉ SANS_LICENCE))) #S(REGLE RG (LICENCE (PAYER))) § Droits d utilisations : #S(DROIT TYP freeware DROITS (copie utilisation)) #S(DROIT TYP shareware DROITS (utilisation)) #S(DROIT TYP libre DROITS (utilisation copie modifier)) 2. Le code de l’application : ;************************ Les stream************************* (defvar nom) (defvar typ) (defvar droits) (defvar n) (defvar tt) (defvar d) (defvar a) (defvar io) ;****************Les structures**************************** (defstruct logiciel (nom "linux" :type string) Soufiane ATTIF 2 GI 3 Mini-projet Système Expert – Droits sur les logiciels (typ "freeware" :type string) (droits "copie" :type string) ) (defstruct regle (rg "(freeware (telechargé licence))" :type string)) (defstruct droit (typ "freeware" :type string) (droits "(copie modifier)" :type string)) ;*********************************************************** ;************ ***Enregistrer dans le fichier******************* (defun logiciel(fichier) (setq io (open fichier :direction :output :if-exists :append)) (print "Saisir les données concernant les logiciels :")(terpri) (print "Nom :")(setq n (read)) (print "type :")(setq tt (read)) (print "droits(dans une liste) :")(setq d (read)) (setq a (make-logiciel :nom n :typ tt :droits d)) (print a io) (close io) ) ;*********************************************************** ;********* **********Afficher base de fait******************* (defun constBF10(fichier) (setq io (open fichier :direction :input)) (setq aff (make-instance 'capi:collector-pane :title "Base des Faits" )) (capi:contain aff) (const10) ) (defun const10() (setq a (read io nil nil)) (cond ((not(equal a nil)) (print (list(logiciel-nom a) (logiciel-typ a) (logiciel-droits a) ) (capi:collector-pane-stream aff)) (const10)) (t nil)) Soufiane ATTIF 2 GI 4 Mini-projet Système Expert – Droits sur les logiciels ) ;********************************************************** ;************ ******Afficher base des règles****************** (defun constBR11(fichier) (setq tio (open fichier :direction :input)) (setq aff1 (make-instance 'capi:collector-pane :title "Base des Règles" )) (capi:contain aff1) (const11) ) (defun const11() (setq a (read tio nil nil)) (cond ((not(equal a nil)) (print (regle-rg a) (capi:collector-pane-stream aff1)) (const11)) (t nil)) ) ;*********************************************************** ;****** ******Construction de la base de faits***************** (defun constBF(fichier) (setq io (open fichier :direction :input)) (const nil) ) (defun const(liste) (setq a (read io nil nil)) (cond ((not(equal a nil)) (const (cons (logiciel-nom a) liste))) (t liste)) ) ;********************************************************** Soufiane ATTIF 2 GI 5 Mini-projet Système Expert – Droits sur les logiciels ;********** Afficher les droits d'un logiciel donné*********** (defun listdroit(fichier logiciel) (setq io (open fichier :direction :input)) (rech_droit logiciel) ) ;*********************************************************** ;******* ******rechercher les droits d'un logiciel************* (defun rech_droit(logiciel) (setq a (read io nil nil)) (cond ((equal (logiciel-nom a) logiciel) (logiciel-droits a)) (t (rech_droit logiciel)) ) ) ;********************************************************** ;******* **************memberp************************** (defun memberp(x l) (cond ((null l) nil) ((equal x (car l)) l) (t (memberp x (cdr l))) ) ) ;********************************************************** ;******** **************Commencement***************** (defvar choix) (defvar But) (defvar BFLog) (defvar BF) (defvar BR) (defun logiciel() (setq log (make-instance 'capi:text-input-pane :title "Donner le nom du logiciel :" :text "" :callback #'(lambda (text interface) (setq But text) (setq BFLog (constBF "c:\faits.txt")) Soufiane ATTIF 2 GI 6 Mini-projet Système Expert – Droits sur les logiciels (cond ((memberp but BFLog) (setq drt (listdroit "c:\faits.txt" but)) (capi:display-message "Les droits que vous avez su le logiciel : ~S sont : ~S" but drt) ) (t (terpri) (setq BR (constBR "c:\regles.txt")) (chain_arr '(freeware shareware libre) nil BR) ) ) ))) (capi:contain log) ) (defun logiciel2() (capi:contain (make-instance 'capi:text-input-pane :title "Donner le nom du logiciel :" :text "" :callback #'(lambda (text interface) (setq logic text) (capi:contain (make-instance 'capi:text-input-pane :title "Donner le droit à vérifier dans une liste :" :text "" :callback #'(lambda (text interface) (setq Butss (prog1 (read-from-string text ))) (setq BFLog2 (constBF "c:\faits.txt")) (cond ((memberp logic BFLog2) (setq drt (listdroit "c:\faits.txt" logic)) (cond ((memberp butss drt) (capi:display-message "Le droit ~S est vérifié au logiciel ~S" butss logic)) (t (capi:display-message "Le droit ~S n'est pas vérifié au logiciel ~S" butss logic) ))) Soufiane ATTIF 2 GI 7 Mini-projet Système Expert – Droits sur les logiciels (t (capi:display-message "Le logiciel ~S n'est pas dans la base des faits" logic) ) ) ) ))) ;(capi:contain log) ) )) ;*********** *********Moteur d'inférence************** ;BR=Base des Règles ;BF=Base des Faits ;F=Fait ;R=Règle ;P=Premisse ;SB=Sous But ;LB=Liste Buts ;il faut initialiser Stk_Rgl à nil ;Traitement d'un but (defvar R) (defvar P) (defvar SB) (defun trait_but1(but BF BR Stk_Rgl) (cond ((null BR) (princ "Echec ") (princ but)(terpri)) ;sinon (t (setq R (car BR)) (setq P (cadr R)) (setq SB (car R)) (cond ((regle_fait R BF) ;verifie si la regle est satisfaite meme avec plusieurs arguments (cond ((equal SB but) (princ "succès : ") (prin1 but) (terpri)) ;sinon (t (trait_but1 but (cons SB BF) (append Stk_Rgl (cdr BR)) nil)) ) Soufiane ATTIF 2 GI 8 Mini-projet Système Expert – Droits sur les logiciels ) ) ) ;sinon (t (trait_but1 but BF (cdr BR) (append (list R) Stk_Rgl))) ) ) (defun chain_avant(LB BF BR) (cond ((null LB) nil) ((memberp (car LB) BF) (princ "succès BF : ") (prin1 (car LB)) (terpri) (chain_avant (cdr LB) BF BR)) (t (trait_but1 (car LB) BF BR nil) (chain_avant (cdr LB) BF BR)))) (defun regle_fait(regle BF) (cond ((null (cadr regle)) (car regle)) ((memberp (caadr regle) BF) (regle_fait (append (list(car regle)) (list(cdadr regle))) BF)) (t nil)) ) (defun supp_elt_liste(elt source cible) (cond ((equal (car source) elt) (append cible (cdr source))) (t (supp_elt_liste elt (cdr source) (append cible (list(car source))))) ) ) ;Fonction qui determine toutes les règles qui satisfont un but ;LR = Liste de Règles qui satisfont le but (defun satisfait_regles_but(but BR) (cond ((equal (caar BR) but) BR) Soufiane ATTIF 2 GI 9 Mini-projet Système Expert – Droits sur les logiciels ((null BR) nil) (t (satisfait_regles_but but (cdr BR))) ) ) ;LB = Liste de buts initié par un seul but (defvar LR) (defvar SB) (defvar LRC) (defvar rep) (defun trait_but(but_base LB BF BR Stk_Rgl) (cond ((null LB) (satis_type "c:\droits.txt" "c:\faits.txt" but but_base)) ((memberp (car LB) BF) (trait_but but_base (cdr LB) BF BR Stk_Rgl)) ((assoc (car LB) BR) (setq LR (satisfait_regles_but (car LB) BR)) (setq LRC (satisfait_regles_but (car LB) (cdr LR))) (setq R (car LR)) (cond ((null LR) (cond ((null Stk_Rgl) (capi:displaymessage "Echec")) (t (trait_but but_base (cadar Stk_Rgl) BF (supp_elt_liste (caar Stk_Rgl) BR nil) (cdr Stk_Rgl))))) (t (if (not(null LRC)) (setq Stk_Rgl (append (list(append (list(car LR)) (list LB))) Stk_Rgl))) (setq SB (cadar LR)) (trait_but but_base (append SB (cdr LB)) BF BR Stk_Rgl) ) ) ) Soufiane ATTIF 2 GI 10 Mini-projet Système Expert – Droits sur les logiciels (t ;(print (car LB))(princ " oui/!?") (capi:contain (make-instance 'capi:text-input-pane :title (string (car LB)) :text "oui ou ! ?" :callback #'(lambda (text interface) (setq rep text) (cond ((equal rep "oui") (trait_but but_base (cdr LB) (cons (car LB) nil) BR Stk_Rgl)) (t (setq LR (satisfait_regles_but (car LB) BR)) (setq LRC (satisfait_regles_but (car LB) (cdr LR))) ;(print (satisfait_regles_but (car LB) (cdr LR))) (setq R (car LR)) (cond ((null LR) (cond ((null Stk_Rgl) (capi:display-message "Echec") ) (t (trait_but but_base (cadar Stk_Rgl) BF (supp_elt_liste (caar Stk_Rgl) BR nil) (cdr Stk_Rgl))))) (t (if (not(null LRC)) (setq Stk_Rgl (append (list(append (list(car LR)) (list LB))) Stk_Rgl))) (setq SB (cadar LR)) (trait_but but_base (append SB (cdr LB)) BF BR Stk_Rgl) ) ) ) )))) ))) (defun chain_arr(Buts BF BR) (cond ((null Buts) nil );(capi:display-message "Fin du traitement")) (t (setq BFLog (constBF "c:\faits.txt")) (cond ((not(memberp but BFLog)) Soufiane ATTIF 2 GI 11 Mini-projet Système Expert – Droits sur les logiciels (capi:display-message "But à montrer : ~S" (car Buts)) (trait_but (car Buts) (list(car Buts)) BF BR nil) (chain_arr (cdr Buts) BF BR) ) (t nil)) ) ) ) ;********************************************************** ;************** Ajouter une règle********************** (defvar tio) (defvar texte_ft) (defun ajft() (setq texte_ft1 (make-instance 'capi:text-input-pane :title "Nom du logiciel :" :text "" :callback #'(lambda (text interface) (setq nm text)))) (setq texte_ft2 (make-instance 'capi:text-input-pane :title "Type du logiciel :" :text "" :callback #'(lambda (text interface) (setq tp text)))) (setq texte_ft3 (make-instance 'capi:text-input-pane :title "Liste des droits :" :text "" :callback #'(lambda (text interface) Soufiane ATTIF 2 GI 12 Mini-projet Système Expert – Droits sur les logiciels (setq dr text) (setq tio (open "c:\faits.txt" :direction :output :if-exists :append)) dr )) (setq a (make-logiciel :nom nm :typ tp :droits (print a tio) (close tio) ))) (setq titre_ft (make-instance 'capi:title-pane :text "Système Expert" :font (gp:make-font-description :size 20 ))) (setq var_ft (make-instance 'capi:column-layout :description (list titre_ft texte_ft1 texte_ft2 texte_ft3))) (capi:contain var_ft) ) ;************************************************************ ;************ * ***Ajouter une règle************************* (defvar rio) (defvar texte_rg) (defun aj() (setq texte_rg (make-instance 'capi:text-input-pane :title "Règle(A (b c ...)) :" :text "" :callback #'(lambda (text interface) (setq rio (open "c:\regles.txt" :direction :output :if-exists :append)) (setq q (prog1 (read-from-string text ))) (setq a (make-regle :rg q )) Soufiane ATTIF 2 GI 13 Mini-projet Système Expert – Droits sur les logiciels (print a rio) (close rio) ))) (capi:contain texte_rg) ) (defun convert (string) (intern (string-upcase string))) ;********************************************************** ;** Construction de base règles(afficher la base de règles)** (defun constBR(fichier) (setq rio (open fichier :direction :input)) (const2 nil) ) (defun const2(liste) (setq a (read rio nil nil)) (cond ((not(equal a nil)) (const2 (cons (regle-rg a) liste))) (t liste)) ) ;******************************************************** ;* ************Satisfaction de type de logiciel************** (defun satis_type(fichier fichier2 logiciel type) (setq io (open fichier :direction :input)) (setq d (rech_droit2 type)) (setq rio (open fichier2 :direction :output :if-exists :append)) (setq a (make-logiciel :nom logiciel :typ type :droits d)) (print a rio) (close rio) (capi:display-message "vos droits sont : ~S" d) ) (defun rech_droit2(type) (setq a (read io nil nil)) Soufiane ATTIF 2 GI 14 Mini-projet Système Expert – Droits sur les logiciels (cond ((equal (droit-typ a) type) (droit-droits a)) (t (rech_droit2 type)) ) ) ;********************************************************* ;********* *************Interfaces************************** ;************* **** Interface 1 ****************************** (setq btn1 (make-instance 'capi:push-button :data "Base des règles" :callback '(int2))) (setq btn2 (make-instance 'capi:push-button :data "Base des faits" :callback '(int3))) (setq btn3 (make-instance 'capi:push-button :data "Inférence" :callback '(int4))) (setq btn4 (make-instance 'capi:push-button ; :data "quitter" :descriptor "Stop" :callback 'quit)) (setq titre (make-instance 'capi:title-pane :text "Système Expert" :background :blue :foreground :yellow :font (gp:make-font-description :size 20 ) )) Soufiane ATTIF 2 GI 15 Mini-projet Système Expert – Droits sur les logiciels (setq var1 (make-instance 'capi:column-layout :description (list titre btn1 btn2 btn3 btn4))) (defun int1() (capi:contain var1)) ;************************************************************ ****************************************************** ;****************************************Interface 2 ************************************************************* (setq btn5 (make-instance 'capi:push-button :data "Ajouter une règle" :callback '(aj))) (setq btn6 (make-instance 'capi:push-button :data "Afficher la base des règles" :callback '(constBR11 "c:\regles.txt"))) (setq btn7 (make-instance 'capi:push-button :data "Retour au menu principal" :callback '(aju))) (setq titre1 (make-instance 'capi:title-pane :text "Base des Règles" :background :blue :foreground :yellow :font (gp:make-font-description :size 20 ) )) (setq var2 (make-instance 'capi:column-layout :description (list titre1 btn5 btn6 btn7 ))) Soufiane ATTIF 2 GI 16 Mini-projet Système Expert – Droits sur les logiciels (defun int2() (capi:contain var2)) ;******************************************************* ;********** **************Interface 3 ******************** (setq btn8 (make-instance 'capi:push-button :data "Ajouter un fait" :callback '(ajft))) (setq btn9 (make-instance 'capi:push-button :data "Afficher la base des faits" :callback '(constBF10 "c:\faits.txt"))) (setq btn10 (make-instance 'capi:push-button :data "Retour au menu principal" :callback '(aju))) (setq titre2 (make-instance 'capi:title-pane :text "Base des Faits" :background :blue :foreground :yellow :font (gp:make-font-description :size 20 ) )) (setq var3 (make-instance 'capi:column-layout :description (list titre2 btn8 btn9 btn10 ))) (defun int3() (capi:contain var3)) ;********************************************************** Soufiane ATTIF 2 GI 17 Mini-projet Système Expert – Droits sur les logiciels ;*************** *******Interface 4 ************************* (setq btn11 (make-instance 'capi:push-button :data "Chainage arrière" :callback '(logiciel))) (setq btn12 (make-instance 'capi:push-button :data "Chainage avant" :callback '(logiciel2))) (setq btn13 (make-instance 'capi:push-button :data "Retour au menu principal" :callback '(ajt2))) (setq titre3 (make-instance 'capi:title-pane :text "Inférence" :background :blue :foreground :yellow :font (gp:make-font-description :size 20 ) )) (setq var4 (make-instance 'capi:column-layout :description (list titre3 btn11 btn12 btn13))) (defun int4() (capi:contain var4)) ;******************************************************************** Soufiane ATTIF 2 GI 18 Mini-projet Système Expert – Droits sur les logiciels Jeux de tests: Appel à la fonction principale se fait par la fonction : (int1) . Après, il y a une interactivité totale entre l utilisateur et le programme grâce à des interfaces. A chaque fois après la saisie d une donnée, il faut taper entrer pour que la fonction liée à la saisie s exécute. Il faut que les fichiers « faits.txt », « regles.txt » et droits.txt » soient stockés dans le répertoire C:\. explication au niveau du moteur d inférence se fait par le biais des boites de dialogues qui informent l utilisateur de l état courant et s il y a un échec ou pas. Tous les modules ont été testés. Je reste à votre entière disposition pour toute autre clarification. En ce qui suit, quelques images illustrant le processus d exécution. Soufiane ATTIF 2 GI 19 Mini-projet Système Expert – Droits sur les logiciels Soufiane ATTIF 2 GI 20 Mini-projet Système Expert – Droits sur les logiciels Soufiane ATTIF 2 GI 21