Jess, The Rule Engine for the Java Platform

Slides:



Advertisements
Presentazioni simili
Shell: variabili di sistema PATH HOME USER PWD SHELL HOSTNAME HOSTTYPE Per visualizzare il valore di tutte le variabili dambiente si usa il comando set.
Advertisements

© 2007 SEI-Società Editrice Internazionale, Apogeo Unità A2 Java: le basi del linguaggio.
Costruttori e Distruttori
Sviluppo di programmi strutturati
26/10/2004Laboratorio di Programmazione - Luca Tesei1 Variabili e Oggetti Lo spazio di memoria di Java Le API di Java.
Capitolo 8 Array Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl.
Differenze nei vari linguaggi di Elisa Trifirò e Barbara Tacchino
Intelligenza Artificiale
LIP: 4 Aprile 2008 ECCEZIONI. Eccezioni Come si definiscono eccezioni Come si lanciano Come si gestiscono (gestione esplicita o di default)
Liste di Interi Esercitazione. Liste Concatenate Tipo di dato utile per memorizzare sequenze di elementi di dimensioni variabile Definizione tipicamente.
LIP: 19 Aprile Contenuto Soluzione Compitino Tipo di dato MultiSet, estensione con sottoclasse.
Liste Ordinate 3 Maggio Ultima Lezione Abbiamo visto i tipi di dato astratti IntList e StringList Realizzano liste di interi e di stringhe Realizzati.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Tipi di dato e controllo del flusso Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – – SIENA.
1 Programmazione ad oggetti in Java E.Mumolo, DEEI
Fisica Computazionale I - 51 OPERAZIONI DI INPUT/OUTPUT Le operazioni di input/output sono estremamente complesse perche' implicano una sostanziale interazione.
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Introduzione a JAVA Anno Accademico 2009/2010.
1 Corso di Informatica (Programmazione) Lezione 7 (5 novembre 2008) Programmazione in Java: lessico, variabili, tipi primitivi, assegnamento a variabile.
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) JAVA: i commenti Anno Accademico 2009/2010.
Corso di Laurea in Biotecnologie Informatica (Programmazione)
Specifiche senza JML: uso delle asserzioni. 2 Asserzioni in Java Dal jdk 1.4 (da Febbraio 2002) cè meccanismo per gestire asserzioni Asserzione: espressione.
Scomposizione di stringhe
1 Eventi/2 Più movimento alle classi. 2 Eventi Java Modo per intercettare il verificarsi di certe condizioni / azioni e fare in modo che venga eseguito.
Gestione dei Progetti Software 2 (a.a. 2004/05) - Lezione 3 1 JAVA e Internet: il World Wide Web Internet: milioni di computer collegati fra di loro attraverso.
Selezione (=scelta) con “if-else”
CAPITOLO 1 JAVA: UN TUFFO NEL LINGUAGGIO E NELL'AMBIENTE.
Sistemi Operativi GESTIONE DEI PROCESSI.
Intelligenza Artificiale
IL CONCETTO DI PACKAGE Una applicazione è spesso composta di molte classi (eventualmente correlate) Un package è un gruppo di classi che costi- tuiscono.
GESTIONE DEGLI ERRORI Spesso vi sono istruzioni critiche, che in certi casi possono produrre errori. Lapproccio classico consiste nellinse- rire controlli.
Programmazione in Java
JESS: Esercizi Ettore Colombo Dicembre 2006 Ingegneria della Conoscenza e Sistemi Esperti.
Java Contardi Carlo A.S. 2008/09.
I Metodi in Java Il termine "metodo" è sinonimo di "azione". Quindi, affinché un programma esegua qualche istruzione, deve contenere metodi.
Programmazione concorrente
1 Lucidi delle esercitazioni di Sistemi di Elaborazione in Rete Università degli Studi della Calabria Corso di Laurea in Ingegneria Gestionale A.A. 2003/2004.
Fopndamenti di programmazione. 2 La classe String Una stringa è una sequenza di caratteri La classe String è utilizzata per memorizzare caratteri La classe.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
Conversione da base 10 a base X (Utilizzo della pila)
Corso di Programmazione in Java – Esercizio n° 001
Le eccezioni F. Bombi 01/11/ Errori e situazioni impreviste situazioni eccezionali In un programma situazioni eccezionali possono.
Appunti di Java (J2SDK 1.4.2, JDK 1.6.0) prof. Antonella Schiavon settembre 2009.
Esercizi Swing.
Esercizi.
Le variabili in Java Nella programmazione tradizionale, una variabile è una porzione di memoria in cui è immagazzinato un certo tipo di dato. Per esempio.
Corso di Algoritmi e Strutture Dati con Laboratorio A.A. 2014/15 Libreria standard.
JAVA Per iniziare. Verificare installazione javac –version java –version Cercare i files e sistemare eventualmente il path.
Java gestione eventi introduzione. La gestione degli eventi Ci sono 3 oggetti interessati alla g. d. e.: L’oggetto interessato (event source) ad esempio.
Una "vera" classe.. ..un esempio pratico: la calcolatrice
FUNZIONI Dichiarazione: Definizione:
Fondamenti di informatica Oggetti e Java Luca Cabibbo Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies.
Fondamenti di informatica Oggetti e Java Luca Cabibbo Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies.
Introduzione a Javascript
Interfacce grafiche Capitolo 27 marzo 2004 Interfacce grafiche.
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
Capitolo 6 Iterazione Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 7 Tipi di dato e strutture dati Specifica e realizzazione di strutture informative come classi.
Capitolo 12 Thread Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies.
1 Eccezioni in Java. 2 Ricordiamo che 4 una procedura può terminare –normalmente, ritornando un risultato –in modo eccezionale ci possono essere diverse.
Gestione dei thread in Java
Introduzione a JESS Ettore Colombo 13 Dicembre 2006 Ingegneria della Conoscenza e Sistemi Esperti.
Java & JESS Ettore Colombo 10 Gennaio 2007 Ingegneria della Conoscenza e Sistemi Esperti.
Sommario Oggetti immutabili e non Tipi Primitivi: String, Arrays.
LIP: 11 Maggio 2007 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
LIP: 15 Marzo 2005 Vettori di interi. Esercizio proposto Definire una classe VectorInt i cui oggetti sono vettori omogenei di interi ordinati in modo.
1 Metodo I metodi sono uno strumento che i programmatori usano per strutturare i programmi, sia per renderli più facili da capire che per permettere il.
Eccezioni in Java. Le eccezioni in Java Exception handling: insieme di costrutti e regole sintattiche e semantiche presenti nel linguaggio allo scopo.
Transcript della presentazione:

