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

时间:2014-04-08 16:21:55

标签: c++ prolog

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

我在Prolog中编写了约束求解逻辑,但代码解析和约束生成在C ++前端。所以我想从C ++调用Prolog,我目前通过SWI-Prolog API进行调用。我需要提供有关解析代码(例如,变量名)的Prolog求解器事实以及为解决它们而生成的约束。现在,我通过C ++ API调用assert(fact)来提供这些事实(首先在Prolog求解器中将这些谓词声明为动态),然后通过查询求解器。然而,我厌倦了以这种方式使用断言,而不是真正动态的事实。

是否有一种首选方法可以将这些非动态事实提供给Prolog解算器?或者断言他们是我唯一/最好的选择?

要清楚,我不想在.pl文件中发出事实列表,然后使用解析此.pl文件的求解器逻辑启动一个单独的进程,因为我想要解决的结果从我调用求解器的C ++基础结构中可用。

对不起,如果已经回答了这个问题,我是Prolog的新手,无法提出相关搜索条款!

提前感谢任何建议!

1 个答案:

答案 0 :(得分:0)

由于您正在使用SWI-Prolog和C ++,您可能对我编写的Qt和SWI-Prolog接口代码感兴趣。

具体来说,一组简单的宏(你可以找到所有的here)允许以这种方式调用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).

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