# Sylvester.AbstractAlgebra 0.2.3.2

There is a newer version of this package available.
See the version list below for details.
`Install-Package Sylvester.AbstractAlgebra -Version 0.2.3.2`
`dotnet add package Sylvester.AbstractAlgebra --version 0.2.3.2`
`<PackageReference Include="Sylvester.AbstractAlgebra" Version="0.2.3.2" />`
For projects that support PackageReference, copy this XML node into the project file to reference the package.
`paket add Sylvester.AbstractAlgebra --version 0.2.3.2`
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
`#r "nuget: Sylvester.AbstractAlgebra, 0.2.3.2"`
#r directive can be used in F# Interactive, C# scripting and .NET Interactive. Copy this into the interactive tool or source code of the script to reference the package.
```// Install Sylvester.AbstractAlgebra as a Cake Addin

// Install Sylvester.AbstractAlgebra as a Cake Tool
#tool nuget:?package=Sylvester.AbstractAlgebra&version=0.2.3.2```
The NuGet Team does not provide support for this client. Please contact its maintainers for support.

## Sylvester.AbstractAlgebra

The Sylvester abstract algebra library contains types and operations for rigorously defining abstract algebra structures and concepts.

``````// Use the Sylvester abstract algebra package
Paket.Package["Sylvester.AbstractAlgebra"]

open System
open System.Linq
open Sylvester
``````

### Morphisms

``````// Define a custom symbol type S with a (+) operator and zero
// We could just also use plain strings
type S = S of string with
static member (+) (S l, S r) = S (l + r)
static member Zero = S ""

// Define an infinite sequence of L strings
let Sym = infiniteSeq ((+) 65 >> Char.ConvertFromUtf32 >> S)
Sym
``````
``````// Define a monoid using our set and + operator and zero element
let L = Monoid(Sym, (+), S.Zero)
L
``````
``````seq
[(S "A", S "B", S "AB"); (S "B", S "C", S "BC"); (S "C", S "D", S "CD");
(S "D", S "E", S "DE"); ...]
``````
``````// Create 2 S values
let a, b = S "Nancy", S "Drew"
a + b
``````
``````S "NancyDrew"
``````
``````// Create a L morphism using the PadLeft string function
let Pad = Morph(L, fun l -> let (S s) = l in S(s.PadLeft 20))
``````
``````S "               Nancy"
``````
``````// Is pad a homomorphism?
``````
``````S "               Nancy                Drew"
``````
``````pad (a + b)
``````
``````S "           NancyDrew"
``````
``````pad a + pad b = pad (a + b)
``````
``````false
``````

### Rings

``````Zpos
``````
``````seq [(0, 1, 1); (1, 2, 3); (2, 3, 5); (3, 4, 7); ...]
``````

### Subsets

``````let s = seq{1..6} |> Set.ofSubsets
s
``````
``````Seq
[|Empty; Seq [|1|]; Seq [|2|]; Seq [|1; 2|]; Seq [|3|]; Seq [|1; 3|];
Seq [|2; 3|]; Seq [|1; 2; 3|]; Seq [|4|]; Seq [|1; 4|]; Seq [|2; 4|];
Seq [|1; 2; 4|]; Seq [|3; 4|]; Seq [|1; 3; 4|]; Seq [|2; 3; 4|];
Seq [|1; 2; 3; 4|]; Seq [|5|]; Seq [|1; 5|]; Seq [|2; 5|]; Seq [|1; 2; 5|];
Seq [|3; 5|]; Seq [|1; 3; 5|]; Seq [|2; 3; 5|]; Seq [|1; 2; 3; 5|];
Seq [|4; 5|]; Seq [|1; 4; 5|]; Seq [|2; 4; 5|]; Seq [|1; 2; 4; 5|];
Seq [|3; 4; 5|]; Seq [|1; 3; 4; 5|]; Seq [|2; 3; 4; 5|];
Seq [|1; 2; 3; 4; 5|]; Seq [|6|]; Seq [|1; 6|]; Seq [|2; 6|];
Seq [|1; 2; 6|]; Seq [|3; 6|]; Seq [|1; 3; 6|]; Seq [|2; 3; 6|];
Seq [|1; 2; 3; 6|]; Seq [|4; 6|]; Seq [|1; 4; 6|]; Seq [|2; 4; 6|];
Seq [|1; 2; 4; 6|]; Seq [|3; 4; 6|]; Seq [|1; 3; 4; 6|]; Seq [|2; 3; 4; 6|];
Seq [|1; 2; 3; 4; 6|]; Seq [|5; 6|]; Seq [|1; 5; 6|]; Seq [|2; 5; 6|];
Seq [|1; 2; 5; 6|]; Seq [|3; 5; 6|]; Seq [|1; 3; 5; 6|]; Seq [|2; 3; 5; 6|];
Seq [|1; 2; 3; 5; 6|]; Seq [|4; 5; 6|]; Seq [|1; 4; 5; 6|];
Seq [|2; 4; 5; 6|]; Seq [|1; 2; 4; 5; 6|]; Seq [|3; 4; 5; 6|];
Seq [|1; 3; 4; 5; 6|]; Seq [|2; 3; 4; 5; 6|]; Seq [|1; 2; 3; 4; 5; 6|]|]
``````

### Lattices

``````
let lat = Lattice(s, (|+|), (|*|))
lat
``````
``````Sylvester.Lattice`1[Sylvester.Set`1[System.Int32]]
``````
``````
``````

### NuGet packages

This package is not used by any NuGet packages.

### GitHub repositories

This package is not used by any popular GitHub repositories.