Skip to main content

semiring/
semiring.rs

1//! Additive semiring foundations for relation-style annotation semantics.
2
3use relmath::annotated::{BooleanSemiring, Semiring};
4
5fn reachable_via_two_hop_or_direct(
6    direct: BooleanSemiring,
7    first_leg: BooleanSemiring,
8    second_leg: BooleanSemiring,
9) -> BooleanSemiring {
10    direct.add(&first_leg.mul(&second_leg))
11}
12
13fn main() {
14    let direct = BooleanSemiring::FALSE;
15    let first_leg = BooleanSemiring::TRUE;
16    let second_leg = BooleanSemiring::TRUE;
17
18    let reachable = reachable_via_two_hop_or_direct(direct, first_leg, second_leg);
19
20    assert_eq!(reachable, BooleanSemiring::TRUE);
21    assert!(reachable.is_one());
22    assert!(!reachable.is_zero());
23    assert!(bool::from(reachable));
24    assert_eq!(BooleanSemiring::zero(), BooleanSemiring::FALSE);
25    assert_eq!(BooleanSemiring::one(), BooleanSemiring::TRUE);
26
27    println!(
28        "reachable after direct-or-two-hop combination: {}",
29        bool::from(reachable)
30    );
31}