internal static HashSet <Expression> Nominate(Expression expression)
            {
                var nominator = new Nominator();

                nominator.Visit(expression);
                return(nominator._candidates);
            }
 /// <summary>
 /// Performs evaluation and replacement of independent sub-trees
 /// </summary>
 /// <param name="expression">The root of the expression tree.</param>
 /// <returns>A new tree with sub-trees evaluated and replaced.</returns>
 public static Expression Rewrite(Expression expression) =>
 Evaluator.Evaluate(Nominator.Nominate(expression), expression);