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:
FileNewJavaProject

Crear archivo Jess con extensión "clp"
("dijoNO.clp")
Carpeta src, botón derecho:
FileNew

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
RunASJessApplication
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
RunASJessApplication
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
RunASJessApplication
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