一些背景:我正在编写一个工具来解析代码,生成一些需要满足的约束,并尝试通过为这些约束中的变量找到令人满意的赋值来解决它们(细节超出了重点)。
我已经在Prolog中编写了约束求解逻辑,但代码解析和约束生成位于C++前端。所以我想从C++调用Prolog,我目前正在通过SWI-Prolog API执行此操作。我需要提供有关解析代码(例如,变量名称)的 Prolog 求解器事实以及为其解决它们的生成约束。现在,我通过 C++ API 调用 assert(fact)(首先在 Prolog 求解器中将这些谓词声明为动态),然后查询求解器来提供这些事实。然而,我厌倦了以这种方式使用断言来表示并非真正动态的事实。
是否有一种首选方法将这些非动态事实提供给Prolog求解器?还是断言它们是我唯一/最好的选择?
需要明确的是,我不想在.pl文件中发出事实列表,然后使用查询此.pl文件的求解器逻辑启动一个单独的进程,因为我希望求解结果在我的C++基础结构中可用,从我调用求解器。
抱歉,如果这个问题已经得到回答,我是 Prolog 的新手,在想出相关搜索词时遇到问题!
提前感谢您的任何建议!
既然你使用的是SWI-Prolog和C++,也许你对我编写的接口Qt和SWI-Prolog的代码感兴趣。
具体来说,一组简单的宏(你可以在这里找到它们)允许以这种方式调用Prolog的谓词。
/** from :/prolog/syncol.pl */
predicate2(syncol_allfile)
..
try {
T results, f;
int rc = syncol_allfile(A(file), results);
pqTextAttributes ta;
for (L scanres(results); scanres.next(f); ) {
psd->add_element_sorted(t2w(f[3]), f[1], f[2], ta[f[4]]);
}
...
序言代码:
%% process entire file in Prolog, get back results list
%
:- thread_local frag/4.
syncol_allfile(F, L) :-
load_source(F),
xref_source(F),
open(F, read, S),
prolog_colourise_stream(S, F, callback_allfile),
close(S),
setof(frag(A, B, C, D), frag(A, B, C, D), L).
好吧,细节可能很复杂,一些更用户友好的信息在这里......我不确定它是否仍然是最新的,请放轻松...