public ArrayList<Regla> generar_reglas(GrupoElementos g) {
        ArrayList<Regla> respuesta = new ArrayList<Regla>();

        ArrayList<Elemento> elementos = g.getElementos();

        int l = elementos.size();
        boolean num[] = new boolean[l]; //El número que indica qué elementos pertenecen a la parte izquierda de la regla

        //permutar opciones, contar en binario
        int c = 0; //Posición a cambiar
        boolean fin = false;
        while (c < l) {
            c = 0;//Inicializamos el contador de posición
            while (!fin && num[c]) {//Si la posición es un uno entonces ponemos un cero y nos movemos a la siguiente
                num[c] = false;
                c++;

                //Si nos hemos pasado hemos acabado
                if (c >= l) {
                    fin = true;
                }

            }
            //TODO se puede mejorar ya que se generan reglas que podrían generarse simplemente cambiando la posición del antecedente y el consecuente
            //invirtiendo la regla

            if (!fin) {//Si aún no hemos terminado...
                //Cuando hayamos llegado a una posición en false la volvemos true
                num[c] = true;

                //Con el número que compone el vector formamos la regla
                GrupoElementos antecedente = new GrupoElementos();
                GrupoElementos consecuente = new GrupoElementos();
                for (int i = 0; i < l; i++) {//Recorremos el número bit a bit, en los que haya true se copian al antecedente
                    if (num[i]) { //Si la posición i está a true ese elemento es del antecedente
                        antecedente.getElementos().add(elementos.get(i));
                    } else {
                        consecuente.getElementos().add(elementos.get(i));
                    }
                }

                //Si cualquiera de los dos antecedente o conscuente está vacío la regla no se copia
                if (antecedente.getElementos().size() > 0 && consecuente.getElementos().size() > 0) {

                    //El soporte de la regla es el soporte del grupo
                    Regla r = new Regla(antecedente, consecuente);
                    r.setSoporte(g.getSoporte());

                    //Añadimos la nueva regla a la lista a devolver
                    respuesta.add(r);
                }

            }
        }

        return respuesta;
    }