Tema 14: El TAD de las pilas          Informática (2010–11)          José A. Alonso Jiménez        Grupo de Lógica Computa...
IM Tema 14: El TAD de las pilasTema 14: El TAD de las pilas 1. Tipos abstractos de datos       Abstracción y tipos abstrac...
IM Tema 14: El TAD de las pilas  Tipos abstractos de datos     Abstracción y tipos abstractos de datosTema 14: El TAD de l...
IM Tema 14: El TAD de las pilas  Tipos abstractos de datos     Abstracción y tipos abstractos de datosAbstracción y tipos ...
IM Tema 14: El TAD de las pilas  Especificación del TAD de las pilas     Signatura del TAD pilasTema 14: El TAD de las pila...
IM Tema 14: El TAD de las pilas  Especificación del TAD de las pilas     Signatura del TAD pilasDescripción informal de las...
IM Tema 14: El TAD de las pilas  Especificación del TAD de las pilas     Signatura del TAD pilasSignatura del TAD de las pi...
IM Tema 14: El TAD de las pilas  Especificación del TAD de las pilas     Propiedades del TAD de las pilasTema 14: El TAD de...
IM Tema 14: El TAD de las pilas  Especificación del TAD de las pilas     Propiedades del TAD de las pilasPropiedades de las...
IM Tema 14: El TAD de las pilas  Implementaciones del TAD de las pilas     Las pilas como tipos de datos algebraicosTema 1...
IM Tema 14: El TAD de las pilas  Implementaciones del TAD de las pilas     Las pilas como tipos de datos algebraicosLas pi...
IM Tema 14: El TAD de las pilas  Implementaciones del TAD de las pilas     Las pilas como tipos de datos algebraicosLas pi...
IM Tema 14: El TAD de las pilas  Implementaciones del TAD de las pilas     Las pilas como tipos de datos algebraicosLas pi...
IM Tema 14: El TAD de las pilas  Implementaciones del TAD de las pilas     Las pilas como tipos de datos algebraicosLas pi...
IM Tema 14: El TAD de las pilas  Implementaciones del TAD de las pilas     Las pilas como tipos de datos algebraicosLas pi...
IM Tema 14: El TAD de las pilas  Implementaciones del TAD de las pilas     Las pilas como listasTema 14: El TAD de las pil...
IM Tema 14: El TAD de las pilas  Implementaciones del TAD de las pilas     Las pilas como listasImplementación de las pila...
IM Tema 14: El TAD de las pilas  Implementaciones del TAD de las pilas     Las pilas como listasImplementación de las pila...
IM Tema 14: El TAD de las pilas  Implementaciones del TAD de las pilas     Las pilas como listasImplementación de las pila...
IM Tema 14: El TAD de las pilas  Implementaciones del TAD de las pilas     Las pilas como listasImplementación de las pila...
IM Tema 14: El TAD de las pilas  Implementaciones del TAD de las pilas     Las pilas como listasImplementación de las pila...
IM Tema 14: El TAD de las pilas  Comprobación de las implementaciones con QuickCheck     Librerías auxiliaresTema 14: El T...
IM Tema 14: El TAD de las pilas  Comprobación de las implementaciones con QuickCheck     Librerías auxiliaresImportación d...
IM Tema 14: El TAD de las pilas  Comprobación de las implementaciones con QuickCheck     Generador de pilasTema 14: El TAD...
IM Tema 14: El TAD de las pilas  Comprobación de las implementaciones con QuickCheck     Generador de pilasGenerador de pi...
IM Tema 14: El TAD de las pilas  Comprobación de las implementaciones con QuickCheck     Especificación de las propiedades ...
IM Tema 14: El TAD de las pilas  Comprobación de las implementaciones con QuickCheck     Especificación de las propiedades ...
IM Tema 14: El TAD de las pilas  Comprobación de las implementaciones con QuickCheck     Especificación de las propiedades ...
IM Tema 14: El TAD de las pilas  Comprobación de las implementaciones con QuickCheck     Comprobación de las propiedadesTe...
IM Tema 14: El TAD de las pilas  Comprobación de las implementaciones con QuickCheck     Comprobación de las propiedadesDe...
IM Tema 14: El TAD de las pilas  Comprobación de las implementaciones con QuickCheck     Comprobación de las propiedadesCo...
Próxima SlideShare
Cargando en…5
×

