【问题标题】:How to get the next solution of a SWI-prolog query with QProcess?如何使用 QProcess 获得 SWI-prolog 查询的下一个解决方案?
【发布时间】:2012-12-24 19:43:13
【问题描述】:

我正在尝试将 SWI-prolog 与 QProcess 结合起来。所以我已经可以与 prolog 交互并向它发送问题,但我总是只得到第一个答案。因此,我尝试发送诸如“n”或“r”之类的字符,这应该像在 shell 中一样给我查询的下一个答案。但是,它不适用于 QProcess。这是我的代码:

connect(&p,SIGNAL(readyReadStandardError()),this,SLOT(readStdError()));
connect(&p,SIGNAL(readyReadStandardOutput()),this,SLOT(readStdOut()));

p.setProcessChannelMode(QProcess::MergedChannels);
p.start("swipl",QIODevice::ReadWrite | QIODevice::Unbuffered);
if(!p.waitForStarted())
    return;

p.write("consult(ws).\r\n");      //prolog program
if(!p.waitForBytesWritten())
{
    p.close();
    return;
}

p.write("test(X,Y).\r\n");       //query
if(!p.waitForBytesWritten())
{
    p.close();
    return;
}

p.write("n",1);                  //give me the next solution -> nothing happens

我不知道该怎么办了。如何获得下一个答案,或者如何让 prolog 显示所有答案?

【问题讨论】:

  • 我记得,SWI-Prolog 有一个用于嵌入应用程序的 API 接口...
  • 是的,在 Qt 中嵌入这是我实际正在研究的一种具体可能性......

标签: qt prolog swi-prolog qprocess


【解决方案1】:

我会使用类似的东西

p.write("forall(test(X,Y), writeln(test(X,Y))).\r\n");

或者更可重用的东西

QString q("forall(%1, writeln(%1)).\r\n");
p.write(q.arg("test(X,Y)"));

你明白了……

如果您愿意,也许为了简化答案解析,打印分隔变量

p.write("forall(test(X,Y), maplist(writeln, [X,Y])).\r\n");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    相关资源
    最近更新 更多