l([a,b,c]).

%member(X,L)
member(X,[X|_]).
member(X,[_|R]):-
	member(X,R).

%conc(L1,L2,L3).
conc([],L2,L2).
conc([H|T],L2,[H|L3]):-
	conc(T,L2,L3).

%insert(X,L,L1)
insert(X,L,L1):-
	conc([X],L,L1).
insert(X,[H|LL],[H|L2]):-
	insert(X,LL,L2).

%ne dela
%insert(X,[LL|LD],L1):-
%	insert(X,LD,TEMP),
%	conc(LL,TEMP,L1).

%delete(X,L,L1)
delete(X,[X|T],T).
delete(X,[H|T],[H|T1]):-
	delete(X,T,T1).

%insert optimalna
insert(X,List,BiggerList):-
	delete(X,BiggerList,List).

reverse([],[]).
reverse([H|T],R):-
	reverse(T,RT),
	conc(RT,[H],R).

palindrome(L):-
	reverse(L,L).

%permute(L,PL)
permute([],[]).

permute([H|L],L2):-
	permute(L,L3),
	insert([H],L3,L2).

%len(L,N)
len([],0).

len([H|L],N):-
	len(L,N0),
	N is N0+1.

%sum(L,S)
sum([H],H).

sum([H|L],S):-
	sum(L,S0),
	S is S0+H.

%min(L,Min)
min([E],Min):-
	Min is E.

min([H|L],Min):-
	min(L,Min0),
	(Min0<H,!,Min is Min0;
	Min is H).

%max(L,Max)
max([E],Max):-
	Max is E.

max([H|L],Max):-
	max(L,Max0),
	(Max0>H,!,Max is Max0;
	Max is H).

%is_sorted(L)
is_sorted([E]).

is_sorted([H|[L|LL]]):-
	is_sorted([L|LL]),
	H<L.

%ekvivalentno
%is_sorted([H,HH|L]):-
%	is_sorted([HH|L]),
%	H<HH.

%slowsort(L,SL)
slowsort(L,SL):-
	permute(L,SL),is_sorted(SL).

%insertsort(L,SL)
insertsort([],[]).

insertsort(L,SL):-
	min(L,Min),
	delete(Min,L,Krajsi),
	insertsort(Krajsi,SortiranKrajsi),
	conc([Min],SortiranKrajsi,SL).
	