Une introduction à Jrules Riche documentation à : C:\ILOG\JRules35\docs\pdf H. Lounis 1 Caractéristiques 100% Java librairie ; S’intègre à des applications Java : supporte des expressions Java, … Utilise et teste n’importe quelle classe Java ; Opérateurs logiques ; Regroupement de règles ; Truth Maintenance system ; Raisonnement temporel ; Environnement graphique de manipulation des règles, débogage ; Syntax checker ; Compilation des règles ; Générateur de documentation (javadoc). H. Lounis 2 1 Introduction Base de connaissances Connaissances factuelles Connaissances déductives Base d’objets Base de règles Classes Java Règles JRules .ilr Interface JRules-Java .java .java .java .java Parsing IlrContext javac Moteur d ’inférence Ruleset Règles tangibles Règle 1 Règle 2 Règle n Agenda Règle déclenchée .class .class .class .class Objet 1 Objet 2 Objet 3 Objet n Mémoire de travail 2 Patrons Form(color==black; shape==square); Form(shape==triangle); Form(color==gray; shape==circle); ~Form(color==gray; shape==circle); For m color : {w hite, gray, black} s hape : {s tar, s qaure, triangle, circle, ellips e} H. Lounis 5 Mémoire de travail (base de faits) Actions assert Form(gray,circle); H. Lounis 6 3 Règles when { Form(color==black; shape==circle); Form(color==white; shape==square); } when then { { ?x: Form(color==gray; shape==rectangle); assert Form(white,triangle); } assert Form(black,ellipse); then } { retract ?x; assert Form(white,rectangle); } H. Lounis 7 Ensemble de règles C:\ILOG\JRules35\examples\applets\data\getstart.ilr H. Lounis 8 4 Initialiser la mémoire de travail rule initialize { when { ?s: Form(shape==star); } then { retract ?s; assert Form(black,triangle); assert Form(white,ellipse); assert Form(black,square); assert Form(black,square); } }; H. Lounis 9 Une démo C:/ILOG/JRules35/examples/applets/getstart.html H. Lounis 10 5 Instance de règles Mémoire de travail rule rule1 { when { Form( color == white; shape == square ); Form( shape == circle); } then {...} } Instances de règles : rule1(A, C) rule1(A, D) rule1(B, C) rule1(B, D) H. Lounis 11 Agenda (instances de règles éligibles)) rule second { priority = high; rule init { when { foo(); } then { when { foo(); gee(); foo(); } then { System.out.println("second"); } }; assert bar(); assert gee(); } }; rule third { priority = high; rule last { when { gee(); } then { System.out.println("last"); } }; rule first { priority = high; when { foo(); gee(); foo(); } then { System.out.println("first"); } }; when { foo(); bar(); foo(); } then { System.out.println("third"); } }; Pourquoi cet ordre : init, first, second, third, last (si initialement foo est le seul fait connu) ? Refraction Priorité Recency Lexicography H. Lounis 12 6 Règle dans Jrules Déclenchables en chaînage avant Actions Asserting an Object ; Retracting an Object ; Modifying an Object ; … Raisonnement dans Jrules Chaînage avant ; Les règles sont disposées en un réseau RETE (p.62 du document user’s manual) ; Agenda : instances de règle éligibles ; Critères d ’ordonnancement des règles dans l’agenda : Réfraction : une règle déjà exécutée ne peut être réinsérée dans l ’agenda que s ’il y a une nouveau fait qui se produit ; Priorité Recency : l ’objet le plus récemment modifié ou inséré ; Ordre lexicographique des noms de règles. 7 Exemple de règles Exemple de règles H. Lounis 16 8 Exemple: Diagnostic d ’une lampe (1) /** * Règle pour gérer le cas d'une seule lampe défectueuse */ rule Lampe { when { ?x: Lampe(etat == false; ?p: piece); exists Lampe(etat == true; piece == ?p); } then { assert Conseil("Changer cette Lampe"); } }; La mpe e ta t : boole a n pie ce : int Exemple: Diagnostic d ’une lampe (2) /** * Règle pour gérer le cas des lampes défectueuses de la même pièce */ rule Piece { when { ?x: Lampe(etat == false; ?p: piece); not Lampe(etat == true; piece == ?p); exists Lampe(etat == true; piece != ?p); } then { assert Conseil("Vérifier l'interrupteur ou le fusible de la pièce"); } }; 9 Exemple: Diagnostic d ’une lampe (3) /** * Règle pour gérer le cas de toutes les lampes défectueuses */ rule Appartement { when { ?x: Lampe(etat == false; ?p: piece); not Lampe(etat == true; piece == ?p); not Lampe(etat == true; piece != ?p); } then { assert Conseil("Appeler la compagnie d'électricité"); } }; Grammaire BNF de Jrules Chaque groupe de règles est défini dans une unité d ’entrée – RulesetDefinition ::= ( ImportDefinition )* ( SetupDefinition )? ( RuleDefinition )* Une règle en Jrules: – RuleDefinition ::= "rule" Identifier "{" RuleParameters RuleConditions RuleActions "};" 10 Exemple: Structure d’un programme package stocks; Classes Java ; Application (Main class Java) ; Règles. import java.io.*; import java.util.*; import ilog.rules.engine.*; import stocks.*; setup { class Main assert Stock("SUNW",101.5,90.25); { assert Stock("NT",11.5,19.25); public static void main(String[] args) { assert Stock("SU",271.5,300.25); String filename = "stocks.ilr"; assert Stock("SNW",121.5,93.25); IlrRuleset ruleset = new IlrRuleset(); assert Stock("SW",131.5,120.25); } boolean parsed = ruleset.parseFileName(filename); if (!parsed) rule PrintPercentStockChange { { priority = ?p; System.out.println("Parsing not OK."); when { return; ?s:Stock(?c:currentPrice; ?l:closingPrice; } ?p:(?c-?l)/(.01*?l)); IlrContext context = new IlrContext(ruleset); } int nrules = context.fireAllRules(); then { } System.out.println("Stock " + ?s.symbol + " % change " + ?p); } } }; … Exemple supplémentaire Agent nettoyeur H. Lounis 22 11