Ответ в теме: Преобразовать список в множество — удалить повторы элементов

      Комментарии к записи Ответ в теме: Преобразовать список в множество — удалить повторы элементов отключены
#3201

Другая реализация предиката менее эффективна, т.к. использует не хвостовую рекурсию, но зато немного проще:

list_to_set([], []):-!.
list_to_set([Head|Tail], [Head|TailSet]):-
   NOT(member(Head, Tail)), !,
   list_to_set(Tail, TailSet).
list_to_set([_Head|Tail], TailSet):-
   list_to_set(Tail, TailSet).

Если входной список пуст — то результат — пустой список.
В противном случае список разделяется на первый элемент (Head) и остальные (Tail), а затем:

  • если первый элемент не встречается среди остальных — то Tail обрабатывается рекурсивно и к результату добавляется Head;
  • в противном случае (если первый элемент больше не встречается) функция возвращает результат, полученный при рекурсивном вызове, без изменений