Ответ в теме: Удвоить одиночные символы в строке на Prolog

      Комментарии к записи Ответ в теме: Удвоить одиночные символы в строке на Prolog отключены
#1795

На SWI Prolog это выглядит так:

rm_single([], _Buffer, []):-!.
rm_single([Head|Tail], Buffer, [Head|TailResult]):-
  member(Head, Tail), !, rm_single(Tail, [Head|Buffer], TailResult);
  member(Head, Buffer), !, rm_single(Tail, [Head|Buffer], TailResult).
rm_single([Head|Tail], Buffer, [Head,Head|TailResult]):-
  rm_single(Tail, [Head|Buffer], TailResult).

Ваш код написан на Visual Prolog или на Turbo Prolog, однако, rm_single должен там работать абсолютно также. На вход подается список символов, пустой список и результат. В Вашем примере уже есть правило list_str — сначала вызываете его, а результат подаете на rm_single.

Функция использует буфер для хранения элементов, которые уже были обработаны. Если на вход подан пустой список, то независимо от содержимого буфера результатом будет пустой список. Иначе функция отделяет от исходного списка первый элемент и пытается найти его в хвосте (остальных элементах списка) и в буфере – т.е. проверяет встретится ли такой символ дальше и встречался ли раньше. Если функции удается найти элемент – то ее результат формируется из первого элемента и результата обработки хвоста.
В противном случае первый элемент списка добавляется к результату дважды.