72
Tema 20: El TAD de los montículos Informática (2017–18) José A. Alonso Jiménez Grupo de Lógica Computacional Departamento de Ciencias de la Computación e I.A. Universidad de Sevilla

Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

Tema 20: El TAD de los montículosInformática (2017–18)

José A. Alonso Jiménez

Grupo de Lógica ComputacionalDepartamento de Ciencias de la Computación e I.A.

Universidad de Sevilla

Page 2: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículos

Tema 20: El TAD de los montículos1. Especificación del TAD de los montículos

Signatura del TAD de los montículosPropiedades del TAD de los montículos

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

3. Comprobación de la implementación con QuickCheckLibrerías auxiliaresGenerador de montículosEspecificación de las propiedades de los montículosComprobación de las propiedades

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

2 / 46

Page 3: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosEspecificació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ículosSignatura del TAD de los montículosPropiedades 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 / 46

Page 4: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosEspecificación del TAD de los montículos

Signatura del TAD de los montículos

Descripción de los montículosUn montículo es un árbol binario en el que los valores de cada nodo esmenor 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 / 46

Page 5: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosEspecificación del TAD de los montículos

Signatura del TAD de los montículos

Signatura del TAD de los montículosSignatura: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 / 46

Page 6: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosEspecificación del TAD de los montículos

Signatura del TAD de los montículos

Signatura del TAD de los montículosDescripción de las operaciones:I vacio es el montículo vacío.I (inserta x m) es el montículo obtenido añadiendo el elemento

x al montículo m.I (menor m) es el menor elemento del montículo m.I (resto m) es el montículo obtenido eliminando el menor

elemento del montículo m.I (esVacio m) se verifica si m es el montículo vacío.I (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 quelos valores de sus hijos.

6 / 46

Page 7: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosEspecificació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ículosSignatura del TAD de los montículosPropiedades 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 / 46

Page 8: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosEspecificació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, entoncesresto (inserta x m) == inserta x (resto m)

8. esVacio m ||esVacio (resto m) ||menor m <= menor (resto m)

8 / 46

Page 9: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosImplementació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ículosLos 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 / 46

Page 10: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosImplementación del TAD de los montículos

Los montículos como tipo de dato algebraico

Los montículos como tipo de dato algebraicoI 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

I Librería auxiliar:

import Data.List (sort)

10 / 46

Page 11: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosImplementación del TAD de los montículos

Los montículos como tipo de dato algebraico

Los montículos como tipo de dato algebraico

I Los montículos como tipo de dato algebraico

data Ord a => Monticulo a

= Vacio

| M a Int (Monticulo a) (Monticulo a)

deriving Show

I La forma de los montículos no vacío es (M v r i d) dondeI v es el valor de la raíz del montículo.I r es el rango del montículo; es decir, la menor distancia de la raíz

a un montículo vacío.I i es el submontículo izquierdo yI f es el submontículo derecho.

11 / 46

Page 12: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosImplementación del TAD de los montículos

Los montículos como tipo de dato algebraico

Los montículos como tipo de dato algebraicoEjemplos de montículosI 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

I 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 / 46

Page 13: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosImplementación del TAD de los montículos

Los montículos como tipo de dato algebraico

Los montículos como tipo de dato algebraico

I vacio es el montículo vacío.

vacio :: Ord a => Monticulo a

vacio = Vacio

I (rango m) es el rango del montículo m; es decir, la menordistancia 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 / 46

Page 14: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosImplementación del TAD de los montículos

Los montículos como tipo de dato algebraico

Los montículos como tipo de dato algebraico

I vacio es el montículo vacío.

vacio :: Ord a => Monticulo a

vacio = Vacio

I (rango m) es el rango del montículo m; es decir, la menordistancia 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 / 46

Page 15: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosImplementación del TAD de los montículos

Los montículos como tipo de dato algebraico

Los montículos como tipo de dato algebraico

I vacio es el montículo vacío.

vacio :: Ord a => Monticulo a

vacio = Vacio

I (rango m) es el rango del montículo m; es decir, la menordistancia 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 / 46

Page 16: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosImplementació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 losmontículos a y b. Se supone que x es menor o igual que el mínimo dea 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 Vacio))

(M 5 1 (M 7 1 Vacio Vacio) Vacio)

creaM :: Ord a => a -> Monticulo a -> Monticulo a -> Monticulo a

creaM x a b | rango a >= rango b = M x (rango b + 1) a b

