SlideShare une entreprise Scribd logo
1  sur  28
Télécharger pour lire hors ligne
Tema 16: El TAD de las colas de prioridad
               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 16: El TAD de las colas de prioridad




Tema 16: El TAD de las colas de prioridad
  1. Especificación del TAD de las colas de prioridad
        Signatura del TAD colas de prioridad
        Propiedades del TAD de las colas de prioridad

  2. Implementaciones del TAD de las colas de prioridad
        Las colas de prioridad como listas
        Las colas de prioridad como montículos

  3. Comprobación de las implementaciones con QuickCheck
       Librerías auxiliares
       Generador de colas de prioridad
       Especificación de las propiedades de las colas de prioridad
       Comprobación de las propiedades

                                                                    2 / 28
IM Tema 16: El TAD de las colas de prioridad
  Especificación del TAD de las colas de prioridad
     Signatura del TAD colas de prioridad



Tema 16: El TAD de las colas de prioridad

  1. Especificación del TAD de las colas de prioridad
        Signatura del TAD colas de prioridad
        Propiedades del TAD de las colas de prioridad

  2. Implementaciones del TAD de las colas de prioridad

  3. Comprobación de las implementaciones con QuickCheck




                                                           3 / 28
IM Tema 16: El TAD de las colas de prioridad
  Especificación del TAD de las colas de prioridad
     Signatura del TAD colas de prioridad



Descripción de las colas de prioridad
         Una cola de prioridad es una cola en la que cada elemento tiene
         asociada una prioridad. La operación de extracción siempre elige
         el elemento de menor prioridad.
         Ejemplo: La cola de las ciudades ordenadas por su distancia al
         destino final.




                                                                            4 / 28
IM Tema 16: El TAD de las colas de prioridad
  Especificación del TAD de las colas de prioridad
     Signatura del TAD colas de prioridad



Signatura de las colas de prioridad
         Signatura:
          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
         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.

                                                                                   5 / 28
IM Tema 16: El TAD de las colas de prioridad
  Especificación del TAD de las colas de prioridad
     Propiedades del TAD de las colas de prioridad



Tema 16: El TAD de las colas de prioridad

  1. Especificación del TAD de las colas de prioridad
        Signatura del TAD colas de prioridad
        Propiedades del TAD de las colas de prioridad

  2. Implementaciones del TAD de las colas de prioridad

  3. Comprobación de las implementaciones con QuickCheck




                                                           6 / 28
IM Tema 16: El TAD de las colas de prioridad
  Especificación del TAD de las colas de prioridad
     Propiedades del TAD de las colas de prioridad



Propiedades del TAD de las colas de prioridad
    1. inserta x (inserta y c) == inserta y (inserta x c)
    2. primero (inserta x vacia) == x
    3. Si x <= y, entonces
       primero (inserta y (inserta x c))
       == primero (inserta x c)
    4. resto (inserta x vacia) == vacia
    5. Si x <= y, entonces
       resto (inserta y (inserta x c))
       == inserta y (resto (inserta x c))
    6. esVacia vacia
    7. not (esVacia (inserta x c))


                                                            7 / 28
IM Tema 16: El TAD de las colas de prioridad
  Implementaciones del TAD de las colas de prioridad
     Las colas de prioridad como listas



Tema 16: El TAD de las colas de prioridad

  1. Especificación del TAD de las colas de prioridad

  2. Implementaciones del TAD de las colas de prioridad
        Las colas de prioridad como listas
        Las colas de prioridad como montículos

  3. Comprobación de las implementaciones con QuickCheck




                                                           8 / 28
IM Tema 16: El TAD de las colas de prioridad
  Implementaciones del TAD de las colas de prioridad
     Las colas de prioridad como listas



