0

基本上我已经定义了一个谓词来从当前状态中查找所有“下一个可能的状态”,但是我必须使用内置的 bagof 谓词来统一所有这些状态的列表,但是当我在命令窗口中调用它时我得到错误'全局堆栈',所以我尝试跟踪它,它只是不停地递归调用下一个状态,所以如果有无限数量的,它不可能得到所有这些解决方案的“包”解决方案!

我不认为将可能的当前状态列表“限制”为一定数量的元素是一种选择,那么在没有全局堆栈错误的情况下调用 bagof 有什么其他方法?

对不起,如果这没有多大意义!

4

3 回答 3

1

我敢打赌你在图中有循环。所以你要来回任意次数。

这就像询问从我家到当地商店的所有路线。在我去最后半个街区之前,我可以在我的街区走来走去任意次数。所以有一个无限的数字。

解决这个问题的方法是忘记 bagof。使用递归,但是当你下降时,保留一份你去过的地方的列表,不要回到他们那里。

于 2013-03-03T01:29:39.113 回答
1

我认为您应该使用call_with_depth_limit /3,但是如果不知道您的状态机的结构,很难详细说明任何提示。假设你有一个state(Curr, Next)with 递归,这应该是循环的罪魁祸首,那么你可以得到“下一个”的列表,比如

'下一个可能的状态'(Curr, ListNext) :- findall(Next, call_with_depth_limit(state(Curr, Next),2,_), ListNext)。

请注意,当您对量化变量使用不感兴趣时​​,使用 findall 比 bagof 更简单...

于 2013-03-03T06:02:24.253 回答
0

搜索树的每个分支都需要在某个点终止,否则您确实会收到此错误。查看代码以了解无限循环的位置会很有用。可能您在某处创建了递归结构。例如 bagof 会在这里得到相同的结果: 如果你从 1 开始,它会找到 2、3、4、5、6... 直到无限,但你的堆栈会溢出!
nextState(State1,State2):-
    State2 is State1+1.
nextState(State1,State3):-
    nextState(State1,State2),
    nextState(State2,State3).

于 2013-03-02T20:31:05.120 回答