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

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

Помечено: ,

В этой теме 1 ответ, 2 участника, последнее обновление  Васильев Владимир Сергеевич 3 мес., 1 неделя назад.

  • Автор
    Сообщения
  • #3912

    Zzz
    Участник

    Помогите решить задачу на Prolog:

    Оставить в списке элементы что входят в него дважды.

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

Для ответа в этой теме необходимо авторизоваться.