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