-
Notifications
You must be signed in to change notification settings - Fork 0
/
MonticuloPropiedades.hs
188 lines (154 loc) · 5.52 KB
/
MonticuloPropiedades.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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
-- MonticuloPropiedades.hs
-- Propiedades del TAD montículos.
-- José A. Alonso Jiménez https://jaalonso.github.com
-- =====================================================================
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE FlexibleInstances #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Tema_20.MonticuloPropiedades where
-- Importación de la implementación de los montículos que se desea
-- verificar.
import Tema_20.Monticulo
-- import I1M.Monticulo
import Test.QuickCheck
-- ---------------------------------------------------------------------
-- Generador de montículos --
-- ---------------------------------------------------------------------
-- (creaMonticulo xs) es el montículo correspondiente a la lista xs. Por
-- ejemplo,
-- λ> creaMonticulo [6,1,4,8]
-- M 1 2 (M 4 1 (M 8 1 Vacio Vacio) Vacio) (M 6 1 Vacio Vacio)
creaMonticulo :: [Int] -> Monticulo Int
creaMonticulo = foldr inserta vacio
-- genMonticulo es un generador de montículos. Por ejemplo,
-- λ> sample genMonticulo
-- VacioM
-- M (-1) 1 (M 1 1 VacioM VacioM) VacioM
-- ...
genMonticulo :: Gen (Monticulo Int)
genMonticulo = do
xs <- listOf arbitrary
return (creaMonticulo xs)
-- Montículo es una instancia de la clase arbitraria.
instance Arbitrary (Monticulo Int) where
arbitrary = genMonticulo
-- genMonticulo genera montículos válidos.
prop_genMonticulo :: Monticulo Int -> Bool
prop_genMonticulo = valido
-- Comprobación.
-- λ> quickCheck prop_genMonticulo
-- +++ OK, passed 100 tests.
-- monticuloNV es un generador de montículos no vacío. Por ejemplo,
-- λ> sample monticuloNV
-- M 0 1 VacioM VacioM
-- M 1 1 (M 1 1 (M 1 1 VacioM VacioM) VacioM) VacioM
-- M 0 2 (M 1 1 VacioM VacioM) (M 2 1 VacioM VacioM)
-- M (-4) 2 (M (-3) 1 VacioM VacioM) (M 1 1 VacioM VacioM)
-- M 3 1 VacioM VacioM
-- M (-8) 1 (M (-5) 1 VacioM VacioM) VacioM
monticuloNV :: Gen (Monticulo Int)
monticuloNV = do
xs <- listOf arbitrary
x <- arbitrary
return (creaMonticulo (x:xs))
-- Prop. monticuloNV genera montículos no vacío.
prop_monticuloNV :: Monticulo Int -> Property
prop_monticuloNV _ =
forAll monticuloNV (\m -> valido m && not (esVacio m))
-- Comprobación.
-- λ> quickCheck prop_monticuloNV
-- +++ OK, passed 100 tests.
-- ---------------------------------------------------------------------
-- Propiedades
-- ---------------------------------------------------------------------
-- Propiedades de vacio
-- --------------------
-- Propiedad. vacio es un montículo.
prop_vacio_es_monticulo :: Bool
prop_vacio_es_monticulo =
esVacio (vacio :: Monticulo Int)
-- Comprobación.
-- λ> prop_vacio_es_monticulo
-- True
-- Propiedades de inserta
-- ----------------------
-- Propiedad. inserta produce montículos válidos.
prop_inserta_es_valida :: Int -> Monticulo Int -> Bool
prop_inserta_es_valida x m =
valido (inserta x m)
-- Comprobación.
-- λ> quickCheck prop_inserta_es_valida
-- +++ OK, passed 100 tests.
-- Propiedad. 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))
-- Comprobación.
-- λ> quickCheck prop_inserta_no_vacio
-- +++ OK, passed 100 tests.
-- Propiedades de resto
-- --------------------
-- Propiedad. Al borrar el menor elemento de un montículo no vacío se
-- obtiene un montículo válido.
prop_resto_es_valida :: Monticulo Int -> Property
prop_resto_es_valida _ =
forAll monticuloNV (valido . resto)
-- Comprobación.
-- λ> quickCheck prop_resto_es_valida
-- +++ OK, passed 100 tests.
-- Propiedad. 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 o (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)
-- Comprobación.
-- λ> quickCheck prop_resto_inserta
-- +++ OK, passed 100 tests.
-- Propiedades de menor
-- --------------------
-- Propiedad. (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)
-- Comprobación.
-- λ> quickCheck prop_menor_es_minimo
-- +++ OK, passed 100 tests.
-- ---------------------------------------------------------------------
-- § Verificación --
-- ---------------------------------------------------------------------
return []
verificaMonticulo :: IO Bool
verificaMonticulo = $quickCheckAll
-- La verificación es
-- λ> verificaMonticulo
-- === prop_genMonticulo from MonticuloPropiedades.hs:46 ===
-- +++ OK, passed 100 tests.
--
-- === prop_monticuloNV from MonticuloPropiedades.hs:68 ===
-- +++ OK, passed 100 tests.
--
-- === prop_vacio_es_monticulo from MonticuloPropiedades.hs:84 ===
-- +++ OK, passed 1 test.
--
-- === prop_inserta_es_valida from MonticuloPropiedades.hs:96 ===
-- +++ OK, passed 100 tests.
--
-- === prop_inserta_no_vacio from MonticuloPropiedades.hs:105 ===
-- +++ OK, passed 100 tests.
--
-- === prop_resto_es_valida from MonticuloPropiedades.hs:118 ===
-- +++ OK, passed 100 tests.
--
-- === prop_resto_inserta from MonticuloPropiedades.hs:129 ===
-- +++ OK, passed 100 tests.
--
-- === prop_menor_es_minimo from MonticuloPropiedades.hs:144 ===
-- +++ OK, passed 100 tests.
--
-- True