0

基本的に、現在の状態からすべての「次の可能な状態」を見つけるための述語を定義しましたが、組み込みの bagof 述語を使用して、これらすべての状態のリストを統一する必要がありますが、コマンド ウィンドウでそれを呼び出すと、 「グローバル スタックから」というエラーが発生するので、トレースしてみましたが、次の状態を再帰的にノンストップで呼び出すだけなので、無限の数がある場合、これらすべてのソリューションの「バッグ」を取得することはできませんソリューション!

可能な現在の状態のリストを特定の数の要素に「制限」することはオプションではないと思います。グローバルスタックエラーなしでbagofを呼び出す他の方法はありますか?

これがあまり意味をなさない場合は申し訳ありません!

4

3 に答える 3

1

call_with_depth_limit /3を使用する必要があると思いますが、ステート マシンがどのように構成されているかを知らずにヒントを詳しく説明することは困難です。再帰があるstate(Curr, Next)とします。これがループの原因であるはずです。次のようなもので「次へ」のリストを取得できます。

「次の可能な状態」(Curr, ListNext) :- findall(Next, call_with_depth_limit(state(Curr, Next),2,_), ListNext)。

変数の使用量を定量化することにあまり関心がない場合、findall は bagof よりも簡単に使用できることに注意してください...

于 2013-03-03T06:02:24.253 に答える
1

グラフにサイクルがあるに違いありません。したがって、任意の回数行ったり来たりしています。

私の家から地元の店までのすべてのルートを尋ねるようなものです。最後の半分のブロックに行く前に、自分のブロックを任意の回数だけ歩き回ることができます。だから無数にあります。

これに対する解決策は、bagof を忘れることです。再帰を使用してください。

于 2013-03-03T01:29:39.113 に答える
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 に答える