module Fixpoint:sig
..end
One of the simplest fixpoint analysis is that of reachability.
Given a directed graph module G
, its analysis can be implemented
as follows:
module Reachability = Graph.Fixpoint.Make(G)
(struct
type vertex = G.E.vertex
type edge = G.E.t
type g = G.t
type data = bool
let direction = Graph.Fixpoint.Forward
let equal = (=)
let join = (||)
let analyze _ = (fun x -> x)
end)
The types for vertex
, edge
and g
are those of the graph to be
analyzed. The data
type is bool
: It will tell if the
vertex is reachable from the start vertex. The equal
operation
for bool
is simply structural equality; the join
operation is
logical or. The analyze
function is very simple, too: If the
predecessor vertex is reachable, so is the successor vertex of the
edge.
To use the analysis, an instance of a graph g
is required. For
this analysis a predicate is_root_vertex : G.E.vertex -> bool
is
required to initialize the reachability of the root vertex to
true
and of all other vertices to false
.
let g = ...
let result = Reachability.analyze is_root_vertex g
The result
is a map of type G.E.vertex -> bool
that can be
queried for every vertex to tell if the vertex is reachable from
the root vertex.
Author(s): Markus W. Weissmann
See also
module type G =sig
..end
type
direction =
| |
Forward |
|||
| |
Backward |
(* |
Type of an analysis
| *) |
module type Analysis =sig
..end
module Make: