Prolog在任一方向上旋转列表N次
因此,我的目标是编写一个谓词,如果N>0,将列表向右旋转N次,如果N>0,将列表向左旋转N次 R=L ; N>0-> 旋转右(左,右), N是N-1, 旋转(左、北、右) ; N<0, rotateleft(左,右), N是N+1, 旋转(左、北、右) ).Prolog在任一方向上旋转列表N次,prolog,Prolog,因此,我的目标是编写一个谓词,如果N>0,将列表向右旋转N次,如果N>0,将列表向左旋转N次 R=L ; N>0-> 旋转右(左,右), N是N-1, 旋转(左、北、右) ; N
请注意,此定义具有更好的终止行为。如果其中一个列表的长度已知,则会终止。您最初的尝试是不明智的。您有一个用于
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).