首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在JPL中查询多个结果的Prolog

在JPL中查询多个结果的Prolog
EN

Stack Overflow用户
提问于 2014-10-03 22:22:42
回答 1查看 1.1K关注 0票数 3

我想用Prolog为人工智能建立一个知识库。首先,我想通过用大象、巨型蚂蚁等做一个玩具例子来学习Prolog和它的用途。

我使用的是: NetBeans 8.0.1,SWI-Prolog 6.6.6和Windows8.1。所有内容都是64位的,并且环境变量设置正确。我还链接到了我的NetBeans库中的jpl.jar

我的Prolog知识库如下所示:

代码语言:javascript
复制
bigger(elephant, horse).
bigger(horse, donkey).
bigger(donkey, dog).
bigger(donkey, monkey).
bigger(monkey, ant).
bigger(monkey, dog).
bigger(giant_ant, elephant).

is_bigger(X, Y) :- bigger(X, Y).
is_bigger(X, Y) :- bigger(X, Z), is_bigger(Z, Y).

灵感来自this。知识库在SWI-Prolog中运行时没有任何错误。

然而,在Java中,当X大于ant时,当我试图得到多个答案时,我遇到了堆栈溢出错误。

这是我的Java代码中使用JPL的代码片段。

代码语言:javascript
复制
Query q1 =
    new Query(
        "consult",
        new Term[] {new Atom("pathToFile\\bigger.pl")}
    );

System.out.println( "consult " + (q1.query() ? "succeeded" : "failed"));

Query q2 =
    new Query(
        "bigger",
        new Term[] {new Atom("giant_ant"),new Atom("elephant")}
    );
Boolean resp= q2.query();
System.out.println("bigger(elephant, horse) is " + resp.toString());

Query q3 =
    new Query(
        "is_bigger",
        new Term[] {new Atom("giant_ant"),new Atom("ant")}
    );

System.out.println(
    "is_bigger(giant_ant, ant) is " +
    ( q3.query() ? "provable" : "not provable" )
);

Query q4 = new Query("is_bigger(X, ant)");

java.util.Hashtable solution;

q4.query();

while ( q4.hasMoreSolutions() ){
    solution = q4.nextSolution();
    System.out.println( "X = " + solution.get("X"));
}

Java代码主要取自here

从我从NetBeans的调试器中得到的信息来看,堆栈溢出错误似乎是在Java试图确定代码片段末尾的solution.get("X")的值时发生的。

下面是我的控制台输出:

代码语言:javascript
复制
consult succeeded
bigger(elephant, horse) is true
is_bigger(giant_ant, ant) is provable
Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
at jpl.Term.getTerm(Term.java:614)
at jpl.Term.getTerm(Term.java:652)
at jpl.Term.getTerm(Term.java:652)
at jpl.Term.getTerm(Term.java:652)
at jpl.Term.getTerm(Term.java:652)
at jpl.Query.get1(Query.java:334) (and many more like this.)

对如何解决这个问题有什么想法吗?如果需要,我很乐意提供更多信息。

EN

回答 1

Stack Overflow用户

发布于 2014-10-06 23:32:47

我再也不能让它在我的机器上运行JPL了,但是从文档中看,您可能希望使用Variable对象并像对q3那样构造查询

代码语言:javascript
复制
Variable X = new Variable("X");
Query   q4 = new Query("is_bigger", new Term[]{X, new Atom("ant")});

while ( q4.hasMoreElements() ) {
 java.util.Hashtable solution = (Hashtable) q4.nextElement();
 System.out.println( "X = " + (Term) solution.get("X"));
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26180781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档