Citirea unui arbore binar
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Citirea unui arbore binar
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Iosif Chelu, an III-ZI, 2009.
% Facultatea de Matematica si Informatica, Universitatea Spiru Haret Bucuresti.
% http://fmi.spiruharet.ro/bodorin/aicl.html
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Prolog, TP 2.0
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Citirea unui arbore binar.
% Facsem 3 prototipuri inaintea ascestuia (fiecare nu mergea) si asta e bun.
DOMAINS
arb=t(arb,real,arb);nil
PREDICATES
citeste_arbore (arb)
citeste_arb (arb)
citeste_sub (arb)
continui
CLAUSES
% Acest predicat este predicatul de pornire.
% De fapt are doar o functie estetica: afiseaza "radacina" pentru a se stii ca se
% incepe citirea arborelui, apoi apeleaza functia care citeste primul
% varf: citeste_varf() al arborelui.
citeste_arbore(ARB):-
write("radacina: "),
citeste_varf(Arb).
% Predicatul care citeste varful unui arbore (sau subarbore).
% Citeste varful ( H ) apoi apeleaza predicatul care citeste subarborele
% stang ( L ) si subarborele drept ( R ).
citeste_varf(t(L,H,R)):-
readreal(H),
citeste_sub(t(L,H,R)).
% Predicatul care citeste subarborele ( t(L,H,R) ) cu varful deja stiut ( H )
% Daca nu se apasa 'y' pentru continuarea citirii, subarborii stang ( L ) si
% drept ( R ) devin nil (adica H devine frunza).
citeste_sub(t(L,H,R)):-
continui,
write("st[", H, "]="), citeste_varf(L),
write("dr[", H, "]="), citeste_varf(R),!;
L=nil,R=nil.
% Un predicat care returneaza Adevarat daca s-a apasat tasta 'y' si Fals
% daca s-a apasat orice alta tasta
continui:- write("Continuati? (y/n)"),nl,readchar(X),X='y'.