


% Sz       = szerzo
% K es SzL = a katalogus elso konyvenek cime illetve
%            szerzoinek listaja
% KKat1    = az elso konyvtol kulonbozo tobbi konyv
%            katalogusa
konyvei_e(Sz, [K-SzL | KKat1 ], KL) :-
  ( member(Sz, SzL) -> KL = [K | KL1]
  ; KL = KL1 ),
  % KL1 a KKat1 katalogusbeli olyan konyvek, amelynek
  % szerzoje Sz
  konyvei_e(Sz, KKat1, KL1).
  
konyvei_e(_, [], []).

konyvei_h(Sz, KKat, KL) :-
  konyvei_seged(Sz, KKat, [], KL).

% KL egyenlo a KL1 konyvlista es 
% az Sz szerzo konyveinek a [K-SzL | KKat1 ]
% katalogusbeli listajank az osszefuzottjevel. 
konyvei_seged(Sz, [K-SzL | KKat1 ], KL1, KL) :-
  ( member(Sz, SzL) -> KL2 = [K | KL1]
  ; KL2 = KL1 ),
  % KL1 a KKat1 katalogusbeli olyan konyvek, amelynek
  % szerzoje Sz
  konyvei_seged(Sz, KKat1, KL2, KL).
  
konyvei_seged(_, [], KL1, KL1).

% Visszaadja egy szerzo konyveit olyan modon, hogy
% egyszerre csak egy konyvet ad vissza, de az eljaras
% tobbfelekeppen sikerulhet
szerzo_konyve(Sz, [K-SzL | _ ], K) :-
  member(Sz, SzL).
szerzo_konyve(Sz, [_-_ | KKat1 ], K) :-
  szerzo_konyve(Sz, KKat1, K).

konyvei_f(Sz, KKat, KL) :-
  findall(K,szerzo_konyve(Sz,KKat,K),KL).

szerzok_seged( Sz, [_-SzL | _ ]) :-
  member(Sz,SzL).
szerzok_seged( Sz, [_ | KKat1 ]) :-
  szerzok_seged( Sz, KKat1 ).

szerzok( KKat, SzL ) :-
  setof( Sz  , szerzok_seged(Sz, KKat), SzL ). 

kk_szk( KKat, SzKat ) :- 
  szerzok( KKat, SzL ), 
  kk_szk_seged( SzL , KKat, SzKat ).

kk_szk_seged( [ Sz | SzL1 ], KKat, [ Sz-KL | SzKat1 ] ) :-
  konyvei_e(Sz, KKat, KL), 
  kk_szk_seged(SzL1, KKat, SzKat1). 
kk_szk_seged( [], _, [] ).   

mern( K , N ) :- 
  integer(K), K > N. 
mern( K , _ ) :- 
  \+ compound(K), \+ integer(K).
mern( K , N ) :- 
  compound( K ), 
  K =.. Lista,
  Lista = [_|Lista1],
  mern_seged(Lista1, N).

mern_seged( [ K | KL ], N ) :-
  mern(K, N), mern_seged(KL, N).
mern_seged( [], _ ).

reszatom( K, K ) :-
  atom(K).

reszatom( K, A ) :-
  compound(K),
  K =.. Lista,
  Lista = [_|Lista1],
  reszatom_seged(Lista1, A).

reszatom_seged( [K | _], A) :-
  reszatom(K,A).
reszatom_seged( [_ | KifL], A) :-
  reszatom_seged(KifL,A).


osszege( K , K ) :- 
  integer(K). 
osszege( K , 0 ) :- 
  \+ compound(K), \+ integer(K).
osszege( K , N ) :- 
  compound( K ), 
  K =.. Lista,
  Lista = [_|Lista1],
  osszege_seged(Lista1, N).

osszege_seged( [ K | KL ], N ) :-
  osszege(K, N1), osszege_seged(KL, N2), N is N1 + N2.
osszege_seged( [], 0 ).



novelt( K , K1 ) :- 
  integer(K), K1 is K+1. 
novelt( K , K ) :- 
  \+ compound(K), \+ integer(K).
novelt( K , K1 ) :- 
  compound( K ), 
  K =.. Lista,
  Lista = [Nev|Lista1],
  novelt_seged(Lista1, Lista1Novelt),
  K1 =.. [Nev|Lista1Novelt].

novelt_seged( [ K | KL ], [K1 | KL1] ) :-
  novelt(K, K1), novelt_seged(KL, KL1).
novelt_seged( [], [] ).