2014-10-03 69 views
3

我想为Prolog中的AI构建知识库。首先,我想尝试学习Prolog,通过用大象,巨蚂蚁等做玩具示例来使用它。在JPL中查询具有多个结果的Prolog

我正在使用:NetBeans 8.0.1,SWI-Prolog 6.6.6和Windows 8.1。一切都是64位的,并且环境变量是正确设置的。我还链接到我的NetBeans库中的jpl.jar

我的Prolog的知识基础是这样的:

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时尝试获得多个答案,我会遇到堆栈溢出错误。

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

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")时,堆栈溢出错误似乎发生。

这是我的控制台输出如下:

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.) 

如何解决这个任何想法?如果需要,我会很乐意提供更多信息。

+0

有你尝试增加java的堆栈大小? '-ss'和'-oss'标志可能派上用场。 – 2014-10-04 11:38:45

+0

使用-ss增加堆栈大小似乎会使程序在这种情况下不确定地冻结。 – m0rch 2014-10-06 14:23:40

回答

0

我不能让它在我的机器上运行的喷气推进实验室了,但看的文档,你可能想使用一个Variable对象,并构建查询喜欢你没有为q3

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

这样做似乎隐藏了错误。而不是在控制台中出现堆栈溢出错误,我得到X = null的五个实例(正确数量的解决方案!)。但是,如果我使用中断点并尝试“手动”查看存储的解决方案,那么在显示值的框中,我会在一段时间后出现相同的堆栈溢出错误。我也尝试在我的问题中链接到的线程的第二个解决方案中使用Compound,同样的错误。 – m0rch 2014-10-08 15:13:49

+0

对不起,我失去了这个答案的关注。我编辑了一个可能的解决方案。 JPL窗台没有在我的机器上运行。但是你必须确定变量的名称。 – 2015-01-03 12:18:09

相关问题