| otherwise = M x (rango a + 1) b a

14 / 46

Page 17: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosImplementació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 losmontículos a y b. Se supone que x es menor o igual que el mínimo dea 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 Vacio))

(M 5 1 (M 7 1 Vacio Vacio) Vacio)

creaM :: Ord a => a -> Monticulo a -> Monticulo a -> Monticulo a

creaM x a b | rango a >= rango b = M x (rango b + 1) a b

| otherwise = M x (rango a + 1) b a

14 / 46

Page 18: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosImplementación del TAD de los montículos

Los montículos como tipo de dato algebraico

Los montículos como tipo de dato algebraico

I (mezcla m1 m2) es el montículo obtenido mezclando losmontí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 m Vacio = m

mezcla Vacio m = m

mezcla m1@(M x _ a1 b1) m2@(M y _ a2 b2)

| x <= y = creaM x a1 (mezcla b1 m2)

| otherwise = creaM y a2 (mezcla m1 b2)

15 / 46

Page 19: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosImplementación del TAD de los montículos

Los montículos como tipo de dato algebraico

Los montículos como tipo de dato algebraico

I (mezcla m1 m2) es el montículo obtenido mezclando losmontí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 m Vacio = m

mezcla Vacio m = m

mezcla m1@(M x _ a1 b1) m2@(M y _ a2 b2)

| x <= y = creaM x a1 (mezcla b1 m2)

| otherwise = creaM y a2 (mezcla m1 b2)

15 / 46

Page 20: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosImplementación del TAD de los montículos

Los montículos como tipo de dato algebraico

Los montículos como tipo de dato algebraico

I (inserta x m) es el montículo obtenido añadiendo el elementox 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 / 46

Page 21: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosImplementación del TAD de los montículos

Los montículos como tipo de dato algebraico

Los montículos como tipo de dato algebraico

I (inserta x m) es el montículo obtenido añadiendo el elementox 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 / 46

Page 22: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosImplementación del TAD de los montículos

Los montículos como tipo de dato algebraico

