Conversia matrice-vector in Prolog

/***************************************** * Impachetarea si despachetarea listelor * Paul Mateescu, grupa 309-Informatica, an III-ZI, 2009. * Facultatea de Matematica si Informatica, Universitatea Spiru Haret Bucuresti. ****************************************** Problema 1 - Conversia matrice-vector in Prolog Fiind data o lista de liste de numere reale, sa se despacheteze in lista elementelor componente: Exemplu de utilizare: desp([[1, 2, 3], [7, 6, 5], [3, 2, 7]], X) da solutia unica: X = [1, 2, 3, 7, 6, 5, 3, 2, 7] Problema 2 - Conversia vector-matrice in Prolog Fiind data o lista liniara de elemente reale, sa se impacheteze intr-o lista de liste de o anumita lungime: Exemplu de utilizare: imp([1, 2, 3, 4, 5, 6, 7, 8, 9, 0], 3, X) da solutia unica: X = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [0]] ************************/ trail = 4000 domains item = integer iteml = item* itemll = iteml* integerl = integer* predicates imp(iteml, integer, itemll) % Impachetarea unei liste imph(iteml, integer, integer, iteml, itemll) % Predicat ajutator pt impachetarea listei desp(itemll, iteml) % Despachetarea unei liste desph(itemll, iteml, iteml) % Predicat ajutator pt despachetarea listei randomlist(integer, iteml) % Predicat care intoarce o lista de elemente generate aleator clauses /***************************************************************/ % Predicat care genereaza o lista aleatoare de cifre % (i, o) % Notand randomlist(N, LISTA), semnificatia argumentelor este: % N - numarul de elemente de generat % LISTA - lista generata randomlist(N, [H|T]) :- N > 0, N1 = N - 1, random(9, H), !, randomlist(N1,T). randomlist(0, []). /***************************************************************/ % Predicat pentru impachetarea unei liste % (i, i, o) % Notand imp(L, N, LI), semnificatia argumentelor este: % L - lista de impachetat % N - nr de elemente dorit din fiecare sublista a listei rezultat % LI - lista de subliste de lungime N % Impachetarea unei liste vide este o lista vida: imp([], _, []) :- !. % Transmite argumentele predicatului ajutator: imp(L, N, [START|REST]) :- !, imph(L, N, N, START, REST). /***************************************************************/ % Ajutator pentru imp % (iteml, i, i, iteml, iteml) % Notand imph(L, M, N, SUBLISTA, LISTAREZ), semnificatia argumentelor este: % L - lista de intrare % M - contor folosit pt constructia sublistei % N - nr de elemente dorit in fiecare sublista % SUBLISTA - sublista construita la pasul curent % LISTAREZ - lista de subliste dorita % imph([H|T], M, N, [H|REST], REZ) :- M > 0, M1 = M - 1, !, imph(T, M1, N, REST, REZ). % Conditia de oprire pentru constructia intregii liste rezultat: imph([], _, _, [], []) :-!. % Am construit o sublista, continuam cu sublista urmatoare: imph(L, 0, N, [], [NEXT|REST]) :- !, imph(L, N, N, NEXT, REST). /***************************************************************/ % Predicat pentru despachetarea unei liste % (i, o) % Notand desp(LL, REZ), semnificatia argumentelor este: % LL - lista de liste ce se doreste despachetata % REZ - lista rezultat % Transmite argumentele predicatului ajutator: desp(LL, REZ) :- desph(LL, [], REZ). /***************************************************************/ % Predicat ajutator pentru desp % (i, o, o) % Notand desph(LL, SUBLISTA, LREZ), semnificatia argumentelor este: % LL - lista de liste ce se doreste despachetata % SUBLISTA - sublista in curs de despachetare % REZ - lista rezultat % conditia de oprire: %despachetata unei liste vide este lista vida: desph([], [], []). % cat timp in sublista in curs de despachetare mai sunt elemente, % adauga-le la rezultat: desph(TLL, [H|T], [H|REST]) :- desph(TLL, T, REST). % sublista curenta s-a epuizat dar mai sunt subliste, % continua cu urmatoarea sublista: desph([HL|TLL], [], REST) :- desph(TLL, HL, REST).