Refinamiento de montículos
Definir la función
1 |
refina :: Ord a => Monticulo a -> [a -> Bool] -> Monticulo a |
tal que (refina m ps) es el montículo formado por los elementos del montículo m que cumplen todos los predicados de la lista ps. Por ejemplo,
1 2 3 4 |
ghci> refina (foldr inserta vacio [1..22]) [(<7), even] M 2 1 (M 4 1 (M 6 1 Vacio Vacio) Vacio) Vacio ghci> refina (foldr inserta vacio [1..22]) [(<1), even] Vacio |
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
refina :: Ord a => Monticulo a -> [a-> Bool] -> Monticulo a refina m ps | esVacio m = vacio | cumple x ps = inserta x (refina r ps) | otherwise = refina r ps where x = menor m r = resto m -- (cumple x ps) se verifica si x cumple todos los predicados de ps. Por -- ejemplo, -- cumple 2 [(<7), even] == True -- cumple 3 [(<7), even] == False -- cumple 8 [(<7), even] == False cumple :: a -> [a -> Bool] -> Bool cumple x ps = and [p x | p <- ps] -- La función cumple se puede definir por recursión: cumple2 x [] = True cumple2 x (p:ps) = p x && cumple x ps |