hyperjumptech/grule-rule-engine: Golang的規則引擎實現

banq發表於2022-02-16

Grule是 Go (Golang) 程式語言的規則引擎庫。受到廣受好評的 JBOSS Drools 的啟發,並以更簡單的方式完成。
與Drools一樣,Grule也有自己的DSL或領域特定語言。
下面是 Drools 的 DRL 或 Drools 規則語言的示例:

rule "SpeedUp"
    salience 10
    when
        $TestCar : TestCarClass( speedUp == true && speed < maxSpeed )
        $DistanceRecord : DistanceRecordClass()
    then
        $TestCar.setSpeed($TestCar.Speed + $TestCar.SpeedIncrement);
        update($TestCar);
        $DistanceRecord.setTotalDistance($DistanceRecord.getTotalDistance() + $TestCar.Speed);
        update($DistanceRecord);
end
 

Grule規則引擎是一個生產規則系統,它使用基於規則的方法來實現專家系統。專家系統是基於知識的系統,它使用知識表示將獲得的知識處理成可用於推理的知識庫。
生產規則系統是圖靈完備的,重點是知識表示,以簡潔、不含歧義和宣告性的方式表達命題和一階邏輯。
生產規則系統的大腦是一個推理引擎,可以擴充套件到大量規則和事實。推理引擎將事實和資料與生產規則(也稱為生產規則或僅稱為規則)相匹配,以推斷出導致行動的結論。
生產規則是一個由兩部分組成的結構,它使用一階邏輯對知識表示進行推理。業務規則引擎是在執行時生產環境中執行一個或多個業務規則的軟體系統。
規則引擎允許您定義“做什麼”而不是“如何做”。
 
規則是一些知識,通常表述為“當某些情況發生時,執行某些任務”。

When
   <Condition is true>
Then
   <Take desired Action>


規則最重要的部分是它的 when 部分。如果滿足when部分,則觸發then部分。

rule  <rule_name> <rule_description>
   <attribute> <value> {
   when
      <conditions>

   then
      <actions>
}
 

規則引擎的優點

 

  • 宣告式程式設計
    規則可以很容易地表達對困難問題的解決方案並獲得驗證。與程式碼不同,規則是用不太複雜的語言編寫的;業務分析師可以輕鬆閱讀和驗證一組規則。
  • 邏輯和資料分離
    資料位於域物件中,業務邏輯位於規則中。根據專案的型別,這種分離可能非常有利。
  • 知識的集中化
    透過使用規則,您可以建立一個可執行的知識庫(知識庫)。這是商業政策的單一真理。理想情況下,規則的可讀性很強,它們也可以用作文件。
  • 改變的敏捷性
    由於業務規則實際上被視為資料。根據業務的動態性質調整規則變得微不足道。無需像普通軟體開發那樣重新構建程式碼或部署 - 您只需推出一組規則並將它們應用於知識庫。

 

使用規則引擎可以更好地解決以下情況:
  1. 一個必須評估事實以提供某種現實世界結論的專家系統。如果不使用 RETE 風格的規則引擎,人們將編寫一組級聯的if/else語句,並且如何評估這些組合的排列將很快變得無法管理。基於表的規則引擎可能就足夠了,但它對變化仍然更加脆弱,而且編碼也不是很容易。像 Grule 這樣的系統允許您描述系統的規則和事實,使您無需描述如何根據這些事實評估規則,並且對您隱藏大部分複雜性。
  2. 一個評分系統。例如,銀行系統可能希望根據客戶的交易記錄(事實)為每個客戶建立一個“分數”。我們可以看到他們的分數變化取決於他們與銀行互動的頻率、他們轉入和轉出的金額、他們支付賬單的速度、他們應計的利息多少、他們為自己或為銀行賺了多少錢,以及很快。開發人員可以提供規則引擎,然後銀行客戶分析部門內的主題專家可以提供事實和規則的規範。將這些不同的團隊解耦,將責任放在應有的位置上。
  3. 電腦遊戲。玩家狀態、獎勵、懲罰、傷害、分數和機率系統是規則在大多數計算機遊戲中發揮重要作用的許多不同示例。這些規則可以以非常複雜的方式進行互動,通常以開發人員沒有預見到的方式進行。透過使用指令碼語言(例如 Lua)對這些動態情況進行編碼會變得相當複雜,而規則引擎可以幫助極大地簡化工作。
  4. 分類系統。這實際上是對上述評級系統的概括。使用規則引擎,我們可以對諸如信用資格、生化識別、保險產品風險評估、潛在安全威脅等內容進行分類。
  5. 建議/建議系統。“規則”只是另一種資料,這使其成為另一個程式定義的主要候選者。這個程式可以是另一個專家系統或人工智慧。規則可以由其他系統操縱,以處理新型別的事實或新發現的有關規則集打算建模的域的資訊。




相關:

https://github.com/maja42/goval 更簡單,但比 grule 快兩個數量級,這會帶來很大的靈活性。
 

相關文章