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

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

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

По исходному списку создать описание мультимножества в виде двух списков, первый - элемент множества, второй - их количество в исходном списке. Я написал уже вроде код,но он выдает программную ошибку. Смысл такой у меня был: отсортировать пузырьком, а затем считать элементы одинаковые и забивать в список пар. У кого есть варианты лучше и свои проги, приму.
Листинг программы
  1. DOMAINS
  2. i=integer
  3. list = i*
  4. pair = list*
  5. PREDICATES
  6. nondeterm result(i,pair,list)
  7. nondeterm sort_bubl(list,list)
  8. nondeterm permute(list,list)
  9. CLAUSES
  10. result(C,[],[]).
  11. result(C,[[_,_|[]]|T],[H,H|T1]):-
  12. C1=C+1, result(C1,[[H,C1|[]]|T],[H|T1]).
  13. result(C,[[_,_|[]]|T],[H,H1|T1]):-
  14. C2=0, result(C2,[[H1,C2|[]]|T],[H1|T1]).
  15. result(C,[[_,_|[]]|T],T1):-
  16. result(C,T,T1).
  17. sort_bubl(L, Ls) :- permute(L, NewL),!,
  18. sort_bubl(NewL, Ls).
  19. sort_bubl(L, L).
  20. permute([X,Y|T], [Y,X|T]) :- X>=Y.
  21. permute([H|T], [H|Ts]) :- permute(T, Ts).
  22. goal sort_bubl([1,3,2,4,1,2,4,3,4,5],L),C=1,result(C,L1,L),write(L1).

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

textual
Листинг программы
  1. domains
  2. int=integer
  3. intl=int*
  4. intll=intl*
  5.  
  6. predicates
  7.  
  8. counter(int,intl,int)
  9. delall(int,intl,intl)
  10. task(intl,intll)
  11.  
  12. clauses
  13.  
  14. counter(_,[],0).
  15. counter(X,[X|T],N) :- counter(X,T,N1), N=N1+1.
  16. counter(X,[Y|T],N) :- X<>Y, counter(X,T,N).
  17.  
  18. delall(_,[],[]).
  19. delall(X,[X|T],R) :- delall(X,T,R).
  20. delall(X,[Y|T],[Y|R]) :- X<>Y, delall(X,T,R).
  21.  
  22. task([],[]).
  23. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы