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

Я пытаюсь совместить SWI-prolog с QProcess. Так что я уже могу взаимодействовать с прологом и отправлять ему вопросы, но всегда получаю только первый ответ. Поэтому я попытался отправить такие символы, как «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