Ilog JRules 是最有名的商用BRMS,剛拿了JOLT;
Drools 是最活躍的開源規(guī)則引擎,一路高歌猛進(jìn);
Jess 是Clips的java實(shí)現(xiàn),就如JRuby之于Ruby,是AI系的代表。

今天對(duì)比了一下這三個(gè)頗有代表性的規(guī)則引擎的規(guī)則語言。其中Ilog是商業(yè)產(chǎn)品,沒有機(jī)會(huì)實(shí)戰(zhàn)。

作者:江南白衣 

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

    三者都會(huì)把原來混亂不堪的if---else---elseif----else謎團(tuán),
    拆成N條帶優(yōu)先級(jí)的"If  條件語句  then  執(zhí)行語句" 的句式。
   
    三者都主要使用foreward-chaining的Rete引擎,按優(yōu)先級(jí)匹配條件語句,執(zhí)行規(guī)則語句。
    規(guī)則執(zhí)行后會(huì)引發(fā)事實(shí)的變化,引擎又會(huì)重新進(jìn)行條件匹配,直到不能再匹配為止,Rete的算法保證了效率的最高。

2.開發(fā)人員使用的規(guī)則語言

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

     Drools的用XML的<Conditons>、<Consequence> 節(jié)點(diǎn)表達(dá)If--Then句式,而里面可以嵌入上述語言的代碼作為判斷語句和執(zhí)行語句。
     其中Java代碼會(huì)使用Antlr進(jìn)行解釋,而Groovy和Python本身就是腳本語言,可以直接調(diào)用。
     Drools的聰明之處在于,用XML節(jié)點(diǎn)來規(guī)范If--Then句式和事實(shí)的定義,使引擎干起活來很舒服。
     而使用Java,Groovy等原生語言來做判斷和執(zhí)行語句,讓程序員很容易過渡、移植,學(xué)習(xí)曲線很低。

  <java:condition>
      hello.equals("Hello")
  
</java:condition>

  
<java:consequence>
      helloWorld( hello );
  
</java:consequence>

  2.2 ILog的IRL(ILog Rule Language)

        IRL用When{}Then{}表達(dá) If--Then句式

        When
        {
           
?customer: Customer(totalTime >=1000);
        }
        Then
        {
           execute {
?customer.setAmount(getAmount()-20.00);
        } 

    文檔稱IRL的語法是Java Syntax-like的,但我怎么也看不出兩者是相同的。不過他因?yàn)槭巧虡I(yè)產(chǎn)品,有很強(qiáng)大的編輯器和管理工具,編寫規(guī)則的速度應(yīng)該不壞。

  2.3 Jess的CLIPS
   jess用  =>  表達(dá) If-Then句式。 這CLIPS是真正的程序員專用語言,而且還要是很專業(yè)的程序員才習(xí)慣的東西。但這種本來就是用來做專家系統(tǒng)的AI語言,對(duì)規(guī)則的表達(dá)能力也應(yīng)該是最強(qiáng)的。
   講解一下下面這段代碼,airplane有一個(gè)屬性--name,有兩個(gè)子類--噴氣式和螺旋槳飛機(jī),其中螺旋槳飛機(jī)可以使用任意跑道,而噴氣式飛機(jī)不能使用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.客戶使用的規(guī)則語言

   如果客戶可以自己任意編寫規(guī)則,無疑是產(chǎn)品一個(gè)很大的賣點(diǎn)。大部分客戶都會(huì)喜歡這樣一個(gè)玩具。而且也只有把規(guī)則編寫交給客戶,才能達(dá)到規(guī)則引擎的全部意義。

3.1 Drools的 DSL
     Drools的最新版Drools2.0Rc2里,House和Conways game of Live兩個(gè)例子有DSL的版本
     對(duì)比一下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語法其實(shí)好不了多少,而且實(shí)現(xiàn)的代價(jià)一點(diǎn)不少,要自己實(shí)現(xiàn)Conditons和Consequence Factory類,自行解釋那段XML,基本上沒有什么便利的底層支持。
    其實(shí),一不做二不休,干脆用Antlr來定義真正的DSL,同樣是實(shí)現(xiàn)Conditons和Consequence Factory類可能更好。只不過解釋XML人人都會(huì),Antlr就比較少人用而已。

3.2 ILog的BAL(Business Action Language)--最完美的王者?
   沒有實(shí)際用過,只能看文檔過過癮。從文檔來看,配合Ilog的編輯器,的確就是很完美的規(guī)則語言了。

If
    the call destination number is the preferred number
Then
     apply the preferred number rate