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

C++ 从C/C+调用Prolog时将事实传递给Prolog+;(不使用断言),c++,prolog,C++,Prolog,一些背景: 我正在编写一个工具来解析代码,生成一些需要满足的约束,并尝试通过为这些约束中的变量找到满足的赋值来解决这些约束(细节超出了重点) 我在PROlog中编写了约束求解逻辑,但是代码解析和约束生成是在C++前端。所以我想从C++调用Prolog,我现在通过SWI Prolog API来做。我需要提供Prolog解算器关于解析代码(例如,变量名)的事实以及为其生成的约束,以解决这些问题。现在,我通过调用C++(API)(先声明谓词作为Prolog求解器中的动态)然后通过查询求解器来提供这些事

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

我在PROlog中编写了约束求解逻辑,但是代码解析和约束生成是在C++前端。所以我想从C++调用Prolog,我现在通过SWI Prolog API来做。我需要提供Prolog解算器关于解析代码(例如,变量名)的事实以及为其生成的约束,以解决这些问题。现在,我通过调用C++(API)(先声明谓词作为Prolog求解器中的动态)然后通过查询求解器来提供这些事实。然而,对于那些并非真正动态的事实,我已经厌倦了以这种方式使用断言

是否有更好的方法向Prolog解算器提供这些非动态事实?还是说维护它们是我唯一/最好的选择

明确地说,我不想在.pl文件中发布一个事实列表,然后用与这个.pL文件协商的求解器逻辑来启动单独的进程,因为我希望解决的结果在我调用解决方案的C++基础结构中是可用的。 抱歉,如果已经回答了这个问题,我是Prolog新手,很难找到相关的搜索词


提前感谢您的建议

> P>因为你使用的是SWI PROlog和C++,也许你对我写的一些连接QT和SWIPROlog的代码感兴趣。 具体地说,一组简单的宏(您可以找到所有宏)允许以这种方式调用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).
嗯,细节可能很复杂,一些更方便用户的信息是。。。 我不确定它是否仍然是最新的,请放心