Prolog で AI のナレッジ ベースを構築したいと考えています。まず、ゾウや巨大アリなどのおもちゃの例を使って、Prolog とその使い方を学びたいと思います。
私が使用しているのは、NetBeans 8.0.1、SWI-Prolog 6.6.6、および Windows 8.1 です。すべてが 64 ビットで、環境変数が正しく設定されています。jpl.jar
NetBeans ライブラリの にもリンクしました。
私の 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).
これに触発されました。知識ベースは、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 コードはほとんどここから取られました。
solution.get("X")
NetBeans のデバッガーから得られる情報から、スタック オーバーフロー エラーは、Java がコード スニペットの最後で の値を決定しようとしているときに発生するようです。
これは私のコンソール出力がどのように見えるかです:
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.)
これを解決する方法についてのアイデアはありますか? 必要に応じて、さらに情報を提供します。