Come visto nel precedente articolo, è possibile utilizzare tuProlog all’interno di un programma Java in modo che la teoria e l’interprete siano visibili come oggetti (di classe rispettivamente alice.tuprolog.Theory e alice.tuprolog.Prolog) ed a tal fine è sufficiente includere nel classpath di Java la libreria 2p.jar reperibile nella distribuzione di tuProlog. In questo modo aspetti applicativi quali l’interazione con l’utente attraverso la GUI oppure lo scambio di informazioni con sistemi esterni o con databases possono essere realizzati sfruttando le tecnologie disponibili all’interno della piattaforma J2EE (AWT/Swing, CORBA/Web Services e JDBC ad esempio), mentre Prolog può essere impiegato per l’implementazione di quella parte logico/deduttiva per la quale a volte un linguaggio imperativo quale Java non si rivela del tutto adeguato.
In tuProlog un termine viene rappresentato da un oggetto di classe astratta alice.tuprolog.Term, che si specializza nelle sottoclassi Number, Struct e Var per realizzare l’intera casistica Prolog nota (termini composti comprendenti clausole e liste, atomi alfanumerici, numeri e variabili). Si osservi che Number è ancora una classe astratta, per la quale sono disponibili le quattro specializzazioni Double, Float, Int e Long.
Attraverso i costruttori delle citate classi è quindi possibile creare (istanziare) termini a runtime senza passare per la corrispondente rappresentazione stringa. Ad esempio, per costruire il termine animale(X) si possono utilizzare in Java le istruzioni:
Var x = new Var(“X”);
Term goal = new Struct(“animale”,x);
potendo quindi ora inviare il termine instanziato all’engine Prolog per la risoluzione:
SolveInfo info = engine.solve(goal);
Se la dimostrazione si conclude con successo allora è possibile interrogare l’oggetto di classe SolveInfo per ottenere i valori associati (tramite unificazione) alle variabili incluse nel goal:
Term value = info.getVarValue(“X”);
Infine, è sempre necessario verificare che non esistano alternative aperte (da esplorare in fase di backtracking) prima di considerare conclusa la dimostrazione:
while(info.isSuccess()) {
Term value = info.getVarValue(“X”);
System.out.println(“X: ” + value);
if(engine.hasOpenAlternatives())
info = engine.solveNext();
else
break;
}



Maggio 10, 2012
Linguaggi di Programmazione