# Sylvester.AbstractAlgebra 0.2.5

F# Library for defining, exploring and proving concepts in abstract algebra.

Install-Package Sylvester.AbstractAlgebra -Version 0.2.5
dotnet add package Sylvester.AbstractAlgebra --version 0.2.5
<PackageReference Include="Sylvester.AbstractAlgebra" Version="0.2.5" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.

## 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"
S "               Nancy                Drew"
S "           NancyDrew"
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]]

## 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"
S "               Nancy                Drew"
S "           NancyDrew"
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]]

## Release Notes

Update to latest Sylph version.

## Used By

### NuGet packages

This package is not used by any NuGet packages.

### GitHub repositories

This package is not used by any popular GitHub repositories.