-
Notifications
You must be signed in to change notification settings - Fork 0
/
PilaPropiedades.hs
108 lines (88 loc) · 3.12 KB
/
PilaPropiedades.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
-- PilaPropiedades.hs
-- Propiedades del TAD pilas.
-- José A. Alonso Jiménez https://jaalonso.github.com
-- =====================================================================
{-# LANGUAGE TemplateHaskell #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Tema_14.PilaPropiedades where
-- Hay que elegir una implementación del TAD pilas.
import Tema_14.PilaConTipoDeDatoAlgebraico
-- import Tema_14.PilaConListas
-- import I1M.Pila
import Test.QuickCheck
-- ---------------------------------------------------------------------
-- Generador de pilas --
-- ---------------------------------------------------------------------
-- genPila es un generador de pilas. Por ejemplo,
-- λ> sample genPila
-- -
-- 0|0|-
-- -
-- -6|4|-3|3|0|-
-- -
-- 9|5|-1|-3|0|-8|-5|-7|2|-
-- -3|-10|-3|-12|11|6|1|-2|0|-12|-6|-
-- 2|-14|-5|2|-
-- 5|9|-
-- -1|-14|5|-
-- 6|13|0|17|-12|-7|-8|-19|-14|-5|10|14|3|-18|2|-14|-11|-6|-
genPila :: (Arbitrary a, Num a) => Gen (Pila a)
genPila = do
xs <- listOf arbitrary
return (foldr apila vacia xs)
-- El tipo pila es una instancia del arbitrario.
instance (Arbitrary a, Num a) => Arbitrary (Pila a) where
arbitrary = genPila
-- ---------------------------------------------------------------------
-- Propiedades
-- ---------------------------------------------------------------------
-- Propiedad. La cima de la pila que resulta de apilar x en una pila p
-- es x.
prop_cima_apila :: Int -> Pila Int -> Bool
prop_cima_apila x p =
cima (apila x p) == x
-- Comprobación.
-- λ> quickCheck prop_cima_apila
-- +++ OK, passed 100 tests.
-- Propiedad. La pila que resulta de desapilar después de apilar
-- cualquier elemento es la pila inicial.
prop_desapila_apila :: Int -> Pila Int -> Bool
prop_desapila_apila x p =
desapila (apila x p) == p
-- Comprobación.
-- λ> quickCheck prop_desapila_apila
-- +++ OK, passed 100 tests.
-- Propiedad. La pila vacía está vacía.
prop_vacia_esta_vacia :: Bool
prop_vacia_esta_vacia = esVacia vacia
-- Comprobación.
-- λ> quickCheck prop_vacia_esta_vacia
-- +++ OK, passed 100 tests.
-- Propiedad. La pila que resulta de apilar 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))
-- Comprobación.
-- λ> quickCheck prop_apila_no_es_vacia
-- +++ OK, passed 100 tests.
-- ---------------------------------------------------------------------
-- § Verificación --
-- ---------------------------------------------------------------------
return []
verificaPila :: IO Bool
verificaPila = $quickCheckAll
-- La verificación es
-- λ> verificaPila
-- === prop_cima_apila from PilaPropiedades.hs:49 ===
-- +++ OK, passed 100 tests.
--
-- === prop_desapila_apila from PilaPropiedades.hs:59 ===
-- +++ OK, passed 100 tests.
--
-- === prop_vacia_esta_vacia from PilaPropiedades.hs:68 ===
-- +++ OK, passed 1 test.
--
-- === prop_apila_no_es_vacia from PilaPropiedades.hs:77 ===
-- +++ OK, passed 100 tests.
--
-- True