[ Shadowed @ 02.03.2007. 02:45 ] @
Ovako, potrebno je implementirati binarno stablo u Prologu.
Imam facts (ne znam kako je na srpskom): leftchild(X, Y) i rightchild(X, Y) koje upisujem.
Potrebno je odrediti pravila za:
justabove(X, Y) - X je odmah iznad Y
above(X, Y) - X je bilo gde iznad Y
root(X) - X je u korenu stabla
leaf(X) - X nema ni jednu granu (list drveta)
equaldepth(X,Y) - da li X i Y imaju istu dubinu (root ima dubinu nula)
depth(X, D) - D je dubina X-a

prva dva imam uradjena:
Code:

justabove(X,Y) :- leftchild(Y,X).
justabove(X,Y) :- rightchild(Y,X).
above(X, Y) :- justabove(X, Y).
above(X,Y) :- justabove(Z,Y) , above(X,Z).


Medjutim, root mi ne uspeva. Mislim da kada bih znao kako root bih znao i ostalo ali sam jako kratak sa vremenom (10ak sati) pa ako je neko voljan da pomogne, zamolio bih za sve preostale, za svaki slucaj.
Izgledalo mi je logicno root(X) :- above(X, Y) jer mi deluje da je to ekvialent za "za svako Y, X je iznad njega, ali e radi (vraca true i za one koji nisu root). Ocigledno moje (povrsno) znanje prologa nije dovoljno za ovo.

Hvala unapred.

PS. Ako mi istekne ovaj rok, ipak bih voleo da vidim resenje, tako da tema ne zastareva. :)
[ vlaiv @ 10.04.2007. 11:33 ] @
Necu bas pomoci puno, prolog sam slusao jednu godinu u srednjoj skoli i skoro da se secam sintakse ... :)

Mogu samo da ponudim logiku kojom bi se doslo do trazenih resenja a zapis ...

root(x) koristis nesto poput above(x,y) i negaciju above(x,z) za bilo koje z

drugim recima "postoji y takvo da je x iznad y" i "ne postoji z takvo da je z iznad x"

leaf(x) - "ne postoji leftchild(x,y)" and "ne postoji rightchild(x,y)"

Za ova poslednja dva bi se morao prisetiti sintakse jer se ne secam kako se radi sa integerima
(a treba neki tip brojaca)

ali je resenje sledeceg tipa

prvo depth(X,D)

rekurzivno se gleda

definises da je depth(root,0)

i da je depth(x,D) = depth(y,D-1) gde je justabove(x,y) ili kako vec da se pishe ...
ili jezikom pisano "postoji D takvo da postoji y i vazi justabove(x,y) i depth(y,D-1) and depth(root,0)"
(ako se ovo moze nazvati jezikom pisano ... i koji je to jezik uopste :) )


a equaldepth(x,y) svodis na to da "postoji D za koje vazi depth(x,D) i depth(y,D)"
[ Shadowed @ 10.04.2007. 12:40 ] @
Hvala na odgovoru.

Ovo za root sam i pokusavao na taj nacin ali mi nije uspevalo da to napisem kako treba (i ja sam Prolog citao od nekog ko je imao samo jednu godinu u srednjoj (dok sam ja takodje bio u srednjoj)).
Ne secam se, ali mislim da sam depth uradio kasnije na taj ili slican nacin.