Combinatoria en PROLOG

Esta semana investigando sobre PROLOG averiguamos con el grupo sobre combinatoria y como aplicarlo a listas, encontramos lo siguiente:

Permutaciones

Permutación de la lista L es una lista que contiene todos los elementos de la lista L en algún orden .
Codigo:

perm(List,[H|Perm]) :- delete(H,List,Rest),perm(Rest,Perm).
perm([],[]).

delete(X,[X|T],T).
delete(X,[H|T],[H|NT]) :- delete(X,T,NT).

Combinaciones 

La combinación es un subconjunto arbitrario del conjunto que contiene determinado número de elementos. El orden de los elementos es irrelevante.
Codigo:

comb(0,_,[]).
comb(N,[X|T],[X|Comb]) :- N > 0, N1 is N - 1, comb(N1,T,Comb).
comb(N,[_|T],Comb) :- N > 0, comb(N,T,Comb).

Es posible programar el generador de combinaciones sin aritmética . El siguiente procedimiento comb2 asume la lista con N variables libres como su segundo argumento y se une estas variables. Por lo tanto, utilizan ? -comb2 ( [ 1,2,3,4 ] , [X , Y] ) para generar combinaciones con dos elementos.
Codigo:

comb2(_,[]).
comb2([X|T],[X|Comb]):-comb2(T,Comb).
comb2([_|T],[X|Comb]):-comb2(T,[X|Comb]).

Combinaciones con Repetición

Este tipo de combinación puede contener un elemento más veces. Por lo tanto , no es un conjunto, es un multi-conjunto.

Codigo:

comb_rep(0,_,[]).
comb_rep(N,[X|T],[X|RComb]):-N>0,N1 is N-1,comb_rep(N1,[X|T],RComb).
comb_rep(N,[_|T],RComb):-N>0,comb_rep(N,T,RComb).

Variaciones

La variación es un subconjunto dado con número de elementos. El orden de los elementos en la variación es significativa.

Codigo:

varia(0,_,[]).
varia(N,L,[H|Varia]):-N>0,N1 is N-1,delete(H,L,Rest),varia(N1,Rest,Varia).

Variaciones con repetición

Una vez más, este tipo de variación puede contener elementos repetidos .
Codigo:

varia_rep(0,_,[]).
varia_rep(N,L,[H|RVaria]):-N>0,N1 is N-1,delete(H,L,_),varia_rep(N1,L,RVaria).