Jess, The Rule Engine for the Java Platform Seminario per il Corso di laboratorio di Sistemi Intelligenti a cura di A. Gilitus Sito ufficiale: http://herzberg.ca.sandia.gov/jess/

Jess, The Rule Engine for the Java Platform Come usare il Jess: Interfaccia a riga di comando Comando batch

Interfaccia a riga di comando Per lanciare l’interfaccia a riga di comando è sufficiente digitare: java jess.Main A questo punto compare il prompt: Jess> in cui digitare i comandi come in CLIPS. Es. Jess> (assert (pippo))

Comando batch Per caricare un programma scritto in Jess si utilizza il comando batch: Jess> (batch nomefile.clp) Oppure specificare il file CLIPS sulla riga di comando quando si carica l’ambiente di Jess. java jess.Main nomefile.clp

Jess, The Rule Engine for the Java Platform Parallelo Jess/CLIPS Implementazione di Jess con Java

Parallelo Jess/CLIPS Differenze nell’utilizzo dei moduli Allowed-value Interfaccia Grafica

Differenze nell’utilizzo dei moduli Non si dichiara il modulo MAIN. Regole, fatti, template, ecc. che compaiono nel modulo MAIN devono avere la dicitura MAIN:: davanti. Non si usano import e export, a differenza del CLIPS ogni modulo importa da tutti e esporta a tutti. Ogni fatto dichiarato in un determinato modulo (per es. nel modulo PIPPO) sarà distinto dal nome del modulo stesso in working memory, per es. nel caso di una assert(ciao) nel modulo PIPPO, si avrà il fatto: f-1 PIPPO::ciao Per riferirsi a fatti asseriti da altri moduli, è necessario esplicitare il nome del modulo che li ha asseriti.

Non si dichiara il modulo MAIN. JESS (deftemplate MAIN::solution (slot value (default no))) (deffacts MAIN::param (solution (value no)) (maxdepth 0)) (deffacts MAIN::S0 (status 0 clear a NA) (status 0 on a b ) (status 0 on b c ) (status 0 ontable c NA) (status 0 ontable d NA) (status 0 clear d NA) (status 0 handempty NA NA)) (deffacts MAIN::final (goal on a b) (goal on c d) (goal ontable d NA) (goal on b c)) CLIPS (defmodule MAIN (export ?ALL)) (deftemplate solution (slot value (default no))) (deffacts param (solution (value no)) (maxdepth 0)) (deffacts S0 (status 0 clear a NA) (status 0 on a b ) (status 0 on b c ) (status 0 ontable c NA) (status 0 ontable d NA) (status 0 clear d NA) (status 0 handempty NA NA)) (deffacts final (goal on a b) (goal on c d) (goal ontable d NA) (goal on b c))

Non si usano import e export JESS (defmodule MAIN2) (defrule got-solution (declare (salience 100)) (solution (value yes)) => (assert (risolto)) (pop-focus) ) (defrule pick (status ?s on ?x ?y) (status ?s clear ?x ?) (status ?s handempty ? ?) (maxdepth ?d) (test (< ?s ?d)) (not (exec ?s pick ?x ?y)) => (assert (apply ?s pick ?x ?y))) CLIPS (defmodule MAIN2 (import MAIN ?ALL)(export ?ALL)) (defrule got-solution (declare (salience 100)) (solution (value yes)) => (assert (risolto)) (pop-focus) ) (defrule pick (status ?s on ?x ?y) (status ?s clear ?x ?) (status ?s handempty ? ?) (maxdepth ?d) (test (< ?s ?d)) (not (exec ?s pick ?x ?y)) => (assert (apply ?s pick ?x ?y)))

Ogni fatto dichiarato in determinato modulo sarà distinto dal nome del modulo stesso in working memory Es. le asserzioni nel modulo PIPPO, compariranno in working memory nel seguente modo: f-1 PIPPO::ciao … f-2 PIPPO::sono … f-3 PIPPO::Pippo …

Per riferirsi a fatti asseriti da altri moduli, è necessario esplicitare il nome del modulo che li ha asseriti es: (defmodule NEW ) (defrule check-ancestor (declare (salience 50)) ?f1 <- (MAIN2::ancestor ?a) (or (test (> ?a 0)) (test (= ?a 0))) (MAIN2::news ?s) (status ?s ?op ?x ?y) (not (status ?a ?op ?x ?y)) => (assert (MAIN2::ancestor (- ?a 1))) (retract ?f1) (assert (diff ?a)))

Allowed-value All’interno di un deftemplate si possono dichiarare diversi slot, in CLIPS si possono assegnare diversi valori a questi slot sotto forma di valori permessi: allowed-value. In Jess non sono ammessi.

Load-facts In Jess è possibile caricare un intero blocco di fatti memorizzati su file. (load-facts nomefile) Es. caricare la dichiarazione della mappa del supermercato.

Interfaccia Grafica Il Jess non ha un’interfaccia grafica come il CLIPS. E’ stato pensato per essere utilizzato tramite Java. L’interfaccia grafica di CLIPS rende le operazioni di debug molto semplici, in Jess il debug è complicato, a meno che…  JessGUI

Implementazione di Jess con Java Prima distinzione: scegliere chi sarà l'applicazione pilota, cioè, colei che deterrà il controllo sull'altra. Il Jess consente di effettuare questa scelta: - Java applicherà il controllo sul Jess (consigliato, facile utilizzo) - Jess applicherà il controllo su Java (Writing GUI in Jess, Cap 7., Help di Jess, sconsigliato, difficile utilizzo)

Java controlla il Jess Istanziazione di uno o più motori Jess. Il motore inferenziale Jess è basato sulla classe Rete. knowledge base, agenda, lista dei fatti, stack dei moduli, ecc. La classe Rete controlla tutto, o quasi, il motore inferenziale

