По исходному списку создать описание мультимножества в виде двух списков - Prolog
Формулировка задачи:
- DOMAINS
- i=integer
- list = i*
- pair = list*
- PREDICATES
- nondeterm result(i,pair,list)
- nondeterm sort_bubl(list,list)
- nondeterm permute(list,list)
- CLAUSES
- result(C,[],[]).
- result(C,[[_,_|[]]|T],[H,H|T1]):-
- C1=C+1, result(C1,[[H,C1|[]]|T],[H|T1]).
- result(C,[[_,_|[]]|T],[H,H1|T1]):-
- C2=0, result(C2,[[H1,C2|[]]|T],[H1|T1]).
- result(C,[[_,_|[]]|T],T1):-
- result(C,T,T1).
- sort_bubl(L, Ls) :- permute(L, NewL),!,
- sort_bubl(NewL, Ls).
- sort_bubl(L, L).
- permute([X,Y|T], [Y,X|T]) :- X>=Y.
- permute([H|T], [H|Ts]) :- permute(T, Ts).
- goal sort_bubl([1,3,2,4,1,2,4,3,4,5],L),C=1,result(C,L1,L),write(L1).
Решение задачи: «По исходному списку создать описание мультимножества в виде двух списков»
- 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]
- Вход в функцию counter(1, [1, 2, 3, 2, 1, 2, 3], 0)
- Выход из функции counter(1, [1, 2, 3, 2, 1, 2, 3], 1)
- Вход в функцию delall(1, [1, 2, 3, 2, 1, 2, 3], [])
- Выход из функции delall(1, [1, 2, 3, 2, 1, 2, 3], [])
- Вход в функцию task([], [])
- Выход из функции task([], [[1, 1], [2, 2], [3, 3]]) Таким образом, результатом работы программы будет список кортежей: [[1, 1], [2, 2], [3, 3]].
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д