%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 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). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%