pub struct UnaryRelation<T: Ord> { /* private fields */ }Expand description
Finite unary relation type. A finite unary relation.
In G1 this is also the canonical set type used to define carriers, domains, ranges, and images of binary relations.
The starter implementation uses BTreeSet so iteration order is
deterministic.
§Examples
use relmath::{FiniteRelation, UnaryRelation};
let mut xs = UnaryRelation::new();
assert!(xs.is_empty());
xs.insert(3);
xs.insert(1);
xs.insert(2);
xs.insert(2);
let ys = UnaryRelation::singleton(3);
let zs = UnaryRelation::from_values([2, 3, 4]);
assert!(xs.contains(&1));
assert_eq!(xs.iter().copied().collect::<Vec<_>>(), vec![1, 2, 3]);
assert_eq!(xs.union(&ys).to_vec(), vec![1, 2, 3]);
assert_eq!(xs.intersection(&zs).to_vec(), vec![2, 3]);
assert_eq!(xs.difference(&zs).to_vec(), vec![1]);
assert!(ys.is_subset(&xs));Implementations§
Source§impl<T: Ord> UnaryRelation<T>
impl<T: Ord> UnaryRelation<T>
Sourcepub fn from_values<I>(values: I) -> Selfwhere
I: IntoIterator<Item = T>,
pub fn from_values<I>(values: I) -> Selfwhere
I: IntoIterator<Item = T>,
Creates a unary relation from the provided values.
Duplicate values are coalesced into a single stored element.
Examples found in repository?
5fn main() {
6 let step = BinaryRelation::from_pairs([
7 ("Draft", "Review"),
8 ("Review", "Approved"),
9 ("Review", "Rejected"),
10 ]);
11
12 let states =
13 UnaryRelation::from_values(["Draft", "Review", "Approved", "Rejected", "Archived"]);
14 let reachable = step.reflexive_transitive_closure(&states);
15 let draft = UnaryRelation::singleton("Draft");
16
17 assert!(reachable.contains(&"Archived", &"Archived"));
18 assert!(reachable.contains(&"Draft", &"Approved"));
19
20 println!(
21 "reachable from Draft: {:?}",
22 reachable.image(&draft).to_vec()
23 );
24}More examples
5fn main() {
6 let parent = BinaryRelation::from_pairs([
7 ("Ada", "Bob"),
8 ("Ada", "Cara"),
9 ("Bob", "Dana"),
10 ("Cara", "Eli"),
11 ("Dana", "Finn"),
12 ]);
13
14 let people = UnaryRelation::from_values(["Ada", "Bob", "Cara", "Dana", "Eli", "Finn"]);
15 let grandparent = parent.compose(&parent);
16 let ancestor = parent.reflexive_transitive_closure(&people);
17
18 let ada = UnaryRelation::singleton("Ada");
19 let reachable_from_ada = ancestor.image(&ada);
20
21 assert!(grandparent.contains(&"Ada", &"Dana"));
22 assert!(grandparent.contains(&"Ada", &"Eli"));
23 assert!(reachable_from_ada.contains(&"Finn"));
24
25 println!("grandparent pairs: {:?}", grandparent.to_vec());
26 println!(
27 "people reachable from Ada: {:?}",
28 reachable_from_ada.to_vec()
29 );
30}Sourcepub fn singleton(value: T) -> Self
pub fn singleton(value: T) -> Self
Creates a unary relation containing exactly one value.
Examples found in repository?
5fn main() {
6 let step = BinaryRelation::from_pairs([
7 ("Draft", "Review"),
8 ("Review", "Approved"),
9 ("Review", "Rejected"),
10 ]);
11
12 let states =
13 UnaryRelation::from_values(["Draft", "Review", "Approved", "Rejected", "Archived"]);
14 let reachable = step.reflexive_transitive_closure(&states);
15 let draft = UnaryRelation::singleton("Draft");
16
17 assert!(reachable.contains(&"Archived", &"Archived"));
18 assert!(reachable.contains(&"Draft", &"Approved"));
19
20 println!(
21 "reachable from Draft: {:?}",
22 reachable.image(&draft).to_vec()
23 );
24}More examples
5fn main() {
6 let parent = BinaryRelation::from_pairs([
7 ("Ada", "Bob"),
8 ("Ada", "Cara"),
9 ("Bob", "Dana"),
10 ("Cara", "Eli"),
11 ("Dana", "Finn"),
12 ]);
13
14 let people = UnaryRelation::from_values(["Ada", "Bob", "Cara", "Dana", "Eli", "Finn"]);
15 let grandparent = parent.compose(&parent);
16 let ancestor = parent.reflexive_transitive_closure(&people);
17
18 let ada = UnaryRelation::singleton("Ada");
19 let reachable_from_ada = ancestor.image(&ada);
20
21 assert!(grandparent.contains(&"Ada", &"Dana"));
22 assert!(grandparent.contains(&"Ada", &"Eli"));
23 assert!(reachable_from_ada.contains(&"Finn"));
24
25 println!("grandparent pairs: {:?}", grandparent.to_vec());
26 println!(
27 "people reachable from Ada: {:?}",
28 reachable_from_ada.to_vec()
29 );
30}5fn main() {
6 let user_role = BinaryRelation::from_pairs([
7 ("ann", "admin"),
8 ("bob", "analyst"),
9 ("bob", "reviewer"),
10 ("cara", "guest"),
11 ]);
12
13 let role_permission = BinaryRelation::from_pairs([
14 ("admin", "read"),
15 ("admin", "write"),
16 ("admin", "deploy"),
17 ("analyst", "read"),
18 ("reviewer", "approve"),
19 ("guest", "read"),
20 ]);
21
22 let effective_permission = user_role.compose(&role_permission);
23 let bob = UnaryRelation::singleton("bob");
24 let bob_permissions = effective_permission.image(&bob);
25
26 assert!(effective_permission.contains(&"ann", &"deploy"));
27 assert!(bob_permissions.contains(&"approve"));
28 assert!(bob_permissions.contains(&"read"));
29
30 println!(
31 "effective permissions for bob: {:?}",
32 bob_permissions.to_vec()
33 );
34}Sourcepub fn insert(&mut self, value: T) -> bool
pub fn insert(&mut self, value: T) -> bool
Inserts a value into the unary relation.
Returns true when the value was not already present.
Sourcepub fn contains(&self, value: &T) -> bool
pub fn contains(&self, value: &T) -> bool
Returns true when the unary relation contains the given value.
Examples found in repository?
5fn main() {
6 let parent = BinaryRelation::from_pairs([
7 ("Ada", "Bob"),
8 ("Ada", "Cara"),
9 ("Bob", "Dana"),
10 ("Cara", "Eli"),
11 ("Dana", "Finn"),
12 ]);
13
14 let people = UnaryRelation::from_values(["Ada", "Bob", "Cara", "Dana", "Eli", "Finn"]);
15 let grandparent = parent.compose(&parent);
16 let ancestor = parent.reflexive_transitive_closure(&people);
17
18 let ada = UnaryRelation::singleton("Ada");
19 let reachable_from_ada = ancestor.image(&ada);
20
21 assert!(grandparent.contains(&"Ada", &"Dana"));
22 assert!(grandparent.contains(&"Ada", &"Eli"));
23 assert!(reachable_from_ada.contains(&"Finn"));
24
25 println!("grandparent pairs: {:?}", grandparent.to_vec());
26 println!(
27 "people reachable from Ada: {:?}",
28 reachable_from_ada.to_vec()
29 );
30}More examples
5fn main() {
6 let user_role = BinaryRelation::from_pairs([
7 ("ann", "admin"),
8 ("bob", "analyst"),
9 ("bob", "reviewer"),
10 ("cara", "guest"),
11 ]);
12
13 let role_permission = BinaryRelation::from_pairs([
14 ("admin", "read"),
15 ("admin", "write"),
16 ("admin", "deploy"),
17 ("analyst", "read"),
18 ("reviewer", "approve"),
19 ("guest", "read"),
20 ]);
21
22 let effective_permission = user_role.compose(&role_permission);
23 let bob = UnaryRelation::singleton("bob");
24 let bob_permissions = effective_permission.image(&bob);
25
26 assert!(effective_permission.contains(&"ann", &"deploy"));
27 assert!(bob_permissions.contains(&"approve"));
28 assert!(bob_permissions.contains(&"read"));
29
30 println!(
31 "effective permissions for bob: {:?}",
32 bob_permissions.to_vec()
33 );
34}Sourcepub fn iter(&self) -> impl Iterator<Item = &T>
pub fn iter(&self) -> impl Iterator<Item = &T>
Returns an iterator over the values in deterministic order.
Iteration order follows T: Ord.
Sourcepub fn intersection(&self, other: &Self) -> Selfwhere
T: Clone,
pub fn intersection(&self, other: &Self) -> Selfwhere
T: Clone,
Returns the intersection of self and other.
Sourcepub fn difference(&self, other: &Self) -> Selfwhere
T: Clone,
pub fn difference(&self, other: &Self) -> Selfwhere
T: Clone,
Returns the set difference self \ other.
Sourcepub fn is_subset(&self, other: &Self) -> bool
pub fn is_subset(&self, other: &Self) -> bool
Returns true when every element of self also appears in other.
Sourcepub fn to_vec(&self) -> Vec<T>where
T: Clone,
pub fn to_vec(&self) -> Vec<T>where
T: Clone,
Converts the unary relation into a sorted vector.
Examples found in repository?
5fn main() {
6 let step = BinaryRelation::from_pairs([
7 ("Draft", "Review"),
8 ("Review", "Approved"),
9 ("Review", "Rejected"),
10 ]);
11
12 let states =
13 UnaryRelation::from_values(["Draft", "Review", "Approved", "Rejected", "Archived"]);
14 let reachable = step.reflexive_transitive_closure(&states);
15 let draft = UnaryRelation::singleton("Draft");
16
17 assert!(reachable.contains(&"Archived", &"Archived"));
18 assert!(reachable.contains(&"Draft", &"Approved"));
19
20 println!(
21 "reachable from Draft: {:?}",
22 reachable.image(&draft).to_vec()
23 );
24}More examples
5fn main() {
6 let parent = BinaryRelation::from_pairs([
7 ("Ada", "Bob"),
8 ("Ada", "Cara"),
9 ("Bob", "Dana"),
10 ("Cara", "Eli"),
11 ("Dana", "Finn"),
12 ]);
13
14 let people = UnaryRelation::from_values(["Ada", "Bob", "Cara", "Dana", "Eli", "Finn"]);
15 let grandparent = parent.compose(&parent);
16 let ancestor = parent.reflexive_transitive_closure(&people);
17
18 let ada = UnaryRelation::singleton("Ada");
19 let reachable_from_ada = ancestor.image(&ada);
20
21 assert!(grandparent.contains(&"Ada", &"Dana"));
22 assert!(grandparent.contains(&"Ada", &"Eli"));
23 assert!(reachable_from_ada.contains(&"Finn"));
24
25 println!("grandparent pairs: {:?}", grandparent.to_vec());
26 println!(
27 "people reachable from Ada: {:?}",
28 reachable_from_ada.to_vec()
29 );
30}5fn main() {
6 let user_role = BinaryRelation::from_pairs([
7 ("ann", "admin"),
8 ("bob", "analyst"),
9 ("bob", "reviewer"),
10 ("cara", "guest"),
11 ]);
12
13 let role_permission = BinaryRelation::from_pairs([
14 ("admin", "read"),
15 ("admin", "write"),
16 ("admin", "deploy"),
17 ("analyst", "read"),
18 ("reviewer", "approve"),
19 ("guest", "read"),
20 ]);
21
22 let effective_permission = user_role.compose(&role_permission);
23 let bob = UnaryRelation::singleton("bob");
24 let bob_permissions = effective_permission.image(&bob);
25
26 assert!(effective_permission.contains(&"ann", &"deploy"));
27 assert!(bob_permissions.contains(&"approve"));
28 assert!(bob_permissions.contains(&"read"));
29
30 println!(
31 "effective permissions for bob: {:?}",
32 bob_permissions.to_vec()
33 );
34}Trait Implementations§
Source§impl<T: Clone + Ord> Clone for UnaryRelation<T>
impl<T: Clone + Ord> Clone for UnaryRelation<T>
Source§fn clone(&self) -> UnaryRelation<T>
fn clone(&self) -> UnaryRelation<T>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl<T: Ord> Default for UnaryRelation<T>
impl<T: Ord> Default for UnaryRelation<T>
Source§impl<T: Ord> Extend<T> for UnaryRelation<T>
impl<T: Ord> Extend<T> for UnaryRelation<T>
Source§fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I)
fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I)
Source§fn extend_one(&mut self, item: A)
fn extend_one(&mut self, item: A)
extend_one)Source§fn extend_reserve(&mut self, additional: usize)
fn extend_reserve(&mut self, additional: usize)
extend_one)