Решением вашей проблемы может быть:
rotatelist([H|T], R) :- append(T, [H], R).
rotate(L,LO,LL):-
rotatelist(L,L1),
\+member(L1,LO),!,
append([L1],LO,L2),
rotate(L1,L2,LL).
rotate(_,L,L).
?- rotate([1,2,3,4],[],L).
L = [[1, 2, 3, 4], [4, 1, 2, 3], [3, 4, 1, 2], [2, 3, 4, 1]]
Просто поворачивает список и проверяет, был ли этот список уже вставлен в список вывода.Если не рекурсия продолжается, в противном случае она возвращает список в L
.Я вставил вырез !
, чтобы иметь только список со всеми возможными поворотами.Если вы хотите сгенерировать и другие списки, просто удалите его ...
Если вместо этого вам нужно решение с предоставленным вами прототипом, оно может быть:
rotatelist([H|T], R) :- append(T, [H], R).
all_shifts(_,[],I,I).
all_shifts(L,Result,Len,I):-
I < Len,
rotatelist(L,LO),
I1 is I+1,
all_shifts(LO,R1,Len,I1),
append([LO],R1,Result).
?- length([1,2,3,4],L), all_shifts([1,2,3,4],R,L,1).
L = 4,
R = [[2, 3, 4, 1], [3, 4, 1, 2], [4, 1, 2, 3]]
Идея в основном заключается втак же, как и раньше ... Обратите внимание, что это второе решение не является хвостовой рекурсивной.