# package graphlib

Legend:
Library
Module
Module type
Parameter
Class
Class type

Graph signature.

Graph is mathematical data structure that is used to represent relations between elements of a set. Usually, graph is defined as an ordered pair of two sets - a set of vertices and a set of edges that is a 2-subset of the set of nodes,

`G = (V,E).`

In Graphlib vertices (called nodes in our parlance) and edges are labeled. That means that we can associate data with edges and nodes. Thus graph should be considered as an associative data structure. And from mathematics perspective graph is represented as an ordered 6-tuple, consisting of a set of nodes, edges, node labels, edge labels, and two functions that maps nodes and edges to their corresponding labels:

`G = (N, E, N', E', ν : N -> N', ε : E -> E'),`

where set `E` is a subset of ` N × N `.

With this general framework an unlabeled graph can be represented as:

`G = (N, E, N, E, ν = λx.x, ε = λx.x)`

Another possible representation of an unlabeled graph would be:

`G = (N, E, {u}, {v}, ν = λx.u, ε = λx.v).`

Implementations are free to choose any suitable representation of graph data structure, if it conforms to the graph signature and all operations follows the described semantics and properties of a graph structure are preserved.

The axiomatic semantics of operations on a graph is described by a set of postconditions. To describe the semantics of an operation in terms of input and output arguments, we project graphs to its fields with the following notation `<field>(<graph>)`, e.g., `N(g)` is a set of nodes of graph `g`.

Only the strongest postcondition is specified, e.g., if it is specified that `νn = l`, then it also means that

`n ∈ N ∧ ∃u((u,v) ∈ E ∨ (v,u) ∈ E) ∧ l ∈ N' ∧ ...`

In other words the structure `G` of the graph G is an invariant that is always preserved.

`type t`

type of graph

`type node`

type of nodes

`type edge`

type