在tuProlog中执行查询时出错

时间:2010-09-18 09:48:58

标签: java prolog tuprolog

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

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)。即有两个参数,但当我给出与(X,Y,Z)相关的3个参数时,它们不起作用。该怎么做..请帮助我得到这个例外

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

2 个答案:

答案 0 :(得分:5)

您需要在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章(您应该在任何tuProlog发行版​​的doc子目录中找到的PDF文件)包含许多关于从Java代码与Prolog交互的复杂性日益增加的小例子(特别参见第8.4节)

答案 1 :(得分:3)

agent / 2是tuProlog中的内置谓词 - 您可以尝试重命名您的版本。