code: public BoundSet reduce(TypeSolver typeSolver) {
          List<ConstraintFormula> constraints = new LinkedList<>(constraintFormulas);
          BoundSet boundSet = BoundSet.empty();
          while (constraints.size() > 0) {
              ConstraintFormula constraintFormula = constraints.remove(0);
              ConstraintFormula.ReductionResult reductionResult = constraintFormula.reduce(boundSet);
              constraints.addAll(reductionResult.getConstraintFormulas());
              boundSet.incorporate(reductionResult.getBoundSet(), typeSolver);
          }
          return boundSet;
      }
docs: Takes a compatibility assertion about an expression or type, called a constraint formula, and reduces it to a
  set of bounds on inference variables. Often, a constraint formula reduces to other constraint formulas,
  which must be recursively reduced. A procedure is followed to identify these additional constraint formulas and,
  ultimately, to express via a bound set the conditions under which the choices for inferred types would render
  each constraint formula true.