
% describe a list of lists using dcgs
list([]) --> [].
list([L|Lists]) --> [L], list(Lists).

% use that to form concatenated lists
concat([]) --> [].
concat([L|Lists]) --> list(L), concat(Lists).

% make a prolog concatenate goal
concatenate(LoL, Result) :- phrase(concat(LoL), Result, []).

% ------------ testing -----------------------------

t1 :- LoL = [[1,2],[3],[4,5,6]],
      concatenate(LoL, Result),
      format("LoL: ~w~nRes: ~w~n", [LoL,Result]).

t2 :- LoL = [[1,2],[3],[4,5,6]],
      Result = [1,2,3,4,5,6],
      concatenate(LoL, Result),
      format("LoL: ~w~nRes: ~w~n", [LoL,Result]).

t3 :- LoL = [[1,2],X,[4,5,6]],
      Result = [Y,2,3,4,5,6],
      concatenate(LoL, Result),
      format("LoL: ~w~nRes: ~w~nX,Y:   ~w,~w~n", [LoL,Result,X,Y]).

% ------------ sample runs -------------------------
% ?- t1.
% LoL: [[1,2],[3],[4,5,6]]
% Res: [1,2,3,4,5,6]
% true.
%
% ?- t2.
% LoL: [[1,2],[3],[4,5,6]]
% Res: [1,2,3,4,5,6]
% true.
%
% ?- t3.
% LoL: [[1,2],[3],[4,5,6]]
% Res: [1,2,3,4,5,6]
% X,Y:   [3],1
% true

