如何使用QProcess获得SWI-prolog查询的下一个解决方案?

时间:2012-12-24 10:40:42

标签: qt prolog swi-prolog qprocess

我正在尝试将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向我展示所有答案?

1 个答案:

答案 0 :(得分: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");