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