They're used to guarantee that the functions needed by an algorithm are correctly defined. For instance, index_adjency_list requires vertices(g), out_edges(g,u) and others be defined, the underlying vertices(g) range is a random_access_range, the underlying out_edges(g,u) is a forward_range, etc.