14

オートマトンの作曲をしています。それで最後に合成オートマタも描きたいです。ocaml にそのためのライブラリはありますか? または、グラフ視覚化ツール用に書かれた ocaml ラッパーはありますか? 私はそれをグーグルで検索しましたが、ocaml についてはあまり得られませんでした。ocamlgraph に関するコメントはありますか? 合成オートマトンで 100 以上の状態を取得します。

4

2 に答える 2

18

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 ...
于 2012-01-25T22:27:33.910 に答える
7

オートマトンをテキストとしてファイルに (graphviz に適した形式で) 書き込み、そのファイルに対して graphviz を実行するだけです。

于 2012-01-25T08:51:15.820 に答える