#algorithm #boolean #expression #automatic #minimize #petrick #quine

quine-mc_cluskey

Quine-McCluskey算法和Petrick方法的Rust实现

7个版本

使用旧Rust 2015

0.2.4 2016年8月3日
0.2.3 2016年8月3日
0.2.2 2016年3月29日
0.1.1 2016年3月22日

#7 in #minimize

Download history 7081/week @ 2024-03-04 7296/week @ 2024-03-11 7503/week @ 2024-03-18 7259/week @ 2024-03-25 7306/week @ 2024-04-01 6799/week @ 2024-04-08 7225/week @ 2024-04-15 6743/week @ 2024-04-22 6864/week @ 2024-04-29 6755/week @ 2024-05-06 6429/week @ 2024-05-13 7133/week @ 2024-05-20 6338/week @ 2024-05-27 6935/week @ 2024-06-03 7085/week @ 2024-06-10 6511/week @ 2024-06-17

27,795 每月下载量
82crate (直接使用2个) 中使用

MIT 协议

18KB
461

Clippy Linting Result Build Status

一种自动最小化布尔表达式的算法。

示例

extern crate quine_mc_cluskey;

use quine_mc_cluskey::*;
use quine_mc_cluskey::Bool::{And, Or, Not, True, False};

fn main() {
    // !false => true
    assert_eq!(
        Not(Box::new(False)).simplify(),
        vec![True]
    );

    // a && (b || a) => a
    assert_eq!(
        And(vec![Bool::Term(0),
        Or(vec![Bool::Term(1), Bool::Term(0)])]).simplify(), vec![Bool::Term(0)]
    );
}

获取最小化的"与或"形式

有时,形式为 a && (b || c) 的表达式比 a && b || a && c 形式的表达式更短。我们可以简单地否定原始表达式,并否定所有简化后的表达式,以获得该形式。

extern crate quine_mc_cluskey;
use quine_mc_cluskey::Bool;

fn main() {
    let a: Bool = Bool::And(vec![Bool::True, Bool::True]);
    let simplified: Vec<Bool> = Bool::Not(Box::new(a)).simplify()
        .iter().map(simple_negate).collect();
}

fn simple_negate(b: &Bool) -> Bool {
    use quine_mc_cluskey::Bool::*;
    let b = b.clone();

    match b {
        True => False,
        False => True,
        t @ Term(_) => Not(Box::new(t)),
        And(mut v) => {
            for el in &mut v {
                *el = simple_negate(el);
            }
            Or(v)
        },
        Or(mut v) => {
            for el in &mut v {
                *el = simple_negate(el);
            }
            And(v)
        },
        Not(inner) => *inner,
    }
}

依赖项

~0–260KB