hanoi([], [], _). hanoi(A, B, C):- any_move(A, B, C, A1, B1, C1), hanoi(A1, B1, C1). any_move(A, B, C, A1, B, C1):- swap(A, C, A1, C1). any_move(A, B, C, A1, B1, C):- swap(A, B, A1, B1). any_move(A, B, C, A, B1, C1):- swap(C, B, C1, B1). swap(A, B, A1, B1):- moveto(A, B, A1, B1). swap(A, B, A1, B1):- moveto(B, A, B1, A1). moveto([A|A1], B, A1, [A|B]) :- not inverted([A|B]). inverted([A,B|_]):- A > B. ?- hanoi([1,2,3], [], []). #show hanoi/3. /* ?- ?? hanoi([1,2,3],[],[]). Answer 1 (in [23.284] ms): { hanoi([1,2,3],[],[]) , hanoi([2,3],[],[1]) , hanoi([3],[2],[1]) , hanoi([1,3],[2],[]) , hanoi([3],[1,2],[]) , hanoi([],[1,2],[3]) , hanoi([1],[2],[3]) , hanoi([],[2],[1,3]) , hanoi([2],[],[1,3]) , hanoi([1,2],[],[3]) , hanoi([2],[1],[3]) , hanoi([],[1],[2,3]) , hanoi([1],[],[2,3]) , hanoi([],[],[1,2,3]) } next ? ; Answer 2 (in [13.626] ms): { hanoi([1,2,3],[],[]) , hanoi([2,3],[],[1]) , hanoi([3],[2],[1]) , hanoi([1,3],[2],[]) , hanoi([3],[1,2],[]) , hanoi([],[1,2],[3]) , hanoi([1],[2],[3]) , hanoi([],[2],[1,3]) , hanoi([2],[],[1,3]) , hanoi([1,2],[],[3]) , hanoi([2],[1],[3]) , hanoi([],[1],[2,3]) , hanoi([],[],[1,2,3]) } next ? */