如何使用JPL在java和prolog之间共享对象状态?

时间:2015-07-24 13:00:17

标签: java prolog jpl

我想在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一起使用。

转而言, 如何完成java对象传递的prolog?

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

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

1 个答案:

答案 0 :(得分:0)

要从Java中访问Prolog知识库,您可以使用JPL查询。让我们看一下下面一个简单,琐碎的例子:

% 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绑定到example.class.car类的static final .colour字段中保存的Java car对象的字段的引用。

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

更一般地说:

jpl_get(+Class_or_Object, +Field, -Datum)

希望这会有所帮助。

祝你好运!