Ответ в теме: Список элементов, встречающихся более одного раза

      Комментарии к записи Ответ в теме: Список элементов, встречающихся более одного раза отключены
#2496

Функция, выполняющая поставленную задачу должна принимать на вход два списка — исходный и результирующий. Однако, в задаче удобно использовать метод накапливающего параметра, т.е. до наступления определенных условий накапливать результат в дополнительном аргументе функции, а затем — переписать этот буфер в результирующий список. Для этого функции необходимо использовать дополнительный аргумент, изначально инициализированный пустым списком:

repeated_set(List, Result):-
  repeated_set(List, [], Result).

Функция, использующая накапливающий параметр должна:

  • возвращать накопленный результат если исходный список пуст;
  • добавлять первый элемент к накопителю во время рекурсивного вызова если он отсутствует в хвосте списка (не повторяется в остальной части списка) и отсутствует в накопителе (не был ранее обработан как повторяющийся);
  • пропустить первый элемент, а остальные обработать рекурсивно если ни одной другое условие не выполнилось (элемент не является повторяющимся).

Поиск первого элемента списка среди списка накапливающего параметра в этом случае выполняется для того, чтобы элементы в результирующем списке не дублировалось (такое было бы возможно при нескольких повторах одного и того же элемента в исходном списке). Для поиска элемента в списке может использоваться функция member.

repeated_set([], BufferResult, BufferResult):-!.
repeated_set([Head|Tail], BufferResult, Result):-
  member(Head, Tail),
  NOT(member(Head, BufferResult)), !,
  repeated_set(Tail, [Head|BufferResult], Result).
repeated_set([_Head|Tail], BufferResult, Result):-
  repeated_set(Tail, BufferResult, Result).

Вложения: