If you want to get your Prolog application to be accessible from an intranet or the Internet you can use this package to embed the Prolog programs into a Java application server such as Tomcat, WebSphere, etc.
An example of how to do this is provided in pbexamples(sessionsum)
.
This example uses sessions to keep track of users so that the application
can hold a state for a user session (as in the example below, remember the sum
of all expressions evaluated in the session).
<% page import = "se.sics.prologbeans.*" %> <html> <head><title>Sum Calculator</title></head> <body bgcolor="white"> <font size=4>Prolog Sum Calculator, enter expression to evaluate: <form><input type=text name=query></form> <% PrologSession pSession = PrologSession.getPrologSession("prolog/PrologSession", session); String evQuery = request.getParameter("query"); String output = ""; if (evQuery != null) { Bindings bindings = new Bindings().bind("E",evQuery + '.'); QueryAnswer answer = pSession.executeQuery("sum(E,Sum,Average,Count)", bindings); Term average = answer.getValue("Average"); if (average != null) { Term sum = answer.getValue("Sum"); Term count = answer.getValue("Count"); output = "<h4>Average =" + average + ", Sum = " + sum + " Count = " + count + "</h4>"; } else { output = "<h4>Error: " + answer.getError() + "</h4>"; } } %> <%= output %><br></font> <p><hr>Powered by SICStus Prolog </body></html>
The example shows the code of a JSP (Java Server Page). It makes use
of the method PrologSession.getPrologSession(String jndiName,
HTTPSession session)
, which uses JNDI to look up a registered
PrologSession
, which is connected to the Prolog server. The
variable session is in a JSP bound to the current
HTTPSession
, and the variable request is bound to the
current HTTPRequest
. Since the HTTPSession
object
session
is specified all queries to the Prolog server will
contain a session id. The rest of the example shows how to send a
query and output the answer.
Example usage of sessions (from the sessionsum
example) is shown
below, and is from pbexamples('sessionsum/sessionsum.pl')
:
:- module(sessionsum,[main/0,sum/5]). :- use_module(library(prologbeans)). :- use_module(library(charsio), [read_from_chars/2]). %% Register the acceptable queries (session based) main:- register_query(sum(C,Sum,Average,Count), sum(C,Session,Sum,Average,Count), Session), start. %% The sum predicate which gets the information from a session database, %% makes some updates and then stores it back in to the session store %% (and returns the information back to the application server) sum(ExprChars, Session, Sum, Average, Count) :- session_get(Session, sum, 0, OldSum), session_get(Session, count, 0, OldCount), read_from_chars(ExprChars, Expr), Val is Expr, Sum is OldSum + Val, Count is OldCount + 1, Average is Sum / Count, session_put(Session, sum, Sum), session_put(Session, count, Count).
In this example a query sum/4
is registered to use a predicate
sum/5
where one of the variables, Session will
be bound to the session id associated to the query. The sum/5
predicate uses the session_get/4
predicate to access stored
information about the particular session, and then it performs the
evaluation of the expression. Finally, it updates and stores the values
for this session.