Lucidi - L.Int.Ar

annuncio pubblicitario
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”
Scarica