#rules #business #rete #brms

nightly bin+lib expert

一个缓存友好的、类型安全的专家/业务规则系统

1 个不稳定版本

使用旧的 Rust 2015

0.0.1 2017年11月22日

#6 in #rete

MIT/Apache

110KB
2K SLoC

expert-rs

用 Rust 编写的缓存友好且类型安全的专家/业务规则系统。

用法

不要用。它甚至还不是 Alpha 版本。

最终你将能够添加依赖项,类似于

[dependencies]
expert = "0.10"

然后编写类似以下代码

#[macro_use]
extern crate expert;


// A fact type
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash, Fact)]
pub struct Fact1 {
    id: usize,
    len: usize,
}


// Another fact type
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash, Fact)]
pub struct Fact2 {
    id: usize,
    height: usize
}

mod example {
    // Creates a new expert system specifically for Fact1 and Fact2
    expert!(Example; [Fact1, Fact2]);
}

pub fn main() {
    use example::*;
    
    // Create a custom rule builder
    let mut builder = ExampleBuilder::new();
    builder.
        // Add a new rule named "rule"
        rule("rule")
            // When a Fact1 is inserted with self.id == 2 and self.len < 32
            .when<Fact1>().eq("id", 2usize).lt("len", 32usize)
            // And when a Fact2 is inserted with sef.id ==3 and self.height >= 64
            .when<Fact2>().eq("id", 17usize).gte("height", 64usize)
        .then()
            // Add a new Fact1{id: 3, len: 20} to be available for return
            .ret<Fact1>().field("id", 3usize).field("len", 20usize)
        .end();
        
   // Create a knowledge base to hold the read-only, in-memory representation of all of the rules
   let example_base = builder.build();
   
   // Create a knowledge session/rule runtime
   let mut example_session = example_base.new_session();
   
   let a_fact = Fact1{id: 2usize, len: 31usize};
   let another_fact = Fact2{id: 3usize, height: 60usize};
   
   // Insert the facts 
   example_session.insert(a_fact);
   example_session.insert(another_fact);
   
   // Resolve the rule consequences
   example_session.resolve();
   
   let fact1_returns: &[Fact1] = <Fact1 as ExmapleReturn>::get_returns(&example_session);
   assert(fact1_returns.len() == 1);
   let fact1_ret = fact1_returns.get(0).unwrap();
   assert(fact1_ret.id == 3);
   assert(fact1_ret.len == 20);
}

特性

  • 代码可以编译!
  • Alpha(事实分析)节点!
  • 语句构建器!

进行中

  • 规则构建器!
  • 知识库构建器!
  • Alpha,Beta 节点编译和布局!
    • 网络表示为一组数组!
    • Alpha 网络按最依赖的节点到最不依赖的节点排序!
    • Beta 网络按最不依赖的节点到最依赖的节点排序!
  • 链式连接!
    • 正向!
    • 反向!(带迭代器)
  • 返回,在规则解析中插入
  • 所有那些甜蜜的宏

未进行中(其他所有内容!)

  • 变量
    • 事实
    • 字段
  • 复杂逻辑((这个 AND 这个 AND NOT 那个) OR 其他)
  • 领域特定语言(DSL)
  • 快速的规则编译时间
  • 规则优化
  • 规则健全性检查
  • 原地事实修改

为什么?

  • 专家/业务规则系统在各种行业中仍在使用
  • 我想了解算法是如何工作的
  • 我想提升我的软件开发专业知识
  • 我想看看我是否可以不用指针写出来
  • 这很难

许可

本项目受以下任一许可证的许可

任选其一。

贡献

除非你明确声明,否则根据 Apache-2.0 许可证定义,你提交给 Serde 的任何贡献都应按上述方式双重许可,不附加任何额外条款或条件。

依赖项

~4MB
~75K SLoC