:-use_module(library(lists)).


%----------------------------------------------------------------------------------
% A compare rendezést definiál a termek felett.
% Ezt demonstrálja rendey/2, mely egy lista elemeit rendezi sorba.
rendez([],[]).
rendez([X|XL],ZL):- rendez(XL,YL), beszur(X,YL,ZL).

beszur(X,[],[X]).
beszur(X,[Y|YL],ZL):- compare(Rel,X,Y), beszur(Rel,X,Y,YL,ZL).

beszur(<,X,Y,YL,[X,Y|YL]).
beszur(=,X,_,YL,[X|YL]).
beszur(>,X,Y,YL,[Y|ZL]):- beszur(X,YL,ZL).

% ?- rendez([48,hopihe,67*91,f(i)],L).


%----------------------------------------------------------------------------------
% Az atom_codes stringkonstanst konvertál karakterkódok listájára és viszont.
palindrom(Szo) :- atom_codes(Szo,L1), reverse(L1,L1).

% Hogyan értelmezhető
% ?- write(0'a).
% outputja?


%----------------------------------------------------------------------------------
% toupper/2 az első paraméterében kapott stringben írja át a kisbetűket naggyá.
toupper(Szo1,Szo2):- atom_codes(Szo1,L1), toupper_list(L1,L2), atom_codes(Szo2,L2).
toupper_list([],[]).
toupper_list([E1|L1],[E2|L2]):- (E1 =< 0'z, E1 >= 0'a -> E2 is E1-(0'a-0'A); E2=E1),
toupper_list(L1,L2).

% A ( ... -> ... ; ... ) segítségével if-then-else szabály valósítható meg.

% ?- toupper('HaLIho! Mi, a helyzet?',L).

% Modositas: toupper/1 - kiiratassal (put_code/1 használatával)


%----------------------------------------------------------------------------------
% valtozok/2 egy kifejezésből gyűjti ki a változók neveit.
valtozok(Kif,L):- valtozok(Kif,[],L).
valtozok(Kif,Valt0,Valt):- atom(Kif), bovit(Kif,Valt0,Valt).
valtozok(Kif,Valt0,Valt0):- number(Kif).
valtozok(Kif,Valt0,Valt):- Kif =.. [_,A,B], valtozok(A,Valt0,Valt1),
valtozok(B,Valt1,Valt).

% ?- valtozok(x-58*(11-x)+4-(y+32)-f(x,z),[],L).
% mi a problema ezzel a kerdessel:
% ?- valtozok(x-58*(11-x)+4-(y+32)-f(3),[],L).
% Feladat: modositsd a valtozok/3 szabalyait ugy, hogy az elobbi kerdesre
% is valaszolni tudjon.



szamol(S):- atom_codes(S,L), egyszer(L,L1),
(member(K,L1), leszamol(L,K,KN), put_code(K), write('-bol '),
write(KN), write(' db'), nl, fail;
nl).

leszamol([],_,0).
leszamol([K|L],K,N):- !, leszamol(L,K,KN), N is KN+1.
leszamol([_|L],K,N):- leszamol(L,K,N).





% Linkek:
% atom_codes + tsai
% compare, @<,@=<, ...


%---------------------- segedeljarasok ---------------------





bovit(E,[],[E]).
bovit(E,[E|L],[E|L]):- !.
bovit(E,[A|L1],[A|L]):- bovit(E,L1,L).

egyszer([],[]).
egyszer([X|L], E):- member(X,L), !, egyszer(L,E).
egyszer([X|L], [X|E]):- egyszer(L,E).