first([X | Ys], X).

rest([X | Ys], Ys).

append([], Xs, Xs).
append([X | Ls], Ys, [X | Zs]) :- append(Ls, Ys, Zs).

reverse([], []).
reverse([X | Xs], Ys) :-
reverse(Xs, Zs), append(Zs, [X], Ys).

member(X, [X | Ls]).
member(X, [Y | Ls]) :- member(X, Ls).

select(X, [X | Xs], Xs).
select(X, [Y | Ys], [Y | Zs]) :- select(X, Ys, Zs).

selects([], Ys).
selects([X | Xs], Ys) :- select(X, Ys, Ys1), selects(Xs, Ys1).


