在Prolog中将列表向左移动N次

在Prolog中将列表向左移动N次,prolog,failure-slice,Prolog,Failure Slice,我试图在PrologshiftL(L1,N,L2)中建立一个关系,将L1向左移动N次(旋转),结果是L2,例如shiftL([1,2,3],2,[3,1,2])是真的 我尝试了以下方法: shiftL([],N,[]). shiftL([X|Xs],1,L) :- append(Xs,[X],L). shiftL([X|Xs],N,L) :- N1 is N-1 , N=\=1 , shiftL(L1,N1,L) , append(Xs,[X],L1). 它工作得很好,但在给我结果后,它总是继

我试图在Prolog
shiftL(L1,N,L2)
中建立一个关系,将
L1
向左移动
N
次(旋转),结果是
L2
,例如
shiftL([1,2,3],2,[3,1,2])
是真的

我尝试了以下方法:

shiftL([],N,[]).
shiftL([X|Xs],1,L) :- append(Xs,[X],L).
shiftL([X|Xs],N,L) :- N1 is N-1 , N=\=1 , shiftL(L1,N1,L) , append(Xs,[X],L1).
它工作得很好,但在给我结果后,它总是继续做其他事情,我得到了堆栈溢出:

?- shiftL([1,2,3], 2, L).
L = [3, 1, 2] ;
ERROR: Out of global stack
我不知道是什么原因造成的。我想我用第二行和
N=\=1
语句涵盖了基本情况


提前感谢您的帮助

以下是相关的程序片段():

我相信你自己能解决这个问题


有关故障片如何缩小非终止问题的更多示例,请参见。

哦,我明白了,所以表达式的顺序实际上很重要。非常感谢。 shiftL([],N,[]) :- false. shiftL([X|Xs],1,L) :- append(Xs,[X],L), false. shiftL([X|Xs],N,L) :- N1 is N-1 , N=\=1, shiftL(L1,N1,L), false, append(Xs,[X],L1).
?- shiftL([1,2,3],-1,L).