Java & JESS
Ettore Colombo
10 Gennaio 2007
Ingegneria della Conoscenza e Sistemi
Esperti
Argomenti
•
•
•
•
•
Userfunction
Utilizzo di JESS in Java
Store & Fetch
Gestione oggetti Java nel codice JESS
Shadow Facts
Userfunction
• Servono per aggiungere comandi/funzioni a JESS
• Implementare l’interfaccia Userfunction
– creare una nuova classe Java che implementi jess.Userfunction
• definire un metodo costruttore
• definire il nome della nuova funzione creata implementando il metodo
public String getName()
• definire la nuova funzione implementando il metodo
public Value call(ValueVector vv, Context c) throws
JessException
– compilare il file creato e accertarsi che sia incluso nel classpath per
l’esecuzione da JESS
– nel codice JESS: dichiarare che si intende utilizzare la nuova
funzione (load-function newFunction)
Esempio: la Random100 (1)
random100 restituisce un intero positivo scelto “casualmente” nell’intervallo [0,100]
import java.io.*;
import java.util.*;
import jess.*;
public class random100 implements Userfunction {
Random r=null;
Date d=null;
public random100()
{
d = new Date();
r = new Random((long)(d.getTime()));
}
Esempio: la Random100 (2)
public String getName()
{
// The name method returns the name by which the function
// will appear in Jess code.
return "random100";
}
public Value call(ValueVector vv, Context context)
throws JessException
{
int number=r.nextInt(100);
if (number<0) number=(-1)*number;
//System.out.println(number);
return new Value(Integer.toString(number),RU.ATOM);
}
}
Esempio d’uso della Random100
(load-function random100)
(defrule inizializzaListaA
(initial-fact)
=>
(assert (listaA (random100) (random100) (random100)))
)
(defrule inizializzaListaB
(initial-fact)
=>
(assert (listaB (random100) (random100) (random100)))
)
Dalla Console:
(reset)
(facts)
(run)
(facts)
f-0 (initial-fact)
For a total of 1 facts.
f-0 (initial-fact)
f-1 (listaA 61 56 97)
f-2 (listaB 75 61 49)
For a total of 3 facts.
Jess>
Argomenti
•
•
•
•
•
Userfunction
Utilizzo di JESS in Java
Store & Fetch
Gestione oggetti Java nel codice JESS
Shadow Facts
Utilizzo di JESS in Java
JESS è fornito come file .jar contenente un insieme di classi Java
È possibile utilizzare queste classi importandole opportunamente all’interno
delle nostre applicazioni Java
Esiste un API dettagliata e utile che descrive quali sono le classi utilizzate per
costruire la shell JESS: http://herzberg.ca.sandia.gov/jess/docs/
_______________________________________________________________
Rete [fonte: JESS API]
The reasoning engine. Executes the built Rete network,
and coordinates many other activities
Attraverso i metodi della classe Rete è possibile:
- eseguire i comandi come da shell/console [executeCommand(String)]
- asserire fatti e togliere fatti
- lanciare comandi di gestione [run, clear, reset, ...]
- caricare un file di testo contenente comandi JESS (programmi JESS)
- scambiare dati tra applicazione Java e motore inferenziale [store & fetch,
shadow facts]
Esempio
import jess.*;
class Esempio {
public static void main(String a[]) {
new Esempio();
}
public Esempio() {
Rete engine = new Rete();
//Caricamento Regole
System.out.println("::: Caricamento Regole :::");
try {
engine.executeCommand("(batch ./random100.clp)");
} catch (JessException je)
{System.out.println("Error during rules uploading: "+je);}
//Esecuzione Regole
System.out.println("::: Esecuzione Regole :::");
try {
engine.run();
}
catch (JessException je)
{System.out.println("Error during rules execution: "+je);}
}
}
Argomenti
•
•
•
•
•
Userfunction
Utilizzo di JESS in Java
Store & Fetch
Gestione oggetti Java nel codice JESS
Shadow Facts
Store & Fetch
Esiste una “memoria” condivisa tra JESS e Java che è possibile utilizzare per
condividere dati usando le funzioni:
store (inserimento)
fetch (lettura)
NB: nell’esempio che segue, engine è un oggetto di classe Rete
JESS
(store dato1 15)
Java
valore scritto = 15 e
identificato come “dato1”
Java
engine.store(“dato1”,15)
engine.fetch(“dato1”)
valore scritto = 15 e
identificato come “dato1”
valore letto 15
JESS
(fetch dato1)
valore letto 15
Argomenti
•
•
•
•
•
Userfunction
Utilizzo di JESS in Java
Store & Fetch
Gestione oggetti Java nel codice JESS
Shadow Facts
Gestione di oggetti Java in JESS
Esempio: gestione delle GUI da JESS
;Creazione oggetto di tipo JButton, il bottone OK della GUI
(bind ?button (new javax.swing.JButton "OK"))
(call ?button setSize 20 20) CHIAMATA DI UN METODO
“?button” contiene il riferimento all’oggetto presenta nella memoria della Java Virtual Machine
(import <atom>)
È il corrispondente JESS della “import” in Java
Si possono indicare come <atom> sia interi package (import java.io.*) che
singole classi (import java.awt.Button)
Il package java.lang.* è implicitamente considerato
Esempio
(defrule inizializzaOggetto
(initial-fact)
=>
(bind ?prova (new OggettoProva "Oggetto 1"))
(assert (Oggetto ?prova))
)
(defrule stampaNome
(Oggetto ?prova)
=>
(printout t (call ?prova getNome) crlf)
)
Dalla Console:
(reset)
(facts)
(run)
(facts)
f-0 (initial-fact)
For a total of 1 facts.
Oggetto 1
f-0 (initial-fact)
f-1 (Oggetto <External-Address:OggettoProva>)
For a total of 2 facts.
Jess>
Argomenti
•
•
•
•
•
Userfunction
Utilizzo di JESS in Java
Store & Fetch
Gestione oggetti Java nel codice JESS
Shadow Facts
Costruzione di Shadow Fact
(defclass prova OggettoProva) definisce il template prova basato sulla
“struttura” dell’oggetto associato
(bind ?bean (new prova)) crea un oggetto prova/OggettoProva
(definstance prova ?bean static) crea lo shadow fact cossispondente
al bean ?bean. static indica che lo shadow fact è statico!
shadow fact static vs dynamic: dichiarare dynamic uno shadow fact permette di
mantenere aggiornati i valori degli slot in base alle modifiche sui valori delle
property del JavaBean corrispondente
Analogamente ... in Java:
engine.defclass(“prova”,”OggettoProva”,null);
OggettoProva bean = new OggettoProva();
engine.definstance(“prova”, bean, false);
false indica che lo shadow fact è statico ... true per indicare che è dinamico!
Il terzo argomento della defclass è il nome dell’eventuale superclasse della classe
“OggettoProva”