functor DFS( eqtype Vertex type Graph val adj: Graph -> Vertex -> Vertex list ) = struct type Vertex = Vertex type Graph = Graph fun reachable g s = let fun member [] _ = false | member (h :: t) v = (h = v) orelse member t v fun dfs [] visited = visited | dfs (x :: xs) visited = if member visited x then dfs xs visited else dfs (adj g x @ xs) (x :: visited) in dfs [s] [] end end