Ilog JRules 是最有名的商用BRMS,剛拿了JOLT;
Drools 是最活躍的開(kāi)源規則引擎,一路高歌猛進(jìn);
Jess 是Clips的java實(shí)現,就如JRuby之于Ruby,是AI系的代表。
今天對比了一下這三個(gè)頗有代表性的規則引擎的規則語(yǔ)言。其中Ilog是商業(yè)產(chǎn)品,沒(méi)有機會(huì )實(shí)戰。
1.一樣的If--Then 句式與Rete引擎
三者都會(huì )把原來(lái)混亂不堪的if---else---elseif----else謎團,
拆成N條帶優(yōu)先級的"If 條件語(yǔ)句 then 執行語(yǔ)句" 的句式。
三者都主要使用foreward-chaining的Rete引擎,按優(yōu)先級匹配條件語(yǔ)句,執行規則語(yǔ)句。
規則執行后會(huì )引發(fā)事實(shí)的變化,引擎又會(huì )重新進(jìn)行條件匹配,直到不能再匹配為止,Rete的算法保證了效率的最高。
2.開(kāi)發(fā)人員使用的規則語(yǔ)言
2.1 Drools的XML框架+Java/Groovy/Python嵌入語(yǔ)言
Drools的用XML的<Conditons>、<Consequence> 節點(diǎn)表達If--Then句式,而里面可以嵌入上述語(yǔ)言的代碼作為判斷語(yǔ)句和執行語(yǔ)句。
其中Java代碼會(huì )使用Antlr進(jìn)行解釋?zhuān)鳪roovy和Python本身就是腳本語(yǔ)言,可以直接調用。
Drools的聰明之處在于,用XML節點(diǎn)來(lái)規范If--Then句式和事實(shí)的定義,使引擎干起活來(lái)很舒服。
而使用Java,Groovy等原生語(yǔ)言來(lái)做判斷和執行語(yǔ)句,讓程序員很容易過(guò)渡、移植,學(xué)習曲線(xiàn)很低。
<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);
}
文檔稱(chēng)IRL的語(yǔ)法是Java Syntax-like的,但瞎子也能看出兩者有不同,不過(guò)他因為是商業(yè)產(chǎn)品,有很強大的編輯器和管理工具,編寫(xiě)規則的速度應該不壞。
2.3 Jess的CLIPS
jess用 => 表達 If-Then句式。 這CLIPS是真正的程序員專(zhuān)用語(yǔ)言,而且還要是很專(zhuān)業(yè)的程序員才習慣的東西。但這種本來(lái)就是用來(lái)做專(zhuān)家系統的AI語(yǔ)言,對規則的表達能力也應該是最強的。
講解一下下面這段代碼,airplane有一個(gè)屬性--name,有兩個(gè)子類(lèi)--噴氣式和螺旋槳飛機,其中螺旋槳飛機可以使用任意跑道,而噴氣式飛機不能使用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.客戶(hù)使用的規則語(yǔ)言
如果客戶(hù)可以自己任意編寫(xiě)規則,無(wú)疑是產(chǎn)品一個(gè)很大的賣(mài)點(diǎn)。大部分客戶(hù)都會(huì )喜歡這樣一個(gè)玩具。而且也只有把規則編寫(xiě)交給客戶(hù),才能達到規則引擎的全部意義。
3.1 Drools的 DSL
Drools的最新版Drools2.0Rc2里,House和Conways game of Live兩個(gè)例子有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語(yǔ)法其實(shí)好不了多少,而且實(shí)現的代價(jià)一點(diǎn)不少,要自己實(shí)現Conditons和Consequence Factory類(lèi),自行解釋那段XML,基本上沒(méi)有什么便利的底層支持。
其實(shí),一不做二不休,干脆用Antlr來(lái)定義真正的DSL,同樣是實(shí)現Conditons和Consequence Factory類(lèi)可能更好。只不過(guò)解釋XML人人都會(huì ),Antlr就比較少人用而已。
3.2 ILog的BAL(Business Action Language)--最完美的王者?
沒(méi)有實(shí)際用過(guò),只能看文檔過(guò)過(guò)癮。從文檔來(lái)看,配合Ilog的編輯器,的確就是最完美的規則語(yǔ)言了。
If
the call destination number is the preferred number
Then
apply the preferred number rate