1

我想在java中创建一个对象:

MyObject obj = new MyObject ();

我想通过 jpl 查询将它传递给 prolog。

我怎样才能完成java来prolog对象传递?

我知道我可以在这样的 prolog 文件中使用 jpl_new:

execMethod :-
  jpl_new('my_package.MyObject', [], Object),
  jpl_call(Object, myMethod, [], _ ).

但是,我想避免 jpl_new 调用,而只是将 jpl_call 与 java 对象 obj 一起使用。

反之, 我怎样才能完成 prolog 到 java 对象的传递?

我的意思是传递给 java,使用 jpl_new 调用创建的对象。

换句话说,我想在 java 和 prolog 之间共享一个对象状态。

4

1 回答 1

0

要从 Java 中访问 Prolog 知识库,可以使用 JPL Queries。让我们看一个简单的例子:

% Knowledge base (Prolog)
foo(x,bar).

all_foo(X,Y) :- foo(X,Y).

在java中,我们可以这样写:

String query = "all_foo(x,Y)";
System.out.println("First solution: " + Query.oneSolution(query).get("Y"));

这将返回“bar”作为 Y 中的答案。

反之亦然 - 正如您在问题中所展示的那样 - 当我们想要从 Prolog 文件中访问 Java 功能时,可以使用 JPL。

首先,查看jpl_call/4的文档,我们看到它的第一个参数可以是:

  • 类型、类对象或类名(用于表示类的静态方法,或用于 java.lang.Class 的静态或实例方法)
  • 类实例或数组(用于静态或实例方法)

因此,您可以自由地将类信息传递给 jpl_call/4 以执行某些方法。

随后,您可以使用jpl_get/3访问您的 Java 模型而不是执行逻辑。下面的示例显示了我们将 Prolog 变量 Color 绑定到 Java car 对象的字段的引用,该对象字段保存在 example.class.car 类的静态 final .colour 字段中。

jpl_get('example.class.car', colour, Colour)

更普遍:

jpl_get(+Class_or_Object, +Field, -Datum)

希望这有帮助。

祝你好运!

于 2016-06-11T08:29:11.877 回答