Skip to content

Flatten a nested list

Turn a nested list into a flat list. This version expects proper, ground lists.

flatten([], []).
flatten([X|Xs], Ys) :-
    flatten(X, Y),
    flatten(Xs, YS),
    append(Y, YS, Ys).
flatten(X, [X]).  % base case for non-list elements

% append/3
append([], Ys, Ys).
append([X|Xs], Ys, [X|Zs]) :- append(Xs, Ys, Zs).
?- flatten([a,[b,[c,d],[]],e], R).
R = [a,b,c,d,e].

Tip: For general use with variables and improper lists, more robust versions perform type checks.