[ GluppiUsername @ 04.12.2011. 23:25 ] @
Treba da riješim sledeći zadatak:
Ternarno stablo je sastavljeno od termova n(a, b, c) koji se nazivaju čvorovi, gdje su a, b, i c ili čvorovi ili cijeli brojevi. Pretpostavite da su dozvoljeni cijeli brojevi 0 i 1. Napisati PROLOG predikat koji će da vrati listu svih 0 i listu svih 1 u datom drvetu. Na primjer, enum(n(n(0, 1, 0), 1, 0), X, Y) treba da postavi X na [0, 0, 0], a Y na [1, 1]. Obavezno koristiti dvije liste.

Imam ovakvu odeju:
Code:

enum(null, [], []).
enum(n(A,_,_), X, Y) :- A == 0, !, cons(0,X,X), enum(A,X,Y).
enum(n(A,_,_), X, Y) :- cons(1,Y,Y), enum(A,X,Y).

/* cons(X, Xs, L) */
/* L je lista koja nastaje dodavanjem elementa X na pocetak liste Xs */
cons(X, [], [X]). 
cons(X, Xs, [X|Xs]).


I ovako redom za svaku od preostale tri pozicije n(_,A,_) i n(_,_,A). Ali problem je što ne radi ni za najednostavnije upite tipa : enum(n(0,0,0), X, Y).
[ Mzo @ 05.12.2011. 20:14 ] @
Code:


join_lists([], L, L).
join_lists([X|R], L, [X|R1]):- join_lists(R, L, R1).

enum(1, [], [1]).
enum(0, [0], []).
enum(n(A,B,C), X, Y):-enum(A, Xa, Ya), enum(B, Xb, Yb), enum(C, Xc, Yc),
                               join_lists(Xa, Xb, Xab), join_lists(Xab, Xc, X),
                               join_lists(Ya, Yb, Yab), join_lists(Yab, Yc, Y).
[ GluppiUsername @ 06.12.2011. 04:15 ] @
hvala