% -*- prolog -*-

head( [Z | _ZT], Z ).
tail( [_ | ZT], ZT ).

posledni( [Z | []], Z ).
posledni( [_ | ZT], X ) :- posledni( ZT, X ).

zacatek( [_Z | []], [] ).
zacatek( [Z | ZT], [Z | XS] ) :- ZT \= [], zacatek( ZT, XS ).

delka( [], 0 ).
delka( [_|XS], L ) :- length( XS, L1 ), L is L1 + 1.

% optimálnější řešení akumulátorem
delkaopt( X, N ) :- delka3( X, 0, N ).

delka3( [], N, N ).
delka3( [_|XS], Acc, N ) :- Acc1 is Acc + 1, delka3( XS, Acc1, N ).

zip( [], _, [] ).
zip( [_|_], [], [] ).
zip( [X|XS], [Y|YS], [(X,Y) | ZS] ) :- zip( XS, YS, ZS ).

mf( 1, 2 ).
mf( 3, 4 ).
mf( _, 0 ).

map( [], [] ).
map( [X|XS], [Y|YS] ) :- mf( X, Y ), map( XS, YS ).

p( 1 ).
p( 3 ).
p( 5 ).

% filter( X, Y ), jen první řešení je korektní
filter( [], [] ).
filter( [X|XS], [X| YS] ) :- p( X ), filter( XS, YS ).
filter( [_|XS], YS ) :- filter( XS, YS ).

scalarproduct( [], [], 0 ).
scalarproduct( [X|XS], [Y|YS], ZZ ) :- Z is X * Y, scalarproduct( XS, YS, NZ ), ZZ is Z + NZ.

