takeout(Item, [Item | L], L). takeout(Item, [X | L], [X | L1]) :- takeout(Item, L, L1). perm([], []). perm([X | Y], Z) :- perm(Y, W), takeout(X, Z, W).