2012-01-25 2 views
12

Sto facendo composizione di automi. Quindi alla fine di questo, voglio disegnare anche gli automi composti. Quindi ci sono delle librerie per questo in ocaml? o ci sono wrapper ocaml scritti per uno strumento di visualizzazione di grafici? Ho cercato su Google ma non ho ottenuto molto per ocaml. Qualche commento su ocamlgraph? Otterrò più di 100 stati in automi composti.Come visualizzare/disegnare automi in ocaml?

risposta

16

Usa ocamlgraph - è una libreria di grafi che può generare un file punto/graphviz per te ma può anche fare un sacco di altre cose che potrebbero essere interessanti per gestire i tuoi automi. La libreria può eseguire fixpoint, spanning tree, ricerca di grafici, trovare componenti fortemente collegati, ecc.

Ecco un esempio completo di alcuni grafici diretti con bordi etichettati + modulo per eseguire il modulo depth-first-search + per la creazione di rappresentazioni di punti:

(* 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 cui è possibile scrivere il programma; per esempio. qualcosa del genere:

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

Ok, grazie. Puoi darmi qualche dettaglio in più? – priyanka

+0

Il tipo del nodo è 'int', quindi la funzione' vertex_name' nel modulo 'Dot' è' let vertex_name v = string_of_int v' –

7

Vorrei solo scrivere gli automi come testo su file (in formato adatto per graphviz) e quindi eseguire graphviz su quel file.

+0

Ci ho pensato anche io. Ma ci sono opzioni migliori disponibili? – priyanka

+0

Il modulo 'Graphics' in OCaml e/o il pacchetto' CamlPDF' funzionerebbe. Anche se, non voglio firmare questa soluzione; dovrai capire una tecnica di layout. Raccomando anche graphviz. – nlucaroni