Download Jess
Document related concepts
no text concepts found
Transcript
Herramientas Jess Contenido Jess: Introducción Elementos básicos de programación Funcionamiento del motor de inferencias Desarrollo de aplicaciones con Jess 2 Introducción 3 Jess Historia Inspirado en CLIPS Implementado en java Desarrollado por Sandia National Laboratories, Canada (1997) Licencia comercial (educación: requiere registro) Home Edition con el libro “Jess in Action” Herramienta para el desarrollo de sistemas Expertos /SBC Esencialmente, interprete de reglas y lenguaje de script Java Diseñado para añadir reglas en sistemas software desarrollado en Java Para facilitar el desarrollo: interprete de comandos, entorno de desarrollo sobre Eclipse 4 Intérprete sistema de producción Memoria de trabajo: hechos (propiedades JavaBean) Base de reglas Motor de inferencias: adelante, RETE (atrás) Programa Jess (sin código Java) Hechos y reglas ( constructores de) (tb. funciones) Los hechos que alcanzan la memoria de trabajo determinan que reglas se pueden disparar El motor de inferencias determina que reglas y cuando se disparan Actividad guiada por datos 5 Sobre Jess Jess manual ..\Jess71p2\docs\indes.html E. Friedman-Hill. Jess in Action: Rule-based Systems in Java. Manning Publications, Greenwich 2003. ISBN 1930110898. Tutoriales, ejemplos, demos… http://www.jessrules.com/links/ 6 Instalar Jess, Stand Alone JDK 1.4 o posterior Extraer Jess71p2.zip Interfaz línea de comandos Texto C:\Jess71p2> bin\jess.bat Versión gráfica C:\Jess71p2> java -classpath lib\jess.jar jess.Console 7 Sesión Jess Jess, the Rule Engine for the Java Platform Copyright (C) 2008 Sandia Corporation Jess Version 7.1p1 8/6/2008 Jess> (printout t "El dijo \"NO\"." crlf) El dijo "NO". Jess>(exit) 8 Instalar JessDE, Entorno de desarrollo Eclipse SDK 3.1 o posterior Extraer Jess71p2/eclipse en el directorio de instalación de Eclipse Comprobar existencia "../plugins/gov.sandia.jess_7.1.0" Arrancar Eclipse Crear proyecto Java: FileNewJavaProject Crear archivo Jess con extensión "clp" ("dijoNO.clp") Carpeta src, botón derecho: FileNew 9 Sesión JessDE Editar fichero "dijoNO.clp": (printout t "El dijo \"NO\"." crlf) Ejecutar: Ventana edición, botón derecho RunAs JessApplication Consola: Jess, the Rule Engine for the Java Platform Copyright (C) 2008 Sandia Corporation Jess Version 7.1p2 11/5/2008 El dijo "NO". 10 Elementos básicos de programación Tipos de datos Funciones Constructores 11 Tipos de datos (I) Números: integer, float -32, 15.09, -32.3e-7 Símbolos: secuencia de letras, dígitos, $*.=+/<>_? # No puede comenzar con dígito, $?. Válidos: Hola, hola, sequence#1, _abc, nil No válidos: a&b, 127A 12 Tipos de datos (II) Strings "Hola, mundo", "El dijo \"NO\"." Listas (+ 3 2), (a b c), ("Hola, mundo"), () (deftemplate foo (slot bar)) 13 Hechos Ordenados: no requieren plantilla (status walking) (una-persona "Luis Prieto" hombre 53 1.83) No ordenados: requieren plantilla (persona (nombre "Luis Prieto") (sexo hombre) (edad 53) (talla 1.83)) 14 Operaciones con hechos (1) Añadir un hecho a la memoria de trabajo Jess> (assert (una-persona "Luis Prieto" hombre 53)) <Fact-0> Examinar en la memoria de trabajo Jess> (facts) f-0 (MAIN::una-persona "Luis Prieto" hombre 53) For a total of 1 facts in module MAIN. Eliminar un hecho de la memoria de trabajo Jess> (retract 0) TRUE 15 Plantillas para hechos ordenados Jess> (deftemplate persona "una persona concreta" (slot nombre) (slot sexo) (slot edad (type INTEGER)) (slot talla (default 1.70))) Jess> (assert (persona (nombre "Ana Rodriguez") (sexo mujer) (edad 52))) <Fact-1> 16 Examinar hechos Jess> (facts) f-1 (MAIN::persona (nombre "Ana Rodriguez") (sexo mujer) (edad 52) (talla 1.7)) For a total of 1 facts in module MAIN. Jess> (watch facts) TRUE Jess> (modify 1 (edad 25)) <=> f-1 (MAIN::persona (nombre "Ana Rodriguez") (sexo mujer) (edad 25) (talla 1.7)) <Fact-1> 17 Agrupar hechos (deffacts varias-personas "normalmente en archivo" (persona (nombre "Juan Soto") (sexo hombre) (edad 32) (talla 1.83)) (persona (nombre "Javier Ruiz") (sexo hombre) (edad 43))) Para asertar: (reset) 18 Asertar hechos deffacts Después de evaluar deffacts (normalmente cargar fichero) Jess> (reset) ==> f-0 (MAIN::initial-fact) ==> f-1 (MAIN::persona (nombre "Juan Soto") (sexo hombre) (edad 32) (talla 1.83)) ==> f-2 (MAIN::persona (nombre "Javier Ruiz") (sexo hombre) (edad 43) (talla 1.7)) TRUE 19 Funciones Jess> (printout t "El dijo \"NO\"." crlf) El dijo "NO". Jess> (deffunction hipotenusa (?a ?b) (sqrt (+ (* ?a ?a) (* ?b ?b)))) TRUE Jess> (hipotenusa 4 3) 5.0 (deffunction inicializar () (reset) (assert (comienzo))) 20 Crear reglas (defrule <nombre-regla> [<comentario>] [<declaración>] <conditional-element>* => <acciones>*) 21 Ejemplo de Regla (defrule tareas-domingo "Cosas que hacer en domingo" (salience 0) (hoy es domingo) (es un dia soleado) => (assert (tarea lavar coche)) (assert (tarea cortar cesped))) 22 Otro ejemplo de regla (deftemplate emergencia (slot tipo)) (deftemplate respuesta (slot accion)) (defrule emergencia-fuego "Un ejemplo de regla" (emergencia (tipo fuego)) => (assert (respuesta (accion activar-dispersores)))) 23 Crear proyecto “IntroduccionJess“ con fichero "EjemploFuego.clp" (deftemplate emergencia (slot tipo)) (deftemplate respuesta (slot accion)) (defrule emergencia-fuego "Un ejemplo de regla" (emergencia (tipo fuego)) => (assert (respuesta (accion activar-dispersores)))) (watch facts) (watch activations) (reset) (assert (emergencia (tipo fuego))) (run) 24 Disparo de regla RunASJessApplication Jess, the Rule Engine for the Java Platform Copyright (C) 2008 Sandia Corporation Jess Version 7.1p2 11/5/2008 ==> f-0 (MAIN::initial-fact) ;reset ==> f-1 (MAIN::emergencia (tipo fuego)) ;assert ==> Activation: MAIN::emergencia-fuego : f-1 ;run ==> f-2 (MAIN::respuesta (accion activar-dispersores)) 25 Variables en patrones I añadir al proyecto (clear) "Variables1.clp" ;elimina hechos, deffacts, defrules, reglas, activaciones… (deftemplate persona (deffacts personas (persona (nombre (persona (nombre (persona (nombre (persona (nombre (slot nombre) (slot ojos) (slot pelo)) Julia) (ojos azules) (pelo pelirroja)) Juan) (ojos verdes) (pelo rubio)) Javier) (ojos azules) (pelo moreno)) Jesus) (ojos verdes) (pelo rubio))) (defrule encontrar-ojos-azules (persona (nombre ?nombre) (ojos azules)) => (printout t ?nombre " tiene los ojos azules." crlf)) (reset) (run) 26 Encontrar ojos azules RunASJessApplication Jess, the Rule Engine for the Java Platform Copyright (C) 2008 Sandia Corporation Jess Version 7.1p2 11/5/2008 Javier tiene los ojos azules. Julia tiene los ojos azules. 27 Variables en patrones II añadir al proyecto "Variables2.clp" (clear) (deftemplate persona (slot nombre) (slot ojos)(slot pelo)) (deftemplate encontrar (slot ojos)) (deffacts personas (persona (nombre Julia) (ojos azules) (pelo pelirroja)) (persona (nombre Juan) (ojos verdes) (pelo rubio)) (persona (nombre Javier) (ojos azules) (pelo moreno)) (persona (nombre Jesus) (ojos verdes) (pelo rubio))) (defrule encontrar-ojos (encontrar (ojos ?ojos)) (persona (nombre ?nombre) (ojos ?ojos)) => (printout t ?nombre " tiene ojos " ?ojos "." crlf)) (reset) (assert (encontrar (ojos azules))) (assert (encontrar (ojos verdes))) (run) 28 Encontrar ojos azules y verdes RunASJessApplication Jess, the Rule Engine for the Java Platform Copyright (C) 2008 Sandia Corporation Jess Version 7.1p2 11/5/2008 Jesus tiene ojos verdes. Juan tiene ojos verdes. Javier tiene ojos azules. Julia tiene ojos azules. 29 Otras variables en las reglas Mudas (?), multicampo(?$) Hecho: (do washing on monday) Patrones (do (do (do (do (do (do (do ?job on ?day) ? ? monday) ? on ?) ? ? ?day) $?) ;multicampo muda $? monday) ?chore $?when) ; $?when (on monday) 30 Eliminar hechos desde las reglas (defrule do-a-chore (today is ?day) ?chore <- (do ?job on ?day) ;indice del hecho => (printout t ?job " done") (retract ?chore) ) 31 Mas sobre variables Las variables también se pueden utilizar como nombres de contenedores de valores Como en lenguaje imperativo No tipadas No (siempre) se declaran Se les asigna valor (ligadura) con la función bind Se eliminan con (reset) 32 Ligadura, uso de variables Jess> (bind ?x "Un valor") "Un valor" Jess> ?x "Un valor" Jess> (bind ?x 2) 2 Jess> (+ ?x 10) 12 Jess> ?x 2 Jess> (reset) TRUE Jess> ?x Jess reported an error in routine Context.getVariable. Message: no such variable x. Program text: ?x at line 8. Jess> 33 Flujo de control apply—Calls a function on a given set of arguments build—Parses and executes a function call from a string eval—Parses and executes a function call from a string foreach—Executes a block of code once for each item in a list if/then/else—Chooses among alternative courses of action progn—Executes a group of function calls while—Executes a block of code while an expression is true 34 Ejemplo Jess> (deffunction min ($?args) "Compute the smallest of a list of positive numbers" (bind ?minval (nth$ 1 ?args)) (foreach ?n ?args (if (< ?n ?minval) then (bind ?minval ?n))) (return ?minval)) TRUE Jess> (min 10 100 77 6 43) 6 35 Variables globales Hay que declararlas, dando valor inicial Empiezan y terminan con * No se destruyen con (reset) 36 Ligadura, uso de variables globales Jess> (defglobal ?*x* = 3) TRUE Jess> ?*x* 3 Jess> (bind ?*x* 4) 4 Jess> ?*x* 4 Jess> (reset) ;; Jess will reset ?*x* to its initial value of 3 TRUE Jess> ?*x* 3 Jess> (bind ?*x* 4) 4 Jess> (set-reset-globals nil) FALSE Jess> (reset) ;; This time, ?*x* will not be changed. TRUE Jess> ?*x* 4 37 Funcionamiento del motor de inferencias 38 Arquitectura del Interprete Reglas (fact f1) (fact f2) (fact f3) Memoria de trabajo (regla r3) (regla r1) (regla r2) Base de reglas Motor de inferencias Reconocedor de Patrones (f1 f2) r1 Motor de ejecución (f1 f2) r1 (f2 f3) r2 Agenda Adaptado de E. Friedman-Hill , “Jess in Action”, 2003 39 Arquitectura del Interprete Reglas (fact f1) (fact f2) (fact f3) Memoria de trabajo (regla r3) (regla r1) (regla r2) Base de reglas Ciclo básico: Motor de inferencias Reconocedor de Patrones (f1 f2) r1 Motor de ejecución (f1 f2) r1 (f2 f3) r2 Agenda Reconocimiento Acción 40 Elementos del motor de inferencias Reconocedor Patrones Agenda Decidir que reglas se activan en base al contenido de la memoria de trabajo (filtrado) Aplicar estrategia de resolución de conflictos para decidir que regla se dispara primero (de las activadas) Motor de ejecución Realiza la acción de la primera regla de la agenda En Jess: entorno de ejecución del lenguaje de programación 41 Reconocedor patrones (I) Aproximación Naive En cada ciclo, comparar LHS reglas con hechos en Memoria de trabajo Comportamiento en el peor caso: O(RFP) R: número total de reglas F: número total de hechos P: número medio de patrones por regla 42 Reconocedor patrones (II) Motivo de la ineficiencia Ineficiencia de la aproximación Naive El conjunto de reglas es estable La memoria de trabajo cambia PERO: (habitualmente) el porcentaje de cambio por ciclo es (muy) pequeño La mayoría de los patrones que se satisfacen en un ciclo también lo hacen en el siguiente Alternativa Algoritmo que recuerde activaciones entre ciclos, actualizando patrones que confronten con los hechos que han cambiado 43 Algoritmo de RETE Representa las reglas como datos (red RETE) El compilador crea la red RETE a partir de las reglas La red RETE se puede asimilar a máquina de estados que consume modificaciones de hechos La red recuerda estados anteriores Charles L. Forgy, Artificial Intelligence 19 (1982), 17-37. 44 Ejemplo (defrule ejemplo-1 (x (a ?v1)) (y (b ?v1)) => (assert (p)) ) (defrule ejemplo-2 (x (a ?v2)) (y (b ?v2)) (z) => (assert (q)) ) 45 Red RETE (sin optimizar) x? y? LEFT.0.a= RIGH.b? x? y? z? Pattern network LEFT.0.a= RIGH.b? Joint network Ejemplo-1 Adaptado de E. Friedman-Hill , “Jess in Action”, 2003 Ejemplo-2 46 Elementos red RETE Nodos “patrón”: entrada red =x? comprueba que la cabeza del hecho es x Los hechos que superan el test se envían a la salida del nodo Nodos “Join”: representan confrontaciones Dos entradas (y dos memorias) Izquierda: grupos de uno o más hechos que confrontan Derecha: un único hecho Salida: grupos de dos o más hechos que confrontan Nodos terminales: representan reglas Representan reglas Registran activaciones en la agenda 47 Funcionamiento de la red RETE Cada nuevo hecho se presenta a la “Red de Patrones” El nodo Join Si añadimos f1 (x (a 1)) y f2 (y (b 1)) , son aceptados por los correspondientes nodos y enviados a los Join Crea los pares de patrones que confrontan: f1,f2 Los envía a la salida: ejemplo-1 (activación) y siguiente Join Si añadimos nuevo hecho f3 (z (c 2)) El nodo Join crea el triplete f1, f2, f3 sin necesidad de procesar x e y. Lo envía a la salida: se activa ejemplo-2 48 Optimización: compartir nodos patrón x? LEFT.0.a= RIGH.b? y? z? LEFT.0.a= RIGH.b? Ejemplo-1 Ejemplo-2 49 Optimización: compartir nodos Join x? y? z? LEFT.0.a= RIGH.b? Ejemplo-1 Ejemplo-2 50 Eficiencia algoritmo de RETE Primer ciclo (reset) Similar aproximación Naive Caso medio: Dependencia con la implementación (indexación, estructuras y tamaño memoria) Caso medio Jess: O(R’F’P’) R’ < R F’ < número de hechos que cambian en cada iteración 1 < P’ < P 51 Examinar red RETE (watch compilations) MAIN::ejemplo-1: +1+1+1+2+t MAIN::ejemplo-2: =1=1=1=2+1+2+t (view) Muestra red RETE Nodo right to left adapter: conecta el primer patrón de una regla a la red (matches ejemplo-1) >>> [Node2 ntests=1 [Test2Simple: test=EQ; tokenIdx=0;leftIdx=0;rightIdx=0] ;usecount = 2;blessed] *** Left Memory: [Token: size=1;sortcode=1;negcnt=0 f-1 (MAIN::x (a 3));] *** RightMemory: [Token: size=1;sortcode=2;negcnt=0 f-2 (MAIN::y (b 3));] 52 Añadir al proyecto “EjemploRETE.clp" (clear) ; Adaptado de E. Friedman-Hill , “Jess in Action”, 2003 (watch compilations) (deftemplate x (slot a)) (deftemplate y (slot b)) (deftemplate z (slot c)) (deffacts hechos-iniciales "algunos hechos" (x (a 3)) (y (b 3)) (z (c 4))) (defrule ejemplo-1 (x (a ?v1)) (y (b ?v1)) => (assert (p))) (defrule ejemplo-2 (x (a ?v2)) (y (b ?v2)) (view) (reset) (matches ejemplo-1) (run) (facts) (z) => (assert (q))) 53 Desarrollo de aplicaciones con Jess 54 Desarrollo de aplicaciones 1. 2. 3. 4. 5. 6. 7. Pure Jess language scripts. No Java code at all. Pure Jess language scripts, but the scripts access Java APIs. Mostly Jess language scripts, but some custom Java code in the form of new Jess commands written in Java. Half Jess language scripts, with a substantial amount of Java code providing custom commands and APIs; main() provided by Jess. Half Jess language scripts, with a substantial amount of Java code providing custom commands and APIs; main() provided by you or an application server. Mostly Java code, which loads Jess language scripts at runtime. All Java code, which manipulates Jess entirely through its Java API. 55 Jess y JavaBeans: Shadow facts Hechos no ordenados. Permiten incluir objetos Java (JavaBeans) en memoria de trabajo Funciones básicas: defclass crea deftemplate a partir de una clase JavaBean definstance añade un objeto JavaBean a la memoria de trabajo 56 Ejemplo de JavaBean con una propiedad: brightness public class DimmerSwitch { private int brightness = 0; public int getBrightness() { return brightness; } public void setBrightness(int b) { brightness = b; adjustTriac(b); } private void adjustTriac(int brightness) { // Code not shown } } Propuesto en E. Friedman-Hill, Capítulo 6, “Jess in Action”, 2003. 57 Creación de la plantilla para DimmerSwitch Jess> (defclass dimmer DimmerSwitch) DimmerSwitch Jess> (ppdeftemplate dimmer) "(deftemplate MAIN::dimmer extends MAIN::__fact \"$JAVA-OBJECT$ DimmerSwitch\" (slot brightness (default <External-Address:jess.SerializablePD>)) (slot class (default <External-Address:jess.SerializablePD>)) (slot OBJECT (type 2048)))“ Antes: compilar clase DimmerSwitch, .class en CLASSPATH Nombre de la plantilla: dimmer 58 Crear instancia de JavaBean (Jess> (bind ?ds (new DimmerSwitch)) <External-Address:DimmerSwitch> Jess> new crea una instancia de un objeto Java accesible al entorno Jess, pero no un hecho 59 Añadir instancia a la memoria de trabajo Jess> (definstance dimmer ?ds static) <Fact-0> Jess> (facts) f-0 (MAIN::dimmer (brightness 0) (class <External-Address:java.lang.Class>) (OBJECT <External-Address:DimmerSwitch>)) For a total of 1 facts. 60 Shadow facts y reglas En la Memoria de trabajo, los sahdowfacts se comportan como cualquier hecho no ordenado Las reglas interaccionan con ellos como con cualquier hecho no ordenado Examinando los patrones de una regla, no hay forma de saber si confrontaran con un shadowfact o con un hecho no ordenado 61 Shadow facts estáticos/dinámicos La representación de un JavaBean en la Memoria de trabajo puede ser Estática: cambios en los valores del objeto no se propagan a la memoria de trabajo Dinámica: le memoria de trabajo se actualiza al cambiar el valor de una propiedad del objeto En el ejemplo, estática 62 Cambios en shadow facts estáticos (I) Jess> (call ?ds setBrightness 10) ;modifica valor en objeto Java Jess> (facts) f-0 (MAIN::dimmer (brightness 0) (class <External-Address:java.lang.Class>) (OBJECT <External-Address:DimmerSwitch>)) For a total of 1 facts. No se actualiza el valor en la memoria de trabajo 63 Cambios en shadow facts estáticos (II) (reset) actualiza los shadow facts con los valores actuales del objeto java Jess> (reset) TRUE Jess> (facts) f-0 (MAIN::initial-fact) f-1 (MAIN::simple (brightness 10) (class <External-Address:java.lang.Class>) (OBJECT <External-Address:DimmerSwitch>)) For a total of 2 facts. 64 Ejemplo de JavaBean que notifica cambios (I) import java.beans.*; public class DimmerSwitchDynamic { private int brightness = 0; public int getBrightness() { return brightness; } public void setBrightness(int b) { int old = brightness; Calls fireProperty-Change to indicate brightness property brightness = b; is changing adjustTriac(b); pcs.firePropertyChange("brightness", new Integer(old), (new Integer(b))); } 65 Ejemplo de JavaBean que notifica cambios (II) private void adjustTriac(int brightness) { // Code not shown } private PropertyChangeSupport pcs = new PropertyChangeSupport(this); public void addPropertyChangeListener(PropertyChangeListener p) { Boilerplate pcs.addPropertyChangeListener(p); code you can reuse in } JavaBeans public void removePropertyChangeListener(PropertyChangeListener p) { pcs.removePropertyChangeListener(p); } } 66 Añadir instancia dinámica a Memoria de trabajo Jess> (clear) ;eliminar definiciones anteriores TRUE Jess> (defclass dimmer DimmerSwitchDynamic) ;crea plantilla dimmer Jess> (bind ?ds (new DimmerSwitchDynamic)) ;crea instancia Java <External-Address:DimmerSwitchDynamic> Jess> (definstance dimmer ?ds) ;hecho Jess dynamic por defecto <Fact-0> Jess> (facts) f-0 (MAIN::dimmer (brightness 0) (class <External-Address:java.lang.Class>) (OBJECT <External-Address:DimmerSwitchDynamic>)) For a total of 1 facts. 67 Demostración shadow fact dinámico Jess> (call ?ds setBrightness 10) ;cambia propiedad brightness Jess> (facts) f-0 (MAIN::dimmer (brightness 10) (class <External-Address:java.lang.Class>) (OBJECT <External-Address:DimmerSwitchDynamic>)) For a total of 1 facts. 68 Shadow facts y funciones de la Memoria de trabajo La mayoría de funciones y constructores trabajan con los shadow facts igual que con los hechos, pero No utilizar assert, sino definstance Se puede utilizar retract No utilizar deffacts, pero cada definstance se comporta como deffacts (se reinicializa con reset) Modify actualiza propiedad en el objeto javaBean (también en estáticos) 69 Se puede hacer sin JavaBeans Funciones de creación, acceso, manipulación de objetos Java ../Jess71p2/docs/java.html 70