Las colas de prioridad como listas
         Cabecera del módulo:

         module ColaDePrioridadConListas
             (CPrioridad,
              vacia, -- Ord a => CPrioridad a
              inserta, -- Ord a => a -> CPrioridad     a -> CPrioridad
              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
         Colas de prioridad mediante listas:

         newtype CPrioridad a = CP [a]
             deriving (Eq, Show)
                                                                   9 / 28
IM Tema 16: El TAD de las colas de prioridad
  Implementaciones del TAD de las colas de prioridad
     Las colas de prioridad como listas



Las colas de prioridad como listas
         Ejemplo de cola de prioridad: cp1 es la cola de prioridad obtenida
         añadiéndole a la cola vacía los elementos 3, 1, 7, 2 y 9.
          cp1      CP [1,2,3,7,9]

         cp1 :: CPrioridad Int
         cp1 = foldr inserta vacia [3,1,7,2,9]
         (valida c) se verifica si c es una cola de prioridad válida; es
         decir, está ordenada crecientemente. Por ejemplo,
          valida (CP [1,3,5])           True
          valida (CP [1,5,3])           False

         valida :: Ord a => CPrioridad a -> Bool
         valida (CP xs) = ordenada xs
             where ordenada (x:y:zs) = x <= y && ordenada (y:zs)
                   ordenada _        = True                    10 / 28
IM Tema 16: El TAD de las colas de prioridad
  Implementaciones del TAD de las colas de prioridad
     Las colas de prioridad como listas



Las colas de prioridad como listas
         vacia es la cola de prioridad vacía. Por ejemplo,
          vacia        CP []

         vacia :: Ord a => CPrioridad a
         vacia = CP []
         (inserta x c) es la cola obtenida añadiendo el elemento x a la
         cola de prioridad c. Por ejemplo,
          cp1                     CP [1,2,3,7,9]
          inserta 5 cp1           CP [1,2,3,5,7,9]

         inserta :: Ord a => a -> CPrioridad a -> CPrioridad a
         inserta x (CP q) = CP (ins x q)
             where ins x []                   = [x]
                   ins x r@(e:r') | x < e     = x:r
                                  | otherwise = e:ins x r'                11 / 28
IM Tema 16: El TAD de las colas de prioridad
  Implementaciones del TAD de las colas de prioridad
     Las colas de prioridad como listas



Las colas de prioridad como listas
         (primero c) es el primer elemento de la cola de prioridad c.
          cp1                CP [1,2,3,7,9]
          primero cp1        1

         primero :: Ord a => CPrioridad a -> a
         primero (CP(x:_)) = x
         primero _         = error "primero: cola vacia"
         (resto c) es la cola de prioridad obtenida eliminando el primer
         elemento de la cola de prioridad c. Por ejemplo,
          cp1               CP [1,2,3,7,9]
          resto cp1         CP [2,3,7,9]

         resto :: Ord a => CPrioridad a -> CPrioridad a
         resto (CP (_:xs)) = CP xs
         resto _           = error "resto: cola vacia"                     12 / 28
IM Tema 16: El TAD de las colas de prioridad
  Implementaciones del TAD de las colas de prioridad
     Las colas de prioridad como listas



Las colas de prioridad como listas
         (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 xs) = null xs




                                                                          13 / 28
IM Tema 16: El TAD de las colas de prioridad
  Implementaciones del TAD de las colas de prioridad
     Las colas de prioridad como montículos



Tema 16: El TAD de las colas de prioridad

  1. Especificación del TAD de las colas de prioridad

  2. Implementaciones del TAD de las colas de prioridad
        Las colas de prioridad como listas
        Las colas de prioridad como montículos

  3. Comprobación de las implementaciones con QuickCheck




                                                           14 / 28
IM Tema 16: El TAD de las colas de prioridad
  Implementaciones del TAD de las colas de prioridad
     Las colas de prioridad como montículos



Las colas de prioridad como montículos
  La implementación de las colas de prioridad como montículos
  (ColaDePrioridadConMonticulos.hs) se encuentra en en el tema
  20 (El TAD de los montículos).




                                                                 15 / 28
IM Tema 16: El TAD de las colas de prioridad
  Comprobación de las implementaciones con QuickCheck
     Librerías auxiliares



Tema 16: El TAD de las colas de prioridad

  1. Especificación del TAD de las colas de prioridad

  2. Implementaciones del TAD de las colas de prioridad

  3. Comprobación de las implementaciones con QuickCheck
       Librerías auxiliares
       Generador de colas de prioridad
       Especificación de las propiedades de las colas de prioridad
       Comprobación de las propiedades




                                                                    16 / 28
IM Tema 16: El TAD de las colas de prioridad
  Comprobación de las implementaciones con QuickCheck
     Librerías auxiliares



Importación de librerías en el módulo de comprobación
         Importación de la implementación de colas de prioridad que se
         desea verificar.

         import ColaDePrioridadConListas
         -- ColaDePrioridadConMonticulos.hs
         Importación de las librerías de comprobación

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




                                                                         17 / 28
IM Tema 16: El TAD de las colas de prioridad
  Comprobación de las implementaciones con QuickCheck
     Generador de colas de prioridad



Tema 16: El TAD de las colas de prioridad

  1. Especificación del TAD de las colas de prioridad

  2. Implementaciones del TAD de las colas de prioridad

  3. Comprobación de las implementaciones con QuickCheck
       Librerías auxiliares
       Generador de colas de prioridad
       Especificación de las propiedades de las colas de prioridad
       Comprobación de las propiedades




                                                                    18 / 28
IM Tema 16: El TAD de las colas de prioridad
  Comprobación de las implementaciones con QuickCheck
     Generador de colas de prioridad



Generador de colas de prioridad
         genCPrioridad es un generador de colas de prioridad. Por
         ejemplo,
          ghci> sample genCPrioridad
          CP [-4]
          CP [-2,-1,-1,2,5]
          ...

         genCPrioridad :: (Arbitrary a, Num a, Ord a)
                          => Gen (CPrioridad a)
         genCPrioridad = do xs <- listOf arbitrary
                            return (foldr inserta vacia xs)

         instance (Arbitrary a, Num a, Ord a)
                  => Arbitrary (CPrioridad a) where
             arbitrary = genCPrioridad
                                                                    19 / 28
IM Tema 16: El TAD de las colas de prioridad
  Comprobación de las implementaciones con QuickCheck
     Generador de colas de prioridad



Corrección del generador de colas de prioridad
         Las colas de prioridad producidas por genCPrioridad son
         válidas.

         prop_genCPrioridad_correcto :: CPrioridad Int -> Bool
         prop_genCPrioridad_correcto c = valida c

         Comprobación.
          ghci> quickCheck prop_genCPrioridad_correcto
          +++ OK, passed 100 tests.




                                                                   20 / 28
IM Tema 16: El TAD de las colas de prioridad
  Comprobación de las implementaciones con QuickCheck
     Especificación de las propiedades de las colas de prioridad



Tema 16: El TAD de las colas de prioridad

  1. Especificación del TAD de las colas de prioridad

  2. Implementaciones del TAD de las colas de prioridad

  3. Comprobación de las implementaciones con QuickCheck
       Librerías auxiliares
       Generador de colas de prioridad
       Especificación de las propiedades de las colas de prioridad
       Comprobación de las propiedades




                                                                    21 / 28
IM Tema 16: El TAD de las colas de prioridad
  Comprobación de las implementaciones con QuickCheck
     Especificación de las propiedades de las colas de prioridad



Especificación de las propiedades de colas de prioridad
         Si se añade dos elementos a una cola de prioridad se obtiene la
         misma cola de prioridad idependientemente del orden en que se
         añadan los elementos.

         prop_inserta_conmuta :: Int -> Int -> CPrioridad Int
                                 -> Bool
         prop_inserta_conmuta x y c =
             inserta x (inserta y c) == inserta y (inserta x c)
         La cabeza de la cola de prioridad obtenida anadiendo un
         elemento x a la cola de prioridad vacía es x.

         prop_primero_inserta_vacia :: Int -> CPrioridad Int -> Boo
         prop_primero_inserta_vacia x c =
             primero (inserta x vacia) == x
                                                                           22 / 28
IM Tema 16: El TAD de las colas de prioridad
  Comprobación de las implementaciones con QuickCheck
     Especificación de las propiedades de las colas de prioridad



Especificación de las propiedades de colas de prioridad
         El primer elemento de una cola de prioridad c no cambia cuando
         se le añade un elemento mayor o igual que algún elemento de c.

         prop_primero_inserta :: Int -> Int -> CPrioridad Int
                                 -> Property
         prop_primero_inserta x y c =
             x <= y ==>
             primero (inserta y c') == primero c'
             where c' = inserta x c
         El resto de añadir un elemento a la cola de prioridad vacía es la
         cola vacía.

         prop_resto_inserta_vacia :: Int -> Bool
         prop_resto_inserta_vacia x =
             resto (inserta x vacia) == vacia
                                                                             23 / 28
IM Tema 16: El TAD de las colas de prioridad
  Comprobación de las implementaciones con QuickCheck
     Especificación de las propiedades de las colas de prioridad



Especificación de las propiedades de colas de prioridad
         El resto de la cola de prioridad obtenida añadiendo un elemento y
         a una cola c’ (que tiene algún elemento menor o igual que y) es
         la cola que se obtiene añadiendo y al resto de c’.

         prop_resto_inserta :: Int -> Int -> CPrioridad Int
                               -> Property
         prop_resto_inserta x y c =
             x <= y ==>
             resto (inserta y c') == inserta y (resto c')
             where c' = inserta x c
         vacia es una cola vacía.

         prop_vacia_es_vacia :: Bool
         prop_vacia_es_vacia = esVacia (vacia :: CPrioridad Int)
                                                                             24 / 28
IM Tema 16: El TAD de las colas de prioridad
  Comprobación de las implementaciones con QuickCheck
     Especificación de las propiedades de las colas de prioridad



Especificación de las propiedades de colas de prioridad
         Si se añade un elemento a una cola de prioridad se obtiene una
         cola no vacía.

         prop_inserta_no_es_vacia :: Int -> CPrioridad Int
                                     -> Bool
         prop_inserta_no_es_vacia x c =
             not (esVacia (inserta x c))




                                                                          25 / 28
IM Tema 16: El TAD de las colas de prioridad
  Comprobación de las implementaciones con QuickCheck
     Comprobación de las propiedades



Tema 16: El TAD de las colas de prioridad

  1. Especificación del TAD de las colas de prioridad

  2. Implementaciones del TAD de las colas de prioridad

  3. Comprobación de las implementaciones con QuickCheck
       Librerías auxiliares
       Generador de colas de prioridad
       Especificación de las propiedades de las colas de prioridad
       Comprobación de las propiedades




                                                                    26 / 28
IM Tema 16: El TAD de las colas de prioridad
  Comprobación de las implementaciones 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 "Corrección del generador"
                   [testProperty "P0" prop_genCPrioridad_correcto],
                  testGroup "Propiedade de colas de prioriad:"
                   [testProperty "P1" prop_inserta_conmuta,
                    testProperty "P2" prop_primero_inserta_vacia,
                    testProperty "P3" prop_primero_inserta,
                    testProperty "P4" prop_resto_inserta_vacia,
                    testProperty "P5" prop_resto_inserta,
                    testProperty "P6" prop_vacia_es_vacia,
                    testProperty "P7" prop_inserta_no_es_vacia]]
                                                                       27 / 28
IM Tema 16: El TAD de las colas de prioridad
  Comprobación de las implementaciones con QuickCheck
     Comprobación de las propiedades



Comprobación de las propiedades de las colas de prioridad
   ghci> compruebaPropiedades
   Corrección del generador:
     P0: [OK, passed 100 tests]
   Propiedades de colas de prioridad:
     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]

            Properties                 Total
     Passed 8                          8
     Failed 0                          0
     Total 8                           8
                                                        28 / 28

Contenu connexe

En vedette (6)

Estructura de datos.vrb
Estructura de datos.vrbEstructura de datos.vrb
Estructura de datos.vrb
 
COLAS
COLASCOLAS
COLAS
 
Arboles y Colas de Prioridad en Java
Arboles y Colas de Prioridad en JavaArboles y Colas de Prioridad en Java
Arboles y Colas de Prioridad en Java
 
ARITMETICA DE BALDOR
ARITMETICA DE BALDORARITMETICA DE BALDOR
ARITMETICA DE BALDOR
 
Qué son las colas de prioridad
Qué son las colas de prioridadQué son las colas de prioridad
Qué son las colas de prioridad
 
Colas de prioridad
Colas de prioridadColas de prioridad
Colas de prioridad
 

Similaire à I1M2010-T16: El tipo abstracto de las colas de prioridad en Haskell

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
 
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
 
Aedii pilas colas_y_recursividad_teoria_sem07_a_sem10
Aedii pilas colas_y_recursividad_teoria_sem07_a_sem10Aedii pilas colas_y_recursividad_teoria_sem07_a_sem10
Aedii pilas colas_y_recursividad_teoria_sem07_a_sem10chrisflores001
 
I1M2010-T20: El tipo abstracto de los montículos en Haskell
I1M2010-T20: El tipo abstracto de los montículos en Haskell I1M2010-T20: El tipo abstracto de los montículos en Haskell
I1M2010-T20: El tipo abstracto de los montículos en Haskell José A. Alonso
 
Estructura de datos
Estructura de datos Estructura de datos
Estructura de datos jarydr18
 
Estructura dedatos
Estructura dedatosEstructura dedatos
Estructura dedatosJorge
 
Apuntes generación de codigo intermedio
Apuntes generación de codigo intermedioApuntes generación de codigo intermedio
Apuntes generación de codigo intermedioHumano Terricola
 
Curso-PROPE-PyED-5-Pilas-Colas-programacion
Curso-PROPE-PyED-5-Pilas-Colas-programacionCurso-PROPE-PyED-5-Pilas-Colas-programacion
Curso-PROPE-PyED-5-Pilas-Colas-programacionLUISFERNANDOMORENOSO2
 

Similaire à I1M2010-T16: El tipo abstracto de las colas de prioridad en Haskell (12)

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
 
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
 
Aedii pilas colas_y_recursividad_teoria_sem07_a_sem10
Aedii pilas colas_y_recursividad_teoria_sem07_a_sem10Aedii pilas colas_y_recursividad_teoria_sem07_a_sem10
Aedii pilas colas_y_recursividad_teoria_sem07_a_sem10
 
Tipos De Datos Abstractos Colas
Tipos De Datos Abstractos ColasTipos De Datos Abstractos Colas
Tipos De Datos Abstractos Colas
 
I1M2010-T20: El tipo abstracto de los montículos en Haskell
I1M2010-T20: El tipo abstracto de los montículos en Haskell I1M2010-T20: El tipo abstracto de los montículos en Haskell
I1M2010-T20: El tipo abstracto de los montículos en Haskell
 
Estructura de datos
Estructura de datos Estructura de datos
Estructura de datos
 
Estructura dedatos
Estructura dedatosEstructura dedatos
Estructura dedatos
 
Funciones con vectores
Funciones con vectoresFunciones con vectores
Funciones con vectores
 
Apuntes generación de codigo intermedio
Apuntes generación de codigo intermedioApuntes generación de codigo intermedio
Apuntes generación de codigo intermedio
 
2- TDA Listas
2- TDA Listas2- TDA Listas
2- TDA Listas
 
Curso-PROPE-PyED-5-Pilas-Colas-programacion
Curso-PROPE-PyED-5-Pilas-Colas-programacionCurso-PROPE-PyED-5-Pilas-Colas-programacion
Curso-PROPE-PyED-5-Pilas-Colas-programacion
 
Pilas Colas
Pilas ColasPilas Colas
Pilas Colas
 

Plus de José 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
 
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
 
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
 
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
 
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-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-T5: Resolución proposicional
LMF-T5: Resolución proposicionalLMF-T5: Resolución proposicional
LMF-T5: Resolución 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
 
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
 
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
 
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
 
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
 
Panorama del razonamiento automático
Panorama del razonamiento automáticoPanorama del razonamiento automático
Panorama del razonamiento automáticoJosé 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
 

Plus de José A. Alonso (20)

Tema 12: Analizadores sintácticos funcionales.
Tema 12: Analizadores sintácticos funcionales.Tema 12: Analizadores sintácticos funcionales.
Tema 12: Analizadores sintácticos funcionales.
 
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
 
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
 
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
 
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-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-T5: Resolución proposicional
LMF-T5: Resolución proposicionalLMF-T5: Resolución proposicional
LMF-T5: Resolución proposicional
 
LMF-T4: Formas normales
LMF-T4: Formas normalesLMF-T4: Formas normales
LMF-T4: Formas normales
 
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
 
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
 
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
 
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
 
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
 
Panorama del razonamiento automático
Panorama del razonamiento automáticoPanorama del razonamiento automático
Panorama del razonamiento automático
 
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
 

Dernier

TEMA 14.DERIVACIONES ECONÓMICAS, SOCIALES Y POLÍTICAS DEL PROCESO DE INTEGRAC...
TEMA 14.DERIVACIONES ECONÓMICAS, SOCIALES Y POLÍTICAS DEL PROCESO DE INTEGRAC...TEMA 14.DERIVACIONES ECONÓMICAS, SOCIALES Y POLÍTICAS DEL PROCESO DE INTEGRAC...
TEMA 14.DERIVACIONES ECONÓMICAS, SOCIALES Y POLÍTICAS DEL PROCESO DE INTEGRAC...jlorentemartos
 
Desarrollo y Aplicación de la Administración por Valores
Desarrollo y Aplicación de la Administración por ValoresDesarrollo y Aplicación de la Administración por Valores
Desarrollo y Aplicación de la Administración por ValoresJonathanCovena1
 
La Evaluacion Formativa SM6 Ccesa007.pdf
La Evaluacion Formativa SM6  Ccesa007.pdfLa Evaluacion Formativa SM6  Ccesa007.pdf
La Evaluacion Formativa SM6 Ccesa007.pdfDemetrio Ccesa Rayme
 
AEC2. Egipto Antiguo. Adivina, Adivinanza.pptx
AEC2. Egipto Antiguo. Adivina, Adivinanza.pptxAEC2. Egipto Antiguo. Adivina, Adivinanza.pptx
AEC2. Egipto Antiguo. Adivina, Adivinanza.pptxhenarfdez
 
Tema 19. Inmunología y el sistema inmunitario 2024
Tema 19. Inmunología y el sistema inmunitario 2024Tema 19. Inmunología y el sistema inmunitario 2024
Tema 19. Inmunología y el sistema inmunitario 2024IES Vicent Andres Estelles
 
Prueba de evaluación Geografía e Historia Comunidad de Madrid 2º de la ESO
Prueba de evaluación Geografía e Historia Comunidad de Madrid 2º de la ESOPrueba de evaluación Geografía e Historia Comunidad de Madrid 2º de la ESO
Prueba de evaluación Geografía e Historia Comunidad de Madrid 2º de la ESOluismii249
 
SISTEMA RESPIRATORIO PARA NIÑOS PRIMARIA
SISTEMA RESPIRATORIO PARA NIÑOS PRIMARIASISTEMA RESPIRATORIO PARA NIÑOS PRIMARIA
SISTEMA RESPIRATORIO PARA NIÑOS PRIMARIAFabiolaGarcia751855
 
Revista Apuntes de Historia. Mayo 2024.pdf
Revista Apuntes de Historia. Mayo 2024.pdfRevista Apuntes de Historia. Mayo 2024.pdf
Revista Apuntes de Historia. Mayo 2024.pdfapunteshistoriamarmo
 
LA JUNGLA DE COLORES.pptx Cuento de animales
LA JUNGLA DE COLORES.pptx  Cuento de animalesLA JUNGLA DE COLORES.pptx  Cuento de animales
LA JUNGLA DE COLORES.pptx Cuento de animalesanllamas
 
Feliz Día de la Madre - 5 de Mayo, 2024.pdf
Feliz Día de la Madre - 5 de Mayo, 2024.pdfFeliz Día de la Madre - 5 de Mayo, 2024.pdf
Feliz Día de la Madre - 5 de Mayo, 2024.pdfMercedes Gonzalez
 
Prueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESO
Prueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESOPrueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESO
Prueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESOluismii249
 
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docxEliaHernndez7
 
La Sostenibilidad Corporativa. Administración Ambiental
La Sostenibilidad Corporativa. Administración AmbientalLa Sostenibilidad Corporativa. Administración Ambiental
La Sostenibilidad Corporativa. Administración AmbientalJonathanCovena1
 
ACRÓNIMO DE PARÍS PARA SU OLIMPIADA 2024. Por JAVIER SOLIS NOYOLA
ACRÓNIMO DE PARÍS PARA SU OLIMPIADA 2024. Por JAVIER SOLIS NOYOLAACRÓNIMO DE PARÍS PARA SU OLIMPIADA 2024. Por JAVIER SOLIS NOYOLA
ACRÓNIMO DE PARÍS PARA SU OLIMPIADA 2024. Por JAVIER SOLIS NOYOLAJAVIER SOLIS NOYOLA
 
Tema 10. Dinámica y funciones de la Atmosfera 2024
Tema 10. Dinámica y funciones de la Atmosfera 2024Tema 10. Dinámica y funciones de la Atmosfera 2024
Tema 10. Dinámica y funciones de la Atmosfera 2024IES Vicent Andres Estelles
 
AEC 2. Aventura en el Antiguo Egipto.pptx
AEC 2. Aventura en el Antiguo Egipto.pptxAEC 2. Aventura en el Antiguo Egipto.pptx
AEC 2. Aventura en el Antiguo Egipto.pptxhenarfdez
 
activ4-bloque4 transversal doctorado.pdf
activ4-bloque4 transversal doctorado.pdfactiv4-bloque4 transversal doctorado.pdf
activ4-bloque4 transversal doctorado.pdfRosabel UA
 

Dernier (20)

TEMA 14.DERIVACIONES ECONÓMICAS, SOCIALES Y POLÍTICAS DEL PROCESO DE INTEGRAC...
TEMA 14.DERIVACIONES ECONÓMICAS, SOCIALES Y POLÍTICAS DEL PROCESO DE INTEGRAC...TEMA 14.DERIVACIONES ECONÓMICAS, SOCIALES Y POLÍTICAS DEL PROCESO DE INTEGRAC...
TEMA 14.DERIVACIONES ECONÓMICAS, SOCIALES Y POLÍTICAS DEL PROCESO DE INTEGRAC...
 
Desarrollo y Aplicación de la Administración por Valores
Desarrollo y Aplicación de la Administración por ValoresDesarrollo y Aplicación de la Administración por Valores
Desarrollo y Aplicación de la Administración por Valores
 
La Evaluacion Formativa SM6 Ccesa007.pdf
La Evaluacion Formativa SM6  Ccesa007.pdfLa Evaluacion Formativa SM6  Ccesa007.pdf
La Evaluacion Formativa SM6 Ccesa007.pdf
 
Supuestos_prácticos_funciones.docx
Supuestos_prácticos_funciones.docxSupuestos_prácticos_funciones.docx
Supuestos_prácticos_funciones.docx
 
AEC2. Egipto Antiguo. Adivina, Adivinanza.pptx
AEC2. Egipto Antiguo. Adivina, Adivinanza.pptxAEC2. Egipto Antiguo. Adivina, Adivinanza.pptx
AEC2. Egipto Antiguo. Adivina, Adivinanza.pptx
 
Tema 19. Inmunología y el sistema inmunitario 2024
Tema 19. Inmunología y el sistema inmunitario 2024Tema 19. Inmunología y el sistema inmunitario 2024
Tema 19. Inmunología y el sistema inmunitario 2024
 
Prueba de evaluación Geografía e Historia Comunidad de Madrid 2º de la ESO
Prueba de evaluación Geografía e Historia Comunidad de Madrid 2º de la ESOPrueba de evaluación Geografía e Historia Comunidad de Madrid 2º de la ESO
Prueba de evaluación Geografía e Historia Comunidad de Madrid 2º de la ESO
 
Power Point E. S.: Los dos testigos.pptx
Power Point E. S.: Los dos testigos.pptxPower Point E. S.: Los dos testigos.pptx
Power Point E. S.: Los dos testigos.pptx
 
SISTEMA RESPIRATORIO PARA NIÑOS PRIMARIA
SISTEMA RESPIRATORIO PARA NIÑOS PRIMARIASISTEMA RESPIRATORIO PARA NIÑOS PRIMARIA
SISTEMA RESPIRATORIO PARA NIÑOS PRIMARIA
 
Los dos testigos. Testifican de la Verdad
Los dos testigos. Testifican de la VerdadLos dos testigos. Testifican de la Verdad
Los dos testigos. Testifican de la Verdad
 
Revista Apuntes de Historia. Mayo 2024.pdf
Revista Apuntes de Historia. Mayo 2024.pdfRevista Apuntes de Historia. Mayo 2024.pdf
Revista Apuntes de Historia. Mayo 2024.pdf
 
LA JUNGLA DE COLORES.pptx Cuento de animales
LA JUNGLA DE COLORES.pptx  Cuento de animalesLA JUNGLA DE COLORES.pptx  Cuento de animales
LA JUNGLA DE COLORES.pptx Cuento de animales
 
Feliz Día de la Madre - 5 de Mayo, 2024.pdf
Feliz Día de la Madre - 5 de Mayo, 2024.pdfFeliz Día de la Madre - 5 de Mayo, 2024.pdf
Feliz Día de la Madre - 5 de Mayo, 2024.pdf
 
Prueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESO
Prueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESOPrueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESO
Prueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESO
 
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
 
La Sostenibilidad Corporativa. Administración Ambiental
La Sostenibilidad Corporativa. Administración AmbientalLa Sostenibilidad Corporativa. Administración Ambiental
La Sostenibilidad Corporativa. Administración Ambiental
 
ACRÓNIMO DE PARÍS PARA SU OLIMPIADA 2024. Por JAVIER SOLIS NOYOLA
ACRÓNIMO DE PARÍS PARA SU OLIMPIADA 2024. Por JAVIER SOLIS NOYOLAACRÓNIMO DE PARÍS PARA SU OLIMPIADA 2024. Por JAVIER SOLIS NOYOLA
ACRÓNIMO DE PARÍS PARA SU OLIMPIADA 2024. Por JAVIER SOLIS NOYOLA
 
Tema 10. Dinámica y funciones de la Atmosfera 2024
Tema 10. Dinámica y funciones de la Atmosfera 2024Tema 10. Dinámica y funciones de la Atmosfera 2024
Tema 10. Dinámica y funciones de la Atmosfera 2024
 
AEC 2. Aventura en el Antiguo Egipto.pptx
AEC 2. Aventura en el Antiguo Egipto.pptxAEC 2. Aventura en el Antiguo Egipto.pptx
AEC 2. Aventura en el Antiguo Egipto.pptx
 
activ4-bloque4 transversal doctorado.pdf
activ4-bloque4 transversal doctorado.pdfactiv4-bloque4 transversal doctorado.pdf
activ4-bloque4 transversal doctorado.pdf
 

I1M2010-T16: El tipo abstracto de las colas de prioridad en Haskell

  • 1. Tema 16: El TAD de las colas de prioridad 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 16: El TAD de las colas de prioridad Tema 16: El TAD de las colas de prioridad 1. Especificación del TAD de las colas de prioridad Signatura del TAD colas de prioridad Propiedades del TAD de las colas de prioridad 2. Implementaciones del TAD de las colas de prioridad Las colas de prioridad como listas Las colas de prioridad como montículos 3. Comprobación de las implementaciones con QuickCheck Librerías auxiliares Generador de colas de prioridad Especificación de las propiedades de las colas de prioridad Comprobación de las propiedades 2 / 28
  • 3. IM Tema 16: El TAD de las colas de prioridad Especificación del TAD de las colas de prioridad Signatura del TAD colas de prioridad Tema 16: El TAD de las colas de prioridad 1. Especificación del TAD de las colas de prioridad Signatura del TAD colas de prioridad Propiedades del TAD de las colas de prioridad 2. Implementaciones del TAD de las colas de prioridad 3. Comprobación de las implementaciones con QuickCheck 3 / 28
  • 4. IM Tema 16: El TAD de las colas de prioridad Especificación del TAD de las colas de prioridad Signatura del TAD colas de prioridad Descripción de las colas de prioridad Una cola de prioridad es una cola en la que cada elemento tiene asociada una prioridad. La operación de extracción siempre elige el elemento de menor prioridad. Ejemplo: La cola de las ciudades ordenadas por su distancia al destino final. 4 / 28
  • 5. IM Tema 16: El TAD de las colas de prioridad Especificación del TAD de las colas de prioridad Signatura del TAD colas de prioridad Signatura de las colas de prioridad Signatura: 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 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. 5 / 28
  • 6. IM Tema 16: El TAD de las colas de prioridad Especificación del TAD de las colas de prioridad Propiedades del TAD de las colas de prioridad Tema 16: El TAD de las colas de prioridad 1. Especificación del TAD de las colas de prioridad Signatura del TAD colas de prioridad Propiedades del TAD de las colas de prioridad 2. Implementaciones del TAD de las colas de prioridad 3. Comprobación de las implementaciones con QuickCheck 6 / 28
  • 7. IM Tema 16: El TAD de las colas de prioridad Especificación del TAD de las colas de prioridad Propiedades del TAD de las colas de prioridad Propiedades del TAD de las colas de prioridad 1. inserta x (inserta y c) == inserta y (inserta x c) 2. primero (inserta x vacia) == x 3. Si x <= y, entonces primero (inserta y (inserta x c)) == primero (inserta x c) 4. resto (inserta x vacia) == vacia 5. Si x <= y, entonces resto (inserta y (inserta x c)) == inserta y (resto (inserta x c)) 6. esVacia vacia 7. not (esVacia (inserta x c)) 7 / 28
  • 8. IM Tema 16: El TAD de las colas de prioridad Implementaciones del TAD de las colas de prioridad Las colas de prioridad como listas Tema 16: El TAD de las colas de prioridad 1. Especificación del TAD de las colas de prioridad 2. Implementaciones del TAD de las colas de prioridad Las colas de prioridad como listas Las colas de prioridad como montículos 3. Comprobación de las implementaciones con QuickCheck 8 / 28
  • 9. IM Tema 16: El TAD de las colas de prioridad Implementaciones del TAD de las colas de prioridad Las colas de prioridad como listas Las colas de prioridad como listas Cabecera del módulo: module ColaDePrioridadConListas (CPrioridad, vacia, -- Ord a => CPrioridad a inserta, -- Ord a => a -> CPrioridad a -> CPrioridad 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 Colas de prioridad mediante listas: newtype CPrioridad a = CP [a] deriving (Eq, Show) 9 / 28
  • 10. IM Tema 16: El TAD de las colas de prioridad Implementaciones del TAD de las colas de prioridad Las colas de prioridad como listas Las colas de prioridad como listas Ejemplo de cola de prioridad: cp1 es la cola de prioridad obtenida añadiéndole a la cola vacía los elementos 3, 1, 7, 2 y 9. cp1 CP [1,2,3,7,9] cp1 :: CPrioridad Int cp1 = foldr inserta vacia [3,1,7,2,9] (valida c) se verifica si c es una cola de prioridad válida; es decir, está ordenada crecientemente. Por ejemplo, valida (CP [1,3,5]) True valida (CP [1,5,3]) False valida :: Ord a => CPrioridad a -> Bool valida (CP xs) = ordenada xs where ordenada (x:y:zs) = x <= y && ordenada (y:zs) ordenada _ = True 10 / 28
  • 11. IM Tema 16: El TAD de las colas de prioridad Implementaciones del TAD de las colas de prioridad Las colas de prioridad como listas Las colas de prioridad como listas vacia es la cola de prioridad vacía. Por ejemplo, vacia CP [] vacia :: Ord a => CPrioridad a vacia = CP [] (inserta x c) es la cola obtenida añadiendo el elemento x a la cola de prioridad c. Por ejemplo, cp1 CP [1,2,3,7,9] inserta 5 cp1 CP [1,2,3,5,7,9] inserta :: Ord a => a -> CPrioridad a -> CPrioridad a inserta x (CP q) = CP (ins x q) where ins x [] = [x] ins x r@(e:r') | x < e = x:r | otherwise = e:ins x r' 11 / 28
  • 12. IM Tema 16: El TAD de las colas de prioridad Implementaciones del TAD de las colas de prioridad Las colas de prioridad como listas Las colas de prioridad como listas (primero c) es el primer elemento de la cola de prioridad c. cp1 CP [1,2,3,7,9] primero cp1 1 primero :: Ord a => CPrioridad a -> a primero (CP(x:_)) = x primero _ = error "primero: cola vacia" (resto c) es la cola de prioridad obtenida eliminando el primer elemento de la cola de prioridad c. Por ejemplo, cp1 CP [1,2,3,7,9] resto cp1 CP [2,3,7,9] resto :: Ord a => CPrioridad a -> CPrioridad a resto (CP (_:xs)) = CP xs resto _ = error "resto: cola vacia" 12 / 28
  • 13. IM Tema 16: El TAD de las colas de prioridad Implementaciones del TAD de las colas de prioridad Las colas de prioridad como listas Las colas de prioridad como listas (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 xs) = null xs 13 / 28
  • 14. IM Tema 16: El TAD de las colas de prioridad Implementaciones del TAD de las colas de prioridad Las colas de prioridad como montículos Tema 16: El TAD de las colas de prioridad 1. Especificación del TAD de las colas de prioridad 2. Implementaciones del TAD de las colas de prioridad Las colas de prioridad como listas Las colas de prioridad como montículos 3. Comprobación de las implementaciones con QuickCheck 14 / 28
  • 15. IM Tema 16: El TAD de las colas de prioridad Implementaciones del TAD de las colas de prioridad Las colas de prioridad como montículos Las colas de prioridad como montículos La implementación de las colas de prioridad como montículos (ColaDePrioridadConMonticulos.hs) se encuentra en en el tema 20 (El TAD de los montículos). 15 / 28
  • 16. IM Tema 16: El TAD de las colas de prioridad Comprobación de las implementaciones con QuickCheck Librerías auxiliares Tema 16: El TAD de las colas de prioridad 1. Especificación del TAD de las colas de prioridad 2. Implementaciones del TAD de las colas de prioridad 3. Comprobación de las implementaciones con QuickCheck Librerías auxiliares Generador de colas de prioridad Especificación de las propiedades de las colas de prioridad Comprobación de las propiedades 16 / 28
  • 17. IM Tema 16: El TAD de las colas de prioridad Comprobación de las implementaciones con QuickCheck Librerías auxiliares Importación de librerías en el módulo de comprobación Importación de la implementación de colas de prioridad que se desea verificar. import ColaDePrioridadConListas -- ColaDePrioridadConMonticulos.hs Importación de las librerías de comprobación import Test.QuickCheck import Test.Framework import Test.Framework.Providers.QuickCheck2 17 / 28
  • 18. IM Tema 16: El TAD de las colas de prioridad Comprobación de las implementaciones con QuickCheck Generador de colas de prioridad Tema 16: El TAD de las colas de prioridad 1. Especificación del TAD de las colas de prioridad 2. Implementaciones del TAD de las colas de prioridad 3. Comprobación de las implementaciones con QuickCheck Librerías auxiliares Generador de colas de prioridad Especificación de las propiedades de las colas de prioridad Comprobación de las propiedades 18 / 28
  • 19. IM Tema 16: El TAD de las colas de prioridad Comprobación de las implementaciones con QuickCheck Generador de colas de prioridad Generador de colas de prioridad genCPrioridad es un generador de colas de prioridad. Por ejemplo, ghci> sample genCPrioridad CP [-4] CP [-2,-1,-1,2,5] ... genCPrioridad :: (Arbitrary a, Num a, Ord a) => Gen (CPrioridad a) genCPrioridad = do xs <- listOf arbitrary return (foldr inserta vacia xs) instance (Arbitrary a, Num a, Ord a) => Arbitrary (CPrioridad a) where arbitrary = genCPrioridad 19 / 28
  • 20. IM Tema 16: El TAD de las colas de prioridad Comprobación de las implementaciones con QuickCheck Generador de colas de prioridad Corrección del generador de colas de prioridad Las colas de prioridad producidas por genCPrioridad son válidas. prop_genCPrioridad_correcto :: CPrioridad Int -> Bool prop_genCPrioridad_correcto c = valida c Comprobación. ghci> quickCheck prop_genCPrioridad_correcto +++ OK, passed 100 tests. 20 / 28
  • 21. IM Tema 16: El TAD de las colas de prioridad Comprobación de las implementaciones con QuickCheck Especificación de las propiedades de las colas de prioridad Tema 16: El TAD de las colas de prioridad 1. Especificación del TAD de las colas de prioridad 2. Implementaciones del TAD de las colas de prioridad 3. Comprobación de las implementaciones con QuickCheck Librerías auxiliares Generador de colas de prioridad Especificación de las propiedades de las colas de prioridad Comprobación de las propiedades 21 / 28
  • 22. IM Tema 16: El TAD de las colas de prioridad Comprobación de las implementaciones con QuickCheck Especificación de las propiedades de las colas de prioridad Especificación de las propiedades de colas de prioridad Si se añade dos elementos a una cola de prioridad se obtiene la misma cola de prioridad idependientemente del orden en que se añadan los elementos. prop_inserta_conmuta :: Int -> Int -> CPrioridad Int -> Bool prop_inserta_conmuta x y c = inserta x (inserta y c) == inserta y (inserta x c) La cabeza de la cola de prioridad obtenida anadiendo un elemento x a la cola de prioridad vacía es x. prop_primero_inserta_vacia :: Int -> CPrioridad Int -> Boo prop_primero_inserta_vacia x c = primero (inserta x vacia) == x 22 / 28
  • 23. IM Tema 16: El TAD de las colas de prioridad Comprobación de las implementaciones con QuickCheck Especificación de las propiedades de las colas de prioridad Especificación de las propiedades de colas de prioridad El primer elemento de una cola de prioridad c no cambia cuando se le añade un elemento mayor o igual que algún elemento de c. prop_primero_inserta :: Int -> Int -> CPrioridad Int -> Property prop_primero_inserta x y c = x <= y ==> primero (inserta y c') == primero c' where c' = inserta x c El resto de añadir un elemento a la cola de prioridad vacía es la cola vacía. prop_resto_inserta_vacia :: Int -> Bool prop_resto_inserta_vacia x = resto (inserta x vacia) == vacia 23 / 28
  • 24. IM Tema 16: El TAD de las colas de prioridad Comprobación de las implementaciones con QuickCheck Especificación de las propiedades de las colas de prioridad Especificación de las propiedades de colas de prioridad El resto de la cola de prioridad obtenida añadiendo un elemento y a una cola c’ (que tiene algún elemento menor o igual que y) es la cola que se obtiene añadiendo y al resto de c’. prop_resto_inserta :: Int -> Int -> CPrioridad Int -> Property prop_resto_inserta x y c = x <= y ==> resto (inserta y c') == inserta y (resto c') where c' = inserta x c vacia es una cola vacía. prop_vacia_es_vacia :: Bool prop_vacia_es_vacia = esVacia (vacia :: CPrioridad Int) 24 / 28
  • 25. IM Tema 16: El TAD de las colas de prioridad Comprobación de las implementaciones con QuickCheck Especificación de las propiedades de las colas de prioridad Especificación de las propiedades de colas de prioridad Si se añade un elemento a una cola de prioridad se obtiene una cola no vacía. prop_inserta_no_es_vacia :: Int -> CPrioridad Int -> Bool prop_inserta_no_es_vacia x c = not (esVacia (inserta x c)) 25 / 28
  • 26. IM Tema 16: El TAD de las colas de prioridad Comprobación de las implementaciones con QuickCheck Comprobación de las propiedades Tema 16: El TAD de las colas de prioridad 1. Especificación del TAD de las colas de prioridad 2. Implementaciones del TAD de las colas de prioridad 3. Comprobación de las implementaciones con QuickCheck Librerías auxiliares Generador de colas de prioridad Especificación de las propiedades de las colas de prioridad Comprobación de las propiedades 26 / 28
  • 27. IM Tema 16: El TAD de las colas de prioridad Comprobación de las implementaciones 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 "Corrección del generador" [testProperty "P0" prop_genCPrioridad_correcto], testGroup "Propiedade de colas de prioriad:" [testProperty "P1" prop_inserta_conmuta, testProperty "P2" prop_primero_inserta_vacia, testProperty "P3" prop_primero_inserta, testProperty "P4" prop_resto_inserta_vacia, testProperty "P5" prop_resto_inserta, testProperty "P6" prop_vacia_es_vacia, testProperty "P7" prop_inserta_no_es_vacia]] 27 / 28
  • 28. IM Tema 16: El TAD de las colas de prioridad Comprobación de las implementaciones con QuickCheck Comprobación de las propiedades Comprobación de las propiedades de las colas de prioridad ghci> compruebaPropiedades Corrección del generador: P0: [OK, passed 100 tests] Propiedades de colas de prioridad: 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] Properties Total Passed 8 8 Failed 0 0 Total 8 8 28 / 28