По исходному списку создать описание мультимножества в виде двух списков - Prolog

Узнай цену своей работы

Формулировка задачи:

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

Решение задачи: «По исходному списку создать описание мультимножества в виде двух списков»

textual
Листинг программы
domains
int=integer
intl=int*
intll=intl*
 
predicates
 
counter(int,intl,int)
delall(int,intl,intl)
task(intl,intll)
 
clauses
 
counter(_,[],0).
counter(X,[X|T],N) :- counter(X,T,N1), N=N1+1.
counter(X,[Y|T],N) :- X<>Y, counter(X,T,N).
 
delall(_,[],[]).
delall(X,[X|T],R) :- delall(X,T,R).
delall(X,[Y|T],[Y|R]) :- X<>Y, delall(X,T,R).
 
task([],[]).
task([X|T],[[X,N]|R]) :- counter(X,T,N1), N=N1+1, delall(X,T,TT), task(TT,R).

Объяснение кода листинга программы

В коде, представленном в вопросе, реализован алгоритм подсчета количества уникальных элементов в списке и последующего удаления всех повторяющихся элементов. Список разделен на два: исходный список и список подсчета количества каждого элемента. В начале работы программы, список подсчета количества пуст. Для каждого элемента исходного списка выполняется проверка: если элемент уже присутствует в списке подсчета количества (то есть его количество больше 1), то он пропускается, а если нет - добавляется в список подсчета количества с инкрементом счетчика. В конце работы программы, список подсчета количества преобразуется в список кортежей, где каждый кортеж содержит уникальный элемент исходного списка и его количество. Пример работы кода: Исходный список: [1, 2, 3, 2, 1, 2, 3]

  1. Вход в функцию counter(1, [1, 2, 3, 2, 1, 2, 3], 0)
  2. Выход из функции counter(1, [1, 2, 3, 2, 1, 2, 3], 1)
  3. Вход в функцию delall(1, [1, 2, 3, 2, 1, 2, 3], [])
  4. Выход из функции delall(1, [1, 2, 3, 2, 1, 2, 3], [])
  5. Вход в функцию task([], [])
  6. Выход из функции task([], [[1, 1], [2, 2], [3, 3]]) Таким образом, результатом работы программы будет список кортежей: [[1, 1], [2, 2], [3, 3]].

Оцени полезность:

12   голосов , оценка 4.083 из 5
Похожие ответы