Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>I'm going insane with this...</p> <p>As I already mentioned above, there are some differences between Prolog in Java and Prolog via SWI.</p> <p>I'm currently using this code:</p> <pre><code>% this data is from original Prolog Dijkstra' algorithm implementation :- dynamic(best_so_far/2). findPath([Goal | Rest], Goal, Temp, Temp, [Goal | Rest]) :- !. findPath([A | Rest], Goal, Cost, Temp, Path) :- path(A, B, C), \+ member(B, Rest), NewCost is Temp + C, best_so_far(Limit, _), NewCost &lt; Limit, findPath([B, A | Rest], Goal, Cost, NewCost, Path). % ?- searchPath(aberdeen, glasgow, L, P). % searchPath(Start, Goal, BestLen, BestPath) :- retract_all(best_so_far(_, _)), asserta(best_so_far(50, [])), findPath([Start], Goal, Cost, 0, Path), % if we get here, it's because a lower Cost exists retract_all(best_so_far(_,_)), asserta(best_so_far(Cost, Path)), fail ; best_so_far(BestLen, BestPath). retract_all(Term):- retract(Term),fail. retract_all(_). </code></pre> <p>Asking for a result in SWI Prolog I'll get an answer in <strong>0.016 seconds</strong>. Java needs <strong>15 seconds</strong> for the same result! </p> <p><strong>Furthermore and even worse:</strong> at some point gnu prolog delivers <strong>a completely different result</strong>.</p> <p>Here is some outline of Java:</p> <pre><code>From 190 to 221 pathList: [221, 191, 190] distance: 2 From 191 to 221 pathList: [221, 251, 252, 253, 223, 193, 194, 195, 196, 197, 198, 199, 169, 139, 138, 137, 136, 135, 134, 133, 132, 131, 130, 129, 128, 127, 126, 125, 124, 123, 122, 121, 151, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191] distance: 43 From 190 to 221 pathList: [221, 191, 190] distance: 2 </code></pre> <p>You can clearly see, that there is a path from <strong>191</strong> to <strong>221</strong>. But instead of returning this result (<code>pathList: [221,191]</code>) I get a competely different path leading backwards from where my ghost came. Running the Query <code>searchPath(191,221, Distance, Path)</code> in SWI Prolog (instantly) returns </p> <pre><code>7 ?- searchPath(191,221, Cost, Path). Cost = 1, Path = [221, 191]. </code></pre> <p>Once again: I'm using the exact same code. I Copy&amp;Pasted it to make sure. And I'm passing the correct arguments (that's why I print them out).</p> <p><strong>I really don't know how to thank you (especially CapelliC). I'm sure you already spent far too much time for me. But I'm definitely on my wits' end.</strong></p> <p>Edit: Thought it might be useful to see my java code:</p> <pre><code>private int decideHunterMovement() { // term which contains the result of the prolog method VariableTerm pathTerm = new VariableTerm("Path"); VariableTerm distanceTerm = new VariableTerm("Distance"); Integer movement; List&lt;IntegerTerm&gt; pathList = new LinkedList&lt;IntegerTerm&gt;(); // Create the arguments to the compound term which is the question IntegerTerm hunterPosition = new IntegerTerm(hunter.getPosition()); IntegerTerm targetPosition = new IntegerTerm(pacman.getPosition()); // target for hunter is the pacman position long time= System.nanoTime (); Term[] arguments = { hunterPosition, targetPosition, distanceTerm, pathTerm}; // Construct the question CompoundTerm goalTerm = new CompoundTerm(AtomTerm.get("searchPath"), arguments); // Execute the goal and return the return code. int rc; System.out.println("From " + hunterPosition + " to " + targetPosition); try{ // Create the answer rc = interpreter.runOnce(goalTerm); time = (System.nanoTime () - time) / 1000 / 1000; System.out.println("Result in:" + time+ "ms"); // If it succeeded. if (rc == PrologCode.SUCCESS || rc == PrologCode.SUCCESS_LAST){ // Get hold of the actual Terms which the variable terms point to Term path = pathTerm.dereference(); Term distance = distanceTerm.dereference(); // Check it is valid if (path != null){ if (path instanceof CompoundTerm){ // convert CompoundTerm to a Java LinkedList convertToList((CompoundTerm) path, pathList); if(VERBOSE_MODE){ System.out.println("pathList: " + pathList); System.out.println("distance: " + (IntegerTerm) distance + "\n"); } }else{ throw new NoAnswerException("PROLOG ERROR: Answer is not a CompundTerm: (" + path + ")"); } }else{ throw new NoAnswerException("PROLOG ERROR: Answer null when it should not be null"); } }else{ throw new NoAnswerException("PROLOG ERROR: Goal failed"); } } catch (NoAnswerException e) { e.printStackTrace(); } catch (PrologException e1) { e1.printStackTrace(); } movement = decideMovement(pathList); return movement; } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload