| Crates.io | free-algebra |
| lib.rs | free-algebra |
| version | 0.1.0 |
| created_at | 2019-11-09 06:18:37.964147+00 |
| updated_at | 2019-11-09 06:18:37.964147+00 |
| description | Types for constructing free algebras over sets. |
| homepage | |
| repository | https://github.com/anvil777/free-algebra |
| max_upload_size | |
| id | 179648 |
| size | 65,077 |
Types for constructing free algebras over sets in the Rust programming language.
In the context of this crate, the term "Algebra" refers to a range of mathematical constructions involving arithmetic operations, and the term "Free" refers to the nature of those operations. In particular, a "free" operation is one that is made with as little restriction as possible with respect to the desired set of rules.
So, in general, the procedure for such a "free" construction is to start with some type T and
some set of algebraic rules, and then operated on the elements of T as if they were a variable
or symbol, applying the rules as necessary.
As abstract as that sounds, there is actually a prime example of this already in the standard
library, the Vec<T>! If we start with some type T, assert that multiplication be associative,
and start multiplying elements like variables, the result is exactly the same as if we took
Vec<T> and implemented multiplication as concatenation. In fact, this is precisely
what the FreeMonoid<T> type in this crate is.
use maths_traits::algebra::One;
use free_algebra::FreeMonoid;
let x: FreeMonoid<char> = FreeMonoid::one();
let y = FreeMonoid::one() * 'a' * 'b';
let z = FreeMonoid::one() * 'c' * 'd';
assert_eq!(x, vec![]);
assert_eq!(y, vec!['a', 'b']);
assert_eq!(z, vec!['c', 'd']);
assert_eq!(&y * &z, vec!['a', 'b', 'c', 'd']);
assert_eq!(&z * &y, vec!['c', 'd', 'a', 'b']);
In addition to this, moreover, a number of other constructions can be achieved by changing which types are used, which operations are considered, and what rules are followed. Examples include:
FreeModule<R,T>: Results from freely adding elements of T in an associative
and commutative manner and allowing distributive multiplication by elements from RFreeAlgebra<R,T>: The same as with FreeModule, except that we allow for
free multiplication of elements distributively (like with FreeMonoid)FreeAlgebra, but where multiplication between T's is commutative and associativeFreeAlgebra, but where multiplication is associative and
an element times itself results in a scalarsT is either 1 and i and multiplies accordinglyThe primary purposes for this crate fall into two general categories:
This crate consists of the following:
Specifically:
MonoidalString constructs free-multiplying structures over a type T using an order-dependent
internal representation with a Vec<T> that determines its multiplication rule using an
implementor of the trait MonoidRule. Aliases of this struct include FreeMonoid and FreeGroup.ModuleString constructs types consisting of terms of type T with scalars from
some additive type R stored with an order independent HashMap. This grants all ModuleString's
an addition operation by adding the coefficients of like terms, and a free-multiplication can
be included using an optional AlgebraRule parameter. Aliases of this struct include
FreeModule and FreeAlgebra.For more information, see the respective structs in the docs