Ilog、Drools、Jess规则引擎的Rule Language 对比
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等原生語言來做判斷和執行語句,讓程序員很容易過渡、移植,學習曲線很低。
??????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: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就比較少人用而已。
????room.getName(?).equals(?"calvin"?)
<java:condition>
<java:condition>
???convertToCelsius(?room.getTemperature()?)?>?20
<java:condition>?
?
3.2 ILog的BAL(Business Action Language)--最完美的王者?
???沒有實際用過,只能看文檔過過癮。從文檔來看,配合Ilog的編輯器,的確就是很完美的規則語言了。
????the?call?destination?number?is?the?preferred?number
Then
?????apply?the?preferred?number?rate ?是最有名的商用BRMS,剛拿了JOLT;
Drools ?是最活躍的開源規則引擎,一路高歌猛進;
Jess ?是Clips的java實現,就如JRuby之于Ruby,是AI系的代表。
總結
以上是生活随笔為你收集整理的Ilog、Drools、Jess规则引擎的Rule Language 对比的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 监控摄像机如何连接到手机 手机APP远程
- 下一篇: html在背景图里加白框,8款低脂少油的