info-gnuprologjava
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Info-gnuprologjava] problems running a simple quicksort example


From: Benjamin Brunzel
Subject: Re: [Info-gnuprologjava] problems running a simple quicksort example
Date: Fri, 12 Nov 2010 13:45:19 +0100
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.15) Gecko/20101030 Icedove/3.0.10

Hi,

Thanks for your answer. As you mentioned there was a bug in the prolog
rules.
In line 1 of the prolog file quicksort(A,A). just returns the given
list. which is obviously wrong.
I corrected this and now it throws the exception described by me in the
last mail.

/usr/lib/jvm/java-6-sun/bin/java -cp
'/tmp/test/gnuprologjava-0.2.5.jar:.' Test
ergebnis
Exception in thread "main" gnu.prolog.vm.PrologException:
error(instantiation_error,error)
        at gnu.prolog.vm.PrologException.getError(PrologException.java:129)
        at gnu.prolog.vm.PrologException.getError(PrologException.java:118)
        at
gnu.prolog.vm.PrologException.instantiationError(PrologException.java:145)
        at gnu.prolog.vm.Evaluate.evaluate(Evaluate.java:153)
        at
gnu.prolog.vm.buildins.arithmetics.Predicate_less_than.execute(Predicate_less_than.java:38)
        at
gnu.prolog.vm.interpreter.InterpretedByteCode.execute(InterpretedByteCode.java:522)
        at
gnu.prolog.vm.interpreter.InterpretedByteCode.execute(InterpretedByteCode.java:522)
        at
gnu.prolog.vm.interpreter.InterpretedByteCode.execute(InterpretedByteCode.java:522)
        at
gnu.prolog.vm.interpreter.Predicate_call.staticExecute(Predicate_call.java:144)
        at gnu.prolog.vm.Interpreter.execute(Interpreter.java:507)
        at Test.main(Test.java:37)

the fixed prolog file is:

quicksort([],[]).
quicksort([Kopf|Rest], SortierteListe):- teilen(Kopf, Rest, Kleiner,
Groesser),quicksort(Kleiner, Kleiner_Sortiert),quicksort(Groesser,
Groesser_Sortiert),append(Kleiner_Sortiert, [Kopf|Groesser_Sortiert],
SortierteListe).
teilen(_, [], [], []).
teilen(Element, [Kopf|Rest], [Kopf|Kleiner], Groesser):-Kopf < Element,
!,teilen(Element, Rest, Kleiner, Groesser).
teilen(Element, [Kopf|Rest], Kleiner, [Kopf|Groesser]):-teilen(Element,
Rest, Kleiner, Groesser).

I think the error is related to the less than.
Prolog programs not using relations like greater than, less than, equal,
... seem to work.
Do you know that error? Do you know a solution to that issue?

Thanks,
Ben



