次のHaskellツリータイプがあるとします。ここで、「State」は単純なラッパーです。
data Tree a = Branch (State a) [Tree a]
| Leaf (State a)
deriving (Eq, Show)
また、リーフノードを取得してブランチに展開する関数「expand :: Tree a-> Tree a」、またはブランチを取得して変更せずに返す関数もあります。このツリータイプは、N-ary検索ツリーを表します。
深さ優先探索は無駄です。検索スペースは明らかに無限であり、ツリーのすべてのリーフノードでexpandを使用して検索スペースを簡単に拡張し続けることができ、誤ってゴール状態を見逃す可能性があります。巨大です...したがって、唯一の解決策は幅優先探索であり、ここでかなり適切に実装されています。そこにある場合は解決策が見つかります。
しかし、私が生成したいのは、解決策を見つけるためにトラバースされたツリーです。これは問題です。なぜなら、私はこの深さ優先を行う方法しか知らないからです。これは、最初の子ノードで「expand」関数を何度も呼び出すだけで実行できます...ゴール状態が見つかるまで。(これは、本当に不快なリスト以外のものを実際に生成することはありません。)
誰かが私にこれを行う方法(またはアルゴリズム全体)についてのヒント、またはそれがまともな複雑さで可能かどうかについての評決を教えてもらえますか?(または、これに関する情報源は、かなり少ないので。)