【问题标题】:tuProlog unknown behaviortuProlog 未知行为
【发布时间】:2012-04-03 23:25:26
【问题描述】:

我正在使用 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',你知道为什么会出现这种行为吗?

【问题讨论】:

  • @ProfVersaggi,我需要你的帮助!
  • 我正要写出几乎这个确切的问题! :)

标签: java prolog tuprolog


【解决方案1】:

终于发现行为一点都不飘忽:)

解决方案是在调用 Solve 方法之前添加此代码。

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

        }
});

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

【讨论】:

    【解决方案2】:

    您的解决方案(正确)是成功的 Prolog 查询 (go/0),您所期望的 ('hello world!') 它是内置函数的输出,因此您应该检查 Java 引擎的“stdout”。

    否则,将您的程序编码为“返回”变量中的信息。

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

    然后 tuProlog 将提供访问实例变量的方法。

    【讨论】:

      【解决方案3】:

      我不了解 tuProlog/Java,但是当从 PHP 调用 Swi-Prolog 时,我必须将 'halt' 作为谓词的最后语句,以告诉 Prolog 退出并将控制权返回给 php。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-03
        • 2020-05-19
        • 1970-01-01
        相关资源
        最近更新 更多