Listy w prologu

0

Witam, mam do napisania takie zadanie:

Napisz kilka następujących predykatów, które operują na listach w Prologu:

czy_lista(Obiekt) — prawdziwy, jeśli Obiekt jest listą;
splaszcz(Lista, ListaSplaszczona) — spłaszcza listę (potocznie: usuwa z niej wszystkie wewnętrzne nawiasy kwadratowe)
(wskazówka: można użyć poprzedniego predykatu);
zakres(Pocz, Kon, Krok, Lista). — generuje Listę liczb z podanego zakresu, z podanym krokiem;
prefiks(Lista, Prefiks) — generuje prefiksy danej Listy;
sufiks(Lista, Sufiks) — generuje sufiksy danej Listy;
podlista(Lista, Podlista) — generuje podlisty (bez dziur) danej Listy
(wskazówka: można użyć jednego z dwóch poprzednich predykatów — lub obu);
unikalne(Lista, NowaLista) — generuje NowąListę złożoną z tych samych elementów, co Lista, ale bez powtórzeń;
zliczWyst(Lista, Histogram) — generuje Histogram będący listą list postaci [atom, liczebność], dla każdego atomu w Liście (patrz też przykład na dole)
(wskazówka: można użyć poprzedniego predykatu oraz innych pomocniczych).

Poradziłem sobie ze wszystkim predykatami oprócz zliczWyst(Lista,Histogram). Tak ma wyglądać wywołanie i wynik :

?- zliczWyst([a, b, c, a, d, b, e, f, a, g], L).

L = [[c, 1], [d, 1], [b, 2], [e, 1], [f, 1], [a, 3], [g, 1]] .

Jak się do tego zabrać używając predykatu unikalne?

0

Powinno działać, jeśli Ci bardzo zależy to możesz tam gdzieś upchnąć predykat unikalne...:

remove(_, [], [], 0).
remove(X, [X|Xs], R, T1) :- remove(X, Xs, R, T), T1 is T + 1, !.
remove(X, [Y|Xs], [Y|R], T) :- remove(X, Xs, R, T).

hist([], []).
hist([X|Xs], [[X, Ct]|Hs]) :-
    remove(X, [X|Xs], Ys, Ct),
    hist(Ys, Hs).
0

Wielkie dzięki. Działa tak jak powinno.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0