Experiments with category theory.
A Java library for experimenting with category-theoretic concepts in software modeling. Supports representation of a domain-specific data structure as a (finite) category via user implementation of the CategorySource interface. The category-theoretic representation can then be used to reason and gain insight about the underlying data structure and it's properties; how it might relate to mathematical structures such as graphs, posets, or lattices; and to render and visualize the data as SVG diagrams.
- Create a finite category with objects, morphisms, and a composition table
- Validate category laws (identity, associativity, unit laws)
- Convert categories to graphs, partial orders, lattices, and Hasse diagrams
- Render any structure to SVG with customizable layouts and styles
- Java 17+
- Gradle (provided via wrapper)
| Library | Version | License | Purpose |
|---|---|---|---|
| JGraphT | 1.5.2 | LGPL 2.1 / EPL 2.0 | Directed graph implementation |
./gradlew build./gradlew testImplement CategorySource on your domain object and provide it as a FiniteCategory:
var category = myDomain.toCategory();
category.validate(); // checks identity and associativity lawsUse the fluent CategoryConverter facade:
// To a directed graph
DirectedGraph<L> graph = CategoryConverter.from(category).toGraph();
// To a partial order (requires a preorder category)
PartialOrder<L> poset = CategoryConverter.from(category).toPoset();
// To a lattice (requires a preorder lattice category)
Lattice<L> lattice = CategoryConverter.from(category).toLattice();
// To a Hasse diagram
HasseDiagram<L> hasse = CategoryConverter.from(category).toHasseDiagram();var renderer = new HasseDiagramRenderer<>();
renderer.renderSvgToFile(hasse, Path.of("output.svg"));Customize the output with RenderOptions:
RenderOptions opts = RenderOptions.builder()
.width(1000).height(700)
.nodeColor("#4A90D9")
.labelColor("#FFFFFF")
.fontSize(14)
.layerHeight(120)
.build();
renderer.renderSvgToFile(hasse, Path.of("output.svg"), opts);Renderers are available for all structures: CategoryRenderer, GraphRenderer, LatticeRenderer, HasseDiagramRenderer.
| Package | Description |
|---|---|
com.github.catexjc.core |
FiniteCategory, CategoryObject, Morphism, CategorySource |
com.github.catexjc.convert |
CategoryConverter — unified conversion facade |
com.github.catexjc.graph |
DirectedGraph, GraphConverter |
com.github.catexjc.poset |
PartialOrder, PosetConverter |
com.github.catexjc.lattice |
Lattice, LatticeConverter |
com.github.catexjc.hasse |
HasseDiagram, HasseDiagramConverter |
com.github.catexjc.render |
Renderers, RenderOptions, SVG layout internals |
- All data structures are immutable.
- Category law validation is lazy — call
validate()explicitly. - Conversions to poset/lattice/Hasse diagram require a preorder category (at most one morphism between any two objects). An
IllegalArgumentExceptionis thrown if the category does not meet the required properties.