2012-01-25 17 views
12

Estoy haciendo composición de autómatas. Entonces, al final de eso, también quiero dibujar los autómatas compuestos. Entonces, ¿hay alguna biblioteca para eso en ocaml? o hay envoltorios ocaml escritos para cualquier herramienta de visualización de gráficos? He buscado en Google, pero no obtuve mucho para ocaml. ¿Algún comentario sobre ocamlgraph? Obtendré más de 100 estados en autómatas compuestos.¿Cómo visualizar/dibujar autómatas en ocaml?

Respuesta

16

Use ocamlgraph - es una biblioteca de gráficos que puede generar un archivo punto/gráfico gráfico para usted pero también puede hacer muchas otras cosas que pueden ser interesantes para manejar su autómata. La biblioteca puede hacer puntos fijos, abarcar árboles, buscar gráficos, encontrar componentes fuertemente conectados, etc., etc.

Aquí hay un ejemplo completo de algunos gráficos dirigidos con bordes etiquetados + módulo para hacer un primer módulo de profundidad de búsqueda + para crear representaciones de puntos:

(* 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) 

con el que puede escribir su programa; p.ej. algo como esto:

(* 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 ... 
+0

Bien, gracias. ¿Puedes darme más detalles de eso? – priyanka

+0

El tipo de nodo es 'int', luego la función' vertex_name' en el módulo 'Dot' es' let vertex_name v = string_of_int v' –

7

Escribo autómatas como texto a archivo (en formato adecuado para graphviz) y luego ejecuto graphviz contra ese archivo.

+0

También pensé en eso. ¿Pero hay mejores opciones disponibles? – priyanka

+0

El módulo 'Graphics' en OCaml, y/o el paquete' CamlPDF' funcionaría. Aunque, no costaría esta solución; tendrás que descubrir una técnica de diseño. Yo recomendaría graphviz también. – nlucaroni