@Override
  public List<Expression<Boolean>> getInterpolants(List<Expression<Boolean>> exprsn) {

    Script s = new de.uni_freiburg.informatik.ultimate.smtinterpol.smtlib2.SMTInterpol();

    SMTInterpolExpressionGenerator gen = new SMTInterpolExpressionGenerator(s);
    ArrayList<String> names = new ArrayList<>();

    s.setOption(":produce-interpolants", true);
    s.setLogic(Logics.QF_LIA);
    int i = 1;
    for (Expression<Boolean> e : exprsn) {
      Term t = gen.generateAssertion(e);
      // System.out.println("T: " + t);
      String name = "phi_" + (i++);
      names.add(name);
      s.assertTerm(s.annotate(t, new Annotation(":named", name)));
    }

    if (s.checkSat() == Script.LBool.UNSAT) {
      Term[] terms = new Term[names.size()];
      i = 0;
      for (String n : names) {
        terms[i++] = s.term(n);
      }

      Term[] interpolants;
      interpolants = s.getInterpolants(terms);
      // System.out.println("I: " + Arrays.toString(interpolants));

      // parse result
      ArrayList<Expression<Boolean>> ret = new ArrayList<>();
      for (Term t : interpolants) {
        // System.out.println(t);
        TermParser parser = new TermParser(t, gen.getVariables());
        Expression<Boolean> interpolant;
        try {
          interpolant = parser.parse();
        } catch (TermParserException ex) {
          logger.severe(ex.getMessage());
          return null;
        }
        ret.add(interpolant);
      }

      return ret;
    }

    return null;
  }