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

#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: