Power JavaDeveloping Intelligent Systems With Java and Prolog
- By by Lalit Pant
- April 18, 2000
Listing 4
/* Java 'wrapper' for astar.pro
* Loads astar.pro and provides foreign (java) predicates
*/
class GraphSearch
{
/**
* the logic engine
*/
LogicServer ls;
/**
* main program method. creates a JavaProlog object and passes
* control to it
*/
public static void main(String args[])
{
GraphSearch gs = new GraphSearch();
gs.run();
}
/**
* runs the prolog engine
*/
public void run()
{
try
{
ls = new LogicServer();
ls.Init("");
ls.AddPred("result", 1, "GraphSearch", "result", this);
ls.AddPred("distance_calc", 5, "GraphSearch", "distCalc", this);
ls.Load("amzi4.xpl");
ls.ExecStr("consult(astar)");
ls.ExecStr("astar_search(a, h)");
}
catch(LSException e)
{
e.printStackTrace();
System.exit(1);
}
}
/**
* prints the term passed to this predicate
* @return true if the printing succeeds
*/
public boolean result()
{
// System.out.println("--> result");
String answer;
boolean tf;
try
{
long term = ls.GetParm(1);
String result = ls.TermToStr(term, 200);
System.out.println(result);
// System.out.println("<-- result");
return true;
}
catch (LSException e)
{
System.out.println(e.GetMsg());
e.printStackTrace();
return false;
}
}
/**
* This method calculates the distance between two points
* on the map. The x,y coordinates are obtained by making
* calls to the LogicServer
* @return true if the calculation succeeds
*/
public boolean distCalc()
{
// System.out.println("--> distCalc");
// Called from prolog like this:
// distance_calc(X1, Y1, X2, Y2, Dist).
try
{
// get (x,y) for first point
long term = ls.GetParm(1);
String result = ls.TermToStr(term, 80);
double x1 = Double.parseDouble(result);
term = ls.GetParm(2);
result = ls.TermToStr(term, 80);
double y1 = Double.parseDouble(result);
// get (x,y) for second point
term = ls.GetParm(3);
result = ls.TermToStr(term, 80);
double x2 = Double.parseDouble(result);
term = ls.GetParm(4);
result = ls.TermToStr(term, 80);
double y2 = Double.parseDouble(result);
// calculate distance between the two points
double dist = Math.sqrt(((x1-x2) * (x1-x2)) + ((y1-y2) * (y1-y2)));
String predicateResult = new Double(dist).toString();
long predRes = ls.StrToTerm(predicateResult);
// Unify the fifth argument with the result
// When the call to the external predicate returns,
// the fifth argument contains the distance between
// the two points specified by the first four args.
ls.UnifyParm(5, predRes);
// System.out.println("<-- distCalc");
return true;
}
catch (LSException e)
{
System.out.println(e.GetMsg());
return false;
}
}
}