Name: LISPPER 2012-12-31 8:27
But then this fucker had to post some Prolog code and I was mesmerized. Fuck. FUCK.
singleton(X,[X]).
unordered_merge([],[],[]).
unordered_merge(Xs,[Y|Ys],[Y|Zs]) :- unordered_merge(Xs,Ys,Zs).
unordered_merge([X|Xs],Ys,[X|Zs]) :- unordered_merge(Xs,Ys,Zs).
reduce_pairs(_,[],[]).
reduce_pairs(_,[X],[X]).
reduce_pairs(Op,[X1,X2|Xs],[Z|Zs]) :- call(Op,X1,X2,Z), reduce_pairs(Op,Xs,Zs).
balanced_reduce(_,[X],X).
balanced_reduce(Op,Xs,Z) :- Xs \= [X], reduce_pairs(Op,Xs,Ys), balanced_reduce(Op,Ys,Z).
permutation(Xs,Ys) :- map(singleton,Xs,XSingles), balanced_reduce(unordered_merge,XSingles,Ys).
permutations(Xs,Ys) :- findall(Perm,permutation(Xs,Perm),Ys).