从 C/C++ 调用 Prolog 时将事实传达给 Prolog(不使用断言)
Communicating facts to Prolog when invoking it from C/C++ (without using assert)
一些背景:我正在编写一个工具来解析代码,生成一些需要满足的约束,并尝试通过为这些约束中的变量找到令人满意的赋值来解决它们(细节超出了重点)。
我已经在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).
好吧,细节可能很复杂,一些更用户友好的信息在这里......我不确定它是否仍然是最新的,请放轻松...
相关文章:
- 尝试使用 std::vector<std::thread时出现静态断言失败错误>
- uint_not_usable_without_attribute在业力规则中使用数字生成器时静态断言失败
- C++ 使用增强正则表达式库时断言崩溃
- 从 exe 文件 (Visual Studio ) 启动时调试断言失败
- 如何将向量断言到特征矩阵
- OpenCV - Python 断言错误:SAD 算法 - 立体相机视差图计算
- 使用 Google Test 对自定义断言函数进行单元测试
- 断言"id < 0"在Qt ActiveX中失败
- 初始值设定项列表构造和静态断言
- 在 CppUnit 中测试中止断言失败
- 使用扫描的调试断言失败
- MS 本机单元测试 - 断言::线程失败不起作用
- 如何断言 CRTP 的函数为最终函数?
- 迭代器跳闸视觉C++ 2017 断言
- 如何在 google test in windows 中管理断言
- 为什么我的Qt程序在断言失败后继续运行?
- 在C++中禁用断言宏
- 宏"断言"会在 C++20 中删除吗?
- 在 constexpr 函数中断言
- 从 C/C++ 调用 Prolog 时将事实传达给 Prolog(不使用断言)