The Graph data type provides the four algebraic graph construction primitives empty, vertex, overlay and connect, as well as various derived functions. The only difference compared to the Graph data type defined in Algebra.Graph is that the connect operation is commutative. We define a Num instance as a convenient notation for working with undirected 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 Eq instance is currently implemented using the Relation as the canonical graph representation and satisfies all axioms of algebraic graphs:
overlay is commutative and associative:
x + y == y + x x + (y + z) == (x + y) + zconnect is associative, commutative and has empty as the identity:
x * empty == x empty * x == x x * y == y * 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 will
denote the number of vertices in the graph, m will denote the number of edges
in the graph, and s will denote the size of the corresponding Graph
expression. For example, if g is a Graph then n, m and s can be
computed as follows:
n == vertexCount g
m == edgeCount g
s == size gNote that size counts all leaves of the expression:
vertexCount empty == 0
size empty == 1
vertexCount (vertex x) == 1
size (vertex x) == 1
vertexCount (empty + empty) == 0
size (empty + empty) == 2Converting an undirected Graph to the corresponding Relation takes O(s + m * log(m)) time and O(s + m) memory. This is also the complexity of the graph equality test, because it is currently implemented by converting graph expressions to canonical representations based on adjacency maps.
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 3
edge 1 2 == edge 2 1Note 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 * yInstances18Monad, Functor, Applicative, Alternative, MonadPlus, Eq, …
Monad GraphDefined in algebraic-graphs-0.8 · Algebra.Graph.UndirectedFunctor GraphDefined in algebraic-graphs-0.8 · Algebra.Graph.UndirectedApplicative GraphDefined in algebraic-graphs-0.8 · Algebra.Graph.UndirectedAlternative GraphDefined in algebraic-graphs-0.8 · Algebra.Graph.UndirectedMonadPlus GraphDefined in algebraic-graphs-0.8 · Algebra.Graph.UndirectedOrd a => Eq (Graph a)Defined in algebraic-graphs-0.8 · Algebra.Graph.UndirectedNum a => Num (Graph a)Defined in algebraic-graphs-0.8 · Algebra.Graph.UndirectedNote: this does not satisfy the usual ring laws; see Graph for more details.
Ord a => Ord (Graph a)Defined in algebraic-graphs-0.8 · Algebra.Graph.Undirected(Show a, Ord a) => Show (Graph a)Defined in algebraic-graphs-0.8 · Algebra.Graph.UndirectedIsString a => IsString (Graph a)Defined in algebraic-graphs-0.8 · Algebra.Graph.UndirectedGeneric (Graph a)Defined in algebraic-graphs-0.8 · Algebra.Graph.UndirectedSemigroup (Graph a)Defined in algebraic-graphs-0.8 · Algebra.Graph.UndirectedDefined via overlay.
Monoid (Graph a)Defined in algebraic-graphs-0.8 · Algebra.Graph.UndirectedNFData a => NFData (Graph a)Defined in algebraic-graphs-0.8 · Algebra.Graph.UndirectedGraph (Graph a)Defined in algebraic-graphs-0.8 · Algebra.Graph.ClassUndirected (Graph a)Defined in algebraic-graphs-0.8 · Algebra.Graph.Classtype Rep (Graph a) = D1 ('MetaDataDefined in algebraic-graphs-0.8 · Algebra.Graph.Undirected"Graph"
"Algebra.Graph.Undirected"
"algebraic-graphs-0.8-8JX2W3BiNP382gnPBc0Np8"
'True) (C1 ('MetaCons"UG"
'PrefixI 'False) (S1 ('MetaSel 'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (Graph a))))type Vertex (Graph a) = aDefined in algebraic-graphs-0.8 · Algebra.Graph.Class