从 C/C++ 调用 Prolog 时将事实传达给 Prolog(不使用断言)



一些背景:我正在编写一个工具来解析代码,生成一些需要满足的约束,并尝试通过为这些约束中的变量找到令人满意的赋值来解决它们(细节超出了重点)。

我已经在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).

好吧,细节可能很复杂,一些更用户友好的信息在这里......我不确定它是否仍然是最新的,请放轻松...

最新更新