module I1M.BusquedaPrimeroElMejor (buscaPM) where
import I1M.ColaDePrioridad
buscaPM :: (Ord nodo) =>
(nodo -> [nodo])
-> (nodo -> Bool)
-> nodo
-> [nodo]
buscaPM :: (nodo -> [nodo]) -> (nodo -> Bool) -> nodo -> [nodo]
buscaPM nodo -> [nodo]
sucesores nodo -> Bool
esFinal nodo
x = CPrioridad nodo -> [nodo]
busca' (nodo -> CPrioridad nodo -> CPrioridad nodo
forall a. Ord a => a -> CPrioridad a -> CPrioridad a
inserta nodo
x CPrioridad nodo
forall a. Ord a => CPrioridad a
vacia)
where
busca' :: CPrioridad nodo -> [nodo]
busca' CPrioridad nodo
c
| CPrioridad nodo -> Bool
forall a. Ord a => CPrioridad a -> Bool
esVacia CPrioridad nodo
c = []
| nodo -> Bool
esFinal (CPrioridad nodo -> nodo
forall a. Ord a => CPrioridad a -> a
primero CPrioridad nodo
c) = CPrioridad nodo -> nodo
forall a. Ord a => CPrioridad a -> a
primero CPrioridad nodo
c nodo -> [nodo] -> [nodo]
forall a. a -> [a] -> [a]
: CPrioridad nodo -> [nodo]
busca' (CPrioridad nodo -> CPrioridad nodo
forall a. Ord a => CPrioridad a -> CPrioridad a
resto CPrioridad nodo
c)
| Bool
otherwise = CPrioridad nodo -> [nodo]
busca' ((nodo -> CPrioridad nodo -> CPrioridad nodo)
-> CPrioridad nodo -> [nodo] -> CPrioridad nodo
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr nodo -> CPrioridad nodo -> CPrioridad nodo
forall a. Ord a => a -> CPrioridad a -> CPrioridad a
inserta (CPrioridad nodo -> CPrioridad nodo
forall a. Ord a => CPrioridad a -> CPrioridad a
resto CPrioridad nodo
c) (nodo -> [nodo]
sucesores (CPrioridad nodo -> nodo
forall a. Ord a => CPrioridad a -> a
primero CPrioridad nodo
c)))