Skip to main content

carrier/
carrier.rs

1//! Explicit finite carriers distinct from relation-induced support.
2
3use relmath::{BinaryRelation, FiniteCarrier};
4
5fn main() {
6    let step = BinaryRelation::from_pairs([("Draft", "Review")]);
7    let states = FiniteCarrier::from_values(["Draft", "Review", "Archived"]);
8
9    let inferred = step.carrier();
10    let inferred_identity = BinaryRelation::identity(&inferred);
11    let explicit_identity = BinaryRelation::identity_on(&states);
12    let reachable = step.reflexive_transitive_closure_on(&states);
13
14    assert_eq!(inferred.to_vec(), vec!["Draft", "Review"]);
15    assert_eq!(
16        inferred_identity.to_vec(),
17        vec![("Draft", "Draft"), ("Review", "Review")]
18    );
19    assert_eq!(
20        explicit_identity.to_vec(),
21        vec![
22            ("Archived", "Archived"),
23            ("Draft", "Draft"),
24            ("Review", "Review"),
25        ]
26    );
27    assert_eq!(states.to_vec(), vec!["Archived", "Draft", "Review"]);
28    assert_eq!(
29        reachable.to_vec(),
30        step.reflexive_transitive_closure(&states.to_unary_relation())
31            .to_vec()
32    );
33    assert!(reachable.is_reflexive_on(&states));
34    assert!(step.is_irreflexive_on(&states));
35    assert!(reachable.contains(&"Archived", &"Archived"));
36    assert!(reachable.contains(&"Draft", &"Review"));
37
38    println!(
39        "explicit carrier: {:?}; inferred support: {:?}; inferred identity: {:?}; explicit identity: {:?}; reachable: {:?}",
40        states.to_vec(),
41        inferred.to_vec(),
42        inferred_identity.to_vec(),
43        explicit_identity.to_vec(),
44        reachable.to_vec()
45    );
46}