【问题标题】:Communicating facts to Prolog when invoking it from C/C++ (without using assert)从 C/C++ 调用 Prolog 时向 Prolog 传达事实(不使用断言)
【发布时间】:2014-05-21 11:42:40
【问题描述】:

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

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

是否有向 Prolog 求解器提供这些非动态事实的首选方式?还是断言它们是我唯一/最好的选择?

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

很抱歉,如果这个问题已经得到解答,我是 Prolog 的新手,无法找到相关的搜索词!

提前感谢您的任何建议!

【问题讨论】:

    标签: c++ prolog


    【解决方案1】:

    由于您使用的是 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... 我不确定它是否仍然是最新的,请放心...

    【讨论】:

      猜你喜欢
      • 2015-06-30
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多