在C++中嵌入Prolog逻辑引擎的Linux g++

5

我有一个C++程序中的逻辑非常复杂,需要多个解决方案,使用Prolog是最理想的。它有点像防火墙配置脚本,检查输入是否符合要求,但有时需要执行多个操作。

我的期望是这样的:

class PrologEngine
{
    LoadLogic(const char* filename) throw PrologException; // Load a file of prolog rules, predicates facts etc in textual format. Must be callable multiple times to load AND COMPILE (for speed) prolog rule files.

    std::vector<std::string> Evaluate(const char* predicate_in_string_form = "execute(input, Result)") throw PrologException; Returns a vector of matching predicates in text form.

};

不需要调用C++的能力。

AMI Prolog似乎可以做到,但它不适用于Linux。我正在尝试使用SWI-Prolog,但只找到了2个示例和一个非常复杂的API(我个人认为)。

有人能向我指出一个接近我寻找的示例吗?


这篇博客文章有一个使用SWI-Prolog的小例子,展示了你想做的事情:http://electricbacon.wordpress.com/2010/09/08/calc-example-using-swi-prolog-and-c/ - HaskellElephant
为什么不使用CLIPS而不是Prolog?http://clipsrules.sourceforge.net/WhatIsCLIPS.html - devil
2个回答

4

有一个SWI-Prolog的C++接口,它是高级别的。

我正在解决问题,这里是连接到OpenGL的示例:

PREDICATE(glEvalCoord1d, 1) {
 double u = A1;
 glEvalCoord1d( u );
 return TRUE;
}

这段简洁的代码隐藏了许多“拜占庭主义”,使用隐式类型转换和一些宏。 接口设计得很好,是双向的:要从C++调用Prolog,可以使用PlCall('运行'查询,类似于你在答案中提到的Evaluate)或更结构化的PlQuery,获取多个结果...

如果您不需要链接到openGl,或者可以等待SWI-Prolog邮件列表中有希望得到的答案,那么您应该评估它。


3

Castor很有趣。你试过吗?我担心它可能相当低效。 - CapelliC
我想通了。一旦你弄清楚了,它就很好。在C++中编写谓词也很容易。这是核心。 - Walt Howard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接