Как визуализировать / нарисовать автоматы в ocaml? - PullRequest
13 голосов
/ 25 января 2012

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

Ответы [ 2 ]

17 голосов
/ 26 января 2012

Используйте ocamlgraph - это библиотека графов, которая может сгенерировать для вас файл точка / граф, но также может сделать много других вещей, которые могут быть интересны для обработки ваших автоматов. Библиотека может делать точки привязки, связующие деревья, искать графики, находить сильно связанные компоненты и т. Д. И т. Д.

Вот полный пример некоторого ориентированного графа с помеченными ребрами + модуль для выполнения поиска в глубину + модуль для создания его точечных представлений:

(* 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 ...
7 голосов
/ 25 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...