2

Prolog を Java と統合するために tuProlog を使用しています。そのためにprolog.pl、次のコードでファイルを定義しました。

go:-write('hello world!'),nl. 

次に、私の Java プロジェクトでは、これを呼び出すメイン クラスがあります。

Prolog engine = new Prolog();
 
Theory theory = new Theory(new FileInputStream("prolog.pl"));
 
try {
           engine.setTheory(theory);
        } catch (InvalidTheoryException ex) {
            
        }
SolveInfo solution = engine.solve("go.");
 
if (solution.isSuccess()) {
  
    System.out.println(solution.getSolution());
}

このコードは 'hello world' を出力するはずですが、'go' を出力します。なぜこの動作をするのでしょうか?

4

3 に答える 3

2

最後に、動作がまったく不安定ではないことがわかりました:)

解決策は、Solve メソッドを呼び出す直前にこのコードを追加することです。

engine.addOutputListener(new OutputListener() {
        @Override
        public void onOutput(OutputEvent e) {
            finalResult += e.getMsg();

        }
});

finalResultProlog Write命令によって生成された返された文字列を含む単なるグローバル変数です。

于 2012-04-05T05:58:26.267 に答える
1

あなたの解決策は(正しく)成功した​​Prologクエリ(go/0)であり、期待するもの(「hello world!」)は組み込みの出力であるため、Javaエンジンの「stdout」を検査する必要があります。

それ以外の場合は、変数で情報を「返す」ようにプログラムをコーディングします。

go(X) :- X = 'hello world!'.

次に、tuProlog は、インスタンス化された変数にアクセスするためのメソッドを提供します。

于 2012-04-04T08:50:50.527 に答える
0

tuProlog/Java についてはわかりませんが、PHP から Swi-Prolog を呼び出す場合、述語の最後のステートメントとして 'halt' を配置して、Prolog を終了し、制御を php に戻すように指示する必要があります。

go:-write('hello world!'),nl, halt.
于 2012-04-04T06:43:03.480 に答える