On 11/11/2010 07:54 PM, Daniel Thomas wrote:
> Hello,
> I have tried running your code on my machine and the results were as
> follows:
>
> address@hidden:~$ vim Test.java #I removed the line numbers and edited the 
> path to quicksort.pl
> address@hidden:~$ vim quicksort.pl
> address@hidden:~$ javac -cp 
> '/home/daniel/dev/gnuprolog/releases/0.2.5/gnuprologjava-0.2.5/gnuprologjava-0.2.5.jar'
>  Test.java
> address@hidden:~$ java -cp 
> '/home/daniel/dev/gnuprolog/releases/0.2.5/gnuprologjava-0.2.5/gnuprologjava-0.2.5.jar:.'
>  Test
> ergebnis
> 0
> .(5,8,1,7,3)
>
>
> What exception do you get? I think that ".(5,8,1,7,3)" is probably the
> wrong answer as it doesn't appear to be particularly sorted.
>
> There is one bug I have found in your prolog:
> teilen(Element, [Kopf|Rset], Kleiner, [Kopf|Groesser]):-teilen(Element,
>         Rest, Kleiner, Groesser).
> "[Kopf|Rset]" should probably be "[Kopf|Rest]"
>
> That doesn't fix the missorting though.
>
> Does this help you? There is a demo program in the demo directory of the
> release zip file.
>
> In 0.3.0 the return codes of Interpreter.execute(Goal) etc. will be
> changed to be an enum which will make System.out.println(rc); print
> something slightly more useful than 0;
>
>
> Daniel
>
> On Wed, 2010-11-10 at 14:51 +0100, Benjamin Martin Brunzel wrote:
>   
>> Hi Folks,
>>
>> I am currently trying to run a simple quicksort example using gnu prolog
>> for java. I get an exception every time I  use a prolog file with more
>> then one rule in it.
>> I think the problem might be the representation of lists in a CompoundTerm
>> object.
>> Does anyone know what is wrong with it?
>> Is there a simple example program available?
>>
>> The Java Class:
>>
>>   1 import gnu.prolog.term.*;
>>   2 import gnu.prolog.vm.Environment;
>>   3 import gnu.prolog.vm.Interpreter;
>>   4 import gnu.prolog.vm.PrologException;
>>   5
>>   6
>>   7 public class Test {
>>   8
>>   9         /**
>>  10          * @param args
>>  11          * @throws PrologException
>>  12          */
>>  13         public static void main(String[] args) throws PrologException {
>>  14
>>  15                 Environment e = new Environment();
>>  16                
>> e.ensureLoaded(AtomTerm.get("C:\\Path\\to\\prolog\\files\\quicksort.pl"));
>>  17                 Interpreter i = e.createInterpreter();
>>  18                 e.runInitialization(i);
>>  19
>>  20                 VariableTerm ergebnis = new VariableTerm("ergebnis");
>>  21                 IntegerTerm[] elemente = new IntegerTerm[5];
>>  22                 elemente[0] = new IntegerTerm(5);
>>  23                 elemente[1] = new IntegerTerm(8);
>>  24                 elemente[2] = new IntegerTerm(1);
>>  25                 elemente[3] = new IntegerTerm(7);
>>  26                 elemente[4] = new IntegerTerm(3);
>>  27
>>  28                 CompoundTerm liste = new CompoundTerm(".", elemente);
>>  29
>>  30                 Term[] argumente = {ergebnis, liste};
>>  31
>>  32                 CompoundTerm anfrage = new CompoundTerm("quicksort",
>> argumente);
>>  33
>>  34                 System.out.println(ergebnis);
>>  35
>>  36                 Interpreter.Goal goal = i.prepareGoal(anfrage);
>>  37                 int rc = i.execute(goal);
>>  38                 System.out.println(rc);
>>  39
>>  40                 System.out.println(ergebnis);
>>  41
>>  42         }
>>  43
>>  44 }
>>
>> The Prolog File:
>>
>> quicksort(A, A).
>> quicksort([Kopf|Rest], SortierteListe):- teilen(Kopf, Rest, Kleiner,
>> Groesser),quicksort(Kleiner, Kleiner_Sortiert),quicksort(Groesser,
>> Groesser_Sortiert),append(Kleiner_Sortiert    , [Kopf|Groesser_Sortiert],
>> SortierteListe).
>> teilen(_, [], [], []).
>> teilen(Element, [Kopf|Rest], [Kopf|Kleiner], Groesser):-Kopf < Element,
>> !,teilen(Element, Rest, Kleiner, Groesser).
>> teilen(Element, [Kopf|Rset], Kleiner, [Kopf|Groesser]):-teilen(Element,
>> Rest, Kleiner, Groesser).
>>
>>
>> I used the version 0.2.5
>>
>> Please note that I am not on the mailing list so please cc me on your
>> answers.
>>
>> Thanks for your support.
>>
>>
>>
>>     
>   




reply via email to

[Prev in Thread] Current Thread [Next in Thread]