Utilizzo della classe Rete Es. import jess.*; public class ExSquare { public static void main(String[] unused) { try { Rete r = new Rete(); r.executeCommand("(deffunction square (?n) (return (* ?n ?n)))"); Value v = r.executeCommand("(square 3)"); // Prints '9' System.out.println(v.intValue(r.getGlobalContext())); } catch (JessException ex) { System.err.println(ex); } } }

Livello di interazione Si inizializza Jess e si costruisce il programma Jess sfruttando i metodi della classe Rete (tutto eseguito da Java), il codice Jess risulta spezzato e annegato in quello Java. Pro e contro: Difficile correzione del programma Jess, caldamente sconsigliato.

Livello di interazione Si inizializza Jess gli si fa caricare il programma Jess e lo si esegue (possibilmente utilizzando thread separati). Questo metodo consente di mantenere una separazione netta, o quasi, tra Java e Jess. Pro e contro: Mantenendo slegate le due esecuzioni è possibile ottenere più che buoni risultati, cambiare il codice Jess non comporta la modifica del codice Java.

Livello di interazione Evoluzione del punto 2., si possono applicare “correzioni” al programma Jess prima o durante l’esecuzione (inserendo, per esempio, un fatto in knowledge base). Pro e contro: Si può utilizzare per un eventuale debug, bisogna ricordarsi tutti i punti in cui si è interagito con il Jess per eventuali modifiche.

Metodi di utilizzo più frequente caricamento di un programma Jess, reset del motore inferenziale, comando di run, comando di step, metodo per controllare i fatti in knoledge base, metodo per controllare lo stack dei focus, metodo per controllare l’agenda, utilizzo dei watch.

Caricamento di un programma Jess Utilizzo della classe JESP: carica il programma esegue il parse  controlla se ci sono errori nel codice

Jesp, un esempio public void caricaImpostazioni(){ try{ FileInputStream fis = new FileInputStream("superLarge.jess"); Jesp j = new Jesp(new InputStreamReader(fis), rete); do{ j.parse(false); }catch(JessException re){ re.printStackTrace(); } }while (fis.available() > 0); }catch(IOException e){ e.printStackTrace(); } }

Reset, Run e Step reset()  esegue il reset del motore inferenziale (come in CLIPS) run()  … run(1)  questo metodo run consente di eseguire un certo numero step prima di fermarsi.

Fatti, Focus e Agenda listFacts() restituisce un iteratore, i cui elementi sono di tipo Fact. listFocusStack() non funziona bene, si consiglia di usare il metodo getFocus() che ritorna il nome del modulo in cima allo stack. listActivations(String nomeModulo) restituisce un iteratore contenente le regole di possibile attivazione. nomeModulo riduce l’elenco delle regole attivabili al solo modulo interessato

Watch watchAll() unWatchAll() watch(int i) unWatch(int i)

Jess controlla Java Previsione futuristica: creare le classi Java che il Jess dovrà controllare. Istanziare le classi create tramite il Jess.

Un esempio Jess> ;; Create the widgets (defglobal ?*f* = (new java.awt.Frame "Button Demo")) Jess> (defglobal ?*b* = (new java.awt.Button "Hello")) Jess> ;; Define the deffunction (deffunction say-hello "Unconditionally print a message" (?evt) (printout t "Hello, World!" crlf)) Jess> ;; Connect the deffunction to the button (?*b* addActionListener (new jess.awt.ActionListener say-hello (engine))) Jess> ;; Assemble and display the GUI (?*f* add ?*b*) Jess> (?*f* pack) Jess> (set ?*f* visible TRUE)

WINDOW_CLOSING Event Jess> ;; If the event is a WINDOW_CLOSING event, exit the program (deffunction frame-handler (?evt) (if (= (?evt getID) (get-member ?evt WINDOW_CLOSING))then (call (get ?evt source) dispose) (exit))) Jess> ;; Connect this deffunction to the frame (?*f* addWindowListener (new jess.awt.WindowListener frame-handler (engine)))

Documentazione Consultabile online sul sito ufficiale: http://herzberg.ca.sandia.gov/jess/ Tutti i riferimenti alle classi del package Jess sono consultabili attraverso le API della documentazione.