code: public Expression rewriteExpression(Expression expression, Predicate<Symbol> symbolScope)
      {
          checkArgument(isDeterministic(expression), "Only deterministic expressions may be considered for rewrite");
          return rewriteExpression(expression, symbolScope, true);
      }
docs: Attempts to rewrite an Expression in terms of the symbols allowed by the symbol scope
  given the known equalities. Returns null if unsuccessful.
  This method checks if rewritten expression is non-deterministic.