2

我正在使用 tuProlog 将 Prolog 与 Java 集成,为此我定义了一个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();

        }
});

finalResult只是一个全局变量,其中包含 Prolog 写指令产生的返回字符串。

于 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 回答