-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathConjunto.hs
66 lines (62 loc) · 2.58 KB
/
Conjunto.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
-- Conjunto.hs
-- El tipo abstracto de datos de los conjuntos.
-- José A. Alonso Jiménez <https://jaalonso.github.io>
-- Sevilla, 28-febrero-2023
-- ---------------------------------------------------------------------
-- Un conjunto es una estructura de datos, caracterizada por ser una
-- colección de elementos en la que no importe ni el orden ni la
-- repetición de elementos.
--
-- Las operaciones que definen al tipo abstracto de datos (TAD) de los
-- conjuntos (cuyos elementos son del tipo a) son las siguientes:
-- vacio :: Conj a
-- inserta :: Ord a => a -> Conj a -> Conj a
-- menor :: Ord a => Conj a -> a
-- elimina :: Ord a => a -> Conj a -> Conj a
-- pertenece :: Ord a => a -> Conj a -> Bool
-- esVacio :: Conj a -> Bool
-- tales que
-- + vacio es el conjunto vacío.
-- + (inserta x c) es el conjunto obtenido añadiendo el elemento x al
-- conjunto c.
-- + (menor c) es el menor elemento del conjunto c.
-- + (elimina x c) es el conjunto obtenido eliminando el elemento x
-- del conjunto c.
-- + (pertenece x c) se verifica si x pertenece al conjunto c.
-- + (esVacio c) se verifica si c es el conjunto vacío.
--
-- Las operaciones tienen que verificar las siguientes propiedades:
-- + inserta x (inserta x c) == inserta x c
-- + inserta x (inserta y c) == inserta y (inserta x c)
-- + not (pertenece x vacio)
-- + pertenece y (inserta x c) == (x==y) || pertenece y c
-- + elimina x vacio == vacio
-- + Si x == y, entonces
-- elimina x (inserta y c) == elimina x c
-- + Si x /= y, entonces
-- elimina x (inserta y c) == inserta y (elimina x c)
-- + esVacio vacio
-- + not (esVacio (inserta x c))
--
-- Para usar el TAD hay que usar una implementación concreta. En
-- principio, consideraremos las siguientes:
-- + mediante listas no ordenadas con duplicados,
-- + mediante listas no ordenadas sin duplicados,
-- + mediante listas ordenadas sin duplicados y
-- + mediante la librería Data.Set.
-- Hay que elegir la que se desee utilizar, descomentándola y comentando
-- las otras.
{-# OPTIONS_GHC -fno-warn-unused-imports #-}
module TAD.Conjunto
(Conj,
vacio, -- Conj a
inserta, -- Ord a => a -> Conj a -> Conj a
menor, -- Ord a => Conj a -> a
elimina, -- Ord a => a -> Conj a -> Conj a
pertenece, -- Ord a => a -> Conj a -> Bool
esVacio -- Conj a -> Bool
) where
-- import TAD.ConjuntoConListasNoOrdenadasConDuplicados
-- import TAD.ConjuntoConListasNoOrdenadasSinDuplicados
import TAD.ConjuntoConListasOrdenadasSinDuplicados
-- import TAD.ConjuntoConLibreria