Dire che ho il seguente tipo albero di Haskell, dove "Stato" è un semplice involucro:Come generare un albero in modo funzionale. (Con Haskell)
data Tree a = Branch (State a) [Tree a]
| Leaf (State a)
deriving (Eq, Show)
Ho anche una funzione di "espandere :: albero a -> albero un" che prende un nodo foglia, e lo espande in un ramo, o prende un ramo e lo restituisce inalterato. Questo tipo di albero rappresenta un albero di ricerca N-ario.
La ricerca della profondità prima è uno spreco, poiché lo spazio di ricerca è ovviamente infinito, poiché posso facilmente continuare ad espandere lo spazio di ricerca con l'uso di espandere su tutti i nodi foglia dell'albero e le possibilità di perdere accidentalmente lo stato-obiettivo è enorme ... quindi l'unica soluzione è una ricerca di ampiezza, implementata in modo piuttosto decente su here, che troverà la soluzione se è lì.
Quello che voglio per generare, però, è l'albero attraversato fino al trovare la soluzione. Questo è un problema perché so solo come fare questo depth-first, che potrebbe essere fatto semplicemente chiamando la funzione "expand" ancora e ancora sul primo nodo figlio ... finché non viene trovato uno stato-obiettivo. (Questo in realtà non genererebbe niente di diverso da una lista davvero scomoda.)
Qualcuno potrebbe darmi qualche suggerimento su come fare questo (o un intero algoritmo), o un verdetto sul fatto se sia possibile o meno con una complessità decente ? (O qualche fonte su questo, perché ho trovato piuttosto pochi.)
Come parte, potresti voler usare qualcosa di diverso da "Stato" lì, poiché quel nome è usato nelle librerie standard per la monade di Stato, che è suscettibile di confondere le persone. –
Mi sono reso conto che proprio ora mentre stavo usando la monade di stato per implementare il mio algoritmo, sulla base del consiglio dato qui. – wen