docs: public Expression2 substitute(int index, Expression2 newExpression) {
      Preconditions.checkArgument(index < size);
      if (index == 0) {
        return newExpression;
      } else {
        int[] parts = findSubexpression(index);
        
        Expression2 substituted = subexpressions.get(parts[0]).substitute(parts[1], newExpression);
        List<Expression2> newSubexpressions = Lists.newArrayList(subexpressions);
        newSubexpressions.set(parts[0], substituted);
        return Expression2.nested(newSubexpressions);
      }
    }