Optimisation Algorithme de RETE C.Forgy, 1982, Carnegie Mellon
Cycle de base d un moteur d inférence Base de F a i t s 1 Moteur d inférence DETECTION CHOIX DEDUCTION 3 3 2 Base de C on n ai s s a n ce s
Exemple Règle (règle 1 (A a1 = 12 a2 =?x) (B b1 =?x) -> (action) ) Faits (A a1 = 12 a2 = 13) (B b1 = 13 b2 = 14) (A a1 = 12 a2 = 14) (B b1 = 14 b2 = 16) (A a1 = 16 a2 = 13)
Exercice Règle (regle_1 (A a1 = 12 a2 =?x) (B b1 =?x b2 =?y) (C c2 =?y) -> (action) ) Fait (A1 a1 = 12 a2 = 13) (B1 b1 = 13 b2 = 14) (C1 c1 = 15 c2 = 3) (A2 a1 = 12 a2 = 14) (B2 b1 = 14 b2 = 16) (C2 c1 = 12 c2 = 16) (A3 a1 = 16 a2 = 13) (C3 c1 = 13 c2 = 15)
Exemple : ajout fait Contenu initial de la base de fait (A1 a1 = 12 a2 = 13) (B1 b1 = 13 b2 = 14) (A2 a1 = 12 a2 = 14) (B2 b1 = 14 b2 = 16) (A3 a1 = 16 a2 = 13) Conséquence sur l arbre de l ajout du fait (B3 b1= 13 b2 = 5) Class = A a1 = 12 A1 A2 Class = B B1 B2 a2 = b1 A1 A2 B1 B2
Optimisation Respecter l ordre des conditions communes à différentes règles. Conditions les plus discriminantes en premier Dans l ordre des prémisses Dans l ordre des tests pour une prémisse
Exercice Soit la règle R1 : (R1 (A a1 = 3 a2 =?x) (B b1 = 2 b2 =?y b3 =?x) (C c1 =?y) ) Soit la base de faits contenant : 5 objets A dont a1 = 3 et a2 = 10 1 objet B dont b1 = 2 et b2 = 7 et b3 = 10 1 objet B dont b1 = 2 et b2 = 4 et b3 = 10 28 objets B dont b1 = 2 et b2 = 8 et b3 = 10 1 objet C dont c1 = 4 Calculer le nombre de tests nécessaires dans le cas ou un objet de type C (c1 = 7) est ajouté Proposer une réécriture de la règle pour améliorer ses performances.
ILOG RULES Générateur de Systèmes Experts
Rules Objectif Exemple Calculer une factorielle en limitant les calculs Méthode Constitution d une base de règles pour : Gérer les demandes de l utilisateur Calculer la valeur d une factorielle demandée Gérer l affichage du résultat Constitution d une base de faits: Demande courante de l utilisateur Valeur des factorielles déjà connues
Introduction Présentation par Ilog : A C++ component for real-time data flow control and decision support systems Générateur de systèmes experts Langage de programmation des règles Moteur d inférence Gestion dynamique des règles Facilite l intégration d un système expert dans une application Manipulation directe des objets de l application Intégration de code dans les règles Compilateur
Introduction Ilog Rules Contexte mémoire de travail Rules et C++ Ilog Rules Programme classe c++ Déclenchement d'une règle Agenda base de règles
Introduction Compilateur Compilateur Ilog Rules fichier source Ilog Rules code c++ c++ header files code c++ c++ header files Compilateur c++ Compilateur c++ fichier objet librairie Ilog Rules fichier objet autre librairie linker executable
Rules Les faits Syntaxe C++ class nom_class : class_père { type_attribut_1 _attribut_1 type_attribut_2 _attribut_2 type_attribut_3 _attribut_3 Syntaxe Rules (defimplementation nom_class (class_père) ( ( attribut_1 type {type_attribut_1} ) ( attribut_2 type {type_attribut_2} ) ) ) public : type_attribut_1 getattribut_1() void setattribut_1(type_attribut_1)... } enum MesValeur {valeur_1 valeur_2} (define_external_constant valeur_1 valeur_2)
Rules Les règles Mot clé : defrule identifiant : nom règle priorité Statique : une constante Prédéfinie : (defrule nom_regle priorite ( liste des premisses) -> (liste des actions) ) minimum(-32767), low (-16384), default (0), high (16384), maximum (32767) Dynamique : une valeur issue de la règle
Expression des Prémisses Variable issue d'une prémisse?objet1:(class_objet attribut1 operateur1 valeur1... attributn operateurn valeurn ) création (bind laclass?lavariable {expression} ) opérateur de comparaison comparateurs mathématiques opérateurs complexes création d'opérateurs
Opérateurs La négation Négation par l'abscence Mot clé : not Pas d appariement possible sur un objet ( not ( class_objet attribut_1 operateur_1 valeur_1 attribut_2 operateur_2 valeur_2 ) )
Opérateurs Opèrateurs complexes Tester l'existence (exists (class_objet attribut1 operateur1 valeur1... attributn operateurn valeurn )) Tester le nombre d'instances (count test (class_objet attribut1 operateur1 valeur1... attributn operateurn valeurn ))
Opérateurs Création d opérateurs Mot clé : defpredicate deux arguments code c++ (defpredicate predicat_rules { code c++}?arg1 type_arg1?arg2 type_arg2 ) (defpredicate streq {strcmp(?arg1,?arg2)==0}?arg1 string?arg2 string) (defpredicate notstreq {strcmp(?arg1,?arg2)!=0}?arg1 string?arg2 string)
Action Modification du contexte Ajouter (assert (class_objet attribut_1 = valeur_1 ) Retirer (retract instance_objet) Modifier attribut_2 = valeur_2) (modify instance _objet attribut_1= valeur_1 attribut_2 = valeur_2 )
Action Intégration de code Syntaxe : { mon code C++ } Utilisation des variables locales {?mavariable->mamethode(?autrevariable);} Respect de la syntaxe C++. Pas de compilation par le compilateur Rules Suppose une mise à jour des variables modifiées. (update?mavariablemodifiee)
Rules Déclaration Structure fichier Ilog Rules : { // description entête } /*liste des fichiers c++ utilisés*/ //== Définition objet Rules == ( liste des déclarations d objets Rules) /*déclaration des objets nécessaires à la base*/ //==Définition règles Rules == (defruleset mabase (liste des règles) /* déclaration des règles*/ ) // fin de mabase ) (defruleset mabase (defpacket premierpacket (defrule regle1 ) (defrule regle2 ) (defrule regle3 ) ) // fin de premierpacket (defpacket deuxiemepacket (defrule regle4 ) (defrule regle5 ) (defrule regle6 ) ) // fin de deuxiemepacket ) // fin de mabase
Rules Déclenchement d un cycle d inférence instance_rules->fireallrules(); Déclenchement d une règle instance_rules->firerule (); Exemple : Void main (int argc, char* argv[]) { mabase *context = new mabase(); context->firerule(); context->fireallrules(); } Appel externe
Rules Traitement des règles par paquet instance_rules->activatepacket(nompacket); instance_rules->deactivatepacket(nompacket); instance_rules->firepacket(nompacket); Exemple : Void main (int argc, char* argv[]) { mabase *context = new mabase(); // première méthode context->activatepacket(premierpacket); context->fireallrules(); context->deactivatepacket(premierpacket); // deuxième méthode context->firepacket(premierpacket); } Appel externe
Appel externe Ajout d objets dans un contexte instance_rules->assert(instance_objet); Retrait d objets d un contexte instance_rules->retract(instance_objet); Modification d objets dans un contexte instance_rules->modify_nomattribut(i_o, nouvelle_valeur_attribut);