@Override
 public Expression rewrite(UnaryExpression src, boolean changed, Expression newChild) {
   final UnaryExpression expr;
   if (changed) {
     expr = getFactory().makeUnaryExpression(src.getTag(), newChild, src.getSourceLocation());
   } else {
     expr = src;
   }
   return checkReplacement(src, rewriter.rewrite(expr));
 }
 @Override
 public Predicate rewrite(
     ExtendedPredicate src,
     boolean changed,
     Expression[] newChildExprs,
     Predicate[] newChildPreds) {
   final ExtendedPredicate pred;
   if (changed) {
     pred =
         getFactory()
             .makeExtendedPredicate(
                 src.getExtension(), newChildExprs, newChildPreds, src.getSourceLocation());
   } else {
     pred = src;
   }
   return checkReplacement(src, rewriter.rewrite(pred));
 }
 @Override
 public Expression rewrite(
     ExtendedExpression src,
     boolean changed,
     Expression[] newChildExprs,
     Predicate[] newChildPreds) {
   final ExtendedExpression expr;
   if (changed) {
     expr =
         getFactory()
             .makeExtendedExpression(
                 src.getExtension(),
                 newChildExprs,
                 newChildPreds,
                 src.getSourceLocation(),
                 src.getType());
   } else {
     expr = src;
   }
   return checkReplacement(src, rewriter.rewrite(expr));
 }
 @Override
 public Expression rewrite(AssociativeExpression src, AssociativeExpression expr) {
   return checkReplacement(src, rewriter.rewrite(expr));
 }
 @Override
 public void leavingQuantifier(int nbOfDeclarations) {
   rewriter.leavingQuantifier(nbOfDeclarations);
 }
 @Override
 public boolean autoFlatteningMode() {
   return rewriter.autoFlatteningMode();
 }
 @Override
 public Expression rewrite(UnaryExpression src, IntegerLiteral expr) {
   return checkReplacement(src, rewriter.rewrite(expr));
 }
 @Override
 public Expression rewrite(BinaryExpression src, BinaryExpression expr) {
   return checkReplacement(src, rewriter.rewrite(expr));
 }
 @Override
 public Expression rewrite(SetExtension src, SetExtension expr) {
   return checkReplacement(src, rewriter.rewrite(expr));
 }
 @Override
 public Predicate rewrite(RelationalPredicate src, RelationalPredicate pred) {
   return checkReplacement(src, rewriter.rewrite(pred));
 }
 @Override
 public Predicate rewrite(QuantifiedPredicate src, QuantifiedPredicate pred) {
   return checkReplacement(src, rewriter.rewrite(pred));
 }
 @Override
 public Expression rewrite(QuantifiedExpression src, QuantifiedExpression expr) {
   return checkReplacement(src, rewriter.rewrite(expr));
 }
 @Override
 public Predicate rewrite(LiteralPredicate src) {
   return checkReplacement(src, rewriter.rewrite(src));
 }
 @Override
 public Expression rewrite(IntegerLiteral src) {
   return checkReplacement(src, rewriter.rewrite(src));
 }
 @Override
 public Expression rewrite(FreeIdentifier src) {
   return checkReplacement(src, rewriter.rewrite(src));
 }
 @Override
 public Predicate rewrite(AssociativePredicate src, AssociativePredicate pred) {
   return checkReplacement(src, rewriter.rewrite(pred));
 }
 @Override
 public Expression rewrite(AtomicExpression src) {
   return checkReplacement(src, rewriter.rewrite(src));
 }
 @Override
 public Expression rewriteToEmptySet(SetExtension src) {
   final AtomicExpression expr = factory.makeEmptySet(src.getType(), src.getSourceLocation());
   return checkReplacement(src, rewriter.rewrite(expr));
 }
 @Override
 public Predicate rewrite(BinaryPredicate src, BinaryPredicate pred) {
   return checkReplacement(src, rewriter.rewrite(pred));
 }
 @Override
 public Predicate rewrite(SimplePredicate src, SimplePredicate pred) {
   return checkReplacement(src, rewriter.rewrite(pred));
 }