如何使用 GNU Prolog 运行 包含列表作为参数的谓词 Java?
How to run a predicate that contains lists as argument using GNU Prolog for Java?
我尝试使用 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.
程序在这种情况下工作正常,因此程序正确解析列表并正确读取列表的第一个值。
标准 is/2
谓词通过将第二个参数作为算术表达式求值并将结果与第一个参数统一来执行 算术求值。
试试看:
same([H| R1], [H| R2]):- same(R1,R2).
same([], []).
但请注意,这与以下更简单的定义实现的相同:
same(List, List).
或:
List1 = List2
也许您want/need使用术语平等而不是上述解决方案中的术语统一?如果是这样,请尝试:
same([H1| R1], [H1| R2]):- H1 == H2, same(R1,R2).
same([], []).
我尝试使用 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.
程序在这种情况下工作正常,因此程序正确解析列表并正确读取列表的第一个值。
标准 is/2
谓词通过将第二个参数作为算术表达式求值并将结果与第一个参数统一来执行 算术求值。
试试看:
same([H| R1], [H| R2]):- same(R1,R2).
same([], []).
但请注意,这与以下更简单的定义实现的相同:
same(List, List).
或:
List1 = List2
也许您want/need使用术语平等而不是上述解决方案中的术语统一?如果是这样,请尝试:
same([H1| R1], [H1| R2]):- H1 == H2, same(R1,R2).
same([], []).