%delka linearniho seznamu
delka([],0).
delka([_|T],S) :- delka(T,SS), S is SS + 1.
%je prvek clenem lin. seznamu?
jePrvek([X|_],X).
jePrvek([_|T],X) :- jePrvek(T,X).
%spojeni dvou linearnich seznamu
spoj([],L,L).
spoj([H|T],L,[H|TT]) :- spoj(T,L,TT).
%doplnte nasledujici predikaty
%doplnte nasledujici predikaty
max(A, B, MAX) :- A>=B, MAX is A.
max(A, B, MAX) :- A<B, MAX is B.
%otoceni linearniho seznamu
%otoc(seznam,seznam)
otoc([], []).
otoc([H|T], L) :- otoc(T, ZBYTEK), spoj(ZBYTEK, [H], L). %Pozirej hlavicky a ty pak spoj obracene
%je prvek clenem obecneho seznamu?
%jePrvekOb(prvek,seznam)
jePrvekOb(X, [X|_]). %Kdyz je prvek na zacatku seznamu, je urcite prvkem seznamu
jePrvekOb(X, [H|_]) :- jePrvekOb(X, H). %Zanor se do hlavicky
jePrvekOb(X, [_|T]) :- jePrvekOb(X, T). %Zanor se do zbytku
%delka obecneho seznamu
%delkaOb(seznam,pocet)
delkaOb([], 0). %Delka prazdneho seznamu je 0
delkaOb([H|T], L) :- delkaOb(H, LH), delkaOb(T, LT), L is LH + LT. %Zanor se a secti delky
delkaOb(_, 1). %Delka jednoho prvku je 1
%nalezeni maxima v obecnem seznamu prvku typu integer
%maximumOb(seznam,maximum)
maximumOb(SEZNAM, MAX) :- maximumOb_max(SEZNAM, -9999999999999999999999999, MAX). %Zanor se
maximumOb_max([], MAX_AKT, MAX) :- MAX is MAX_AKT. %Kdyz uz dolezu do prazdnyho senamu, bude to maximum
maximumOb_max([H|T], MAX_AKT, MAX) :- integer(H), maximumOb_max(T, H, MAX_NEW), max(MAX_AKT, MAX_NEW, MAX). %Zkontroluje integer, pokud je hlavicka vetsi nez aktualni maximum zanori se (viz. minuly predikat)
maximumOb_max([H|T], MAX_AKT, MAX) :- maximumOb_max(H, MAX_AKT, MAX_HT), maximumOb_max(T, MAX_HT, MAX). %Rekurze
%hloubka zanoreni obecneho seznamu
%hloubkaOb(seznam, hloubka)
hloubkaOb(SEZNAM, HLOUBKA) :- hloubkaOb_max(SEZNAM, 1, HLOUBKA). %Zavola telo, hloubka prazdneho senznamu je 1
hloubkaOb_max([], HLOUBKA_AKT, HLOUBKA) :- HLOUBKA is HLOUBKA_AKT. %Uz jsem nejhloubs
hloubkaOb_max([H|T], HLOUBKA_AKT, HLOUBKA) :- atomic(H), hloubkaOb_max(T, HLOUBKA_AKT, HLOUBKA). %Zanoreni
hloubkaOb_max([H|T], HLOUBKA_AKT, HLOUBKA) :- hloubkaOb_max(H, HLOUBKA_AKT+1, HLOUBKA_H), hloubkaOb_max(T, HLOUBKA_AKT, HLOUBKA_T), max(HLOUBKA_H, HLOUBKA_T, HLOUBKA). %Zanor se do hlavicky (+1), zanor se do zbytku, over ze jsme dost hluboko