Ответ в теме: Элементы, входящие в список дважды

      Комментарии к записи Ответ в теме: Элементы, входящие в список дважды отключены
#3918

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

  1. встречался ли он раньше (если встречался — то элемент пропускается). Проверить можно предикатом member (если в вашей версии пролога нет встроенного, то можно взять код функции по ссылке);
  2. входит ли он в элементы списка, расположенные справа один раз.

Если оба условия выполняются — элемент добавляется к результату рекурсивной обработки, иначе пропускается:

twice_member([], _Used, []).
twice_member([Head|Tail], Used, TailTwice):-
member(Head, Used), !,
twice_member(Tail, Used, TailTwice).
twice_member([Head|Tail], Used, [Head|TailTwice]):-
count(Tail, Head, 1), !,
twice_member(Tail, [Head|Used], TailTwice).
twice_member([Head|Tail], Used, TailTwice):-
twice_member(Tail, [Head|Used], TailTwice).

Результат тестирования программы на SWI Prolog: