Как да получите следващото решение на SWI-prolog заявка с QProcess?

Опитвам се да комбинирам SWI-prolog с QProcess. Така че вече мога да взаимодействам с prolog и да изпращам въпроси към него, но винаги получавам само първия отговор. Така че се опитах да изпратя такива символи като "n" или "r", които трябва да ми дадат следващия отговор на моята заявка като в черупката. Въпреки това не работи с 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 да ми покаже всички отговори?


person Paul    schedule 24.12.2012    source източник
comment
Спомням си, SWI-Prolog имаше API интерфейс за вграждане в приложения...   -  person hate-engine    schedule 24.12.2012
comment
Да, вграждането в Qt е конкретна възможност, върху която всъщност работя...   -  person CapelliC    schedule 24.12.2012


Отговори (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");
person CapelliC    schedule 24.12.2012