-- |
-- Module      : BusquedaEnEscalada
-- Description : El patrón de búsqueda en escalada.
-- License     : Creative Commons
-- Maintainer  : José A. Alonso
-- 
-- = El patrón de búsqueda en escalada
-- 
-- Este módulo contiene la definición del patrón de búsqueda en escalada
-- estudiado en el <http://bit.ly/1LIx3CJ tema 15> del curso. 
--
-- Además, en el tema se incluye como de casos de aplicación del patrón 
--
-- * <http://bit.ly/1LIx4GQ el problema del cambio de monedas> y
-- * <http://bit.ly/1LIx5ui el algoritmo de Prim del mínimo árbol de
-- expansión>. 

module I1M.BusquedaEnEscalada (buscaEscalada) where

-- ---------------------------------------------------------------------
-- Importaciones                                                      --
-- ---------------------------------------------------------------------

import I1M.ColaDePrioridad

-- ---------------------------------------------------------------------
-- El patrón de búsqueda en escalada                                  --
-- ---------------------------------------------------------------------

-- | (buscaEscalada s o e) es la lista de soluciones del problema de espacio de
-- estado definido por la función sucesores (s), el objetivo (o) y el
-- estado inicial (e), obtenidas buscando por escalada.
buscaEscalada :: Ord nodo =>
                 (nodo -> [nodo])   -- sucesores
                 -> (nodo -> Bool)  -- es final
                 -> nodo            -- nodo actual
                 -> [nodo]          -- soluciones
buscaEscalada sucesores esFinal x = busca' (inserta x vacia)
    where
      busca' c
        | esVacia c           = []
        | esFinal (primero c) = [primero c]
        | otherwise           =
            busca' (foldr inserta vacia (sucesores (primero c)))