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

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。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     但這種XML Base的DSL文法其實好不了多少,而且實現的代價一點不少,要自己實現Conditons和Consequence Factory類,自行解釋那段XML,基本上沒有什麼便利的底層支援。
    其實,一不做二不休,乾脆用Antlr來定義真正的DSL,同樣是實現Conditons和Consequence Factory類可能更好。只不過解釋XML人人都會,Antlr就比較少人用而已。

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

 

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

If
    the call destination number is the preferred number
Then
     apply the preferred number rate 是最有名的商用BRMS,剛拿了JOLT;
Drools 是最活躍的開源規則引擎,一路高歌猛進;
Jess 是Clips的java實現,就如JRuby之於Ruby,是AI系的代表。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.