我想为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.)
如何解决这个任何想法?如果需要,我会很乐意提供更多信息。
有你尝试增加java的堆栈大小? '-ss'和'-oss'标志可能派上用场。 – 2014-10-04 11:38:45
使用-ss增加堆栈大小似乎会使程序在这种情况下不确定地冻结。 – m0rch 2014-10-06 14:23:40