Как запустить предикат, который содержит списки в качестве аргумента, используя GNU Prolog для Java? - PullRequest
1 голос
/ 26 марта 2019

Я пытался использовать библиотеку gnu prolog для java для выполнения файла пролога.Мне удалось заставить его работать для базового предиката, но когда я пытаюсь разобрать список выходных данных механизма пролога, он не работает правильно.

Мой код Java выглядит следующим образом:

    gnu.prolog.vm.Environment environment = new Environment();
environment.ensureLoaded(AtomTerm.get(PrologTest.class.getResource("main.pro").getFile()));

    gnu.prolog.vm.Interpreter interp = environment.createInterpreter();
    environment.runInitialization(interp);

    Term[] listElements = { new IntegerTerm(1), new IntegerTerm(2)};
    Term termElements = new CompoundTerm(TermConstants.listTag, listElements);
    Term[] listElements2 =  { new IntegerTerm(1), new IntegerTerm(2)};
    Term termElements2 = new CompoundTerm(TermConstants.listTag, listElements2);
    Term[]argumentsQuestion = {termElements,termElements2};

    CompoundTerm goalTerm = new CompoundTerm(AtomTerm.get("same"), argumentsQuestion);

    int rc;
    Interpreter.Goal goal = interp.prepareGoal(goalTerm);
     rc = interp.execute(goal); 
     System.out.println("rc value"+rc); 
        if (rc == PrologCode.SUCCESS || rc == PrologCode.SUCCESS_LAST)
        { System.out.println("OK"); }else{
      System.out.println("error"); }

Мой файл main.pro содержит следующий предикат:

same([H1|R1], [H2|R2]):- H1 is H2 , same (R1,R2).
same([], []) :- true.

Проблема в том, что значение rc всегда равно -1.Я попытался изменить файл main.pro следующим образом:

same([H1|R1], [H2|R2]):- H1 is H2.
same([], []) :- true.

В этом случае программа работает правильно, поэтому программа правильно анализирует список и правильно читает первое значение списка.

1 Ответ

0 голосов
/ 26 марта 2019

Стандартный предикат is/2 выполняет арифметическую оценку , оценивая второй аргумент как арифметическое выражение и объединяя результат с первым аргументом.

Попробуйте вместо:

same([H| R1], [H| R2]):- same(R1,R2).
same([], []).

Но обратите внимание, что это выполняется так же, как следующее гораздо более простое определение:

same(List, List).

или

List1 = List2

Может быть, вы хотите / должны использовать термин равенство вместо термин объединение , как в решениях выше? Если это так, попробуйте:

same([H1| R1], [H1| R2]):- H1 == H2, same(R1,R2).
same([], []).
...