bookmove(A, B) :- books_moved(A, A0), list_rotated(A0, B). books_moved(A, B) :- list_rotated(A, A0), append(Left, Taken, A0), list_rotated(Left, LeftRot), append(Taken, LeftRot, B). list_rotated(A, B) :- length(A, Len), N0 is Len - 1, between(0, N0, N), list_n_rotated(A, N, B). list_n_rotated(A, 0, A). list_n_rotated(A, N, B) :- N > 0, [X|Xs] = A, append(Xs, [X], A0), N0 is N - 1, list_n_rotated(A0, N0, B).