Canonical Structures
Sometimes the situation is simple and we only want to define one set with structure rather than a family of sets, for example, the set of all rational numbers. Since sets with structure are represented in Algebraeon objects of structure types we will need a structure type with exactly once instance. This can be done explicitly like so
use algebraeon::{nzq::Rational, rings::structure::*, sets::structure::*};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct MyRational {
value: Rational,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct MyRationalCanonicalStructure {}
impl Signature for MyRationalCanonicalStructure {}
impl SetSignature for MyRationalCanonicalStructure {
type Set = MyRational;
fn is_element(&self, _x: &Self::Set) -> Result<(), String> {
Ok(())
}
}
impl EqSignature for MyRationalCanonicalStructure {
fn equal(&self, x: &Self::Set, y: &Self::Set) -> bool {
x == y
}
}
However, Algebraeon provides a derive macro CanonicalStructure
which reduces the boilerplate above to
use algebraeon::{nzq::Rational, rings::structure::*, sets::structure::*};
#[derive(Debug, Clone, PartialEq, Eq, CanonicalStructure)]
pub struct MyRational {
value: Rational,
}
In any case, once we have the structure type MyRationalCanonicalStructure
implementing Signature + SetSignature<Set = MyRational>
we can go on to implement more structure traits like RingSignature
and FieldSignature
for MyRationalCanonicalStructure
to give the set of instances of MyRational
the structure of a ring or a field.