我下载了tuprolog,但是在PROL ide中得到答案时,我无法获得以下查询的结果..有人可以帮忙吗?

verb(admit-1).
verb(work-4).
nsubjpass(admit-1, patient-2).
agent(admit-1, doctor-3).
nsubj(work-4, who-5).
aux(work-4, be-6).
rcmod(doctor-3, work-4).
prep_in(work-4, clinic-7).


aggregation('part of').
aggregation('belongs to').
aggregation('subdivision of').
aggregation('have').
aggregation('contain').
aggregation('comprise').
aggregation('include').
aggregation('define').
aggregation('consist of').
aggregation('compose of').
aggregation('denote by').
aggregation('identify by').
aggregation('make up of').
aggregation('record with').

attribute('have').
attribute('contain').
attribute('comprise').
attribute('include').
attribute('define').
attribute('consist of').
attribute('compose of').
attribute('denote by').
attribute('identify by').
attribute('make up of').
attribute('record with').

generalization('be').
generalization('kind of').
generalization('type of').
generalization('classify into').
generalization('consider').

object(X) :- noun(X).
relation(X) :-  verb(X).
rel(X,Y) :- nsubjpass(X,Y).
rel(X,Y) :- agent(X,Y).
rel(X,Y) :- nsubj(X,Y).
rel(X,Y) :- aux(X,Y).
rel(X,Y) :- rcmod(X,Y).
rel(X,Y) :- prep_in(X,Y).

associatedWith(X,Y) :- rel(X,Y).
associatedWith(X,Y,Z) :- verb(Y),associatedWith(X,Y), associatedWith(Y,Z).
associatedWith(X,Y,Z) :- verb(X),associatedWith(X,Y), associatedWith(X,Z).
rel_aggregation(X,Y,R):-rel(X,Y).aggregation(R).

?- associatedWith(X,Y,Z).


我需要处理此类关系并让输出再次在Java中处理

谁能告诉我如何集成prolog和java?

编辑:
我通过实现代码在tuprolog中收到此错误

此代码适用于associatedWith(X,Y)。即有2个参数,但是当我给3个参数associatedWith(X,Y,Z)时不起作用。该怎么办..请帮助我得到此异常

java.lang.ClassCastException: alice.tuprolog.Var cannot be cast to alice.tuprolog.Struct
        at alice.tuprolog.lib.BasicLibrary.agent_2(Unknown Source)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at alice.tuprolog.PrimitiveInfo.evalAsPredicate(Unknown Source)
        at alice.tuprolog.StateGoalEvaluation.doJob(Unknown Source)
        at alice.tuprolog.Engine.run(Unknown Source)
        at alice.tuprolog.EngineManager.solve(Unknown Source)
        at alice.tuprolog.Prolog.solve(Unknown Source)
        at javaapplication9.Main.main(Main.java:26)
Exception in thread "main" alice.tuprolog.NoSolutionException
        at alice.tuprolog.SolveInfo.getSolution(Unknown Source)
        at javaapplication9.Main.main(Main.java:28)
Java Result: 1

最佳答案

您需要用Java处理的主要tuProlog对象是:Theory,可用于表示Prolog程序; Prolog,即您要查询的解释器;和SolveInfo,包含解释器找到的每个解决方案的数据。

假设您的Prolog程序(即您发布的所有代码,除了最后一行除外)都包含在名为theory.pl的文件中。粗略地讲(即模导入和异常),您需要遵循的过程类似于:

Prolog engine = new Prolog();
Theory theory = new Theory(new FileInputStream("theory.pl"));
engine.setTheory(theory);
SolveInfo solution = engine.solve("associatedWith(X, Y, Z).");
if (solution.isSuccess()) {
    System.out.println(solution.getTerm("X"));
    System.out.println(solution.getTerm("Y"));
    System.out.println(solution.getTerm("Z"));
}


如果查询可能产生多个解决方案,请使用while循环使用Prolog.hasOpenAlternatives测试开放选择点的存在,并使用Prolog.solveNext检索另一解决方案。

手册的第8章(一个PDF文件,您可以在任何tuProlog发行版​​的doc子目录中找到)中包含许多小型示例,这些示例说明了从Java代码与Prolog进行交互的复杂性不断提高(特别是参见8.4节)。

09-25 22:18