La función DuplicateFreeList
en GAP, que es la misma que la función Unique
toma una lista y devuelve todos los elementos de esa lista con los duplicados eliminados. Mi problema es que esta función comprueba los duplicados utilizando =
mientras que yo quiero eliminar los duplicados de una lista hasta el isomorfismo. ¿Existe una función GAP como DuplicateFreeList
que elimina los duplicados utilizando una función binaria arbitraria de verdadero/falso? O si no es así, ¿hay alguna manera de escribir una envoltura alrededor de DuplicateFreeList
que modifica el =
¿operador?
Respuesta
¿Demasiados anuncios?No existe tal función, pero teniendo en cuenta lo patético que resulta el código real de Unique
es, no es difícil escribir una función de este tipo:
UniqueByFunction:=function ( list,fun )
local l,i;
l:= [];
for i in list do
if ForAll(l,x->fun(x,i)=false) then
Add(l,i);
fi;
od;
return l;
end;
(toma una lista y una función de prueba de igualdad que devuelve true
o false
cuando se le dan dos objetos como argumentos. Es decir UniqueByFunction(list,\=);
tiene el mismo efecto que Unique(list);
.)
Advertencia: En una lista de longitud $n$ que hará $n(n-1)$ pruebas de isomorfismo, cada una de las cuales suele ser costosa. Por lo tanto, en la práctica, lo más habitual es dividir la lista según los invariantes de isomorfismo adecuados y, a continuación, ejecutar las pruebas sólo dentro de cada celda.