Advertisement
Guest User

Untitled

a guest
Oct 22nd, 2015
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 1.72 KB | None | 0 0
  1.    module type VertexSig = sig
  2.       val t : 'a
  3.       val compare : 'a -> 'a -> int
  4.     end
  5.  
  6. module Graph(Vertex : VertexSig) : sig
  7.   module VertexSet : Set.S with type elt = Vertex.t
  8.   module EdgeSet : Set.S with type elt = Vertex.t * Vertex.t
  9.  
  10.   val add_vertex : VertexSet.elt -> VertexSet.t * 'a -> VertexSet.t
  11.   val add_edge : VertexSet.elt * VertexSet.elt -> VertexSet.t * VertexSet.t -> VertexSet.t
  12.  
  13.   val get_edges : Vertex.t -> 'a * EdgeSet.t -> EdgeSet.t
  14.  
  15.   val remove_vertex : Vertex.t -> VertexSet.t * EdgeSet.t -> VertexSet.t * EdgeSet.t
  16.   val remove_edge : Vertex.t * Vertex.t -> 'a * EdgeSet.t -> EdgeSet.t
  17.  
  18.   exception Vertex_not_found
  19. end =
  20.   struct
  21.  
  22.  
  23.     module Edge =
  24.       struct
  25.         type t = Vertex.t * Vertex.t (* Error: Unbound type constructor Vertex.t *)
  26.  
  27.         let compare (a, _) (b, _) = Vertex.compare a b
  28.       end
  29.  
  30.     module EdgeSet = Set.Make(Edge)
  31.     module VertexSet = Set.Make(Vertex)
  32.  
  33.     let add_vertex v (vset, eset) = VertexSet.add v vset
  34.  
  35.     let get_edges v (vset, eset) = EdgeSet.filter (fun (u, _) -> (compare u v) = 0) eset
  36.  
  37.     let remove_vertex v (vset, eset) =
  38.       let edges_from = get_edges v (vset, eset) in
  39.       let edges_to = EdgeSet.filter (fun (_, u) -> (compare u v) = 0) eset in
  40.       let edges = EdgeSet.diff (EdgeSet.diff eset edges_from) edges_to in
  41.       let vertices = VertexSet.remove v vset in
  42.       (vertices, edges)
  43.  
  44.     exception Vertex_not_found
  45.  
  46.     let add_edge (v, u) (vset, eset) =
  47.       if VertexSet.exists (fun e -> e = v) vset && VertexSet.exists (fun e -> (compare e u) = 0) vset
  48.       then VertexSet.add v eset
  49.       else raise Vertex_not_found
  50.  
  51.     let remove_edge (v, u) (vset, eset) = EdgeSet.remove (v, u) eset
  52.  
  53.   end;;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement