diff --git a/Library-SMTLIB/src/de/uni_freiburg/informatik/ultimate/util/ConstantTermNormalizer.java b/Library-SMTLIB/src/de/uni_freiburg/informatik/ultimate/util/ConstantTermNormalizer.java
new file mode 100644
index 000000000..38701756d
--- /dev/null
+++ b/Library-SMTLIB/src/de/uni_freiburg/informatik/ultimate/util/ConstantTermNormalizer.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2009-2012 University of Freiburg
+ *
+ * This file is part of SMTInterpol.
+ *
+ * SMTInterpol is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * SMTInterpol is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with SMTInterpol. If not, see .
+ */
+package de.uni_freiburg.informatik.ultimate.util;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+
+import de.uni_freiburg.informatik.ultimate.logic.ConstantTerm;
+import de.uni_freiburg.informatik.ultimate.logic.Rational;
+import de.uni_freiburg.informatik.ultimate.logic.Term;
+import de.uni_freiburg.informatik.ultimate.logic.TermTransformer;
+
+/**
+ * {@link ConstantTerm}s that have numeric sort (Int, Real) can represent their
+ * value either as {@link BigInteger}, {@link BigDecimal}, or {@link Rational}.
+ * This class helps us to establish a normal form in which values are always
+ * represented by {@link Rational}s.
+ *
+ * @author Matthias Heizmann (matthias.heizmann@iste.uni-stuttgart.de>)
+ *
+ */
+public class ConstantTermNormalizer extends TermTransformer {
+
+ @Override
+ protected void convert(final Term term) {
+ if (term instanceof ConstantTerm) {
+ final Term res;
+ final ConstantTerm ct = (ConstantTerm) term;
+ res = convertConstantTerm(ct);
+ setResult(res);
+ } else {
+ super.convert(term);
+ }
+ }
+
+ private static Term convertConstantTerm(final ConstantTerm ct) {
+ if (!ct.getSort().isNumericSort()) {
+ // do nothing, only applicable to numeric sorts
+ return ct;
+ }
+ if (ct.getValue() instanceof BigInteger) {
+ final Rational rat = Rational.valueOf((BigInteger) ct.getValue(), BigInteger.ONE);
+ return rat.toTerm(ct.getSort());
+ } else if (ct.getValue() instanceof BigDecimal) {
+ final BigDecimal decimal = (BigDecimal) ct.getValue();
+ Rational rat;
+ if (decimal.scale() <= 0) {
+ final BigInteger num = decimal.toBigInteger();
+ rat = Rational.valueOf(num, BigInteger.ONE);
+ } else {
+ final BigInteger num = decimal.unscaledValue();
+ final BigInteger denom = BigInteger.TEN.pow(decimal.scale());
+ rat = Rational.valueOf(num, denom);
+ }
+ return rat.toTerm(ct.getSort());
+ } else if (ct.getValue() instanceof Rational) {
+ // do nothing, already in normal form
+ return ct;
+ } else {
+ throw new AssertionError("Value has to be either BigInteger, Decimal, or Rational");
+ }
+ }
+
+}
diff --git a/SMTInterpol/src/de/uni_freiburg/informatik/ultimate/smtinterpol/model/ConstantTermNormalizer.java b/SMTInterpol/src/de/uni_freiburg/informatik/ultimate/smtinterpol/model/ConstantTermNormalizer.java
deleted file mode 100644
index 6d28b7183..000000000
--- a/SMTInterpol/src/de/uni_freiburg/informatik/ultimate/smtinterpol/model/ConstantTermNormalizer.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2009-2012 University of Freiburg
- *
- * This file is part of SMTInterpol.
- *
- * SMTInterpol is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * SMTInterpol is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with SMTInterpol. If not, see .
- */
-package de.uni_freiburg.informatik.ultimate.smtinterpol.model;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import de.uni_freiburg.informatik.ultimate.logic.ConstantTerm;
-import de.uni_freiburg.informatik.ultimate.logic.Rational;
-import de.uni_freiburg.informatik.ultimate.logic.Term;
-import de.uni_freiburg.informatik.ultimate.logic.TermTransformer;
-
-public class ConstantTermNormalizer extends TermTransformer {
-
- @Override
- protected void convert(Term term) {
- if (term instanceof ConstantTerm) {
- final ConstantTerm ct = (ConstantTerm) term;
- if (ct.getValue() instanceof BigInteger) {
- final Rational rat = Rational.valueOf(
- (BigInteger) ct.getValue(), BigInteger.ONE);
- setResult(rat.toTerm(term.getSort()));
- } else if (ct.getValue() instanceof BigDecimal) {
- final BigDecimal decimal = (BigDecimal) ct.getValue();
- Rational rat;
- if (decimal.scale() <= 0) {
- final BigInteger num = decimal.toBigInteger();
- rat = Rational.valueOf(num, BigInteger.ONE);
- } else {
- final BigInteger num = decimal.unscaledValue();
- final BigInteger denom = BigInteger.TEN.pow(decimal.scale());
- rat = Rational.valueOf(num, denom);
- }
- setResult(rat.toTerm(term.getSort()));
- } else if (ct.getValue() instanceof Rational) {
- setResult(ct);
- } else {
- setResult(term);
- }
- } else {
- super.convert(term);
- }
- }
-
-}