【发布时间】:2014-07-08 21:40:46
【问题描述】:
我正在尝试处理从 Qt 制作的 GUI 界面获得的数字列表。具体来说,我想在一个标签中向用户返回一个包含所有数字的列表,这些数字甚至在他的输入列表中。感谢用户 CapelliC,我设法包含了所有文件和库,以使 SWI-Prolog 在 C++ 内部工作,我现在正在尝试开发该程序。
要求我使用 Prolog 的 C++ 接口,以便我通过 QLineEdit 对象从用户接收列表,将列表发送到 Prolog 引擎,然后 Prolog 应该将结果返回给 C++ 程序对的列表。
我已经制定了从列表中提取对并将其作为另一个列表返回的规则。这些是我的 manejoListas.pl 文件的内容,我的程序的 SWI-Prolog 知识库:
pares(Lista,ListaPares):-findall(Numero,(member(Numero,Lista),mod(Numero,2)=:=0),ListaPares).
这在 SWI-Prolog 中可以正常工作。现在,我想在我的基于 C++ 和 Qt 的程序上加载这个 .pl 文件,将输入列表发送到这个规则并获得结果列表,由参数 ListaPares 指向我的 C++ 接口,以便我可以将其展示给用户。
我已阅读外语界面文档,但无法找到解决此特定场景所需的内容。到目前为止,这是我盲目地基于一个不完整的“教程”,我在 youtube 上发现有人懒得解释他为另一个不相关的问题做了什么,主要是使用 Qt、C++ 和序言。
void MainWindow::on_btnPares_clicked()
{
QString listaEntrada = ui->txtListaEntrada->text();
term_t listaEntrada, listaPares, term;
functor_t paresFunc;
listaEntrada = PL_new_term_ref();
listaPares = PL_new_term_ref();
term = PL_new_term_ref();
PlCall("consult('manejoListas.pl')"); //I assume this opens my knowledgebase file so that i can work with it
paresFunc = PL_new_functor(PL_new_atom("pares"), 2);
PL_cons_functor(term, paresFunc, listaEntrada, listaPares);
if(PL_call(term, NULL)) {
PL_get_string()
}
}
我无法前进,我不知道如何将列表传递给 SWI-Prolog,甚至不知道如何构建我应该发送给 Prolog 的正确咨询或如何接收答案。该程序的行为应该与我向 SWI-Prolog 运行以下咨询完全一样:
?- pares([2,4,8,9],X).
X = [2, 4, 8].
提前感谢您提供的任何帮助。
【问题讨论】:
标签: c++ qt prolog swi-prolog