code: def preProcess(self, variables, domains, constraints, vconstraints):
          
          if len(variables) == 1:
              variable = variables[0]
              domain = domains[variable]
              for value in domain[:]:
                  if not self(variables, domains, {variable: value}):
                      domain.remove(value)
              constraints.remove((self, variables))
              vconstraints[variable].remove((self, variables))
docs: Preprocess variable domains
  
          This method is called before starting to look for solutions,
          and is used to prune domains with specific constraint logic
          when possible. For instance, any constraints with a single
          variable may be applied on all possible values and removed,
          since they may act on individual values even without further
          knowledge about other assignments.
  
          @param variables: Variables affected by that constraint, in the
                            same order provided by the user
          @type  variables: sequence
          @param domains: Dictionary mapping variables to their domains
          @type  domains: dict
          @param constraints: List of pairs of (constraint, variables)
          @type  constraints: list
          @param vconstraints: Dictionary mapping variables to a list of
                               constraints affecting the given variables.
          @type  vconstraints: dict