
len([], 0).

len([_X | L], K2) :- len(L, K1), K2 is K1 + 1.

% rev(L, K) gdy K to odwrócenie danej listy L

rev([], []).
rev([X | L], R) :- rev(L, K), append(K, [X], R).

% rev(L, A, W) gdy W to dopisanie na poczatku A odwrocenia L
% W = L^R * A

rev2(L, W) :- rev2(L, [], W).

rev2([], A, A).

rev2([X | L], A, W) :- rev2(L, [X | A], W).


sum([], 0).

sum([X | L], W) :- sum(L, K), W is X + K.


sumA(L, W) :- sumA(L, 0, W).

sumA([], A, A).
sumA([X | L], A, W) :- A1 is X + A, sumA(L, A1, W).


min([X | L], M) :- min(L, X, M).

min([], A, A).
min([X | L], A, W) :- X >= A, min(L, A, W).
min([X | L], A, W) :- X < A, min(L, X, W).

palindrom(L) :- rev2(L, L).



% zly generator, który daje dodatkowy sukces na pozycji "omega" w porządku sukcesów


lista([]).
lista([_|L]) :- lista(L).

lista(omega).



