Список элементов, встречающихся ровно один раз

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

Главная Форумы Программирование Помощь с решением задач на Prolog Задачи на списки Список элементов, встречающихся ровно один раз

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

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

    Мы уже решали задачу, в которой нужно было выделить элементы, встречающиеся более одного раза, казалось бы, чтобы

    Получить список элементов, которые встречаются в исходном списке ровно один раз,

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

    domains 
    	list = integer*
    predicates
      	no_repeated_elements(list, list)
      	no_repeated_elements(list, list, list)
    clauses
    	no_repeated_elements(List, NoRepeated):-
    		no_repeated_elements(List, [], NoRepeated).
    		
    	no_repeated_elements([], _Used, []):-!.
    	no_repeated_elements([Head|Tail], Used, [Head|NoRepeatedTail]):-
    		NOT(member(Head, Tail)),
    		NOT(member(Head, Used)), !,
    		no_repeated_elements(Tail, [Head|Used], NoRepeatedTail).
    	no_repeated_elements([Head|Tail], Used, NoRepeated):-
    		no_repeated_elements(Tail, [Head|Used], NoRepeated).
    goal
      	no_repeated_elements([1,2,3,4,5,2,5,6,7,8,6,0,8], X).

    Для поиска (проверки присутствия) элемента в списке используется функция member.

    no_repeated_elements

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

    Независимо от того, повторяется элемент или нет, его значение помещается в буфер.
    Когда будут обработаны все элементы списка — функция вернет пустой список.

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