Transpusa unei matrice in Prolog
/*****************************************
* Transpusa unei matrice in Prolog
* Paul Mateescu, grupa 309-Informatica, an III-ZI, 2009.
* Facultatea de Matematica si Informatica, Universitatea Spiru Haret Bucuresti.
******************************************
Sa se transpuna o matrice data ca lista de linii.
Exemplu de utilizare:
transp([[1, 2, 3], [4, 5, 6]], TR) da solutia unica:
TR = [[1, 4], [2, 5], [3, 6]]
Solutia porneste de la ideea de a parcurge matricea initiala linie cu linie, pentru fiecare linie colectand primul element intr-o lista
ce va fi linie in matricea transpusa, iar restul elementelor liniei intr-o matrice "redusa". Algoritmul se repeta pana cand
matricea redusa va fi alcatuita numai din linii vide (liste vide).
***********************************/
domains
r = real
i = integer
lr = r*
llr = lr*
predicates
transp(llr, llr) % Transpune o matrice
transp(llr, lr, lr, llr, llr, llr) % Predicat ajutator pentru transpunerea matricei
clauses
/*************************************************/
% TRANSPUSA UNEI MATRICE
% Predicat care genereaza transpusa unei matrice data ca lista de linii:
% (i, o)
% Notand transp(M, TRANSP), semnificatia argumentelor este:
% M - matricea initiala
% TRANSP - matricea transpusa a lui M
% Transmite argumentele predicatului ajutator:
transp(M, TRANSP) :-
transp(M, CAPLINIE, CAPLINIE, CAPMATRED, CAPMATRED, TRANSP).
/*************************************************/
% Predicat ajutator pentru transp(llr, llr)
% (i, o, o, o, o, o)
% Notand transp(MATR, CAPLINIE, CRTLINIE, CAPMATRED, CRTMATRED, TRANSP), semnificatia argumentelor este:
% MATR - matricea de transpus la pasul curent
% CAPLINIE - capul listei care va contine linia de elemente transpuse construita la pasul curent
% CRTLINIE - celula curenta a liniei de elemente transpuse construita la pasul curent
% CAPMATRED - capul matricei reduse (obtinuta prin eliminarea primei coloane) la pasul curent
% CRTMATRED - celula curenta a matricei reduse
% TRANSP - matricea transpusa
% Prelucreaza linia curenta din matricea de transpus, construieste linia curenta a matricei reduse si reia:
transp([[H|T]|TM], CAPLINIE, [H|TLINIE], CAPMATRED, [T|RESTMATRED], TRANSP) :-
!,
transp(TM, CAPLINIE, TLINIE, CAPMATRED, RESTMATRED, TRANSP).
% S-a ajuns la sfarsitul agoritmului, matricea curenta e vida si cea redusa este de asemenea vida:
transp([], CAPLINIE, [], [[]|_], _, [CAPLINIE]) :-!.
% S-a ajuns la sfarsitul matricei curente, dar exista elemente in matricea redusa, deci reluam algoritmul:
transp([], CAPLINIE, [], CAPMATRED, [], [CAPLINIE|RESTTRANSP]) :-
!,
transp(CAPMATRED, CAPURMLINIE, CAPURMLINIE, CAPURMMATRED, CAPURMMATRED, RESTTRANSP).