所以我的目标是编写一个谓词,如果 N>0 则将列表向右旋转 N 次,如果 N<0 则向左旋转 N 次。到目前为止,这是我的代码,输出为假,除非 N == 0,我不确定我的问题出在哪里。
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).
请注意,此定义具有更好的终止行为。如果其中一个列表的长度已知,它就会终止。
关于Prolog 向任一方向旋转列表 N 次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28920224/