Tiny programs (C, C++, C#, ...)
File detail
File content
%datove typy -- uvazujeme pouze integery a seznamy -- hlavne na zkousce
%vsechno programovat rekurzi -- obecne silnejsi nez cykly
%jako zarazku rekurze pouzivame prazdny seznam -- jedinny seznam jehoz delku zname
%LISP -- funkcionalni; PROLOG -- logicky jazyk
%delka linearniho seznamu -- obsahuje jenom atomy
delka([],0).
delka([_|T],S) :- delka(T,SS), S is SS + 1.
%je prvek clenem lin. seznamu?
je_prvek([X|_],X).
je_prvek([_|T],X) :- je_prvek(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
%obrat(seznam,seznam)
obrat([],[]).
obrat([H|T],L) :- obrat(T,TMP), spoj(TMP,[H],L).
%delka obecneho seznamu -- muze obsahovat dalsi seznamy -- musime se zanorovat
%delka_ob(seznam,pocet)
delka_ob([],0).
delka_ob([H|T],L) :- integer(H), delka_ob(T,LT), L is LT+1.
delka_ob([H|T],L) :- delka_ob(H,LH), delka_ob(T,LT), L is LH+LT.
%je prvek clenem obecneho seznamu?
%je_prvek_ob(prvek,seznam)
je_prvek_ob(X,[X|_]).
je_prvek_ob(X,[H|T]) :- integer(H), je_prvek_ob(X,T).
je_prvek_ob(X,[H|_]) :- je_prvek_ob(X,H).
je_prvek_ob(X,[_|T]) :- je_prvek_ob(X,T).
% nalezeni maxima v obecnem seznamu prvku typu integer
%maximum_ob(seznam,maximum)
maximum_ob(L,MAX) :- maximum_ob_core(L,0,MAX).
maximum_ob_core([], MAX, DEST) :- DEST is MAX.
maximum_ob_core([H|T], MAX, DEST) :- integer(H), maximum_ob_core(T, H, TMP), max(MAX, TMP, DEST).
maximum_ob_core([H|T], MAX, DEST) :- maximum_ob_core(H, MAX, DEEP_MAX), maximum_ob_core(T, DEEP_MAX, DEST).
max(A, B, DEST) :- A>=B, DEST is A.
max(A, B, DEST) :- A<B, DEST is B.
%hloubka zanoreni obecneho seznamu
%hloubka_ob(seznam, hloubka)
hloubka_ob(L, DEEP) :- hloubka_ob_core(L, 0, DEEP).
hloubka_ob_core([], DEEP_NOW, MAX_DEEP) :- MAX_DEEP is DEEP_NOW.
hloubka_ob_core([H|T], DEEP_NOW, MAX_DEEP) :- integer(H), hloubka_ob_core(T, DEEP_NOW, MAX_DEEP).
hloubka_ob_core([H|T], DEEP_NOW, MAX_DEEP) :- hloubka_ob_core(H, DEEP_NOW+1, H_DEEP), hloubka_ob_core(T, DEEP_NOW, T_DEEP), max(H_DEEP, T_DEEP, MAX_DEEP).