gpt4 book ai didi

java - 在 JPL 中查询具有多个结果的 Prolog

转载 作者:行者123 更新时间:2023-12-02 04:37:28 29 4
gpt4 key购买 nike

我想在 Prolog 中为人工智能建立一个知识库。首先,我想尝试通过做一个大象、巨型 Ant 等玩具示例来学习 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 时尝试获取多个答案时,我遇到了堆栈溢出错误。

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

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

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

最佳答案

我无法再让它在我的机器上运行 JPL,但是通过查看文档,您可能希望使用 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"));
}

关于java - 在 JPL 中查询具有多个结果的 Prolog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26180781/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com