/**
   * 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);
  }
 /**
  * Cria funcoes de mapeamento de cada classe para as suas respectivas classes de destino
  *
  * @param automato
  * @param classeEstado
  * @param equivalencia
  * @param novosMapeamentos
  */
 private static void criarFuncoesMapeamento(
     Automato automato,
     ClasseEquivalencia classeEstado,
     Equivalencia equivalencia,
     ArrayListPersonalizado<Mapeamento> novosMapeamentos) {
   Estado aux = classeEstado.estadosClasse.get(0);
   ArrayList<Mapeamento> mapsAdicionais = new ArrayList<>();
   for (String letraAlfabeto : automato.alfabeto) {
     for (Mapeamento mapeamento : automato.funcaoMapeamento) {
       if (mapeamento.estadoOrigem.equals(aux)
           && mapeamento.terminalTransicao.equals(letraAlfabeto)) {
         mapsAdicionais.add(
             new Mapeamento(
                 criaOuRetornaEstadoAPartirDeClasse(automato, classeEstado),
                 criaOuRetornaEstadoAPartirDeClasse(
                     automato, equivalencia.retornarClassePeloEstado(mapeamento.estadoDestino)),
                 letraAlfabeto));
       }
     }
   }
   novosMapeamentos.addAll(mapsAdicionais);
 }