private EvaluacionTeoria evaluar_teoria(Teoria teoria, boolean[][] la_historia) {
        EvaluacionTeoria r = new EvaluacionTeoria();

        ArrayList<Regla> reglas = teoria.getCertezas();

        int nentradas = la_historia[0].length;
        int t_historia = la_historia.length;

        int[] aciertos_entradas = new int[nentradas];
        int[] fallos_entradas = new int[nentradas];
        int[] aciertos_muestras = new int[t_historia];
        int[] fallos_muestras = new int[t_historia];

        //Recorremos la historia comprobando y tomando nota de cuántos pasos es capaz de explicar la teoría
        //TODO Deberíamos fijarnos sólo en las entradas originales, pero de momento nos fijamos en todas
        //más adelante pasaremos separada la historia de los estados extra

        for (int h = 0; h < t_historia - 1; h++) { //-1 para que no se salga ya que comprueba cada muestra con la siguiente para evaluar la predicción
            boolean[] muestra = la_historia[h];

            //Para cada muestra evaluar el estado siguiente con la teoría
            int[] siguiente = this.evaluar(muestra, reglas);


            //Comprobar aciertos con la siguiente
            boolean[] muestra_siguiente = la_historia[h + 1];


            for (int i = 0; i < nentradas; i++) {
                if (siguiente[i] == 1) {
                    if (muestra_siguiente[i]) {
                        //ACIERTO!
                        aciertos_entradas[i]++;
                        aciertos_muestras[h + 1]++;
                    } else {
                        //FALLO!
                        fallos_entradas[i]++;
                        fallos_muestras[h + 1]++;
                    }
                } else if (siguiente[i] == 0) {
                    if (!muestra_siguiente[i]) {
                        //ACIERTO!!
                        aciertos_entradas[i]++;
                        aciertos_muestras[h + 1]++;
                    }
                } else if (siguiente[i] == 2) { //El 2 indica Contradicción!
                    //FALLO!
                    fallos_entradas[i]++;
                    fallos_muestras[h + 1]++;
                }
            }
        }

        //Rellenamos la respuesta
        r.nentradas = nentradas;
        r.nmuestras = t_historia - 1; //No contamos una de las muestras porque sólo podemos evaluar los pasos que son uno menos
        r.aciertos_entradas = aciertos_entradas;
        r.aciertos_muestras = aciertos_muestras;
        r.fallos_entradas = fallos_entradas;
        r.fallos_muestras = fallos_muestras;

        return r;
    }