Ответ 1
Использовать ocamlgraph - это библиотека графов, которая может генерировать файл dot/graphviz для вас, но также может многое сделать других вещей, которые могут быть интересны для обработки ваших автоматов. Библиотека может делать фиксированные точки, охватывать деревья, искать графики, находить сильно связанные компоненты и т.д. И т.д.
Вот полный пример некоторого ориентированного графа с мечеными ребрами + модуль для создания модуля глубин-поиска + для создания его точечных представлений:
(* representation of a node -- must be hashable *)
module Node = struct
type t = int
let compare = Pervasives.compare
let hash = Hashtbl.hash
let equal = (=)
end
(* representation of an edge -- must be comparable *)
module Edge = struct
type t = string
let compare = Pervasives.compare
let equal = (=)
let default = ""
end
(* a functional/persistent graph *)
module G = Graph.Persistent.Digraph.ConcreteBidirectionalLabeled(Node)(Edge)
(* more modules available, e.g. graph traversal with depth-first-search *)
module D = Graph.Traverse.Dfs(G)
(* module for creating dot-files *)
module Dot = Graph.Graphviz.Dot(struct
include G (* use the graph module from above *)
let edge_attributes (a, e, b) = [`Label e; `Color 4711]
let default_edge_attributes _ = []
let get_subgraph _ = None
let vertex_attributes _ = [`Shape `Box]
let vertex_name v = string_of_int v
let default_vertex_attributes _ = []
let graph_attributes _ = []
end)
с тем, что вы можете написать свою программу; например что-то вроде этого:
(* work with the graph ... *)
let _ =
let g = G.empty in
let g = G.add_edge_e ...
...
let file = open_out_bin "mygraph.dot" in
let () = Dot.output_graph file g in
...
if D.has_cycle g then ... else ...