Systèmes Experts implémentation en Prolog
Définition Application capable d'effectuer dans un domaine des raisonnements logiques comparables à ceux que feraient des experts humains de ce domaine Il s'appuie sur des bases de données de faits et de connaissances, ainsi que sur un moteur d’inférences, permettant de réaliser des déductions logiques C'est avant tout un système d'aide à la décision
Composants de base Base de connaissance Moteur d’inférences Les connaissances sont propres au domaine d’expertise Règles de production si prémisse alors conclusion Moteur d’inférences Le mécanisme d’exploitation est indépendant du domaine
Moteur d’inférences Cycle de base Caractéristiques d’un moteur d’inférences Mode d’invocation des règles Régime Interactivité Capacités d’explications
Le cycle de base Phase de restriction Eliminer les connaissances trivialement inutilisables Phase de filtrage Déterminer l’ensemble de résolution de conflits (i.e les connaissances potentiellement utilisables) Phase de résolution de conflit Sélectionner la ou les connaissances qui seront effectivement exploitées lors de la phase d’exécution Par exemple, toutes les connaissances, la première, choix aléatoire, coût, intérêt, … Exécution (inférer)
Caractéristiques d’un moteur d’inférences Mode d’invocation des règles Régime Interactivité Capacités d’explications
Caractéristiques : Mode d’invocation des règles Le chaînage consistent à enchaîner des déductions logiques pour aller en direction d'une cause ou de ses effets Chaînage avant sélection d’une règle selon ses prémisses Chaînage arrière sélection d’une règle selon ses conclusions Chaînage mixte
Mode d’invocation des règles Chaînage avant Phase de restriction les faits établis Phase de filtrage les règles dont les prémisses sont vérifiées C’est une recherche indépendante de l’objectif
Mode d’invocation des règles Chaînage arrière Phase de restriction les faits à établir Phase de filtrage les règles dont la conclusion contient des faits à établir C’est une recherche dirigée par le but
Caractéristiques : Régime Irrévocable Les choix réalisés en phase de résolution de conflit ne sont jamais remis en cause Par tentatives On peut considérer plusieurs éléments dans l’ensemble de conflit Permet de remettre en cause l'application d'une règle si ce choix conduit à un échec
Caractéristiques : Moteur d’inférences interactif Interroger l’utilisateur / l’expert Obtenir des connaissances immédiatement exploitables par le moteur
Caractéristiques : Capacités d’explications Objectif renforcer la crédibilité du système Expliquer : pourquoi le moteur pose telle question comment le moteur a pu obtenir telle réponse
Prolog : un moteur d’inférences ! Mode d’invocation des règles : ? Régime : ? Interactif : ? Capacités d’explications : ?
Exemple Une base de connaissance symbolique Base des faits initiaux a, c, d, e, g, h, k On demande d’établir le fait q les règles 2, 4 et 8 forment l’ensemble de conflit On choisira par exemple la première (règle 2) cela aura pour effet de substituer à q dans la liste des faits à établir les faits i, w et j Base de règles 1. si k et w et m alors i 2. si i et w et j alors q 3. si f et h alors b 4. si a et b alors q 5. si c et h alors r 6. si r et j et m alors s 7. si g alors f 8. si w et n et o et p alors q
Implémentation de la base de connaissance en Prolog Base de règles i :- k,w,m. q :- i,w,j. q :- a,b. q :- w,n,o,p. b :- f,h. r :- c,h. s :- r,j,m. f :- g. Base des faits a. c. d. e. g. h. k.
Utilisation directe de Prolog comme moteur d’inférences Base de règles i :- k,w,m. q :- i,w,j. q :- a,b. q :- w,n,o,p. b :- f,h. r :- c,h. s :- r,j,m. f :- g. ?- q. yes ?- i no ?- q,a,i. ?- q,a,h. Base des faits a. c. d. e. g. h. k.
Comment améliorer l’interface de Prolog ? Définir la procédure effacer/1 de telle façon que le comportement globale de Prolog ne soit pas modifié effacer([]). effacer([But|AutresButs]) :- ? .
Comment améliorer l’interface de Prolog ? Définir la procédure effacer/1 de telle façon que le comportement global de Prolog ne soit pas modifié effacer([]). effacer([But|AutresButs]) :- But, effacer(AutresButs).
Comment améliorer l’interface de Prolog ? Définir une procédure frontale expertiser/1 expertiser(L) :- si(effacer(L), ecrire_succes(L), ecrire_echec(L) ).
Utilisation du « nouveau » moteur d’inférences ?- expertiser([q]). le fait q est etabli ?- expertiser([i]). le fait i n'est pas etabli ?- expertiser([q,a,i]). la conjonction de faits q et a et i n'est pas etablie ?- expertiser([q,a,h]). la conjonction de faits q et a et h est etablie
Quelques prédicats « utilitaires » ecrire_succes(L) :- print_conjonction(L,succes). ecrire_echec(L) :- print_conjonction(L,echec). print_conjonction([T],Etat) :- ! , write('le fait '), write(T), si(Etat=succes, write(' est etabli'), write(' n''est pas etabli')), nl. print_conjonction(L,Etat) :- write('la conjonction de faits '), print_conjonction(L), write(' est etablie'),write(' n''est pas etablie')), nl.
Quelques prédicats « utilitaires » print_conjonction([]). print_conjonction([T]) :- !,write(T). print_conjonction([T|Q]):- write(T), write(' et '), print_conjonction(Q). si(C,A,_):- C,!,A. si(_,_,S) :- S.
Redéfinir un moteur d’inférences « au-dessus » de Prolog Implémenter des capacités d’explications Proposer une interaction avec l’utilisateur Augmenter le pouvoir d’expression des règles
Comment redéfinir prolog « au-dessus » de Prolog ? Utiliser le prédicat rule/2 en mode (in,out) Ce prédicat met en relation la tête et le corps d’une règle ?- rule(q, Corps). Corps = [i , w , j] ; Corps = [a , b] ; Corps = [w , n , o , p] ; no
Comment redéfinir un Prolog « au dessus » de Prolog ? ReDéfinir la procédure effacer/1 de telle façon que le comportement global de Prolog ne soit pas modifié effacer([]). effacer([But|AutresButs]):- But, effacer(AutresButs). effacer([]). effacer([But|AutresButs]) :- rule(But,SousButs), effacer(SousButs), effacer(AutresButs).
clause(T,CorpsTerme) ?- clause(q,T). T = i, w, j ; T = a, b ; T = w, n, o, p ;
rule(T,CorpsListe) ?- rule(q, L). L = [i, w, j] ; L = [a, b] ; L = [w, n, o, p] ;
termeToListe(T,L) ?- termeToListe((a,b,c),L). L = [a, b, c] ;
Quelques prédicats « utilitaires » rule(T,CorpsListe) :- clause(T,CorpsTerme), termeToListe(CorpsTerme,CorpsListe). termeToListe(true,[]) :- !. termeToListe(Terme,[Terme]) :- atom(Terme),!. termeToListe(Terme,[T|Q]):- arg(1,Terme,T), arg(2,Terme,TT), termeToListe(TT,Q).
Des capacités d’explications le moteur devra justifier ses réponses en fournissant une « explication » de son raisonnement Plus précisément, suite à un succès, le moteur devra fournir la trace des inférences C’est à dire répondre au « comment » ?- expertiser([q]). Le fait q est etabli q ? a est un fait etabli b ? f ? g est un fait etabli h est un fait etabli
La Trace des inférences est une liste … ?- expertiser([q]). Le fait q est etabli q ? a est un fait etabli b ? f ? g est un fait etabli h est un fait etabli [[q, [a], [b, [f, [g]], [h]]]]
La Trace des inférences est une liste Si on efface un fait f, la trace est [f] Si on efface une règle tete :- b1,b2,…,bn la trace est la liste [tete,trace_b1,trace_b2,…, trace_bn] où trace_bi est la trace des inférences relatives à l’effacement du but bi Si on efface une conjonction de buts, la trace est la liste des traces relatives à l’effacement de chaque but
La Trace des inférences est une liste Par exemple : ·la trace résultant de l’effacement de a est [[a]] ·la trace résultant de l’effacement de q est [[q, [a], [b, [f, [g]], [h]]]] ·la trace résultant de l’effacement de q,a est [[q, [a], [b, [f, [g]], [h]]], [a]]
afficher_trace/1 afficher_trace(T) :- afficher_trace(T,0). %--------------------- afficher_trace([],_) :- !. afficher_trace([C],Ident) :- atom(C),!, tab(Ident), write(C),write(' est un fait etabli'),nl. afficher_trace([C,X|Y],Ident) :- atom(C),!, tab(Ident), write(C), write(' ?'), nl, NewIdent is Ident+4, afficher_trace(X, NewIdent), afficher_trace(Y, NewIdent). afficher_trace([X|Y], Ident) :- afficher_trace(X, Ident), afficher_trace(Y, Ident).