Los montículos como tipo de dato algebraicoI (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"

I (resto m) es el montículo obtenido eliminando el menorelemento 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 / 46

Page 23: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosImplementación del TAD de los montículos

Los montículos como tipo de dato algebraico

Los montículos como tipo de dato algebraicoI (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"

I (resto m) es el montículo obtenido eliminando el menorelemento 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 / 46

Page 24: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosImplementación del TAD de los montículos

Los montículos como tipo de dato algebraico

Los montículos como tipo de dato algebraicoI (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"

I (resto m) es el montículo obtenido eliminando el menorelemento 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 / 46

Page 25: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosImplementación del TAD de los montículos

Los montículos como tipo de dato algebraico

Los montículos como tipo de dato algebraico

I (esVacio m) se verifica si m es el montículo vacío.

esVacio :: Ord a => Monticulo a -> Bool

esVacio Vacio = True

esVacio _ = False

18 / 46

Page 26: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosImplementación del TAD de los montículos

Los montículos como tipo de dato algebraico

Los montículos como tipo de dato algebraico

I (esVacio m) se verifica si m es el montículo vacío.

esVacio :: Ord a => Monticulo a -> Bool

esVacio Vacio = True

esVacio _ = False

18 / 46

Page 27: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosImplementación del TAD de los montículos

Los montículos como tipo de dato algebraico

Los montículos como tipo de dato algebraicoI (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 losvalores 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 / 46

Page 28: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosImplementación del TAD de los montículos

Los montículos como tipo de dato algebraico

Los montículos como tipo de dato algebraicoI (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 losvalores 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 / 46

Page 29: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosImplementación del TAD de los montículos

Los montículos como tipo de dato algebraico

Los montículos como tipo de dato algebraico

I (elementos m) es la lista de los elementos del montículo m. Porejemplo,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 / 46

Page 30: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosImplementación del TAD de los montículos

Los montículos como tipo de dato algebraico

Los montículos como tipo de dato algebraico

I (elementos m) es la lista de los elementos del montículo m. Porejemplo,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 / 46

Page 31: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosImplementación del TAD de los montículos

Los montículos como tipo de dato algebraico

Los montículos como tipo de dato algebraicoI (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 / 46

Page 32: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosImplementación del TAD de los montículos

Los montículos como tipo de dato algebraico

Los montículos como tipo de dato algebraicoI (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 / 46

Page 33: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosImplementación del TAD de los montículos

Los montículos como tipo de dato algebraico

Los montículos como tipo de dato algebraico

I Los montículos son comparables por igualdad.

instance Ord a => Eq (Monticulo a) where

(==) = equivMonticulos

22 / 46

Page 34: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosComprobació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 QuickCheckLibrerías auxiliaresGenerador de montículosEspecificación de las propiedades de los montículosComprobación de las propiedades

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

23 / 46

Page 35: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosComprobación de la implementación con QuickCheck

Librerías auxiliares

Comprobación de las propiedades del TAD de losmontículos

I Importación de la implementación a verificar.

import Monticulo

I Importación de librerías auxiliares.

import Test.QuickCheck

import Test.Framework

import Test.Framework.Providers.QuickCheck2

24 / 46

Page 36: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosComprobació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 QuickCheckLibrerías auxiliaresGenerador de montículosEspecificación de las propiedades de los montículosComprobación de las propiedades

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

25 / 46

Page 37: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosComprobación de la implementación con QuickCheck

Generador de montículos

Generador de montículos

I (creaMonticulo xs) es el montículo correspondiente a la listaxs. 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 / 46

Page 38: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosComprobación de la implementación con QuickCheck

Generador de montículos

Generador de montículos

I (creaMonticulo xs) es el montículo correspondiente a la listaxs. 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 / 46

Page 39: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosComprobación de la implementación con QuickCheck

Generador de montículos

Generador de montículos

I 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 / 46

Page 40: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosComprobación de la implementación con QuickCheck

Generador de montículos

Corrección del generador de montículos

I 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 / 46

Page 41: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosComprobación de la implementación con QuickCheck

Generador de montículos

Corrección del generador de montículos

I 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 / 46

Page 42: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosComprobación de la implementación con QuickCheck

Generador de montículos

Generador de montículos no vacíos

I monticuloNV es un generador de montículos no vacío. Porejemplo,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 / 46

Page 43: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosComprobación de la implementación con QuickCheck

Generador de montículos

Corrección del generador de montículos no vacíos

I 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 / 46

Page 44: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosComprobación de la implementación con QuickCheck

Generador de montículos

Corrección del generador de montículos no vacíos

I 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 / 46

Page 45: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosComprobació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 QuickCheckLibrerías auxiliaresGenerador de montículosEspecificación de las propiedades de los montículosComprobación de las propiedades

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

31 / 46

Page 46: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosComprobació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

I vacio es un montículo.

prop_vacio_es_monticulo :: Bool

prop_vacio_es_monticulo =

esVacio (vacio :: Monticulo Int)

I 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 / 46

Page 47: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosComprobació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

I vacio es un montículo.

prop_vacio_es_monticulo :: Bool

prop_vacio_es_monticulo =

esVacio (vacio :: Monticulo Int)

I 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 / 46

Page 48: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosComprobació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

I vacio es un montículo.

prop_vacio_es_monticulo :: Bool

prop_vacio_es_monticulo =

esVacio (vacio :: Monticulo Int)

I 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 / 46

Page 49: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosComprobació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

I 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))

I Al borrar el menor elemento de un montículo no vacío se obtieneun montículo válido.

prop_resto_es_valida :: Monticulo Int -> Property

prop_resto_es_valida m =

forAll monticuloNV (\m -> valido (resto m))

33 / 46

Page 50: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosComprobació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

I 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))

I Al borrar el menor elemento de un montículo no vacío se obtieneun montículo válido.

prop_resto_es_valida :: Monticulo Int -> Property

prop_resto_es_valida m =

forAll monticuloNV (\m -> valido (resto m))

33 / 46

Page 51: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosComprobació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

I 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))

I Al borrar el menor elemento de un montículo no vacío se obtieneun montículo válido.

prop_resto_es_valida :: Monticulo Int -> Property

prop_resto_es_valida m =

forAll monticuloNV (\m -> valido (resto m))

33 / 46

Page 52: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosComprobación de la implementación con QuickCheck

Especificación de las propiedades de los montículos

Especificación de las propiedades de los montículosI 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)

I (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 / 46

Page 53: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosComprobación de la implementación con QuickCheck

Especificación de las propiedades de los montículos

Especificación de las propiedades de los montículosI 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)

I (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 / 46

Page 54: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosComprobación de la implementación con QuickCheck

Especificación de las propiedades de los montículos

Especificación de las propiedades de los montículosI 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)

