-- |
-- Module      : BusquedaPrimeroElMejor
-- Description : El patrón de búsqueda por primero el mejor.
-- License     : Creative Commons
-- Maintainer  : José A. Alonso
-- 
-- = El patrón de búsqueda por primero el mejor
-- 
-- Este módulo contiene la definición del patrón de búsqueda por primero
-- el mejor estudiado en el <http://bit.ly/1IstIjL tema 15> del
-- curso. 
--
-- Además, en el tema se incluye como de aplicación del patrón el 
-- <http://bit.ly/1IstOI7 problema del 8-puzzle>.

module I1M.BusquedaPrimeroElMejor (buscaPM)  where

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

import I1M.ColaDePrioridad

-- ---------------------------------------------------------------------
-- Búsqueda por primero el mejor                                      --
-- ---------------------------------------------------------------------

-- | (buscaPM 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 primero el mejor.
buscaPM :: (Ord nodo) => 
           (nodo -> [nodo])   -- sucesores
           -> (nodo -> Bool)  -- esFinal
           -> nodo            -- nodo actual
           -> [nodo]          -- solución
buscaPM sucesores esFinal x = busca' (inserta x vacia)
 where
   busca' c 
    | esVacia c = []
    | esFinal (primero c)  
        = (primero c):(busca' (resto c))
    | otherwise            
        = busca' (foldr inserta (resto c) (sucesores x))
          where x = primero c