%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
%otoceni linearniho seznamu
%otoceni lin. seznamu :- otoceni tela + pripojeni (spojeni) hlavicky na konec otoceneho tela
otoc([],[]).
otoc([H|T],L) :- otoc(T,LL),spoj(LL,[H],L).
%je prvek clenem obecneho seznamu? jePrvekOb(prvek,seznam)
%to same jak v linearnim + radek navic: prvek je clenem seznamu :- prvek je clenem hlavicky
jePrvekOb(X,[X|_]).
jePrvekOb(X,[H|T]) :- jePrvekOb(X,T)|is_list(H),jePrvekOb(X,H).
%delka obecneho seznamu
%delkaOb(seznam,pocet)
%opet to same jak v linearnim + navic: delka X je jedna :- X je integer (funguje to to jen pro cisla) a k SS se nepripocitacva 1, ale delka H (hlavicky)
delkaOb([],0).
delkaOb(X,1) :- integer(X).
delkaOb([H|T],S) :- delkaOb(T,SS),delkaOb(H,HH), S is SS + HH.
% nalezeni maxima v obecnem seznamu prvku typu integer
%maximumOb(seznam,maximum)
%maximum z X je X, pokud je X integer
%maximum ze seznamu je maximum z hlavicky, pokud je vetsi nez maximum z tela a naopak a pokud neni (obecna) delka tela nulova
%kdyz je delka tela 0, je maximum maximum z hlavicky
max(X,Y,X) :- X > Y.
max(X,Y,Y).
maximumOb(X,X) :- integer(X).
maximumOb([H|T],X) :- (delkaOb(T,D),D > 0,maximumOb(H,HH),maximumOb(T,TT),max(HH,TT,X))|(maximumOb(H,X)).
%hloubka zanoreni obecneho seznamu
%hloubkaOb(seznam, hloubka)
%hloubka X je 0, je-li X integer
%hloubka seznamu je hloubka tela, je-li vetsi nez hloubka hlavicky
%hloubka seznamu je hloubka hlavicky [b]+1[/b], je-li vetsi nebo rovna hloubce tela
hloubkaOb([],0).
hloubkaOb(X,0) :- integer(X).
hloubkaOb([H|T],D) :- hloubkaOb(H,HH),U is HH +1,hloubkaOb(T,TT),max(U,TT,D).