

%preffix([],L1).
%preffix([X|L],[X|L1]):-preffix(L,L1).

append([],X,X).
append([H|T],Y,Z):-append(T,Y,[H|Z]).



member(X,[X|[]]).
member(X,[H|T]):- member(X,T).

reverse([],[]).
reverse([H|T],L):- reverse(T,X), append(X,[H],L).

palindrome([H],[H]).
palindrome(X,Y):- reverse(X,Y).
%?-palindrome([1,2,3,6,1],[1,2,1]).

is_list([]).
is_list([_|_]).

int(1).
int(N):- int(N1), N is N1 + 1.
%?-int(X), write(X).

insert(X,L,1,[X|L]).
insert(X,[H|T],N,L1):- N1 is N-1, insert(X,T,N1,Y), L1 is [H|Y].

%?-insert(2,[1,3,4],2,X), write(X).


range(A,A,[A]).
range(A,B,L):- A1 is A+1, A<B, range(A1,B,X), L is [A|X].

%?-range(1,5,X), write(X).



dublicate([H],[H,H]).
dublicate([H|T],L):- dublicate(T,X), append([H,H],X,L).

%?-dublicate([1,2,3],[1,1,3,3]).


isSorted([H|[]]).
isSorted([H1|[H2|T]]):- H1<H2, isSorted([H2|T]).

even([],[]).
even([X],[X]).
even([H1|[H2|T]],[H1|X]):- even(T,X).

%?-even([1,2,3,4,5],X), write(X).


odd([],[]).
odd([X],[]).
odd([H1|[H2|T]],[H2|X]):- odd(T,X).

%-odd([1,2,3,4],X), write(X).

member(X,[X|T]).
member(X,[H|T]):- member(X,T).

%?-member(1,[3,2,4]).



notmember(X,[]).
notmember(X,[H1|T]):- X<H1,notmember(X,T).
notmember(X,[H1|T]):- X>H1,notmember(X,T).
%?-notmember(1,[2,3,1]).

% [1,2,3,4,3], 3 -> [1,2,4,3]
% [1,2,3,4,3], 3 -> [1,2,4]


del(H,[H|T],T).
del(H,[X|T],L):-del(H,T,Y), L is [X|Y].

%?-del(3,[1,2,3,3,5,3],X), write(X).

set([],[]).
set([H|T],L):- member(H,T), set(T,L).
set([H|T],L):- not(member(H,T)), set(T,X), L is [H|X].


%?-set([1,1,1,2,5,5,5,1,1,1,3],X), write(X).

dellall(H,[H|T],T):-notmember(H,T).
dellall(H,[H|T],L):-dellall(H,T,L).
dellall(H,[X|T],L):-dellall(H,T,Y), L is [X|Y].
%?-dellall(3,[1,2,3,3,5,3],X), write(X).

sum(0,[]).
sum(N,[H|T]):- sum(N1,T), N is N1+H.

%?-sum(X,[1,2]),write(X).

sumeven(0,[]).
sumeven(0,[H1]).
sumeven(H2,[H1,H2]).
sumeven(N,[H1|[H2|T]]):-sumeven(N1,T), N is N1+H2.

%?-sumeven(X,[1,2,3,4]), write(X).


min(X,L):- member(X,L), not(member(H,L), H < X).

%?-min(X,[2,5,4,1,2]), write(X).



subset([], _).
subset(X, L) :- not(( member(A, X), not(member(A,L)) )).
?- subset(X, [1,2,3]), write(X).







