docs: def _find_conflicts(problem, assignment, variable=None, value=None):
      '''
      Find violated constraints on a given assignment, with the possibility
      of specifying a new variable and value to add to the assignment before
      checking.
      '''
      if variable is not None and value is not None:
          assignment = deepcopy(assignment)
          assignment[variable] = value
  
      conflicts = []
      for neighbors, constraint in problem.constraints:
          # if all the neighbors on the constraint have values, check if conflict
          if all(n in assignment for n in neighbors):
              if not _call_constraint(assignment, neighbors, constraint):
                  conflicts.append((neighbors, constraint))
  
      return conflicts