#boolean #predicates #expressions #u32 #condition #eval #vec

simple_predicates

一个简单的本地配置管理工具

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编码 中排名

Download history 9/week @ 2024-04-02

每月 81 次下载

MIT/Apache

40KB
699

simple_predicates — 一个用于建模简单布尔谓词的库

谓词是一个公式,可以作为一个函数根据其中出现的变量的值来评估为真或假。在 simple_predicates 中,变量由满足 Eval 特性(该特性需要 ClonePartialEq)的用户选择的类型表示。 Eval 特性还提供了一个关联的 Context 类型,可以用于提供解决变量所需的环境数据。 ExprCnfDnf 类型可用于构建可评估的表达式。

安装

将以下内容添加到您的 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

对于更复杂的表达式,AndOr 表达式的嵌套可能会变得非常繁琐,因此提供了 CnfDnf 类型来简化它们的处理。

Cnf 类型表示布尔表达式的 合取范式;一组通过 And 连接的表达式。 Dnf 类型表示布尔表达式的 析取范式;一组通过 Or 连接的表达式。

如果变量类型实现了 EqHash,则可以使用 CnfDnf 类型。它们的 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