Skip to content

List processing

Classic list predicates and common patterns.

Member and append

% Is X a member of a list?
member(X, [X|_]).
member(X, [_|T]) :- member(X, T).

% Append two lists to make a third
append([], Ys, Ys).
append([X|Xs], Ys, [X|Zs]) :- append(Xs, Ys, Zs).
?- member(2, [1,2,3]).
true ; false.

?- append([1,2], [3,4], Z).
Z = [1,2,3,4].

Reverse

Naive reverse builds with append/3 and is O(n^2):

rev([], []).
rev([X|Xs], Ys) :- rev(Xs, Rs), append(Rs, [X], Ys).

Tail‑recursive reverse with an accumulator is O(n):

rev_acc(Xs, Ys) :- rev_acc_(Xs, [], Ys).

rev_acc_([], Acc, Acc).
rev_acc_([X|Xs], Acc, Ys) :- rev_acc_(Xs, [X|Acc], Ys).
?- rev([1,2,3], R).
R = [3,2,1].

?- rev_acc([1,2,3], R).
R = [3,2,1].

Length and sum

len([], 0).
len([_|T], N) :- len(T, N1), N is N1 + 1.

sum([], 0).
sum([X|Xs], S) :- sum(Xs, T), S is T + X.
?- len([a,b,c], N).
N = 3.

?- sum([1,2,3,4], S).
S = 10.