如何在prolog中限制递归的深度

如何在prolog中限制递归的深度,prolog,Prolog,我这里有一个递归: located_on(A,B,[move(A,B)|_]). located_on(B,L,[_|S]) :- located_on(B,L,S). 当我问位于(a,b,X)上的时,我得到如下结果,这是无限的 X = [] ; X = [move(a, b)|_G4037] ; X = [_G4036] ; X = [_G4036, move(a, b)|_G4040] ; X = [_G4036, _G4039] ; X = [_G4036, _G4039, move(a

我这里有一个递归:

located_on(A,B,[move(A,B)|_]).
located_on(B,L,[_|S]) :- located_on(B,L,S).
当我问位于(a,b,X)上的
时,我得到如下结果,这是无限的

X = [] ;
X = [move(a, b)|_G4037] ;
X = [_G4036] ;
X = [_G4036, move(a, b)|_G4040] ;
X = [_G4036, _G4039] ;
X = [_G4036, _G4039, move(a, b)|_G4043] ;
X = [_G4036, _G4039, _G4042] ;
X = [_G4036, _G4039, _G4042, move(a, b)|_G4046] ;
X = [_G4036, _G4039, _G4042, _G4045] ;
X = [_G4036, _G4039, _G4042, _G4045, move(a, b)|_G4049] 
如何限制递归的深度并得到有限数量的结果

我尝试使用:

located_on(A,B,[move(A,B)|_]).
located_on(B,L,[_|S]) :- located_on(B,L,S),length(S,N),N<5.
位于(A,B)[移动(A,B)|上]。
位于(B,L,S)上:位于(B,L,S),长度(S,N),N
被称为


我得走了,序言

你的解决方案显然是错误的。你为什么不在上一个问题中更清楚地说明这个问题?这一个是无用的,教授,你什么意思?@false我能看到的唯一区别是
之间的
N从1开始,而不是从0开始。这就是问题所在吗?谢谢。一个不切实际的上限之所以具有误导性,还有一个更深层次的原因:这样的上限会导致程序终止,从而隐藏了我们经常为迭代深化付出的代价:失去一个完整的搜索过程。虽然我们找到了所有的答案,但我们永远无法确定是否还有另一个答案潜伏在我们周围。@false-low这是一个黑客。。。但如果没有上限,现在至少很明显,搜索是不受约束的,对吗?所以ID不是正确的选择。正如WP所说,这是一个不知情的搜索。这是一个普遍的问题:有些事情你可以决定(=终止算法存在),有些事情没有算法存在,但仍然有趣:它们可能只是半可判定的。对于这些人来说,迭代深化并不是那么糟糕。而且它的书写速度非常快,而且非常节省空间。节省空间:)因为它可以重新做很多事情。
length(X,N),
located_on(a,b,X).