docs: def depth_first(problem, graph_search=False, viewer=None):
      '''
      Depth first search.
  
      If graph_search=True, will avoid exploring repeated states.
      Requires: SearchProblem.actions, SearchProblem.result, and
      SearchProblem.is_goal.
      '''
      return _search(problem,
                     LifoList(),
                     graph_search=graph_search,
                     viewer=viewer)