/**
   * Retira os estados inalcançáveis do automato
   *
   * @param automato
   * @param alcancaveis
   */
  private static void retirarEstadosInalcancaveis(
      Automato automato, ArrayListPersonalizado<Estado> alcancaveis) {
    ArrayListPersonalizado<Estado> auxiliar = (ArrayListPersonalizado<Estado>) alcancaveis.clone();

    for (Estado estado : alcancaveis) {
      for (Mapeamento mapeamento : automato.funcaoMapeamento) {
        if (mapeamento.estadoOrigem.equals(estado)) {
          auxiliar.add(mapeamento.estadoDestino);
        }
      }
    }

    if (!alcancaveis.equals(auxiliar)) {
      retirarEstadosInalcancaveis(automato, auxiliar);
      return;
    }
    ArrayList<Estado> inalcancaveis = (ArrayList<Estado>) automato.estados.clone();
    inalcancaveis.removeAll(auxiliar);
    retirarEstadosEProducoes(automato, inalcancaveis);
  }
  /**
   * Retira os estados mortos do autômato
   *
   * @param automato
   * @param naoMortos
   */
  private static void retirarEstadosMortos(
      Automato automato, ArrayListPersonalizado<Estado> naoMortos) {

    ArrayListPersonalizado<Estado> auxiliar = new ArrayListPersonalizado<>();
    auxiliar.addAll(naoMortos);

    for (Mapeamento mapeamento : automato.funcaoMapeamento) {
      if (naoMortos.contains(mapeamento.estadoDestino)) {
        auxiliar.add(mapeamento.estadoOrigem);
      }
    }
    if (!auxiliar.equals(naoMortos)) {
      retirarEstadosMortos(automato, auxiliar);
      return;
    }
    ArrayListPersonalizado<Estado> mortos =
        (ArrayListPersonalizado<Estado>) automato.estados.clone();
    naoMortos.add(automato.erro);
    mortos.removeAll(naoMortos);

    retirarEstadosEProducoes(automato, mortos);
  }