@Override
    public String correrAlgoritmo() {
        seEncontroObjetivo = false;
        List<String> listaObjetivos = new ArrayList<String>();
        listaObjetivos.add(objetivo);
        pilaDeObjetivos.push(listaObjetivos);

        while (!pilaDeObjetivos.empty()) {
            listaObjetivos = pilaDeObjetivos.peek();
            boolean seCumpleRegla = true;

            for (int i = 0; i < listaObjetivos.size(); i++) {
                String s = listaObjetivos.get(i);

                // Si se encuentra el elemento en alguna de las listas
                if (isElementoEnListas(s)) {

                    if (objetivo.equals(s)) {
                        seEncontroObjetivo = true;
                        pilaDeObjetivos.pop();
                        break;

                    } else {

                        if ((i + 1) == listaObjetivos.size()) {
                            pilaDeObjetivos.pop();
                            Regla r = reglasPorDisparar.pop();
                            agregarAHechosInferidos(r.getProducto());
                            reglasDisparadas.add(r);
                        } else {
                            continue;
                        }
                    }
                    // Si el elemento no se encuentra en las listas, buscamos en reglas o preguntamos
                } else {
                    Regla reglaAComprobar = buscarReglaQueProduzca(s);

                    if (null == reglaAComprobar) {

                        if (preguntarAlUsuarioSiEsta(s)) {
                            agregarAHechosPreguntados(s);
                            continue;

                        } else {
                            seCumpleRegla = false;
                            break;
                        }

                    } else {
                        pilaDeObjetivos.push(reglaAComprobar.getCausantes());
                        reglasPorDisparar.push(reglaAComprobar);
                        break;
                    }
                }
            }

            if (!seCumpleRegla) {
                break;
            }
        }

        resultado = crearTextoRespuesta();
        return resultado;
    }