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