private Clause resolve(Clause mainPremise, Clause sidePremise, int mainPremiseAtomIndex) {

    // Rename the variables of the side premise
    int numberOfVariablesMainPremise = mainPremise.getVariables().size();
    Clause sidePremiseRenamed =
        sidePremise.renameVariables(
            this.m_saturator.getTermFactory(), numberOfVariablesMainPremise);

    Term mainAtom = mainPremise.getBody()[mainPremiseAtomIndex];
    Term sideAtom = sidePremiseRenamed.getHead();

    Substitution unifier =
        Substitution.mostGeneralUnifier(mainAtom, sideAtom, this.m_saturator.getTermFactory());

    if (unifier == null) return null;
    Set<Term> newBody = new LinkedHashSet<Term>();
    // Copy the atoms from the main premise
    for (int index = 0; index < mainPremise.getBody().length; index++) {
      if (index != mainPremiseAtomIndex) {
        Term newBodyAtom =
            mainPremise.getBody()[index].apply(unifier, this.m_saturator.getTermFactory());
        ((FunctionalTerm) newBodyAtom).originIndex =
            ((FunctionalTerm) mainPremise.getBody()[index]).originIndex;
        newBody.add(newBodyAtom);
      }
    }
    // Copy the atoms from the side premise
    for (int index = 0; index < sidePremiseRenamed.getBody().length; index++) {
      Term newBodyAtom =
          sidePremiseRenamed.getBody()[index].apply(unifier, this.m_saturator.getTermFactory());
      ((FunctionalTerm) newBodyAtom).originIndex = ((FunctionalTerm) mainAtom).originIndex;
      newBody.add(newBodyAtom);
    }

    // New body and head
    Term[] body = new Term[newBody.size()];
    newBody.toArray(body);
    Term head = mainPremise.getHead().apply(unifier, this.m_saturator.getTermFactory());

    Clause resolvent = new Clause(body, head);

    // Rename variables in resolvent
    ArrayList<Variable> variablesResolvent = resolvent.getVariables();
    HashMap<Variable, Integer> variableMapping = new HashMap<Variable, Integer>();
    for (int i = 0; i < variablesResolvent.size(); i++) {
      variableMapping.put(variablesResolvent.get(i), i);
    }
    Clause resolventRenamed =
        resolvent.renameVariables(this.m_saturator.getTermFactory(), variableMapping);

    return resolventRenamed;
  }