3

Prolog で AI のナレッジ ベースを構築したいと考えています。まず、ゾウや巨大アリなどのおもちゃの例を使って、Prolog とその使い方を学びたいと思います。

私が使用しているのは、NetBeans 8.0.1、SWI-Prolog 6.6.6、および Windows 8.1 です。すべてが 64 ビットで、環境変数が正しく設定されています。jpl.jarNetBeans ライブラリの にもリンクしました。

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

これを解決する方法についてのアイデアはありますか? 必要に応じて、さらに情報を提供します。

4

1 に答える 1

0

私のマシンで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"));
}
于 2014-10-06T15:32:47.353 に答える