Ilog、Drools、Jess規則引擎的Rule Language 對比

 
Ilog JRules 是最有名的商用BRMS,剛拿了JOLT;
Drools 是最活躍的開源規則引擎,一路高歌猛進;
Jess 是Clips的java實現,就如JRuby之於Ruby,是AI系的代表。
今天對比了一下這三個頗有代表性的規則引擎的規則語言。其中Ilog是商業產品,沒有機會實戰。
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的<Conditons>、<Consequence> 節點表達If--Then句式,而裏面可以嵌入上述語言的代碼作爲判斷語句和實施語句。
     其中Java代碼會操縱Antlr進行解釋,而Groovy和Python自己即是腳本語言,可以直接調用。
     Drools的聰明之處在於,用XML節點來典型If--Then句式和事實定義,使引擎幹起活來很舒服。
     而操縱Java,Groovy等原生語言來做判斷和執行語句,讓程序員很輕易過渡、移植,學習曲線很低。
    <java:condition>
            hello.equals("Hello")
    </java:condition>

    <java:consequence>
            helloWorld( hello );
    </java:consequence>
  2.2 ILog的IRL(ILog Rule Language)
        IRL用When{}Then{}表達 If--Then句式
                When
                {
                     ?customer: Customer(totalTime >=1000);
                }
                Then
                {
                     execute {?customer.setAmount(getAmount()-20.00);
                }

    文檔稱IRL的語法是Java Syntax-like的,但我怎麼也看不出兩者是類似的。不過他因爲是商業產品,有很強大的編輯器和管理工具,編寫規則的速度應該有一定效率。
  2.3 Jess的CLIPS
   jess用  =>  表達 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))
            =>
         (printout t "Aircraft can use grass - " ?n crlf))    
        
        (defrule can-use-asphalt-runway    
         (airplane (name ?n))    
         =>    
         (printout t "Aircraft can use asphalt - " ?n crlf))
3.客戶使用的規則語言
   若是客戶可以自己盡情編寫規則,無疑是產品一個很大的賣點。大部分客戶都愛這樣的東西。而且也只有把規則編寫交給客戶,才達到了規則引擎的全數意義。
3.1 Drools的 DSL
     Drools的最新版Drools2.0Rc2裏,House和Conways game of Live兩個例子有DSL的版本
     對比一下Java版本,功效如下:
<house:condition>
    <house:room name="calvin">
        <house:溫度>
            <house:greater-than scale="攝氏">20</house:greater-than>
        </house:溫度>
    </house:room>
</house:condition>

vs
<java:condition>
        room.getName( ).equals( "calvin" )
<java:condition>
<java:condition>
     convertToCelsius( room.getTemperature() ) > 20
<java:condition>

     但這種XML Base的DSL語法實在好不了多少,而且實現的代價一點不少,要自己實現Conditons和Consequence Factory類,自行解釋那段XML,根柢上沒有什麼便利的底層支持。
    實在,一不做二不竭,爽性用Antlr來界說真正的DSL,同樣是實現Conditons和Consequence Factory類概略更好。只不外解釋XML誰都會,Antlr就沒什麼人用而已。
3.2 ILog的BAL(Business Action Language)--最完竣的王者?
   沒有現實用過,只能看文檔過過癮。從文檔來看,配合Ilog的編纂器,簡直即是很完美的規則語言了。
If
        the call destination number is the preferred number
Then
         apply the preferred number rate
3.3 其實文章到這裏應該結束了,不過還是忍不住介紹一個國內的規則引擎:Visual Rules
對其免費版本下載和使用,根據實例做了一個簡單的hello World,看來,和ILog實在差不多,但更本土化:
如果
     用戶名 = "admin"
那麼
     顯示 = "你好," + 用戶名
 
看着中文就是感覺親切。喜歡的朋友可以下載免費版玩玩。旗正信息技術: http://www.flagleader.com/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章