@Override
  public Template chooseNextTemplate() {
    Template choice = null;
    boolean another = strategy.advance();
    if (!another) {
      return null;
    }
    TemplateChooserMethod method = strategy.getMethod();
    InfixReln relation = strategy.getRelation();

    logger.log(Level.ALL, "Template choice method:", method, "Template infix relation:", relation);

    switch (method) {
      case TOPLEVELTERMFORMS:
        choice = topLevelTermFormsMethod(relation);
        break;
      case EXITHEADNEGATION:
        choice = exitHeadNegationMethod(relation);
        break;
      case EXITTAILCOMB:
        choice = exitTailIndexOneFreeCombMethod(relation);
        break;
      case LOOPVARSFREECOMB:
        choice = loopVarsFreeCombMethod(relation);
        break;
      case LOOPVARSFREECOMBANDLOOPHEADFREECOMB:
        choice = loopVarsAndHeadFreeCombMethod(relation);
        break;
    }
    return choice;
  }
  @Override
  public boolean run(ReachedSet pReachedSet) throws CPAException, InterruptedException {
    boolean result = false;

    logger.log(Level.INFO, "Start analysis.");

    result = analysis.run(pReachedSet);

    if (result) {
      logger.log(Level.INFO, "Start property checking.");
      cpa.getPropChecker().satisfiesProperty(pReachedSet.asCollection());
    }

    logger.log(Level.INFO, "Finished analysis");
    return result;
  }