% Feladat: adott alaphalmazból képzett összes olyan M hosszú sorozat kiiratása,
% melyben pontosan K különböző elem szerepel.

:- use_module(library(lists)).

alaphalmaz([0,1,2,3]).

len([],0).
len([_|L],N):- len(L,N1), N is N1+1.


% Elso reszfeladat: egy listabol kinyerni a lista _kulonbozo_ elemeit.
% Erre egy nem minden szempontbol megfelelo megoldas a kovetkezo lenne:
%
% unique([],[]).
% unique([E|L],[E|H]):- \+member(E,L), unique(L,H).
% unique([E|L],H):- member(E,L), unique(L,H).
%
% Mi a hibája ennek a módszernek? (Segitseg: member(1,[1,1]) hany megoldast talal?)
% Helyette inkabb a kovetkezo megoldast valasztjuk:

egyszer([],H,H).
egyszer([E|L],Be,Ki):- \+member(E,Be), egyszer(L,[E|Be],Ki).
egyszer([E|L],Be,Ki):- member(E,Be), egyszer(L,Be,Ki).
egyszer(L,H):- egyszer(L,[],H).


% Egy masik modszer a unique hibajanak kikuszobolesere az, ha a member
% fuggveny helyett annak egy modositott valtozatat alkalmazzuk:
%
% eleme(E,[E|_]).
% eleme(E,[F|L]):- E \== F, eleme(E,L).
%
% ritkit([],[]).
% ritkit([E|L],[E|H]):- \+eleme(E,L), ritkit(L,H).
% ritkit([E|L],H):- eleme(E,L), ritkit(L,H).


sorozat(Meret,Kulonb):- alaphalmaz(Halm),
sorozat(Halm,Meret,Sor),
egyszer(Sor,Elemek),
len(Elemek, Kulonb),
print(Sor),
nl,
fail.
sorozat(_,_).



sorozat(_,0,[]).
sorozat(L,Meret,[E|RL]):- Meret>0, member(E,L), UjMeret is Meret-1,
sorozat(L,UjMeret,RL).
% sorozat/3 az első paraméterében kapott lista elemeibol állít elő egy,
% a második paraméterében megadott méretű sorozatot.