I1M2010-T14: El tipo abstracto de datos de las pilas en Haskell

1.227 visualizaciones

Publicado el

Se especifica el tipo abstracto de datos de las pilas, se presentan implementaciones en Haskell y se comprueban sus propiedades características con QuickCheck.

Este es el 14º tema del curso de introducción a Haskell. El código y los restantes temas se encuentran en http://www.cs.us.es/~jalonso/cursos/i1m-10/temas.html

Publicado en: Educación
0 comentarios
0 recomendaciones
Estadísticas
Notas
  • Sé el primero en comentar

  • Sé el primero en recomendar esto

Sin descargas
Visualizaciones
Visualizaciones totales
1.227
En SlideShare
0
De insertados
0
Número de insertados
41
Acciones
Compartido
0
Descargas
16
Comentarios
0
Recomendaciones
0
Insertados 0
No insertados

No hay notas en la diapositiva.

I1M2010-T14: El tipo abstracto de datos de las pilas en Haskell

  1. 1. Tema 14: El TAD de las pilas Informática (2010–11) José A. Alonso Jiménez Grupo de Lógica ComputacionalDepartamento de Ciencias de la Computación e I.A. Universidad de Sevilla
  2. 2. IM Tema 14: El TAD de las pilasTema 14: El TAD de las pilas 1. Tipos abstractos de datos Abstracción y tipos abstractos de datos 2. Especificación del TAD de las pilas Signatura del TAD pilas Propiedades del TAD de las pilas 3. Implementaciones del TAD de las pilas Las pilas como tipos de datos algebraicos Las pilas como listas 4. Comprobación de las implementaciones con QuickCheck Librerías auxiliares Generador de pilas Especificación de las propiedades de las pilas Comprobación de las propiedades 2 / 31
  3. 3. IM Tema 14: El TAD de las pilas Tipos abstractos de datos Abstracción y tipos abstractos de datosTema 14: El TAD de las pilas 1. Tipos abstractos de datos Abstracción y tipos abstractos de datos 2. Especificación del TAD de las pilas 3. Implementaciones del TAD de las pilas 4. Comprobación de las implementaciones con QuickCheck 3 / 31
  4. 4. IM Tema 14: El TAD de las pilas Tipos abstractos de datos Abstracción y tipos abstractos de datosAbstracción y tipos abstractos de datos La abstracción es un mecanismo para comprender problemas que involucran una gran cantidad de detalles. Aspectos de la abstracción: Destacar los detalles relevantes. Ocultar los detalles irrelevantes. Un tipo abstracto de datos (TAD) es una colección de valores y operaciones que se definen mediante una especificación que es independiente de cualquier representación. Un TAD es una abstracción: Se destacan los detalles (normalmente pocos) de la especificación (el qué). Se ocultan los detalles (normalmente numerosos) de la implementación (el cómo). Analogía con las estructuras algebraicas. 4 / 31
  5. 5. IM Tema 14: El TAD de las pilas Especificación del TAD de las pilas Signatura del TAD pilasTema 14: El TAD de las pilas 1. Tipos abstractos de datos 2. Especificación del TAD de las pilas Signatura del TAD pilas Propiedades del TAD de las pilas 3. Implementaciones del TAD de las pilas 4. Comprobación de las implementaciones con QuickCheck 5 / 31
  6. 6. IM Tema 14: El TAD de las pilas Especificación del TAD de las pilas Signatura del TAD pilasDescripción informal de las pilas Una pila es una estructura de datos, caracterizada por ser una secuencia de elementos en la que las operaciones de inserción de extracción se realizan por el mismo extremo. La pilas también se llaman estructuras LIFO (del inglés Last In First Out), debido a que el último elemento en entrar será el primero en salir. Analogía con las pilas de platos. 6 / 31
  7. 7. IM Tema 14: El TAD de las pilas Especificación del TAD de las pilas Signatura del TAD pilasSignatura del TAD de las pilas Signatura: vacia :: Pila a apila :: a -> Pila a -> Pila a cima :: Pila a -> a desapila :: Pila a -> Pila a esVacia :: Pila a -> Bool Descripción: vacia es la pila vacía. (apila x p) es la pila obtenida añadiendo x al principio de p. (cima p) es la cima de la pila p. (desapila p) es la pila obtenida suprimiendo la cima de p. (esVacia p) se verifica si p es la pila vacía. 7 / 31
  8. 8. IM Tema 14: El TAD de las pilas Especificación del TAD de las pilas Propiedades del TAD de las pilasTema 14: El TAD de las pilas 1. Tipos abstractos de datos 2. Especificación del TAD de las pilas Signatura del TAD pilas Propiedades del TAD de las pilas 3. Implementaciones del TAD de las pilas 4. Comprobación de las implementaciones con QuickCheck 8 / 31
  9. 9. IM Tema 14: El TAD de las pilas Especificación del TAD de las pilas Propiedades del TAD de las pilasPropiedades de las pilas 1. cima (apila x p) == x 2. desapila (apila x p) == p 3. esVacia vacia 4. not (esVacia (apila x p)) 9 / 31
  10. 10. IM Tema 14: El TAD de las pilas Implementaciones del TAD de las pilas Las pilas como tipos de datos algebraicosTema 14: El TAD de las pilas 1. Tipos abstractos de datos 2. Especificación del TAD de las pilas 3. Implementaciones del TAD de las pilas Las pilas como tipos de datos algebraicos Las pilas como listas 4. Comprobación de las implementaciones con QuickCheck 10 / 31
  11. 11. IM Tema 14: El TAD de las pilas Implementaciones del TAD de las pilas Las pilas como tipos de datos algebraicosLas pilas mediante tipos de datos algebraicos Cabecera del módulo: module PilaConTipoDeDatoAlgebraico (Pila, vacia, -- Pila a apila, -- a -> Pila a -> Pila a cima, -- Pila a -> a desapila, -- Pila a -> Pila a esVacia -- Pila a -> Bool ) where Tipo de dato algebraico de las pilas. data Pila a = Vacia | P a (Pila a) deriving Eq 11 / 31
  12. 12. IM Tema 14: El TAD de las pilas Implementaciones del TAD de las pilas Las pilas como tipos de datos algebraicosLas pilas mediante tipos de datos algebraicos Procedimiento de escritura de pilas. instance (Show a) => Show (Pila a) where showsPrec p Vacia cad = showChar - cad showsPrec p (P x s) cad = shows x (showChar | (shows s cad)) Ejemplo de pila: Definición p1 :: Pila Int p1 = apila 1 (apila 2 (apila 3 vacia)) Sesión ghci> p1 1|2|3|- 12 / 31
  13. 13. IM Tema 14: El TAD de las pilas Implementaciones del TAD de las pilas Las pilas como tipos de datos algebraicosLas pilas mediante tipos de datos algebraicos vacia es la pila vacía. Por ejemplo, ghci> vacia - vacia :: Pila a vacia = Vacia (apila x p) es la pila obtenida añadiedo x encima de la pila p. Por ejemplo, apila 4 p1 => 4|1|2|3|- apila :: a -> Pila a -> Pila a apila x p = P x p 13 / 31
  14. 14. IM Tema 14: El TAD de las pilas Implementaciones del TAD de las pilas Las pilas como tipos de datos algebraicosLas pilas mediante tipos de datos algebraicos (cima p) es la cima de la pila p. Por ejemplo, cima p1 == 1 cima :: Pila a -> a cima Vacia = error "cima: pila vacia" cima (P x _) = x (desapila p) es la pila obtenida suprimiendo la cima de la pila p. Por ejemplo, desapila p1 => 2|3|- desapila :: Pila a -> Pila a desapila Vacia = error "desapila: pila vacia" desapila (P _ p) = p 14 / 31
  15. 15. IM Tema 14: El TAD de las pilas Implementaciones del TAD de las pilas Las pilas como tipos de datos algebraicosLas pilas mediante tipos de datos algebraicos (esVacia p) se verifica si p es la pila vacía. Por ejemplo, esVacia p1 == False esVacia vacia == True esVacia :: Pila a -> Bool esVacia Vacia = True esVacia _ = False 15 / 31
  16. 16. IM Tema 14: El TAD de las pilas Implementaciones del TAD de las pilas Las pilas como listasTema 14: El TAD de las pilas 1. Tipos abstractos de datos 2. Especificación del TAD de las pilas 3. Implementaciones del TAD de las pilas Las pilas como tipos de datos algebraicos Las pilas como listas 4. Comprobación de las implementaciones con QuickCheck 16 / 31
  17. 17. IM Tema 14: El TAD de las pilas Implementaciones del TAD de las pilas Las pilas como listasImplementación de las pilas mediante listas Cabecera del módulo module PilaConListas (Pila, vacia, -- Pila a apila, -- a -> Pila a -> Pila a cima, -- Pila a -> a desapila, -- Pila a -> Pila a esVacia -- Pila a -> Bool ) where Tipo de datos de las pilas: newtype Pila a = P [a] deriving Eq 17 / 31
  18. 18. IM Tema 14: El TAD de las pilas Implementaciones del TAD de las pilas Las pilas como listasImplementación de las pilas mediante listas Procedimiento de escritura de pilas. instance (Show a) => Show (Pila a) where showsPrec p (P []) cad = showChar - cad showsPrec p (P (x:xs)) cad = shows x (showChar | (shows (P xs) cad)) Ejemplo de pila: p1 es la pila obtenida anadiéndole los elementos 3, 2 y 1 a la pila vacía. Por ejemplo, ghci> p1 1|2|3|- p1 = apila 1 (apila 2 (apila 3 vacia)) 18 / 31
  19. 19. IM Tema 14: El TAD de las pilas Implementaciones del TAD de las pilas Las pilas como listasImplementación de las pilas mediante listas vacia es la pila vacía. Por ejemplo, ghci> vacia - vacia :: Pila a vacia = P [] (apila x p) es la pila obtenida añadiendo x encima de la pila p. Por ejemplo, apila 4 p1 => 4|1|2|3|-| apila :: a -> Pila a -> Pila a apila x (P xs) = P (x:xs) 19 / 31
  20. 20. IM Tema 14: El TAD de las pilas Implementaciones del TAD de las pilas Las pilas como listasImplementación de las pilas mediante listas (cima p) es la cima de la pila p. Por ejemplo, cima p1 == 1 cima :: Pila a -> a cima (P (x:_)) = x cima (P []) = error "cima de la pila vacia" (desapila p) es la pila obtenida suprimiendo la cima de la pila p. Por ejemplo, desapila p1 => 2|3|- desapila :: Pila a -> Pila a desapila (P []) = error "desapila la pila vacia" desapila (P (_:xs)) = P xs 20 / 31
  21. 21. IM Tema 14: El TAD de las pilas Implementaciones del TAD de las pilas Las pilas como listasImplementación de las pilas mediante listas (esVacia p) se verifica si p es la pila vacía. Por ejemplo, esVacia p1 == False esVacia vacia == True esVacia :: Pila a -> Bool esVacia (P xs) = null xs 21 / 31
  22. 22. IM Tema 14: El TAD de las pilas Comprobación de las implementaciones con QuickCheck Librerías auxiliaresTema 14: El TAD de las pilas 1. Tipos abstractos de datos 2. Especificación del TAD de las pilas 3. Implementaciones del TAD de las pilas 4. Comprobación de las implementaciones con QuickCheck Librerías auxiliares Generador de pilas Especificación de las propiedades de las pilas Comprobación de las propiedades 22 / 31
  23. 23. IM Tema 14: El TAD de las pilas Comprobación de las implementaciones con QuickCheck Librerías auxiliaresImportación de librerías Importación de la implementación de pilas que se desea comprobar. import PilaConTipoDeDatoAlgebraico -- import PilaConListas Importación de las librerías de comprobación import Test.QuickCheck import Test.Framework import Test.Framework.Providers.QuickCheck2 23 / 31
  24. 24. IM Tema 14: El TAD de las pilas Comprobación de las implementaciones con QuickCheck Generador de pilasTema 14: El TAD de las pilas 1. Tipos abstractos de datos 2. Especificación del TAD de las pilas 3. Implementaciones del TAD de las pilas 4. Comprobación de las implementaciones con QuickCheck Librerías auxiliares Generador de pilas Especificación de las propiedades de las pilas Comprobación de las propiedades 24 / 31
  25. 25. IM Tema 14: El TAD de las pilas Comprobación de las implementaciones con QuickCheck Generador de pilasGenerador de pilas genPila es un generador de pilas. Por ejemplo, ghci> sample genPila 0|0|- -6|4|-3|3|0|- - 9|5|-1|-3|0|-8|-5|-7|2|- ... genPila :: (Num a, Arbitrary a) => Gen (Pila a) genPila = do xs <- listOf arbitrary return (foldr apila vacia xs) instance (Arbitrary a, Num a) => Arbitrary (Pila a) where arbitrary = genPila 25 / 31
  26. 26. IM Tema 14: El TAD de las pilas Comprobación de las implementaciones con QuickCheck Especificación de las propiedades de las pilasTema 14: El TAD de las pilas 1. Tipos abstractos de datos 2. Especificación del TAD de las pilas 3. Implementaciones del TAD de las pilas 4. Comprobación de las implementaciones con QuickCheck Librerías auxiliares Generador de pilas Especificación de las propiedades de las pilas Comprobación de las propiedades 26 / 31
  27. 27. IM Tema 14: El TAD de las pilas Comprobación de las implementaciones con QuickCheck Especificación de las propiedades de las pilasEspecificación de las propiedades de pilas La cima de la pila que resulta de añadir x a la pila p es x. prop_cima_apila :: Int -> Pila Int -> Bool prop_cima_apila x p = cima (apila x p) == x La pila que resulta de desapilar después de añadir cualquier elemento a una pila p es p. prop_desapila_apila :: Int -> Pila Int -> Bool prop_desapila_apila x p = desapila (apila x p) == p 27 / 31
  28. 28. IM Tema 14: El TAD de las pilas Comprobación de las implementaciones con QuickCheck Especificación de las propiedades de las pilasEspecificación de las propiedades de pila La pila vacía está vacía. prop_vacia_esta_vacia :: Bool prop_vacia_esta_vacia = esVacia vacia La pila que resulta de añadir un elemento en un pila cualquiera no es vacía. prop_apila_no_es_vacia :: Int -> Pila Int -> Bool prop_apila_no_es_vacia x p = not (esVacia (apila x p)) 28 / 31
  29. 29. IM Tema 14: El TAD de las pilas Comprobación de las implementaciones con QuickCheck Comprobación de las propiedadesTema 14: El TAD de las pilas 1. Tipos abstractos de datos 2. Especificación del TAD de las pilas 3. Implementaciones del TAD de las pilas 4. Comprobación de las implementaciones con QuickCheck Librerías auxiliares Generador de pilas Especificación de las propiedades de las pilas Comprobación de las propiedades 29 / 31
  30. 30. IM Tema 14: El TAD de las pilas Comprobación de las implementaciones con QuickCheck Comprobación de las propiedadesDefinición del procedimiento de comprobación compruebaPropiedades comprueba todas las propiedades con la plataforma de verificación. compruebaPropiedades = defaultMain [testGroup "Propiedades del TAD pilas" [testProperty "P1" prop_cima_apila, testProperty "P2" prop_desapila_apila, testProperty "P3" prop_vacia_esta_vacia, testProperty "P4" prop_apila_no_es_vacia]] 30 / 31
  31. 31. IM Tema 14: El TAD de las pilas Comprobación de las implementaciones con QuickCheck Comprobación de las propiedadesComprobación de las propiedades de las pilas ghci> compruebaPropiedades Propiedades del TAD pilas: P1: [OK, passed 100 tests] P2: [OK, passed 100 tests] P3: [OK, passed 100 tests] P4: [OK, passed 100 tests] Properties Total Passed 4 4 Failed 0 0 Total 4 4 31 / 31

×