I (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 / 46

Page 55: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosComprobació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 QuickCheckLibrerías auxiliaresGenerador de montículosEspecificación de las propiedades de los montículosComprobación de las propiedades

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

35 / 46

Page 56: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosComprobación de la implementación con QuickCheck

Comprobación de las propiedades

Definición del procedimiento de comprobaciónI 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 / 46

Page 57: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosComprobación de la implementación con QuickCheck

Comprobación de las propiedades

Comprobación de las propiedades de los montículosghci> 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 / 46

Page 58: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosImplementació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ículosLas colas de prioridad como montículos

38 / 46

Page 59: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosImplementación de las colas de prioridad mediante montículos

Las colas de prioridad como montículos

Las colas de prioridad como montículosCabecera 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 / 46

Page 60: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosImplementación de las colas de prioridad mediante montículos

Las colas de prioridad como montículos

Las colas de prioridad como montículosI Descripción de las operaciones:

I vacia es la cola de prioridad vacía.I (inserta x c) añade el elemento x a la cola de prioridad c.I (primero c) es el primer elemento de la cola de prioridad c.I (resto c) es el resto de la cola de prioridad c.I (esVacia c) se verifica si la cola de prioridad c es vacía.I (valida c) se verifica si c es una cola de prioridad válida.

I Las colas de prioridad como montículos.

newtype CPrioridad a = CP (M.Monticulo a)

deriving (Eq, Show)

40 / 46

Page 61: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosImplementación de las colas de prioridad mediante montículos

Las colas de prioridad como montículos

Las colas de prioridad como montículos

I Ejemplo de cola de prioridad:

cp1 :: CPrioridad Int

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

I 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 / 46

Page 62: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosImplementación de las colas de prioridad mediante montículos

Las colas de prioridad como montículos

Las colas de prioridad como montículos

I vacia es la cola de prioridad vacía. Por ejemplo,vacia CP Vacio

vacia :: Ord a => CPrioridad a

vacia = CP M.vacio

42 / 46

Page 63: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosImplementación de las colas de prioridad mediante montículos

Las colas de prioridad como montículos

Las colas de prioridad como montículos

I vacia es la cola de prioridad vacía. Por ejemplo,vacia CP Vacio

vacia :: Ord a => CPrioridad a

vacia = CP M.vacio

42 / 46

Page 64: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosImplementación de las colas de prioridad mediante montículos

Las colas de prioridad como montículos

Las colas de prioridad como montículos

I (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 / 46

Page 65: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosImplementación de las colas de prioridad mediante montículos

Las colas de prioridad como montículos

Las colas de prioridad como montículos

I (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 / 46

Page 66: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosImplementación de las colas de prioridad mediante montículos

Las colas de prioridad como montículos

Las colas de prioridad como montículosI (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

I (resto c) elimina la cabeza de la cola de prioridad c. Porejemplo,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 / 46

Page 67: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosImplementación de las colas de prioridad mediante montículos

Las colas de prioridad como montículos

Las colas de prioridad como montículosI (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

I (resto c) elimina la cabeza de la cola de prioridad c. Porejemplo,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 / 46

Page 68: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosImplementación de las colas de prioridad mediante montículos

Las colas de prioridad como montículos

Las colas de prioridad como montículosI (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

I (resto c) elimina la cabeza de la cola de prioridad c. Porejemplo,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 / 46

Page 69: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosImplementación de las colas de prioridad mediante montículos

Las colas de prioridad como montículos

Las colas de prioridad como montículosI (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

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

valida :: Ord a => CPrioridad a -> Bool

valida _ = True

45 / 46

Page 70: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosImplementación de las colas de prioridad mediante montículos

Las colas de prioridad como montículos

Las colas de prioridad como montículosI (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

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

valida :: Ord a => CPrioridad a -> Bool

valida _ = True

45 / 46

Page 71: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosImplementación de las colas de prioridad mediante montículos

Las colas de prioridad como montículos

Las colas de prioridad como montículosI (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

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

valida :: Ord a => CPrioridad a -> Bool

valida _ = True

45 / 46

Page 72: Tema 20: El TAD de los montículos - Informática (2017 18)jalonso/cursos/i1m-17/temas/tema-20.pdfIMTema20: ElTADdelosmontículos EspecificacióndelTADdelosmontículos PropiedadesdelTADdelosmontículos

IM Tema 20: El TAD de los montículosBibliografía

Bibliografía

1. Functional heap - Leftist tree

46 / 46