%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% PRELUCRARI DE LISTE, MULTIMI, LISTE DE LISTE
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Prof.Dr. Luminita STATE, 2009
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Prolog, TP 2.0
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DOMAINS
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
lista=integer*
fcv=f(integer,integer)
listaf=fcv*
llista=lista*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
PREDICATES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
lungime(integer,lista)
/* calculeaza lungimea listei */
suma(integer,lista)
/* calculeaza suma elementelor listei */
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) /* calculeaza reuniunea a doua multimi reprezentate ca liste */
complementara(lista,lista,lista) /* calculeaza si returneaza in al treilea argument complementara celei de a doua liste in raport cu prima */
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CLAUSES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
/* calculeaza lungimea listei */
lungime (0,[]):-!.
lungime(N,[_|T]):- lungime (M,T), N=M+1.
/* calculeaza suma elementelor listei */
suma(X,[X]).
suma(N,[H|T]):-suma(M,T),N=M+H.
/* verifica daca un element apartine unei liste */
apartine (X,[X|_]).
apartine (X,[_|T]):-apartine(X,T).
/*concateneaza doua liste */
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 element al listei prim argument */
elimina_ultimul([_],[]):-!.
elimina_ultimul([H|T],[H|R]):-elimina_ultimul(T,R).
/* elimina un element dintr-o lista*/
elimina(_,[],[]).
elimina(X,[X|T],R):-elimina(X,T,R),!.
elimina(X,[H|T],[H|R]):-X<>H,elimina(X,T,R).
/*elimina duplicatele elementelor dintr-o lista*/
elimina_duplicate([],[]).
elimina_duplicate([H|T],[H|R]):-elimina(H,T,S), elimina_duplicate(S,R).
/* calculeaza frecventa primului argument in lista*/
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).
/* calculeaza frecventele componentelor unei liste */
frecvente([],[]).
frecvente([H|T],[f(H,NH)|R]):- frecv_element(H,T,NH), elimina(H,T,S), frecvente (S,R).
/* calculeaza reversul unei liste (i,o) */
revers([],[]).
revers([H|T],R):-revers(T,S), adauga(S,H,R).
/* adauga un element ca ultim argument intr-o lista */
adauga([],X,[X]).
adauga([H|T],X,[H|S]):- adauga(T,X,S).
/* calculeaza produsul scalar a doi vectori reprezentati prin liste */
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 */
/*************************************/
/* calculeaza intersectia a doua multimi reprezentate ca liste */
intersectie ([],_,[]):-!.
intersectie([H|T],L,[H|S]):- apartine (H,L), intersectie(T,L,S),!.
intersectie([_|T],L,S):-intersectie(T,L,S).
/* calculeaza reuniunea a doua multimi reprezentate ca liste */
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).
/* calculeaza si returneaza in al treilea argument complementara celei de a doua liste in raport cu prima */
complementara ([],_,[]).
complementara ([H|T],L, S):-apartine (H,L),complementara(T,L,S),!.
complementara ([H|T],L,[H|S]):-complementara(T,L,S).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%