-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathesercizio19.pl
58 lines (53 loc) · 1.51 KB
/
esercizio19.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
% ------------------
% ** ESERCIZIO 19 **
% ------------------
% Sia data una lista non ordinata di parole (atomi) che possono essere ripetute. Scrivere un programma
% PROLOG che restituisca una lista contenente ogni parola che compare nella lista con la relativa
% frequenza di comparizione, cominciando da quella con frequenza massima fino a quella con frequenza
% minima. (Si utilizzi il quicksort).
% ?- calcola_frequenza(['ciao','come','stai','tu','bene','tu','come','stai']).
% [2,tu]
% [2,stai]
% [2,come]
% [1,ciao]
% [1,bene]
% X = [[2, tu], [2, stai], [2, come], [1, ciao], [1, bene]].
calcola_frequenza(Lista, ListaOrdinata) :-
frequenza(Lista, ListaConFrequenza),
quicksort(ListaConFrequenza, ListaOrdinata),
print_list(ListaOrdinata), !.
frequenza([], _).
frequenza([T|C], [[N,T]|ListaConFrequenza]) :-
occorrenze(T, [T|C], N),
delete(C, T, NewList),
frequenza(NewList, ListaConFrequenza).
% conta occorrenze nella lista
occorrenze(_,[],0).
occorrenze(Elemento,[Elemento|C], N) :-
occorrenze(Elemento,C,N1),
N is N1 + 1.
occorrenze(Elemento, [T|C], N) :-
Elemento \= T,
occorrenze(Elemento, C, N).
% quicksort
quicksort(L,S):-
qsort(L,[],S),
!.
qsort([],A,A).
qsort([H|T],A,S):-
pivot(H,T,L1,L2),
qsort(L1,A,S1),
qsort(L2,[H|S1],S).
pivot(_,[],[],[]).
pivot(H,[X|T],[X|L],R):-
X@=<H,
pivot(H,T,L,R).
pivot(H,[X|T],L,[X|R]):-
X@>H,
pivot(H,T,L,R).
% stampa lista
print_list([]).
print_list([T|C]) :-
write(T),
nl,
print_list(C).