@Override
  public boolean isApplicable(TableauTree tree) {
    if (tree.getConcepts() == null || tree.getConcepts().isEmpty()) {
      tree.addAppliedRule(this.getClass());
      return false;
    }

    if (tree.isRuleApplied(this.getClass())) {
      return false;
    }

    return getExistencialTerm(tree) != null;
  }
  /**
   * This rules creates splits the current tree in two different ones.
   *
   * @param tree
   */
  @Override
  public boolean apply(TableauTree tree) {
    RoleTerm eTerm = getExistencialTerm(tree);
    if (eTerm == null) {
      return false; // nothing to apply. It should have been call but to avoid problems return the
                    // same tree
    }

    tree.getConcepts().remove(eTerm);
    tree.addChildren(
        eTerm.getRole(),
        new TableauTree(new IndividualTerm("a" + tree.getTotalChildren(), true), eTerm.getTerm()));
    return true;
  }
  /**
   * @return
   * @author jmayaalv
   */
  private RoleTerm getExistencialTerm(TableauTree tree) {

    RoleTerm rTerm = null;
    for (Term term : tree.getConcepts()) {
      if (term instanceof RoleTerm) {
        RoleTerm roleTerm = (RoleTerm) term;
        if (RoleTerm.RoleTermOperation.EXISTENTIAL_RESTRICTION.equals(roleTerm.getOperation())) {
          rTerm = roleTerm;
          break;
        }
      }
    }

    if (rTerm == null) {
      tree.addAppliedRule(this.getClass());
    }

    return rTerm;
  }