SlideShare una empresa de Scribd logo
1 de 45
Descargar para leer sin conexión
Tema 20: El TAD de los montículos
            Informática (2010–11)


            José A. Alonso Jiménez

          Grupo de Lógica Computacional
  Departamento de Ciencias de la Computación e I.A.
               Universidad de Sevilla
IM Tema 20: El TAD de los montículos




Tema 20: El TAD de los montículos
 1. Especificación del TAD de los montículos
       Signatura del TAD de los montículos
       Propiedades del TAD de los montículos
 2. Implementación del TAD de los montículos
       Los montículos como tipo de dato algebraico
 3. Comprobación de la implementación con QuickCheck
      Librerías auxiliares
      Generador de montículos
      Especificación de las propiedades de los montículos
      Comprobación de las propiedades
 4. Implementación de las colas de prioridad mediante montículos
       Las colas de prioridad como montículos

                                                                   2 / 45
IM Tema 20: El TAD de los montículos
  Especificación del TAD de los montículos
     Signatura del TAD de los montículos



Tema 20: El TAD de los montículos

 1. Especificación del TAD de los montículos
       Signatura del TAD de los montículos
       Propiedades del TAD de los montículos

 2. Implementación del TAD de los montículos

 3. Comprobación de la implementación con QuickCheck

 4. Implementación de las colas de prioridad mediante montículos




                                                                   3 / 45
IM Tema 20: El TAD de los montículos
  Especificación del TAD de los montículos
     Signatura del TAD de los montículos



Descripción de los montículos
 Un montículo es un árbol binario en el que los valores de cada nodo es
 menor o igual que los valores de sus hijos. Por ejemplo,
                   1           1
            /               / 
           /               / 
         2       6         3       6
        /  /            /  / 
      3 8 9 7            4 2 9 7
 el de la izquierda es un montículo, pero el de la derecha no lo es.




                                                                          4 / 45
IM Tema 20: El TAD de los montículos
  Especificación del TAD de los montículos
     Signatura del TAD de los montículos



Signatura del TAD de los montículos
 Signatura:
   vacio           ::    Ord     a     =>   Monticulo a
   inserta         ::    Ord     a     =>   a -> Monticulo   a -> Monticulo a
   menor           ::    Ord     a     =>   Monticulo a ->   a
   resto           ::    Ord     a     =>   Monticulo a ->   Monticulo a
   esVacio         ::    Ord     a     =>   Monticulo a ->   Bool
   valido          ::    Ord     a     =>   Monticulo a ->   Bool




                                                                                5 / 45
IM Tema 20: El TAD de los montículos
  Especificación del TAD de los montículos
     Signatura del TAD de los montículos



Signatura del TAD de los montículos
 Descripción de las operaciones:
         vacio es el montículo vacío.
         (inserta x m) es el montículo obtenido añadiendo el elemento
         x al montículo m.
         (menor m) es el menor elemento del montículo m.
         (resto m) es el montículo obtenido eliminando el menor
         elemento del montículo m.
         (esVacio m) se verifica si m es el montículo vacío.
         (valido m) se verifica si m es un montículo; es decir, es un árbol
         binario en el que los valores de cada nodo es menor o igual que
         los valores de sus hijos.


                                                                             6 / 45
IM Tema 20: El TAD de los montículos
  Especificación del TAD de los montículos
     Propiedades del TAD de los montículos



Tema 20: El TAD de los montículos

 1. Especificación del TAD de los montículos
       Signatura del TAD de los montículos
       Propiedades del TAD de los montículos

 2. Implementación del TAD de los montículos

 3. Comprobación de la implementación con QuickCheck

 4. Implementación de las colas de prioridad mediante montículos




                                                                   7 / 45
IM Tema 20: El TAD de los montículos
  Especificación del TAD de los montículos
     Propiedades del TAD de los montículos



Propiedades del TAD de los montículos
    1. esVacio vacio
    2. valido (inserta x m)
    3. not (esVacio (inserta x m))
    4. not (esVacio m) ==> valido (resto m)
    5. resto (inserta x vacio) == vacio
    6. x <= menor m ==> resto (inserta x m) == m
    7. Si m es no vacío y x > menor m, entonces
       resto (inserta x m) == inserta x (resto m)
    8. esVacio m ||
       esVacio (resto m) ||
       menor m <= menor (resto m)


                                                    8 / 45
IM Tema 20: El TAD de los montículos
  Implementación del TAD de los montículos
     Los montículos como tipo de dato algebraico



Tema 20: El TAD de los montículos

 1. Especificación del TAD de los montículos

 2. Implementación del TAD de los montículos
       Los montículos como tipo de dato algebraico

 3. Comprobación de la implementación con QuickCheck

 4. Implementación de las colas de prioridad mediante montículos




                                                                   9 / 45
IM Tema 20: El TAD de los montículos
  Implementación del TAD de los montículos
     Los montículos como tipo de dato algebraico



Los montículos como tipo de dato algebraico
         Cabecera del módulo:

         module Monticulo
             (Monticulo,
              vacio, --                      Ord   a   =>   Monticulo a
              inserta, --                    Ord   a   =>   a -> Monticulo   a -> Monticulo a
              menor, --                      Ord   a   =>   Monticulo a ->   a
              resto, --                      Ord   a   =>   Monticulo a ->   Monticulo a
              esVacio, --                    Ord   a   =>   Monticulo a ->   Bool
              valido --                      Ord   a   =>   Monticulo a ->   Bool
             ) where
         Librería auxiliar:

         import Data.List (sort)
                                                                                          10 / 45
IM Tema 20: El TAD de los montículos
  Implementación del TAD de los montículos
     Los montículos como tipo de dato algebraico



Los montículos como tipo de dato algebraico
         Los montículos como tipo de dato algebraico

         data Ord a => Monticulo a
                         = Vacio
                         | M a Int (Monticulo a) (Monticulo a)
                         deriving Show
         La forma de los montículos no vacío es (M v r i d) donde
                 v es el valor de la raíz del montículo.
                 r es el rango del montículo; es decir, la menor distancia de la raíz
                 a un montículo vacío.
                 i es el submontículo izquierdo y
                 f es el submontículo derecho.



                                                                                        11 / 45
IM Tema 20: El TAD de los montículos
  Implementación del TAD de los montículos
     Los montículos como tipo de dato algebraico



Los montículos como tipo de dato algebraico
 Ejemplos de montículos
     Definición:

         m1, m2, m3 :: Monticulo Int
         m1 = foldr inserta vacio [6,1,4,8]
         m2 = foldr inserta vacio [7,5]
         m3 = mezcla m1 m2
         Representación:
                   m1                              m2           m3
                                                                (1,2)
                   (1,2)       (5,1)                              /     
                  /          /                                 /        
               (4,1) (6,1) (7,1)                            (5,2)         (4,1)
              /                                            /             /
           (8,1)                                        (7,1) (6,1)     (8,1) 12 / 45
IM Tema 20: El TAD de los montículos
  Implementación del TAD de los montículos
     Los montículos como tipo de dato algebraico



Los montículos como tipo de dato algebraico
         vacio es el montículo vacío.

         vacio :: Ord a => Monticulo a
         vacio = Vacio
         (rango m) es el rango del montículo m; es decir, la menor
         distancia a un montículo vacío. Por ejemplo,
          rango m1        2
          rango m2        1

         rango :: Ord a => Monticulo a -> Int
         rango Vacio       = 0
         rango (M _ r _ _) = r


                                                                     13 / 45
IM Tema 20: El TAD de los montículos
  Implementación del TAD de los montículos
     Los montículos como tipo de dato algebraico



