biodivine_lib_bdd/
op_function.rs

1//! Contains simple functions that can be used with `apply` and `fused_flip_apply` to
2//! implement basic logical operations.
3
4/// Partial operator function corresponding to `x & y`.
5pub fn and(l: Option<bool>, r: Option<bool>) -> Option<bool> {
6    match (l, r) {
7        (Some(true), Some(true)) => Some(true),
8        (Some(false), _) => Some(false),
9        (_, Some(false)) => Some(false),
10        _ => None,
11    }
12}
13
14/// Partial operator function corresponding to `x | y`.
15pub fn or(l: Option<bool>, r: Option<bool>) -> Option<bool> {
16    match (l, r) {
17        (Some(false), Some(false)) => Some(false),
18        (Some(true), _) => Some(true),
19        (_, Some(true)) => Some(true),
20        _ => None,
21    }
22}
23
24/// Partial operator function corresponding to `x => y`.
25pub fn imp(l: Option<bool>, r: Option<bool>) -> Option<bool> {
26    match (l, r) {
27        (Some(true), Some(false)) => Some(false),
28        (Some(false), _) => Some(true),
29        (_, Some(true)) => Some(true),
30        _ => None,
31    }
32}
33
34/// Partial operator function corresponding to `x <=> y`.
35pub fn iff(l: Option<bool>, r: Option<bool>) -> Option<bool> {
36    match (l, r) {
37        (Some(l), Some(r)) => Some(l == r),
38        _ => None,
39    }
40}
41
42/// Partial operator function corresponding to `x ^ y`.
43pub fn xor(l: Option<bool>, r: Option<bool>) -> Option<bool> {
44    match (l, r) {
45        (Some(l), Some(r)) => Some(l ^ r),
46        _ => None,
47    }
48}
49
50/// Partial operator function corresponding to `x & !y`.
51pub fn and_not(l: Option<bool>, r: Option<bool>) -> Option<bool> {
52    match (l, r) {
53        (Some(false), _) => Some(false),
54        (_, Some(true)) => Some(false),
55        (Some(true), Some(false)) => Some(true),
56        _ => None,
57    }
58}