Liste, Matrice, Sortari
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Liste, Matrice, Sortari
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Prof. Dr. Luminita STATE, 2009
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Prolog, TP 2.0
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
/* *********************
* APLICATII LISTE *
* *
*********************/
DOMAINS
lista=integer*
fcv=f(integer,integer)
listaf=fcv*
llista=lista*
predicates
lungime(integer,lista)
suma(integer,lista)
apartine(integer,lista) /* verifica daca un element apartine unei liste */
lipeste(lista,lista,lista) /*concateneaza doua liste */
max_min(integer,integer,lista)/* calculeaza valorile maxima si minima dintr-o lista*/
calc_max(integer,integer,integer)
calc_min(integer,integer,integer)
elimina_ultimul (lista,lista) /* elimina ultimul element al listei prim argument */
elimina(integer,lista,lista) /* elimina element dintr-o lista*/
elimina_duplicate(lista,lista) /*elimina duplicatele elementelor dintr-o lista*/
frecvente(lista,listaf) /* calculeaza frecventele componentelor unei liste */
frecv_element(integer,lista,integer) /* calculeaza frecventa primului argument in lista*/
revers(lista,lista) /* calculeaza reversul unei liste (i,o) */
adauga(lista,integer,lista) /* adauga un element ca ultim argument intr-o lista */
produs_scalar(lista,lista,integer) /* calculeaza produsul scalar a doi vectori reprezentati prin liste */
produs_matrice_vector (llista,lista,lista) /* calculeaza produsul unei matrice reprezentata ca lista
liniilor ei cu un vector */
produs_matrice_matrice(llista,llista,llista) /*calculeaza produsul a doua matrice,
matricea prim argument reprezentata pe linii, matricea al doilea argument reprezentata
pe coloane */
intersectie(lista,lista,lista) /* calculeaza intersectia a doua multimi reprezentate ca liste */
reuniune(lista,lista,lista)
complementara(lista,lista,lista) /* calculeaza complementara listei al doilea argument
in raport cu lista prim argument */
sortare_insertie(lista,lista)
insera(integer,lista,lista)
/* insera primul argument in al doilea argument lista sortata crescator,
calculeaza al treilea argument,lista sortata crescator */
bubble_sort (lista,lista) /* algoritmul de sortare bubble-sort*/
sortata(lista) /* verifica daca lista este sortata crescator */
quick_sort(lista,lista)
/* quick_sort(L,LS)="LS => din sortarea
listei L"*/
separare(lista,integer,lista,lista)
/* separare(L,MC,MR)
separa lista L=[H|T] in lista MR si
MC dupa H*/
concatenare(lista,lista,lista)
inssort(lista,lista)
/*inssort(L,LS) sorteaza lista L in LS*/
inser(integer,lista,lista)
impachetare (lista,integer,llista)
/* "impacheteaza" lista prim argument in liste de lungime al doilea argument */
despachetare(llista,lista)
/* "despacheteaza primul argument lista de liste in cel de al doilea argument */
selecteaza(lista,integer,lista,lista)
/* selecteaza(L,N,R,Rest) compune lista R de N elemente din L,
Rest este lista elementelor ramase din L */
elimina_mic(lista,integer,lista)
/* elimina din lista prim argument componentele mai mici decat al doilea argument*/
citeste_lista_n(integer,lista)
/* citeste_lista_n(N,L): citeste de la tastatura lista L de numere intregi de lungime N */
citeste_lista(lista)
/* citeste_lista (L): citeste de la tastatura lista L de lungime nespecificata */
citeste_lista_liste(integer,llista)
/* citeste_lista_liste(N,L) : citeste de la tastatura lista L de N liste de numere intregi */
scrie_lista(lista)
/* scrie_lista(L) : afiseaza componentele listei de numere intregi L */
scrie_llista (llista)
/* scrie_llista (L) : afiseaza componentele listei de liste de numere intregi L */
clauses
lungime (0,[]):-!.
lungime(N,[_|T]):- lungime (M,T), N=M+1.
suma(X,[X]).
suma(N,[H|T]):-suma(M,T),N=M+H.
apartine (X,[X|_]).
apartine (X,[_|T]):-apartine(X,T).
lipeste([],L,L).
lipeste([H|T],L,[H|R]):-lipeste(T,L,R).
max_min(X,X,[X]).
max_min(Max,Min,[H|T]):- max_min(MaxT,MinT,T),calc_max(MaxT,H,Max), calc_min(MinT,H,Min).
calc_max (X,Y,X):-X>=Y,!.
calc_max (_,Y,Y).
calc_min(X,Y,X):-X<=Y,!.
calc_min(_,X,X).
elimina_ultimul([_],[]):-!.
elimina_ultimul([H|T],[H|R]):-elimina_ultimul(T,R).
elimina(_,[],[]).
elimina(X,[X|T],R):-elimina(X,T,R),!.
elimina(X,[H|T],[H|R]):-elimina(X,T,R).
elimina_duplicate([],[]).
elimina_duplicate([H|T],[H|R]):-elimina(H,T,S), elimina_duplicate(S,R).
frecv_element(_,[],0).
frecv_element(X,[X|T],N):-frecv_element(X,T,M), N=M+1,!.
frecv_element(X,[_|T],N):-frecv_element(X,T,N).
frecvente([],[]).
frecvente([H|T],[f(H,NH)|R]):- frecv_element(H,T,NH), elimina(H,T,S), frecvente (S,R).
revers([],[]).
revers([H|T],R):-revers(T,S), adauga(S,H,R).
adauga([],X,[X]).
adauga([H|T],X,[H|S]):- adauga(T,X,S).
produs_scalar([X],[Y],R):- R=X*Y.
produs_scalar([H1|T1],[H2|T2],R):- produs_scalar(T1,T2,S), R=S+H1*H2.
/*OPERATII CU LISTE DE LISTE */
produs_matrice_vector ([L],V,[R]):-produs_scalar(L,V,R).
produs_matrice_vector([H|T],V,[R|S]):- produs_scalar(H,V,R), produs_matrice_vector(T,V,S).
produs_matrice_matrice (M,[Y],[R]):-produs_matrice_vector(M,Y,R).
produs_matrice_matrice(M,[H|T],[S|M1]):-produs_matrice_vector(M,H,S), produs_matrice_matrice(M,T,M1).
/* OPERATII CU MULTIMI REPREZENTATE CA LISTE */
intersectie ([],_,[]):-!.
intersectie([H|T],L,[H|S]):- apartine (H,L), intersectie2(T,L,S),!.
intersectie([_|T],L,S):-intersectie2(T,L,S).
reuniune([],L,L).
reuniune([H|T],L,[H|S]):-not (apartine (H,L)), reuniune (T,L,S),!.
reuniune([_|T],L,S):- reuniune(T,L,S).
complementara ([],_,[]).
complementara ([H|T],L, S):-apartine (H,L),complementara(T,L,S),!.
complementara ([H|T],L,[H|S]):-complementara(T,L,S).
/*ALGORITMI DE SORTARE */
sortare_insertie ([],[]).
sortare_insertie ([H|T],R):- sortare_insertie(T,S), insera (H,S,R).
insera (X,[],[X]):-!.
insera (X, [H|T],[X,H|T]):- X<=H,!.
insera (X,[H|T],[H|S]):-insera (X,T,S).
bubble_sort(L,L):- sortata (L),!.
bubble_sort([X,Y|T],R):- Y<=X, bubble_sort([Y,X|T],R),!.
bubble_sort([X,Y|T], R):- bubble_sort([Y|T],S), bubble_sort([X|S],R).
sortata([_]):-!.
sortata([X,Y|T]):- X<=Y, sortata ([Y|T]).
separare([],_,[],[]).
separare([H|T],X,[H|MC],MR):-H<=X,
separare(T,X,MC,MR).
separare([H|T],X,MC,[H|MR]):-H>X,
separare(T,X,MC,MR).
concatenare([],L,L).
concatenare([H|T],L,[H|S]):-concatenare(T,L,S).
quick_sort([],[]).
quick_sort([H|T],LS):-separare(T,H,MC,MR),
quick_sort(MC,MCS),
quick_sort(MR,MRS),
concatenare(MCS,[H|MRS],LS).
inser(X,[],[X]).
inser(X,[H|T],[X,H|T]):-X=H,
inser(X,T,R).
inssort([],[]).
inssort([H|T],LS):-inssort(T,TS),
inser(H,TS,LS).
despachetare([],[]).
despachetare([H|T],R):- despachetare(T,S), concatenare(H,S,R).
impachetare([],_,[]).
impachetare([H|T],N,[[H|S]|R]):-M=N-1,
selecteaza(T,M,S,Rest),
impachetare(Rest,N,R).
/*selecteaza([],_,[],[]).*/
selecteaza(L,0,[],L):-!.
selecteaza([H|T],M,[H|S],Rest):-M1=M-1,
selecteaza(T,M1,S,Rest),!.
selecteaza(L,N,L,[]):- lungime(M,L), M