flatten2(X, F) :- flatten2(X, [], F1), reverse(F1, F).
flatten2([], A, A).
flatten2([X|Xs], A, F) :- atomic(X), X \= [], flatten2(Xs, [X|A], F).
flatten2([X|Xs], A, F) :- is_list(X), flatten2(X, A, XF), flatten2(Xs, XF, F).

flatten(X, F) :- fh(X, F, []).
fh([], T, T).
fh([X|Xs], FH, NFH) :- atomic(X), X \= [], FH = [X|FH1], fh(Xs, FH1, NFH).
fh([X|Xs], FH, NFH) :- is_list(X), fh(X, FH, FH1), fh(Xs, FH1, NFH).

