The AdjacencyMap data type represents a graph by a map of vertices to their adjacency sets. We define a Num instance as a convenient notation for working with graphs:
0 == vertex 0
1 + 2 == overlay (vertex 1) (vertex 2)
1 * 2 == connect (vertex 1) (vertex 2)
1 + 2 * 3 == overlay (vertex 1) (connect (vertex 2) (vertex 3))
1 * (2 + 3) == connect (vertex 1) (overlay (vertex 2) (vertex 3))
Note: the Num instance does not satisfy several "customary laws" of Num,
which dictate that fromInteger 0 and fromInteger 1 should act as
additive and multiplicative identities, and negate as additive inverse.
Nevertheless, overloading fromInteger, + and * is very convenient when
working with algebraic graphs; we hope that in future Haskell's Prelude will
provide a more fine-grained class hierarchy for algebraic structures, which we
would be able to utilise without violating any laws.
The Show instance is defined using basic graph construction primitives:
show (empty :: AdjacencyMap Int) == "empty"
show (1 :: AdjacencyMap Int) == "vertex 1"
show (1 + 2 :: AdjacencyMap Int) == "vertices [1,2]"
show (1 * 2 :: AdjacencyMap Int) == "edge 1 2"
show (1 * 2 * 3 :: AdjacencyMap Int) == "edges [(1,2),(1,3),(2,3)]"
show (1 * 2 + 3 :: AdjacencyMap Int) == "overlay (vertex 3) (edge 1 2)"The Eq instance satisfies all axioms of algebraic graphs:
overlay is commutative and associative:
x + y == y + x x + (y + z) == (x + y) + zconnect is associative and has empty as the identity:
x * empty == x empty * x == x x * (y * z) == (x * y) * zconnect distributes over overlay:
x * (y + z) == x * y + x * z (x + y) * z == x * z + y * zconnect can be decomposed:
x * y * z == x * y + x * z + y * z
The following useful theorems can be proved from the above set of axioms.
overlay has empty as the identity and is idempotent:
x + empty == x empty + x == x x + x == xAbsorption and saturation of connect:
x * y + x + y == x * y x * x * x == x * x
When specifying the time and memory complexity of graph algorithms, n and m will denote the number of vertices and edges in the graph, respectively.
The total order on graphs is defined using size-lexicographic comparison:
Compare the number of vertices. In case of a tie, continue.
Compare the sets of vertices. In case of a tie, continue.
Compare the number of edges. In case of a tie, continue.
Compare the sets of edges.
Here are a few examples:
vertex 1 < vertex 2
vertex 3 < edge 1 2
vertex 1 < edge 1 1
edge 1 1 < edge 1 2
edge 1 2 < edge 1 1 + edge 2 2
edge 1 2 < edge 1 3Note that the resulting order refines the isSubgraphOf relation and is compatible with overlay and connect operations:
isSubgraphOf x y ==> x <= yempty <= x
x <= x + y
x + y <= x * yInstances14Eq, Num, Ord, Show, IsString, Generic, …
Eq a => Eq (AdjacencyMap a)Defined in algebraic-graphs-0.8 · Algebra.Graph.AdjacencyMap(Ord a, Num a) => Num (AdjacencyMap a)Defined in algebraic-graphs-0.8 · Algebra.Graph.AdjacencyMapNote: this does not satisfy the usual ring laws; see AdjacencyMap for more details.
Ord a => Ord (AdjacencyMap a)Defined in algebraic-graphs-0.8 · Algebra.Graph.AdjacencyMap(Ord a, Show a) => Show (AdjacencyMap a)Defined in algebraic-graphs-0.8 · Algebra.Graph.AdjacencyMapIsString a => IsString (AdjacencyMap a)Defined in algebraic-graphs-0.8 · Algebra.Graph.AdjacencyMapGeneric (AdjacencyMap a)Defined in algebraic-graphs-0.8 · Algebra.Graph.AdjacencyMapOrd a => Semigroup (AdjacencyMap a)Defined in algebraic-graphs-0.8 · Algebra.Graph.AdjacencyMapDefined via overlay.
Ord a => Monoid (AdjacencyMap a)Defined in algebraic-graphs-0.8 · Algebra.Graph.AdjacencyMapNFData a => NFData (AdjacencyMap a)Defined in algebraic-graphs-0.8 · Algebra.Graph.AdjacencyMapOrd a => Graph (AdjacencyMap a)Defined in algebraic-graphs-0.8 · Algebra.Graph.ClassOrd a => ToGraph (AdjacencyMap a)Defined in algebraic-graphs-0.8 · Algebra.Graph.ToGraphtype Rep (AdjacencyMap a) = D1 ('MetaDataDefined in algebraic-graphs-0.8 · Algebra.Graph.AdjacencyMap"AdjacencyMap"
"Algebra.Graph.AdjacencyMap"
"algebraic-graphs-0.8-8JX2W3BiNP382gnPBc0Np8"
'True) (C1 ('MetaCons"AM"
'PrefixI 'True) (S1 ('MetaSel ('Just"adjacencyMap"
) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (Map a (Set a)))))type Vertex (AdjacencyMap a) = aDefined in algebraic-graphs-0.8 · Algebra.Graph.Classtype ToVertex (AdjacencyMap a) = aDefined in algebraic-graphs-0.8 · Algebra.Graph.ToGraph