2012-02-15 22 views
4

我在C++程序中有一些邏輯,它不僅非常複雜,而且需要Prolog理想的多種解決方案。它有點像防火牆配置腳本,檢查輸入的動作,但有時需要更多的動作。Linux g ++在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(我的觀點)

任何人都可以指出一個接近我所尋找的例子嗎?

+0

這個博客文章有一個小例子,你想做什麼機智的swi-prolog:http://electricbacon.wordpress.com/2010/09/08/calc-example-using-swi-prolog-and-c/ – HaskellElephant 2012-02-15 16:46:00

+0

爲什麼不使用CLIPS而不是prolog? http://clipsrules.sourceforge.net/WhatIsCLIPS.html – devil 2012-12-03 02:16:26

回答

3

如果你不介意重寫在本地C++使用僅頭庫中的序言代碼,我會考慮的蓖麻庫: http://www.mpprogramming.com/cpp/

+0

Castor很有趣。你試過了嗎?我擔心這可能效率不高。 – CapelliC 2012-02-15 18:44:03

+0

我想通了。一旦你弄清楚了,這很好。用C++編寫謂詞也很容易。這是它的核心。 – 2012-02-28 04:16:02

4

A C++ interface to SWI-Prolog,這是較高的水平。

fighting with it,這裏橋接的OpenGL的一個例子:

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

這乾淨的代碼隱藏了很多「bizantinism」,使用隱式類型轉換和一些宏。界面很好,並且雙向:從C++調用Prolog有PlCall('運行'查詢,類似於評估你在答案中公開的)或者更多結構化的PlQuery,用於多個結果...

如果你不需要鏈接到openGl,或者可以等待聽到我希望從SWI-Prolog郵件列表中得到的答案,那麼您應該對它進行評估。