Česky
Kamil Dudka

Tiny programs (C, C++, C#, ...)

File detail

Name:Downloadseznamy.pl [Download]
Location: tiny > IZU > prolog
Size:2.0 KB
Last modification:2022-09-09 13:06

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