dfs(X, P, [X|P]) :- goal(X). dfs(X, P, R) :- successor(X,S), notin(S,P), dfs(S, [X|P], R). goal([0,0,0]). safe(X,_) :- X =:= 3. safe(X,_) :- X =:= 0. safe(X,Y) :- X =:= Y. successor([X,Y,1], [U,Y,0]) :- X>=2, U is X-2, safe(U,Y). successor([X,Y,1], [X,V,0]) :- Y>1, V is Y-2, safe(X,V). successor([X,Y,1], [U,V,0]) :- X>0, X =:= Y, U is X-1, V is Y-1. successor([X,Y,1], [X,V,0]) :- Y>0, V is Y-1, safe(X,V). successor([X,Y,0], [U,Y,1]) :- X<2, U is X+2, safe(U,Y). successor([X,Y,0], [X,V,1]) :- Y<2, V is Y+2, safe(X,V). successor([X,Y,0], [U,V,1]) :- X<3, X =:= Y, U is X+1, V is Y+1. successor([X,Y,0], [X,V,1]) :- Y<3, V is Y+1, safe(X,V). notin(_,[]). notin(X,[X|_]) :- !, fail. notin(X,[_|Z]) :- notin(X,Z). printlist([]). printlist([X|Y]) :- printlist(Y), write(X), nl. % the query is % ?- dfs([3,3,1], [], X), printlist(X).