基本上我已经定义了一个谓词来从当前状态中找到所有“下一个可能的状态”,但是我必须使用内置的bagof谓词来统一所有这些状态的列表,但是当我在其中调用它时命令窗口我得到错误'超出全局堆栈'所以我试图跟踪它,它只是递归地不停地调用下一个状态,所以如果有一个所有这些解决方案,它就不可能得到一个“包”无限多的解决方案!
我认为将可能的当前状态列表“限制”为一定数量的元素是一种选择,那么在没有全局堆栈错误的情况下调用bagof还有什么方法呢?
对不起,如果这没有多大意义!
答案 0 :(得分:1)
我打赌你在图表中有周期。所以你来回晃动任意次数。
这就像要求从我家到当地商店的所有路线。在我走到最后半个街区之前,我可以在我的街区周围走动任意次数。所以这是一个无穷无尽的数字。
解决这个问题的方法是忘记bagof。使用递归,但是当你下降时,请保留一个你曾经和你在一起的地方列表,不要回到它们。
答案 1 :(得分:1)
我认为您应该使用call_with_depth_limit / 3,但是如果不知道状态机的结构如何,很难详细说明任何提示。假设你有一个带有递归的state(Curr, Next)
,这应该是循环的罪魁祸首,那么你可以用
'下一个可能的州'(Curr,ListNext): - findall(接下来,call_with_depth_limit(state(Curr,Next),2,_),ListNext)。
请注意,当您对量化变量的使用不感兴趣时,findall比bagof更简单...
答案 2 :(得分:0)
搜索树的每个分支都需要在某个时刻终止,否则您确实会收到此错误。查看代码以查看无限循环所在的位置会很有用。
可能你在某个地方创建了一个递归结构。例如,bagof会在这里得到相同的结果:
nextState(State1,State2):-
如果你从1开始它会找到2,3,4,5,6 ...直到无限但你的堆栈会溢出!
State2 is State1+1.
nextState(State1,State3):-
nextState(State1,State2),
nextState(State2,State3).