Uno degli aspetti più interessanti di tuProlog è l’interoperabilità con l’ambiente Java. Si tratta, come vedremo approfonditamente in questa seconda parte della guida, di una interoperabilità bidirezionale, essendo possibili sia l’utilizzo dell’interprete Prolog all’interno di un programma Java sia l’utilizzo di componenti Java all’interno di un procedimento di dimostrazione Prolog. Nel primo caso si arricchisce l’ambiente imperativo Java abilitandolo all’impiego di tecniche di programmazione logica, mentre nel secondo caso si aprono all’interprete Prolog le porte alle innumerevoli tecnologie disponibili in Java per l’integrazione e l’interazione con l’esterno e con l’utente (JDBC per il database, CORBA o Web Services per gli ambienti distribuiti e AWT/Swing per la GUI per citare i fondamentali).
All’inizio del corso si è mostrato come sia possibile lanciare la GUI di tuProlog dalla shell del sistema operativo con il comando:
java -jar <path>/lib/2p.jar
dove con <path> si è indicato il percorso nel quale è stato scompatto il file 2p-X.Y.Z.zip contenente la distribuzione di tuProlog. Ora utilizzeremo invece lo stesso file 2p.jar come libreria all’interno di una applicazione Java, in modo che la teoria e l’interprete Prolog siano visibili come oggetti (di classe rispettivamente alice.tuprolog.Theory e alice.tuprolog.Prolog) a seguito di un import del tipo:
import alice.tuprolog.Prolog;
import alice.tuprolog.SolveInfo;
import alice.tuprolog.Term;
import alice.tuprolog.Theory;
Il costruttore della classe Theory permette la costruzione di una teoria a partire da un file di testo esterno oppure da una stringa, come nel seguente caso:
String theory_text =
“cane(fido).\n” +
“gatto(silvestro).\n” +
“canarino(titti).\n” +
“animale(X) :- cane(X); gatto(X); canarino(X).\n”;
Theory theory = new Theory(theory_text);
Possiamo quindi istanziare un interprete Prolog, richiedere la valutazione di un goal e stampare i relativi risultati con le seguenti istruzioni:
engine.setTheory(theory);
SolveInfo info = engine.solve(
“animale(X).”
);
while(info.isSuccess()) {
Term solution = info.getSolution();
System.out.println(“Solution: ” + solution);
System.out.println(“Bindings: ” + info);
if(engine.hasOpenAlternatives())
info = engine.solveNext();
else
break;
}



Aprile 26, 2012
Linguaggi di Programmazione