我有一个嵌入 XSB Prolog 以用作约束求解器的程序 (C++)。我已经使用低级 C API 编写了代码来注入事实和运行查询。但我陷入了一个特定的问题。
我想(出于调试目的)运行查询,然后将查询统一的每个术语输出到流中。为了确保输出很好,我认为使用 的输出string:term_to_atom/2
来生成字符串会很好。
所以,我想把查询词放在寄存器 1 中,运行xsb_query()
,然后运行string:term_to_atom/2
结果。但是运行string:term_to_atom/2
本身就是一个查询,你不能xsb_query()
在查询中间运行。
我尝试使用xsb_query_save()
,希望我可以做一个子查询,然后是xsb_query_restore()
,但这似乎不起作用。对我的子查询的调用仍然失败,因为已经有一个查询正在进行中。
我考虑过保存一个使用withp2p_new()
统一创建的变量向量,但我不知道这些术语如何或何时会被垃圾收集,因为我认为 XSB Prolog 无法知道我的 C 程序正在使用它们。(除非我应该在处理完他们后给他们打电话给无证人员?)p2p_unify()
reg_term(1)
p2p_deref()
最后,我想在单个查询中执行此操作(如果可能),以避免将命名空间与临时规则混淆。但也许我太努力了,我应该完全使用另一种方法。想法?