70
Herramientas Jess

Herramientascalonso/MUI-TIC/Herramientas... · 2009-10-20 · Crear archivo Jess con extensión "clp" ("dijoNO.clp") ... La red RETE se puede asimilar a máquina de estados que consume

Embed Size (px)

Citation preview

Herramientas

Jess

2

Contenido

Jess: Introducción Elementos básicos de programación Funcionamiento del motor de inferencias Desarrollo de aplicaciones con Jess

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á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

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 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

Funcionamiento del motor de inferencias

38

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

Optimización:compartir nodos Join

50

x? y? z?

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 con Jess

54

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

Se puede hacer sin JavaBeans

Funciones de creación, acceso, manipulación de objetos Java

../Jess71p2/docs/java.html

70