1 个不稳定版本
使用旧的 Rust 2015
0.0.1 | 2017年11月22日 |
---|
#6 in #rete
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 版本(LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
除非你明确声明,否则根据 Apache-2.0 许可证定义,你提交给 Serde 的任何贡献都应按上述方式双重许可,不附加任何额外条款或条件。
依赖项
~4MB
~75K SLoC