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