俺もヘタレなんでアレだがSWI-Prologではこれで動いたよ

flatten(X, Y) :- flatten(X, Y, []).

flatten([], Y, Y).
flatten([X|Rest], Y, Z) :- flatten_element(X, Y, Z1), flatten(Rest, Z1, Z), !.

flatten_element(X, [X|Z], Z) :- var(X), !.
flatten_element(X, [X|Z], Z) :- \+ is_list(X), !.
flatten_element(X, Y, Z) :- flatten(X, Y, Z).