java - 在 tuProlog 中执行查询时出错

标签 java prolog tuprolog

我下载了 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) 时不起作用。怎么办..请帮助我得到这个异常(exception)

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 章(您应该在任何 tuProlog 发行版的 doc 子目录中找到的 PDF 文件)包含许多小示例,这些示例增加了从 Java 代码与 Prolog 交互的复杂性(具体参见第 8.4 节)。

关于java - 在 tuProlog 中执行查询时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3741152/

相关文章:

java - 我执行 "Intersection of Two Linked Lists"的错误在哪里?

prolog - 序言中的过滤器列表

java - 用 Maven 重命名一个 fat jar

java - 如何从 java servlet 返回一个 html 文档?

prolog - Prolog中@<和<之间的算术差异

序言存在时不给我解决方案

java - 如何让TuProlog识别无效事实?

android - 需要从Android捕获选择性STDOUT以在listview中显示

java - 如何从 swiprolog 转换为 tuprolog

java - 在 java 和 JSON 中编码希伯来语