Flatten a list in Prolog

Я работаю с Prolog всего пару дней. Я понимаю некоторые вещи, но это действительно сбивает меня с толку.

Я должен написать функцию, которая принимает список и сглаживает его.

?- flatten([a,[b,c],[[d],[],[e]]],Xs).  
Xs = [a,b,c,d,e].                           % expected result

Функция удаляет внутренние структуры списка.

Вот что у меня есть на данный момент:

flatten2([],[]).
flatten2([Atom|ListTail],[Atom|RetList]) :-
      atom(Atom), flatten2(ListTail,RetList).
flatten2([List|ListTail],RetList) :-
      flatten2(List,RetList).

Теперь, это работает, когда я вызываю:

?- flatten2([a,[b,c],[[d],[],[e]]], R).
R = [a,b,c,d,e].                         % works as expected!

Но когда я вызываю, чтобы проверить, является ли список, который я ввожу, уже сплющенным, возвращается false вместо true:

?- flatten2([a,[b,c],[[d],[],[e]]], [a,b,c,d,e]).
false.                                   % BAD result!

Почему это работает с одной стороны, но не с другой? Мне кажется, что я упускаю что-то очень простое.

24
задан mat 17 January 2017 в 16:22
поделиться