%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).