functor SEARCH( structure G : sig type Vertex type Graph val adj : Graph -> Vertex -> Vertex list end structure S : sig type Item type Set val empty : Set val member : Set -> Item -> bool val insert : Item * Set -> Set end structure Q : sig type Item type Queue val empty : Queue val isEmpty : Queue -> bool val enq : Item * Queue -> Queue val deq : Queue -> Item * Queue val menq : Item list * Queue -> Queue end sharing type G.Vertex = S.Item = Q.Item ): sig type Graph and Vertex and VSet val reachable : Graph -> Vertex -> VSet end = struct type Graph = G.Graph type Vertex = G.Vertex type VSet = S.Set fun reachable (g:Graph) (s:Vertex) : VSet = let fun search todo visited = if Q.isEmpty todo then visited else let val (x,xs) = Q.deq todo in if S.member visited x then search xs visited else search (Q.menq (G.adj g x,xs)) (S.insert (x,visited)) end in search (Q.enq(s, Q.empty)) S.empty end end;