module I1M.BusquedaEnEscalada (buscaEscalada) where
import I1M.ColaDePrioridad
buscaEscalada :: Ord nodo =>
(nodo -> [nodo])
-> (nodo -> Bool)
-> nodo
-> [nodo]
buscaEscalada :: forall nodo.
Ord nodo =>
(nodo -> [nodo]) -> (nodo -> Bool) -> nodo -> [nodo]
buscaEscalada 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]
| Bool
otherwise =
CPrioridad nodo -> [nodo]
busca' ((nodo -> CPrioridad nodo -> CPrioridad nodo)
-> CPrioridad nodo -> [nodo] -> CPrioridad nodo
forall a b. (a -> b -> b) -> b -> [a] -> b
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
forall a. Ord a => CPrioridad a
vacia (nodo -> [nodo]
sucesores (CPrioridad nodo -> nodo
forall a. Ord a => CPrioridad a -> a
primero CPrioridad nodo
c)))