所以我的目标是编写一个谓词,如果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)
).
答案 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).
请注意,此定义具有更好的终止行为。如果其中一个列表的长度已知,则终止。