%sublist(S,L)
sublist(S,L):-append(C,B,L),append(A,S,C).

prefix(P,L):-append(P,B,L).

reverse([],[]).
reverse(R,[X|L]):-reverse(C,L),append(C,[X],R).

%vtori variant za reverse
rev([],S,S).
rev([H|T],S,R):-rev(T,[H|S],R).
rev(R,L):-rev(L,[],R).

%split(X,L,A,B). Vsi4ki elementi v A sa <=X, a v B sa >X, a L e obedinenieto na A i B
split(X,[],[],[]).
split(X,[H|T],[H|A],B):-X>H,split(X,T,A,B).
split(X,[H|T],A,[H|B]):-X=<H,split(X,T,A,B).

qsort([],[]).
qsort(S,[H|T]):-split(H,T,A,B),qsort(SA,A),qsort(SB,B),append(SA,[H|SB],S).

min(X,[L]):-X=<L.
min(X,[H|L]):-X=<H,min(X,L).

%selection sort
ssort([],[]).
ssort([M|S],L):-min(M,L),remove(M,L,L1),ssort(S,L1).

%pribavqne na element kym dyrvo
add(X,[],[[],X,[]]).
add(X,[L,T,R],[C,T,R]):-X=<T,add(X,L,C).
add(X,[L,T,R],[L,T,C]):-X>T,add(X,R,C).

%pravene na dyrvo ot spisyk
mt([],[]).
mt([H|T],D):-mt(T,D1),add(H,D1,D).

%ltr(D,S) - obhojdane na dyrvo lqvo - koren -dqsno
ltr([],[]).
ltr([L,T,R],S):-ltr(L,LS),ltr(R,RS),append(LS,[T|RS],S).

%sortirovka 4rez dyrvo
tsort(S,L):-mt(L,T),ltr(T,S).

spec([]).
spec([H|T]):-pred(H),spec(T).
%spec(L):-not(member(X,L),not(pred(X))).

filter([],[]).
filter([H|F],[H|T]):-pred(H),filter(F,T).
filter(F,[H|T]):-not(pred(H)),filter(F,T).

%Bubblesort za doma6no