天天看點

幾款常用規則引擎的簡單對比及示範

今天對比了一下這四個頗有代表性的規則引擎的規則語言。其中Ilog和visual rules是商業産品,沒有機會實戰。

1.一樣的If--Then 句式與Rete引擎

    四者都邑把原本雜亂不勘的if---else---elseif----else,拆成N條帶優先級的

"If  前提語句  then  實施語句" 的句式。

    四者都主要使用foreward-chaining的Rete引擎,按優先級比對條件語句,實施規則語句。

    規則實施後會激發事實的變化,引擎又會重新進行條件比對,直到不能再比對為止,Rete的算法保證了服從的最高。

2.開辟人員操縱的規則語言

2.1 Drools的XML架構+Java/Groovy/Python嵌入語言

     Drools的用XML的、 節點表達If--Then句式,而裡面可以嵌入上述語言的代碼作為判斷語句和實施語句。

     其中Java代碼會操縱Antlr進行解釋,而Groovy和Python自己即是腳本語言,可以直接調用。

     Drools的聰明之處在于,用XML節點來典型If--Then句式和事實定義,使引擎幹起活來很舒服。

     而操縱Java,Groovy等原生語言來做判斷和執行語句,讓程式員很輕易過渡、移植,學習曲線很低。

      hello.equals("Hello")

      helloWorld( hello );

<b>  2.2 ILog</b><b>的IRL(ILog Rule Language)</b>

        IRL用When{}Then{}表達

If--Then句式

        When

        {

           ?customer:

Customer(totalTime &gt;=1000);

        }

        Then

           execute

{?customer.setAmount(getAmount()-20.00);

        } 

    文檔稱IRL的文法是Java Syntax-like的,但我怎麼也看不出兩者是類似的。不過他因為是商業産品,有很強大的編輯器和管理工具,編寫規則的速度應該有一定效率。

  2.3 Jess的CLIPS

   jess用  =&gt;  表達 If-Then句式。 這CLIPS是真正的程式員專用語言,而且還若是很專業的程式員才習慣的工具。但這種原本即是用來做專家系統的AI語言,對規則的表達本事也應該是最強的。

   教學一下下面這段代碼,airplane有一個屬性--name,有兩個子類--噴氣式和螺旋槳飛機,其中螺旋槳飛機可以适用任意跑道,而噴射機不能使用Grass跑道。

; Fact templates

    (deftemplate airplane (slot name)) 

    (deftemplate jet extends airplane) 

    (deftemplate prop extends airplane) ;

     Rules 

    (defrule can-use-grass-runway

     (prop (name ?n))

      =&gt;

     (printout t "Aircraft can use grass - " ?n

crlf)) 

    (defrule can-use-asphalt-runway 

     (airplane (name ?n)) 

     =&gt; 

     (printout t "Aircraft can use asphalt - " ?n

crlf))

3.客戶使用的規則語言

   若是客戶可以自己盡情編寫規則,無疑是産品一個很大的賣點。大部分客戶都愛這樣的東西。而且也隻有把規則編寫交給客戶,才達到了規則引擎的全數意義。

<b>3.1 Drools</b><b>的 DSL </b>

     Drools的最新版Drools2.0Rc2裡,House和Conways

game of Live兩個例子有DSL的版本

     對比一下Java版本,功效如下:

      20

vs

    room.getName( ).equals( "calvin" )

   convertToCelsius( room.getTemperature() ) &gt; 20

     但這種XML Base的DSL文法實在好不了多少,而且實作的代價一點不少,要自己實作Conditons和Consequence Factory類,自行解釋那段XML,根柢上沒有什麼便利的底層支援。

    實在,一不做二不竭,爽性用Antlr來界說真正的DSL,同樣是實作Conditons和Consequence

Factory類概略更好。隻不外解釋XML誰都會,Antlr就沒什麼人用而已。

<b>3.2 ILog</b><b>的BAL(Business Action</b>

Language)-已改名ODM,最強王者

  從文檔來看,配合Ilog的編纂器,簡直即是很完美的規則語言了,價格貴了點。

If

    the call destination number is the preferred number

Then

     apply the preferred number rate

<b>3.3 Visual Rules</b><b>(旗正規則引擎)--國内商業規則引擎代表:</b>

完全本土化的國内規則引擎,有自主知識産權,全中文操作,比較适合國人習慣,在處理速度、記憶體占用方面都擁有一定的優勢,感覺有些ILOG的翻譯版本的意思,算是良心之作了。看看表現形式:

幾款常用規則引擎的簡單對比及示範

全中文操作界面,看起來比較親切,規則表現形式也更為簡潔人性化。有興趣的同學可以去玩玩試用版本。

全中文操作,很容易上手,也較為适合業務來使用,可以打通IT和業務之間的溝通隔閡,個人挺看好的。