12 个不稳定版本 (3 个破坏性更改)
0.4.2 | 2023年3月27日 |
---|---|
0.4.1 | 2023年3月27日 |
0.3.2 | 2023年3月27日 |
0.2.0 | 2021年6月8日 |
0.1.4 | 2021年5月30日 |
539 在 编码 中排名
每月 81 次下载
40KB
699 行
simple_predicates
— 一个用于建模简单布尔谓词的库
谓词是一个公式,可以作为一个函数根据其中出现的变量的值来评估为真或假。在 simple_predicates
中,变量由满足 Eval
特性(该特性需要 Clone
和 PartialEq
)的用户选择的类型表示。 Eval
特性还提供了一个关联的 Context
类型,可以用于提供解决变量所需的环境数据。 Expr
、Cnf
和 Dnf
类型可用于构建可评估的表达式。
安装
将以下内容添加到您的 Cargo.toml
[dependencies]
simple_predicates = "0.2"
功能
功能 | 描述 |
---|---|
"serde" | 启用使用 serde 进行数据的序列化和反序列化。 |
默认情况下,没有启用任何功能。
示例用法
假设我们想编写表示一些 u32
值的 Vec
可能性的布尔表达式,根据 Vec::contains
方法。我们首先实现 Eval
use simple_predicates::Eval;
// Wrapper struct needed because `u32` & `Eval` are both foreign.
#[derive(Clone, PartialEq)]
struct Contains(pub u32);
impl Eval for Contains {
type Context = Vec<u32>;
fn eval(&self, data: &Self::Context) -> bool {
// Evaluate the u32 by checking if it is in the `Vec`.
data.contains(&self.0)
}
}
现在我们可以检查给定 Vec
上的任意包含条件,如下所示
use simple_predicates::Eval;
use simple_predicates::Expr::*;
let items: Vec<u32> = vec![1, 2, 4, 7, 9, 10];
// `eval` is `true` if input contains 4 but not 5.
let expr = And(
Box::new(Var(Contains(4))),
Box::new(Not(Box::new(Var(Contains(5))))));
assert!(expr.eval(&items));
Cnf / Dnf
对于更复杂的表达式,And
和 Or
表达式的嵌套可能会变得非常繁琐,因此提供了 Cnf
和 Dnf
类型来简化它们的处理。
Cnf
类型表示布尔表达式的 合取范式;一组通过 And
连接的表达式。 Dnf
类型表示布尔表达式的 析取范式;一组通过 Or
连接的表达式。
如果变量类型实现了 Eq
和 Hash
,则可以使用 Cnf
和 Dnf
类型。它们的 API 完全相同,以下示例可以是任一类型的代表。
示例
可以使用 From
trait 从一个表达式 (Expr) 创建一个 Cnf
。
use simple_predicates::Eval;
use simple_predicates::Expr::*;
let items: Vec<u32> = vec![1, 2, 4, 7, 9, 10];
let cnf = Cnf::from(
And(
Box::new(Var(Contains(4))),
Box::new(Not(Box::new(Var(Contains(5)))))));
assert!(cnf.eval(&items));
Cnf
也可以从任何具有 IntoIterator
trait 的东西中创建。
use simple_predicates::Eval;
use simple_predicates::Expr::*;
let items: Vec<u32> = vec![1, 2, 4, 7, 9, 10];
let cnf = Cnf::from(vec![
Var(Contains(4)),
Not(Box::new(Var(Contains(5)))),
]);
assert!(cnf.eval(&items));
许可证
simple_predicates 以 MIT 许可证或 Apache 版本 2.0 许可证授权,您可选择其中一种。
依赖项
~165KB