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

时间:2015-03-07 21:30:08

标签: prolog

所以我的目标是编写一个谓词,如果N> 0,则将列表向右旋转N次,如果N <0,则向左旋转N次。到目前为止,这是我的代码,除非N == 0,否则输出为false,我不确定我的问题在哪里。

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)
   ).

1 个答案:

答案 0 :(得分:3)

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).

请注意,此定义具有更好的终止行为。如果其中一个列表的长度已知,则终止。