Herramientascalonso/MUI-TIC/Herramientas... · 2009-10-20 · Crear archivo Jess con extensión...
Transcript of Herramientascalonso/MUI-TIC/Herramientas... · 2009-10-20 · Crear archivo Jess con extensión...
2
Contenido
Jess: Introducción Elementos básicos de programación Funcionamiento del motor de inferencias Desarrollo de aplicaciones con Jess
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áficaC:\Jess71p2> java -classpath lib\jess.jar
jess.Console
7
Sesión Jess
Jess, the Rule Engine for the Java PlatformCopyright (C) 2008 Sandia CorporationJess 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 derechoRunAs JessApplication
Consola:Jess, the Rule Engine for the Java PlatformCopyright (C) 2008 Sandia CorporationJess Version 7.1p2 11/5/2008
El dijo "NO". 10
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 trabajoJess> (assert (una-persona "Luis Prieto" hombre 53))<Fact-0>
Examinar en la memoria de trabajoJess> (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 trabajoJess> (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))))TRUEJess> (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 PlatformCopyright (C) 2008 Sandia CorporationJess 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 Iañadir al proyecto "Variables1.clp"
(clear) ;elimina hechos, deffacts, defrules, reglas, activaciones…
(deftemplate persona (slot nombre) (slot ojos) (slot pelo))
(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-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 PlatformCopyright (C) 2008 Sandia CorporationJess Version 7.1p2 11/5/2008
Javier tiene los ojos azules.Julia tiene los ojos azules.
27
Variables en patrones IIañ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 PlatformCopyright (C) 2008 Sandia CorporationJess 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 ?job on ?day)(do ? ? monday)(do ? on ?)(do ? ? ?day)(do $?) ;multicampo muda(do $? monday)(do ?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)2Jess> (+ ?x 10)12Jess> ?x2Jess> (reset)TRUEJess> ?xJess 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))TRUEJess> (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)TRUEJess> ?*x*3Jess> (bind ?*x* 4)4Jess> ?*x*4Jess> (reset) ;; Jess will reset ?*x* to its initial value of 3TRUEJess> ?*x*3Jess> (bind ?*x* 4)4Jess> (set-reset-globals nil)FALSEJess> (reset) ;; This time, ?*x* will not be changed.TRUEJess> ?*x*4
37
Motor de inferencias
Arquitectura del Interprete Reglas
39
(fact f1)(fact f2)(fact f3)
Memoria de trabajo
(regla r3)(regla r1)(regla r2)
Base de reglas
(f1 f2) r1
Motor deejecución
Reconocedorde Patrones
Adaptado de E. Friedman-Hill , “Jess in Action”, 2003
(f1 f2) r1(f2 f3) r2
Agenda
Motor de inferencias
Arquitectura del Interprete Reglas
40
(f1 f2) r1
Motor deejecución
(f1 f2) r1(f2 f3) r2
Agenda
Reconocimiento AcciónCiclo básico:
Reconocedorde Patrones
(fact f1)(fact f2)(fact f3)
Memoria de trabajo
(regla r3)(regla r1)(regla r2)
Base de reglas
Elementos del motor de inferencias
Reconocedor Patrones Decidir que reglas se activan en base al contenido de
la memoria de trabajo (filtrado)
Agenda 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 El conjunto de reglas es estable La memoria de trabajo cambia PERO: (habitualmente) el porcentaje de cambio por
ciclo es (muy) pequeño
Ineficiencia de la aproximación Naive 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)
46
x? y? x? y? z?
LEFT.0.a=RIGH.b?
LEFT.0.a=RIGH.b?
Ejemplo-1
Ejemplo-2
Patternnetwork
Jointnetwork
Adaptado de E. Friedman-Hill , “Jess in Action”, 2003
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” Si añadimos f1 (x (a 1)) y f2 (y (b 1)) , son
aceptados por los correspondientes nodos y enviados a los Join
El nodo 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
49
x? y? z?
LEFT.0.a=RIGH.b?
LEFT.0.a=RIGH.b?
Ejemplo-1
Ejemplo-2
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+tMAIN::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)) (z) => (assert (q)))
(view)(reset)(matches ejemplo-1)(run)(facts) 53
Desarrollo de aplicaciones
1. Pure Jess language scripts. No Java code at all.2. Pure Jess language scripts, but the scripts access Java APIs.3. Mostly Jess language scripts, but some custom Java code in
the form of new Jess commands written in Java.4. Half Jess language scripts, with a substantial amount of Java
code providing custom commands and APIs; main() provided by Jess.
5. Half Jess language scripts, with a substantial amount of Java code providing custom commands and APIs; main() provided by you or an application server.
6. Mostly Java code, which loads Jess language scripts at runtime.
7. 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}
}
57
Propuesto en E. Friedman-Hill, Capítulo 6, “Jess in Action”, 2003.
Creación de la plantilla paraDimmerSwitch
Jess> (defclass dimmer DimmerSwitch)DimmerSwitchJess> (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 factsestá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 JavaJess> (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)TRUEJess> (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;brightness = b;adjustTriac(b);pcs.firePropertyChange("brightness",
new Integer(old), (new Integer(b)));}
65
Calls fireProperty-Change toindicate brightness propertyis changing
Ejemplo de JavaBean que notifica cambios (II)
private void adjustTriac(int brightness) {// Code not shown
}
private PropertyChangeSupport pcs =new PropertyChangeSupport(this);
public voidaddPropertyChangeListener(PropertyChangeListener p) {
pcs.addPropertyChangeListener(p);}public voidremovePropertyChangeListener(PropertyChangeListener p) {
pcs.removePropertyChangeListener(p);}
}
66
Boilerplatecode youcan reuse inJavaBeans
Añadir instancia dinámicaa Memoria de trabajo
Jess> (clear) ;eliminar definiciones anterioresTRUEJess> (defclass dimmer DimmerSwitchDynamic) ;crea plantilladimmerJess> (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 brightnessJess> (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