>>797
汚いってカット?
とりあえず外してみたけどどっちもどっちなんだよね

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) :- not(var(X)), not(is_list(X)).
flatten_element(X, Y, Z) :- not(var(X)), is_list(X), flatten(X, Y, Z).