%Consecutive quadruple's with the same product. removeUniques([[X,Y,S,P],[X1,Y1,S1,P]|R], L, O):- removeUniques(R, [[X,Y,S,P],[X1,Y1,S1,P]|L], O). %Compare quadruple product with head of new output list, to double check for uniques. removeUniques([[X,Y,S,P]|R], [[X1,Y1,S1,P]|L], O):- removeUniques(R, [[X,Y,S,P],[X1,Y1,S1,P]|L], O). %Unique, skip. removeUniques([[X,Y,S,P],[X1,Y1,S1,P1]|R], L, O):- removeUniques([[X1,Y1,S1,P1]|R], L, O). %One element left. removeUniques([[X,Y,S,P]|R], L, O) :- removeUniques(R, L, O). %Base case removeUniques([], L, L). %Consecutive quadruple's with the same product. sortUniques([[X,Y,S,P],[X1,Y1,S1,P]|R], L, O, L2, A):- sortUniques(R, [[X,Y,S,P],[X1,Y1,S1,P]|L], O, L2 ,A). %Compare quadruple product with head of new output list, to double check for uniques. sortUniques([[X,Y,S,P]|R], [[X1,Y1,S1,P]|L], O, L2, A):- sortUniques(R, [[X,Y,S,P],[X1,Y1,S1,P]|L], O, L2, A). %Unique, skip. sortUniques([[X,Y,S,P],[X1,Y1,S1,P1]|R], L, O, L2, A):- sortUniques([[X1,Y1,S1,P1]|R], L, O, [[X,Y,S,P]|L2], A). %One element left. sortUniques([[X,Y,S,P]|R], L, O, L2, A) :- sortUniques(R, L, O, [[X,Y,S,P]|L2], A). %Base case sortUniques([], L, L, A, A).