3

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

もうどうしたらいいのかわからない。次の回答を得るにはどうすればよいですか、またはすべての回答を表示するようにプロローグに指示するにはどうすればよいですか?

4

1 に答える 1

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");
于 2012-12-24T11:43:13.453 に答える