reach(move(X,2), table([X|A],B,C), table(A,[X|B],C)). reach(move(X,3), table([X|A],B,C), table(A,B,[X|C])). reach(move(X,1), table(A,[X|B],C), table([X|A],B,C)). reach(move(X,3), table(A,[X|B],C), table(A,B,[X|C])). reach(move(X,1), table(A,B,[X|C]), table([X|A],B,C)). reach(move(X,2), table(A,B,[X|C]), table(A,[X|B],C)). actions(L,S0,S) :- actions_r(Lr,S0,S), reverse(Lr,L). actions_r([], S, S). actions_r([M|Lr],S0,S) :- actions_r(Lr,S0,S1), reach(M,S1,S). reverse(L,Lrev) :- rev1(L,[],Lrev). rev1([], S,S). rev1([A|L],S,Lrev) :- rev1(L,[A|S],Lrev). go(L) :- actions(L,table([y],[],[r,g]),table([],[],[r,y,g])).