An algorithm to automatically minimize boolean expressions.
```rust extern crate quinemccluskey;
use quinemccluskey::*; use quinemccluskey::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)]
);
} ```
Sometimes an expression of the form a && (b || c)
is shorter than the a && b || a && c
form.
We can simply negate the original expression and negate all the resulting simplified expressions to obtain that form.
```rust extern crate quinemccluskey; use quinemccluskey::Bool;
fn main() {
let a: Bool = Bool::And(vec![Bool::True, Bool::True]);
let simplified: Vec
fn simplenegate(b: &Bool) -> Bool { use quinemc_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,
}
} ```