signature GRAPH = sig type 'a graph = ('a, 'a) Rel.relation val depthFirst : ''a * ''a graph -> ''a Set.set end; structure Graph :> GRAPH = struct type 'a graph = ('a, 'a) Rel.relation (* val depthFirst : ''a * ''a graph -> ''a Set.set *) fun depthFirst (x, g)= let (* val df' : ''a list * ''a Set.set -> ''a Set.set *) fun df' (nil, visited) = visited | df' (x::xs, visited) = if Set.setMember (x, visited) then df' (xs, visited) else let val vs = Rel.relImage (x, g) in df' ((Set.setToList vs) @ xs, Set.setInsert (x, visited)) end in df' ([x], Set.emptySet) end end;