Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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 ...

Ответ 2

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