Decir que tengo el siguiente tipo de árbol de Haskell, donde "Estado" es un contenedor simple:Cómo generar funcionalmente un árbol de primer orden. (Con Haskell)
data Tree a = Branch (State a) [Tree a]
| Leaf (State a)
deriving (Eq, Show)
También tengo una función de "ampliar :: Arbol a -> Tree a", que tiene una nodo de hoja, y lo expande en una rama, o toma una rama y la devuelve inalterada. Este tipo de árbol representa un árbol de búsqueda N-ary.
Buscar primero en profundidad es un desperdicio, ya que el espacio de búsqueda es obviamente infinito, ya que puedo seguir expandiendo el espacio de búsqueda expandiendo en todos los nodos de hoja del árbol y las posibilidades de que falte accidentalmente el objetivo-estado es enorme ... por lo tanto, la única solución es una búsqueda amplia, implementada bastante decente sobre here, que encontrará la solución si está allí.
Lo que yo quiero para generar, sin embargo, es el árbol atravesado hasta encontrar la solución. Esto es un problema porque solo sé cómo hacer esta profundidad primero, lo que podría hacerse simplemente llamando a la función "expandir" una y otra vez en el primer nodo secundario ... hasta que se encuentre un estado de objetivo. (Esto realmente no generaría nada más que una lista realmente incómoda.)
¿Alguien podría darme alguna pista sobre cómo hacer esto (o un algoritmo completo), o un veredicto sobre si es posible o no con una decente complejidad? ? (O cualquier fuente sobre esto, porque encontré bastante pocos.)
Como un aparte, es posible que desee utilizar algo que no sea 'Estado 'allí, ya que ese nombre se utiliza en las bibliotecas estándar para la mónada de estado, que puede confundir a las personas. –
Me di cuenta de que justo ahora estaba usando la mónada de estado para implementar mi algoritmo, en base a los consejos dados aquí. – wen