2

我试图在 Prolog 中建立一个向左移动的关系(shiftL(L1,N,L2)旋转),结果是,所以例如是真的。L1NL2shiftL([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语句覆盖了基本情况。

提前感谢您的帮助!

4

1 回答 1

2

这是相关的程序片段():

shiftL([],N,[]) :-。
shiftL([X|Xs],1,L) :-
   追加(Xs,[X],L),。
shiftL([X|Xs],N,L) :-
   N1 是 N-1 ,
   N=\=1,
   shiftL(L1,N1,L), false ,
    append(Xs,[X],L1)

所以本质上是目标append(Xs,[X],L)循环。它会循环,因为既不是列表Xs也不L是列表 - 那是一个固定长度的列表。要看到这一点,请考虑递归目标 shiftL(L1,N1,L)。正如您在片段中看到的那样,L1在其他任何地方都没有发生。因此,它是一个未实例化的变量。并且L是来自查询的变量。所以你需要做一个L1L一个列表。就像把隐藏的东西append(Xs,[X],L1)放在前面一样。

还有另一个循环:

?- shiftL([1,2,3],-1,L).

我相信你可以自己解决这个问题。

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

于 2014-06-23T20:28:56.803 回答