!TITLE Simple List Processing
!KEY
The  goal  concatenate(L1,L2,L3) is true if list L3 consists of the elements of
list L1 concatenated with the elements of list L2. The goal member(X,L) is true
if X is one of the elements of list L.  The goal reverse(L1,L2) is true if list
L2 consists of the elements of list L1 in reverse order.

    | concatenate([X|L1],L2,[X|L3]) :- concatenate(L1,L2,L3).
    | concatenate([],L,L).
    |
    | member(X,[X|L]).
    | member(X,[_|L]) :- member(X,L).
    |
    | reverse(L,L1) :- reverse_concatenate(L,[],L1).
    |
    | reverse_concatenate([X|L1],L2,L3) :-
    |    reverse_concatenate(L1,[X|L2],L3).
    | reverse_concatenate([],L,L).

