hyperjumptech/grule-rule-engine: Golang的规则引擎实现


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 快两个数量级,这会带来很大的灵活性。