Los montículos como tipo de dato algebraico
 (creaM x a b) es el montículo creado a partir del elemento x y los
 montículos a y b. Se supone que x es menor o igual que el mínimo de
 a y de b. Por ejemplo,
  ghci> m1
  M 1 2 (M 4 1 (M 8 1 Vacio Vacio) Vacio) (M 6 1 Vacio Vacio)
  ghci> m2
  M 5 1 (M 7 1 Vacio Vacio) Vacio
  ghci> creaM 0 m1 m2
  M 0 2 (M 1 2 (M 4 1 (M 8 1 Vacio Vacio) Vacio) (M 6 1 Vacio V
         (M 5 1 (M 7 1 Vacio Vacio) Vacio)

 creaM :: Ord a => a -> Monticulo a -> Monticulo a -> Monticulo
 creaM x a b | rango a >= rango b = M x (rango b + 1) a b
             | otherwise          = M x (rango a + 1) b a
                                                                14 / 45
IM Tema 20: El TAD de los montículos
  Implementación del TAD de los montículos
     Los montículos como tipo de dato algebraico



Los montículos como tipo de dato algebraico
         (mezcla m1 m2) es el montículo obtenido mezclando los
         montículos m1 y m2. Por ejemplo,
          ghci> mezcla m1 m2
          M 1 2 (M 5 2 (M 7 1 Vacio Vacio) (M 6 1 Vacio Vacio))
                 (M 4 1 (M 8 1 Vacio Vacio) Vacio)

         mezcla :: Ord a => Monticulo a -> Monticulo a
                             -> Monticulo a
         mezcla h Vacio = h
         mezcla Vacio h = h
         mezcla h1@(M x _ a1 b1) h2@(M y _ a2 b2)
               | x <= y    = creaM x a1 (mezcla b1 h2)
               | otherwise = creaM y a2 (mezcla h1 b2)

                                                                  15 / 45
IM Tema 20: El TAD de los montículos
  Implementación del TAD de los montículos
     Los montículos como tipo de dato algebraico



Los montículos como tipo de dato algebraico
         (inserta x m) es el montículo obtenido añadiendo el elemento
         x al montículo m. Por ejemplo,
          ghci> m1
          M 1 2 (M 4 1 (M 8 1 Vacio Vacio) Vacio)
                 (M 6 1 Vacio Vacio)
          ghci> inserta 3 m1
          M 1 2
             (M 4 1 (M 8 1 Vacio Vacio) Vacio)
             (M 3 1 (M 6 1 Vacio Vacio) Vacio)

         inserta :: Ord a => a -> Monticulo a -> Monticulo a
         inserta x m = mezcla (M x 1 Vacio Vacio) m


                                                                        16 / 45
IM Tema 20: El TAD de los montículos
  Implementación del TAD de los montículos
     Los montículos como tipo de dato algebraico



Los montículos como tipo de dato algebraico
         (menor m) es el menor elemento del montículo m. Por ejemplo,
          menor m1        1
          menor m2        5

         menor :: Ord a => Monticulo a -> a
         menor (M x _ _ _) = x
         menor Vacio       = error "menor: monticulo vacio"
         (resto m) es el montículo obtenido eliminando el menor
         elemento del montículo m. Por ejemplo,
          ghci> resto m1
          M 4 2 (M 8 1 Vacio Vacio) (M 6 1 Vacio Vacio)

         resto :: Ord a => Monticulo a -> Monticulo a
         resto Vacio       = error "resto: monticulo vacio"
         resto (M x _ a b) = mezcla a b                                 17 / 45
IM Tema 20: El TAD de los montículos
  Implementación del TAD de los montículos
     Los montículos como tipo de dato algebraico



Los montículos como tipo de dato algebraico
         (esVacio m) se verifica si m es el montículo vacío.

         esVacio :: Ord a => Monticulo a -> Bool
         esVacio Vacio = True
         esVacio _     = False




                                                              18 / 45
IM Tema 20: El TAD de los montículos
  Implementación del TAD de los montículos
     Los montículos como tipo de dato algebraico



Los montículos como tipo de dato algebraico
        (valido m) se verifica si m es un montículo; es decir, es un árbol
        binario en el que los valores de cada nodo es menor o igual que los
        valores de sus hijos. Por ejemplo,
         valido m1           True
         valido (M 3 5 (M 2 1 Vacio Vacio) Vacio)                False

        valido :: Ord a => Monticulo               a -> Bool
        valido Vacio = True
        valido (M x _ Vacio Vacio) =               True
        valido (M x _ m1@(M x1 n1 a1               b1) Vacio) =
            x <= x1 && valido m1
        valido (M x _ Vacio m2@(M x2               n2 a2 b2)) =
            x <= x2 && valido m2
        valido (M x _ m1@(M x1 n1 a1               b1) m2@(M x2 n2 a2 b2)) =
            x <= x1 && valido m1 &&
            x <= x2 && valido m2
                                                                               19 / 45
IM Tema 20: El TAD de los montículos
  Implementación del TAD de los montículos
     Los montículos como tipo de dato algebraico



Los montículos como tipo de dato algebraico
         (elementos m) es la lista de los elementos del montículo m. Por
         ejemplo,
          elementos m1        [1,4,8,6]

         elementos :: Ord a => Monticulo a -> [a]
         elementos Vacio       = []
         elementos (M x _ a b) = x : elementos a ++ elementos b




                                                                           20 / 45
IM Tema 20: El TAD de los montículos
  Implementación del TAD de los montículos
     Los montículos como tipo de dato algebraico



Los montículos como tipo de dato algebraico
         (equivMonticulos m1 m2) se verifica si los montículos m1 y m2
         tienen los mismos elementos. Por ejemplo,
          ghci> m1
          M 1 2 (M 4 1 (M 8 1 Vacio Vacio) Vacio)
                  (M 6 1 Vacio Vacio)
          ghci> let m1' = foldr inserta vacio [6,8,4,1]
          M 1 2 (M 4 1 Vacio Vacio)
                  (M 6 1 (M 8 1 Vacio Vacio) Vacio)
          ghci> equivMonticulos m1 m1'
          True

         equivMonticulos :: Ord a => Monticulo a -> Monticulo a
                            -> Bool
         equivMonticulos m1 m2 =
             sort (elementos m1) == sort (elementos m2)
                                                                        21 / 45
IM Tema 20: El TAD de los montículos
  Implementación del TAD de los montículos
     Los montículos como tipo de dato algebraico



Los montículos como tipo de dato algebraico
         Los montículos son comparables por igualdad.

         instance Ord a => Eq (Monticulo a) where
            (==) = equivMonticulos




                                                        22 / 45
IM Tema 20: El TAD de los montículos
  Comprobación de la implementación con QuickCheck
     Librerías auxiliares



Tema 20: El TAD de los montículos

 1. Especificación del TAD de los montículos

 2. Implementación del TAD de los montículos

 3. Comprobación de la implementación con QuickCheck
      Librerías auxiliares
      Generador de montículos
      Especificación de las propiedades de los montículos
      Comprobación de las propiedades

 4. Implementación de las colas de prioridad mediante montículos


                                                                   23 / 45
IM Tema 20: El TAD de los montículos
  Comprobación de la implementación con QuickCheck
     Librerías auxiliares



Comprobación de las propiedades del TAD de los
montículos
         Importación de la implementación a verificar.

         import Monticulo

         Importación de librerías auxiliares.

         import Test.QuickCheck
         import Test.Framework
         import Test.Framework.Providers.QuickCheck2




                                                        24 / 45
IM Tema 20: El TAD de los montículos
  Comprobación de la implementación con QuickCheck
     Generador de montículos



Tema 20: El TAD de los montículos

 1. Especificación del TAD de los montículos

 2. Implementación del TAD de los montículos

 3. Comprobación de la implementación con QuickCheck
      Librerías auxiliares
      Generador de montículos
      Especificación de las propiedades de los montículos
      Comprobación de las propiedades

 4. Implementación de las colas de prioridad mediante montículos


                                                                   25 / 45
IM Tema 20: El TAD de los montículos
  Comprobación de la implementación con QuickCheck
     Generador de montículos



Generador de montículos
         (creaMonticulo xs) es el montículo correspondiente a la lista
         xs. Por ejemplo,
          ghci> creaMonticulo [6,1,4,8]
          M 1 2 (M 4 1 (M 8 1 Vacio Vacio) Vacio)
                 (M 6 1 Vacio Vacio)
          ghci> creaMonticulo [6,8,4,1]
          M 1 2 (M 4 1 Vacio Vacio)
                 (M 6 1 (M 8 1 Vacio Vacio) Vacio)

         creaMonticulo :: [Int] -> Monticulo Int
         creaMonticulo = foldr inserta vacio



                                                                         26 / 45
IM Tema 20: El TAD de los montículos
  Comprobación de la implementación con QuickCheck
     Generador de montículos



Generador de montículos
         genMonticulo es un generador de montículos. Por ejemplo,
          ghci> sample genMonticulo
          VacioM
          M (-1) 1 (M 1 1 VacioM VacioM) VacioM
          ...

         genMonticulo :: Gen (Monticulo Int)
         genMonticulo = do xs <- listOf arbitrary
                           return (creaMonticulo xs)

         instance Arbitrary (Monticulo Int) where
             arbitrary = genMonticulo


                                                                    27 / 45
IM Tema 20: El TAD de los montículos
  Comprobación de la implementación con QuickCheck
     Generador de montículos



Corrección del generador de montículos
         Prop.: genMonticulo genera montículos válidos.

         prop_genMonticulo :: Monticulo Int -> Bool
         prop_genMonticulo m = valido m
         Comprobación:
          ghci> quickCheck prop_genMonticulo
          +++ OK, passed 100 tests.




                                                          28 / 45
IM Tema 20: El TAD de los montículos
  Comprobación de la implementación con QuickCheck
     Generador de montículos



Generador de montículos no vacíos
         monticuloNV es un generador de montículos no vacío. Por
         ejemplo,
          ghci> sample monticuloNV
          M 0 1 VacioM VacioM
          M 1 1 (M 1 1 (M 1 1 VacioM VacioM) VacioM) VacioM
          ...

         monticuloNV :: Gen (Monticulo Int)
         monticuloNV = do xs <- listOf arbitrary
                          x <- arbitrary
                          return (creaMonticulo (x:xs))



                                                                   29 / 45
IM Tema 20: El TAD de los montículos
  Comprobación de la implementación con QuickCheck
     Generador de montículos



Corrección del generador de montículos no vacíos
         Prop.: monticuloNV genera montículos no vacío.

         prop_monticuloNV :: Monticulo Int -> Property
         prop_monticuloNV m =
             forAll monticuloNV
                    (m -> (valido m) && not (esVacio m))
         Comprobación:
          ghci> quickCheck prop_monticuloNV
          +++ OK, passed 100 tests.




                                                            30 / 45
IM Tema 20: El TAD de los montículos
  Comprobación de la implementación con QuickCheck
     Especificación de las propiedades de los montículos



Tema 20: El TAD de los montículos

 1. Especificación del TAD de los montículos

 2. Implementación del TAD de los montículos

 3. Comprobación de la implementación con QuickCheck
      Librerías auxiliares
      Generador de montículos
      Especificación de las propiedades de los montículos
      Comprobación de las propiedades

 4. Implementación de las colas de prioridad mediante montículos


                                                                   31 / 45
IM Tema 20: El TAD de los montículos
  Comprobación de la implementación con QuickCheck
     Especificación de las propiedades de los montículos



Especificación de las propiedades de los montículos
         vacio es un montículo.

         prop_vacio_es_monticulo :: Bool
         prop_vacio_es_monticulo =
             esVacio (vacio :: Monticulo Int)
         inserta produce montículos válidos.

         prop_inserta_es_valida :: Int -> Monticulo Int -> Bool
         prop_inserta_es_valida x m =
             valido (inserta x m)




                                                                  32 / 45
IM Tema 20: El TAD de los montículos
  Comprobación de la implementación con QuickCheck
     Especificación de las propiedades de los montículos



Especificación de las propiedades de los montículos
         Los montículos creados con inserta son no vacío.

         prop_inserta_no_vacio :: Int -> Monticulo Int -> Bool
         prop_inserta_no_vacio x m =
             not (esVacio (inserta x m))
         Al borrar el menor elemento de un montículo no vacío se obtiene
         un montículo válido.

         prop_resto_es_valida :: Monticulo Int -> Property
         prop_resto_es_valida m =
             forAll monticuloNV (m -> valido (resto m))



                                                                           33 / 45
IM Tema 20: El TAD de los montículos
  Comprobación de la implementación con QuickCheck
     Especificación de las propiedades de los montículos



Especificación de las propiedades de los montículos
         El resto de (inserta x m) es m si m es el montículo vacío o x es
         menor o igual que el menor elemento de m y es
         (inserta x (resto m)), en caso contrario.

         prop_resto_inserta :: Int -> Monticulo Int -> Bool
         prop_resto_inserta x m =
             resto (inserta x m)
             == if esVacio m || x <= menor m then m
                else inserta x (resto m)
         (menor m) es el menor elemento del montículo m.

         prop_menor_es_minimo :: Monticulo Int -> Bool
         prop_menor_es_minimo m =
             esVacio m || esVacio (resto m) ||
             menor m <= menor (resto m)
                                                                            34 / 45
IM Tema 20: El TAD de los montículos
  Comprobación de la implementación con QuickCheck
     Comprobación de las propiedades



Tema 20: El TAD de los montículos

 1. Especificación del TAD de los montículos

 2. Implementación del TAD de los montículos

 3. Comprobación de la implementación con QuickCheck
      Librerías auxiliares
      Generador de montículos
      Especificación de las propiedades de los montículos
      Comprobación de las propiedades

 4. Implementación de las colas de prioridad mediante montículos


                                                                   35 / 45
IM Tema 20: El TAD de los montículos
  Comprobación de la implementación con QuickCheck
     Comprobación de las propiedades



Definición del procedimiento de comprobación
         compruebaPropiedades comprueba todas las propiedades con la
         plataforma de verificación.

         compruebaPropiedades =
             defaultMain
                 [testGroup "Propiedades del TAD monticulo"
                  [testProperty "P1" prop_genMonticulo,
                   testProperty "P2" prop_monticuloNV,
                   testProperty "P3" prop_vacio_es_monticulo,
                   testProperty "P4" prop_inserta_es_valida,
                   testProperty "P5" prop_inserta_no_vacio,
                   testProperty "P6" prop_resto_es_valida,
                   testProperty "P7" prop_resto_inserta,
                   testProperty "P8" prop_menor_es_minimo]]
                                                                       36 / 45
IM Tema 20: El TAD de los montículos
  Comprobación de la implementación con QuickCheck
     Comprobación de las propiedades



Comprobación de las propiedades de los montículos
   ghci> compruebaPropiedades
   Propiedades del TAD monticulo:
     P1: [OK, passed 100 tests]
     P2: [OK, passed 100 tests]
     P3: [OK, passed 100 tests]
     P4: [OK, passed 100 tests]
     P5: [OK, passed 100 tests]
     P6: [OK, passed 100 tests]
     P7: [OK, passed 100 tests]
     P8: [OK, passed 100 tests]

            Properties                    Total
     Passed 8                             8
     Failed 0                             0
     Total 8                              8          37 / 45
IM Tema 20: El TAD de los montículos
  Implementación de las colas de prioridad mediante montículos
     Las colas de prioridad como montículos



Tema 20: El TAD de los montículos

 1. Especificación del TAD de los montículos

 2. Implementación del TAD de los montículos

 3. Comprobación de la implementación con QuickCheck

 4. Implementación de las colas de prioridad mediante montículos
       Las colas de prioridad como montículos




                                                                   38 / 45
IM Tema 20: El TAD de los montículos
  Implementación de las colas de prioridad mediante montículos
     Las colas de prioridad como montículos



Las colas de prioridad como montículos
 Cabecera del módulo:

 module ColaDePrioridadConMonticulos
     (CPrioridad,
      vacia, -- Ord a => CPrioridad a
      inserta, -- Ord a => a -> CPrioridad                       a -> CPrioridad a
      primero, -- Ord a => CPrioridad a ->                       a
      resto, -- Ord a => CPrioridad a ->                         CPrioridad a
      esVacia, -- Ord a => CPrioridad a ->                       Bool
      valida -- Ord a => CPrioridad a ->                         Bool
     ) where
 Importación cualificada:

 import qualified Monticulo as M
                                                                                 39 / 45
IM Tema 20: El TAD de los montículos
  Implementación de las colas de prioridad mediante montículos
     Las colas de prioridad como montículos



Las colas de prioridad como montículos
         Descripción de las operaciones:
                 vacia es la cola de prioridad vacía.
                 (inserta x c) añade el elemento x a la cola de prioridad c.
                 (primero c) es el primer elemento de la cola de prioridad c.
                 (resto c) es el resto de la cola de prioridad c.
                 (esVacia c) se verifica si la cola de prioridad c es vacía.
                 (valida c) se verifica si c es una cola de prioridad válida.
         Las colas de prioridad como montículos.

         newtype CPrioridad a = CP (M.Monticulo a)
             deriving (Eq, Show)




                                                                                40 / 45
IM Tema 20: El TAD de los montículos
  Implementación de las colas de prioridad mediante montículos
     Las colas de prioridad como montículos



Las colas de prioridad como montículos
         Ejemplo de cola de prioridad:

         cp1 :: CPrioridad Int
         cp1 = foldr inserta vacia [3,1,7,2,9]

         Evaluación:
          ghci> cp1
          CP (M 1 2
                 (M 2 2
                     (M 9 1 VacioM VacioM)
                     (M 7 1 VacioM VacioM))
                 (M 3 1 VacioM VacioM))



                                                                 41 / 45
IM Tema 20: El TAD de los montículos
  Implementación de las colas de prioridad mediante montículos
     Las colas de prioridad como montículos



Las colas de prioridad como montículos
         vacia es la cola de prioridad vacía. Por ejemplo,
          vacia       CP Vacio

         vacia :: Ord a => CPrioridad a
         vacia = CP M.vacio




                                                                 42 / 45
IM Tema 20: El TAD de los montículos
  Implementación de las colas de prioridad mediante montículos
     Las colas de prioridad como montículos



Las colas de prioridad como montículos
         (inserta x c) añade el elemento x a la cola de prioridad c.
         Por ejemplo,
          ghci> inserta 5 cp1
          CP (M 1 2
                 (M 2 2
                    (M 9 1 VacioM VacioM)
                    (M 7 1 VacioM VacioM))
                 (M 3 1
                    (M 5 1 VacioM VacioM) VacioM))

         inserta :: Ord a => a -> CPrioridad a -> CPrioridad a
         inserta v (CP c) = CP (M.inserta v c)


                                                                       43 / 45
IM Tema 20: El TAD de los montículos
  Implementación de las colas de prioridad mediante montículos
     Las colas de prioridad como montículos



Las colas de prioridad como montículos
         (primero c) es la cabeza de la cola de prioridad c. Por ejemplo,
          primero cp1        1

         primero :: Ord a => CPrioridad a -> a
         primero (CP c) = M.menor c
         (resto c) elimina la cabeza de la cola de prioridad c. Por
         ejemplo,
          ghci> resto cp1
          CP (M 2 2
                  (M 9 1 VacioM VacioM)
                  (M 3 1
                     (M 7 1 VacioM VacioM) VacioM))

         resto :: Ord a => CPrioridad a -> CPrioridad a
         resto (CP c) = CP (M.resto c)                                      44 / 45
IM Tema 20: El TAD de los montículos
  Implementación de las colas de prioridad mediante montículos
     Las colas de prioridad como montículos



Las colas de prioridad como montículos
         (esVacia c) se verifica si la cola de prioridad c es vacía. Por
         ejemplo,
          esVacia cp1          False
          esVacia vacia        True

         esVacia :: Ord a => CPrioridad a -> Bool
         esVacia (CP c) = M.esVacio c

         (valida c) se verifica si c es una cola de prioridad válida. En la
         representación mediante montículo todas las colas de prioridad
         son válidas.

         valida :: Ord a => CPrioridad a -> Bool
         valida _ = True
                                                                             45 / 45

Más contenido relacionado

La actualidad más candente

La actualidad más candente (19)

Operadores lineales
Operadores linealesOperadores lineales
Operadores lineales
 
Control de trayectoria de manipulador robótico de
Control de trayectoria de manipulador robótico de Control de trayectoria de manipulador robótico de
Control de trayectoria de manipulador robótico de
 
Crea robot con matlab
Crea robot con matlabCrea robot con matlab
Crea robot con matlab
 
MANUAL CALCULADORA VOYAGE 12 transformaciones lineales
MANUAL CALCULADORA VOYAGE 12 transformaciones linealesMANUAL CALCULADORA VOYAGE 12 transformaciones lineales
MANUAL CALCULADORA VOYAGE 12 transformaciones lineales
 
P. final algebra lineal victoria silva
P. final algebra lineal victoria silvaP. final algebra lineal victoria silva
P. final algebra lineal victoria silva
 
Demostraciones transformaciones lineales
Demostraciones transformaciones linealesDemostraciones transformaciones lineales
Demostraciones transformaciones lineales
 
Clase intro mec_cinem_1_y_2
Clase intro mec_cinem_1_y_2Clase intro mec_cinem_1_y_2
Clase intro mec_cinem_1_y_2
 
Algebra Lineal - Transformaciones Lineales
Algebra Lineal - Transformaciones LinealesAlgebra Lineal - Transformaciones Lineales
Algebra Lineal - Transformaciones Lineales
 
Transformaciones lineales
Transformaciones linealesTransformaciones lineales
Transformaciones lineales
 
Lectura fundamental 6
Lectura fundamental 6Lectura fundamental 6
Lectura fundamental 6
 
Folleto segundo parcial
Folleto segundo parcialFolleto segundo parcial
Folleto segundo parcial
 
Aplicaciones de la derivada
Aplicaciones de la derivadaAplicaciones de la derivada
Aplicaciones de la derivada
 
Algebra Lineal
Algebra LinealAlgebra Lineal
Algebra Lineal
 
211 matlab senales
211 matlab senales211 matlab senales
211 matlab senales
 
Demostraciones de teoremas de transformaciones lineales
Demostraciones de teoremas de transformaciones linealesDemostraciones de teoremas de transformaciones lineales
Demostraciones de teoremas de transformaciones lineales
 
Cinematica
CinematicaCinematica
Cinematica
 
Cinematica
CinematicaCinematica
Cinematica
 
Algebra lienal
Algebra lienalAlgebra lienal
Algebra lienal
 
Lab 01 - Análisis de señales - UNTECS
Lab 01 - Análisis de señales - UNTECSLab 01 - Análisis de señales - UNTECS
Lab 01 - Análisis de señales - UNTECS
 

Destacado

DAO2011-T0: Presentación de sistemas de razonamiento automático
DAO2011-T0: Presentación de sistemas de razonamiento automáticoDAO2011-T0: Presentación de sistemas de razonamiento automático
DAO2011-T0: Presentación de sistemas de razonamiento automáticoJosé A. Alonso
 
I1M-T17: El TAD de los conjuntos
I1M-T17: El TAD de los conjuntosI1M-T17: El TAD de los conjuntos
I1M-T17: El TAD de los conjuntosJosé A. Alonso
 
LMF-T5: Resolución proposicional
LMF-T5: Resolución proposicionalLMF-T5: Resolución proposicional
LMF-T5: Resolución proposicionalJosé A. Alonso
 
I1M-T19: El TAD de los árboles de búsqueda
I1M-T19: El TAD de los árboles de búsquedaI1M-T19: El TAD de los árboles de búsqueda
I1M-T19: El TAD de los árboles de búsquedaJosé A. Alonso
 
I1M2010-T18: El TAD de las tablas en Haskell
I1M2010-T18: El TAD de las tablas en HaskellI1M2010-T18: El TAD de las tablas en Haskell
I1M2010-T18: El TAD de las tablas en HaskellJosé A. Alonso
 
I1M-T21: El TAD de los polinomios en Haskell
I1M-T21: El TAD de los polinomios en HaskellI1M-T21: El TAD de los polinomios en Haskell
I1M-T21: El TAD de los polinomios en HaskellJosé A. Alonso
 
LI-T12: LI2011-12: Introducción a la programación lógica con Prolog
LI-T12: LI2011-12: Introducción a la programación lógica con PrologLI-T12: LI2011-12: Introducción a la programación lógica con Prolog
LI-T12: LI2011-12: Introducción a la programación lógica con PrologJosé A. Alonso
 
I1M2010-T23: Técnicas de diseño descendente de algoritmos.
I1M2010-T23: Técnicas de diseño descendente de algoritmos.I1M2010-T23: Técnicas de diseño descendente de algoritmos.
I1M2010-T23: Técnicas de diseño descendente de algoritmos.José A. Alonso
 
I1M2010-T14: El tipo abstracto de datos de las pilas en Haskell
I1M2010-T14: El tipo abstracto de datos de las pilas en HaskellI1M2010-T14: El tipo abstracto de datos de las pilas en Haskell
I1M2010-T14: El tipo abstracto de datos de las pilas en HaskellJosé A. Alonso
 
I1M2010-T15: El tipo abstracto de datos de las colas en Haskell
I1M2010-T15: El tipo abstracto de datos de las colas en HaskellI1M2010-T15: El tipo abstracto de datos de las colas en Haskell
I1M2010-T15: El tipo abstracto de datos de las colas en HaskellJosé A. Alonso
 
Panorama de la demostración asistida por ordenador
Panorama de la demostración asistida por ordenadorPanorama de la demostración asistida por ordenador
Panorama de la demostración asistida por ordenadorJosé A. Alonso
 
Tema 12: Analizadores sintácticos funcionales.
Tema 12: Analizadores sintácticos funcionales.Tema 12: Analizadores sintácticos funcionales.
Tema 12: Analizadores sintácticos funcionales.José A. Alonso
 
I1M2010-T22: Algoritmos sobre grafos en Haskell
I1M2010-T22: Algoritmos sobre grafos en HaskellI1M2010-T22: Algoritmos sobre grafos en Haskell
I1M2010-T22: Algoritmos sobre grafos en HaskellJosé A. Alonso
 
Tema 2: Introducción a la programación con Haskell
Tema 2: Introducción a la programación con HaskellTema 2: Introducción a la programación con Haskell
Tema 2: Introducción a la programación con HaskellJosé A. Alonso
 
LMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer ordenLMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer ordenJosé A. Alonso
 
Panorama del razonamiento automático
Panorama del razonamiento automáticoPanorama del razonamiento automático
Panorama del razonamiento automáticoJosé A. Alonso
 
Tema 10: Evaluación perezosa en Haskell
Tema 10: Evaluación perezosa en HaskellTema 10: Evaluación perezosa en Haskell
Tema 10: Evaluación perezosa en HaskellJosé A. Alonso
 
Tema 23: Técnicas de diseño descendente de algoritmos
Tema 23: Técnicas de diseño descendente de algoritmosTema 23: Técnicas de diseño descendente de algoritmos
Tema 23: Técnicas de diseño descendente de algoritmosJosé A. Alonso
 
LMF-T1: Sintaxis y semántica de la lógica proposicional
LMF-T1: Sintaxis y semántica de la lógica proposicionalLMF-T1: Sintaxis y semántica de la lógica proposicional
LMF-T1: Sintaxis y semántica de la lógica proposicionalJosé A. Alonso
 

Destacado (20)

DAO2011-T0: Presentación de sistemas de razonamiento automático
DAO2011-T0: Presentación de sistemas de razonamiento automáticoDAO2011-T0: Presentación de sistemas de razonamiento automático
DAO2011-T0: Presentación de sistemas de razonamiento automático
 
I1M-T17: El TAD de los conjuntos
I1M-T17: El TAD de los conjuntosI1M-T17: El TAD de los conjuntos
I1M-T17: El TAD de los conjuntos
 
LMF-T5: Resolución proposicional
LMF-T5: Resolución proposicionalLMF-T5: Resolución proposicional
LMF-T5: Resolución proposicional
 
I1M-T19: El TAD de los árboles de búsqueda
I1M-T19: El TAD de los árboles de búsquedaI1M-T19: El TAD de los árboles de búsqueda
I1M-T19: El TAD de los árboles de búsqueda
 
I1M2010-T18: El TAD de las tablas en Haskell
I1M2010-T18: El TAD de las tablas en HaskellI1M2010-T18: El TAD de las tablas en Haskell
I1M2010-T18: El TAD de las tablas en Haskell
 
I1M-T21: El TAD de los polinomios en Haskell
I1M-T21: El TAD de los polinomios en HaskellI1M-T21: El TAD de los polinomios en Haskell
I1M-T21: El TAD de los polinomios en Haskell
 
LI-T12: LI2011-12: Introducción a la programación lógica con Prolog
LI-T12: LI2011-12: Introducción a la programación lógica con PrologLI-T12: LI2011-12: Introducción a la programación lógica con Prolog
LI-T12: LI2011-12: Introducción a la programación lógica con Prolog
 
I1M2010-T23: Técnicas de diseño descendente de algoritmos.
I1M2010-T23: Técnicas de diseño descendente de algoritmos.I1M2010-T23: Técnicas de diseño descendente de algoritmos.
I1M2010-T23: Técnicas de diseño descendente de algoritmos.
 
I1M2010-T14: El tipo abstracto de datos de las pilas en Haskell
I1M2010-T14: El tipo abstracto de datos de las pilas en HaskellI1M2010-T14: El tipo abstracto de datos de las pilas en Haskell
I1M2010-T14: El tipo abstracto de datos de las pilas en Haskell
 
LMF-T4: Formas normales
LMF-T4: Formas normalesLMF-T4: Formas normales
LMF-T4: Formas normales
 
I1M2010-T15: El tipo abstracto de datos de las colas en Haskell
I1M2010-T15: El tipo abstracto de datos de las colas en HaskellI1M2010-T15: El tipo abstracto de datos de las colas en Haskell
I1M2010-T15: El tipo abstracto de datos de las colas en Haskell
 
Panorama de la demostración asistida por ordenador
Panorama de la demostración asistida por ordenadorPanorama de la demostración asistida por ordenador
Panorama de la demostración asistida por ordenador
 
Tema 12: Analizadores sintácticos funcionales.
Tema 12: Analizadores sintácticos funcionales.Tema 12: Analizadores sintácticos funcionales.
Tema 12: Analizadores sintácticos funcionales.
 
I1M2010-T22: Algoritmos sobre grafos en Haskell
I1M2010-T22: Algoritmos sobre grafos en HaskellI1M2010-T22: Algoritmos sobre grafos en Haskell
I1M2010-T22: Algoritmos sobre grafos en Haskell
 
Tema 2: Introducción a la programación con Haskell
Tema 2: Introducción a la programación con HaskellTema 2: Introducción a la programación con Haskell
Tema 2: Introducción a la programación con Haskell
 
LMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer ordenLMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer orden
 
Panorama del razonamiento automático
Panorama del razonamiento automáticoPanorama del razonamiento automático
Panorama del razonamiento automático
 
Tema 10: Evaluación perezosa en Haskell
Tema 10: Evaluación perezosa en HaskellTema 10: Evaluación perezosa en Haskell
Tema 10: Evaluación perezosa en Haskell
 
Tema 23: Técnicas de diseño descendente de algoritmos
Tema 23: Técnicas de diseño descendente de algoritmosTema 23: Técnicas de diseño descendente de algoritmos
Tema 23: Técnicas de diseño descendente de algoritmos
 
LMF-T1: Sintaxis y semántica de la lógica proposicional
LMF-T1: Sintaxis y semántica de la lógica proposicionalLMF-T1: Sintaxis y semántica de la lógica proposicional
LMF-T1: Sintaxis y semántica de la lógica proposicional
 

Similar a I1M2010-T20: El tipo abstracto de los montículos en Haskell

I1M2010-T16: El tipo abstracto de las colas de prioridad en Haskell
I1M2010-T16: El tipo abstracto de las colas de prioridad en HaskellI1M2010-T16: El tipo abstracto de las colas de prioridad en Haskell
I1M2010-T16: El tipo abstracto de las colas de prioridad en HaskellJosé A. Alonso
 
Computacion i0415102arreglosbidimensionales
Computacion i0415102arreglosbidimensionalesComputacion i0415102arreglosbidimensionales
Computacion i0415102arreglosbidimensionaleslmes1603
 
Presentacion Modelo Markov
Presentacion Modelo MarkovPresentacion Modelo Markov
Presentacion Modelo MarkovAdriana Avila
 
Presentacion Modelo Markov
Presentacion Modelo MarkovPresentacion Modelo Markov
Presentacion Modelo MarkovAdriana Avila
 
Presentacion Modelo Markov
Presentacion Modelo MarkovPresentacion Modelo Markov
Presentacion Modelo Markovguest3066cc
 

Similar a I1M2010-T20: El tipo abstracto de los montículos en Haskell (9)

I1M2010-T16: El tipo abstracto de las colas de prioridad en Haskell
I1M2010-T16: El tipo abstracto de las colas de prioridad en HaskellI1M2010-T16: El tipo abstracto de las colas de prioridad en Haskell
I1M2010-T16: El tipo abstracto de las colas de prioridad en Haskell
 
Computacion i0415102arreglosbidimensionales
Computacion i0415102arreglosbidimensionalesComputacion i0415102arreglosbidimensionales
Computacion i0415102arreglosbidimensionales
 
Presentacion Modelo Markov
Presentacion Modelo MarkovPresentacion Modelo Markov
Presentacion Modelo Markov
 
Presentacion Modelo Markov
Presentacion Modelo MarkovPresentacion Modelo Markov
Presentacion Modelo Markov
 
Presentacion Modelo Markov
Presentacion Modelo MarkovPresentacion Modelo Markov
Presentacion Modelo Markov
 
Modelo Markov
Modelo MarkovModelo Markov
Modelo Markov
 
Ejercicios matenaticos
Ejercicios matenaticosEjercicios matenaticos
Ejercicios matenaticos
 
FUNCIONES DE STELLA
FUNCIONES DE STELLAFUNCIONES DE STELLA
FUNCIONES DE STELLA
 
Tarea no
Tarea noTarea no
Tarea no
 

Más de José A. Alonso

LMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer ordenLMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer ordenJosé A. Alonso
 
LMF-T5b: Aplicaciones de la lógica proposicional
LMF-T5b: Aplicaciones de la lógica proposicionalLMF-T5b: Aplicaciones de la lógica proposicional
LMF-T5b: Aplicaciones de la lógica proposicionalJosé A. Alonso
 
LMF-T3: Tableros semánticos
LMF-T3: Tableros semánticosLMF-T3: Tableros semánticos
LMF-T3: Tableros semánticosJosé A. Alonso
 
LMF-T2: Deducción natural proposicional
LMF-T2: Deducción natural proposicionalLMF-T2: Deducción natural proposicional
LMF-T2: Deducción natural proposicionalJosé A. Alonso
 
LI-T6: Sintaxis y semántica de la lógica de primer orden
LI-T6: Sintaxis y semántica de la lógica de primer ordenLI-T6: Sintaxis y semántica de la lógica de primer orden
LI-T6: Sintaxis y semántica de la lógica de primer ordenJosé A. Alonso
 
LI-T5b: Algoritmos para SAT. Aplicaciones
LI-T5b: Algoritmos para SAT. AplicacionesLI-T5b: Algoritmos para SAT. Aplicaciones
LI-T5b: Algoritmos para SAT. AplicacionesJosé A. Alonso
 
LI -T5: Resolución proposicional
LI -T5: Resolución proposicionalLI -T5: Resolución proposicional
LI -T5: Resolución proposicionalJosé A. Alonso
 
I1M2010-T24: Programación dinámica en Haskell
I1M2010-T24: Programación dinámica en HaskellI1M2010-T24: Programación dinámica en Haskell
I1M2010-T24: Programación dinámica en HaskellJosé A. Alonso
 
LI2011-T11: Resolución en lógica de primer orden
LI2011-T11: Resolución en lógica de primer ordenLI2011-T11: Resolución en lógica de primer orden
LI2011-T11: Resolución en lógica de primer ordenJosé A. Alonso
 
LI2011-T9: Formas normales de Skolem y cláusulas
LI2011-T9: Formas normales de Skolem y cláusulasLI2011-T9: Formas normales de Skolem y cláusulas
LI2011-T9: Formas normales de Skolem y cláusulasJosé A. Alonso
 
LI2011-T7: Deducción natural en lógica de primer orden
LI2011-T7: Deducción natural en lógica de primer ordenLI2011-T7: Deducción natural en lógica de primer orden
LI2011-T7: Deducción natural en lógica de primer ordenJosé A. Alonso
 
LIT4: Formales normales conjuntivas y disyuntivas
LIT4: Formales normales conjuntivas y disyuntivasLIT4: Formales normales conjuntivas y disyuntivas
LIT4: Formales normales conjuntivas y disyuntivasJosé A. Alonso
 
LI2011-T3: Tableros semánticos proposicionales
LI2011-T3: Tableros semánticos proposicionalesLI2011-T3: Tableros semánticos proposicionales
LI2011-T3: Tableros semánticos proposicionalesJosé A. Alonso
 

Más de José A. Alonso (13)

LMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer ordenLMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer orden
 
LMF-T5b: Aplicaciones de la lógica proposicional
LMF-T5b: Aplicaciones de la lógica proposicionalLMF-T5b: Aplicaciones de la lógica proposicional
LMF-T5b: Aplicaciones de la lógica proposicional
 
LMF-T3: Tableros semánticos
LMF-T3: Tableros semánticosLMF-T3: Tableros semánticos
LMF-T3: Tableros semánticos
 
LMF-T2: Deducción natural proposicional
LMF-T2: Deducción natural proposicionalLMF-T2: Deducción natural proposicional
LMF-T2: Deducción natural proposicional
 
LI-T6: Sintaxis y semántica de la lógica de primer orden
LI-T6: Sintaxis y semántica de la lógica de primer ordenLI-T6: Sintaxis y semántica de la lógica de primer orden
LI-T6: Sintaxis y semántica de la lógica de primer orden
 
LI-T5b: Algoritmos para SAT. Aplicaciones
LI-T5b: Algoritmos para SAT. AplicacionesLI-T5b: Algoritmos para SAT. Aplicaciones
LI-T5b: Algoritmos para SAT. Aplicaciones
 
LI -T5: Resolución proposicional
LI -T5: Resolución proposicionalLI -T5: Resolución proposicional
LI -T5: Resolución proposicional
 
I1M2010-T24: Programación dinámica en Haskell
I1M2010-T24: Programación dinámica en HaskellI1M2010-T24: Programación dinámica en Haskell
I1M2010-T24: Programación dinámica en Haskell
 
LI2011-T11: Resolución en lógica de primer orden
LI2011-T11: Resolución en lógica de primer ordenLI2011-T11: Resolución en lógica de primer orden
LI2011-T11: Resolución en lógica de primer orden
 
LI2011-T9: Formas normales de Skolem y cláusulas
LI2011-T9: Formas normales de Skolem y cláusulasLI2011-T9: Formas normales de Skolem y cláusulas
LI2011-T9: Formas normales de Skolem y cláusulas
 
LI2011-T7: Deducción natural en lógica de primer orden
LI2011-T7: Deducción natural en lógica de primer ordenLI2011-T7: Deducción natural en lógica de primer orden
LI2011-T7: Deducción natural en lógica de primer orden
 
LIT4: Formales normales conjuntivas y disyuntivas
LIT4: Formales normales conjuntivas y disyuntivasLIT4: Formales normales conjuntivas y disyuntivas
LIT4: Formales normales conjuntivas y disyuntivas
 
LI2011-T3: Tableros semánticos proposicionales
LI2011-T3: Tableros semánticos proposicionalesLI2011-T3: Tableros semánticos proposicionales
LI2011-T3: Tableros semánticos proposicionales
 

Último

Evaluacion Diagnostica Matematica 5to C2 Secundaria Ccesa007.pdf
Evaluacion Diagnostica Matematica 5to  C2 Secundaria Ccesa007.pdfEvaluacion Diagnostica Matematica 5to  C2 Secundaria Ccesa007.pdf
Evaluacion Diagnostica Matematica 5to C2 Secundaria Ccesa007.pdfDemetrio Ccesa Rayme
 
Ejemplo de trabajo de TIC´s CON VARIAS OPCIONES DE LAS TAREAS
Ejemplo de trabajo de TIC´s CON VARIAS OPCIONES DE LAS TAREASEjemplo de trabajo de TIC´s CON VARIAS OPCIONES DE LAS TAREAS
Ejemplo de trabajo de TIC´s CON VARIAS OPCIONES DE LAS TAREASJavier Sanchez
 
EL BRILLO DEL ECLIPSE (CUENTO LITERARIO). Autor y diseñador JAVIER SOLIS NOYOLA
EL BRILLO DEL ECLIPSE (CUENTO LITERARIO). Autor y diseñador JAVIER SOLIS NOYOLAEL BRILLO DEL ECLIPSE (CUENTO LITERARIO). Autor y diseñador JAVIER SOLIS NOYOLA
EL BRILLO DEL ECLIPSE (CUENTO LITERARIO). Autor y diseñador JAVIER SOLIS NOYOLAJAVIER SOLIS NOYOLA
 
ficha de aplicacion para estudiantes El agua para niños de primaria
ficha de aplicacion para estudiantes El agua para niños de primariaficha de aplicacion para estudiantes El agua para niños de primaria
ficha de aplicacion para estudiantes El agua para niños de primariamichel carlos Capillo Dominguez
 
Tarea 2 - Sociologia de la organizacion-1.docx
Tarea 2 - Sociologia de la organizacion-1.docxTarea 2 - Sociologia de la organizacion-1.docx
Tarea 2 - Sociologia de la organizacion-1.docxmiguelramosvse
 
TECNOLOGÍA EDUCATIVA, USO DE LAS TIC.pptx
TECNOLOGÍA EDUCATIVA, USO DE LAS TIC.pptxTECNOLOGÍA EDUCATIVA, USO DE LAS TIC.pptx
TECNOLOGÍA EDUCATIVA, USO DE LAS TIC.pptxFranciscoCruz296518
 
SIANET - GUÍA SOBRE COMO CREAR EVALUACIONES.pdf
SIANET  - GUÍA SOBRE COMO CREAR EVALUACIONES.pdfSIANET  - GUÍA SOBRE COMO CREAR EVALUACIONES.pdf
SIANET - GUÍA SOBRE COMO CREAR EVALUACIONES.pdfNELLYKATTY
 
Tema 4 Rocas sedimentarias, características y clasificación
Tema 4 Rocas sedimentarias, características y clasificaciónTema 4 Rocas sedimentarias, características y clasificación
Tema 4 Rocas sedimentarias, características y clasificaciónIES Vicent Andres Estelles
 
Recursos Tecnológicos, página AIP-CRT 2 0 2 4.pdf
Recursos Tecnológicos, página  AIP-CRT 2 0 2 4.pdfRecursos Tecnológicos, página  AIP-CRT 2 0 2 4.pdf
Recursos Tecnológicos, página AIP-CRT 2 0 2 4.pdfNELLYKATTY
 
la forma de los objetos expresión gráfica preescolar
la forma de los objetos expresión gráfica preescolarla forma de los objetos expresión gráfica preescolar
la forma de los objetos expresión gráfica preescolarCa Ut
 
GUÍA SIANET - Agenda - Tareas - Archivos - Participaciones - Notas.pdf
GUÍA SIANET - Agenda - Tareas - Archivos - Participaciones - Notas.pdfGUÍA SIANET - Agenda - Tareas - Archivos - Participaciones - Notas.pdf
GUÍA SIANET - Agenda - Tareas - Archivos - Participaciones - Notas.pdfNELLYKATTY
 
Xardín de San Carlos (A Coruña) IES Monelos
Xardín de San Carlos (A Coruña) IES MonelosXardín de San Carlos (A Coruña) IES Monelos
Xardín de San Carlos (A Coruña) IES MonelosAgrela Elvixeo
 
PSICOLOGÍA. UNA INTRODUCCIÓN. ALCIRA ORSINI Y LETICIA BOSSELLINI 3.pdf
PSICOLOGÍA. UNA INTRODUCCIÓN. ALCIRA ORSINI Y LETICIA BOSSELLINI 3.pdfPSICOLOGÍA. UNA INTRODUCCIÓN. ALCIRA ORSINI Y LETICIA BOSSELLINI 3.pdf
PSICOLOGÍA. UNA INTRODUCCIÓN. ALCIRA ORSINI Y LETICIA BOSSELLINI 3.pdfCarlosAntonio456574
 
Evaluacion Diagnostica Matematica 2do C2 Secundaria Ccesa007.pdf
Evaluacion Diagnostica Matematica 2do C2 Secundaria Ccesa007.pdfEvaluacion Diagnostica Matematica 2do C2 Secundaria Ccesa007.pdf
Evaluacion Diagnostica Matematica 2do C2 Secundaria Ccesa007.pdfDemetrio Ccesa Rayme
 
Kirpi-el-erizo libro descargar pdf 1 link
Kirpi-el-erizo libro descargar pdf 1 linkKirpi-el-erizo libro descargar pdf 1 link
Kirpi-el-erizo libro descargar pdf 1 linkMaximilianoMaldonado17
 
Concurso de Innovación Pedagógica T3 FONDEP 2024 Ccesa007.pdf
Concurso de Innovación Pedagógica  T3  FONDEP 2024 Ccesa007.pdfConcurso de Innovación Pedagógica  T3  FONDEP 2024 Ccesa007.pdf
Concurso de Innovación Pedagógica T3 FONDEP 2024 Ccesa007.pdfDemetrio Ccesa Rayme
 
Tecnología educativa en la era actual .pptx
Tecnología educativa en la era actual .pptxTecnología educativa en la era actual .pptx
Tecnología educativa en la era actual .pptxJulioSantin2
 

Último (20)

Evaluacion Diagnostica Matematica 5to C2 Secundaria Ccesa007.pdf
Evaluacion Diagnostica Matematica 5to  C2 Secundaria Ccesa007.pdfEvaluacion Diagnostica Matematica 5to  C2 Secundaria Ccesa007.pdf
Evaluacion Diagnostica Matematica 5to C2 Secundaria Ccesa007.pdf
 
Ejemplo de trabajo de TIC´s CON VARIAS OPCIONES DE LAS TAREAS
Ejemplo de trabajo de TIC´s CON VARIAS OPCIONES DE LAS TAREASEjemplo de trabajo de TIC´s CON VARIAS OPCIONES DE LAS TAREAS
Ejemplo de trabajo de TIC´s CON VARIAS OPCIONES DE LAS TAREAS
 
EL BRILLO DEL ECLIPSE (CUENTO LITERARIO). Autor y diseñador JAVIER SOLIS NOYOLA
EL BRILLO DEL ECLIPSE (CUENTO LITERARIO). Autor y diseñador JAVIER SOLIS NOYOLAEL BRILLO DEL ECLIPSE (CUENTO LITERARIO). Autor y diseñador JAVIER SOLIS NOYOLA
EL BRILLO DEL ECLIPSE (CUENTO LITERARIO). Autor y diseñador JAVIER SOLIS NOYOLA
 
ficha de aplicacion para estudiantes El agua para niños de primaria
ficha de aplicacion para estudiantes El agua para niños de primariaficha de aplicacion para estudiantes El agua para niños de primaria
ficha de aplicacion para estudiantes El agua para niños de primaria
 
Sesión de clase ES: Adoración sin fin...
Sesión de clase ES: Adoración sin fin...Sesión de clase ES: Adoración sin fin...
Sesión de clase ES: Adoración sin fin...
 
Tarea 2 - Sociologia de la organizacion-1.docx
Tarea 2 - Sociologia de la organizacion-1.docxTarea 2 - Sociologia de la organizacion-1.docx
Tarea 2 - Sociologia de la organizacion-1.docx
 
SITUACIÓN ACTUAL DE LA INVESTIGACIÓN. ENFERMERÍA
SITUACIÓN ACTUAL DE LA INVESTIGACIÓN. ENFERMERÍASITUACIÓN ACTUAL DE LA INVESTIGACIÓN. ENFERMERÍA
SITUACIÓN ACTUAL DE LA INVESTIGACIÓN. ENFERMERÍA
 
TECNOLOGÍA EDUCATIVA, USO DE LAS TIC.pptx
TECNOLOGÍA EDUCATIVA, USO DE LAS TIC.pptxTECNOLOGÍA EDUCATIVA, USO DE LAS TIC.pptx
TECNOLOGÍA EDUCATIVA, USO DE LAS TIC.pptx
 
SIANET - GUÍA SOBRE COMO CREAR EVALUACIONES.pdf
SIANET  - GUÍA SOBRE COMO CREAR EVALUACIONES.pdfSIANET  - GUÍA SOBRE COMO CREAR EVALUACIONES.pdf
SIANET - GUÍA SOBRE COMO CREAR EVALUACIONES.pdf
 
Tema 4 Rocas sedimentarias, características y clasificación
Tema 4 Rocas sedimentarias, características y clasificaciónTema 4 Rocas sedimentarias, características y clasificación
Tema 4 Rocas sedimentarias, características y clasificación
 
Recursos Tecnológicos, página AIP-CRT 2 0 2 4.pdf
Recursos Tecnológicos, página  AIP-CRT 2 0 2 4.pdfRecursos Tecnológicos, página  AIP-CRT 2 0 2 4.pdf
Recursos Tecnológicos, página AIP-CRT 2 0 2 4.pdf
 
la forma de los objetos expresión gráfica preescolar
la forma de los objetos expresión gráfica preescolarla forma de los objetos expresión gráfica preescolar
la forma de los objetos expresión gráfica preescolar
 
GUÍA SIANET - Agenda - Tareas - Archivos - Participaciones - Notas.pdf
GUÍA SIANET - Agenda - Tareas - Archivos - Participaciones - Notas.pdfGUÍA SIANET - Agenda - Tareas - Archivos - Participaciones - Notas.pdf
GUÍA SIANET - Agenda - Tareas - Archivos - Participaciones - Notas.pdf
 
Xardín de San Carlos (A Coruña) IES Monelos
Xardín de San Carlos (A Coruña) IES MonelosXardín de San Carlos (A Coruña) IES Monelos
Xardín de San Carlos (A Coruña) IES Monelos
 
PSICOLOGÍA. UNA INTRODUCCIÓN. ALCIRA ORSINI Y LETICIA BOSSELLINI 3.pdf
PSICOLOGÍA. UNA INTRODUCCIÓN. ALCIRA ORSINI Y LETICIA BOSSELLINI 3.pdfPSICOLOGÍA. UNA INTRODUCCIÓN. ALCIRA ORSINI Y LETICIA BOSSELLINI 3.pdf
PSICOLOGÍA. UNA INTRODUCCIÓN. ALCIRA ORSINI Y LETICIA BOSSELLINI 3.pdf
 
Evaluacion Diagnostica Matematica 2do C2 Secundaria Ccesa007.pdf
Evaluacion Diagnostica Matematica 2do C2 Secundaria Ccesa007.pdfEvaluacion Diagnostica Matematica 2do C2 Secundaria Ccesa007.pdf
Evaluacion Diagnostica Matematica 2do C2 Secundaria Ccesa007.pdf
 
Kirpi-el-erizo libro descargar pdf 1 link
Kirpi-el-erizo libro descargar pdf 1 linkKirpi-el-erizo libro descargar pdf 1 link
Kirpi-el-erizo libro descargar pdf 1 link
 
Tema 5.- BASES DE DATOS Y GESTIÓN DE LA INF. PARA EL MARKETING.pdf
Tema 5.- BASES DE DATOS Y GESTIÓN DE LA INF. PARA EL MARKETING.pdfTema 5.- BASES DE DATOS Y GESTIÓN DE LA INF. PARA EL MARKETING.pdf
Tema 5.- BASES DE DATOS Y GESTIÓN DE LA INF. PARA EL MARKETING.pdf
 
Concurso de Innovación Pedagógica T3 FONDEP 2024 Ccesa007.pdf
Concurso de Innovación Pedagógica  T3  FONDEP 2024 Ccesa007.pdfConcurso de Innovación Pedagógica  T3  FONDEP 2024 Ccesa007.pdf
Concurso de Innovación Pedagógica T3 FONDEP 2024 Ccesa007.pdf
 
Tecnología educativa en la era actual .pptx
Tecnología educativa en la era actual .pptxTecnología educativa en la era actual .pptx
Tecnología educativa en la era actual .pptx
 

I1M2010-T20: El tipo abstracto de los montículos en Haskell

  • 1. Tema 20: El TAD de los montículos Informática (2010–11) José A. Alonso Jiménez Grupo de Lógica Computacional Departamento de Ciencias de la Computación e I.A. Universidad de Sevilla
  • 2. IM Tema 20: El TAD de los montículos Tema 20: El TAD de los montículos 1. Especificación del TAD de los montículos Signatura del TAD de los montículos Propiedades del TAD de los montículos 2. Implementación del TAD de los montículos Los montículos como tipo de dato algebraico 3. Comprobación de la implementación con QuickCheck Librerías auxiliares Generador de montículos Especificación de las propiedades de los montículos Comprobación de las propiedades 4. Implementación de las colas de prioridad mediante montículos Las colas de prioridad como montículos 2 / 45
  • 3. IM Tema 20: El TAD de los montículos Especificación del TAD de los montículos Signatura del TAD de los montículos Tema 20: El TAD de los montículos 1. Especificación del TAD de los montículos Signatura del TAD de los montículos Propiedades del TAD de los montículos 2. Implementación del TAD de los montículos 3. Comprobación de la implementación con QuickCheck 4. Implementación de las colas de prioridad mediante montículos 3 / 45
  • 4. IM Tema 20: El TAD de los montículos Especificación del TAD de los montículos Signatura del TAD de los montículos Descripción de los montículos Un montículo es un árbol binario en el que los valores de cada nodo es menor o igual que los valores de sus hijos. Por ejemplo, 1 1 / / / / 2 6 3 6 / / / / 3 8 9 7 4 2 9 7 el de la izquierda es un montículo, pero el de la derecha no lo es. 4 / 45
  • 5. IM Tema 20: El TAD de los montículos Especificación del TAD de los montículos Signatura del TAD de los montículos Signatura del TAD de los montículos Signatura: vacio :: Ord a => Monticulo a inserta :: Ord a => a -> Monticulo a -> Monticulo a menor :: Ord a => Monticulo a -> a resto :: Ord a => Monticulo a -> Monticulo a esVacio :: Ord a => Monticulo a -> Bool valido :: Ord a => Monticulo a -> Bool 5 / 45
  • 6. IM Tema 20: El TAD de los montículos Especificación del TAD de los montículos Signatura del TAD de los montículos Signatura del TAD de los montículos Descripción de las operaciones: vacio es el montículo vacío. (inserta x m) es el montículo obtenido añadiendo el elemento x al montículo m. (menor m) es el menor elemento del montículo m. (resto m) es el montículo obtenido eliminando el menor elemento del montículo m. (esVacio m) se verifica si m es el montículo vacío. (valido m) se verifica si m es un montículo; es decir, es un árbol binario en el que los valores de cada nodo es menor o igual que los valores de sus hijos. 6 / 45
  • 7. IM Tema 20: El TAD de los montículos Especificación del TAD de los montículos Propiedades del TAD de los montículos Tema 20: El TAD de los montículos 1. Especificación del TAD de los montículos Signatura del TAD de los montículos Propiedades del TAD de los montículos 2. Implementación del TAD de los montículos 3. Comprobación de la implementación con QuickCheck 4. Implementación de las colas de prioridad mediante montículos 7 / 45
  • 8. IM Tema 20: El TAD de los montículos Especificación del TAD de los montículos Propiedades del TAD de los montículos Propiedades del TAD de los montículos 1. esVacio vacio 2. valido (inserta x m) 3. not (esVacio (inserta x m)) 4. not (esVacio m) ==> valido (resto m) 5. resto (inserta x vacio) == vacio 6. x <= menor m ==> resto (inserta x m) == m 7. Si m es no vacío y x > menor m, entonces resto (inserta x m) == inserta x (resto m) 8. esVacio m || esVacio (resto m) || menor m <= menor (resto m) 8 / 45
  • 9. IM Tema 20: El TAD de los montículos Implementación del TAD de los montículos Los montículos como tipo de dato algebraico Tema 20: El TAD de los montículos 1. Especificación del TAD de los montículos 2. Implementación del TAD de los montículos Los montículos como tipo de dato algebraico 3. Comprobación de la implementación con QuickCheck 4. Implementación de las colas de prioridad mediante montículos 9 / 45
  • 10. IM Tema 20: El TAD de los montículos Implementación del TAD de los montículos Los montículos como tipo de dato algebraico Los montículos como tipo de dato algebraico Cabecera del módulo: module Monticulo (Monticulo, vacio, -- Ord a => Monticulo a inserta, -- Ord a => a -> Monticulo a -> Monticulo a menor, -- Ord a => Monticulo a -> a resto, -- Ord a => Monticulo a -> Monticulo a esVacio, -- Ord a => Monticulo a -> Bool valido -- Ord a => Monticulo a -> Bool ) where Librería auxiliar: import Data.List (sort) 10 / 45
  • 11. IM Tema 20: El TAD de los montículos Implementación del TAD de los montículos Los montículos como tipo de dato algebraico Los montículos como tipo de dato algebraico Los montículos como tipo de dato algebraico data Ord a => Monticulo a = Vacio | M a Int (Monticulo a) (Monticulo a) deriving Show La forma de los montículos no vacío es (M v r i d) donde v es el valor de la raíz del montículo. r es el rango del montículo; es decir, la menor distancia de la raíz a un montículo vacío. i es el submontículo izquierdo y f es el submontículo derecho. 11 / 45
  • 12. IM Tema 20: El TAD de los montículos Implementación del TAD de los montículos Los montículos como tipo de dato algebraico Los montículos como tipo de dato algebraico Ejemplos de montículos Definición: m1, m2, m3 :: Monticulo Int m1 = foldr inserta vacio [6,1,4,8] m2 = foldr inserta vacio [7,5] m3 = mezcla m1 m2 Representación: m1 m2 m3 (1,2) (1,2) (5,1) / / / / (4,1) (6,1) (7,1) (5,2) (4,1) / / / (8,1) (7,1) (6,1) (8,1) 12 / 45
  • 13. IM Tema 20: El TAD de los montículos Implementación del TAD de los montículos Los montículos como tipo de dato algebraico Los montículos como tipo de dato algebraico vacio es el montículo vacío. vacio :: Ord a => Monticulo a vacio = Vacio (rango m) es el rango del montículo m; es decir, la menor distancia a un montículo vacío. Por ejemplo, rango m1 2 rango m2 1 rango :: Ord a => Monticulo a -> Int rango Vacio = 0 rango (M _ r _ _) = r 13 / 45
  • 14. IM Tema 20: El TAD de los montículos Implementación del TAD de los montículos Los montículos como tipo de dato algebraico Los montículos como tipo de dato algebraico (creaM x a b) es el montículo creado a partir del elemento x y los montículos a y b. Se supone que x es menor o igual que el mínimo de a y de b. Por ejemplo, ghci> m1 M 1 2 (M 4 1 (M 8 1 Vacio Vacio) Vacio) (M 6 1 Vacio Vacio) ghci> m2 M 5 1 (M 7 1 Vacio Vacio) Vacio ghci> creaM 0 m1 m2 M 0 2 (M 1 2 (M 4 1 (M 8 1 Vacio Vacio) Vacio) (M 6 1 Vacio V (M 5 1 (M 7 1 Vacio Vacio) Vacio) creaM :: Ord a => a -> Monticulo a -> Monticulo a -> Monticulo creaM x a b | rango a >= rango b = M x (rango b + 1) a b | otherwise = M x (rango a + 1) b a 14 / 45
  • 15. IM Tema 20: El TAD de los montículos Implementación del TAD de los montículos Los montículos como tipo de dato algebraico Los montículos como tipo de dato algebraico (mezcla m1 m2) es el montículo obtenido mezclando los montículos m1 y m2. Por ejemplo, ghci> mezcla m1 m2 M 1 2 (M 5 2 (M 7 1 Vacio Vacio) (M 6 1 Vacio Vacio)) (M 4 1 (M 8 1 Vacio Vacio) Vacio) mezcla :: Ord a => Monticulo a -> Monticulo a -> Monticulo a mezcla h Vacio = h mezcla Vacio h = h mezcla h1@(M x _ a1 b1) h2@(M y _ a2 b2) | x <= y = creaM x a1 (mezcla b1 h2) | otherwise = creaM y a2 (mezcla h1 b2) 15 / 45
  • 16. IM Tema 20: El TAD de los montículos Implementación del TAD de los montículos Los montículos como tipo de dato algebraico Los montículos como tipo de dato algebraico (inserta x m) es el montículo obtenido añadiendo el elemento x al montículo m. Por ejemplo, ghci> m1 M 1 2 (M 4 1 (M 8 1 Vacio Vacio) Vacio) (M 6 1 Vacio Vacio) ghci> inserta 3 m1 M 1 2 (M 4 1 (M 8 1 Vacio Vacio) Vacio) (M 3 1 (M 6 1 Vacio Vacio) Vacio) inserta :: Ord a => a -> Monticulo a -> Monticulo a inserta x m = mezcla (M x 1 Vacio Vacio) m 16 / 45
  • 17. IM Tema 20: El TAD de los montículos Implementación del TAD de los montículos Los montículos como tipo de dato algebraico Los montículos como tipo de dato algebraico (menor m) es el menor elemento del montículo m. Por ejemplo, menor m1 1 menor m2 5 menor :: Ord a => Monticulo a -> a menor (M x _ _ _) = x menor Vacio = error "menor: monticulo vacio" (resto m) es el montículo obtenido eliminando el menor elemento del montículo m. Por ejemplo, ghci> resto m1 M 4 2 (M 8 1 Vacio Vacio) (M 6 1 Vacio Vacio) resto :: Ord a => Monticulo a -> Monticulo a resto Vacio = error "resto: monticulo vacio" resto (M x _ a b) = mezcla a b 17 / 45
  • 18. IM Tema 20: El TAD de los montículos Implementación del TAD de los montículos Los montículos como tipo de dato algebraico Los montículos como tipo de dato algebraico (esVacio m) se verifica si m es el montículo vacío. esVacio :: Ord a => Monticulo a -> Bool esVacio Vacio = True esVacio _ = False 18 / 45
  • 19. IM Tema 20: El TAD de los montículos Implementación del TAD de los montículos Los montículos como tipo de dato algebraico Los montículos como tipo de dato algebraico (valido m) se verifica si m es un montículo; es decir, es un árbol binario en el que los valores de cada nodo es menor o igual que los valores de sus hijos. Por ejemplo, valido m1 True valido (M 3 5 (M 2 1 Vacio Vacio) Vacio) False valido :: Ord a => Monticulo a -> Bool valido Vacio = True valido (M x _ Vacio Vacio) = True valido (M x _ m1@(M x1 n1 a1 b1) Vacio) = x <= x1 && valido m1 valido (M x _ Vacio m2@(M x2 n2 a2 b2)) = x <= x2 && valido m2 valido (M x _ m1@(M x1 n1 a1 b1) m2@(M x2 n2 a2 b2)) = x <= x1 && valido m1 && x <= x2 && valido m2 19 / 45
  • 20. IM Tema 20: El TAD de los montículos Implementación del TAD de los montículos Los montículos como tipo de dato algebraico Los montículos como tipo de dato algebraico (elementos m) es la lista de los elementos del montículo m. Por ejemplo, elementos m1 [1,4,8,6] elementos :: Ord a => Monticulo a -> [a] elementos Vacio = [] elementos (M x _ a b) = x : elementos a ++ elementos b 20 / 45
  • 21. IM Tema 20: El TAD de los montículos Implementación del TAD de los montículos Los montículos como tipo de dato algebraico Los montículos como tipo de dato algebraico (equivMonticulos m1 m2) se verifica si los montículos m1 y m2 tienen los mismos elementos. Por ejemplo, ghci> m1 M 1 2 (M 4 1 (M 8 1 Vacio Vacio) Vacio) (M 6 1 Vacio Vacio) ghci> let m1' = foldr inserta vacio [6,8,4,1] M 1 2 (M 4 1 Vacio Vacio) (M 6 1 (M 8 1 Vacio Vacio) Vacio) ghci> equivMonticulos m1 m1' True equivMonticulos :: Ord a => Monticulo a -> Monticulo a -> Bool equivMonticulos m1 m2 = sort (elementos m1) == sort (elementos m2) 21 / 45
  • 22. IM Tema 20: El TAD de los montículos Implementación del TAD de los montículos Los montículos como tipo de dato algebraico Los montículos como tipo de dato algebraico Los montículos son comparables por igualdad. instance Ord a => Eq (Monticulo a) where (==) = equivMonticulos 22 / 45
  • 23. IM Tema 20: El TAD de los montículos Comprobación de la implementación con QuickCheck Librerías auxiliares Tema 20: El TAD de los montículos 1. Especificación del TAD de los montículos 2. Implementación del TAD de los montículos 3. Comprobación de la implementación con QuickCheck Librerías auxiliares Generador de montículos Especificación de las propiedades de los montículos Comprobación de las propiedades 4. Implementación de las colas de prioridad mediante montículos 23 / 45
  • 24. IM Tema 20: El TAD de los montículos Comprobación de la implementación con QuickCheck Librerías auxiliares Comprobación de las propiedades del TAD de los montículos Importación de la implementación a verificar. import Monticulo Importación de librerías auxiliares. import Test.QuickCheck import Test.Framework import Test.Framework.Providers.QuickCheck2 24 / 45
  • 25. IM Tema 20: El TAD de los montículos Comprobación de la implementación con QuickCheck Generador de montículos Tema 20: El TAD de los montículos 1. Especificación del TAD de los montículos 2. Implementación del TAD de los montículos 3. Comprobación de la implementación con QuickCheck Librerías auxiliares Generador de montículos Especificación de las propiedades de los montículos Comprobación de las propiedades 4. Implementación de las colas de prioridad mediante montículos 25 / 45
  • 26. IM Tema 20: El TAD de los montículos Comprobación de la implementación con QuickCheck Generador de montículos Generador de montículos (creaMonticulo xs) es el montículo correspondiente a la lista xs. Por ejemplo, ghci> creaMonticulo [6,1,4,8] M 1 2 (M 4 1 (M 8 1 Vacio Vacio) Vacio) (M 6 1 Vacio Vacio) ghci> creaMonticulo [6,8,4,1] M 1 2 (M 4 1 Vacio Vacio) (M 6 1 (M 8 1 Vacio Vacio) Vacio) creaMonticulo :: [Int] -> Monticulo Int creaMonticulo = foldr inserta vacio 26 / 45
  • 27. IM Tema 20: El TAD de los montículos Comprobación de la implementación con QuickCheck Generador de montículos Generador de montículos genMonticulo es un generador de montículos. Por ejemplo, ghci> sample genMonticulo VacioM M (-1) 1 (M 1 1 VacioM VacioM) VacioM ... genMonticulo :: Gen (Monticulo Int) genMonticulo = do xs <- listOf arbitrary return (creaMonticulo xs) instance Arbitrary (Monticulo Int) where arbitrary = genMonticulo 27 / 45
  • 28. IM Tema 20: El TAD de los montículos Comprobación de la implementación con QuickCheck Generador de montículos Corrección del generador de montículos Prop.: genMonticulo genera montículos válidos. prop_genMonticulo :: Monticulo Int -> Bool prop_genMonticulo m = valido m Comprobación: ghci> quickCheck prop_genMonticulo +++ OK, passed 100 tests. 28 / 45
  • 29. IM Tema 20: El TAD de los montículos Comprobación de la implementación con QuickCheck Generador de montículos Generador de montículos no vacíos monticuloNV es un generador de montículos no vacío. Por ejemplo, ghci> sample monticuloNV M 0 1 VacioM VacioM M 1 1 (M 1 1 (M 1 1 VacioM VacioM) VacioM) VacioM ... monticuloNV :: Gen (Monticulo Int) monticuloNV = do xs <- listOf arbitrary x <- arbitrary return (creaMonticulo (x:xs)) 29 / 45
  • 30. IM Tema 20: El TAD de los montículos Comprobación de la implementación con QuickCheck Generador de montículos Corrección del generador de montículos no vacíos Prop.: monticuloNV genera montículos no vacío. prop_monticuloNV :: Monticulo Int -> Property prop_monticuloNV m = forAll monticuloNV (m -> (valido m) && not (esVacio m)) Comprobación: ghci> quickCheck prop_monticuloNV +++ OK, passed 100 tests. 30 / 45
  • 31. IM Tema 20: El TAD de los montículos Comprobación de la implementación con QuickCheck Especificación de las propiedades de los montículos Tema 20: El TAD de los montículos 1. Especificación del TAD de los montículos 2. Implementación del TAD de los montículos 3. Comprobación de la implementación con QuickCheck Librerías auxiliares Generador de montículos Especificación de las propiedades de los montículos Comprobación de las propiedades 4. Implementación de las colas de prioridad mediante montículos 31 / 45
  • 32. IM Tema 20: El TAD de los montículos Comprobación de la implementación con QuickCheck Especificación de las propiedades de los montículos Especificación de las propiedades de los montículos vacio es un montículo. prop_vacio_es_monticulo :: Bool prop_vacio_es_monticulo = esVacio (vacio :: Monticulo Int) inserta produce montículos válidos. prop_inserta_es_valida :: Int -> Monticulo Int -> Bool prop_inserta_es_valida x m = valido (inserta x m) 32 / 45
  • 33. IM Tema 20: El TAD de los montículos Comprobación de la implementación con QuickCheck Especificación de las propiedades de los montículos Especificación de las propiedades de los montículos Los montículos creados con inserta son no vacío. prop_inserta_no_vacio :: Int -> Monticulo Int -> Bool prop_inserta_no_vacio x m = not (esVacio (inserta x m)) Al borrar el menor elemento de un montículo no vacío se obtiene un montículo válido. prop_resto_es_valida :: Monticulo Int -> Property prop_resto_es_valida m = forAll monticuloNV (m -> valido (resto m)) 33 / 45
  • 34. IM Tema 20: El TAD de los montículos Comprobación de la implementación con QuickCheck Especificación de las propiedades de los montículos Especificación de las propiedades de los montículos El resto de (inserta x m) es m si m es el montículo vacío o x es menor o igual que el menor elemento de m y es (inserta x (resto m)), en caso contrario. prop_resto_inserta :: Int -> Monticulo Int -> Bool prop_resto_inserta x m = resto (inserta x m) == if esVacio m || x <= menor m then m else inserta x (resto m) (menor m) es el menor elemento del montículo m. prop_menor_es_minimo :: Monticulo Int -> Bool prop_menor_es_minimo m = esVacio m || esVacio (resto m) || menor m <= menor (resto m) 34 / 45
  • 35. IM Tema 20: El TAD de los montículos Comprobación de la implementación con QuickCheck Comprobación de las propiedades Tema 20: El TAD de los montículos 1. Especificación del TAD de los montículos 2. Implementación del TAD de los montículos 3. Comprobación de la implementación con QuickCheck Librerías auxiliares Generador de montículos Especificación de las propiedades de los montículos Comprobación de las propiedades 4. Implementación de las colas de prioridad mediante montículos 35 / 45
  • 36. IM Tema 20: El TAD de los montículos Comprobación de la implementación con QuickCheck Comprobación de las propiedades Definición del procedimiento de comprobación compruebaPropiedades comprueba todas las propiedades con la plataforma de verificación. compruebaPropiedades = defaultMain [testGroup "Propiedades del TAD monticulo" [testProperty "P1" prop_genMonticulo, testProperty "P2" prop_monticuloNV, testProperty "P3" prop_vacio_es_monticulo, testProperty "P4" prop_inserta_es_valida, testProperty "P5" prop_inserta_no_vacio, testProperty "P6" prop_resto_es_valida, testProperty "P7" prop_resto_inserta, testProperty "P8" prop_menor_es_minimo]] 36 / 45
  • 37. IM Tema 20: El TAD de los montículos Comprobación de la implementación con QuickCheck Comprobación de las propiedades Comprobación de las propiedades de los montículos ghci> compruebaPropiedades Propiedades del TAD monticulo: P1: [OK, passed 100 tests] P2: [OK, passed 100 tests] P3: [OK, passed 100 tests] P4: [OK, passed 100 tests] P5: [OK, passed 100 tests] P6: [OK, passed 100 tests] P7: [OK, passed 100 tests] P8: [OK, passed 100 tests] Properties Total Passed 8 8 Failed 0 0 Total 8 8 37 / 45
  • 38. IM Tema 20: El TAD de los montículos Implementación de las colas de prioridad mediante montículos Las colas de prioridad como montículos Tema 20: El TAD de los montículos 1. Especificación del TAD de los montículos 2. Implementación del TAD de los montículos 3. Comprobación de la implementación con QuickCheck 4. Implementación de las colas de prioridad mediante montículos Las colas de prioridad como montículos 38 / 45
  • 39. IM Tema 20: El TAD de los montículos Implementación de las colas de prioridad mediante montículos Las colas de prioridad como montículos Las colas de prioridad como montículos Cabecera del módulo: module ColaDePrioridadConMonticulos (CPrioridad, vacia, -- Ord a => CPrioridad a inserta, -- Ord a => a -> CPrioridad a -> CPrioridad a primero, -- Ord a => CPrioridad a -> a resto, -- Ord a => CPrioridad a -> CPrioridad a esVacia, -- Ord a => CPrioridad a -> Bool valida -- Ord a => CPrioridad a -> Bool ) where Importación cualificada: import qualified Monticulo as M 39 / 45
  • 40. IM Tema 20: El TAD de los montículos Implementación de las colas de prioridad mediante montículos Las colas de prioridad como montículos Las colas de prioridad como montículos Descripción de las operaciones: vacia es la cola de prioridad vacía. (inserta x c) añade el elemento x a la cola de prioridad c. (primero c) es el primer elemento de la cola de prioridad c. (resto c) es el resto de la cola de prioridad c. (esVacia c) se verifica si la cola de prioridad c es vacía. (valida c) se verifica si c es una cola de prioridad válida. Las colas de prioridad como montículos. newtype CPrioridad a = CP (M.Monticulo a) deriving (Eq, Show) 40 / 45
  • 41. IM Tema 20: El TAD de los montículos Implementación de las colas de prioridad mediante montículos Las colas de prioridad como montículos Las colas de prioridad como montículos Ejemplo de cola de prioridad: cp1 :: CPrioridad Int cp1 = foldr inserta vacia [3,1,7,2,9] Evaluación: ghci> cp1 CP (M 1 2 (M 2 2 (M 9 1 VacioM VacioM) (M 7 1 VacioM VacioM)) (M 3 1 VacioM VacioM)) 41 / 45
  • 42. IM Tema 20: El TAD de los montículos Implementación de las colas de prioridad mediante montículos Las colas de prioridad como montículos Las colas de prioridad como montículos vacia es la cola de prioridad vacía. Por ejemplo, vacia CP Vacio vacia :: Ord a => CPrioridad a vacia = CP M.vacio 42 / 45
  • 43. IM Tema 20: El TAD de los montículos Implementación de las colas de prioridad mediante montículos Las colas de prioridad como montículos Las colas de prioridad como montículos (inserta x c) añade el elemento x a la cola de prioridad c. Por ejemplo, ghci> inserta 5 cp1 CP (M 1 2 (M 2 2 (M 9 1 VacioM VacioM) (M 7 1 VacioM VacioM)) (M 3 1 (M 5 1 VacioM VacioM) VacioM)) inserta :: Ord a => a -> CPrioridad a -> CPrioridad a inserta v (CP c) = CP (M.inserta v c) 43 / 45
  • 44. IM Tema 20: El TAD de los montículos Implementación de las colas de prioridad mediante montículos Las colas de prioridad como montículos Las colas de prioridad como montículos (primero c) es la cabeza de la cola de prioridad c. Por ejemplo, primero cp1 1 primero :: Ord a => CPrioridad a -> a primero (CP c) = M.menor c (resto c) elimina la cabeza de la cola de prioridad c. Por ejemplo, ghci> resto cp1 CP (M 2 2 (M 9 1 VacioM VacioM) (M 3 1 (M 7 1 VacioM VacioM) VacioM)) resto :: Ord a => CPrioridad a -> CPrioridad a resto (CP c) = CP (M.resto c) 44 / 45
  • 45. IM Tema 20: El TAD de los montículos Implementación de las colas de prioridad mediante montículos Las colas de prioridad como montículos Las colas de prioridad como montículos (esVacia c) se verifica si la cola de prioridad c es vacía. Por ejemplo, esVacia cp1 False esVacia vacia True esVacia :: Ord a => CPrioridad a -> Bool esVacia (CP c) = M.esVacio c (valida c) se verifica si c es una cola de prioridad válida. En la representación mediante montículo todas las colas de prioridad son válidas. valida :: Ord a => CPrioridad a -> Bool valida _ = True 45 / 45