在C程序中集成Prolog

时间:2015-01-20 20:02:05

标签: c++ c prolog ffi swi-prolog

我想用C ++编写一个主程序,程序将生成事实动态以构建知识库,然后程序可以调用某些.pl文件中定义的规则并获取结果。例如, main.c中

int main()
{
   //generate facts like 
    // blue(car), red(bike), etc
    // do queries
    PL_call( "consult( 'pred.pl' )" );
    ...
    PL_call(goal_term, NULL);
}

pred.pl

whatisblue(X) :- blue(X).
whatisred(X) :- red(X).

我该怎么办?

我在C接口上阅读了swi-prolog手册,但只看到如何在Prolog中调用C模块或在C中调用Prolog,我没有看到如何混合在C和Prolog中定义的谓词。可能吗?感谢。

1 个答案:

答案 0 :(得分:0)

详细的答案现在已经超出了我的可能性,但总的来说,问题的答案是“是”'。

就在C ++中,使用C ++接口。它比C容易得多。所以使用PlCall,PlTermv等......

问题是在PlCall之前和之后正确绑定变量,因此您可以与Prolog交换值。

为了简化结构化值的构建,例如,查看these macros注释,谓词0,谓词1,...和结构1,结构2,...或考虑

#define unary(X) PlTerm X; PlCompound X ## _t(#X, X);

允许输入code

attrs2format_t::const_iterator p = attrs2format.find(k);
if (p == attrs2format.end()) {
    // attributes documented here:
    // http://www.swi-prolog.org/pldoc/doc_for?object=prolog_colour:syntax_colour/2

    unary(colour)
    unary(background)
    unary(bold)
    unary(underline)

    // use unification to match list' elements
    PlTail attrs(attr_list);
    PlTerm attr;
...

您可以找到here关于SWI-Prolog接口的一般说明