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(我的观点)

谁能指出一个与我正在寻找的例子相近的例子?

4

2 回答 2

4

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

我正在与之抗争,这里有一个桥接到 OpenGL 的示例:

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

这个干净的代码隐藏了许多'bizantinism',使用隐式类型转换和一些宏。该接口非常坚固且双向:要从 C++ 调用 Prolog,可以使用 PlCall(“运行”查询,类似于您在答案中公开的 Evaluate)或更结构化的 PlQuery,以获得多个结果......

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

于 2012-02-15T17:17:05.747 回答
3

如果您不介意重写 prolog 代码以在本地 c++ 标头库中使用,我会查看 castor 库: http ://www.mpprogramming.com/cpp/

于 2012-02-15T17:09:50.657 回答