Как визуализировать / нарисовать автоматы в ocaml?

Я делаю композицию из автоматов. В конце этого я хочу нарисовать составные автоматы также. Так есть ли библиотеки для этого в ocaml? или для какого-либо инструмента визуализации графиков написаны оболочки ocaml? Я гуглил за это, но не получил много за ocaml. Любые комментарии на ocamlgraph? Я получу более 100 состояний в составе автоматов.

2 ответа

Решение

Используйте 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 ...

Я бы просто записал автоматы в виде текста в файл (в формате, подходящем для graphviz) и затем запустил graphviz для этого файла.

Другие вопросы по тегам