Sunteți pe pagina 1din 46

Lenguaje de programacin Jess

Java Expert System Shell

Ejemplo introductorio
Problema de tipo puzzle en el cual hay cinco casas, de diferente color, habitadas por hombres de diferentes nacionalidades, con diferentes mascotas, bebidas preferidas y fumadores de ciertas marcas de cigarrillos. Con ciertos datos, determinar:

Quin bebe agua? De quin es la cebra?

Ejemplo introductorio
El ingls vive en la casa roja. El espaol tiene un perro. La casa color marfil est inmediatamente a la izquierda de la verde, donde vive el que bebe caf. El que bebe leche vive en la casa del medio. El que fuma Old Golds tambin cra caracoles. El ucraniano bebe t. El noruego reside en la primer casa de la izquierda. El que fuma Chesterfields vive al lado del que tiene el zorro. El que fuma Lucky Strike bebe jugo de naranja. El japons fuma Parliaments. El que tiene un caballo vive al lado del que fuma Kools, cuya casa es amarilla. El noruego vive al lado de la casa azul.

Instalar JessDE
Plugings para Eclipse versin 3.1 o posterior. Descargar Jess de http://www.jessrules.com/jess/download.shtml En usuario ya registrado insertar el email atorres@fceia.unr.edu.ar y cliquear en: Stable version Jess 7.1p2 source, docs and samples, zip format Username: user1714 Password: noybgoc6 Licencia para uso acadmico. Luego descomprimir el archivo en una carpeta.

Instalar JessDE
Salir de Eclipse. Descomprimir todos los archivos de Jess71p2/eclipse dentro del directorio (de nivel ms alto) de instalacin de Eclipse. Confirmar que existe una carpeta llamada eclipse/plugins/gov.sandia.jess_7.1.0" Reiniciar Eclipse.

Verificar la instalacin
Bajo el men "Help" elegir "about Eclipse SDK" Debe haber un cono de Jess. Cliquear y presionar en "Plug-in Details". Se encuentra una lista de tres plugins. Crear un nuevo proyecto Java. Crear un nuevo archivo en ese proyecto y nombrarlo "hola.clp".
(printout t "Hola mundo" crlf)

Ejecucin en lnea de comandos


