Refl package:algebraic-graphs

The class of reflexive graphs that satisfy the following additional axiom.
  • Each vertex has a self-loop:
    vertex x == vertex x *
    vertex x
Note that by applying the axiom in the reverse direction, one can always remove all self-loops resulting in an irreflexive graph. This type class can therefore be also used in the context of irreflexive graphs.
The class of reflexive graphs that satisfy the following additional axiom.
  • Each vertex has a self-loop:
    vertex x == vertex x *
    vertex x
Or, alternatively, if we remember that vertex is an alias for pure:
pure x == pure x * pure x
Note that by applying the axiom in the reverse direction, one can always remove all self-loops resulting in an irreflexive graph. This type class can therefore be also used in the context of irreflexive graphs.
An abstract implementation of reflexive binary relations. Use Algebra.Graph.Class for polymorphic construction and manipulation.
The ReflexiveRelation data type represents a reflexive binary relation over a set of elements. Reflexive relations satisfy all laws of the Reflexive type class and, in particular, the self-loop axiom:
vertex x == vertex x * vertex x
The Show instance produces reflexively closed expressions:
show (1     :: ReflexiveRelation Int) == "edge 1 1"
show (1 * 2 :: ReflexiveRelation Int) == "edges [(1,1),(1,2),(2,2)]"
Compute the reflexive closure of a graph by adding a self-loop to every vertex. Complexity: O(n * log(n)) time.
reflexiveClosure empty              == empty
reflexiveClosure (vertex x)         == edge x x
reflexiveClosure (edge x x)         == edge x x
reflexiveClosure (edge x y)         == edges [(x,x), (x,y), (y,y)]
reflexiveClosure . reflexiveClosure == reflexiveClosure
Compute the reflexive closure of a graph by adding a self-loop to every vertex. Complexity: O(n * log(n)) time.
reflexiveClosure empty              == empty
reflexiveClosure (vertex x)         == edge x x
reflexiveClosure (edge x x)         == edge x x
reflexiveClosure (edge x y)         == edges [(x,x), (x,y), (y,y)]
reflexiveClosure . reflexiveClosure == reflexiveClosure
Compute the reflexive closure of a graph over the underlying semiring by adding a self-loop of weight one to every vertex. Complexity: O(n * log(n)) time.
reflexiveClosure empty              == empty
reflexiveClosure (vertex x)         == edge one x x
reflexiveClosure (edge e x x)       == edge one x x
reflexiveClosure (edge e x y)       == edges [(one,x,x), (e,x,y), (one,y,y)]
reflexiveClosure . reflexiveClosure == reflexiveClosure
Compute the reflexive closure of a graph over the underlying semiring by adding a self-loop of weight one to every vertex. Complexity: O(n * log(n)) time.
reflexiveClosure empty              == empty
reflexiveClosure (vertex x)         == edge one x x
reflexiveClosure (edge e x x)       == edge one x x
reflexiveClosure (edge e x y)       == edges [(one,x,x), (e,x,y), (one,y,y)]
reflexiveClosure . reflexiveClosure == reflexiveClosure
Compute the reflexive closure of a graph by adding a self-loop to every vertex. Complexity: O(n * log(n)) time.
reflexiveClosure (vertex x)         == edge x x
reflexiveClosure (edge x x)         == edge x x
reflexiveClosure (edge x y)         == edges1 [(x,x), (x,y), (y,y)]
reflexiveClosure . reflexiveClosure == reflexiveClosure
Compute the reflexive closure of a graph. Complexity: O(n * log(m)) time.
reflexiveClosure empty              == empty
reflexiveClosure (vertex x)         == edge x x
reflexiveClosure (edge x x)         == edge x x
reflexiveClosure (edge x y)         == edges [(x,x), (x,y), (y,y)]
reflexiveClosure . reflexiveClosure == reflexiveClosure