Zdroj



% Binarni vyhledavaci stromy:
% uzel(L,klic,P) nebo list
% strom(+Strom) overi ze je parametr strom
strom(list).
strom(uzel(L, _, P)) :- strom(L), strom(P).

% obsahuje(+Strom, Klic)
obsahuje(uzel(_, K, _), K).
obsahuje(uzel(L, K2, P), K) :- K2>K, obsahuje(L, K);
	K2<K, obsahuje(P, K).

%zahodit duplicitni hodnoty
% vloz(+Strom, +Klic, -VyslednyStrom)
vloz(list, K, uzel(list, K, list)).
vloz(uzel(L,K,P), K, uzel(L,K,P)).
vloz(uzel(LO,KO,P), K, uzel(L,KO,P)) :- K<KO, vloz(LO,K,L).
vloz(uzel(L,KO,PO), K, uzel(L,KO,P)) :- K>KO, vloz(PO,K,P).


% strom2seznam(+Strom, -Seznam)
strom2seznam(list,[]).
strom2seznam(uzel(L,K,R),S) :- strom2seznam(L,A),strom2seznam(R,B),
	append(A,[K],Sa),append(Sa,B,S).
	% nebo append(A,[K|B],S).

Dotazy



?- vloz(list, 5, X).
X = uzel(list, 5, list).

?- vloz(list, 5, X), vloz(X, 8, Y), vloz(Y, 4, Z), vloz(Z, 3, A).
X = uzel(list, 5, list),
Y = uzel(list, 5, uzel(list, 8, list)),
Z = uzel(uzel(list, 4, list), 5, uzel(list, 8, list)),
A = uzel(uzel(uzel(list, 3, list), 4, list), 5, uzel(list, 8, list)) ;
false.

?- vloz(list, 5, X), vloz(X, 8, Y), vloz(Y, 4, Z),
	vloz(Z, 3, A), strom2seznam(A,S).
X = uzel(list, 5, list),
Y = uzel(list, 5, uzel(list, 8, list)),
Z = uzel(uzel(list, 4, list), 5, uzel(list, 8, list)),
A = uzel(uzel(uzel(list, 3, list), 4, list), 5, uzel(list, 8, list)),
S = [3, 4, 5, 8] ;
false.