C:\Jess71p2> bin\jess.bat
Jess, the Rule Engine for the Java Platform Copyright (C) 2008 Sandia Corporation Jess Version 7.1p1 8/6/2008 Jess> (+ 2 2) 4 Jess> (batch "..\\examples\\jess\\sticks.clp"

C:\Jess71p2> bin\jess.bat examples\jess\sticks.clp

Jess el motor de reglas para la plataforma Java


Para utilizarlo se deben especificar 'reglas'. Es necesario proveer 'datos' de acuerdo al problema. Cuando se ejecuta el motor, las reglas pueden ser disparadas. Las reglas pueden crear nuevos datos, o pueden realizar cualquier tarea que se pueda realizar con Java.

Elementos Bsicos
Smbolos

Letras, dgitos, $*=+/.<>_?#. Diferencia entre mayscula y minscula. nil, TRUE, FALSE son smbolos especiales. 3 4. 5.643 5654L 6.0E4 1D son nmeros vlidos

Nmeros

Strings

Se denotan utilizando comillas dobles: "Hola". \ es carcter de escape. "\n" no es vlido como nueva lnea.

Elementos Bsicos
Listas

Pares de parntesis con cero o ms smbolos. (+ 3 2) (a b c) ("Hola mundo") () (bind ?x 2) son todas listas vlidas. Llamamos head al primer elemento de las listas. ; lnea comentada /* comentario de bloque */

Comentarios

Elementos Bsicos
Todo el cdigo en Jess tiene la forma de llamada a funcin. No hay operadores. Algunas funciones tienen nombres al estilo de los operadores de java. Las llamadas a funcin en Jess son simplemente listas. Se pueden anidar llamadas a funciones.

Elementos Bsicos
Ejemplos de llamadas a funciones:

(+ (+ 2 3) (* 3 3)) (batch "examples/jess/hello.clp")

Definicin de funciones:
Jess> (deffunction max (?a ?b) (if (> ?a ?b) then ?a else ?b)) TRUE

Elementos Bsicos
Variables

Identificadores que comienzan con '?'. Los nombres pueden contener los siguientes caracteres: '-',' _', ':' o '*'. No pueden contener '.'. No se declaran previamente. Jess> (bind ?a 123) 123 Jess> ?a 123

Elementos Bsicos
Control de flujo
Jess> (bind ?i 3) 3 Jess> (while (> ?i 0) (printout t ?i crlf) (-- ?i)) 3 2 1 FALSE

Memoria de Trabajo (Working Memory)


Jess mantiene una base de conocimiento. Las unidades de conocimiento son hechos (facts). Existen tres tipos de hechos: no ordenados, oscuros y ordenados. Las reglas slo pueden reaccionar ante agregado, eliminacin o cambios en la memoria de trabajo. Cada hecho tiene una plantilla (template).

Memoria de Trabajo (Working Memory)


Cada plantilla tiene un nombre y un conjunto de slots (como una clase Java o una tabla de una BD relacional). Con el comando facts es posible ver una lista de todos los hechos de la memoria de trabajo. Los hechos se pueden agregar mediante las funciones assert, add y definstance.

Memoria de Trabajo (Working Memory)


Una declaracin deftemplate incluye:

un nombre, una string de documentacin (opcional), una clusula extends (opcional) una lista de declaraciones (opcional) y una lista de cero o ms slots. cada slot puede tener una lista de calificadores.

Hechos no ordenados
Tienen campos (slots) con nombre.
(auto (marca Ford) (modelo Explorer))

Se deben definir los slots previamente mediante deftemplate.


(deftemplate auto "un auto especfico" (slot marca) (slot modelo) (slot color (default blanco)))

Hechos no ordenados
Jess> (reset) Jess> (assert (auto (modelo Megane) (marca Renault))) <Fact-1> Jess> (facts) f-0 (MAIN::initial-fact) f-1 (MAIN::auto (marca Renault) (modelo Megane) (color blanco)) For a total of 2 facts in module MAIN.

Hechos no ordenados
Un slot puede contener mltiples valores Jess> (deftemplate caja (slot ubicacion) (multislot contenido)) TRUE Jess> (bind ?id (assert (caja (location cocina) (contenido espatula esponja sarten)))) <Fact-2>

Hechos no ordenados
Se puede modificar un hecho. Jess> (modify ?id (ubicacion comedor)) <Fact-2> Se puede extender un hecho. Jess> (deftemplate auto-usado extends auto (slot kilometraje)) TRUE

Hechos Oscuros
Son hechos no ordenados que sirven como 'puentes' hacia objetos Java. Se puede introducir un objeto Java en la memoria de trabajo. Jess> (deftemplate Cuenta (declare (from-class Cuenta)(includevariables TRUE))) Jess> (defclass Cuenta Cuenta)

Hechos Ordenados
En la mayora de las oportunidades se utilizan hechos no ordenados. En algunos casos no tiene sentido dar nombres a los slots (numero (value 6)). Hechos ordenados son simplemente listas. (padre-de pedro juan) Jess> (deftemplate padre-de (declare (ordered TRUE)))

El algoritmo Rete
Se deben aplicar continuamente sentencias ifthen (reglas) a un conjunto de datos (working memory). Para mejorar eficiencia. Se implementa mediante la construccin de una red de nodos. Cada nodo representa uno o ms tests
encontrados en el lado izquierdo de alguna regla.

El algoritmo Rete
Cada nodo inferior (terminal) representa una regla. Un conjunto de tests que atraviesa toda la red hacia abajo activa y dispara la regla. Nodos de una entrada y nodos de dos entradas.

El algoritmo Rete
Optimizacin compartiendo nodos. Aparecen nuevos nodos que se pueden compartir.

El algoritmo Rete
Se pueden observar los nodos creados y compartidos mediante el comando watch compilations: +1 +2 =1 =2 +t Jess genera otros nodos.

Reglas
Una regla es similar a una sentencia ifthen Las reglas se ejecutan cuando se satisface la parte del if siempre y cuando el motor de reglas se est ejecutando (comando run). Ejemplo: Jess> (deftemplate person (slot firstname) (slot lastname) (slot age))

Reglas
Las reglas se definen mediante el constructor defrule.
Jess> (defrule bienvenido-menor "Saludo para nios" (person {age < 3}) => (printout t "Hola nio!" crlf))

Reglas
El lado derecho de las reglas debe contener solamente patrones con posibilidad de matchear con hechos del espacio de trabajo. El lado derecho no puede contener llamadas a funcin. Siempre se debe ejecutar el comando reset que dispara el hecho inicial (initial-fact).

Reglas
Jess> (deftemplate person (slot firstName) (slot lastName) (slot age)) TRUE Jess> (watch all) TRUE Jess> (reset) ==> f-0 (MAIN::initial-fact) TRUE Jess> (defrule bienvenido-menor "Saludo para nios" (person {age < 3}) => (printout t "Hola nio!" crlf))

Reglas
bienvenido-menor: +1+1+1+t TRUE

Jess> (assert (person (age 2))) ==> f-1 (MAIN::person (firstName nil) (lastName nil) (age 2)) ==> Activation: MAIN::welcome-toddlers : f-1 <Fact-1> Jess> (run) FIRE 1 MAIN::welcome-toddlers f-1 Hola nio! <== Focus MAIN 1

Patrones simples
Se pueden declarar variables para referirse al contenido de un slot. (person (age ?a) (firstName ?f) (lastName ?l)) Este patrn matchea cualquier hecho person. Se asigna a ?a, ?f y ?l el contenido de age, firstName y lastName de esa instancia respectivamente.

Patrones simples
Jess> (defrule teenager ?p <- (person {age > 12 && age < 20} (firstName ?name)) => (printout t ?name " is " ?p.age " years old." crlf))

Patrones simples
Puede haber reglas con ms de un patrn.
Jess> (defrule misma-edad-diferente-nombre ?person1 <- (person) ?person2 <- (person {age == person1.age &&lastName != person1.lastName}) => (printout t "Se encontraron personas de " ?person1.age "aos." crlf))

Patrones en profundidad
Jess> (deftemplate coordenadas (slot x) (slot y)) Jess> (defrule ejemplo-1 (coordenadas (x ?x) (y ?y)) => (printout t "Coordenadas (" ?x ", " ?y ")" crlf))

Patrones en profundidad - Tests


Los descriptores de slots pueden incluir cierto nmero de tests. Los tests van despus del nombre de las variables separndose con un smbolo '&' (and) o '|' (or). Actualmente el nombre de la variable es opcional.

Patrones en profundidad - Tests


Los patrones pueden ser:

Un valor literal: (coordenada (x 1.0)) Una variable que fue asignada previamente: (coordenada (x ?x)) Una expresin regular de java entre '/': (person (name /A.*/))

Patrones en profundidad - Tests

Restriccin de predicados: El caracter ':' seguido de una llamada a funcin. En este caso el test se satisface si la funcin retorna TRUE. (coordenada (x ?x&:(> ?x 10))) Restriccin de valor de retorno: Un signo '=' seguido de un llamado a funcin. (coordenada (x ?x) (y =(+ ?x 1)))

Patrones en profundidad - Tests


Una expresin regular de Java encerrada entre '/':
(person (name /A.*/))

Cualquiera de los patrones anteriores precedido por el caracter '~' (negacin).


(coordinate (x ?x) (y ~?x))

Matching en slots mltiples


Jess> (defrule match-tres-items (lista-almacen ? ? ?) => (printout t "Hay una lista de tres items." crlf)) TRUE Jess> (assert (lista-almacen huevos leche manteca)) <Fact-0> Jess> (run) Hay una lista de tres items. 1

Matching en slots mltiples


Jess> (defrule match-lista-completa (lista-almacen $?list) => (printout t "Necesito comprar " ?list crlf)) TRUE Jess> (assert (lista-almacen huevos leche manteca)) <Fact-0> Jess> (run) Necesito comprar (huevos leche manteca) 1

Asignacin de patrones
Jess> (defrule example-5-1 ?fact <- (initial-fact) => (printout t (call ?fact getName) crlf)) TRUE Jess> (reset) TRUE Jess> (run) initial-fact 1

Elementos condicionales
'and', 'or', 'not', 'exists', 'test', 'forall'. Jess> (defrule no-impares (not (numero ?n&:(oddp ?n))) => (printout t "No hay nmeros impares." crlf))

Cdigo Java dentro de Jess


El cdigo Java:
Vector v = new Vector(); v.add("Hola"); System.out.println(v.lastElement());

Se puede insertar as:


(bind ?v (new Vector)) (call ?v add "Hola") ((get-member System out) println (?v lastElement))

Cdigo Jess dentro de Java


La clase jess.Rete es el motor de inferencia. Contiene los mtodos run(), reset(), etc. Para ejecutar otros comandos: eval(String)
Rete r = new Rete(); r.eval("(deffunction cuadrado (?n) (return (* ?n ?n)))"); Value v = r.eval("(cuadrado 3)"); System.out.println(v.intValue(r.getGloba lContext()));

S-ar putea să vă placă și