如何使用GNU Prolog for Java运行包含列表作为参数的谓词?

时间:2019-03-26 15:24:28

标签: java prolog ffi

我尝试使用Java的gnu prolog库执行一个prolog文件。我设法使其适用于基本谓词,但是当我尝试分析列出prolog引擎的输出时,它无法正常工作。

我的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 :(得分:0)

标准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([], []).