Prolog在任一方向上旋转列表N次

Prolog在任一方向上旋转列表N次,prolog,Prolog,因此,我的目标是编写一个谓词,如果N>0,将列表向右旋转N次,如果N>0,将列表向左旋转N次 R=L ; N>0-> 旋转右(左,右), N是N-1, 旋转(左、北、右) ; N

因此,我的目标是编写一个谓词,如果N>0,将列表向右旋转N次,如果N>0,将列表向左旋转N次 R=L ; N>0-> 旋转右(左,右), N是N-1, 旋转(左、北、右) ; N<0, rotateleft(左,右), N是N+1, 旋转(左、北、右) ).
请注意,此定义具有更好的终止行为。如果其中一个列表的长度已知,则会终止。

您最初的尝试是不明智的。您有一个用于
rotateleft/2
的子句,它根据
append/3
重申其逻辑,通常用于表示将前两个参数(列表)连接到第三个参数(同样是列表)中。但是您的问题表明,来自
rotateleft/2
N
将是一个数字(一个整数),而不是一个列表。为此,我看到它的性能比我的尝试要好得多。
rotateleft([L|R], N) :-
   append(R, [L], N).

rotateright(L, R) :-
   rotateleft(R, L).

rotate(L,N,R) :-
   (  N = 0 ->
      R = L
   ;  N > 0 ->
      rotateright(L,R),
      N is N-1,
      rotate(L,N,R)
   ;  N < 0,
      rotateleft(L,R),
      N is N+1,
      rotate(L,N,R)
   ).
list_rotated(N, Xs, Ys) :-
   maplist(\_^_^true, Xs, Ys),  % or same_length(Xs, Ys)
   length(Xs, M),
   R is -N mod M,
   length(As, R),
   append(As,Bs, Xs),
   append(Bs,As, Ys).