MD en Haskell - idus.us.es
Transcript of MD en Haskell - idus.us.es
Matemaacutetica discreta en Haskell
Facultad de MatemaacuteticasDepartamento de Ciencias de la Computacioacuten e Inteligencia Artificial
Trabajo Fin de Grado
Mariacutea Dolores Valverde Rodriacuteguez
2
Esta obra estaacute bajo una licencia ReconocimientondashNoComercialndashCompartirIgual 25 Spainde Creative Commons
Se permitecopiar distribuir y comunicar puacuteblicamente la obrahacer obras derivadas
Bajo las condiciones siguientes
Reconocimiento En cualquier explotacioacuten de la obra autorizada por la licenciaharaacute falta reconocer la autoriacutea
No comercial La explotacioacuten de la obra queda limitada a usos no comerciales
Compartir bajo la misma licencia La explotacioacuten autorizada incluye la creacioacutende obras derivadas siempre que mantengan la misma licencia al ser divulgadas
Esto es un resumen del texto legal (la licencia completa) Para ver una copia de es-ta licencia visite httpcreativecommonsorglicensesby-nc-sa25es o envieuna carta a Creative Commons 559 Nathan Abbott Way Stanford California 94305USA
Iacutendice general
Agradecimientos 7
Abstract 9
Introduccioacuten 11
1 Conjuntos 15
11 El TAD de los conjuntos 16
12 Representaciones de conjuntos 17121 Conjuntos como listas ordenadas sin repeticioacuten 17122 Definicioacuten de conjunto 19123 Subconjuntos 20124 Igualdad de conjuntos 21125 Subconjuntos propios 21126 Complementario de un conjunto 22127 Cardinal de un conjunto 22128 Conjunto unitario 23129 Unioacuten de conjuntos 231210 Interseccioacuten de conjuntos 241211 Producto cartesiano 251212 Combinaciones 251213 Variaciones con repeticioacuten 261214 Conjuntos como listas sin repeticioacuten 261215 Definicioacuten de conjunto 281216 Subconjuntos 291217 Igualdad de conjuntos 301218 Subconjuntos propios 301219 Complementario de un conjunto 311220 Cardinal de un conjunto 311221 Conjunto unitario 321222 Unioacuten de conjuntos 32
3
4 Iacutendice general
1223 Interseccioacuten de conjuntos 331224 Producto cartesiano 341225 Combinaciones 341226 Variaciones con repeticioacuten 35
13 Eleccioacuten de la representacioacuten de conjuntos 35
2 Relaciones y funciones 37
21 Relaciones 37211 Relacioacuten binaria 37212 Imagen por una relacioacuten 37213 Dominio de una relacioacuten 38214 Rango de una relacioacuten 38215 Antiimagen por una relacioacuten 38216 Relacioacuten funcional 39
22 Relaciones homogeacuteneas 39221 Relaciones reflexivas 40222 Relaciones simeacutetricas 40223 Relaciones antisimeacutetricas 41224 Relaciones transitivas 41225 Relaciones de equivalencia 42226 Relaciones de orden 42227 Clases de equivalencia 43
23 Funciones 43231 Imagen por una funcioacuten 44232 Funciones inyectivas 45233 Funciones sobreyectivas 45234 Funciones biyectivas 46235 Inversa de una funcioacuten 47
3 Introduccioacuten a la teoriacutea de grafos 49
31 Definicioacuten de grafo 50
32 El TAD de los grafos 50321 Grafos como listas de aristas 51
33 Generador de grafos 54
34 Ejemplos de grafos 55341 Grafo nulo 55342 Grafo ciclo 56343 Grafo de la amistad 56
Iacutendice general 5
344 Grafo completo 57345 Grafo bipartito 58346 Grafo estrella 60347 Grafo rueda 60348 Grafo circulante 61349 Grafo de Petersen generalizado 623410 Otros grafos importantes 63
35 Definiciones y propiedades 67351 Definiciones de grafos 68352 Propiedades de grafos 73353 Operaciones y propiedades sobre grafos 73
36 Morfismos de grafos 78361 Morfismos 78362 Complejidad del problema de homomorfismo de grafos 80363 Isomorfismos 81364 Automorfismos 86
37 Caminos en grafos 87371 Definicioacuten de camino 87372 Recorridos 89373 Caminos simples 89374 Conexioacuten 93375 Distancia 93376 Caminos cerrados 94377 Circuitos 95378 Ciclos 95379 Grafos aciacuteclicos 96
38 Conectividad de los grafos 97381 Estar conectados por un camino 97382 Componentes conexas de un grafo 97383 Grafos conexos 100384 Excentricidad 102385 Diaacutemetro 102386 Radio 103387 Centro 103388 Grosor 104389 Propiedades e invariantes por isomorfismos 106
6 Iacutendice general
4 Matrices asociadas a grafos 109
41 Generador de grafos simples 109
42 Matrices de adyacencia 110421 Definicioacuten y propiedades 110422 Propiedades baacutesicas de las matrices 111423 Propiedades de las matrices de adyacencia 111424 Caminos y arcos 113
5 Apeacutendices 117
51 Sistemas utilizados 117
52 Mapa de decisiones de disentildeo en conjuntos 119
53 Mapa de decisiones de disentildeo en grafos 119
Bibliografiacutea 121
Indice de definiciones 121
Agradecimientos
Quisiera agradecer a todas las personas que me han apoyado y prestado sus co-nocimientos a lo largo de estos cuatro antildeos del grado Gracias a ellos el esfuerzo hamerecido la pena
En primer lugar me gustariacutea destacar a Mariacutea Joseacute Hidalgo Doblado y Joseacute An-tonio Alonso Jimeacutenez mi tutores en este Trabajo de Fin de Grado Les agradezco detodo corazoacuten la constancia y la atencioacuten que me han brindado a pesar de las dificul-tades que supone realizar el proyecto durante un curso en el que estoy disfrutandola oportunidad de la movilidad internacional Erasmus Son para miacute un referente y unclaro ejemplo de lo que se puede conseguir con esfuerzo y trabajo en equipo
Seguidamente expresar mi gratitud al resto de profesores y trabajadores de la Uni-versidad de Sevilla especialmente a aquellos que se esfuerzan por mejorar la institu-cioacuten diacutea a diacutea
Quiero agradecer tambieacuten este trabajo a mi familia en especial a mis padres que meapoyaron desde el principio cuando tomeacute la decisioacuten de cambiar de carrera y siemprehan intentado brindarnos a mi hermana y a miacute con lo mejor
Finalmente a mis amigos y compantildeeros que han hecho de esta primera etapa uni-versitaria un capiacutetulo de mi vida lleno de bonitos recuerdos En especial a Pedro conquien he tenido la suerte de compartir todo
Muchas gracias a todos
7
8 Iacutendice general
Abstract
Discrete mathematics is characterized as the branch of mathematics dealing withfinite and numerable sets Concepts and notations from discrete mathematics are use-ful in studying and describing objects and real-life problems In particular the graphtheory has numerous applications in logistics
Throughout this project some of the knowlegde adquired from the course ldquoMa-temaacutetica Discretardquo will be given a computational implementation The code will bewritten in Haskell language and a free version of it will be available in GitHub underthe name MDenHaskell The work will focus on the graph theory and will provide so-me examples and algorithms in order to give an introduction of it and how it can beimplemented in Haskell
At first two chapters will be presented as a gentle reminder of basic concepts rela-ted to the set theory and the relations that can be established among them The thirdchapter will introduce the main topic graph theory with different representationsdefinitions and examples on graphs It will go through aspects such as morphismconnectivity and paths in graphs Finally some properties and advantages of workingwith adjacency matrices will be presented in the fourth chapter
This project leaves the door open for the community of programmers to continueand improve it It can be used as a self-learning tool as well as to make calculationsthat by hand would be tedious
9
10 Iacutendice general
Introduccioacuten
El objetivo del trabajo es la implementacioacuten de algoritmos de matemaacutetica discretaen Haskell Los puntos de partida son
los temas de la asignatura ldquoMatemaacutetica discretardquo ([4])los temas de la asignatura ldquoInformaacuteticardquo ([1])el capiacutetulo 7 del libro ldquoAlgorithms A functional programming approachrdquo ([8]) yel artiacuteculo ldquoGraph theoryrdquo ([11]) de la WikipediaHaskell es un lenguaje de programacioacuten funcional desarrollado en los uacuteltimos antildeos
por la comunidad de programadores con la intencioacuten de usarlo como instrumentopara la ensentildeanza de programacioacuten funcional La motivacioacuten de este desarrollo eshacer el anaacutelisis y disentildeo de programas maacutes simple y permitir que los algoritmos seanfaacutecilmente adaptables a otros lenguajes de programacioacuten funcionales
En comparacioacuten con otros lenguajes de programacioacuten imperativos la sintaxis deHaskell permite definir funciones de forma maacutes clara y compacta En Haskell las fun-ciones se consideran valores al mismo nivel que los tipos enteros o cadenas en cual-quier lenguaje Por ello al igual que es habitual que en todos los lenguajes una funcioacutenreciba datos de entrada (de tipo entero flotante cadena etc) y devuelva datos (de losmismos tipos) en los lenguajes funcionales una funcioacuten puede recibir como dato deentrada una funcioacuten y devolver otra funcioacuten como salida que puede ser construida apartir de sus entradas y por operaciones entre funciones como la composicioacuten Estacapacidad nos proporciona meacutetodos maacutes potentes para construir y combinar los di-versos moacutedulos de los que se compone un programa Por ejemplo emulando la formade operar sobre funciones que habitualmente se usa en matemaacuteticas
La matemaacutetica discreta consiste en el estudio de las propiedades de los conjuntosfinitos o infinitos numerables lo que hace posible su directa implementacioacuten compu-tacional En particular la asignatura ldquoMatemaacutetica Discretardquo del grado se centra enestudiar propiedades y algoritmos de la combinatoria y la teoriacutea de grafos A lo largodel trabajo se implementaraacuten en Haskell definiciones y algoritmos con los que ya seha tenido una primera aproximacioacuten teoacuterica durante el grado
Los dos primeros capiacutetulos del trabajo sientan la base que permitiraacute en los dos si-guientes una aproximacioacuten a la teoriacutea de grafos En el primero se hace una introduc-cioacuten a la teoriacutea de conjuntos y se dan dos posibles representaciones de conjuntos con
11
12 Iacutendice general
las que trabajar en Haskell En el segundo se presentan los conceptos de ldquorelacioacutenrdquo yde ldquofuncioacutenrdquo que al igual que los conjuntos son necesarios para definir aplicacionesde los grafos Su redaccioacuten sigue la liacutenea de la primera parte de la asignatura ldquoAacutelgebraBaacutesicardquo del grado
En el tercer capiacutetulo del trabajo se hace una introduccioacuten a la teoriacutea de grafos Enprimer lugar se dan una representacioacuten con la que trabajar en Haskell y un generadorde grafos que permitiraacute comprobar propiedades con QuickCheck Seguidamente sepresenta una galeriacutea de grafos conocidos que se utilizaraacuten como ejemplos para lasdefiniciones y los algoritmos de las secciones siguientes Las primeras seraacuten algunasdeficiones baacutesicas y despueacutes se trataraacuten los conceptos de ldquomorfismosrdquo ldquocaminosrdquo yldquoconectividadrdquo en grafos
Por uacuteltimo en el cuarto capiacutetulo se da una representacioacuten de los grafos a traveacutesde su matriz de adyacencia Se implementaraacuten algunos de los resultados que JavierFranco Galviacuten expuso en su Trabajo Fin de Grado Aspectos algebraicos en teoriacutea de grafosy se comprueba que concuerdan con el desarrollo hecho en el capiacutetulo anterior
Cabe destacar el trabajo con los diferentes sistemas y programas que se han utiliza-do a lo largo del proyecto
Ubuntu como sistema operativoel editor de textos Emacs que ha permitido el uso de Haskell literario para la redaccioacutendel trabajoel paquete de produccioacuten de graacuteficos vectoriales Tikz de LATEX mediante el que seha dado la representacioacuten graacutefica de los ejemplos de grafosGitHub como sistema remoto de control de versionesy DocTest como sistema de validacioacuten de moacutedulosSe va a hacer una breve introduccioacuten los sistemas maacutes destacados
Ubuntu
Ubuntu es un sistema operativo creado a partir de GNULinux con la intencioacuten dehacer una versioacuten de este maacutes sencilla de manejar y que permitiera acceso al soft-ware libre para todo el mundo por igual La primera distribuioacuten oficial de Ubuntufue la versioacuten 410 y tuvo lugar en 2004 Desde entonces el proyecto ha captadola atencioacuten de miles de entusiastas del software libre que han querido unirse a lacomunidad UbuntuSoftware libre significa que los usuarios tienen la libertad de ejecutar copiar distri-buir estudiar modificar y mejorar el software Es una cuestioacuten de libertad no deprecio Para entender el concepto debe pensarse en laquolibreraquo como en laquolibertad deexpresioacutenraquo
Iacutendice general 13
Maacutes precisamente software libre significa que los usuarios de un programa tienenlas cuatro libertades esencialesbull La libertad de ejecutar el programa como lo desee con cualquier propoacutesito (liber-
tad 0)bull La libertad de estudiar el funcionamiento del programa y adaptarlo a sus necesi-
dades (libertad 1) El acceso al coacutedigo fuente es un prerrequisito para estobull La libertad de redistribuir copias para ayudar a los demaacutes (libertad 2)bull La libertad de mejorar el programa y de publicar las mejoras de modo que toda la
comunidad se beneficie (libertad 3) El acceso al coacutedigo fuente es un prerrequisitopara esto
Debido a la evolucioacuten de la tecnologiacutea y del uso de la red estas libertades son ahoraauacuten maacutes importantes que en el pasadoLo que diferencia a Ubuntu de otros sistemas ofrecidos por Linux es que los equiposcomercial y comunitario colaboran juntos en el desarrollo de un uacutenico proyecto Lasnovedades y avances estaacuten libremente a disposicioacuten de todos los usuarios y sonvoluntarios quienes se hacen cargo de los elementos maacutes criacuteticos del trabajoEn la paacutegina web de Ubuntu 1 se puede obtener maacutes informacioacuten acerca del siste-ma y en la paacutegina web de GNU 2 se puede encontrar maacutes informacioacuten acerca delsoftware libre
Haskell literario con Emacs
Haskell es un lenguaje de programacioacuten puramente funcional basado en lambdacalculus 3 Se caracteriza por sus programas concisos un potente sistema de tiposel trabajo con listas funciones recursivas y de orden superior y por tener evaluacioacutenperezosaTener que escribir coacutedigos largos y complicados hace la tarea del programador muycostosa Los lenguajes de programacioacuten funcional como Haskell lo intentan hacenmaacutes sencillo Aunque no se esteacute en la posicioacuten de usar Haskell en un proyecto de-terminado aprender su razonamiento puede ayudar a mejorar en cualquier otrolenguajeA la hora de elaborar la memoria de un proyecto en el que se estaacute utilizando Haskellla posibilidad de escribir coacutedigo y texto en un formato de calidad otorga globali-dad al trabajo El editor Emacs de GNU permite en particular trabajar en paralelocon Haskell y con Latex El trabajar con Haskell literario ha ayudado a detectar ysolventar errores maacutes raacutepido asiacute como a dar una estructura consolidada al trabajo
1httpswwwubuntucom2httpswwwgnuorg3httpsenwikipediaorgwikiLambda_calculus
14 Iacutendice general
En la paacutegina web del Departamento de Computacioacuten 4 se puede encontrar maacutesinformacioacuten acerca de Haskell y Emacs
GitHub
GitHub es una plataforma de desarrollo colaborativo que permite alojar proyectosusando el control de versiones de Git El trabajo con un sistema como este hacemucho maacutes faacutecil el trabajo en grupo pues cada individuo puede trabajar desde suordenador propio en paralelo a los demaacutes y remotamente ir actualizando el proyectosin perder la posibilidad de restaurarlo a una versioacuten anteriorEn particular GitHub ha sido una excelente herramienta de control de este TrabajoFin de Grado pues los tutores han podido seguir en cada momento el trabajo rea-lizado detectar faacutecilmente los errores y hacer modificaciones directamente sobre eldocumentoEl compantildeero Eduardo Paluzo Hidalgo hace en su Trabajo Fin de Grado una pe-quentildea introduccioacuten al uso de Github y a la instalacioacuten de magit en una distribucioacutenUbuntu muy recomendable para todos aquellos (especialmente los maacutes principian-tes) que tengan intereacutes en trabajar con este sistemaSe puede encontrar maacutes informacioacuten acerca de esta plataforma en la paacutegina web deGit 5
DocTest
DocTest para Haskell es un programa de verificacioacuten dinaacutemica de ejemplos Si se si-gue un determinado formato a la hora de escribir los ejemplos para las funciones deun documento en Haskell Doctest se encarga de comprobar que los ejemplos seancorrectos Estas validaciones han resultado claves en la realizacioacuten del trabajo puesalgunas definiciones han sido modificadas de forma casi continua y este proyectoespecialmente se basa en lo anterior para poder seguir construyendoSu uso es muy sencillo una vez instalado el correspondiente paquete y escrito losejemplos en el formato requerido solo hay que ejecutar el programa desde la consoladando como argumento el fichero que se desea validarSe puede enontrar maacutes informaioacuten acerca del programa y de coacutemo descargarlo ensu repositorio de GitHub 6
4httpwwwcsuses~jalonsocursosi1m-16temastema-1html5httpsgit-scmcom6httpsgithubcomsoldoctest
Capiacutetulo 1
Conjuntos
El concepto de conjunto aparece en todos los campos de las Matemaacuteticas pero iquestqueacutedebe entenderse por eacutel La Teoriacutea de conjuntos fue introducida por Georg Cantor(1845-1917) desde 1869 Cantor ejercioacute como profesor en la Universidad de Halley entre 1879 y 1884 publicoacute una serie de seis artiacuteculos en el Mathematische Annalenen los que hizo una introduccioacuten baacutesica a la teoriacutea de conjuntos En su Beitraumlge zurBegruumlndung der transfiniten Mengenlehre Cantor dio la siguiente definicioacuten de con-junto
Figura 11 Fragmento del texto traducido al ingleacutes en el que Cantor da la definicioacuten de conjunto
laquoDebemos entender por ldquoconjuntordquo (Menge) cualquier coleccioacuten vista co-mo un todo (Zusammenfassung zu einem Ganzen) M de objetos separa-dos y bien definidos m de nuestra intuicioacuten o pensamiento Estos objetosson los ldquoelementosrdquo de Mraquo
Felix Hausdorff en 1914 dice laquoun conjunto es una reunioacuten de cosas que constitu-yen una totalidad es decir una nueva cosaraquo y antildeade laquoesto puede difiacutecilmente seruna definicioacuten pero sirve como demostracioacuten expresiva del concepto de conjunto atraveacutes de conjuntos sencillos como el conjunto de habitantes de una ciudad o el deaacutetomos de Hidroacutegeno del SolraquoUn conjunto asiacute definido no tiene que estar compuesto necesariamente de elementoshomogeacuteneos y ademaacutes da lugar a cuestiones filosoacuteficas como si podemos llamar
15
16 Capiacutetulo 1 Conjuntos
conjunto a aquel que no posee ninguacuten elemento Matemaacuteticamente conviene aceptarsolo elementos que compartan alguna propiedad y definir el conjunto vaciacuteo comoaquel que no tiene elemento algunoEl gran meacuterito de Cantor fue considerar conjuntos transfinitos (que tiene infinitoselementos) concepto inaudito hasta avanzado el siglo XIX hablar del cardinal de unconjunto como el nuacutemero de sus elementos y hablar de conjuntos equivalentes cuan-do puede establecerse una biyeccioacuten entre ellos ideas ya apuntadas por Bolzanoquien se centroacute demasiado en el aspecto filosoacutefico sin llegar a formalizar sus ideas
A lo largo de la seccioacuten haremos una pequentildea introduccioacuten a la Teoriacutea de Conjun-tos presentando formalmente sus conceptos maacutes importantes A la hora de elaborarel contenido se han utilizado los siguientes recursos bibliograacuteficosbull el primer tema de la asignatura ldquoAacutelgebra baacutesicardquo ([6])bull los temas de la asignatura ldquoInformaacuteticardquo ([1])bull el artiacuteculo de la Wikipedia ldquoSet (mathematics)rdquo ([10] ylowast el artiacuteculo ldquoEl regalo de Cantorrdquo ([5])
11 El TAD de los conjuntos
En la presente seccioacuten se definen las operaciones baacutesicas necesarias para trabajarcon conjuntos en un lenguaje funcional En nuestro caso el lenguaje que utilizare-mos seraacute Haskell Daremos la signatura del Tipo Abstracto de Dato (TAD) de losconjuntos y daremos algunos ejemplos de posibles representaciones de conjuntoscon las que podriacuteamos trabajarA continuacioacuten presentamos las operaciones definidas en el TAD de los conjuntos
vacio Conj a
inserta Eq a =gt a -gt Conj a -gt Conj a
elimina Eq a =gt a -gt Conj a -gt Conj a
pertenece Eq a =gt Conj a -gt a -gt Bool
esVacio Conj a -gt Bool
minimoElemento Ord a =gt Conj a -gt a
dondebull (vacio) es el conjunto vaciacuteobull (inserta x c) es el conjunto obtenido antildeadiendo el elemento x al conjunto cbull (elimina x c) es el conjunto obtenido eliminando el elemento x del conjunto cbull (pertenece x c) se verifica si x pertenece al conjunto cbull (esVacio c) se verifica si c no tiene ninguacuten elementobull (minimoElemento c) devuelve el miacutenimo elemento del conjunto c
12 Representaciones de conjuntos 17
Hemos de tener en cuenta que a la hora de crear un nuevo tipo de dato con el querepresentar a los conjuntos este debe ser compatible con la entidad matemaacutetica querepresenta
Estas son algunas de las posibles representaciones con las que podriacuteamos trabajarcon conjuntos en Haskellbull En primer lugar podemos trabajar con la libreriacutea DataSet en este caso la imple-
mentacioacuten del tipo de dato Set estaacute basado en aacuterboles binarios balanceadosbull Por otra parte podemos definir un nuevo tipo Cj xs con el que trabajar con con-
juntos como listas no ordenadas con duplicados como listas no ordenadas sinduplicados o como listas ordenadas sin duplicadosbull Otra opcioacuten seriacutea trabajar directamente con conjuntos como listas para ello de-
bemos ignorar las repeticiones y el orden con vista a la igualdad de conjuntosbull Los conjuntos que soacutelo contienen nuacutemeros (de tipo Int) entre 0 y nminus 1 se pueden
representar como nuacutemeros binarios con n bits donde el bit i(0 le i lt n) es 1 syssel nuacutemero i pertenece al conjunto
Nota 111 Las funciones que aparecen en la especificacioacuten del TAD no dependende la representacioacuten que elijamos
12 Representaciones de conjuntos
121 Conjuntos como listas ordenadas sin repeticioacuten
En el moacutedulo ConjuntosConListasOrdenadasSinRepeticion se definen las funcio-nes del TAD de los conjuntos dando su representacioacuten como listas ordenadas sinrepeticioacuten
module ConjuntosConListasOrdenadasSinRepeticion
( Conj
vacio
inserta
listaAConjunto
elimina
pertenece
esVacio
minimoElemento
sinRepetidos
esUnitario
esSubconjunto
conjuntosIguales
esSubconjuntoPropio
complementario
18 Capiacutetulo 1 Conjuntos
cardinal
unionConjuntos
unionGeneral
interseccion
productoCartesiano
combinaciones
variacionesR
) where
En las definiciones del presente moacutedulo se usaraacuten algunas funciones de la libreriacuteaDataList
Vamos a definir un nuevo tipo de dato (Conj a) que representa a los conjuntoscomo listas ordenadas sin repeticioacuten
type Conj a = [a]
Las funciones baacutesicas que definiremos a partir de este tipo coincidiraacuten con las indi-cadas en el TAD de los conjuntosbull (vacio) es el conjunto vaciacuteo
-- | Ejemplo
-- gtgtgt vacio
-- []
vacio Conj a
vacio = []
bull (inserta x c) es el conjunto obtenido antildeadiendo el elemento x al conjunto c
-- | Ejemplo
-- gtgtgt inserta 5 vacio
-- [5]
-- gtgtgt foldr inserta vacio [2211242]
-- [124]
inserta Ord a =gt a -gt Conj a -gt Conj a
inserta x [] = [x]
inserta x ys
| pertenece ys x = ys
| otherwise = insert x ys
bull (listaAConjunto xs) devuelve el conjunto cuyos elementos son los de la lista xs
-- | Ejemplo
-- gtgtgt listaAConjunto [2211242]
-- [124]
listaAConjunto Ord a =gt [a] -gt Conj a
listaAConjunto = sort nub
bull (esVacio c) se verifica si c es el conjunto vaciacuteo
12 Representaciones de conjuntos 19
-- | Ejemplos
-- gtgtgt esVacio (listaAConjunto [25137532190])
-- False
-- gtgtgt esVacio vacio
-- True
esVacio Conj a -gt Bool
esVacio = null
bull (pertenece x c) se verifica si x es un elemento del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt pertenece c1 3
-- True
-- gtgtgt pertenece c1 4
-- False
pertenece Ord a =gt Conj a -gt a -gt Bool
pertenece ys x =
x == head (dropWhile (ltx) ys)
bull (elimina x c) es el conjunto obtenido eliminando el elemento x del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt elimina 3 c1
-- [012579]
-- gtgtgt elimina 4 c1
-- [0123579]
elimina Ord a =gt a -gt Conj a -gt Conj a
elimina x ys = us ++ dropWhile (==x) vs
where (usvs) = span (ltx) ys
bull (minimoElemento c) devuelve el miacutenimo elemento del conjunto c
-- | Ejemplos
-- gtgtgt minimoElemento (listaAConjunto [25137532190])
-- 0
-- gtgtgt minimoElemento (listaAConjunto ([ae] ++ [AE]))
-- A
minimoElemento Ord a =gt Conj a -gt a
minimoElemento = head
122 Definicioacuten de conjunto
Nota 121 Al trabajar con la representacioacuten de conjuntos como listas en Haskellhemos de cuidar que los ejemplos con los que trabajemos no tengan elementos re-petidos La funcioacuten (sinRepetidos xs) se verifica si la lista xs no tiene ninguacuten ele-mento repetido
20 Capiacutetulo 1 Conjuntos
-- | Ejemplos
-- gtgtgt sinRepetidos []
-- True
-- gtgtgt sinRepetidos [1231]
-- False
sinRepetidos Eq a =gt [a] -gt Bool
sinRepetidos xs = nub xs == xs
Los conjuntos pueden definirse de manera expliacutecita citando todos sus elementosentre llaves de manera impliacutecita dando una o varias caracteriacutesticas que determi-nen si un objeto dado estaacute o no en el conjunto Por ejemplo los conjuntos 1 2 3 4y x isinN|1 le x le 4 son el mismo definido de forma explicita e impliacutecita respecti-vamente
Nota 122 La definicioacuten impliacutecita es necesaria cuando el conjunto en cuestioacuten tieneuna cantidad infinita de elementos En general los conjuntos se notaraacuten con letrasmayuacutesculas A B y los elementos con letras minuacutesculas a b
Cuando trabajamos con conjuntos concretos siempre existe un contexto donde esosconjuntos existen Por ejemplo si A = minus1 1 2 3 4 5 y B = x|x isin Nes par elcontexto donde podemos considerar A y B es el conjunto de los nuacutemeros enterosZ En general a este conjunto se le denomina conjunto universal De una forma algomaacutes precisa podemos dar la siguiente definicioacuten
Definicioacuten 121 El conjunto universal que notaremos por U es un conjunto del queson subconjuntos todos los posibles conjuntos que originan el problema que tratamos
123 Subconjuntos
Definicioacuten 122 Dados dos conjuntos A y B si todo elemento de A es a su vez elementode B diremos que A es un subconjunto de B y lo notaremos A sube B En caso contrario senotaraacute A 6sube B
La funcioacuten (esSubconjunto c1 c2) se verifica si c1 es un subconjunto de c2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
-- gtgtgt c1 `esSubconjunto` c2
-- True
-- gtgtgt c1 `esSubconjunto` vacio
-- False
-- gtgtgt vacio `esSubconjunto` c2
12 Representaciones de conjuntos 21
-- True
-- gtgtgt c3 `esSubconjunto` c4
-- True
-- gtgtgt c2 `esSubconjunto` c1
-- False
esSubconjunto Ord a =gt Conj a -gt Conj a -gt Bool
esSubconjunto [] _ = True
esSubconjunto (xxs) ys =
x == head vs ampamp esSubconjunto xs (tail vs)
where (usvs) = span (ltx) ys
124 Igualdad de conjuntos
Definicioacuten 123 Dados dos conjuntos A y B diremos que son iguales si tienen los mismoselementos es decir si se verifica que A sube B y B sube A Lo notaremos A = B
La funcioacuten (conjuntosIguales c1 c2) se verifica si los conjuntos xs y ys son igua-les
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
-- gtgtgt let c5 = listaAConjunto [4444442]
-- gtgtgt conjuntosIguales c1 c2
-- False
-- gtgtgt conjuntosIguales c3 c4
-- True
-- gtgtgt conjuntosIguales c1 c5
-- True
conjuntosIguales Ord a =gt Conj a -gt Conj a -gt Bool
conjuntosIguales = (==)
125 Subconjuntos propios
Definicioacuten 124 Los subconjuntos de A distintos del empty y del mismo A se denominansubconjuntos propios de A
La funcioacuten (esSubconjuntoPropio c1 c2) se verifica si c1 es un subconjunto pro-pio de c2
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt esSubconjuntoPropio u u
22 Capiacutetulo 1 Conjuntos
-- False
-- gtgtgt esSubconjuntoPropio c1 u
-- True
esSubconjuntoPropio Ord a =gt Conj a -gt Conj a -gt Bool
esSubconjuntoPropio c1 c2 =
not (null c1) ampamp esSubconjunto c1 c2 ampamp c1 = c2
126 Complementario de un conjunto
Definicioacuten 125 Dado un conjunto A se define el complementario de A que notaremospor A como
A = x|x isin U x 6isin A
La funcioacuten (complementario u c) devuelve el complementario del conjunto c y enel universo u
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt let c2 = listaAConjunto [14689]
-- gtgtgt complementario u c1
-- [14689]
-- gtgtgt complementario u u
-- []
-- gtgtgt complementario u vacio
-- [123456789]
-- gtgtgt complementario u c2
-- [2357]
complementario Ord a =gt Conj a -gt Conj a -gt Conj a
complementario [] _ = []
complementario xs [] = xs
complementario (xxs) (yys)
| x lt y = x complementario xs (yys)
| otherwise = complementario xs ys
127 Cardinal de un conjunto
Definicioacuten 126 Dado un conjunto finito A denominaremos cardinal de A al nuacutemero deelementos que tiene y lo notaremos |A|
La funcioacuten (cardinal xs) devuelve el cardinal del conjunto xs
-- | Ejemplos
-- gtgtgt cardinal vacio
-- 0
-- gtgtgt cardinal (listaAConjunto [110])
12 Representaciones de conjuntos 23
-- 10
-- gtgtgt cardinal (listaAConjunto chocolate)
-- 7
cardinal Ord a =gt Conj a -gt Int
cardinal = length
128 Conjunto unitario
Definicioacuten 127 Un conjunto con un uacutenico elemento se denomina unitario
Nota 123 Notemos que si X = x es un conjunto unitario debemos distinguirentre el conjunto X y el elemento x
La funcioacuten (esUnitario c) se verifica si el conjunto c es unitario
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto (take 10 (repeat 5))
-- gtgtgt let c2 = listaAConjunto valverde
-- gtgtgt let c3 = listaAConjunto coco
-- gtgtgt esUnitario c1
-- True
-- gtgtgt esUnitario c2
-- False
-- gtgtgt esUnitario c2
-- False
esUnitario Ord a =gt Conj a -gt Bool
esUnitario c =
c == take 1 c
129 Unioacuten de conjuntos
Definicioacuten 128 Dados dos conjuntos A y B se define la unioacuten de A y B notado A cup Bcomo el conjunto formado por aquellos elementos que pertenecen al menos a uno de los dosconjuntos A oacute B es decir
A cup B = x | x isin A or x isin B
La funcioacuten (unionConjuntos c1 c2) devuelve la unioacuten de los conjuntos xs y ys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [139]
-- gtgtgt let c2 = listaAConjunto [249]
-- gtgtgt unionConjuntos c1 c2
-- [123456789]
unionConjuntos Ord a =gt Conj a -gt Conj a -gt Conj a
unionConjuntos [] [] = []
24 Capiacutetulo 1 Conjuntos
unionConjuntos [] ys = ys
unionConjuntos xs [] = xs
unionConjuntos (xxs) (yys)
| x lt y = x unionConjuntos xs (yys)
| x == y = x unionConjuntos xs ys
| otherwise = y unionConjuntos (xxs) ys
Definicioacuten 129 Dada una familia de conjuntos Ai con i isin I se define la unioacuten ge-neral de los conjuntos Ai notado
⋃iisinI Ai como el conjunto formado por aquellos elementos
que pertenecen al menos a uno de los conjuntos de la familia es decir
⋃iisinI
Ai = x | x isin Ai foralli isin I
La funcioacuten (unionGeneral xss) devuelve la unioacuten general de la familia de conjun-tos de la lista xss
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1415]
-- gtgtgt let c2 = listaAConjunto [2515]
-- gtgtgt let c3 = listaAConjunto [3615]
-- gtgtgt unionGeneral [c1c2c3]
-- [123456789101112131415]
unionGeneral Ord a =gt [Conj a] -gt Conj a
unionGeneral = foldr unionConjuntos vacio
1210 Interseccioacuten de conjuntos
Definicioacuten 1210 Dados dos conjuntos A y B se define la interseccioacuten de A y B notadoA cap B como el conjunto formado por aquellos elementos que pertenecen a cada uno de losdos conjuntos A y B es decir
A cap B = x | x isin A and x isin B
La funcioacuten (interseccion c1 c2) devuelve la interseccioacuten de los conjuntos c1 yc2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1320]
-- gtgtgt let c2 = listaAConjunto [2420]
-- gtgtgt let c3 = listaAConjunto [2430]
-- gtgtgt let c4 = listaAConjunto [4830]
-- gtgtgt interseccion c1 c2
-- []
-- gtgtgt interseccion c3 c4
12 Representaciones de conjuntos 25
-- [481216202428]
interseccion Ord a =gt Conj a -gt Conj a -gt Conj a
interseccion (xxs) (yys)
| x lt y = interseccion xs (yys)
| x gt y = interseccion (xxs) ys
| otherwise = x interseccion xs ys
interseccion _ _ = []
1211 Producto cartesiano
Definicioacuten 1211 El producto cartesiano 1 de dos conjuntos A y B es una operacioacutensobre ellos que resulta en un nuevo conjunto Atimes B que contiene a todos los pares ordenadostales que la primera componente pertenece a A y la segunda pertenece a B es decir
Atimes B = (a b) | a isin A b isin B
La funcioacuten (productoCartesiano c1 c2) devuelve el producto cartesiano de xs eys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [31]
-- gtgtgt let c2 = listaAConjunto [247]
-- gtgtgt productoCartesiano c1 c2
-- [(12)(14)(17)(32)(34)(37)]
-- gtgtgt productoCartesiano c2 c1
-- [(21)(23)(41)(43)(71)(73)]
productoCartesiano (Ord a Ord b) =gt Conj a -gt Conj b -gt Conj (ab)
productoCartesiano xs ys=
listaAConjunto [(xy) | x lt- xs y lt- ys]
1212 Combinaciones
Definicioacuten 1212 Las combinaciones de un conjunto S tomados en grupos de n son todoslos subconjuntos de S con n elementos
La funcioacuten (combinaciones n xs) devuelve las combinaciones de los elementos dexs en listas de n elementos
-- | Ejemplos
-- gtgtgt combinaciones 3 [ad]
-- [abcabdacdbcd]
-- gtgtgt combinaciones 2 [248]
-- [[24][26][28][46][48][68]]
1httpsenwikipediaorgwikiCartesian_product
26 Capiacutetulo 1 Conjuntos
combinaciones Integer -gt [a] -gt [[a]]
combinaciones 0 _ = [[]]
combinaciones _ [] = []
combinaciones k (xxs) =
[xys | ys lt- combinaciones (k-1) xs] ++ combinaciones k xs
1213 Variaciones con repeticioacuten
Definicioacuten 1213 Las variaciones con repeticioacuten de m elementos tomados en grupos den es el nuacutemero de diferentes nndashtuplas de un conjunto de m elementos
La funcioacuten (variacionesR n xs) devuelve las variaciones con con repeticioacuten de loselementos de xs en listas de n elementos
-- | Ejemplos
-- gtgtgt variacionesR 3 [ab]
-- [aaaaababaabbbaababbbabbb]
-- gtgtgt variacionesR 2 [235]
-- [[22][23][25][32][33][35][52][53][55]]
variacionesR Int -gt [a] -gt [[a]]
variacionesR _ [] = [[]]
variacionesR 0 _ = [[]]
variacionesR k us =
[uvs | u lt- us vs lt- variacionesR (k-1) us]
1214 Conjuntos como listas sin repeticioacuten
En el moacutedulo ConjuntosConListas se definen las funciones del TAD de los conjun-tos dando su representacioacuten como listas sin elementos repetidos
module ConjuntosConListas
( Conj
vacio
inserta
listaAConjunto
elimina
pertenece
esVacio
minimoElemento
sinRepetidos
esUnitario
esSubconjunto
conjuntosIguales
esSubconjuntoPropio
complementario
cardinal
12 Representaciones de conjuntos 27
unionConjuntos
unionGeneral
interseccion
productoCartesiano
combinaciones
variacionesR
) where
En las definiciones del presente moacutedulo se usaraacuten algunas funciones de la libreriacuteaDataList
Vamos a definir un nuevo tipo de dato (Conj a) que representa a los conjuntoscomo listas sin elementos repetidos
type Conj a = [a]
Las funciones baacutesicas que definiremos a partir de este tipo coincidiraacuten con las indi-cadas en el TAD de los conjuntosbull (vacio) es el conjunto vaciacuteo
-- | Ejemplo
-- gtgtgt vacio
-- []
vacio Conj a
vacio = []
bull (inserta x c) es el conjunto obtenido antildeadiendo el elemento x al conjunto c
-- | Ejemplo
-- gtgtgt inserta 5 vacio
-- [5]
-- gtgtgt foldr inserta vacio [2211242]
-- [142]
inserta Eq a =gt a -gt Conj a -gt Conj a
inserta x [] = [x]
inserta x ys | elem x ys = ys
| otherwise = xys
bull (listaAConjunto xs) devuelve el conjunto cuyos elementos son los de la lista xs
-- | Ejemplo
-- gtgtgt listaAConjunto [2211242]
-- [214]
listaAConjunto Eq a =gt [a] -gt Conj a
listaAConjunto = nub
bull (esVacio c) se verifica si c es el conjunto vaciacuteo
-- | Ejemplos
-- gtgtgt esVacio (listaAConjunto [25137532190])
-- False
28 Capiacutetulo 1 Conjuntos
-- gtgtgt esVacio vacio
-- True
esVacio Conj a -gt Bool
esVacio = null
bull (pertenece x c) se verifica si x es un elemento del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt pertenece 3 c1
-- True
-- gtgtgt pertenece 4 c1
-- False
pertenece Eq a =gt a -gt Conj a -gt Bool
pertenece = elem
bull (elimina x c) es el conjunto obtenido eliminando el elemento x del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt elimina 3 c1
-- [251790]
-- gtgtgt elimina 4 c1
-- [2513790]
elimina Eq a =gt a -gt Conj a -gt Conj a
elimina = delete
bull (minimoElemento c) devuelve el miacutenimo elemento del conjunto c
-- | Ejemplos
-- gtgtgt minimoElemento (listaAConjunto [25137532190])
-- 0
-- gtgtgt minimoElemento (listaAConjunto ([ae] ++ [AE]))
-- A
minimoElemento Ord a =gt Conj a -gt a
minimoElemento = minimum
1215 Definicioacuten de conjunto
Definicioacuten 1214 Llamaremos conjunto a una coleccioacuten de objetos que llamaremos ele-mentos distintos entre siacute y que comparten una propiedad Para que un conjunto esteacute biendefinido debe ser posible discernir si un objeto arbitrario estaacute o no en eacutel
Si el elemento a pertenece al conjunto A escribiremos a isin A En caso contrarioescribiremos a 6isin A
Nota 124 En Haskell para poder discernir si un objeto arbitrario pertenece a unconjunto se necesita que su tipo pertenezca a la clase Eq
12 Representaciones de conjuntos 29
Nota 125 Al trabajar con la representacioacuten de conjuntos como listas en Haskellhemos de cuidar que los ejemplos con los que trabajemos no tengan elementos re-petidos La funcioacuten (sinRepetidos xs) se verifica si la lista xs no tiene ninguacuten ele-mento repetido
-- | Ejemplos
-- gtgtgt sinRepetidos []
-- True
-- gtgtgt sinRepetidos [1231]
-- False
sinRepetidos Eq a =gt [a] -gt Bool
sinRepetidos xs = nub xs == xs
Los conjuntos pueden definirse de manera expliacutecita citando todos sus elementosentre llaves de manera impliacutecita dando una o varias caracteriacutesticas que determi-nen si un objeto dado estaacute o no en el conjunto Por ejemplo los conjuntos 1 2 3 4y x isinN|1 le x le 4 son el mismo definido de forma explicita e impliacutecita respecti-vamente
Nota 126 La definicioacuten impliacutecita es necesaria cuando el conjunto en cuestioacuten tieneuna cantidad infinita de elementos En general los conjuntos se notaraacuten con letrasmayuacutesculas A B y los elementos con letras minuacutesculas a b
Cuando trabajamos con conjuntos concretos siempre existe un contexto donde esosconjuntos existen Por ejemplo si A = minus1 1 2 3 4 5 y B = x|x isin Nes par elcontexto donde podemos considerar A y B es el conjunto de los nuacutemeros enterosZ En general a este conjunto se le denomina conjunto universal De una forma algomaacutes precisa podemos dar la siguiente definicioacuten
Definicioacuten 1215 El conjunto universal que notaremos por U es un conjunto del queson subconjuntos todos los posibles conjuntos que originan el problema que tratamos
1216 Subconjuntos
Definicioacuten 1216 Dados dos conjuntos A y B si todo elemento de A es a su vez elementode B diremos que A es un subconjunto de B y lo notaremos A sube B En caso contrario senotaraacute A 6sube B
La funcioacuten (esSubconjunto c1 c2) se verifica si c1 es un subconjunto de c2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
30 Capiacutetulo 1 Conjuntos
-- gtgtgt c1 `esSubconjunto` c2
-- True
-- gtgtgt c1 `esSubconjunto` vacio
-- False
-- gtgtgt vacio `esSubconjunto` c2
-- True
-- gtgtgt c3 `esSubconjunto` c4
-- True
-- gtgtgt c2 `esSubconjunto` c1
-- False
esSubconjunto Eq a =gt [a] -gt [a] -gt Bool
esSubconjunto c1 c2 = all (`elem` c2) c1
1217 Igualdad de conjuntos
Definicioacuten 1217 Dados dos conjuntos A y B diremos que son iguales si tienen losmismos elementos es decir si se verifica que A sube B y B sube A Lo notaremos A = B
La funcioacuten (conjuntosIguales c1 c2) se verifica si los conjuntos xs y ys son igua-les
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
-- gtgtgt let c5 = listaAConjunto [4444442]
-- gtgtgt conjuntosIguales c1 c2
-- False
-- gtgtgt conjuntosIguales c3 c4
-- True
-- gtgtgt conjuntosIguales c1 c5
-- True
conjuntosIguales Eq a =gt [a] -gt [a] -gt Bool
conjuntosIguales c1 c2 =
esSubconjunto c1 c2 ampamp esSubconjunto c2 c1
1218 Subconjuntos propios
Definicioacuten 1218 Los subconjuntos de A distintos del empty y del mismo A se denominansubconjuntos propios de A
La funcioacuten (esSubconjuntoPropio c1 c2) se verifica si c1 es un subconjunto pro-pio de c2
12 Representaciones de conjuntos 31
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt esSubconjuntoPropio u u
-- False
-- gtgtgt esSubconjuntoPropio c1 u
-- True
esSubconjuntoPropio Eq a =gt [a] -gt [a] -gt Bool
esSubconjuntoPropio c1 c2
| null c1 = False
| conjuntosIguales c1 c2 = False
| otherwise = esSubconjunto c1 c2
1219 Complementario de un conjunto
Definicioacuten 1219 Dado un conjunto A se define el complementario de A que notaremospor A como
A = x|x isin U x 6isin A
La funcioacuten (complementario u c) devuelve el complementario del conjunto c y enel universo u
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt let c2 = listaAConjunto [14689]
-- gtgtgt complementario u c1
-- [14689]
-- gtgtgt complementario u u
-- []
-- gtgtgt complementario u vacio
-- [123456789]
-- gtgtgt complementario u c2
-- [2357]
complementario Eq a =gt [a] -gt [a] -gt [a]
complementario = ()
1220 Cardinal de un conjunto
Definicioacuten 1220 Dado un conjunto finito A denominaremos cardinal de A al nuacutemerode elementos que tiene y lo notaremos |A|
La funcioacuten (cardinal xs) devuelve el cardinal del conjunto xs
32 Capiacutetulo 1 Conjuntos
-- | Ejemplos
-- gtgtgt cardinal vacio
-- 0
-- gtgtgt cardinal (listaAConjunto [110])
-- 10
-- gtgtgt cardinal (listaAConjunto chocolate)
-- 7
cardinal [a] -gt Int
cardinal = length
1221 Conjunto unitario
Definicioacuten 1221 Un conjunto con un uacutenico elemento se denomina unitario
Nota 127 Notemos que si X = x es un conjunto unitario debemos distinguirentre el conjunto X y el elemento x
La funcioacuten (esUnitario c) se verifica si el conjunto c es unitario
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto (take 10 (repeat 5))
-- gtgtgt let c2 = listaAConjunto valverde
-- gtgtgt let c3 = listaAConjunto coco
-- gtgtgt esUnitario c1
-- True
-- gtgtgt esUnitario c2
-- False
-- gtgtgt esUnitario c2
-- False
esUnitario Eq a =gt [a] -gt Bool
esUnitario c = c == take 1 c
1222 Unioacuten de conjuntos
Definicioacuten 1222 Dados dos conjuntos A y B se define la unioacuten de A y B notado A cup Bcomo el conjunto formado por aquellos elementos que pertenecen al menos a uno de los dosconjuntos A oacute B es decir
A cup B = x | x isin A or x isin B
La funcioacuten (unionConjuntos c1 c2) devuelve la unioacuten de los conjuntos xs y ys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [139]
-- gtgtgt let c2 = listaAConjunto [249]
12 Representaciones de conjuntos 33
-- gtgtgt unionConjuntos c1 c2
-- [135792468]
unionConjuntos Eq a =gt [a] -gt [a] -gt [a]
unionConjuntos = union
Definicioacuten 1223 Dada una familia de conjuntos Ai con i isin I se define la unioacuten ge-neral de los conjuntos Ai notado
⋃iisinI Ai como el conjunto formado por aquellos elementos
que pertenecen al menos a uno de los conjuntos de la familia es decir
⋃iisinI
Ai = x | x isin Ai foralli isin I
La funcioacuten (unionGeneral xss) devuelve la unioacuten general de la familia de conjun-tos de la lista xss
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1415]
-- gtgtgt let c2 = listaAConjunto [2515]
-- gtgtgt let c3 = listaAConjunto [3615]
-- gtgtgt unionGeneral [c1c2c3]
-- [147101325811143691215]
unionGeneral Eq a =gt [[a]] -gt [a]
unionGeneral = foldr unionConjuntos []
1223 Interseccioacuten de conjuntos
Definicioacuten 1224 Dados dos conjuntos A y B se define la interseccioacuten de A y B notadoA cap B como el conjunto formado por aquellos elementos que pertenecen a cada uno de losdos conjuntos A y B es decir
A cap B = x | x isin A and x isin B
La funcioacuten (interseccion c1 c2) devuelve la interseccioacuten de los conjuntos c1 yc2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1320]
-- gtgtgt let c2 = listaAConjunto [2420]
-- gtgtgt let c3 = listaAConjunto [2430]
-- gtgtgt let c4 = listaAConjunto [4830]
-- gtgtgt interseccion c1 c2
-- []
-- gtgtgt interseccion c3 c4
-- [481216202428]
34 Capiacutetulo 1 Conjuntos
interseccion Eq a =gt [a] -gt [a] -gt [a]
interseccion = intersect
1224 Producto cartesiano
Definicioacuten 1225 El producto cartesiano 2 de dos conjuntos A y B es una operacioacutensobre ellos que resulta en un nuevo conjunto Atimes B que contiene a todos los pares ordenadostales que la primera componente pertenece a A y la segunda pertenece a B es decir
Atimes B = (a b) | a isin A b isin B
La funcioacuten (productoCartesiano c1 c2) devuelve el producto cartesiano de xs eys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [31]
-- gtgtgt let c2 = listaAConjunto [247]
-- gtgtgt productoCartesiano c1 c2
-- [(32)(34)(37)(12)(14)(17)]
-- gtgtgt productoCartesiano c2 c1
-- [(23)(21)(43)(41)(73)(71)]
productoCartesiano [a] -gt [b] -gt [(ab)]
productoCartesiano xs ys = [ (xy) | x lt- xs y lt- ys]
1225 Combinaciones
Definicioacuten 1226 Las combinaciones de un conjunto S tomados en grupos de n son todoslos subconjuntos de S con n elementos
La funcioacuten (combinaciones n xs) devuelve las combinaciones de los elementos dexs en listas de n elementos
-- | Ejemplos
-- gtgtgt combinaciones 3 [ad]
-- [abcabdacdbcd]
-- gtgtgt combinaciones 2 [248]
-- [[24][26][28][46][48][68]]
combinaciones Integer -gt [a] -gt [[a]]
combinaciones 0 _ = [[]]
combinaciones _ [] = []
combinaciones k (xxs) =
[xys | ys lt- combinaciones (k-1) xs] ++ combinaciones k xs
2httpsenwikipediaorgwikiCartesian_product
13 Eleccioacuten de la representacioacuten de conjuntos 35
1226 Variaciones con repeticioacuten
Definicioacuten 1227 Las variaciones con repeticioacuten de m elementos tomados en grupos den es el nuacutemero de diferentes nndashtuplas de un conjunto de m elementos
La funcioacuten (variacionesR n xs) devuelve las variaciones con con repeticioacuten de loselementos de xs en listas de n elementos
-- | Ejemplos
-- gtgtgt variacionesR 3 [ab]
-- [aaaaababaabbbaababbbabbb]
-- gtgtgt variacionesR 2 [235]
-- [[22][23][25][32][33][35][52][53][55]]
variacionesR Int -gt [a] -gt [[a]]
variacionesR _ [] = [[]]
variacionesR 0 _ = [[]]
variacionesR k us =
[uvs | u lt- us vs lt- variacionesR (k-1) us]
13 Eleccioacuten de la representacioacuten de conjuntos
Nota 131 En el moacutedulo Conjuntos se elige la representacioacuten de conjunto con la quese trabajaraacute
-- Seleccionar para trabajar con los conjuntos como listas sin
-- elementos repetidos
module Conjuntos
(module ConjuntosConListas)
where
import ConjuntosConListas
-- Seleccionar para trabajar con los conjuntos como listas ordenadas
-- sin elementos repetidos
-- module Conjuntos
-- (module ConjuntosConListasOrdenadasSinRepeticion)
-- where
-- import ConjuntosConListasOrdenadasSinRepeticion
36 Capiacutetulo 1 Conjuntos
Capiacutetulo 2
Relaciones y funciones
21 Relaciones
Las relaciones que existen entre personas nuacutemeros conjuntos y muchas otras enti-dades pueden formalizarse en la idea de relacioacuten binaria En esta seccioacuten se define ydesarrolla este concepto particularizando en el caso de las relaciones homogeacuteneasy en el de las funciones
211 Relacioacuten binaria
Definicioacuten 211 Una relacioacuten binaria 1 (o correspondencia) entre dos conjuntos A yB es un subconjunto del producto cartesiano Atimes B
La funcioacuten (esRelacion xs ys r) se verifica si r es una relacioacuten binaria de xs enys Por ejemplo
-- | Ejemplos
-- gtgtgt esRelacion [31] [247] [(12)(34)]
-- True
-- gtgtgt esRelacion [31] [247] [(12)(31)]
-- False
esRelacion (Ord a Ord b) =gt [a] -gt [b] -gt [(ab)] -gt Bool
esRelacion xs ys r =
r `esSubconjunto` productoCartesiano xs ys
212 Imagen por una relacioacuten
Definicioacuten 212 Si R es una relacioacuten binaria la imagen del elemento x en la relacioacuten Res el conjunto de los valores correspondientes a x en R
1httpsenwikipediaorgwikiBinary_relation
37
38 Capiacutetulo 2 Relaciones y funciones
La funcioacuten (imagenRelacion r x) es la imagen de x en la relacioacuten r
-- | Ejemplos
-- gtgtgt imagenRelacion [(13)(25)(14)] 1
-- [34]
-- gtgtgt imagenRelacion [(13)(25)(14)] 2
-- [5]
-- gtgtgt imagenRelacion [(13)(25)(14)] 3
-- []
imagenRelacion (Ord a Ord b) =gt [(ab)] -gt a -gt [b]
imagenRelacion r x =
nub [y | (zy) lt- r z == x]
213 Dominio de una relacioacuten
Definicioacuten 213 Dada una relacioacuten binaria R su dominio es el conjunto que contiene atodos los valores que se toman en la relacioacuten R
La funcioacuten (dominio r) devuelve el dominio de la relacioacuten r
-- | Ejemplo
-- gtgtgt dominio [(32)(51)(34)]
-- [35]
dominio Ord a =gt [(ab)] -gt [a]
dominio r = listaAConjunto (map fst r)
214 Rango de una relacioacuten
Definicioacuten 214 El rango de una relacioacuten binaria R es el conjunto de las imaacutegenes demediante R
La funcioacuten (rango r) devuelve el rango de la relacioacuten binaria r
-- | Ejemplo
-- gtgtgt rango [(32)(52)(34)]
-- [24]
rango Ord b =gt [(ab)] -gt [b]
rango r = listaAConjunto (map snd r)
215 Antiimagen por una relacioacuten
Definicioacuten 215 La antiimagen del elemento y por una relacioacuten r es el conjunto de loselementos cuya imagen es y
La (antiImagenRelacion r y) es la antiimagen del elemento y en la relacioacuten bina-ria r
22 Relaciones homogeacuteneas 39
-- | Ejemplo
-- gtgtgt antiImagenRelacion [(13)(23)(74)] 3
-- [12]
antiImagenRelacion (Ord a Ord b) =gt [(ab)] -gt b -gt [a]
antiImagenRelacion r y =
nub [x | (xz) lt- r z == y]
216 Relacioacuten funcional
Definicioacuten 216 Dada una relacioacuten binaria R se dice funcional si todos los elementos desu dominio tienen una uacutenica imagen en R
La funcioacuten (esFuncional r) se verifica si la relacioacuten r es funcional
-- | Ejemplos
-- gtgtgt esFuncional [(32)(51)(79)]
-- True
-- gtgtgt esFuncional [(32)(51)(34)]
-- False
-- gtgtgt esFuncional [(32)(51)(32)]
-- True
esFuncional (Ord a Ord b) =gt [(ab)] -gt Bool
esFuncional r =
and [esUnitario (imagenRelacion r x) | x lt- dominio r]
22 Relaciones homogeacuteneas
Para elaborar la presente seccioacuten se han consultado los apuntes de ldquoAacutelgebra baacutesicardquo([6]) asignatura del primer curso del Grado en Matemaacuteticas
Definicioacuten 221 Una relacioacuten binaria entre dos conjuntos A y B se dice que es homogeacute-nea si los conjuntos son iguales es decir si A = B Si el par (x y) isin AA estaacute en la relacioacutenhomogeacutenea R diremos que x estaacute Rndashrelacionado con y o relacionado con y por R Esto senotaraacute frecuentemente xRy (noacutetese que el orden es importante)
La funcioacuten (esRelacionHomogenea xs r) se verifica si r es una relacioacuten binaria ho-mogeacutenea en el conjunto xs
-- | Ejemplos
-- gtgtgt esRelacionHomogenea [14] [(12)(24)(34)(41)]
-- True
-- gtgtgt esRelacionHomogenea [14] [(12)(25)(34)(41)]
-- False
-- gtgtgt esRelacionHomogenea [14] [(12)(34)(41)]
40 Capiacutetulo 2 Relaciones y funciones
-- True
esRelacionHomogenea Ord a =gt [a] -gt [(aa)] -gt Bool
esRelacionHomogenea xs = esRelacion xs xs
Nota 221 El segundo argumento que recibe la funcioacuten ha de ser una lista de parescon ambas componentes del mismo tipo
La funcioacuten (estaRelacionado r x y) se verifica si x estaacute relacionado con y en larelacioacuten homogeacutenea r
-- | Ejemplos
-- gtgtgt estaRelacionado [(13)(25)(46)] 2 5
-- True
-- gtgtgt estaRelacionado [(13)(25)(46)] 2 3
-- False
estaRelacionado Ord a =gt [(aa)] -gt a -gt a -gt Bool
estaRelacionado r x y = (xy) `elem` r
221 Relaciones reflexivas
Definicioacuten 222 Sea R una relacioacuten binaria homogeacutenea en el conjunto A Diremos que Res reflexiva cuando todos los elementos de A estaacuten relacionados por R consigo mismos esdecir cuando forallx isin A se tiene que xRx
La funcioacuten (esReflexiva xs r) se verifica si la relacioacuten r en xs es reflexiva
-- | Ejemplos
-- gtgtgt esReflexiva [12] [(11)(12)(22)]
-- True
-- gtgtgt esReflexiva [12] [(11)(12)]
-- False
esReflexiva Ord a =gt [a] -gt [(aa)] -gt Bool
esReflexiva xs r = zip xs xs `esSubconjunto` r
Nota 222 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xSylarrrarr xminus y es parbull xTylarrrarr x divide a yson relaciones binarias homogeacuteneas reflexivas
222 Relaciones simeacutetricas
Definicioacuten 223 Diremos que una relacioacuten homogeacutenea R es simeacutetrica cuando
forall(x y) isin R minusrarr (y x) isin R
22 Relaciones homogeacuteneas 41
La funcioacuten (esSimetrica r) se verifica si la relacioacuten r es simeacutetrica
-- | Ejemplos
-- gtgtgt esSimetrica [(11)(12)(21)]
-- True
-- gtgtgt esSimetrica [(11)(12)(22)]
-- False
esSimetrica Ord a =gt [(aa)] -gt Bool
esSimetrica r =
listaAConjunto [(yx) | (xy) lt- r] `esSubconjunto` r
Nota 223 En el conjunto N la relacioacuten caracterizada por xSy larrrarr xminus y es par esuna relacioacuten binaria homogeacutenea simeacutetrica
223 Relaciones antisimeacutetricas
Definicioacuten 224 Sea R una relacioacuten binaria homogeacutenea en el conjunto A Diremos que Res antisimeacutetrica cuando
forall(x y)[(x y) isin R and (y x) isin R minusrarr x = y
La funcioacuten (esAntisimetrica r) se verifica si la relacioacuten r es antisimeacutetrica
-- | Ejemplos
-- gtgtgt esAntisimetrica [(12)(31)]
-- True
-- gtgtgt esAntisimetrica [(12)(21)]
-- False
esAntisimetrica Ord a =gt [(aa)] -gt Bool
esAntisimetrica r =
and [x == y | (xy) lt- r (yx) `elem` r]
Nota 224 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xTylarrrarr x divide a ybull xRylarrrarr x lt yson relaciones binarias homogeacuteneas antisimeacutetricas
224 Relaciones transitivas
Definicioacuten 225 Sea R una relacioacuten binaria homogeacutenea en el conjunto A Diremos que Res transitiva cuando forall(x y) (y z) isin R se tiene que xRy e yRz minusrarr xRz
La funcioacuten (esTransitiva r) se verifica si la relacioacuten r es transitiva
42 Capiacutetulo 2 Relaciones y funciones
-- | Ejemplos
-- gtgtgt esTransitiva [(12)(13)(23)]
-- True
-- gtgtgt esTransitiva [(12)(23)]
-- False
esTransitiva Ord a =gt [(aa)] -gt Bool
esTransitiva r =
listaAConjunto [(xz) | (xy) lt- r (wz) lt- r y == w]
`esSubconjunto` r
Nota 225 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xSylarrrarr xminus y es parbull xTylarrrarr x divide a ybull xRylarrrarr x lt yson relaciones binarias homogeacuteneas transitivas
225 Relaciones de equivalencia
Definicioacuten 226 Las relaciones homogeacuteneas que son a la vez reflexivas simeacutetricas y tran-sitivas se denominan relaciones de equivalencia
La funcioacuten (esRelacionEquivalencia xs r) se verifica si r es una relacioacuten de equi-valencia en xs-- | Ejemplos
-- gtgtgt esRelacionEquivalencia [13] [(11)(12)(21)(22)(33)]
-- True
-- gtgtgt esRelacionEquivalencia [13] [(12)(21)(22)(33)]
-- False
-- gtgtgt esRelacionEquivalencia [13] [(11)(12)(22)(33)]
-- False
esRelacionEquivalencia Ord a =gt [a] -gt [(aa)] -gt Bool
esRelacionEquivalencia xs r =
esReflexiva xs r ampamp
esSimetrica r ampamp
esTransitiva r
Nota 226 En el conjunto N la relacioacuten caracterizada por xSy larrrarr xminus y es par esuna relacioacuten de equivalencia
226 Relaciones de orden
Definicioacuten 227 Las relaciones homogeacuteneas que son a la vez reflexivas antisimeacutetricas ytransitivas se denominan relaciones de orden
23 Funciones 43
La funcioacuten (esRelacionOrden xs r) se verifica si r es una relacioacuten de orden en xs
-- | Ejemplo
-- gtgtgt esRelacionOrden [13] [(11)(12)(13)(22)(23)(33)]
-- True
esRelacionOrden Ord a =gt [a] -gt [(aa)] -gt Bool
esRelacionOrden xs r =
esReflexiva xs r ampamp
esAntisimetrica r ampamp
esTransitiva r
Nota 227 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xTylarrrarr x divide a yson relaciones de orden
227 Clases de equivalencia
Definicioacuten 228 Si R es una relacioacuten de equivalencia en A denominamos clase de equi-valencia de un elemento x isin A al conjunto de todos los elementos de A relacionados con xes decir x = R(x) = y isin A|xRy donde la primera notacioacuten se usa si la relacioacuten con laque se estaacute tratando se sobreentiende y la segunda si no es asiacute
La funcioacuten (clasesEquivalencia xs r) devuelve las clases de la relacioacuten de equi-valencia r en xs
-- | Ejemplo
-- gtgtgt let r = [(xy) | x lt- [15] y lt- [15] even (x-y)]
-- gtgtgt clasesEquivalencia [15] r
-- [[135][24]]
clasesEquivalencia Ord a =gt [a] -gt [(aa)] -gt [[a]]
clasesEquivalencia _ [] = []
clasesEquivalencia [] _ = []
clasesEquivalencia (xxs) r = (xc) clasesEquivalencia (xs c) r
where c = filter (estaRelacionado r x) xs
23 Funciones
Definicioacuten 231 Dada una relacioacuten F entre A y B se diraacute que es una funcioacuten si es unarelacioacuten binaria es funcional y todos los elementos de A estaacuten en el dominio
La funcioacuten (esFuncion xs ys f) se verifica si f es una funcioacuten de xs en ys
-- | Ejemplos
-- gtgtgt esFuncion [13] [247] [(17)(32)]
44 Capiacutetulo 2 Relaciones y funciones
-- True
-- gtgtgt esFuncion [13] [247] [(17)]
-- False
-- gtgtgt esFuncion [13] [247] [(14)(17)(32)]
-- False
esFuncion (Ord a Ord b) =gt [a] -gt [b] -gt [(ab)] -gt Bool
esFuncion xs ys f =
esRelacion xs ys f ampamp
xs `esSubconjunto` dominio f ampamp
esFuncional f
Nota 231 A lo largo de la seccioacuten representaremos a las funciones como listas depares
type Funcion a b = [(ab)]
La funcioacuten (funciones xs ys) devuelve todas las posibles funciones del conjuntoxs en ys
-- | Ejemplos
-- gtgtgt pp $ funciones [12] [34]
-- [[(1 3)(2 3)][(1 3)(2 4)][(1 4)(2 3)]
-- [(1 4)(2 4)]]
-- gtgtgt pp $ funciones [12] [345]
-- [[(1 3)(2 3)][(1 3)(2 4)][(1 3)(2 5)]
-- [(1 4)(2 3)][(1 4)(2 4)][(1 4)(2 5)]
-- [(1 5)(2 3)][(1 5)(2 4)][(1 5)(2 5)]]
-- gtgtgt pp $ funciones [012] [34]
-- [[(0 3)(1 3)(2 3)][(0 3)(1 3)(2 4)]
-- [(0 3)(1 4)(2 3)][(0 3)(1 4)(2 4)]
-- [(0 4)(1 3)(2 3)][(0 4)(1 3)(2 4)]
-- [(0 4)(1 4)(2 3)][(0 4)(1 4)(2 4)]]
funciones [a] -gt [b] -gt [Funcion a b]
funciones xs ys =
[zip xs zs | zs lt- variacionesR (length xs) ys]
231 Imagen por una funcioacuten
Definicioacuten 232 Si f es una funcioacuten entre A y B y x es un elemento del conjunto A laimagen del elemento x por la funcioacuten f es el valor asociado a x por la funcioacuten f
La funcioacuten (imagen f x) es la imagen del elemento x en la funcioacuten f
-- | Ejemplos
-- gtgtgt imagen [(17)(32)] 1
-- 7
-- gtgtgt imagen [(17)(32)] 3
23 Funciones 45
-- 2
imagen (Ord a Ord b) =gt Funcion a b -gt a -gt b
imagen f x = head (imagenRelacion f x)
La funcioacuten (imagenConjunto f xs) es la imagen del conjunto xs en la funcioacuten f
-- | Ejemplos
-- gtgtgt imagenConjunto [(17)(32)(43)] [14]
-- [73]
-- gtgtgt imagenConjunto [(17)(32)] [31]
-- [27]
imagenConjunto (Ord a Ord b) =gt Funcion a b -gt [a] -gt [b]
imagenConjunto f xs = nub (map (imagen f) xs)
232 Funciones inyectivas
Definicioacuten 233 Diremos que una funcioacuten f entre dos conjuntos es inyectiva 2 si a ele-mentos distintos del dominio le corresponden elementos distintos de la imagen es decir siforalla b isin dominio( f ) tales que a 6= b f (a) 6= f (b)
La funcioacuten (esInyectiva fs) se verifica si la funcioacuten fs es inyectiva
-- | Ejemplos
-- gtgtgt esInyectiva [(14)(25)(36)]
-- True
-- gtgtgt esInyectiva [(14)(25)(34)]
-- False
-- gtgtgt esInyectiva [(14)(25)(36)(36)]
-- True
esInyectiva (Ord a Ord b) =gt Funcion a b -gt Bool
esInyectiva f =
all esUnitario [antiImagenRelacion f y | y lt- rango f]
233 Funciones sobreyectivas
Definicioacuten 234 Diremos que una funcioacuten f entre dos conjuntos A y B es sobreyectiva3 si todos los elementos de B son imagen de alguacuten elemento de A
La funcioacuten (esSobreyectiva xs ys f) se verifica si la funcioacuten f es sobreyectiva Ala hora de definirla estamos contando con que f es una funcioacuten entre xs y ys
-- | Ejemplos
-- gtgtgt esSobreyectiva [123] [456] [(14)(25)(36)]
2httpsenwikipediaorgwikiInjective_function3httpsenwikipediaorgwikiSurjective_function
46 Capiacutetulo 2 Relaciones y funciones
-- True
-- gtgtgt esSobreyectiva [123] [456] [(14)(25)(34)]
-- False
-- gtgtgt esSobreyectiva [123] [456] [(14)(24)(36)(36)]
-- False
esSobreyectiva (Ord aOrd b) =gt [a] -gt [b] -gt Funcion a b -gt Bool
esSobreyectiva _ ys f = ys `esSubconjunto` rango f
234 Funciones biyectivas
Definicioacuten 235 Diremos que una funcioacuten f entre dos conjuntos A y B es biyectiva 4 sicada elementos de B es imagen de un uacutenico elemento de A
La funcioacuten (esBiyectiva xs ys f) se verifica si la funcioacuten f es biyectiva
-- | Ejemplos
-- gtgtgt esBiyectiva [123] [456] [(14)(25)(36)(36)]
-- True
-- gtgtgt esBiyectiva [123] [456] [(14)(25)(34)]
-- False
-- gtgtgt esBiyectiva [123] [4567] [(14)(25)(36)]
-- False
esBiyectiva (Ord a Ord b) =gt [a] -gt [b] -gt Funcion a b -gt Bool
esBiyectiva xs ys f =
esInyectiva f ampamp esSobreyectiva xs ys f
La funciones biyecciones1 xs ys y biyecciones2 xs ys devuelven la lista de to-das las biyecciones entre los conjuntos xs y ys La primera lo hace filtrando las fun-ciones entre los conjuntos que son biyectivas y la segunda lo hace construyendouacutenicamente las funciones biyectivas entre los conjuntos con el consecuente ahorrocomputacional
ghcigt length (biyecciones1 [17] [ag])
5040
(1675 secs 4146744104 bytes)
ghcigt length (biyecciones2 [17] [ag])
5040
(002 secs 0 bytes)
ghcigt length (biyecciones1 [16] [ag])
0
(253 secs 592625824 bytes)
ghcigt length (biyecciones2 [16] [ag])
0
(001 secs 0 bytes)
4httpsenwikipediaorgwikiBijective_function
23 Funciones 47
biyecciones1 (Ord a Ord b) =gt [a] -gt [b] -gt [Funcion a b]
biyecciones1 xs ys =
filter (esBiyectiva xs ys) (funciones xs ys)
biyecciones2 (Ord a Ord b) =gt [a] -gt [b] -gt [Funcion a b]
biyecciones2 xs ys
| length xs = length ys = []
| otherwise = [zip xs zs | zs lt- permutations ys]
Nota 232 En lo que sigue trabajaremos con la funcioacuten biyecciones2 asiacute que laredefiniremos como biyecciones
biyecciones (Ord a Ord b) =gt [a] -gt [b] -gt [Funcion a b]
biyecciones = biyecciones2
235 Inversa de una funcioacuten
Definicioacuten 236 Si f es una funcioacuten biyectiva entre los conjuntos A y B definimos lafuncioacuten inversa 5 como la funcioacuten que a cada elemento de B le hace corresponder el elementode A del que es imagen en B
El valor de (inversa f) es la funcioacuten inversa de f
-- | Ejemplos
-- gtgtgt inversa [(14)(25)(36)]
-- [(41)(52)(63)]
-- gtgtgt sort (inversa [(1f)(2m)(3a)])
-- [(a3)(f1)(m2)]
inversa (Ord a Ord b) =gt Funcion a b -gt Funcion b a
inversa f = listaAConjunto [(yx) | (xy) lt- f]
Nota 233 Para considerar la inversa de una funcioacuten esta tiene que ser biyectivaLuego (inversa f) asigna a cada elemento del conjunto imagen (que en este casocoincide con la imagen) uno y solo uno del conjunto de salida
La funcioacuten (imagenInversa f y) devuelve el elemento del conjunto de salida de lafuncioacuten f tal que su imagen es y
-- | Ejemplos
-- gtgtgt imagenInversa [(14)(25)(36)] 5
-- 2
-- gtgtgt imagenInversa [(1f)(2m)(3a)] a
-- 3
imagenInversa (Ord a Ord b) =gt Funcion a b -gt b -gt a
imagenInversa f = imagen (inversa f)
5httpsenwikipediaorgwikiInverse_function
48 Capiacutetulo 2 Relaciones y funciones
Capiacutetulo 3
Introduccioacuten a la teoriacutea de grafos
Se dice que la Teoriacutea de Grafos tiene su origen en 1736 cuando Euler dio una so-lucioacuten al problema (hasta entonces no resuelto) de los siete puentes de Koumlnigsbergiquestexiste un camino que atraviese cada uno de los puentes exactamente una vezPara probar que no era posible Euler sustituyoacute cada regioacuten por un nodo y cadapuente por una arista creando el primer grafo que fuera modelo de un problemamatemaacutetico
Figura 31 Dibujo de los puentes de Koumlnigsberg
A
B
C
D
b
c
a
d
f
e
g
Figura 32 Modelo de los puentes de Koumlnigsberg
Desde entonces se ha ido desarrollando esta metodologiacutea hasta convertise en los uacutel-timos antildeos en una herramienta importante en aacutereas del conocimiento muy variadascomo por ejemplo la Investigacioacuten Operativa la Computacioacuten la Ingenieriacutea Eleacutec-trica la Geografiacutea y la Quiacutemica Es por ello que ademaacutes se ha erigido como unanueva disciplina matemaacutetica que generalmente asociada a las ramas de Topologiacuteay AacutelgebraLa utilidad de los grafos se basa en su gran poder de abstraccioacuten y una representa-cioacuten muy clara de cualquier relacioacuten lo que facilita enormemente tanto la fase demodelado como la de resolucioacuten de cualquier problema Gracias a la Teoriacutea de Gra-fos se han desarrollado una gran variedad de algoritmos y meacutetodos de decisioacuten quepodemos implementar a traveacutes de lenguajes funcionales y permiten automatizar laresolucioacuten de muchos problemas a menudo tediosos de resolver a mano
49
50 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
31 Definicioacuten de grafo
En primer lugar vamos a introducir terminologiacutea baacutesica en el desarrollo de la Teoriacuteade Grafos
Definicioacuten 311 Un grafo G es un par (V A) donde V es el conjunto cuyos elementosllamamos veacutertices (o nodos) y A es un conjunto cuyos elementos llamamos aristas
Definicioacuten 312 Una arista de un grafo G = (V A) es un conjunto de dos elementosde V Es decir para dos veacutertices v vprime de G (v vprime) y (vprime v) representa la misma arista
Definicioacuten 313 Dado un grafo G = (V A) diremos que un veacutertice v isin V es adyacentea vprime isin V si (vprime v) isin A
Definicioacuten 314 Si en un grafo dirigido se permiten aristas repetidas lo llamaremos mul-tigrafo Si no se permiten lo llamaremos grafo regular
Nota 311 Denotaremos por |V| al nuacutemero de veacutertices y por |A| al nuacutemero de aristasdel grafo (V A)
Ejemplo 312 Sea G = (V A) un grafo con V = a b c d y A = (a b) (a c) (b d)(d d) En este grafo los veacutertices a d son adyacentes a b
a
b
c
d
32 El TAD de los grafos
En esta seccioacuten nos planteamos la tarea de implementar las definiciones presenta-das anteriormente en un lenguaje funcional En nuestro caso el lenguaje que utili-zaremos seraacute Haskell Definiremos el Tipo Abstracto de Dato (TAD) de los grafos ydaremos algunos ejemplos de posibles representaciones de grafos con las que po-dremos trabajarSi consideramos un grafo finito cualquiera G = (V A) podemos ordenar el conjun-to de los veacutertices y representarlo como V = v1 vn con n = |V|En primer lugar necesitaremos crear un tipo (Grafo) cuya definicioacuten sea compatiblecon la entidad matemaacutetica que representa y que nos permita definir las operacionesque necesitamos para trabajar con los grafos Estas operaciones son
32 El TAD de los grafos 51
creaGrafo -- [a] -gt [(aa)] -gt Grafo a
vertices -- Grafo a -gt [a]
adyacentes -- Grafo a -gt a -gt [a]
aristaEn -- (aa) -gt Grafo a -gt Bool
aristas -- Grafo a -gt [(aa)]
dondebull (creaGrafo vs as) es un grafo tal que el conjunto de sus veacutertices es vs y el de
sus aristas es asbull (vertices g) es la lista de todos los veacutertices del grafo gbull (adyacentes g v) es la lista de los veacutertices adyacentes al veacutertice v en el grafo gbull (aristaEn a g) se verifica si a es una arista del grafo gbull (aristas g) es la lista de las aristas del grafo g
Nota 321 Las funciones que aparecen en la especificacioacuten del TAD no dependende la representacioacuten que elijamos
Ejemplo 322 Veamos un ejemplo de creacioacuten de grafo y su representacioacuten graacutefica
creaGrafo [15] [(12)(13)(15)(24)
(25)(34)(35)(45)]
1
2
34
5
321 Grafos como listas de aristas
En el moacutedulo GrafoConListaDeAristas se definen las funciones del TAD de losgrafos dando su representacioacuten como conjuntos de aristas es decir representandoa un grafo como dos conjuntos la primera seraacute la lista ordenada de los veacutertices y lasegunda la lista ordenada de las aristas (en ambas listas se excluye la posibilidad derepeticiones)
Nota 323 Las ventajas de usar arrays frente a usar listas es que los array tienenacceso constante (O(1)) a sus elementos mientras que las listas tienen acceso lineal(O(n)) y que la actualizacioacuten de un elemento en un array no supone espacio extraSin embargo los arrays son representaciones muy riacutegidas cualquier modificacioacutenen su estructura como cambiar su tamantildeo supone un gran coste computacionalpues se tendriacutea que crear de nuevo el array y ademaacutes sus iacutendices deben pertenecer
52 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
a la clase de los objetos indexables (Ix) luego perdemos mucha flexibilidad en larepresentacioacuten
- LANGUAGE DeriveGeneric -
module GrafoConListaDeAristas
( Grafo
creaGrafo -- [a] -gt [(aa)] -gt Grafo a
vertices -- Grafo a -gt [a]
adyacentes -- Grafo a -gt a -gt [a]
aristaEn -- (aa) -gt Grafo a -gt Bool
aristas -- Grafo a -gt [(aa)]
) where
En las definiciones del presente moacutedulo se usaraacuten las funciones nub y sort de lalibreriacutea DataList
Vamos a definir un nuevo tipo de dato (Grafo a) que representaraacute un grafo a partirde la lista de sus veacutertices (donde los veacutertices son de tipo a) y de aristas (que son paresde veacutertices)
data Grafo a = G [a] [(aa)]
deriving (Eq Show Generic)
instance (Out a) =gt Out (Grafo a)
Las funciones baacutesicas que definiremos a partir de este tipo coincidiraacuten con las indi-cadas en el TAD de los grafosbull (creaGrafo vs as) es el grafo cuyo conjunto de veacutertices es cs y el de sus aristas
es as-- | Ejemplo
-- gtgtgt creaGrafo [15] [(12)(14)(15)(23)(25)(34)(35)]
-- G [12345] [(12)(14)(15)(23)(25)(34)(35)]
creaGrafo Ord a =gt [a] -gt [(aa)] -gt Grafo a
creaGrafo vs as =
G (sort vs) (nub (sort [parOrdenado a | a lt- as]))
parOrdenado Ord a =gt (aa) -gt (aa)
parOrdenado (xy) | x lt= y = (xy)
| otherwise = (yx)
Ejemplo 324 ejGrafo es el grafo
32 El TAD de los grafos 53
1
2
3
4
5
Los ejemplos usaraacuten el siguiente grafo
ejGrafo Grafo Int
ejGrafo = creaGrafo [15]
[(12)(14)(15)(23)(25)(34)(35)(45)]
bull (vertices g) es la lista de los veacutertices del grafo g
-- | Ejemplo
-- gtgtgt vertices ejGrafo
-- [12345]
vertices Grafo a -gt [a]
vertices (G vs _) = vs
bull (adyacentes g v) es la lista de los veacutertices adyacentes al veacutertice v en el grafo g
-- | Ejemplos
-- gtgtgt adyacentes ejGrafo 4
-- [135]
-- gtgtgt adyacentes ejGrafo 3
-- [245]
adyacentes Eq a =gt Grafo a -gt a -gt [a]
adyacentes (G _ as) v =
[u | (ux) lt- as x == v] `union` [u | (xu) lt- as x == v]
bull (aristaEn a g) se verifica si a es una arista del grafo g
-- | Ejemplos
-- gtgtgt (51) `aristaEn` ejGrafo
-- True
-- gtgtgt (31) `aristaEn` ejGrafo
-- False
aristaEn Ord a =gt (aa) -gt Grafo a -gt Bool
aristaEn a (G _ as) = parOrdenado a `elem` as
bull (aristas g) es la lista de las aristas del grafo g
-- | Ejemplo
-- gtgtgt aristas ejGrafo
-- [(12)(14)(15)(23)(25)(34)(35)(45)]
aristas Grafo a -gt [(aa)]
aristas (G _ as) = as
54 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
33 Generador de grafos
En esta seccioacuten presentaremos el generador de grafos que nos permitiraacute generargrafos como listas de aristas arbitrariamente y usarlos como ejemplos o para com-probar propiedadesPara aprender a controlar el tamantildeo de los grafos generados he consultado las si-guientes fuentes QuickCheck A Lightweight Tool for Random Testing of Haskell Programs 1
([3]) Property Testing using QuickCheck 2 ([9])(generaGrafos n) es un generador de grafos de hasta n veacutertices Por ejemplo
ghcigt sample (generaGrafo 5)
G [12] []
G [1] [(11)]
G [] []
G [1234] [(22)]
G [123] [(11)(12)(13)(22)]
G [12345] [(12)(14)(15)(22)(23)(24)(33)(34)(44)(45)]
G [1] []
G [123] [(12)(22)(33)]
G [1234] [(11)(14)(23)(24)(33)(34)(44)]
G [12] []
G [123] [(11)(12)(22)(33)]
ghcigt sample (generaGrafo 2)
G [12] [(12)(22)]
G [12] [(11)]
G [12] [(11)(12)]
G [] []
G [1] [(11)]
G [1] []
G [1] []
G [] []
G [] []
G [] []
G [1] [(11)]
generaGrafo Int -gt Gen (Grafo Int)
generaGrafo s = do
let m = s `mod` 11
n lt- choose (0m)
as lt- sublistOf [(xy) | x lt- [1n] y lt- [xn]]
return (creaGrafo [1n] as)
1httpswwweecsnorthwesternedu~robbycourses395-495-2009-fallquickpdf2httpswwwdccfcuppt~pbvaulastapfslidesquickcheckhtml
34 Ejemplos de grafos 55
Nota 331 Los grafos estaacuten contenidos en la clase de los objetos generables aleato-riamente
instance Arbitrary (Grafo Int) where
arbitrary = sized generaGrafo
En el siguiente ejemplo se pueden observar algunos grafos generados
ghcigt sample (arbitrary Gen (Grafo Int))
G [] []
G [1] [(11)]
G [12] [(11)(12)]
G [1] [(11)]
G [12345678] [(14)(17)(22)(23)(25)(28)(35)
(36)(38)(44)(46)(47)(48)(56)(66)(67)(78)]
G [12345] [(11)(12)(14)(15)(24)(25)(34)(55)]
G [] []
G [] []
G [123] [(11)(22)(23)]
G [1234] [(11)(12)(14)(22)(33)]
G [1234567] [(11)(15)(16)(17)(22)(24)(25)
(26)(27)(33)(35)(46)(47)(55)(57)(66)(77)]
34 Ejemplos de grafos
El objetivo de esta seccioacuten es reunir una coleccioacuten de grafos lo suficientemente ex-tensa y variada como para poder utilizarla como recurso a la hora de comprobar laspropiedades y definiciones de funciones que implementaremos maacutes adelanteEn el proceso de recopilacioacuten de ejemplos se ha trabajado con diversas fuentesbull los apuntes de la asignatura ldquoMatemaacutetica discretardquo ([4])bull los temas de la asignatura ldquoInformaacuteticardquo ([1]) ybull el artiacuteculo ldquoGraph theoryrdquo ([11]) de la Wikipedia
Nota 341 Se utilizaraacute la representacioacuten de los grafos como listas de aristas
341 Grafo nulo
Definicioacuten 341 Un grafo nulo es un grafo que no tiene ni veacutertices ni aristas
La funcioacuten (grafoNulo) devuelve un grafo nulo
grafoNulo Ord a =gt Grafo a
grafoNulo = creaGrafo [] []
La funcioacuten (esGrafoNulo g) se verifica si g es un grafo nulo
56 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- | Ejemplos
-- gtgtgt esGrafoNulo grafoNulo
-- True
-- gtgtgt esGrafoNulo (creaGrafo [] [(12)])
-- False
-- gtgtgt esGrafoNulo (creaGrafo [12] [(12)])
-- False
esGrafoNulo Grafo a -gt Bool
esGrafoNulo g =
null (vertices g) ampamp null (aristas g)
342 Grafo ciclo
Definicioacuten 342 Un ciclo 3 de orden n C(n) es un grafo no dirigido y no ponderadocuyo conjunto de veacutertices viene dado por V = 1 n y el de las aristas por A = (0 1)(1 2) (nminus 2 nminus 1) (nminus 1 0)
La funcioacuten (grafoCiclo n) nos genera el ciclo de orden n
1
23
45
-- | Ejemplos
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
grafoCiclo Int -gt Grafo Int
grafoCiclo 0 = grafoNulo
grafoCiclo 1 = creaGrafo [1] []
grafoCiclo n = creaGrafo [1n]
([(uu+1) | u lt- [1n-1]] ++ [(n1)])
343 Grafo de la amistad
Definicioacuten 343 Un grafo de la amistad 4 de orden n es un grafo con 2n + 1 veacuterticesy 3n aristas formado uniendo n copias del ciclo C3 por un veacutertice comuacuten Lo denotamos porFn3httpseswikipediaorgwikiGrafo_completo4httpseswikipediaorgwikiGrafo_de_la_amistad
34 Ejemplos de grafos 57
La funcioacuten (grafoAmistad n) genera el grafo de la amistad de orden n Por ejemplo
1
2
34
5
1
2
3
4
5
6
7
-- | Ejemplos
-- gtgtgt pp $ grafoAmistad 2
-- G [12345]
-- [(1 2)(1 3)(1 4)(1 5)(2 3)(4 5)]
-- gtgtgt pp $ grafoAmistad 3
-- G [1234567]
-- [(1 2)(1 3)(1 4)(1 5)(1 6)(1 7)(2 3)
-- (4 5)(6 7)]
grafoAmistad Int -gt Grafo Int
grafoAmistad n =
creaGrafo [12n+1]
([(1a) | a lt- [22n+1]] ++
[(ab) | (ab) lt-zip [242n] [352n+1]])
344 Grafo completo
Definicioacuten 344 El grafo completo 5 de orden n K(n) es un grafo no dirigido cuyoconjunto de veacutertices viene dado por V = 1 n y tiene una arista entre cada par deveacutertices distintos
La funcioacuten (completo n) nos genera el grafo completo de orden n Por ejemplo
5httpseswikipediaorgwikiGrafo_completo
58 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
1
2
3
4
-- | Ejemplo
-- gtgtgt completo 4
-- G [1234] [(12)(13)(14)(23)(24)(34)]
completo Int -gt Grafo Int
completo n =
creaGrafo [1n]
[(ab) | a lt- [1n] b lt- [1a-1]]
345 Grafo bipartito
Definicioacuten 345 Un grafo bipartito 6 es un grafo G = (V A) verificando que elconjunto de sus veacutertices se puede dividir en dos subconjuntos disjuntos V1 V2 tales queV1 cupV2 = V de manera que forallu1 u2 isin V1[(u1 u2) 6isin A] y forallv1 v2 isin V2[(v1 v2) 6isin A]Un grafo bipartito completo 7 seraacute entonces un grafo bipartito G = (V1 cup V2 A) en elque todos los veacutertices de una particioacuten estaacuten conectados a los de la otra Si n = |V1| m =
|V2| denotamos al grafo bipartito G = (V1 cupV2 A) por Knm
La funcioacuten (bipartitoCompleto n m) nos genera el grafo bipartito Knm Por ejem-plo
1 2
3 4 5
-- | Ejemplo
-- gtgtgt bipartitoCompleto 2 3
-- G [12345] [(13)(14)(15)(23)(24)(25)]
bipartitoCompleto Int -gt Int -gt Grafo Int
bipartitoCompleto n m =
creaGrafo [1n+m]
[(ab) | a lt- [1n] b lt- [n+1n+m]]
6httpseswikipediaorgwikiGrafo_bipartito7httpseswikipediaorgwikiGrafo_bipartito_completo
34 Ejemplos de grafos 59
La funcioacuten (conjuntosVerticesDisjuntos g) devuelve Nothing si el grafo g no esbipartito y Just(xsys) si lo es donde xs ys es una particioacuten disjunta de los veacuterticesde g
-- | Ejemplo
-- gtgtgt conjuntosVerticesDisjuntos (bipartitoCompleto 3 4)
-- Just ([321][7654])
-- gtgtgt conjuntosVerticesDisjuntos (grafoCiclo 5)
-- Nothing
-- gtgtgt conjuntosVerticesDisjuntos (grafoCiclo 6)
-- Just ([531][642])
conjuntosVerticesDisjuntos Ord a =gt Grafo a -gt Maybe ([a][a])
conjuntosVerticesDisjuntos g
| null (vertices g) = Just ([][])
| otherwise = aux (vertices g) [] [] [] []
where u = union
a = adyacentes g
d xs x = xs [x]
aux [] _ _ r b = if (null (intersect r b))
then (Just (rb))
else Nothing
aux (vvs) [] [] [] [] = aux vs (a v) [v] [v] []
aux (vvs) [] c r b
| null (a v) = aux vs [] (vc) (vr) b
| null ((a v) c) =
if (or [elem u r | u lt- (a v)])
then (if (or [elem u b | u lt- (a v)])
then Nothing
else (aux vs [] (vc) r (vb)))
else (aux vs [] (vc) (vr) b)
| otherwise =
if (or [elem u r | u lt- (a v)])
then (if (or [elem u b | u lt- (a v)])
then Nothing
else (aux vs ((a v) c) (vc) r (vb)))
else (aux vs ((a v) c) (vc) (vr) b)
aux vs (qqs) c r b
| null ((a q) c) =
if (or [elem u r | u lt- (a q)])
then (if (or [elem u b | u lt- (a q)])
then Nothing
else (aux (d vs q) qs (qc) r (qb)))
else (aux (d vs q) qs (qc) (qr) b)
| otherwise =
if (or [elem u r | u lt- (a q)])
then (if (or [elem u b | u lt- (a q)])
then Nothing
else (aux (d vs q) (u ((a q) c) qs)
60 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
(qc) r (qb)))
else (aux (d vs q) (u ((a q) c) qs)
(qc) (qr) b)
La funcioacuten (esBipartito g) se verifica si el grafo g es bipartito
-- | Ejemplo
-- gtgtgt esBipartito (bipartitoCompleto 3 4)
-- True
-- gtgtgt esBipartito (grafoCiclo 5)
-- False
-- gtgtgt esBipartito (grafoCiclo 6)
-- True
esBipartito Ord a =gt Grafo a -gt Bool
esBipartito g = isJust (conjuntosVerticesDisjuntos g)
346 Grafo estrella
Definicioacuten 346 Una estrella 8 de orden n es el grafo bipartito completo K1n Denota-remos a una estrella de orden n por Sn Una estrella con 3 aristas se conoce en ingleacutes comoclaw (garra o garfio)
La funcioacuten (grafoEstrella n) crea un grafo circulante a partir de su orden n
2
34
56
1
-- | Ejemplo
-- gtgtgt grafoEstrella 5
-- G [123456] [(12)(13)(14)(15)(16)]
grafoEstrella Int -gt Grafo Int
grafoEstrella = bipartitoCompleto 1
347 Grafo rueda
Definicioacuten 347 Un grafo rueda 9 de orden n es un grafo no dirigido y no ponderado conn veacutertices que se forma conectando un uacutenico veacutertice a todos los veacutertices de un ciclo Cnminus1 Lodenotaremos por Wn8httpsenwikipediaorgwikiStar_(graph_theory))9httpseswikipediaorgwikiGrafo_rueda
34 Ejemplos de grafos 61
La funcioacuten (grafoRueda n) crea un grafo rueda a partir de su orden n
2
34
56
1
-- | Ejemplo
-- gtgtgt pp $ grafoRueda 6
-- G [123456]
-- [(1 2)(1 3)(1 4)(1 5)(1 6)(2 3)(2 6)
-- (3 4)(4 5)(5 6)]
grafoRueda Int -gt Grafo Int
grafoRueda n =
creaGrafo [1n]
([(1a) | a lt- [2n]] ++
[(ab) | (ab) lt- zip (2[2n-1]) (3n[4n])])
348 Grafo circulante
Definicioacuten 348 Un grafo circulante 10 de orden n ge 3 y saltos s1 sk es un grafono dirigido y no ponderado G = (1 n A) en el que cada nodo foralli isin V es adyacente alos 2k nodos iplusmn s1 iplusmn sk mod n Lo denotaremos por Cirs1sk
n
La funcioacuten (grafoCirculante n ss) crea un grafo circulante a partir de su orden n
y de la lista de sus saltos ss Por ejemplo
2
34
5
6 1
-- | Ejemplo
-- gtgtgt pp $ grafoCirculante 6 [12]
-- G [123456]
-- [(1 2)(1 3)(1 5)(1 6)(2 3)(2 4)(2 6)
-- (3 4)(3 5)(4 5)(4 6)(5 6)]
grafoCirculante Int -gt [Int] -gt Grafo Int
grafoCirculante n ss =
10httpsenwikipediaorgwikiCirculant_graph
62 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
creaGrafo [1n]
[(ab) | a lt- [1n]
b lt- sort (auxCir a ss n)
a lt b]
where auxCir v ss1 k =
concat [[fun (v+s) k fun (v-s) k] | s lt- ss1]
fun a b = if mod a b == 0 then b else mod a b
349 Grafo de Petersen generalizado
El grafo de Petersen generalizado 11 que denotaremos GPnk (con n ge 3 y 1 le k le(nminus 1)2) es un grafo formado por un grafo circulante Cirn
k en el interior rodeadopor un ciclo Cn al que estaacute conectado por una arista saliendo de cada veacutertice deforma que se creen n poliacutegonos regulares El grafo GPnk tiene 2n veacutertices y 3n aristasLa funcioacuten (grafoPetersenGen n k) devuelve el grafo de Petersen generalizadoGPnk
1
2
3
4
5
6
7
8
-- | Ejemplo
-- gtgtgt pp $ grafoPetersenGen 4 2
-- G [12345678]
-- [(1 3)(1 5)(2 4)(2 6)(3 7)(4 8)(5 6)
-- (5 8)(6 7)(7 8)]
grafoPetersenGen Int -gt Int -gt Grafo Int
grafoPetersenGen n k =
creaGrafo [12n]
(filter p (aristas (grafoCirculante n [k])) ++
[(xx+n) | x lt- [1n]] ++
(n+1n+2) (n+12n) [(xx+1) | x lt- [n+22n-1]])
where p (ab) = a lt b
11httpsenwikipediaorgwikiGeneralized_Petersen_graph
34 Ejemplos de grafos 63
3410 Otros grafos importantes
Grafo de Thomson
Definicioacuten 349 El grafo bipartito completo K33 es conocido como el grafo de Thomsony como veremos maacutes adelante seraacute clave a la hora de analizar propiedades topoloacutegicas de losgrafos
1 2 3
4 5 6
La funcioacuten (grafoThomson) genera el grafo de Thomson
-- | Ejemplo
-- gtgtgt pp $ grafoThomson
-- G [123456]
-- [(1 4)(1 5)(1 6)(2 4)(2 5)(2 6)(3 4)
-- (3 5)(3 6)]
grafoThomson Grafo Int
grafoThomson = bipartitoCompleto 3 3
Grafo de Heawood
El grafo de Heawood 12 es un grafo no dirigido regular con 14 veacutertices y 21 aris-tas Todos sus veacutertices son incidentes a exactamente 3 aristas es decir es un grafocuacutebico Tiene importantes propiedades geomeacutetricas y topoloacutegicas
1
2
3
45
6
7
8
9
10
11 12
13
14
12httpsenwikipediaorgwikiHeawood_graph
64 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten grafoHeawood genera el grafo de Heawood
-- | Ejemplo
-- gtgtgt pp $ grafoHeawood
-- G [1234567891011121314]
-- [(1 2)(1 6)(1 14)(2 3)(2 11)(3 4)(3 8)
-- (4 5)(4 13)(5 6)(5 10)(6 7)(7 8)(7 12)
-- (8 9)(9 10)(9 14)(10 11)(11 12)(12 13)
-- (13 14)]
grafoHeawood Grafo Int
grafoHeawood =
creaGrafo [114]
(aristas (grafoCiclo 14) ++
zip [1 23 4 5 7 9]
[611813101214])
Grafo de McGee
El grafo de McGee 13 es un grafo no dirigido cuacutebico con 24 veacutertices y 36 aristasTiene importantes propiedades geomeacutetricas y topoloacutegicas
1
2
3
45
6789
10
11
12
13
14
15
1617
18 19 2021
22
23
24
La funcioacuten grafoMcGee genera el grafo de McGee
-- | Ejemplo
-- gtgtgt pp $ grafoMcGee
-- G [12345678910111213141516171819
-- 2021222324]
-- [(1 2)(1 13)(1 24)(2 3)(2 9)(3 4)(3 20)
13httpsenwikipediaorgwikiMcGee_graph
34 Ejemplos de grafos 65
-- (4 5)(4 16)(5 6)(5 12)(6 7)(6 23)(7 8)
-- (7 19)(8 9)(8 15)(9 10)(10 11)(10 22)
-- (11 12)(11 18)(12 13)(13 14)(14 15)
-- (14 21)(15 16)(16 17)(17 18)(17 24)
-- (18 19)(19 20)(20 21)(21 22)(22 23)
-- (23 24)]
grafoMcGee Grafo Int
grafoMcGee =
creaGrafo [124]
(aristas (grafoCiclo 24) ++
zip [ 12 3 4 5 6 7 810111417]
[13920161223191522182124])
Grafo TuttendashCoxeter
El grafo TuttendashCoxeter 14 es un grafo no dirigido cuacutebico con 30 veacutertices y 45 aristasTiene importantes propiedades geomeacutetricas y topoloacutegicas
1
2
3
4
56
7891011
12
13
14
15
16
17
18
19
2021
22 23 24 2526
27
28
29
30
La funcioacuten grafoTutteCoxeter genera el grafo TuttendashCoxeter
-- | Ejemplo
-- gtgtgt pp $ grafoTutteCoxeter
-- G [12345678910111213141516171819
-- 2021222324252627282930]
14httpsenwikipediaorgwikiTutteT1textendashCoxeter_graph
66 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- [(1 2)(1 18)(1 30)(2 3)(2 23)(3 4)
-- (3 10)(4 5)(4 27)(5 6)(5 14)(6 7)(6 19)
-- (7 8)(7 24)(8 9)(8 29)(9 10)(9 16)
-- (10 11)(11 12)(11 20)(12 13)(12 25)
-- (13 14)(13 30)(14 15)(15 16)(15 22)
-- (16 17)(17 18)(17 26)(18 19)(19 20)
-- (20 21)(21 22)(21 28)(22 23)(23 24)
-- (24 25)(25 26)(26 27)(27 28)(28 29)
-- (29 30)]
grafoTutteCoxeter Grafo Int
grafoTutteCoxeter =
creaGrafo [130]
(aristas (grafoCiclo 30) ++
zip [ 1 2 3 4 5 6 7 8 9111213151721]
[182310271419242916202530222628])
Grafo de Petersen
El grafo de Petersen 15 se define como el grafo de Petersen generalizado GP52 esdecir es un grafo cuacutebico formado por los veacutertices de un pentaacutegono conectados alos veacutertices de una estrella de cinco puntas en la que cada nodo es adyacente a losnodos que estaacuten a un salto 2 de eacutel Es usado como ejemplo y como contraejemplo enmuchos problemas de la Teoriacutea de grafos
6
7
8 9
101
2
3 4
5
La funcioacuten grafoPetersen devuelve el grafo de Petersen
-- | Ejemplo
-- gtgtgt pp $ grafoPetersen
-- G [12345678910]
-- [(1 3)(1 4)(1 6)(2 4)(2 5)(2 7)(3 5)
-- (3 8)(4 9)(5 10)(6 7)(6 10)(7 8)(8 9)
-- (9 10)]
grafoPetersen Grafo Int
grafoPetersen = grafoPetersenGen 5 2
15httpsenwikipediaorgwikiPetersen_graph
35 Definiciones y propiedades 67
Grafo de MoeumlbiusndashCantor
El grafo de MoeumlbiusndashCantor 16 se define como el grafo de Petersen generalizadoGP83 es decir es un grafo cuacutebico formado por los veacutertices de un octoacutegono conecta-dos a los veacutertices de una estrella de ocho puntas en la que cada nodo es adyacente alos nodos que estaacuten a un salto 3 de eacutel Al igual que el grafo de Petersen tiene impor-tantes propiedades que lo hacen ser ejemplo y contraejemplo de muchos problemasde la Teoriacutea de Grafos
9
10
11
12
13
14
15
16
1
23
4
5
67
8
La funcioacuten grafoMoebiusCantor genera el grafo de MoeumlbiusndashCantor
-- | Ejemplo
-- gtgtgt pp $ grafoMoebiusCantor
-- G [12345678910111213141516]
-- [(1 4)(1 6)(1 9)(2 5)(2 7)(2 10)(3 6)
-- (3 8)(3 11)(4 7)(4 12)(5 8)(5 13)(6 14)
-- (7 15)(8 16)(9 10)(9 16)(10 11)(11 12)
-- (12 13)(13 14)(14 15)(15 16)]
grafoMoebiusCantor Grafo Int
grafoMoebiusCantor = grafoPetersenGen 8 3
35 Definiciones y propiedades
Una vez construida una pequentildea fuente de ejemplos estamos en condiciones deimplementar las definiciones sobre grafos en Haskell y ver que funcionan correc-tamente Ademaacutes comprobaremos que se cumplen las propiedades baacutesicas que sehan presentado en el tema Introduccioacuten a la teoriacutea de grafos de ldquoMatemaacutetica discretardquo([4])
16httpsenwikipediaorgwikiMoeumlbius-Kantor_graph
68 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Nota 351 Se utilizaraacute el tipo abstracto de grafos presentados en la seccioacuten 32 y seutilizaraacuten las librerias DataList y TestQuickCheck
351 Definiciones de grafos
Definicioacuten 351 El orden de un grafo G = (V A) se define como su nuacutemero de veacuterticesLo denotaremos por |V(G)|
La funcioacuten (orden g) devuelve el orden del grafo g
-- | Ejemplos
-- gtgtgt orden (grafoCiclo 4)
-- 4
-- gtgtgt orden (grafoEstrella 4)
-- 5
orden Grafo a -gt Int
orden = length vertices
Definicioacuten 352 El tamantildeo de un grafo G = (V A) se define como su nuacutemero de aristasLo denotaremos por |A(G)|
La funcioacuten (tamantildeo g) devuelve el orden del grafo g
-- | Ejemplos
-- gtgtgt tamantildeo (grafoCiclo 4)
-- 4
-- gtgtgt tamantildeo grafoPetersen
-- 15
tamantildeo Grafo a -gt Int
tamantildeo = length aristas
Definicioacuten 353 Diremos que dos aristas a aprime son incidentes si tienen interseccioacuten novaciacutea es decir si tienen alguacuten veacutertice en comuacuten
La funcioacuten (sonIncidentes a a) se verifica si las aristas a y a son incidentes
-- | Ejemplos
-- gtgtgt sonIncidentes (12) (24)
-- True
-- gtgtgt sonIncidentes (12) (34)
-- False
sonIncidentes Eq a =gt (aa) -gt (aa) -gt Bool
sonIncidentes (u1u2) (v1v2) =
or [u1 == v1 u1 == v2 u2 == v1 u2 == v2]
Definicioacuten 354 Diremos que una arista de un grafo G es un lazo si va de un veacutertice ensiacute mismo
35 Definiciones y propiedades 69
La funcioacuten (lazos g) devuelve los lazos del grafo g
-- | Ejemplos
-- gtgtgt lazos (creaGrafo [12] [(11)(12)(22)])
-- [(11)(22)]
-- gtgtgt lazos (grafoCiclo 5)
-- []
lazos Eq a =gt Grafo a -gt [(aa)]
lazos g = [(uv) | (uv) lt- aristas g u == v]
La funcioacuten (esLazo a) se verifica si la arista a es un lazo
-- | Ejemplos
-- gtgtgt esLazo (44)
-- True
-- gtgtgt esLazo (12)
-- False
esLazo Eq a =gt (aa) -gt Bool
esLazo (uv) = u == v
Definicioacuten 355 Dado un grafo G = (V A) fijado un veacutertice v isin V al conjunto deveacutertices que son adyacentes a v lo llamaremos entorno de v y lo denotaremos por N(v) =u isin V|(u v) isin A
La funcioacuten (entorno g v) devuelve el entorno del veacutertice v en el grafo g
-- | Ejemplo
-- gtgtgt entorno (creaGrafo [15] [(12)(13)(23)]) 2
-- [13]
entorno Eq a =gt Grafo a -gt a -gt [a]
entorno = adyacentes
Definicioacuten 356 Sea G = (V A) un grafo El grado (o valencia) de v isin V es grad(v) =|N(v)|
La funcioacuten (grado g v) devuelve el grado del veacutertice v en el grafo g
-- | Ejemplos
-- gtgtgt grado (creaGrafo [15] [(12)(13)(23)]) 2
-- 2
-- gtgtgt grado (grafoEstrella 5) 1
-- 5
grado Eq a =gt Grafo a -gt a -gt Int
grado g v = length (entorno g v)
Definicioacuten 357 Un veacutertice v de un grafo es aislado si su grado es 0
La funcioacuten (esAislado g v) se verifica si el veacutertice v es aislado en el grafo g
70 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- | Ejemplos
-- gtgtgt esAislado (creaGrafo [15] [(12)(13)(23)]) 4
-- True
-- gtgtgt esAislado (creaGrafo [15] [(12)(13)(23)]) 3
-- False
esAislado Eq a =gt Grafo a -gt a -gt Bool
esAislado g v = grado g v == 0
Definicioacuten 358 Un grafo es regular si todos sus veacutertices tienen el mismo grado
La funcioacuten (esRegular g) se verifica si el grafo g es regular
-- | Ejemplos
-- gtgtgt esRegular (creaGrafo [13] [(12)(13)(23)])
-- True
-- gtgtgt esRegular (creaGrafo [14] [(12)(13)(24)])
-- False
esRegular Eq a =gt Grafo a -gt Bool
esRegular g = all (==x) xs
where (xxs) = [grado g v | v lt- vertices g]
Definicioacuten 359 Dado un grafo G = (V A) llamamos valencia miacutenima o grado miacuteni-mo de G al valor δ(G) = mıngrad(v)|v isin V
La funcioacuten (valenciaMin g) devuelve la valencia miacutenima del grafo g
-- | Ejemplo
-- gtgtgt valenciaMin (creaGrafo [14] [(12)(13)(24)])
-- 1
valenciaMin Ord a =gt Grafo a -gt Int
valenciaMin g = minimum [grado g v | v lt- vertices g]
Definicioacuten 3510 Dado un grafo G = (V A) llamamos valencia maacutexima o gradomaacuteximo de G al valor δ(G) = maxgrad(v)|v isin V
La funcioacuten (valenciaMax g) devuelve la valencia maacutexima del grafo g
-- | Ejemplo
-- gtgtgt valenciaMax (creaGrafo [14] [(12)(13)(24)])
-- 2
valenciaMax Ord a =gt Grafo a -gt Int
valenciaMax g = maximum [grado g v | v lt- vertices g]
Definicioacuten 3511 Se dice que un grafo es simple si no contiene lazos ni aristas repetidas
La funcioacuten (esSimple g) se verifica si g es un grafo simple
35 Definiciones y propiedades 71
-- | Ejemplos
-- gtgtgt esSimple (creaGrafo [13] [(12)(13)(23)])
-- True
-- gtgtgt esSimple (creaGrafo [13] [(11)(12)(23)])
-- False
esSimple Ord a =gt Grafo a -gt Bool
esSimple g =
and [not ((xx) `aristaEn` g) | x lt- vertices g]
Definicioacuten 3512 Sea G un grafo Llamamos secuencia de grados de G a la lista degrados de sus veacutertices La secuencia se suele presentar en orden decreciente d1 ge d2 gemiddot middot middot ge dn
La funcioacuten (secuenciaGrados g) devuelve la secuencia de los grados del grafo g enorden decreciente
-- | Ejemplo
-- gtgtgt secuenciaGrados (creaGrafo [15] [(12)(13)(14)(24)])
-- [32210]
secuenciaGrados Eq a =gt Grafo a -gt [Int]
secuenciaGrados g = sortBy (flip compare) [grado g v | v lt- vertices g]
Nota 352 iquestQueacute listas de n nuacutemeros enteros son secuencias de grafos de n veacuterticesbull Si sumn
i=1 di es impar no hay ningunobull Si sumn
i=1 di es par entonces siempre hay un grafo con esa secuencia de grados (aun-que no necesariamente simple)
Definicioacuten 3513 Una secuencia graacutefica es una lista de nuacutemero enteros no negativos quees la secuencia de grados para alguacuten grafo simple
La funcioacuten (secuenciaGrafica ss) se verifica si existe alguacuten grafo con la secuenciade grados ss
-- | Ejemplos
-- gtgtgt secuenciaGrafica [32210]
-- True
-- gtgtgt secuenciaGrafica [3222]
-- False
secuenciaGrafica [Int] -gt Bool
secuenciaGrafica ss = even (sum ss) ampamp all p ss
where p s = s gt= 0 ampamp s lt= length ss
Definicioacuten 3514 Dado un grafo G = (V A) diremos que Gprime = (Vprime Aprime) es un subgrafode G si Vprime sube V y Aprime sube A
72 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (esSubgrafo g g) se verifica si g es un subgrafo de g
-- |Ejemplos
-- gtgtgt esSubgrafo (bipartitoCompleto 3 2) (bipartitoCompleto 3 3)
-- True
-- gtgtgt esSubgrafo (grafoEstrella 4) (grafoEstrella 5)
-- True
-- gtgtgt esSubgrafo (completo 5) (completo 4)
-- False
-- gtgtgt esSubgrafo (completo 3) (completo 4)
-- True
esSubgrafo Ord a =gt Grafo a -gt Grafo a -gt Bool
esSubgrafo g g =
vertices g `esSubconjunto` vertices g ampamp
aristas g `esSubconjunto` aristas g
Definicioacuten 3515 Si Gprime = (Vprime Aprime) es un subgrafo de G = (V A) tal que Vprime = Vdiremos que Gprime es un subgrafo maximal grafo recubridor o grafo de expansioacuten (eningleacutes spanning grah) de G
La funcioacuten (esSubgrafoMax g g) se verifica si g es un subgrafo maximal de g
-- | Ejemplos
-- gtgtgt esSubgrafoMax (grafoRueda 3) (grafoRueda 4)
-- False
-- gtgtgt esSubgrafoMax (grafoCiclo 4) (grafoRueda 4)
-- True
-- gtgtgt esSubgrafoMax (creaGrafo [13] [(12)]) (grafoCiclo 3)
-- True
-- gtgtgt esSubgrafoMax (creaGrafo [12] [(12)]) (grafoCiclo 3)
-- False
esSubgrafoMax Ord a =gt Grafo a -gt Grafo a -gt Bool
esSubgrafoMax g g =
g `esSubgrafo` g ampamp conjuntosIguales (vertices g) (vertices g)
Definicioacuten 3516 Sean Gprime = (Vprime Aprime) G = (V A) dos grafos si Vprime sub V o Aprime sub A sedice que Gprime es un subgrafo propio de G y se denota por Gprime sub G
La funcioacuten (esSubgrafoPropio g g) se verifica si g es un subgrafo propio de g
-- | Ejemplos
-- gtgtgt esSubgrafoPropio (grafoRueda 3) (grafoRueda 4)
-- True
-- gtgtgt esSubgrafoPropio (grafoRueda 4) (grafoCiclo 5)
-- False
-- gtgtgt esSubgrafoPropio (creaGrafo [13] [(12)]) (grafoCiclo 3)
-- True
-- gtgtgt esSubgrafoPropio (creaGrafo [12] [(12)]) (grafoCiclo 3)
35 Definiciones y propiedades 73
-- True
esSubgrafoPropio Ord a =gt Grafo a -gt Grafo a -gt Bool
esSubgrafoPropio g g =
esSubgrafo g g ampamp
(not (conjuntosIguales (vertices g) (vertices g)) ||
not (conjuntosIguales (aristas g) (aristas g)))
352 Propiedades de grafos
Teorema 3517 (Lema del apretoacuten de manos) En todo grafo simple el nuacutemero de veacuterticesde grado impar es par o cero
Vamos a comprobar que se verifica el lema del apretoacuten de manos utilizando la fun-cioacuten prop_LemaApretonDeManos
ghcigt quickCheck prop_LemaApretonDeManos
+++ OK passed 100 tests
prop_LemaApretonDeManos Grafo Int -gt Bool
prop_LemaApretonDeManos g =
even (length (filter odd [grado g v | v lt- vertices g]))
where g = creaGrafo (vertices g)
[(xy) | (xy) lt- aristas g x = y]
Teorema 3518 (HavelndashHakimi) Si n gt 1 y D = [d1 dn] es una lista de enterosentonces D es secuencia graacutefica si y soacutelo si la secuencia Dprime obtenida borrando el mayorelemento dmax y restando 1 a los siguientes dmax elementos maacutes grandes es graacutefica
Vamos a comprobar que se verifica el teorema de HavelndashHakimi utilizando la fun-cioacuten prop_HavelHakimi
ghcigt quickCheck prop_HavelHakimi
+++ OK passed 100 tests
prop_HavelHakimi [Int] -gt Bool
prop_HavelHakimi [] = True
prop_HavelHakimi (sss) =
not (secuenciaGrafica (sss) ampamp not (esVacio ss)) ||
secuenciaGrafica (map (x -gt x-1) (take s ss) ++ drop s ss)
353 Operaciones y propiedades sobre grafos
Eliminacioacuten de una arista
Definicioacuten 3519 Sea G = (V A) un grafo y sea (u v) isin A Definimos el grafo G (u v) como el subgrafo de G Gprime = (Vprime Aprime) con Vprime = V y Aprime = A (u v) Esta
74 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
operacioacuten se denomina eliminar una arista
La funcioacuten (eliminaArista g a) elimina la arista a del grafo g
-- | Ejemplos
-- gtgtgt eliminaArista (creaGrafo [14] [(12)(14)(24)]) (14)
-- G [1234] [(12)(24)]
-- gtgtgt eliminaArista (creaGrafo [14] [(12)(14)(24)]) (41)
-- G [1234] [(12)(24)]
-- gtgtgt eliminaArista (creaGrafo [14] [(12)(14)(24)]) (43)
-- G [1234] [(12)(14)(24)]
eliminaArista Ord a =gt Grafo a -gt (aa) -gt Grafo a
eliminaArista g (ab) =
creaGrafo (vertices g)
(aristas g [(ab)(ba)])
La funcioacuten (eliminaLazos g) devuelve un nuevo grafo obtenido a partir del grafog eliminando todas las aristas que fueran lazos
-- | Ejemplos
-- gtgtgt eliminaLazos (creaGrafo [12] [(11)(12)(22)])
-- G [12] [(12)]
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
-- gtgtgt eliminaLazos (grafoCiclo 5)
-- G [12345] [(12)(15)(23)(34)(45)]
eliminaLazos Ord a =gt Grafo a -gt Grafo a
eliminaLazos g = creaGrafo (vertices g)
[(xy) | (xy) lt- aristas g x = y]
Eliminacioacuten un veacutertice
Definicioacuten 3520 Sea G = (V A) un grafo y sea v isin V Definimos el grafo G v como elsubgrafo de G Gprime = (Vprime Aprime) con Vprime = V v y Aprime = A a isin A|v es un extremo de aEsta operacioacuten se denomina eliminar un veacutertice
La funcioacuten (eliminaVertice g v) elimina el veacutertice v del grafo g
-- | Ejemplos
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(24)]) 1
-- G [234] [(24)]
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(24)]) 4
-- G [123] [(12)]
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(24)]) 3
-- G [124] [(12)(14)(24)]
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(13)]) 1
-- G [234] []
eliminaVertice Ord a =gt Grafo a -gt a -gt Grafo a
35 Definiciones y propiedades 75
eliminaVertice g v =
creaGrafo (vertices g [v])
(as [(ab) | (ab) lt- as a == v || b == v])
where as = aristas g
Suma de aristas
Definicioacuten 3521 Sea G = (V A) un grafo y sean u v isin V tales que (u v) (v u) 6isin ADefinimos el grafo G + (u v) como el grafo Gprime = (V A cup (u v)) Esta operacioacuten sedenomina suma de una arista
La funcioacuten (sumaArista g a) suma la arista a al grafo g
-- | Ejemplos
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
-- gtgtgt sumaArista (grafoCiclo 5) (13)
-- G [12345] [(12)(13)(15)(23)(34)(45)]
sumaArista Ord a =gt Grafo a -gt (aa) -gt Grafo a
sumaArista g a =
creaGrafo (vertices g) (a aristas g)
Suma de veacutertices
Definicioacuten 3522 Sea G = (V A) un grafo y sea v 6isin V Definimos el grafo G + v comoel grafo Gprime = (Vprime Aprime) donde Vprime = V cup v Aprime = Acup (u v)|u isin V Esta operacioacuten sedenomina suma de un veacutertice
La funcioacuten (sumaVertice g a) suma el veacutertice a al grafo g
-- | Ejemplo
-- gtgtgt grafoCiclo 3
-- G [123] [(12)(13)(23)]
-- gtgtgt sumaVertice (grafoCiclo 3) 4
-- G [1234] [(12)(13)(14)(23)(24)(34)]
sumaVertice Ord a =gt Grafo a -gt a -gt Grafo a
sumaVertice g v =
creaGrafo (v vs) (aristas g ++ [(uv) | u lt- vs])
where vs = vertices g
Propiedad de los grafos completos
Proposicioacuten 3523 La familia de grafos completos Kn verifica que Kn = Knminus1 + n
Vamos a ver que se cumple la propiedad utilizando la funcioacuten prop_completos
76 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
ghcigt quickCheck prop_completos
+++ OK passed 100 tests
prop_completos Int -gt Property
prop_completos n = n gt= 2 ==gt
completo n == sumaVertice (completo (n-1)) n
A partir de esta propiedad se puede dar una definicioacuten alternativa de la funcioacuten(completo n) que devuelve el grafo completo Kn La nueva funcioacuten seraacute (completo2n)
completo2 Int -gt Grafo Int
completo2 0 = grafoNulo
completo2 n = sumaVertice (completo2 (n-1)) n
Vamos a comprobar la equivalencia de ambas deficiones
ghcigt prop_EquiCompleto
True
prop_EquiCompleto Bool
prop_EquiCompleto = and [completo n == completo2 n | n lt- [050]]
Vamos a ver cuaacutel de las definiciones es maacutes eficiente
ghcigt tamantildeo (completo 100)
4950
(117 secs 0 bytes)
ghcigt tamantildeo (completo2 100)
4950
(1549 secs 61756056 bytes)
La funcioacuten (completo n) es maacutes eficiente asiacute que seraacute la que seguiremos utilizando
Suma de grafos
Definicioacuten 3524 Sean G = (V A) Gprime = (Vprime A) dos grafos Definimos el grafo sumade G y Gprime como el grafo G + Gprime = (V cup Vprime A cup Aprime cup (u v)|u isin V v isin Vprime) Estaoperacioacuten se denomina suma de grafos
La funcioacuten (sumaGrafos g g) suma los grafos g y g
-- | Ejemplo
-- gtgtgt let g1 = creaGrafo [13] [(11)(13)(23)]
-- gtgtgt let g2 = creaGrafo [46] [(46)(56)]
-- gtgtgt pp $ sumaGrafos g1 g2
-- G [123456]
-- [(1 1)(1 3)(1 4)(1 5)(1 6)(2 3)(2 4)
-- (2 5)(2 6)(3 4)(3 5)(3 6)(4 6)(5 6)]
sumaGrafos Ord a =gt Grafo a -gt Grafo a -gt Grafo a
35 Definiciones y propiedades 77
sumaGrafos g1 g2 =
creaGrafo (vs1 `union` vs2)
(aristas g1 `union`
aristas g2 `union`
[(uv) | u lt- vs1 v lt- vs2])
where vs1 = vertices g1
vs2 = vertices g2
Unioacuten de grafos
Definicioacuten 3525 Sean G = (V A) Gprime = (Vprime A) dos grafos Definimos el grafo unioacutende G y Gprime como el grafo G cup H = (V cupVprime A cup Aprime) Esta operacioacuten se denomina unioacuten degrafos
La funcioacuten (unionGrafos g g) une los grafos g y g Por ejemplo
-- | Ejemplo
-- gtgtgt let g1 = creaGrafo [13] [(11)(13)(23)]
-- gtgtgt let g2 = creaGrafo [46] [(46)(56)]
-- gtgtgt unionGrafos g1 g2
-- G [123456] [(11)(13)(23)(46)(56)]
unionGrafos Ord a =gt Grafo a -gt Grafo a -gt Grafo a
unionGrafos g1 g2 =
creaGrafo (vertices g1 `union` vertices g2)
(aristas g1 `union` aristas g2)
Grafo complementario
Definicioacuten 3526 Dado un grafo G = (V A) se define el grafo complementario de Gcomo G = (V A) donde A = (u v)|u v isin V (u v) 6isin A
La funcioacuten (grafoComplementario g) devuelve el grafo complementario de g
-- | Ejemplo
-- gtgtgt grafoComplementario (creaGrafo [13] [(11)(13)(23)])
-- G [123] [(12)(22)(33)]
grafoComplementario Ord a =gt Grafo a -gt Grafo a
grafoComplementario g =
creaGrafo vs
[(uv)| u lt- vs v lt- vs u lt= v not ((uv) `aristaEn` g)]
where vs = vertices g
Definicioacuten 3527 Dado un grafo diremos que es completo si su complementario sin lazosno tiene aristas
La funcioacuten (esCompleto g) se verifica si el grafo g es completo
78 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- Ejemplos
-- gtgtgt esCompleto (completo 4)
-- True
-- gtgtgt esCompleto (grafoCiclo 5)
-- False
esCompleto Ord a =gt Grafo a -gt Bool
esCompleto g =
tamantildeo (eliminaLazos (grafoComplementario g)) == 0
36 Morfismos de grafos
Llegados a este punto es importante resaltar que un grafo se define como una en-tidad matemaacutetica abstracta es evidente que lo importante de un grafo no son losnombres de sus veacutertices ni su representacioacuten graacutefica La propiedad que caracterizaa un grafo es la forma en que sus veacutertices estaacuten unidos por las aristasA priori los siguientes grafos pueden parecer distintos
a
bc
de
1
23
45
Sin embargo ambos grafos son grafos de cinco veacutertices que tienen las mismas rela-ciones de vecindad entre sus nodos En esta seccioacuten estudiaremos estas relacionesque establecen las aristas entre los veacutertices de un grafo y presentaremos algoritmosque nos permitan identificar cuaacutendo dos grafos se pueden relacionar mediante apli-caciones entre sus veacutertices cumpliendo ciertas caracteriacutesicas
361 Morfismos
Definicioacuten 361 Si f es una funcioacuten entre dos grafos G = (V A) y Gprime = (Vprime Aprime)diremos que conserva la adyacencia si forallu v isin V se verifica que si (u v) isin A entonces( f (u) f (v)) isin Aprime
La funcioacuten (conservaAdyacencia g h f) se verifica si la funcioacuten f entre los grafosg y h conserva las adyacencias
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [14] [(12)(23)(34)]
-- gtgtgt let g2 = creaGrafo [14] [(12)(23)(24)]
-- gtgtgt let g3 = creaGrafo [4610] [(48)(68)(810)]
36 Morfismos de grafos 79
-- gtgtgt conservaAdyacencia g1 g3 [(14)(26)(38)(410)]
-- False
-- gtgtgt conservaAdyacencia g2 g3 [(14)(28)(36)(410)]
-- True
conservaAdyacencia (Ord a Ord b) =gt
Grafo a -gt Grafo b -gt Funcion a b -gt Bool
conservaAdyacencia g h f =
and [(imagen f ximagen f y) `aristaEn` h | (xy) lt- aristas g]
Definicioacuten 362 Dados dos grafos simples G = (V A) y Gprime = (Vprime Aprime) un morfismoentre G y Gprime es una funcioacuten φ V rarr Vprime que conserva las adyacencias
La funcioacuten (esMorfismo g h vvs) se verifica si la funcioacuten representada por vvs esun morfismo entre los grafos g y h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(12)(32)]
-- gtgtgt let g2 = creaGrafo [456] [(46)(56)]
-- gtgtgt esMorfismo g1 g2 [(14)(26)(35)]
-- True
-- gtgtgt esMorfismo g1 g2 [(14)(25)(36)]
-- False
-- gtgtgt esMorfismo g1 g2 [(14)(26)(35)(79)]
-- False
esMorfismo (Ord aOrd b) =gt Grafo a -gt Grafo b -gt
Funcion a b -gt Bool
esMorfismo g1 g2 f =
esFuncion (vertices g1) (vertices g2) f ampamp
conservaAdyacencia g1 g2 f
La funcioacuten (morfismos g h) devuelve todos los posibles morfismos entre los grafosg y h
-- | Ejemplos
-- gtgtgt grafoCiclo 3
-- G [123] [(12)(13)(23)]
-- gtgtgt let g = creaGrafo [46] [(44)(66)]
-- gtgtgt morfismos (grafoCiclo 3) g
-- [[(14)(24)(34)][(16)(26)(36)]]
-- gtgtgt morfismos g (grafoCiclo 3)
-- []
morfismos (Ord a Ord b) =gt Grafo a -gt Grafo b -gt [[(ab)]]
morfismos g h =
[f | f lt- funciones (vertices g) (vertices h)
conservaAdyacencia g h f]
80 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
362 Complejidad del problema de homomorfismo de grafos
En general en computacioacuten un problema algoriacutetmico consta de un conjunto I detodas las posibles entradas para el problema llamado el conjunto de instancias y deuna pregunta Q sobre esas instancias Resolver uno de estos problemas consiste endesarrollar un algoritmo cuya entrada es una instancia del problema y cuya salidaes una respuesta a la pregunta del problemaDecimos que un problema es de decisioacuten cuando las posibles respuestas a la pre-gunta son ldquosiacuterdquo o ldquonordquo Un ejemplo de problema de este tipo seriacutea dados dos grafosdecidir si estos son homomorfos o noA la hora de implementar un algoritmo que deacute solucioacuten al problema que estemosconsiderando es importante tener en cuenta el nuacutemero de pasos que efectuacutea hastaencontrar una respuesta Un algoritmo de tiempo polinomial se define como aquelcon funcioacuten de complejidad temporal en O(p(n)) para alguna funcioacuten polinoacutemicap donde n denota el tamantildeo de la entrada Cualquier algoritmo cuya funcioacuten decomplejidad temporal no pueda ser acotada de esta manera se denomina algoritmode tiempo exponencialLa mayoriacutea de los algoritmos de tiempo exponencial son simples variaciones de unabuacutesqueda exhaustiva mientras que los algoritmos de tiempo polinomial usualmen-te se obtienen mediante un anaacutelisis maacutes profundo de la estructura del problema Enla Teoriacutea de la complejidad computacional existe el consenso de que un problemano estaacute ldquobien resueltordquo hasta que se conozca un algoritmo de tiempo polinomialque lo resuelva Por tanto nos referiremos a un problema como ldquointratablerdquo si estan difiacutecil que no existe algoritmo de tiempo polinomial capaz de resolverloLos problemas de decisioacuten para los que existen algoritmos polinomiales consti-tuyen la clase P y son llamados polinomiales Un problema de decisioacuten es no-determiniacutestico polinomial cuando cualquier instancia que produce respuesta ldquosiacuterdquoposee una comprobacioacuten de correctitud (tambieacuten llamada certificado) verificable entiempo polinomia en el tamantildeo de la instancia Estos problemas de decisioacuten se di-ce que pertenecen a la clase NP Claramente P sube NP Sin embargo no se sabe siesta inclusioacuten es estricta uno de los principales problemas abiertos en Teoriacutea de lacomputacioacuten es saber si P 6= NPUna reduccioacuten es una transformacioacuten de un problema en otro problema Intuitiva-mente un problema Q puede ser reducido a otro problema Qprime si cualquier instanciadel problema Q puede ser ldquofaacutecilmenterdquo expresada como una instancia del problemaQprime y cuya solucioacuten proporcione una solucioacuten para la instancia de QLas reducciones en tiempo polinomial nos dotan de elementos para probar de unamanera formal que un problema es al menos tan difiacutecil que otro con una dife-rencia de un factor polinomial Estas son esenciales para definir a los problemas
36 Morfismos de grafos 81
NP-completos ademaacutes de ayudar a comprender los mismosLa clase de los problemas NP-completos contiene a los problemas maacutes difiacuteciles enNP en el sentido de que son los que esteacuten maacutes lejos de estar en P Debido a que elproblema P = NP no ha sido resuelto el hecho de reducir un problema B a otroproblema A indicariacutea que no se conoce solucioacuten en tiempo polinomial para A Estoes debido a que una solucioacuten en tiempo polinomial para A tendriacutea como conse-cuencia la existencia de una solucioacuten polinomial para B De manera similar debidoa que todos los problemas NP pueden ser reducidos a este conjunto encontrar unproblema NP-completo que pueda ser resuelto en un tiempo polinomial significariacuteaque P = NPEl problema de decidir si dos grafos son homomorfos es un problema de decisioacutenNP-completo La NP-completitud del problema se demuestra mediante la reduccioacutende este problema al problema de la clique 17En el proceso de recopilacioacuten de imformacioacuten acerca de la Teoriacutea de la complejidadse ha trabajado con dos fuentesbull la tesis de licenciatura de Pablo Burzyn ldquoComplejidad computacional en proble-
mas de modificacioacuten de aristas en grafosrdquo ([2]) ybull el artiacuteculo ldquoTeoriacutea de la complejidad computacionalrdquo ([12]) de la Wikipedia
363 Isomorfismos
Definicioacuten 363 Dados dos grafos simples G = (V A) y Gprime = (Vprime Aprime) un isomorfis-mo entre G y Gprime es un morfismo biyectivo cuyo inverso es morfismo entre Gprime y G
La funcioacuten (esIsomorfismo g h f) se verifica si la aplicacioacuten f es un isomorfismoentre los grafos g y h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt esIsomorfismo g1 g2 [(12)(24)(36)]
-- True
-- gtgtgt esIsomorfismo g1 g2 [(12)(22)(36)]
-- False
esIsomorfismo (Ord aOrd b) =gt
Grafo a -gt Grafo b -gt Funcion a b -gt Bool
esIsomorfismo g h f =
esBiyectiva vs1 vs2 f ampamp
esMorfismo g h f ampamp
esMorfismo h g (inversa f)
where vs1 = vertices g
vs2 = vertices h
17httpseswikipediaorgwikiProblema_de_la_clique
82 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (isomorfismos1 g h) devuelve todos los isomorfismos posibles entrelos grafos g y h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfismos1 g1 g2
-- [[(12)(24)(36)]]
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfismos1 g3 g4
-- []
-- gtgtgt let g5 = creaGrafo [123] [(11)(22)(33)]
-- gtgtgt let g6 = creaGrafo [246] [(22)(44)(66)]
-- gtgtgt pp $ isomorfismos1 g5 g6
-- [[(1 2)(2 4)(3 6)][(1 4)(2 2)(3 6)]
-- [(1 6)(2 4)(3 2)][(1 4)(2 6)(3 2)]
-- [(1 6)(2 2)(3 4)][(1 2)(2 6)(3 4)]]
isomorfismos1 (Ord aOrd b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos1 g h =
[f | f lt- biyecciones vs1 vs2
conservaAdyacencia g h f
conservaAdyacencia h g (inversa f)]
where vs1 = vertices g
vs2 = vertices h
Definicioacuten 364 Dos grafos G y H se dicen isomorfos si existe alguacuten isomorfismo entreellos
La funcioacuten isomorfos1 g h se verifica si los grafos g y h son isomorfos
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfos1 g1 g2
-- True
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfos1 g3 g4
-- False
isomorfos1 (Ord aOrd b) =gt Grafo a -gt Grafo b -gt Bool
isomorfos1 g = not null isomorfismos1 g
Nota 361 Al tener Haskell una evaluacioacuten perezosa la funcioacuten (isomorfos g h)
no necesita generar todos los isomorfismos entre los grafos g y h
Definicioacuten 365 Sea G = (V A) un grafo Un invariante por isomorfismos de G esuna propiedad de G que tiene el mismo valor para todos los grafos que son isomorfos a eacutel
36 Morfismos de grafos 83
esInvariantePorIsomorfismos
Eq a =gt (Grafo Int -gt a) -gt Grafo Int -gt Grafo Int -gt Bool
esInvariantePorIsomorfismos p g h =
isomorfos g h --gt (p g == p h)
where (--gt) = (lt=)
Teorema 366 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un iso-morfismo Entonces se verifica que |V(G)| = |V(Gprime)| es decir el orden de un grafo es uninvariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos orden)
+++ OK passed 100 tests
Teorema 367 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces se verifica que |A(G)| = |A(Gprime)| es decir el tamantildeo de un grafo es uninvariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos tamantildeo)
+++ OK passed 100 tests
Teorema 368 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces tienen la misma secuencia de grados es decir la secuencia de grados de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos secuenciaGrados)
+++ OK passed 100 tests
A partir de las propiedades que hemos demostrado de los isomorfismos vamos adar otra definicioacuten equivalente de las funciones (isomorfismos1 g h) y (isomorfos1
g h)
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfismos2 g1 g2
-- [[(12)(24)(36)]]
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfismos2 g3 g4
-- []
-- gtgtgt let g5 = creaGrafo [123] [(11)(22)(33)]
84 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- gtgtgt let g6 = creaGrafo [246] [(22)(44)(66)]
-- gtgtgt pp $ isomorfismos2 g5 g6
-- [[(1 2)(2 4)(3 6)][(1 4)(2 2)(3 6)]
-- [(1 6)(2 4)(3 2)][(1 4)(2 6)(3 2)]
-- [(1 6)(2 2)(3 4)][(1 2)(2 6)(3 4)]]
isomorfismos2 (Ord a Ord b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos2 g h
| orden g = orden h = []
| tamantildeo g = tamantildeo h = []
| secuenciaGrados g = secuenciaGrados h = []
| otherwise = [f | f lt- biyecciones vs1 vs2
conservaAdyacencia g h f]
where vs1 = vertices g
vs2 = vertices h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfos2 g1 g2
-- True
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfos2 g3 g4
-- False
isomorfos2 (Ord a Ord b) =gt Grafo a -gt Grafo b -gt Bool
isomorfos2 g =
not null isomorfismos2 g
isomorfismos3 (Ord a Ord b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos3 g h
| orden g = orden h = []
| tamantildeo g = tamantildeo h = []
| secuenciaGrados g = secuenciaGrados h = []
| otherwise = filter (conservaAdyacencia g h) (posibles g h)
verticesPorGrados g =
[filter (p n) (vertices g) | n lt- nub (secuenciaGrados g)]
where p m v = grado g v == m
aux1 [] _ = []
aux1 (xsxss) (ysyss) = (map (zip xs) (permutations ys))aux1 xss yss
aux2 [] = []
aux2 (xss[]) = xss
aux2 (xssyss[]) = [xs ++ ys | xs lt- xss ys lt- yss]
aux2 (xssyssxsss) =
aux2 ([xs ++ ys | xs lt- xss ys lt- yss]xsss)
36 Morfismos de grafos 85
posibles g h =
aux2 (aux1 (verticesPorGrados g) (verticesPorGrados h))
Vamos a comparar la eficiencia entre ambas definiciones
Nota 362 La nueva definicioacuten de (isomorfismos3 g h) es la maacutes eficiente con gra-fos poco regulares sin embargo cuando todos los veacutertices tienen el mismo grado(isomorfismos2 g h) sigue siendo mejor opcioacuten (aunque no hay mucha diferenciaen el coste computacional)ghcigt let n = 6 in (length (isomorfismos1 (completo n) (completo n)))
720
(018 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos2 (completo n) (completo n)))
720
(018 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos3 (completo n) (completo n)))
720
(018 secs 26123800 bytes)
ghcigt let n = 6 in (length (isomorfismos1 (grafoCiclo n) (grafoCiclo n)))
12
(004 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos2 (grafoCiclo n) (grafoCiclo n)))
12
(004 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos3 (grafoCiclo n) (grafoCiclo n)))
12
(004 secs 0 bytes)
ghcigt length (isomorfismos1 (grafoCiclo 6) (completo 7))
0
(000 secs 0 bytes)
ghcigt length (isomorfismos2 (grafoCiclo 6) (completo 7))
0
(001 secs 0 bytes)
ghcigt length (isomorfismos3 (grafoCiclo 6) (completo 7))
0
(000 secs 0 bytes)
ghcigt isomorfos1 (completo 10) (grafoCiclo 10)
False
(5190 secs 12841861176 bytes)
ghcigt isomorfos2 (completo 10) (grafoCiclo 10)
False
(000 secs 0 bytes)
ghcigt isomorfos3 (completo 10) (grafoCiclo 10)
False
86 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
(000 secs 0 bytes)
ghcigt isomorfos1 (grafoCiclo 10) (grafoRueda 10)
False
(7390 secs 16433969976 bytes)
ghcigt isomorfos2 (grafoCiclo 100) (grafoRueda 100)
False
(000 secs 0 bytes)
ghcigt isomorfos3 (grafoCiclo 100) (grafoRueda 100)
False
(000 secs 0 bytes)
ghcigt length (isomorfismos2 (grafoRueda 10) (grafoRueda 10))
18
(10112 secs 23237139992 bytes)
ghcigt length (isomorfismos3 (grafoRueda 10) (grafoRueda 10))
18
(4467 secs 9021442440 bytes)
Nota 363 Cuando los grafos son isomorfos comprobar que tienen el mismo nuacuteme-ro de veacutertices el mismo nuacutemero de aristas y la misma secuencia graacutefica no requieremucho tiempo ni espacio dando lugar a costes muy similares entre los dos paresde definiciones Sin embargo cuando los grafos tienen el mismo nuacutemero de veacuterticesy fallan en alguna de las demaacutes propiedades el resultado es muy costoso para laprimera definicioacuten mientras que es inmediato con la segundaA partir de ahora utilizaremos la funcioacuten isomorfismos2 para calcular los isomor-fismos entre dos grafos y la funcioacuten isomorfos para determinar si dos grafos sonisomorfos de modo que las renombraremos por isomorfismos y isomorfismos res-pectivamente
isomorfismos (Ord aOrd b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos = isomorfismos2
isomorfos (Ord aOrd b) =gt Grafo a -gt Grafo b -gt Bool
isomorfos = isomorfos2
364 Automorfismos
Definicioacuten 369 Dado un grafo simple G = (V A) un automorfismo de G es un iso-morfismo de G en siacute mismo
La funcioacuten (esAutomorfismo g f) se verifica si la aplicacioacuten f es un automorfismode g
-- | Ejemplos
-- gtgtgt let g = creaGrafo [123] [(12)(13)]
37 Caminos en grafos 87
-- gtgtgt esAutomorfismo g [(11)(23)(32)]
-- True
-- gtgtgt esAutomorfismo g [(12)(23)(31)]
-- False
esAutomorfismo Ord a =gt Grafo a -gt Funcion a a -gt Bool
esAutomorfismo g = esIsomorfismo g g
La funcioacuten (automorfismos g) devuelve la lista de todos los posibles automorfis-mos en g
-- | Ejemplo
-- gtgtgt automorfismos (creaGrafo [123] [(12)(13)])
-- [[(11)(22)(33)][(11)(23)(32)]]
automorfismos Ord a =gt Grafo a -gt [Funcion a a]
automorfismos g = isomorfismos1 g g
Nota 364 Cuando trabajamos con automorfismos es mejor utilizar en su defini-cioacuten la funcioacuten isomorfismos1 en vez de isomorfismos2 pues ser isomorfos es unarelacioacuten reflexiva es decir un grafo siempre es isomorfo a siacute mismo
37 Caminos en grafos
Una de las aplicaciones de la teoriacutea de grafos es la determinacioacuten de trayectos o re-corridos en una red de transporte o de distribucioacuten de productos Asiacute si cada veacuterticerepresenta un punto de intereacutes y cada arista representa una conexioacuten entre dos pun-tos usando grafos como modelos podemos simplificar el problema de encontrar laruta maacutes ventajosa en cada caso
371 Definicioacuten de camino
Definicioacuten 371 Sea G = (V A) un grafo simple y sean u v isin V dos veacutertices Uncamino entre u y v es una sucesioacuten de veacutertices de G u = v0 v1 v2 vkminus1 vk = vdonde foralli isin 0 kminus 1 (vi vi+1) isin A
La funcioacuten (esCamino g c) se verifica si la sucesioacuten de veacutertices c es un camino enel grafo g
-- | Ejemplo
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
-- gtgtgt esCamino (grafoCiclo 5) [123451]
-- True
-- gtgtgt esCamino (grafoCiclo 5) [124531]
-- False
88 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
esCamino Ord a =gt Grafo a -gt [a] -gt Bool
esCamino g c = all (`aristaEn` g) (zip c (tail c))
La funcioacuten (aristasCamino c) devuelve la lista de las aristas recorridas en el ca-mino c
-- | Ejemplos
-- gtgtgt aristasCamino [123]
-- [(12)(23)]
-- gtgtgt aristasCamino [1231]
-- [(12)(23)(13)]
-- gtgtgt aristasCamino [1232]
-- [(12)(23)(23)]
aristasCamino Ord a =gt [a] -gt [(aa)]
aristasCamino c =
map parOrdenado (zip c (tail c))
where parOrdenado (uv) | u lt= v = (uv)
| otherwise = (vu)
La funcioacuten (verticesCamino c) devuelve la lista de las vertices recorridas en elcamino c
-- | Ejemplo
-- gtgtgt verticesCamino [1231]
-- [123]
verticesCamino Ord a =gt [a] -gt [a]
verticesCamino c = nub c
Definicioacuten 372 Se llama longitud de un camino al nuacutemero de veces que se atraviesa unaarista en dicho camino
La funcioacuten (longitudCamino c) devuelve la longitud del camino c
-- | Ejemplo
-- gtgtgt longitudCamino [427]
-- 2
longitudCamino [a] -gt Int
longitudCamino c = length c - 1
La funcioacuten (todosCaminos g u v k) devuelve todos los caminos entre los veacuterticesu y v en el grafo g que tienen longitud k
-- | Ejemplo
-- gtgtgt todosCaminos (creaGrafo [12] [(12)]) 1 2 3
-- [[1212]]
-- gtgtgt todosCaminos (bipartitoCompleto 2 3) 1 3 3
-- [[1313][1323][1413][1423][1513][1523]]
todosCaminos Ord a =gt Grafo a -gt a -gt a -gt Int -gt [[a]]
todosCaminos g u v 0 = if u == v ampamp elem u (vertices g)
37 Caminos en grafos 89
then [[u]]
else []
todosCaminos g u v 1 = if aristaEn (uv) g
then [[uv]]
else []
todosCaminos g u v k =
filter p [uvs | n lt- [1k-1] w lt- a u vs lt- tC w v n]
where p xs = longitudCamino xs == k
a = adyacentes g
tC = todosCaminos g
La funcioacuten (numeroCaminosDeLongitud g u v k) es el nuacutemero de caminos de lon-gitud k uniendo los veacutertices u y v en el grafo g
-- | Ejemplos
-- gtgtgt numeroCaminosDeLongitud (completo 7) 1 4 5
-- 1111
-- gtgtgt numeroCaminosDeLongitud grafoPetersen 1 4 3
-- 5
numeroCaminosDeLongitud Ord a =gt Grafo a -gt a -gt a -gt Int -gt Int
numeroCaminosDeLongitud g u v = length todosCaminos g u v
372 Recorridos
Definicioacuten 373 Sea G = (V A) un grafo y sean u v isin V Un camino entre u y v queno repite aristas (quizaacutes veacutertices) se llama recorrido
La funcioacuten (esRecorrido g c) se verifica si el camino c es un recorrido en el grafog
-- | Ejemplo
-- gtgtgt esRecorrido (grafoCiclo 4) [214]
-- True
-- gtgtgt esRecorrido (grafoCiclo 4) [2141]
-- False
-- gtgtgt esRecorrido (grafoCiclo 4) [213]
-- False
esRecorrido Ord a =gt Grafo a -gt [a] -gt Bool
esRecorrido g c =
esCamino g c ampamp sinRepetidos (aristasCamino c)
373 Caminos simples
Definicioacuten 374 Un camino que no repite veacutertices (y por tanto tampoco aristas) se llamacamino simple
90 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (esCaminoSimple g c) se verifica si el camino c es un camino simple enel grafo g
-- | Ejemplos
-- gtgtgt esCaminoSimple (creaGrafo [12] [(11)(12)]) [112]
-- False
-- gtgtgt esCaminoSimple (grafoCiclo 4) [214]
-- True
-- gtgtgt esCaminoSimple (grafoCiclo 4) [14321]
-- True
-- gtgtgt esCaminoSimple (grafoCiclo 4) [43212]
-- False
esCaminoSimple Ord a =gt Grafo a -gt [a] -gt Bool
esCaminoSimple g [] = True
esCaminoSimple g vs =
esRecorrido g vs ampamp noRepiteVertices vs
where noRepiteVertices (xxs)
| sinRepetidos (xxs) = True
| x == last xs ampamp sinRepetidos xs = True
| otherwise = False
La funcioacuten (todosArcosBP g u v) devuelve una lista con todos los caminos simplesposibles en el grafo g entre los veacutertices u y v utilizando una algoritmo de buacutesquedaen profundidad sobre el grafo g Este algoritmo recorre el grafo de izquierda a dere-cha y de forma al visitar un nodo explora todos los caminos que pueden continuarpor eacutel antes de pasar al siquiente
-- | Ejemplos
-- gtgtgt grafoCiclo 4
-- G [1234] [(12)(14)(23)(34)]
-- gtgtgt todosArcosBP (grafoCiclo 4) 1 4
-- [[14][1234]]
-- gtgtgt todosArcosBP (grafoCiclo 4) 4 1
-- [[4321][41]]
-- gtgtgt todosArcosBP (creaGrafo [14] [(12)(34)]) 1 4
-- []
-- gtgtgt todosArcosBP (creaGrafo [12] [(11)(12)]) 1 1
-- [[1]]
todosArcosBP Ord a =gt Grafo a -gt a -gt a -gt [[a]]
todosArcosBP g x y = aux [[y]]
where aux [] = []
aux ([]zss) = aux zss
aux ((zzs)zss)
| z == x = (zzs) aux zss
| otherwise =
aux ([vzzs | v lt- adyacentes g z zs] ++ zss)
g = eliminaLazos g
eliminaLazos h = creaGrafo (vertices h)
37 Caminos en grafos 91
[(xy) | (xy) lt- aristas h x = y]
La funcioacuten (todosArcosBA g u v) devuelve una lista con todos los caminos simplesposibles en el grafo g entre los veacutertices u y v utilizando una algoritmo de buacutesquedaen anchura sobre el grafo g Este algoritmo recorre el grafo por niveles de formaque el primer camino de la lista es de longitud miacutenima
-- | Ejemplos
-- gtgtgt grafoCiclo 4
-- G [1234] [(12)(14)(23)(34)]
-- gtgtgt todosArcosBA (grafoCiclo 4) 1 4
-- [[14][1234]]
-- gtgtgt todosArcosBA (grafoCiclo 4) 4 1
-- [[41][4321]]
-- gtgtgt todosArcosBA (creaGrafo [14] [(12)(34)]) 1 4
-- []
-- gtgtgt todosArcosBA (creaGrafo [12] [(11)(12)]) 1 1
-- [[1]]
todosArcosBA Ord a =gt Grafo a -gt a -gt a -gt [[a]]
todosArcosBA g x y = aux [[y]]
where aux [] = []
aux ([]zss) = aux zss
aux ((zzs)zss)
| z == x = (zzs) aux zss
| otherwise =
aux (zss ++ [vzzs | v lt- adyacentes g z zs])
g = eliminaLazos g
Vamos a comprobar con QuickCheck que el primer elemento de la lista que de-vuelve la funcioacuten (todosArcosBA g u v) es de longitud miacutenima Para ello vamos autilizar la funcioacuten (parDeVertices g) que es un generador de pares de veacutertices delgrafo no nulo g Por ejemplo
ghcigt sample (parDeVertices (creaGrafo [19] []))
(39)
(93)
(74)
(43)
(28)
(72)
(84)
(53)
(72)
(31)
(72)
92 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
parDeVertices Grafo Int -gt Gen (IntInt)
parDeVertices g = do
x lt- elements vs
y lt- elements vs
return (xy)
where vs = vertices g
La propiedad es
prop_todosArcosBA Grafo Int -gt Property
prop_todosArcosBA g =
not (esGrafoNulo g) ==gt
forAll (parDeVertices g)
((xy) -gt let zss = todosArcosBA g x y
in null zss || longitudCamino (head zss) ==
minimum (map longitudCamino zss))
La comprobacioacuten es
ghcigt quickCheck prop_todosArcosBA
+++ OK passed 100 tests
Veamos que la funcioacuten (todosArcosBP g u v) no verifica la propiedad
ghcigt quickCheck prop_todosArcosBP
Failed Falsifiable (after 6 tests)
G [12345] [(12)(14)(15)(22)(23)(24)(44)(45)(55)]
(52)
prop_todosArcosBP Grafo Int -gt Property
prop_todosArcosBP g =
not (esGrafoNulo g) ==gt
forAll (parDeVertices g)
((xy) -gt let zss = todosArcosBP g x y
in null zss || longitudCamino (head zss) ==
minimum (map longitudCamino zss))
La funcioacuten (numeroArcosDeLongitud g u v k) devuelve el nuacutemero de caminos en-tre los veacutertices u y v en el grafo g que tienen longitud k
-- | Ejemplos
-- gtgtgt numeroArcosDeLongitud (completo 6) 1 3 4
-- 24
-- gtgtgt numeroArcosDeLongitud grafoPetersen 1 3 4
-- 4
numeroArcosDeLongitud Ord a =gt Grafo a -gt a -gt a -gt Int -gt Int
numeroArcosDeLongitud g u v k =
length (filter p (todosArcosBA g u v))
where p vs = longitudCamino vs == k
37 Caminos en grafos 93
374 Conexioacuten
Definicioacuten 375 Dado un grafo G = (V A) sean u v isin V Si existe alguacuten camino entreu y v en el grafo G diremos que estaacuten conectados y lo denotamos por u v
La funcioacuten (estanConectados g u v) se verifica si los veacutertices u y v estaacuten conecta-dos en el grafo g
-- | Ejemplos
-- gtgtgt estanConectados (creaGrafo [14] [(12)(24)]) 1 4
-- True
-- gtgtgt estanConectados (creaGrafo [14] [(12)(34)]) 1 4
-- False
estanConectados Ord a =gt Grafo a -gt a -gt a -gt Bool
estanConectados g u v
| esGrafoNulo g = False
| otherwise = not (null (todosArcosBA g u v))
Nota 371 La funcioacuten (estanConectados g u v) no necesita calcular todos los ca-minos entre u y v Puesto que Haskell utiliza por defecto evaluacioacuten perezosa siexiste alguacuten camino entre los dos veacutertices basta calcular el primero para saber quela lista de todos los caminos no es vaciacutea
375 Distancia
Definicioacuten 376 Se define la distancia entre u y v en el grafo G como la longitud delcamino maacutes corto que los une Si u y v no estaacuten conectados decimos que la distancia esinfinita
La funcioacuten (distancia g u v) devuelve la distancia entre los veacutertices u y v en elgrafo g En caso de que los veacutertices no esteacuten conectados devuelve el valor Nothing
-- | Ejemplos
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 1
-- Just 0
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 2
-- Just 1
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 3
-- Just 2
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 4
-- Nothing
distancia Ord a =gt Grafo a -gt a -gt a -gt Maybe Int
distancia g u v
| estanConectados g u v =
Just (longitudCamino (head (todosArcosBA g u v)))
| otherwise = Nothing
94 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Definicioacuten 377 Dado G = (V A) un grafo sean u v isin V Un camino entre u y v cuyalongitud coincide con la distancia entre los veacutertices se llama geodeacutesica entre u y v
La funcioacuten (esGeodesica g c) se verifica si el camino c es una geodeacutesica entre susextremos en el grafo g
-- | Ejemplos
-- gtgtgt let g = creaGrafo [14] [(12)(13)(23)(34)]
-- gtgtgt esGeodesica g [134]
-- True
-- gtgtgt esGeodesica g [1234]
-- False
esGeodesica Ord a =gt Grafo a -gt [a] -gt Bool
esGeodesica g c =
esCamino g c ampamp
longitudCamino c == fromJust (distancia g u v)
where u = head c
v = last c
Nota 372 No hace falta imponer en la definicioacuten de la funcioacuten que el camino seaun recorrido pues el camino de miacutenima longitud entre dos veacutertices es siempre unrecorrido
376 Caminos cerrados
Definicioacuten 378 Un camino en un grafo G se dice cerrado si sus extremos son igualesDiremos que un camino cerrado de longitud tres es un triaacutengulo
La funcioacuten (esCerrado g c) se verifica si el camino c es cerrado en el grafo g
-- | Ejemplos
-- gtgtgt let g = creaGrafo [14] [(12)(13)(23)(34)]
-- gtgtgt esCerrado g [1231]
-- True
-- gtgtgt esCerrado g [123]
-- False
-- gtgtgt esCerrado g [1241]
-- False
esCerrado (Ord a) =gt Grafo a -gt [a] -gt Bool
esCerrado _ [] = False
esCerrado g (vc) =
esCamino g c ampamp v == last c
La funcioacuten (triangulos g v) devuelve la lista de todos los triaacutengulos que pasanpor el veacutertice v en el grafo g
-- | Ejemplos
-- gtgtgt triangulos (completo 4) 3
37 Caminos en grafos 95
-- [[3123][3143][3213][3243][3413][3423]]
-- gtgtgt triangulos (grafoCiclo 6) 1
-- []
triangulos Ord a =gt Grafo a -gt a -gt [[a]]
triangulos g u = todosCaminos g u u 3
377 Circuitos
Definicioacuten 379 Un recorrido en un grafo G se dice circuito si sus extremos son iguales
La funcioacuten (esCircuito g c) se verifica si la sucesioacuten de veacutertices c es un circuitoen el grafo g
-- | Ejemplos
-- gtgtgt grafoCiclo 4
-- G [1234] [(12)(14)(23)(34)]
-- gtgtgt esCircuito (grafoCiclo 4) [12341]
-- True
-- gtgtgt esCircuito (grafoCiclo 4) [1234]
-- False
-- gtgtgt esCircuito (grafoCiclo 4) [1234141]
-- False
esCircuito (Ord a) =gt Grafo a -gt [a] -gt Bool
esCircuito g c =
esRecorrido g c ampamp esCerrado g c
378 Ciclos
Definicioacuten 3710 Un camino simple en un grafo G se dice que es un ciclo si sus extremosson iguales
La funcioacuten (esCiclo g c) se verifica si el camino c es un ciclo en el grafo g
-- | Ejemplos
-- gtgtgt esCiclo (grafoCiclo 4) [121]
-- False
-- gtgtgt esCiclo (grafoCiclo 4) [12341]
-- True
-- gtgtgt esCiclo (grafoCiclo 4) [1234]
-- False
-- gtgtgt esCiclo (grafoCiclo 4) [1234141]
-- False
esCiclo (Ord a) =gt Grafo a -gt [a] -gt Bool
esCiclo g c =
esCaminoSimple g c ampamp esCerrado g c
96 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (todosCiclos g v) devuelve todos los ciclos en el grafo g que pasan porel veacutertice v
-- | Ejemplos
-- gtgtgt todosCiclos (grafoCiclo 4) 3
-- [[34123][32143]]
-- gtgtgt todosCiclos (completo 3) 2
-- [[2312][2132]]
-- gtgtgt todosCiclos (creaGrafo [123] [(11)(12)(13)(23)]) 1
-- [[1][1321][1231]]
-- gtgtgt todosCiclos (creaGrafo [12] [(12)(22)(23)]) 2
-- [[2]]
todosCiclos Ord a =gt Grafo a -gt a -gt [[a]]
todosCiclos g x =
map f (filter p (concat [todosArcosBA g x u | u lt- a x]))
where p c = longitudCamino c = 1
f c | longitudCamino c == 0 = c
| otherwise = c ++ [x]
a = adyacentes g
Nota 373 El algoritmo utilizado en la definicioacuten de (todosCiclos g) es el de buacutes-queda en anchura Este algoritmo recorre el grafo por niveles de forma que el pri-mer camino de la lista es de longitud miacutenima
379 Grafos aciacuteclicos
Definicioacuten 3711 Diremos que un grafo G = (V A) es aciacuteclico si no contiene ninguacutenciclo es decir si forallv isin V no existe ninguacuten camino simple que comience y termine en v
La funcioacuten (esAciclico g) se verifica si el grafo g es aciacuteclico
-- | Ejemplo
-- gtgtgt esAciclico (creaGrafo [14] [(12)(24)])
-- True
-- gtgtgt esAciclico (grafoCiclo 5)
-- False
-- gtgtgt esAciclico (grafoEstrella 6)
-- True
esAciclico Ord a =gt Grafo a -gt Bool
esAciclico g =
and [null (todosCiclos g x) | x lt- vertices g]
38 Conectividad de los grafos 97
38 Conectividad de los grafos
381 Estar conectados por un camino
Teorema 381 Dado un grafo G la relacioacuten u sim v (estar conectados por un camino) es unarelacioacuten de equivalencia
La funcioacuten (estarConectadosCamino g) devuelve la relacioacuten entre los veacutertices delgrafo g de estar conectados por un camino en eacutel
-- | Ejemplo
-- gtgtgt estarConectadosCamino (creaGrafo [14] [(12)(24)])
-- [(11)(12)(14)(21)(22)(24)(33)(41)(42)(44)]
estarConectadosCamino Ord a =gt Grafo a -gt [(aa)]
estarConectadosCamino g =
[(uv) | u lt- vs v lt- vs estanConectados g u v]
where vs = vertices g
A continuacioacuten comprobaremos el resultado con QuickCheck
ghcigt quickCheck prop_conectadosRelEqui
+++ OK passed 100 tests
prop_conectadosRelEqui Grafo Int -gt Bool
prop_conectadosRelEqui g =
esRelacionEquivalencia (vertices g) (estarConectadosCamino g)
382 Componentes conexas de un grafo
Definicioacuten 382 Las clases de equivalencia obtenidas por la relacioacuten sim estar conectadospor un camino en un grafo G inducen subgrafos en G los veacutertices y todas las aristas de loscaminos que los conectan que reciben el nombre de componentes conexas por caminosde G
La funcioacuten (componentesConexas1 g) devuelve las componentes conexas por cami-nos del grafo g
-- | Ejemplos
-- gtgtgt componentesConexas (creaGrafo [15] [(12)(23)])
-- [[123][4][5]]
-- gtgtgt componentesConexas (creaGrafo [15] [(12)(23)(45)])
-- [[123][45]]
-- gtgtgt componentesConexas (creaGrafo [13] [(12)(23)])
-- [[123]]
componentesConexas1 Ord a =gt Grafo a -gt [[a]]
componentesConexas1 g =
clasesEquivalencia (vertices g) (estarConectadosCamino g)
98 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Vamos a definir dos nuevas funciones una que compruebe si el grafo es nulo o com-pleto pues en dichos casos las componentes seraacuten el conjunto vaciacuteo y el conjuntodel conjunto de veacutertices respectivamente y otra con un algoritmo algo maacutes comple-jo
componentesConexas2 Ord a =gt Grafo a -gt [[a]]
componentesConexas2 g
| esGrafoNulo g = []
| esCompleto g = [vertices g]
| otherwise =
clasesEquivalencia (vertices g) (estarConectadosCamino g)
componentesConexas3 Ord a =gt Grafo a -gt [[a]]
componentesConexas3 g = aux (vertices g) [] []
where aux [] [] [] = []
aux [] xs ys = [xs]
aux (vvs) [] [] =
aux (vs (a v)) (i v (a v)) (a v)
aux vs xs ys | null ((ug [a v | v lt- ys]) xs) =
xs aux vs [] []
| otherwise =
aux (vs ug [a v | v lt- ys])
(u xs (ug [a v | v lt- ys]))
(ug [a v | v lt- ys] ys)
a = adyacentes g
i = inserta
ug = unionGeneral
u = unionConjuntos
La comprobacioacuten con QuickCheck de la equivalencia de las definiciones es
ghcigt quickCheck prop_EquiComponentesConexas
+++ OK passed 100 tests
ghcigt quickCheck prop_EquiComponentesConexas2
+++ OK passed 100 tests
prop_EquiComponentesConexas Grafo Int -gt Bool
prop_EquiComponentesConexas g =
componentesConexas1 g == componentesConexas2 g
prop_EquiComponentesConexas2 Grafo Int -gt Bool
prop_EquiComponentesConexas2 g =
componentesConexas1 g == componentesConexas3 g
Comparemos ahora la eficiencia de las definiciones
ghcigt componentesConexas1 grafoNulo
[]
(003 secs 0 bytes)
38 Conectividad de los grafos 99
ghcigt componentesConexas2 grafoNulo
[]
(001 secs 0 bytes)
ghcigt componentesConexas3 grafoNulo
[]
(001 secs 0 bytes)
ghcigt length (componentesConexas1 (completo 50))
1
(023 secs 0 bytes)
ghcigt length (componentesConexas2 (completo 50))
1
(016 secs 0 bytes)
ghcigt length (componentesConexas3 (completo 50))
1
(008 secs 0 bytes)
ghcigt length (componentesConexas1 (completo 100))
1
(217 secs 205079912 bytes)
ghcigt length (componentesConexas2 (completo 100))
1
(285 secs 0 bytes)
ghcigt length (componentesConexas3 (completo 100))
1
(119 secs 0 bytes)
ghcigt length (componentesConexas1 (completo 150))
1
(1295 secs 742916792 bytes)
ghcigt length (componentesConexas2 (completo 150))
1
(2048 secs 0 bytes)
ghcigt length (componentesConexas3 (completo 150))
1
(964 secs 0 bytes)
Con grafos completos de gran tamantildeo Haskell tarda maacutes tiempo en comprobar quees completo que en calcular directamente sus clases de equivalencia y para grafosnulos apenas hay diferencia en el coste entre la primera y la segunda definicioacuten Porotra parte la tercera definicioacuten es la maacutes eficiente en todos los casos y seraacute por tantola que utilizaremos a lo largo del trabajo
componentesConexas Ord a =gt Grafo a -gt [[a]]
componentesConexas = componentesConexas3
La funcioacuten (numeroComponentes g) devuelve el nuacutemero de componentes conexasdel grafo g
-- Ejemplos
-- gtgtgt numeroComponentes (creaGrafo [15] [(12)(23)(45)])
100 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- 2
-- gtgtgt numeroComponentes (creaGrafo [14] [(12)(22)(34)])
-- 2
numeroComponentes Ord a =gt Grafo a -gt Int
numeroComponentes g
| null (aristas g) = orden g
| otherwise = length (componentesConexas g)
Nota 381 Hemos comprobado para la definicioacuten anterior que comprobar si un gra-fo es completo es muy costoso luego no conviene antildeadirlo como patroacuten
383 Grafos conexos
Definicioacuten 383 Dado un grafo diremos que es conexo si la relacioacuten tiene una uacutenica clasede equivalencia en eacutel es decir si el grafo tiene una uacutenica componente conexa
La funcioacuten (esConexo g) se verifica si el grafo g es conexo
-- Ejemplos
-- gtgtgt esConexo (creaGrafo [13] [(12)(23)])
-- True
-- gtgtgt esConexo (creaGrafo [15] [(12)(23)(45)])
-- False
esConexo Ord a =gt Grafo a -gt Bool
esConexo g = length (componentesConexas g) == 1
esConexo2 Ord a =gt Grafo a -gt Bool
esConexo2 g
| esGrafoNulo g = False
| esUnitario (vertices g) = True
| otherwise = aux (vertices g) [] []
where aux [] [] [] = False
aux [] xs _ = True
aux (vvs) [] [] | null vs = True
| null (a v) = False
| otherwise =
aux (vs a v) (i v (a v)) (a v)
aux vs xs ys | null ((ug [a v | v lt- xs]) xs) = False
| otherwise =
aux (vs (ug [a v | v lt- xs]))
(u (ug [a v | v lt- xs]) xs)
((ug [a v | v lt- xs]) xs)
a = adyacentes g
ug = unionGeneral
i = inserta
u = unionConjuntos
38 Conectividad de los grafos 101
La comprobacioacuten de la equivalencia de las definiciones con QuickCheck es
ghcigt quickCheck prop_EquiEsConexo
+++ OK passed 100 tests
prop_EquiEsConexo Grafo Int -gt Bool
prop_EquiEsConexo g =
esConexo g == esConexo2 g
Vamos a comparar ahora su eficiencia
ghcigt let g1 = grafoCiclo 100
(000 secs 0 bytes)
ghcigt let g = creaGrafo (vertices g1) (aristas g1 [(23)(9899)])
(000 secs 0 bytes)
ghcigt esConexo g
False
(117 secs 151632168 bytes)
ghcigt esConexo2 g
False
(001 secs 0 bytes)
ghcigt esConexo (grafoCiclo 500)
True
(7341 secs 10448270712 bytes)
ghcigt esConexo2 (grafoCiclo 500)
True
(18939 secs 18468849096 bytes)
ghcigt esConexo (grafoCiclo 500)
True
(7341 secs 10448270712 bytes)
ghcigt esConexo2 (grafoCiclo 500)
True
(18939 secs 18468849096 bytes)
En principio no nos proporciona ninguna ventaja la segunda definicioacuten asiacute que tra-bajaremos con la primera que hemos dado ya que es mucho maacutes sencilla
Teorema 384 Sea G un grafo G = (V A) es conexo si y solamente si forallu v isin V existe uncamino entre u y v
Vamos a comprobar el resultado con QuickCheck
ghcigt quickCheck prop_caracterizaGrafoConexo
+++ OK passed 100 tests
prop_caracterizaGrafoConexo Grafo Int -gt Property
prop_caracterizaGrafoConexo g =
not (esGrafoNulo g) ==gt
esConexo g == and [estanConectados g u v
| u lt- vertices g v lt- vertices g]
102 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
384 Excentricidad
Definicioacuten 385 Sean G = (V A) un grafo y v isin V Se define la excentricidad de v comoel maacuteximo de las distancias entre v y el resto de veacutertices de G La denotaremos por e(v)
La funcioacuten (excentricidad g v) devuelve la excentricidad del veacutertice v en el grafog
-- | Ejemplos
-- gtgtgt let g = creaGrafo [13] [(12)(23)(33)]
-- gtgtgt excentricidad g 1
-- Just 2
-- gtgtgt excentricidad g 2
-- Just 1
-- gtgtgt excentricidad (creaGrafo [13] [(12)(33)]) 1
-- Nothing
excentricidad Ord a =gt Grafo a -gt a -gt Maybe Int
excentricidad g u
| esGrafoNulo g = Nothing
| orden g == 1 = Just 0
| Nothing `elem` distancias = Nothing
| otherwise = maximum distancias
where distancias = [distancia g u v | v lt- vertices g [u]]
La funcioacuten (excentricidades g) devuelve la lista ordenada de las excentricidadesde los veacutertices del grafo g
-- | Ejemplos
-- gtgtgt excentricidades (creaGrafo [13] [(12)(23)(33)])
-- [Just 1Just 2Just 2]
-- gtgtgt excentricidades (creaGrafo [13] [(12)(33)])
-- [NothingNothingNothing]
excentricidades Ord a =gt Grafo a -gt [Maybe Int]
excentricidades g = sort (map (excentricidad g) (vertices g))
385 Diaacutemetro
Definicioacuten 386 Sea G = (V A) un grafo Se define el diaacutemetro de G como el maacuteximo delas distancias entre los veacutertices en V Lo denotaremos por d(G)
La funcioacuten (diametro g) devuelve el diaacutemetro del grafo g
-- | Ejemplos
-- gtgtgt diametro (creaGrafo [13] [(12)(23)(33)])
-- Just 2
-- gtgtgt diametro (creaGrafo [13] [(12)(33)])
-- Nothing
diametro Ord a =gt Grafo a -gt Maybe Int
38 Conectividad de los grafos 103
diametro g
| esGrafoNulo g = Nothing
| Nothing `elem` distancias = Nothing
| otherwise = maximum distancias
where vs = vertices g
distancias = [distancia g u v | u lt- vs v lt- vs u lt= v]
386 Radio
Definicioacuten 387 Sean G = (V A) un grafo y v isin V Se define el radio de G como elmiacutenimo de las excentricidades de sus veacutertices Lo denotaremos por r(G)
La funcioacuten (radio g) devuelve el radio del grafo g
-- | Ejemplos
-- gtgtgt radio (creaGrafo [13] [(12)(23)(33)])
-- Just 1
-- gtgtgt radio (creaGrafo [13] [(12)(33)])
-- Nothing
radio Ord a =gt Grafo a -gt Maybe Int
radio g
| esGrafoNulo g = Nothing
| Nothing `elem` ds = Nothing
| otherwise = minimum ds
where ds = [excentricidad g v | v lt- vertices g]
387 Centro
Definicioacuten 388 Sean G = (V A) un grafo Llamamos centro del grafo G al conjunto deveacutertices de excentricidad miacutenima A estos veacutertices se les denomina veacutertices centrales
La funcioacuten (centro g) devuelve el centro del grafo g Por ejemplo
-- | Ejemplos
-- gtgtgt centro (creaGrafo [13] [(12)(23)(33)])
-- [2]
-- gtgtgt centro (creaGrafo [13] [(12)(13)(23)])
-- [123]
-- gtgtgt centro (creaGrafo [13] [(12)(33)])
-- [123]
centro Ord a =gt Grafo a -gt [a]
centro g = [v | v lt- vertices g excentricidad g v == r]
where r = radio g
104 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
388 Grosor
Definicioacuten 389 Sean G = (V A) un grafo Se llama grosor o cintura del grafo G almiacutenimo de las longitudes de los ciclos de G Si el grafo no posee ciclos (es decir es un grafoaciacuteclico) se dice que su cintura es infinita
La funcioacuten (grosor g) devuelve el grosor del grafo g
-- | Ejemplos
-- gtgtgt grosor (creaGrafo [123] [(12)(23)])
-- Nothing
-- gtgtgt grosor (creaGrafo [123] [(11)(12)(23)(34)])
-- Just 0
-- gtgtgt grosor grafoPetersen
-- Just 5
-- gtgtgt grosor grafoMoebiusCantor
-- Just 6
-- gtgtgt grosor grafoHeawood
-- Just 6
-- gtgtgt grosor grafoMcGee
-- Just 7
-- gtgtgt grosor grafoTutteCoxeter
-- Just 8
grosor Ord a =gt Grafo a -gt Maybe Int
grosor g
| esAciclico g = Nothing
| otherwise = Just (minimum [longitudCamino (head yss)
| x lt- vertices g
let yss = todosCiclos g x
not (null yss)])
Propiedades del grosor de los grafos
Teorema 3810 El grosor del grafo ciclo de orden n Cn es infin si n lt 3 y 3 en caso contrario
La propiedad se expresa por
prop_grosor_grafoCiclo Int -gt Bool
prop_grosor_grafoCiclo n =
grosor (grafoCiclo n) == if n lt 3
then Nothing
else Just n
Su comprobacioacuten para n le 30 es
ghcigt all prop_grosor_grafoCiclo [130]
True
Teorema 3811 El grosor del grafo amistad de orden n es 3 para todo n
38 Conectividad de los grafos 105
prop_grosor_grafoAmistad Int -gt Bool
prop_grosor_grafoAmistad n =
grosor (grafoAmistad n) == Just 3
Su comprobacioacuten para n le 30 es
ghcigt all prop_grosor_grafoAmistad [130]
True
Teorema 3812 El grosor del grafo completo de orden n Kn es infin si n lt 3 y 3 en casocontrario
La propiedad se expresa por
prop_grosor_completo Int -gt Bool
prop_grosor_completo n =
grosor (completo n) == if n lt 3
then Nothing
else Just 3
Su comprobacioacuten para n le 30 es
ghcigt all prop_grosor_completo [130]
True
Teorema 3813 El grosor del grafo bipartito completo de orden Kmn es infin si m = 1 oacuten = 1 y es 4 en caso contrario y 3 en caso contrario
La propiedad se expresa por
prop_grosor_bipartitoCompleto Int -gt Int -gt Bool
prop_grosor_bipartitoCompleto m n =
grosor (bipartitoCompleto m n) == if m == 1 || n == 1
then Nothing
else Just 4
Su comprobacioacuten para 1 le m le n le 15 es
ghcigt and [prop_grosor_bipartitoCompleto m n | m lt- [115] n lt- [m15]]
True
Teorema 3814 El grosor del grafo rueda de orden n Wn es infin si n lt 3 y 3 en caso contrario
La propiedad se expresa por
prop_grosor_grafoRueda Int -gt Bool
prop_grosor_grafoRueda n =
grosor (grafoRueda n) == if n lt 3
then Nothing
else Just 3
106 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Su comprobacioacuten para 1 le n le 30 es
ghcigt all prop_grosor_grafoRueda [130]
True
389 Propiedades e invariantes por isomorfismos
Teorema 3815 Sean G = (V A) y Gprime = (Vprime Aprime) grafos isomorfos con φ V rarr Vprime unisomorfismo Entonces dados u v isin V u sim v si y solamente si φ(u) sim φ(v)
La comprobacioacuten del teorema con QuickCheck es
ghcigt quickCheck prop_ConexionIsomorfismo1
+++ OK passed 100 tests
prop_ConexionIsomorfismo1 Grafo Int -gt Grafo Int -gt Bool
prop_ConexionIsomorfismo1 g h =
not (isomorfos g h) ||
and [ec g u v == ec h (imagen phi u) (imagen phi v)
| u lt- vs
v lt- vs
phi lt- isomorfismos g h]
where vs = vertices g
ec = estanConectados
Teorema 3816 Sean G = (V A) y Gprime = (Vprime Aprime) grafos isomorfos con φ V rarr Vprime unisomorfismo Entonces φ lleva cada componente conexa de G en una componente conexa deGprime
La comprobacioacuten del teorema con QuickCheck es
ghcigt quickCheck prop_ConexionIsomorfismo2
+++ OK passed 100 tests
prop_ConexionIsomorfismo2 Grafo Int -gt Grafo Int -gt Bool
prop_ConexionIsomorfismo2 g h =
not(isomorfos g h) ||
and [conjuntosIguales cch (aux f) | f lt- isomorfismos g h]
where cch = componentesConexas h
ccg = componentesConexas g
aux f = map (sort imagenConjunto f) ccg
Teorema 3817 Sean G = (V A) y Gprime = (Vprime Aprime) grafos isomorfos con φ V rarr Vprime unisomorfismo Entonces G y Gprime tienen el mismo nuacutemero de componentes conexas
La comprobacioacuten del teorema con QuickCheck es
38 Conectividad de los grafos 107
ghcigt quickCheck prop_ConexionIsomorfismo3
+++ OK passed 100 tests
prop_ConexionIsomorfismo3 Grafo Int -gt Grafo Int -gt Bool
prop_ConexionIsomorfismo3 g h =
not (isomorfos g h) ||
numeroComponentes g == numeroComponentes h
Teorema 3818 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que el diaacutemetro de G es igual al diaacutemetro de Gprime es decir el diaacutemetrode un grafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos diametro)
+++ OK passed 100 tests
Teorema 3819 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces se verifica que el radio de G es igual al radio de Gprime es decir el radio de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos radio)
+++ OK passed 100 tests
Teorema 3820 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que el grosor de G es igual al grosor de Gprime es decir el grosor de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos grosor)
+++ OK passed 100 tests
Teorema 3821 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que el centro de G es igual al centro de Gprime es decir el centro de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos centro)
+++ OK passed 100 tests
Teorema 3822 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces se verifica que el nuacutemero de componentes conexas de G es igual al nuacutemerode las de Gprime es decir el nuacutemero de componentes conexas de un grafo es un invariante porisomorfismos
108 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos numeroComponentes)
+++ OK passed 100 tests
Teorema 3823 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que los valores que toman las excentricidades de los veacutertices G esigual al de los veacutertices de Gprime es decir el conjunto de valores que toman las excentricidadesde los veacutertices es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos excentricidades)
+++ OK passed 100 tests
Capiacutetulo 4
Matrices asociadas a grafos
En este capiacutetulo se definiraacuten algunas representaciones de grafos como matrices secomprobaraacuten sus propiedades y volveremos a definir algunos conceptos del capiacutetu-lo 3 ahora utilizando matricesPara elaborar el contenido del capiacutetulo utilizareacute el segundo tema del trabajo fin degrado de Fco Javier Franco Galviacuten Aspectos algebraicos en teoriacutea de grafos ([7]) En eltrabajo el autor introduce los conceptos de matriz de adyacencia matriz de incidenciay otras matrices asociadas a grafos
41 Generador de grafos simples
En esta seccioacuten presentaremos el generador de grafos que nos permitiraacute generargrafos simples como listas de aristas arbitrariamente y usarlos como ejemplos opara comprobar propiedades en la seccioacuten de matrices asociadas a grafos(grafoSimple) es un generador de grafos simples de hasta 10 veacutertices Por ejemplo
ghcigt sample grafoSimple
G [12345678] [(14)(15)(16)(17)(18)(23)
(24)(25)(27)(35)(37)(45)(46)(56)(67)]
G [123456789] [(14)(18)(23)(25)(29)
(34)(35)(36)(38)(39)(46)(48)(49)
(58)(59)(69)(78)]
G [123456] [(12)(13)(24)(25)(26)(35)(56)]
G [1234567] [(12)(13)(14)(24)(25)(26)
(36)(45)(46)(67)]
G [1234] [(13)(14)(23)(34)]
G [123] [(23)]
G [12] [(12)]
G [123456] [(16)(24)(26)(35)(36)(56)]
G [123456789] [(12)(14)(15)(16)(17)(24)
(34)(37)(38)(39)(45)(47)(49)(56)(57)
(58)(59)(67)(69)(78)(79)]
109
110 Capiacutetulo 4 Matrices asociadas a grafos
G [123456789] [(13)(14)(15)(16)(23)(24)
(29)(35)(39)(45)(47)(48)(49)(57)(58)
(59)(67)(68)(69)(79)]
G [1] []
grafoSimple Gen (Grafo Int)
grafoSimple = do
n lt- choose (010)
as lt- sublistOf [(xy) | x lt- [1n] y lt- [x+1n]]
return (creaGrafo [1n] as)
42 Matrices de adyacencia
421 Definicioacuten y propiedades
Usaremos la funcioacuten (imprimeMatriz p) para imprimir por pantalla la matriz p conuna fila por liacutenea
-- | Ejemplo
-- gtgtgt imprimeMatriz (fromLists [[134][357][479]])
-- [134]
-- [357]
-- [479]
imprimeMatriz Show a =gt Matrix a -gt IO ()
imprimeMatriz p =
mapM_ print (toLists p)
Definicioacuten 421 Sea G = (V A) un grafo simple con V = v1 vn Se define sumatriz de adyacencia como Antimesn = (aij) donde el elemento aij toma el valor 1 si existealguna arista en A uniendo los veacutertices vi y vj y 0 en caso contrario
Nota 421 La matriz de adyacencia depende del etiquetado del grafo
La funcioacuten (matrizAdyacencia g) es la matriz de adyacencia del grafo g
-- | Ejemplo
-- gtgtgt imprimeMatriz (matrizAdyacencia (grafoCiclo 4))
-- [0101]
-- [1010]
-- [0101]
-- [1010]
-- gtgtgt imprimeMatriz (matrizAdyacencia (completo 4))
-- [0111]
-- [1011]
-- [1101]
-- [1110]
42 Matrices de adyacencia 111
matrizAdyacencia Grafo Int -gt Matrix Int
matrizAdyacencia g = matrix n n f
where n = orden g
f (ij) | (ij) `aristaEn` g = 1
| otherwise = 0
422 Propiedades baacutesicas de las matrices
La funcioacuten (esSimetrica p) se verifica si la matriz p es simeacutetrica
-- ejemplo
-- gtgtgt esSimetrica (fromLists [[134][357][479]])
-- True
-- gtgtgt esSimetrica (fromLists [[134][357][497]])
-- False
esSimetrica Eq a =gt Matrix a -gt Bool
esSimetrica p =
transpose p == p
La funcioacuten (potencia p n) devuelvela potencia nndasheacutesima de la matriz cuadrada p
-- Ejemplo
-- gtgtgt potencia (fromLists [[134][357][479]]) 3
-- ( 408 735 975 )
-- ( 735 1323 1755 )
-- ( 975 1755 2328 )
potencia Num a =gt Matrix a -gt Int -gt Matrix a
potencia p 1 = p
potencia p n = if (odd n)
then (m p (potencia (m p p) (div (n-1) 2)))
else (potencia (m p p) (div (n-1) 2))
where m = multStd2
423 Propiedades de las matrices de adyacencia
Teorema 422 Para todo n la matriz de adyacencia del grafo ciclo de orden n Cn es simeacute-trica
ghcigt all prop_simetricaAdyacenciaCompleto [130]
True
prop_simetricaAdyacenciaCompleto Int -gt Bool
prop_simetricaAdyacenciaCompleto n =
esSimetrica (matrizAdyacencia (completo n))
La funcioacuten (tamantildeoM g) devuelve el tamantildeo del grafo simple g calculado usandosu matriz de adyacencia
112 Capiacutetulo 4 Matrices asociadas a grafos
-- | Ejemplos
-- gtgtgt tamantildeoM (grafoCiclo 4)
-- 4
-- gtgtgt tamantildeoM grafoPetersen
-- 15
tamantildeoM Grafo Int -gt Int
tamantildeoM g = sum (toList (matrizAdyacencia g)) `div` 2
Teorema 423 El tamantildeo de un grafo simple es la mitad de la suma de los elementos de sumatriz de adyacencia
La comprobacioacuten del teorema con QuickCheck es
ghcigt quickCheck prop_tamantildeoMatriz
+++ OK passed 100 tests
prop_tamantildeoMatriz Property
prop_tamantildeoMatriz =
forAll grafoSimple
(g -gt tamantildeo g == tamantildeoM g)
Teorema 424 Si un grafo G = (V A) tiene un veacutertice aislado vi tanto la fila como lacolumna indasheacutesima de su matriz de adyacencia estaraacuten formadas por ceros
esAisladoM Grafo Int -gt Int -gt Bool
esAisladoM g v = if (all (==0)
(((toLists (ma g)) (v-1))
++((toLists (t (ma g))) (v-1))))
then True
else False
where ma = matrizAdyacencia
t = transpose
La comprobacioacuten del teorema es
ghcigt quickCheck prop_esAisladoMatriz
+++ OK passed 100 tests
prop_esAisladoMatriz Property
prop_esAisladoMatriz =
forAll grafoSimple
(g -gt and [esAislado g v == esAisladoM g v
| v lt- vertices g])
Teorema 425 Sea un grafo G = (V A) simple no dirigido con V = v1 vn Lasuma de los elementos de la fila (o columna) indasheacutesima de su matriz de adyacencia coincide conel grado del veacutertice vi Es decir
42 Matrices de adyacencia 113
δ(vi) =n
sumj=1
aij =n
sumj=1
aji
gradoM Grafo Int -gt Int -gt Int
gradoM g v = sum ((toLists (ma g)) (v-1))
where ma = matrizAdyacencia
La comprobacioacuten del teorema es
ghcigt quickCheck prop_gradoMatriz
+++ OK passed 100 tests
prop_gradoMatriz Property
prop_gradoMatriz =
forAll grafoSimple
(g -gt and [grado g v == gradoM g v | v lt- vertices g])
Teorema 426 Sea G = (V A) un grafo bipartito de conjuntos de veacutertices disjuntosV1 = v1 vk y V2 = vk+1 vn tal que V = V1 cup V2 y soacutelo existen aristasque conectan veacutertices de V1 con veacutertices de V2 Entonces con este etiquetado de V la matrizde adyacencia de G tiene la forma
A =
(θ BBt θ
)
prop_BipartitoMatriz Grafo Int -gt Property
prop_BipartitoMatriz g =
esBipartito g ==gt
all (==0) [ getElem u v m | [uv] lt- (f (fromJust p))]
where f (xsys) = filter p (subsequences xs ++ subsequences ys)
where p zs = length zs == 2
p = conjuntosVerticesDisjuntos g
m = matrizAdyacencia g
424 Caminos y arcos
En esta seccioacuten se presentaraacute la informacioacuten que contiene la matriz de adyacenciade un grafo en relacioacuten a los caminos que se encuentran en eacutel
Teorema 427 Sea G = (V A) un grafo con V = v1 vn y matriz de adyacenciaA = (aij) Entonces forallk ge 0 el elemento (i j) de Ak que denotaremos por ak
ij es elnuacutemero de caminos de longitud k desde el veacutertice vi al veacutertice vj
114 Capiacutetulo 4 Matrices asociadas a grafos
numeroCaminosDeLongitudM Grafo Int -gt Int -gt Int -gt Int -gt Int
numeroCaminosDeLongitudM g u v k = getElem u v mk
where ma = matrizAdyacencia g
n = orden g
mk = foldr (multStd2) (identity n) (take k (repeat ma))
La comprobacioacuten del teorema para k le 6 es
ghcigt quickCheck prop_numeroCaminosMatriz
+++ OK passed 100 tests
prop_numeroCaminosMatriz Grafo Int -gt Gen Bool
prop_numeroCaminosMatriz g = do
k lt- choose (06)
let vs = vertices g
return (and [ numeroCaminosDeLongitud g u v k ==
numeroCaminosDeLongitudM g u v k
|(uv) lt- productoCartesiano vs vs u lt v])
De este teorema se deducen las siguientes propiedades
Teorema 428 Sea G un grafo simple Siguiendo la notacioacuten del teorema anterior se tieneque1 a(2)ii = δ(vi)
2 a(3)ii es el nuacutemero de triaacutengulos que contienen al veacutertice vi
gradoCaminosM Grafo Int -gt Int -gt Int
gradoCaminosM g v = getElem v v m2
where m = matrizAdyacencia g
m2 = multStd2 m m
numeroTriangulosM Grafo Int -gt Int -gt Int
numeroTriangulosM g v = getElem v v (potencia m 3)
where m = matrizAdyacencia g
La comprobacioacuten con QuickCheck es
ghcigt quickCheck prop_GradoCaminosMatriz
+++ OK passed 100 tests
ghcigt quickCheck prop_TriangulosMatriz
+++ OK passed 100 tests
prop_GradoCaminosMatriz Grafo Int -gt Bool
prop_GradoCaminosMatriz g =
and [ grado g v == gradoCaminosM g v | v lt- vertices g]
42 Matrices de adyacencia 115
prop_TriangulosMatriz Property
prop_TriangulosMatriz =
forAll grafoSimple
(g -gt and [length (triangulos g v) ==
numeroTriangulosM g v | v lt- vertices g])
116 Capiacutetulo 4 Matrices asociadas a grafos
Capiacutetulo 5
Apeacutendices
51 Sistemas utilizados
El desarrollo de mi Trabajo de Fin de Grado requeriacutea de una infraestructura teacutecnicaque he tenido que trabajar antes de comenzar a desarrollar el contenido A conti-nuacioacuten voy a nombrar y comentar los sistemas y paquetes que he utilizado a lolargo del proyectobull Ubuntu como sistema operativo El primer paso fue instalar Ubuntu en mi orde-
nador portaacutetil personal Para ello seguiacute las recomendaciones de mi compantildeeroEduardo Paluzo quien ya lo habiacutea hecho antesPrimero me descargueacute la imagen del sistema Ubuntu 1604 LTS (para procesadorde 64 bits) desde la paacutegina de descargas de Ubuntu 1 y tambieacuten la herramientaLinuxLive USB Creator 2 que transformariacutea mi pendrive en una unidad USB Boo-teable cargada con la imagen de Ubuntu Una vez tuve la unidad USB preparadaprocediacute a instalar el nuevo sistema apagueacute el dispositivo y al encenderlo entreacuteen el Boot Menu de la BIOS del portaacutetil para arrancar desde el Pendrive en vez dehacerlo desde el disco duro Automaacuteticamente comenzoacute la instalacioacuten de Ubuntuy solo tuve que seguir las instrucciones del asistente para montar Ubuntu mante-niendo ademaacutes Windows 10 que era el sistema operativo con el que habiacutea estadotrabajando hasta ese momentoEl resultado fue un poco agridulce pues la instalacioacuten de Ubuntu se habiacutea reali-zado con eacutexito sin embargo al intentar arrancar Windows desde la nueva GRUBme daba un error al cargar la imagen del sistema Despueacutes de buscar el error queme apareciacutea en varios foros encontreacute una solucioacuten a mi problema deshabiliteacute elSecurity Boot desde la BIOS y pude volver a arrancar Windows 10 con normali-dad
1httpwwwubuntucomdownloaddesktop2httpwwwlinuxliveusbcom
117
118 Capiacutetulo 5 Apeacutendices
bull LATEX como sistema de composicioacuten de textos La distribucioacuten de LATEXTex Livecomo la mayoriacutea de software que he utilizado la descargueacute utilizando el Gestorde Paquetes Synaptic Anteriormente soacutelo habiacutea utilizado TexMaker como editorde LATEX asiacute que fue el primero que descargueacute Maacutes tarde mi tutor Joseacute Antoniome sugirioacute que mejor descargara el paquete AUCTex pues me permitiriacutea trabajarcon archivos TEX desde el editor Emacs asiacute lo hice y es el que he utilizado pararedactar el trabajo Ademaacutes de los que me recomendaba el gestor solo he tenidoque descargarme el paquete spanish de babel para poder componer el trabajo puesel paquete Tikz que he utilizado para representar los grafos veniacutea incluido en lassugerencias de Synapticbull Haskell como lenguaje de programacioacuten Ya habiacutea trabajado anteriormente con
este lenguaje en el grado y sabiacutea que soacutelo teniacutea que descargarme la plataforma deHaskell y podriacutea trabajar con el editor Emacs Seguiacute las indicaciones que se dan alos estudiantes de primer curso en la paacutegina del Dpto de Ciencias de la Compu-tacioacuten e Inteligencia Artificial 3 y me descargueacute los paquetes haskell-platform yhaskell-mode desde el Gestor de Paquetes Synaptic La versioacuten de la plataforma deHaskell con la que he trabajado es la 2014200debian2 y la del compilador GHC la7103-7bull Dropbox como sistema de almacenamiento compartido Ya habiacutea trabajado con
Dropbox en el pasado asiacute que crear una carpeta compartida con mis tutores nofue ninguacuten problema sin embargo al estar Dropbox sujeto a software no libre nome resultoacute tan sencillo instalarlo en mi nuevo sistema En primer lugar intenteacutehacerlo directamente desde Ubuntu Software que intentoacute instalar Dropbox Nauti-lus y abrioacute dos instalaciones en paralelo Se quedoacute colgado el ordenador asiacute quemateacute los procesos de instalacioacuten activos reinicieacute el sistema y me descargueacute direc-tamente el paquete de instalacioacuten desde la paacutegina de descargas de Dropbox 4 y loejecuteacute desde la terminalbull Git como sistema remoto de control de versiones Era la primera vez que trabaja-
ba con Git y me costoacute bastante adaptarme Mi tutor Joseacute Antonio y mi compantildeeroEduardo Paluzo me ayudaron mucho e hicieron el proceso de adaptacioacuten muchomaacutes aacutegil El manual que Eduardo ha redactado y presenta en su Trabajo Fin deGrado me ha sido muy uacutetil es una pequentildea guiacutea que cualquier interesado en elempleo de Git puede utilizar como introduccioacuten La instalacioacuten no resultoacute com-plicada a traveacutes del Gestor de Paquetes Synaptic me descargueacute el paquete elpa-magity todos los demaacutes paquetes necesarios para trabajar con Git en mi portaacutetil usandoel editor Emacs Eduardo me ayudoacute a crear el repositorio MDenHaskell en la plata-forma GitHub y clonarlo en mi ordenador personal Dicho repositorio contiene el
3httpwwwcsuses~jalonsocursosi1m-15sistemasphp4httpswwwdropboxcomesinstallos=lnx
52 Mapa de decisiones de disentildeo en conjuntos 119
total del trabajo y se almacena de forma puacuteblica La versioacuten de Magit que utilizoes la 250-2
52 Mapa de decisiones de disentildeo en conjuntos
Una vez comenzado el trabajo y habiendo hecho ya varias secciones acerca de laTeoriacutea de Grafos se puso de manifiesto la conveniencia de crear nuevos capiacutetulosintroduciendo conceptos de la Teoriacutea de Conjuntos y las relaciones que se puedenpresentar entre sus elementosHaskell tiene una libreriacutea especiacutefica para conjuntos DataSet sin embargo no estan intuitiva ni tan eficiente como la de listas (DataList) A lo largo del proyecto hecreado un moacutedulo que permite trabajar con conjuntos utilizando tanto su represen-tacioacuten como listas ordenadas sin elementos repetidos como su representacioacuten comolistas sin elementos repetidos Dicho moacutedulo se llama Conjuntos y lo presento en elprimer capiacutetulo del Trabajo
53 Mapa de decisiones de disentildeo en grafos
Al comienzo del proyecto la idea era que las primeras representaciones con lasque trabajara fueran las de grafos como vectores de adyacencia y grafos como matricesde adyacencia que se utilizan en Informaacutetica en el primer curso del Grado con lasque ya habiacutea trabajado y estaba familiarizadaLas definiciones de Informaacutetica estaacuten pensadas para grafos ponderados (dirigidoso no seguacuten se eligiera) mientras que en Matemaacutetica Discreta apenas se usan grafosdirigidos o ponderados por tanto el primer cambio en la representacioacuten utilizadafue simplificar las definiciones de modo que solo trabajaacuteramos con grafos no diri-gidos y no ponderados pero manteniendo las estructuras vectorial y matricial quemanteniacutean la eficienciaLas representaciones que utilizan arrays en Haskell son muy restrictivas pues soloadmiten vectores y matrices que se puedan indexar lo que hace muy complicadostodos los algoritmos que impliquen alguacuten cambio en los veacutertices de los grafos yademaacutes no permite trabajar con todos los tipos de veacutertices que pudieacuteramos desearDecidimos volver a cambiar la representacioacuten y esta vez nos decantamos por larepresentacioacuten de grafos como listas de aristas perdiendo en eficiencia pero ganandomucho en flexibilidad de escrituraPor uacuteltimo mis tutores sugirieron dar una representacioacuten de los grafos mediantesus matrices de adyacencia y comprobar la equivalencia de las definiciones que yahabiacutea hecho en otros moacutedulos con las dadas para esta representacioacuten Para ello he
120 Capiacutetulo 5 Apeacutendices
trabajado con la libreriacutea DataMatrix de Haskell
Bibliografiacutea
[1] J Alonso Temas de programacioacuten funcional Technical report Univ de Sevilla2015
[2] P Burzyn Complejidad computacional en problemas de modificacioacuten de aris-tas en grafos Technical report Univ de Buenos Aires
[3] K Claessen and J Hughes QuickCheckA Lightweight Tool for Random Tes-ting of Haskell Programs Technical report Chalmers University of Technology2000
[4] M Caacuterdenas Matemaacutetica discreta Technical report Univ de Sevilla 2015
[5] D de Matemaacuteticas El regalo de Cantor Technical report IES Matarrantildea deValderrobres 2009
[6] D de Aacutelgebra Aacutelgebra Baacutesica tema 1 Conjuntos Technical report Univ deSevilla 2015
[7] F Franco Aspectos algebraicos en Teoriacutea de Grafos Technical report Univ deSevilla 2016
[8] F Rabhi and G Lapalme Algorithms A functional programming approachAddison-Wesley Longman Publishing Co Inc Boston MA USA 1st edition1999
[9] P Vasconcelos Property Testing using QuickCheck Technical report Univer-sidade do Porto 2016
[10] Wikipedia Set (mathematics) Technical report Wikipedia La Enciclopedialibre 2016
[11] Wikipedia AnexoGaleriacutea de grafos Technical report Wikipedia La Enciclo-pedia libre 2016
[12] Wikipedia Teoriacutea de la complejidad computacional Technical report Wikipe-dia La Enciclopedia libre 2017
121
Iacutendice alfabeacutetico
Grafo 18 52adyacentes 53antiImagenRelacion 38aristaEn 53aristasCamino 88aristas 53automorfismos 87bipartitoCompleto 58biyecciones 47cardinal 22 31centro 103clasesEquivalencia 43combinaciones 25 34complementario 22 31completo 58componentesConexas1 97componentesConexas2 98componentesConexas3 98conjuntosIguales 30conjuntosIguales 21conjuntosVerticesDisjuntos 59conservaAdyacencia 78creaGrafo 52diametro 102distancia 93dominio 38eliminaArista 74eliminaLazos 74eliminaVertice 74elimina 19 28entorno 69esAisladoM 112
esAislado 69esAntisimetrica 41esAutomorfismo 86esBipartito 60esCamino 87esCerrado 94esCircuito 95esCompleto 77esConexo 100esFuncional 39esFuncion 43esGeodesica 94esInyectiva 45esIsomorfismo 81esLazo 69esReflexiva 40esRegular 70esRelacionEquivalencia 42esRelacionHomogenea 39esRelacionOrden 43esRelacion 37esSimetrica 41 111esSimple 70esSobreyectiva 45 46esSubconjuntoPropio 21 30esSubconjunto 20 29esSubgrafoMax 72esSubgrafoPropio 72esSubgrafo 72esTransitiva 41esUnitario 23 32esVacio 18 27
122
Iacutendice alfabeacutetico 123
estaRelacionado 40estanConectados 93excentricidades 102excentricidad 102funciones 44generaGrafo 54gradoM 113 114grado 69grafoAmistad 57grafoCiclo 56grafoCirculante 61grafoComplementario 77grafoEstrella 60grafoHeawood 64grafoMcGee 64grafoMoebiusCantor 67grafoNulo 55grafoPetersenGen 62grafoPetersen 66grafoRueda 61grafoSimple 110grafoThomson 63grafoTutteCoxeter 65grosor 104imagenConjunto 45imagenInversa 47imagenRelacion 38imagen 44imprimeMatriz 110inserta 18 27interseccion 33interseccion 24inversa 47isomorfismos 82isomorfos 82longitudCamino 88matrizAdyacencia 110minimoElemento 19 28morfismos 79
numeroArcosDeLongitud 92numeroCaminosDeLongitud 89numeroCaminosDeLongitugM 113numeroComponentesConexas 99numeroTriangulosM 114orden 68parDeVertices 91pertenece 19 28potencia 111productoCartesiano 34productoCartesiano 25prop_HavelHakimi 73prop_LemaApretonDeManos 73prop_completos 76prop_BipartitoMatriz 113prop_ConectadosRelEqui 97prop_ConexionIsomorfismo1 106prop_ConexionIsomorfismo2 106prop_ConexionIsomorfismo3 107prop_GradoMatriz 114prop_TriangulosMatriz 114prop_esAisladoMatriz 112prop_gradoMatriz 113prop_numeroCaminosMatriz 114prop_simetricaAdyacenciaCompleto 111prop_tamantildeoMatriz 112prop_todosArcosBA 92radio 103rango 38secuenciaGrados 71secuenciaGrafica 71sinRepetidos 19 29sonIncidentes 68sumaArista 75sumaGrafos 76 77sumaVertice 75tamantildeoM 111tamantildeo 68todosArcosBA 91
124 Iacutendice alfabeacutetico
todosArcos 90todosCaminos 88todosCiclos 96triangulos 94unionConjuntos 23 32unionGeneral 24 33vacio 18 27valenciaMax 70valenciaMin 70variaciones 26 35verticesCamino 88vertices 53
2
Esta obra estaacute bajo una licencia ReconocimientondashNoComercialndashCompartirIgual 25 Spainde Creative Commons
Se permitecopiar distribuir y comunicar puacuteblicamente la obrahacer obras derivadas
Bajo las condiciones siguientes
Reconocimiento En cualquier explotacioacuten de la obra autorizada por la licenciaharaacute falta reconocer la autoriacutea
No comercial La explotacioacuten de la obra queda limitada a usos no comerciales
Compartir bajo la misma licencia La explotacioacuten autorizada incluye la creacioacutende obras derivadas siempre que mantengan la misma licencia al ser divulgadas
Esto es un resumen del texto legal (la licencia completa) Para ver una copia de es-ta licencia visite httpcreativecommonsorglicensesby-nc-sa25es o envieuna carta a Creative Commons 559 Nathan Abbott Way Stanford California 94305USA
Iacutendice general
Agradecimientos 7
Abstract 9
Introduccioacuten 11
1 Conjuntos 15
11 El TAD de los conjuntos 16
12 Representaciones de conjuntos 17121 Conjuntos como listas ordenadas sin repeticioacuten 17122 Definicioacuten de conjunto 19123 Subconjuntos 20124 Igualdad de conjuntos 21125 Subconjuntos propios 21126 Complementario de un conjunto 22127 Cardinal de un conjunto 22128 Conjunto unitario 23129 Unioacuten de conjuntos 231210 Interseccioacuten de conjuntos 241211 Producto cartesiano 251212 Combinaciones 251213 Variaciones con repeticioacuten 261214 Conjuntos como listas sin repeticioacuten 261215 Definicioacuten de conjunto 281216 Subconjuntos 291217 Igualdad de conjuntos 301218 Subconjuntos propios 301219 Complementario de un conjunto 311220 Cardinal de un conjunto 311221 Conjunto unitario 321222 Unioacuten de conjuntos 32
3
4 Iacutendice general
1223 Interseccioacuten de conjuntos 331224 Producto cartesiano 341225 Combinaciones 341226 Variaciones con repeticioacuten 35
13 Eleccioacuten de la representacioacuten de conjuntos 35
2 Relaciones y funciones 37
21 Relaciones 37211 Relacioacuten binaria 37212 Imagen por una relacioacuten 37213 Dominio de una relacioacuten 38214 Rango de una relacioacuten 38215 Antiimagen por una relacioacuten 38216 Relacioacuten funcional 39
22 Relaciones homogeacuteneas 39221 Relaciones reflexivas 40222 Relaciones simeacutetricas 40223 Relaciones antisimeacutetricas 41224 Relaciones transitivas 41225 Relaciones de equivalencia 42226 Relaciones de orden 42227 Clases de equivalencia 43
23 Funciones 43231 Imagen por una funcioacuten 44232 Funciones inyectivas 45233 Funciones sobreyectivas 45234 Funciones biyectivas 46235 Inversa de una funcioacuten 47
3 Introduccioacuten a la teoriacutea de grafos 49
31 Definicioacuten de grafo 50
32 El TAD de los grafos 50321 Grafos como listas de aristas 51
33 Generador de grafos 54
34 Ejemplos de grafos 55341 Grafo nulo 55342 Grafo ciclo 56343 Grafo de la amistad 56
Iacutendice general 5
344 Grafo completo 57345 Grafo bipartito 58346 Grafo estrella 60347 Grafo rueda 60348 Grafo circulante 61349 Grafo de Petersen generalizado 623410 Otros grafos importantes 63
35 Definiciones y propiedades 67351 Definiciones de grafos 68352 Propiedades de grafos 73353 Operaciones y propiedades sobre grafos 73
36 Morfismos de grafos 78361 Morfismos 78362 Complejidad del problema de homomorfismo de grafos 80363 Isomorfismos 81364 Automorfismos 86
37 Caminos en grafos 87371 Definicioacuten de camino 87372 Recorridos 89373 Caminos simples 89374 Conexioacuten 93375 Distancia 93376 Caminos cerrados 94377 Circuitos 95378 Ciclos 95379 Grafos aciacuteclicos 96
38 Conectividad de los grafos 97381 Estar conectados por un camino 97382 Componentes conexas de un grafo 97383 Grafos conexos 100384 Excentricidad 102385 Diaacutemetro 102386 Radio 103387 Centro 103388 Grosor 104389 Propiedades e invariantes por isomorfismos 106
6 Iacutendice general
4 Matrices asociadas a grafos 109
41 Generador de grafos simples 109
42 Matrices de adyacencia 110421 Definicioacuten y propiedades 110422 Propiedades baacutesicas de las matrices 111423 Propiedades de las matrices de adyacencia 111424 Caminos y arcos 113
5 Apeacutendices 117
51 Sistemas utilizados 117
52 Mapa de decisiones de disentildeo en conjuntos 119
53 Mapa de decisiones de disentildeo en grafos 119
Bibliografiacutea 121
Indice de definiciones 121
Agradecimientos
Quisiera agradecer a todas las personas que me han apoyado y prestado sus co-nocimientos a lo largo de estos cuatro antildeos del grado Gracias a ellos el esfuerzo hamerecido la pena
En primer lugar me gustariacutea destacar a Mariacutea Joseacute Hidalgo Doblado y Joseacute An-tonio Alonso Jimeacutenez mi tutores en este Trabajo de Fin de Grado Les agradezco detodo corazoacuten la constancia y la atencioacuten que me han brindado a pesar de las dificul-tades que supone realizar el proyecto durante un curso en el que estoy disfrutandola oportunidad de la movilidad internacional Erasmus Son para miacute un referente y unclaro ejemplo de lo que se puede conseguir con esfuerzo y trabajo en equipo
Seguidamente expresar mi gratitud al resto de profesores y trabajadores de la Uni-versidad de Sevilla especialmente a aquellos que se esfuerzan por mejorar la institu-cioacuten diacutea a diacutea
Quiero agradecer tambieacuten este trabajo a mi familia en especial a mis padres que meapoyaron desde el principio cuando tomeacute la decisioacuten de cambiar de carrera y siemprehan intentado brindarnos a mi hermana y a miacute con lo mejor
Finalmente a mis amigos y compantildeeros que han hecho de esta primera etapa uni-versitaria un capiacutetulo de mi vida lleno de bonitos recuerdos En especial a Pedro conquien he tenido la suerte de compartir todo
Muchas gracias a todos
7
8 Iacutendice general
Abstract
Discrete mathematics is characterized as the branch of mathematics dealing withfinite and numerable sets Concepts and notations from discrete mathematics are use-ful in studying and describing objects and real-life problems In particular the graphtheory has numerous applications in logistics
Throughout this project some of the knowlegde adquired from the course ldquoMa-temaacutetica Discretardquo will be given a computational implementation The code will bewritten in Haskell language and a free version of it will be available in GitHub underthe name MDenHaskell The work will focus on the graph theory and will provide so-me examples and algorithms in order to give an introduction of it and how it can beimplemented in Haskell
At first two chapters will be presented as a gentle reminder of basic concepts rela-ted to the set theory and the relations that can be established among them The thirdchapter will introduce the main topic graph theory with different representationsdefinitions and examples on graphs It will go through aspects such as morphismconnectivity and paths in graphs Finally some properties and advantages of workingwith adjacency matrices will be presented in the fourth chapter
This project leaves the door open for the community of programmers to continueand improve it It can be used as a self-learning tool as well as to make calculationsthat by hand would be tedious
9
10 Iacutendice general
Introduccioacuten
El objetivo del trabajo es la implementacioacuten de algoritmos de matemaacutetica discretaen Haskell Los puntos de partida son
los temas de la asignatura ldquoMatemaacutetica discretardquo ([4])los temas de la asignatura ldquoInformaacuteticardquo ([1])el capiacutetulo 7 del libro ldquoAlgorithms A functional programming approachrdquo ([8]) yel artiacuteculo ldquoGraph theoryrdquo ([11]) de la WikipediaHaskell es un lenguaje de programacioacuten funcional desarrollado en los uacuteltimos antildeos
por la comunidad de programadores con la intencioacuten de usarlo como instrumentopara la ensentildeanza de programacioacuten funcional La motivacioacuten de este desarrollo eshacer el anaacutelisis y disentildeo de programas maacutes simple y permitir que los algoritmos seanfaacutecilmente adaptables a otros lenguajes de programacioacuten funcionales
En comparacioacuten con otros lenguajes de programacioacuten imperativos la sintaxis deHaskell permite definir funciones de forma maacutes clara y compacta En Haskell las fun-ciones se consideran valores al mismo nivel que los tipos enteros o cadenas en cual-quier lenguaje Por ello al igual que es habitual que en todos los lenguajes una funcioacutenreciba datos de entrada (de tipo entero flotante cadena etc) y devuelva datos (de losmismos tipos) en los lenguajes funcionales una funcioacuten puede recibir como dato deentrada una funcioacuten y devolver otra funcioacuten como salida que puede ser construida apartir de sus entradas y por operaciones entre funciones como la composicioacuten Estacapacidad nos proporciona meacutetodos maacutes potentes para construir y combinar los di-versos moacutedulos de los que se compone un programa Por ejemplo emulando la formade operar sobre funciones que habitualmente se usa en matemaacuteticas
La matemaacutetica discreta consiste en el estudio de las propiedades de los conjuntosfinitos o infinitos numerables lo que hace posible su directa implementacioacuten compu-tacional En particular la asignatura ldquoMatemaacutetica Discretardquo del grado se centra enestudiar propiedades y algoritmos de la combinatoria y la teoriacutea de grafos A lo largodel trabajo se implementaraacuten en Haskell definiciones y algoritmos con los que ya seha tenido una primera aproximacioacuten teoacuterica durante el grado
Los dos primeros capiacutetulos del trabajo sientan la base que permitiraacute en los dos si-guientes una aproximacioacuten a la teoriacutea de grafos En el primero se hace una introduc-cioacuten a la teoriacutea de conjuntos y se dan dos posibles representaciones de conjuntos con
11
12 Iacutendice general
las que trabajar en Haskell En el segundo se presentan los conceptos de ldquorelacioacutenrdquo yde ldquofuncioacutenrdquo que al igual que los conjuntos son necesarios para definir aplicacionesde los grafos Su redaccioacuten sigue la liacutenea de la primera parte de la asignatura ldquoAacutelgebraBaacutesicardquo del grado
En el tercer capiacutetulo del trabajo se hace una introduccioacuten a la teoriacutea de grafos Enprimer lugar se dan una representacioacuten con la que trabajar en Haskell y un generadorde grafos que permitiraacute comprobar propiedades con QuickCheck Seguidamente sepresenta una galeriacutea de grafos conocidos que se utilizaraacuten como ejemplos para lasdefiniciones y los algoritmos de las secciones siguientes Las primeras seraacuten algunasdeficiones baacutesicas y despueacutes se trataraacuten los conceptos de ldquomorfismosrdquo ldquocaminosrdquo yldquoconectividadrdquo en grafos
Por uacuteltimo en el cuarto capiacutetulo se da una representacioacuten de los grafos a traveacutesde su matriz de adyacencia Se implementaraacuten algunos de los resultados que JavierFranco Galviacuten expuso en su Trabajo Fin de Grado Aspectos algebraicos en teoriacutea de grafosy se comprueba que concuerdan con el desarrollo hecho en el capiacutetulo anterior
Cabe destacar el trabajo con los diferentes sistemas y programas que se han utiliza-do a lo largo del proyecto
Ubuntu como sistema operativoel editor de textos Emacs que ha permitido el uso de Haskell literario para la redaccioacutendel trabajoel paquete de produccioacuten de graacuteficos vectoriales Tikz de LATEX mediante el que seha dado la representacioacuten graacutefica de los ejemplos de grafosGitHub como sistema remoto de control de versionesy DocTest como sistema de validacioacuten de moacutedulosSe va a hacer una breve introduccioacuten los sistemas maacutes destacados
Ubuntu
Ubuntu es un sistema operativo creado a partir de GNULinux con la intencioacuten dehacer una versioacuten de este maacutes sencilla de manejar y que permitiera acceso al soft-ware libre para todo el mundo por igual La primera distribuioacuten oficial de Ubuntufue la versioacuten 410 y tuvo lugar en 2004 Desde entonces el proyecto ha captadola atencioacuten de miles de entusiastas del software libre que han querido unirse a lacomunidad UbuntuSoftware libre significa que los usuarios tienen la libertad de ejecutar copiar distri-buir estudiar modificar y mejorar el software Es una cuestioacuten de libertad no deprecio Para entender el concepto debe pensarse en laquolibreraquo como en laquolibertad deexpresioacutenraquo
Iacutendice general 13
Maacutes precisamente software libre significa que los usuarios de un programa tienenlas cuatro libertades esencialesbull La libertad de ejecutar el programa como lo desee con cualquier propoacutesito (liber-
tad 0)bull La libertad de estudiar el funcionamiento del programa y adaptarlo a sus necesi-
dades (libertad 1) El acceso al coacutedigo fuente es un prerrequisito para estobull La libertad de redistribuir copias para ayudar a los demaacutes (libertad 2)bull La libertad de mejorar el programa y de publicar las mejoras de modo que toda la
comunidad se beneficie (libertad 3) El acceso al coacutedigo fuente es un prerrequisitopara esto
Debido a la evolucioacuten de la tecnologiacutea y del uso de la red estas libertades son ahoraauacuten maacutes importantes que en el pasadoLo que diferencia a Ubuntu de otros sistemas ofrecidos por Linux es que los equiposcomercial y comunitario colaboran juntos en el desarrollo de un uacutenico proyecto Lasnovedades y avances estaacuten libremente a disposicioacuten de todos los usuarios y sonvoluntarios quienes se hacen cargo de los elementos maacutes criacuteticos del trabajoEn la paacutegina web de Ubuntu 1 se puede obtener maacutes informacioacuten acerca del siste-ma y en la paacutegina web de GNU 2 se puede encontrar maacutes informacioacuten acerca delsoftware libre
Haskell literario con Emacs
Haskell es un lenguaje de programacioacuten puramente funcional basado en lambdacalculus 3 Se caracteriza por sus programas concisos un potente sistema de tiposel trabajo con listas funciones recursivas y de orden superior y por tener evaluacioacutenperezosaTener que escribir coacutedigos largos y complicados hace la tarea del programador muycostosa Los lenguajes de programacioacuten funcional como Haskell lo intentan hacenmaacutes sencillo Aunque no se esteacute en la posicioacuten de usar Haskell en un proyecto de-terminado aprender su razonamiento puede ayudar a mejorar en cualquier otrolenguajeA la hora de elaborar la memoria de un proyecto en el que se estaacute utilizando Haskellla posibilidad de escribir coacutedigo y texto en un formato de calidad otorga globali-dad al trabajo El editor Emacs de GNU permite en particular trabajar en paralelocon Haskell y con Latex El trabajar con Haskell literario ha ayudado a detectar ysolventar errores maacutes raacutepido asiacute como a dar una estructura consolidada al trabajo
1httpswwwubuntucom2httpswwwgnuorg3httpsenwikipediaorgwikiLambda_calculus
14 Iacutendice general
En la paacutegina web del Departamento de Computacioacuten 4 se puede encontrar maacutesinformacioacuten acerca de Haskell y Emacs
GitHub
GitHub es una plataforma de desarrollo colaborativo que permite alojar proyectosusando el control de versiones de Git El trabajo con un sistema como este hacemucho maacutes faacutecil el trabajo en grupo pues cada individuo puede trabajar desde suordenador propio en paralelo a los demaacutes y remotamente ir actualizando el proyectosin perder la posibilidad de restaurarlo a una versioacuten anteriorEn particular GitHub ha sido una excelente herramienta de control de este TrabajoFin de Grado pues los tutores han podido seguir en cada momento el trabajo rea-lizado detectar faacutecilmente los errores y hacer modificaciones directamente sobre eldocumentoEl compantildeero Eduardo Paluzo Hidalgo hace en su Trabajo Fin de Grado una pe-quentildea introduccioacuten al uso de Github y a la instalacioacuten de magit en una distribucioacutenUbuntu muy recomendable para todos aquellos (especialmente los maacutes principian-tes) que tengan intereacutes en trabajar con este sistemaSe puede encontrar maacutes informacioacuten acerca de esta plataforma en la paacutegina web deGit 5
DocTest
DocTest para Haskell es un programa de verificacioacuten dinaacutemica de ejemplos Si se si-gue un determinado formato a la hora de escribir los ejemplos para las funciones deun documento en Haskell Doctest se encarga de comprobar que los ejemplos seancorrectos Estas validaciones han resultado claves en la realizacioacuten del trabajo puesalgunas definiciones han sido modificadas de forma casi continua y este proyectoespecialmente se basa en lo anterior para poder seguir construyendoSu uso es muy sencillo una vez instalado el correspondiente paquete y escrito losejemplos en el formato requerido solo hay que ejecutar el programa desde la consoladando como argumento el fichero que se desea validarSe puede enontrar maacutes informaioacuten acerca del programa y de coacutemo descargarlo ensu repositorio de GitHub 6
4httpwwwcsuses~jalonsocursosi1m-16temastema-1html5httpsgit-scmcom6httpsgithubcomsoldoctest
Capiacutetulo 1
Conjuntos
El concepto de conjunto aparece en todos los campos de las Matemaacuteticas pero iquestqueacutedebe entenderse por eacutel La Teoriacutea de conjuntos fue introducida por Georg Cantor(1845-1917) desde 1869 Cantor ejercioacute como profesor en la Universidad de Halley entre 1879 y 1884 publicoacute una serie de seis artiacuteculos en el Mathematische Annalenen los que hizo una introduccioacuten baacutesica a la teoriacutea de conjuntos En su Beitraumlge zurBegruumlndung der transfiniten Mengenlehre Cantor dio la siguiente definicioacuten de con-junto
Figura 11 Fragmento del texto traducido al ingleacutes en el que Cantor da la definicioacuten de conjunto
laquoDebemos entender por ldquoconjuntordquo (Menge) cualquier coleccioacuten vista co-mo un todo (Zusammenfassung zu einem Ganzen) M de objetos separa-dos y bien definidos m de nuestra intuicioacuten o pensamiento Estos objetosson los ldquoelementosrdquo de Mraquo
Felix Hausdorff en 1914 dice laquoun conjunto es una reunioacuten de cosas que constitu-yen una totalidad es decir una nueva cosaraquo y antildeade laquoesto puede difiacutecilmente seruna definicioacuten pero sirve como demostracioacuten expresiva del concepto de conjunto atraveacutes de conjuntos sencillos como el conjunto de habitantes de una ciudad o el deaacutetomos de Hidroacutegeno del SolraquoUn conjunto asiacute definido no tiene que estar compuesto necesariamente de elementoshomogeacuteneos y ademaacutes da lugar a cuestiones filosoacuteficas como si podemos llamar
15
16 Capiacutetulo 1 Conjuntos
conjunto a aquel que no posee ninguacuten elemento Matemaacuteticamente conviene aceptarsolo elementos que compartan alguna propiedad y definir el conjunto vaciacuteo comoaquel que no tiene elemento algunoEl gran meacuterito de Cantor fue considerar conjuntos transfinitos (que tiene infinitoselementos) concepto inaudito hasta avanzado el siglo XIX hablar del cardinal de unconjunto como el nuacutemero de sus elementos y hablar de conjuntos equivalentes cuan-do puede establecerse una biyeccioacuten entre ellos ideas ya apuntadas por Bolzanoquien se centroacute demasiado en el aspecto filosoacutefico sin llegar a formalizar sus ideas
A lo largo de la seccioacuten haremos una pequentildea introduccioacuten a la Teoriacutea de Conjun-tos presentando formalmente sus conceptos maacutes importantes A la hora de elaborarel contenido se han utilizado los siguientes recursos bibliograacuteficosbull el primer tema de la asignatura ldquoAacutelgebra baacutesicardquo ([6])bull los temas de la asignatura ldquoInformaacuteticardquo ([1])bull el artiacuteculo de la Wikipedia ldquoSet (mathematics)rdquo ([10] ylowast el artiacuteculo ldquoEl regalo de Cantorrdquo ([5])
11 El TAD de los conjuntos
En la presente seccioacuten se definen las operaciones baacutesicas necesarias para trabajarcon conjuntos en un lenguaje funcional En nuestro caso el lenguaje que utilizare-mos seraacute Haskell Daremos la signatura del Tipo Abstracto de Dato (TAD) de losconjuntos y daremos algunos ejemplos de posibles representaciones de conjuntoscon las que podriacuteamos trabajarA continuacioacuten presentamos las operaciones definidas en el TAD de los conjuntos
vacio Conj a
inserta Eq a =gt a -gt Conj a -gt Conj a
elimina Eq a =gt a -gt Conj a -gt Conj a
pertenece Eq a =gt Conj a -gt a -gt Bool
esVacio Conj a -gt Bool
minimoElemento Ord a =gt Conj a -gt a
dondebull (vacio) es el conjunto vaciacuteobull (inserta x c) es el conjunto obtenido antildeadiendo el elemento x al conjunto cbull (elimina x c) es el conjunto obtenido eliminando el elemento x del conjunto cbull (pertenece x c) se verifica si x pertenece al conjunto cbull (esVacio c) se verifica si c no tiene ninguacuten elementobull (minimoElemento c) devuelve el miacutenimo elemento del conjunto c
12 Representaciones de conjuntos 17
Hemos de tener en cuenta que a la hora de crear un nuevo tipo de dato con el querepresentar a los conjuntos este debe ser compatible con la entidad matemaacutetica querepresenta
Estas son algunas de las posibles representaciones con las que podriacuteamos trabajarcon conjuntos en Haskellbull En primer lugar podemos trabajar con la libreriacutea DataSet en este caso la imple-
mentacioacuten del tipo de dato Set estaacute basado en aacuterboles binarios balanceadosbull Por otra parte podemos definir un nuevo tipo Cj xs con el que trabajar con con-
juntos como listas no ordenadas con duplicados como listas no ordenadas sinduplicados o como listas ordenadas sin duplicadosbull Otra opcioacuten seriacutea trabajar directamente con conjuntos como listas para ello de-
bemos ignorar las repeticiones y el orden con vista a la igualdad de conjuntosbull Los conjuntos que soacutelo contienen nuacutemeros (de tipo Int) entre 0 y nminus 1 se pueden
representar como nuacutemeros binarios con n bits donde el bit i(0 le i lt n) es 1 syssel nuacutemero i pertenece al conjunto
Nota 111 Las funciones que aparecen en la especificacioacuten del TAD no dependende la representacioacuten que elijamos
12 Representaciones de conjuntos
121 Conjuntos como listas ordenadas sin repeticioacuten
En el moacutedulo ConjuntosConListasOrdenadasSinRepeticion se definen las funcio-nes del TAD de los conjuntos dando su representacioacuten como listas ordenadas sinrepeticioacuten
module ConjuntosConListasOrdenadasSinRepeticion
( Conj
vacio
inserta
listaAConjunto
elimina
pertenece
esVacio
minimoElemento
sinRepetidos
esUnitario
esSubconjunto
conjuntosIguales
esSubconjuntoPropio
complementario
18 Capiacutetulo 1 Conjuntos
cardinal
unionConjuntos
unionGeneral
interseccion
productoCartesiano
combinaciones
variacionesR
) where
En las definiciones del presente moacutedulo se usaraacuten algunas funciones de la libreriacuteaDataList
Vamos a definir un nuevo tipo de dato (Conj a) que representa a los conjuntoscomo listas ordenadas sin repeticioacuten
type Conj a = [a]
Las funciones baacutesicas que definiremos a partir de este tipo coincidiraacuten con las indi-cadas en el TAD de los conjuntosbull (vacio) es el conjunto vaciacuteo
-- | Ejemplo
-- gtgtgt vacio
-- []
vacio Conj a
vacio = []
bull (inserta x c) es el conjunto obtenido antildeadiendo el elemento x al conjunto c
-- | Ejemplo
-- gtgtgt inserta 5 vacio
-- [5]
-- gtgtgt foldr inserta vacio [2211242]
-- [124]
inserta Ord a =gt a -gt Conj a -gt Conj a
inserta x [] = [x]
inserta x ys
| pertenece ys x = ys
| otherwise = insert x ys
bull (listaAConjunto xs) devuelve el conjunto cuyos elementos son los de la lista xs
-- | Ejemplo
-- gtgtgt listaAConjunto [2211242]
-- [124]
listaAConjunto Ord a =gt [a] -gt Conj a
listaAConjunto = sort nub
bull (esVacio c) se verifica si c es el conjunto vaciacuteo
12 Representaciones de conjuntos 19
-- | Ejemplos
-- gtgtgt esVacio (listaAConjunto [25137532190])
-- False
-- gtgtgt esVacio vacio
-- True
esVacio Conj a -gt Bool
esVacio = null
bull (pertenece x c) se verifica si x es un elemento del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt pertenece c1 3
-- True
-- gtgtgt pertenece c1 4
-- False
pertenece Ord a =gt Conj a -gt a -gt Bool
pertenece ys x =
x == head (dropWhile (ltx) ys)
bull (elimina x c) es el conjunto obtenido eliminando el elemento x del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt elimina 3 c1
-- [012579]
-- gtgtgt elimina 4 c1
-- [0123579]
elimina Ord a =gt a -gt Conj a -gt Conj a
elimina x ys = us ++ dropWhile (==x) vs
where (usvs) = span (ltx) ys
bull (minimoElemento c) devuelve el miacutenimo elemento del conjunto c
-- | Ejemplos
-- gtgtgt minimoElemento (listaAConjunto [25137532190])
-- 0
-- gtgtgt minimoElemento (listaAConjunto ([ae] ++ [AE]))
-- A
minimoElemento Ord a =gt Conj a -gt a
minimoElemento = head
122 Definicioacuten de conjunto
Nota 121 Al trabajar con la representacioacuten de conjuntos como listas en Haskellhemos de cuidar que los ejemplos con los que trabajemos no tengan elementos re-petidos La funcioacuten (sinRepetidos xs) se verifica si la lista xs no tiene ninguacuten ele-mento repetido
20 Capiacutetulo 1 Conjuntos
-- | Ejemplos
-- gtgtgt sinRepetidos []
-- True
-- gtgtgt sinRepetidos [1231]
-- False
sinRepetidos Eq a =gt [a] -gt Bool
sinRepetidos xs = nub xs == xs
Los conjuntos pueden definirse de manera expliacutecita citando todos sus elementosentre llaves de manera impliacutecita dando una o varias caracteriacutesticas que determi-nen si un objeto dado estaacute o no en el conjunto Por ejemplo los conjuntos 1 2 3 4y x isinN|1 le x le 4 son el mismo definido de forma explicita e impliacutecita respecti-vamente
Nota 122 La definicioacuten impliacutecita es necesaria cuando el conjunto en cuestioacuten tieneuna cantidad infinita de elementos En general los conjuntos se notaraacuten con letrasmayuacutesculas A B y los elementos con letras minuacutesculas a b
Cuando trabajamos con conjuntos concretos siempre existe un contexto donde esosconjuntos existen Por ejemplo si A = minus1 1 2 3 4 5 y B = x|x isin Nes par elcontexto donde podemos considerar A y B es el conjunto de los nuacutemeros enterosZ En general a este conjunto se le denomina conjunto universal De una forma algomaacutes precisa podemos dar la siguiente definicioacuten
Definicioacuten 121 El conjunto universal que notaremos por U es un conjunto del queson subconjuntos todos los posibles conjuntos que originan el problema que tratamos
123 Subconjuntos
Definicioacuten 122 Dados dos conjuntos A y B si todo elemento de A es a su vez elementode B diremos que A es un subconjunto de B y lo notaremos A sube B En caso contrario senotaraacute A 6sube B
La funcioacuten (esSubconjunto c1 c2) se verifica si c1 es un subconjunto de c2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
-- gtgtgt c1 `esSubconjunto` c2
-- True
-- gtgtgt c1 `esSubconjunto` vacio
-- False
-- gtgtgt vacio `esSubconjunto` c2
12 Representaciones de conjuntos 21
-- True
-- gtgtgt c3 `esSubconjunto` c4
-- True
-- gtgtgt c2 `esSubconjunto` c1
-- False
esSubconjunto Ord a =gt Conj a -gt Conj a -gt Bool
esSubconjunto [] _ = True
esSubconjunto (xxs) ys =
x == head vs ampamp esSubconjunto xs (tail vs)
where (usvs) = span (ltx) ys
124 Igualdad de conjuntos
Definicioacuten 123 Dados dos conjuntos A y B diremos que son iguales si tienen los mismoselementos es decir si se verifica que A sube B y B sube A Lo notaremos A = B
La funcioacuten (conjuntosIguales c1 c2) se verifica si los conjuntos xs y ys son igua-les
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
-- gtgtgt let c5 = listaAConjunto [4444442]
-- gtgtgt conjuntosIguales c1 c2
-- False
-- gtgtgt conjuntosIguales c3 c4
-- True
-- gtgtgt conjuntosIguales c1 c5
-- True
conjuntosIguales Ord a =gt Conj a -gt Conj a -gt Bool
conjuntosIguales = (==)
125 Subconjuntos propios
Definicioacuten 124 Los subconjuntos de A distintos del empty y del mismo A se denominansubconjuntos propios de A
La funcioacuten (esSubconjuntoPropio c1 c2) se verifica si c1 es un subconjunto pro-pio de c2
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt esSubconjuntoPropio u u
22 Capiacutetulo 1 Conjuntos
-- False
-- gtgtgt esSubconjuntoPropio c1 u
-- True
esSubconjuntoPropio Ord a =gt Conj a -gt Conj a -gt Bool
esSubconjuntoPropio c1 c2 =
not (null c1) ampamp esSubconjunto c1 c2 ampamp c1 = c2
126 Complementario de un conjunto
Definicioacuten 125 Dado un conjunto A se define el complementario de A que notaremospor A como
A = x|x isin U x 6isin A
La funcioacuten (complementario u c) devuelve el complementario del conjunto c y enel universo u
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt let c2 = listaAConjunto [14689]
-- gtgtgt complementario u c1
-- [14689]
-- gtgtgt complementario u u
-- []
-- gtgtgt complementario u vacio
-- [123456789]
-- gtgtgt complementario u c2
-- [2357]
complementario Ord a =gt Conj a -gt Conj a -gt Conj a
complementario [] _ = []
complementario xs [] = xs
complementario (xxs) (yys)
| x lt y = x complementario xs (yys)
| otherwise = complementario xs ys
127 Cardinal de un conjunto
Definicioacuten 126 Dado un conjunto finito A denominaremos cardinal de A al nuacutemero deelementos que tiene y lo notaremos |A|
La funcioacuten (cardinal xs) devuelve el cardinal del conjunto xs
-- | Ejemplos
-- gtgtgt cardinal vacio
-- 0
-- gtgtgt cardinal (listaAConjunto [110])
12 Representaciones de conjuntos 23
-- 10
-- gtgtgt cardinal (listaAConjunto chocolate)
-- 7
cardinal Ord a =gt Conj a -gt Int
cardinal = length
128 Conjunto unitario
Definicioacuten 127 Un conjunto con un uacutenico elemento se denomina unitario
Nota 123 Notemos que si X = x es un conjunto unitario debemos distinguirentre el conjunto X y el elemento x
La funcioacuten (esUnitario c) se verifica si el conjunto c es unitario
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto (take 10 (repeat 5))
-- gtgtgt let c2 = listaAConjunto valverde
-- gtgtgt let c3 = listaAConjunto coco
-- gtgtgt esUnitario c1
-- True
-- gtgtgt esUnitario c2
-- False
-- gtgtgt esUnitario c2
-- False
esUnitario Ord a =gt Conj a -gt Bool
esUnitario c =
c == take 1 c
129 Unioacuten de conjuntos
Definicioacuten 128 Dados dos conjuntos A y B se define la unioacuten de A y B notado A cup Bcomo el conjunto formado por aquellos elementos que pertenecen al menos a uno de los dosconjuntos A oacute B es decir
A cup B = x | x isin A or x isin B
La funcioacuten (unionConjuntos c1 c2) devuelve la unioacuten de los conjuntos xs y ys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [139]
-- gtgtgt let c2 = listaAConjunto [249]
-- gtgtgt unionConjuntos c1 c2
-- [123456789]
unionConjuntos Ord a =gt Conj a -gt Conj a -gt Conj a
unionConjuntos [] [] = []
24 Capiacutetulo 1 Conjuntos
unionConjuntos [] ys = ys
unionConjuntos xs [] = xs
unionConjuntos (xxs) (yys)
| x lt y = x unionConjuntos xs (yys)
| x == y = x unionConjuntos xs ys
| otherwise = y unionConjuntos (xxs) ys
Definicioacuten 129 Dada una familia de conjuntos Ai con i isin I se define la unioacuten ge-neral de los conjuntos Ai notado
⋃iisinI Ai como el conjunto formado por aquellos elementos
que pertenecen al menos a uno de los conjuntos de la familia es decir
⋃iisinI
Ai = x | x isin Ai foralli isin I
La funcioacuten (unionGeneral xss) devuelve la unioacuten general de la familia de conjun-tos de la lista xss
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1415]
-- gtgtgt let c2 = listaAConjunto [2515]
-- gtgtgt let c3 = listaAConjunto [3615]
-- gtgtgt unionGeneral [c1c2c3]
-- [123456789101112131415]
unionGeneral Ord a =gt [Conj a] -gt Conj a
unionGeneral = foldr unionConjuntos vacio
1210 Interseccioacuten de conjuntos
Definicioacuten 1210 Dados dos conjuntos A y B se define la interseccioacuten de A y B notadoA cap B como el conjunto formado por aquellos elementos que pertenecen a cada uno de losdos conjuntos A y B es decir
A cap B = x | x isin A and x isin B
La funcioacuten (interseccion c1 c2) devuelve la interseccioacuten de los conjuntos c1 yc2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1320]
-- gtgtgt let c2 = listaAConjunto [2420]
-- gtgtgt let c3 = listaAConjunto [2430]
-- gtgtgt let c4 = listaAConjunto [4830]
-- gtgtgt interseccion c1 c2
-- []
-- gtgtgt interseccion c3 c4
12 Representaciones de conjuntos 25
-- [481216202428]
interseccion Ord a =gt Conj a -gt Conj a -gt Conj a
interseccion (xxs) (yys)
| x lt y = interseccion xs (yys)
| x gt y = interseccion (xxs) ys
| otherwise = x interseccion xs ys
interseccion _ _ = []
1211 Producto cartesiano
Definicioacuten 1211 El producto cartesiano 1 de dos conjuntos A y B es una operacioacutensobre ellos que resulta en un nuevo conjunto Atimes B que contiene a todos los pares ordenadostales que la primera componente pertenece a A y la segunda pertenece a B es decir
Atimes B = (a b) | a isin A b isin B
La funcioacuten (productoCartesiano c1 c2) devuelve el producto cartesiano de xs eys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [31]
-- gtgtgt let c2 = listaAConjunto [247]
-- gtgtgt productoCartesiano c1 c2
-- [(12)(14)(17)(32)(34)(37)]
-- gtgtgt productoCartesiano c2 c1
-- [(21)(23)(41)(43)(71)(73)]
productoCartesiano (Ord a Ord b) =gt Conj a -gt Conj b -gt Conj (ab)
productoCartesiano xs ys=
listaAConjunto [(xy) | x lt- xs y lt- ys]
1212 Combinaciones
Definicioacuten 1212 Las combinaciones de un conjunto S tomados en grupos de n son todoslos subconjuntos de S con n elementos
La funcioacuten (combinaciones n xs) devuelve las combinaciones de los elementos dexs en listas de n elementos
-- | Ejemplos
-- gtgtgt combinaciones 3 [ad]
-- [abcabdacdbcd]
-- gtgtgt combinaciones 2 [248]
-- [[24][26][28][46][48][68]]
1httpsenwikipediaorgwikiCartesian_product
26 Capiacutetulo 1 Conjuntos
combinaciones Integer -gt [a] -gt [[a]]
combinaciones 0 _ = [[]]
combinaciones _ [] = []
combinaciones k (xxs) =
[xys | ys lt- combinaciones (k-1) xs] ++ combinaciones k xs
1213 Variaciones con repeticioacuten
Definicioacuten 1213 Las variaciones con repeticioacuten de m elementos tomados en grupos den es el nuacutemero de diferentes nndashtuplas de un conjunto de m elementos
La funcioacuten (variacionesR n xs) devuelve las variaciones con con repeticioacuten de loselementos de xs en listas de n elementos
-- | Ejemplos
-- gtgtgt variacionesR 3 [ab]
-- [aaaaababaabbbaababbbabbb]
-- gtgtgt variacionesR 2 [235]
-- [[22][23][25][32][33][35][52][53][55]]
variacionesR Int -gt [a] -gt [[a]]
variacionesR _ [] = [[]]
variacionesR 0 _ = [[]]
variacionesR k us =
[uvs | u lt- us vs lt- variacionesR (k-1) us]
1214 Conjuntos como listas sin repeticioacuten
En el moacutedulo ConjuntosConListas se definen las funciones del TAD de los conjun-tos dando su representacioacuten como listas sin elementos repetidos
module ConjuntosConListas
( Conj
vacio
inserta
listaAConjunto
elimina
pertenece
esVacio
minimoElemento
sinRepetidos
esUnitario
esSubconjunto
conjuntosIguales
esSubconjuntoPropio
complementario
cardinal
12 Representaciones de conjuntos 27
unionConjuntos
unionGeneral
interseccion
productoCartesiano
combinaciones
variacionesR
) where
En las definiciones del presente moacutedulo se usaraacuten algunas funciones de la libreriacuteaDataList
Vamos a definir un nuevo tipo de dato (Conj a) que representa a los conjuntoscomo listas sin elementos repetidos
type Conj a = [a]
Las funciones baacutesicas que definiremos a partir de este tipo coincidiraacuten con las indi-cadas en el TAD de los conjuntosbull (vacio) es el conjunto vaciacuteo
-- | Ejemplo
-- gtgtgt vacio
-- []
vacio Conj a
vacio = []
bull (inserta x c) es el conjunto obtenido antildeadiendo el elemento x al conjunto c
-- | Ejemplo
-- gtgtgt inserta 5 vacio
-- [5]
-- gtgtgt foldr inserta vacio [2211242]
-- [142]
inserta Eq a =gt a -gt Conj a -gt Conj a
inserta x [] = [x]
inserta x ys | elem x ys = ys
| otherwise = xys
bull (listaAConjunto xs) devuelve el conjunto cuyos elementos son los de la lista xs
-- | Ejemplo
-- gtgtgt listaAConjunto [2211242]
-- [214]
listaAConjunto Eq a =gt [a] -gt Conj a
listaAConjunto = nub
bull (esVacio c) se verifica si c es el conjunto vaciacuteo
-- | Ejemplos
-- gtgtgt esVacio (listaAConjunto [25137532190])
-- False
28 Capiacutetulo 1 Conjuntos
-- gtgtgt esVacio vacio
-- True
esVacio Conj a -gt Bool
esVacio = null
bull (pertenece x c) se verifica si x es un elemento del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt pertenece 3 c1
-- True
-- gtgtgt pertenece 4 c1
-- False
pertenece Eq a =gt a -gt Conj a -gt Bool
pertenece = elem
bull (elimina x c) es el conjunto obtenido eliminando el elemento x del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt elimina 3 c1
-- [251790]
-- gtgtgt elimina 4 c1
-- [2513790]
elimina Eq a =gt a -gt Conj a -gt Conj a
elimina = delete
bull (minimoElemento c) devuelve el miacutenimo elemento del conjunto c
-- | Ejemplos
-- gtgtgt minimoElemento (listaAConjunto [25137532190])
-- 0
-- gtgtgt minimoElemento (listaAConjunto ([ae] ++ [AE]))
-- A
minimoElemento Ord a =gt Conj a -gt a
minimoElemento = minimum
1215 Definicioacuten de conjunto
Definicioacuten 1214 Llamaremos conjunto a una coleccioacuten de objetos que llamaremos ele-mentos distintos entre siacute y que comparten una propiedad Para que un conjunto esteacute biendefinido debe ser posible discernir si un objeto arbitrario estaacute o no en eacutel
Si el elemento a pertenece al conjunto A escribiremos a isin A En caso contrarioescribiremos a 6isin A
Nota 124 En Haskell para poder discernir si un objeto arbitrario pertenece a unconjunto se necesita que su tipo pertenezca a la clase Eq
12 Representaciones de conjuntos 29
Nota 125 Al trabajar con la representacioacuten de conjuntos como listas en Haskellhemos de cuidar que los ejemplos con los que trabajemos no tengan elementos re-petidos La funcioacuten (sinRepetidos xs) se verifica si la lista xs no tiene ninguacuten ele-mento repetido
-- | Ejemplos
-- gtgtgt sinRepetidos []
-- True
-- gtgtgt sinRepetidos [1231]
-- False
sinRepetidos Eq a =gt [a] -gt Bool
sinRepetidos xs = nub xs == xs
Los conjuntos pueden definirse de manera expliacutecita citando todos sus elementosentre llaves de manera impliacutecita dando una o varias caracteriacutesticas que determi-nen si un objeto dado estaacute o no en el conjunto Por ejemplo los conjuntos 1 2 3 4y x isinN|1 le x le 4 son el mismo definido de forma explicita e impliacutecita respecti-vamente
Nota 126 La definicioacuten impliacutecita es necesaria cuando el conjunto en cuestioacuten tieneuna cantidad infinita de elementos En general los conjuntos se notaraacuten con letrasmayuacutesculas A B y los elementos con letras minuacutesculas a b
Cuando trabajamos con conjuntos concretos siempre existe un contexto donde esosconjuntos existen Por ejemplo si A = minus1 1 2 3 4 5 y B = x|x isin Nes par elcontexto donde podemos considerar A y B es el conjunto de los nuacutemeros enterosZ En general a este conjunto se le denomina conjunto universal De una forma algomaacutes precisa podemos dar la siguiente definicioacuten
Definicioacuten 1215 El conjunto universal que notaremos por U es un conjunto del queson subconjuntos todos los posibles conjuntos que originan el problema que tratamos
1216 Subconjuntos
Definicioacuten 1216 Dados dos conjuntos A y B si todo elemento de A es a su vez elementode B diremos que A es un subconjunto de B y lo notaremos A sube B En caso contrario senotaraacute A 6sube B
La funcioacuten (esSubconjunto c1 c2) se verifica si c1 es un subconjunto de c2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
30 Capiacutetulo 1 Conjuntos
-- gtgtgt c1 `esSubconjunto` c2
-- True
-- gtgtgt c1 `esSubconjunto` vacio
-- False
-- gtgtgt vacio `esSubconjunto` c2
-- True
-- gtgtgt c3 `esSubconjunto` c4
-- True
-- gtgtgt c2 `esSubconjunto` c1
-- False
esSubconjunto Eq a =gt [a] -gt [a] -gt Bool
esSubconjunto c1 c2 = all (`elem` c2) c1
1217 Igualdad de conjuntos
Definicioacuten 1217 Dados dos conjuntos A y B diremos que son iguales si tienen losmismos elementos es decir si se verifica que A sube B y B sube A Lo notaremos A = B
La funcioacuten (conjuntosIguales c1 c2) se verifica si los conjuntos xs y ys son igua-les
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
-- gtgtgt let c5 = listaAConjunto [4444442]
-- gtgtgt conjuntosIguales c1 c2
-- False
-- gtgtgt conjuntosIguales c3 c4
-- True
-- gtgtgt conjuntosIguales c1 c5
-- True
conjuntosIguales Eq a =gt [a] -gt [a] -gt Bool
conjuntosIguales c1 c2 =
esSubconjunto c1 c2 ampamp esSubconjunto c2 c1
1218 Subconjuntos propios
Definicioacuten 1218 Los subconjuntos de A distintos del empty y del mismo A se denominansubconjuntos propios de A
La funcioacuten (esSubconjuntoPropio c1 c2) se verifica si c1 es un subconjunto pro-pio de c2
12 Representaciones de conjuntos 31
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt esSubconjuntoPropio u u
-- False
-- gtgtgt esSubconjuntoPropio c1 u
-- True
esSubconjuntoPropio Eq a =gt [a] -gt [a] -gt Bool
esSubconjuntoPropio c1 c2
| null c1 = False
| conjuntosIguales c1 c2 = False
| otherwise = esSubconjunto c1 c2
1219 Complementario de un conjunto
Definicioacuten 1219 Dado un conjunto A se define el complementario de A que notaremospor A como
A = x|x isin U x 6isin A
La funcioacuten (complementario u c) devuelve el complementario del conjunto c y enel universo u
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt let c2 = listaAConjunto [14689]
-- gtgtgt complementario u c1
-- [14689]
-- gtgtgt complementario u u
-- []
-- gtgtgt complementario u vacio
-- [123456789]
-- gtgtgt complementario u c2
-- [2357]
complementario Eq a =gt [a] -gt [a] -gt [a]
complementario = ()
1220 Cardinal de un conjunto
Definicioacuten 1220 Dado un conjunto finito A denominaremos cardinal de A al nuacutemerode elementos que tiene y lo notaremos |A|
La funcioacuten (cardinal xs) devuelve el cardinal del conjunto xs
32 Capiacutetulo 1 Conjuntos
-- | Ejemplos
-- gtgtgt cardinal vacio
-- 0
-- gtgtgt cardinal (listaAConjunto [110])
-- 10
-- gtgtgt cardinal (listaAConjunto chocolate)
-- 7
cardinal [a] -gt Int
cardinal = length
1221 Conjunto unitario
Definicioacuten 1221 Un conjunto con un uacutenico elemento se denomina unitario
Nota 127 Notemos que si X = x es un conjunto unitario debemos distinguirentre el conjunto X y el elemento x
La funcioacuten (esUnitario c) se verifica si el conjunto c es unitario
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto (take 10 (repeat 5))
-- gtgtgt let c2 = listaAConjunto valverde
-- gtgtgt let c3 = listaAConjunto coco
-- gtgtgt esUnitario c1
-- True
-- gtgtgt esUnitario c2
-- False
-- gtgtgt esUnitario c2
-- False
esUnitario Eq a =gt [a] -gt Bool
esUnitario c = c == take 1 c
1222 Unioacuten de conjuntos
Definicioacuten 1222 Dados dos conjuntos A y B se define la unioacuten de A y B notado A cup Bcomo el conjunto formado por aquellos elementos que pertenecen al menos a uno de los dosconjuntos A oacute B es decir
A cup B = x | x isin A or x isin B
La funcioacuten (unionConjuntos c1 c2) devuelve la unioacuten de los conjuntos xs y ys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [139]
-- gtgtgt let c2 = listaAConjunto [249]
12 Representaciones de conjuntos 33
-- gtgtgt unionConjuntos c1 c2
-- [135792468]
unionConjuntos Eq a =gt [a] -gt [a] -gt [a]
unionConjuntos = union
Definicioacuten 1223 Dada una familia de conjuntos Ai con i isin I se define la unioacuten ge-neral de los conjuntos Ai notado
⋃iisinI Ai como el conjunto formado por aquellos elementos
que pertenecen al menos a uno de los conjuntos de la familia es decir
⋃iisinI
Ai = x | x isin Ai foralli isin I
La funcioacuten (unionGeneral xss) devuelve la unioacuten general de la familia de conjun-tos de la lista xss
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1415]
-- gtgtgt let c2 = listaAConjunto [2515]
-- gtgtgt let c3 = listaAConjunto [3615]
-- gtgtgt unionGeneral [c1c2c3]
-- [147101325811143691215]
unionGeneral Eq a =gt [[a]] -gt [a]
unionGeneral = foldr unionConjuntos []
1223 Interseccioacuten de conjuntos
Definicioacuten 1224 Dados dos conjuntos A y B se define la interseccioacuten de A y B notadoA cap B como el conjunto formado por aquellos elementos que pertenecen a cada uno de losdos conjuntos A y B es decir
A cap B = x | x isin A and x isin B
La funcioacuten (interseccion c1 c2) devuelve la interseccioacuten de los conjuntos c1 yc2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1320]
-- gtgtgt let c2 = listaAConjunto [2420]
-- gtgtgt let c3 = listaAConjunto [2430]
-- gtgtgt let c4 = listaAConjunto [4830]
-- gtgtgt interseccion c1 c2
-- []
-- gtgtgt interseccion c3 c4
-- [481216202428]
34 Capiacutetulo 1 Conjuntos
interseccion Eq a =gt [a] -gt [a] -gt [a]
interseccion = intersect
1224 Producto cartesiano
Definicioacuten 1225 El producto cartesiano 2 de dos conjuntos A y B es una operacioacutensobre ellos que resulta en un nuevo conjunto Atimes B que contiene a todos los pares ordenadostales que la primera componente pertenece a A y la segunda pertenece a B es decir
Atimes B = (a b) | a isin A b isin B
La funcioacuten (productoCartesiano c1 c2) devuelve el producto cartesiano de xs eys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [31]
-- gtgtgt let c2 = listaAConjunto [247]
-- gtgtgt productoCartesiano c1 c2
-- [(32)(34)(37)(12)(14)(17)]
-- gtgtgt productoCartesiano c2 c1
-- [(23)(21)(43)(41)(73)(71)]
productoCartesiano [a] -gt [b] -gt [(ab)]
productoCartesiano xs ys = [ (xy) | x lt- xs y lt- ys]
1225 Combinaciones
Definicioacuten 1226 Las combinaciones de un conjunto S tomados en grupos de n son todoslos subconjuntos de S con n elementos
La funcioacuten (combinaciones n xs) devuelve las combinaciones de los elementos dexs en listas de n elementos
-- | Ejemplos
-- gtgtgt combinaciones 3 [ad]
-- [abcabdacdbcd]
-- gtgtgt combinaciones 2 [248]
-- [[24][26][28][46][48][68]]
combinaciones Integer -gt [a] -gt [[a]]
combinaciones 0 _ = [[]]
combinaciones _ [] = []
combinaciones k (xxs) =
[xys | ys lt- combinaciones (k-1) xs] ++ combinaciones k xs
2httpsenwikipediaorgwikiCartesian_product
13 Eleccioacuten de la representacioacuten de conjuntos 35
1226 Variaciones con repeticioacuten
Definicioacuten 1227 Las variaciones con repeticioacuten de m elementos tomados en grupos den es el nuacutemero de diferentes nndashtuplas de un conjunto de m elementos
La funcioacuten (variacionesR n xs) devuelve las variaciones con con repeticioacuten de loselementos de xs en listas de n elementos
-- | Ejemplos
-- gtgtgt variacionesR 3 [ab]
-- [aaaaababaabbbaababbbabbb]
-- gtgtgt variacionesR 2 [235]
-- [[22][23][25][32][33][35][52][53][55]]
variacionesR Int -gt [a] -gt [[a]]
variacionesR _ [] = [[]]
variacionesR 0 _ = [[]]
variacionesR k us =
[uvs | u lt- us vs lt- variacionesR (k-1) us]
13 Eleccioacuten de la representacioacuten de conjuntos
Nota 131 En el moacutedulo Conjuntos se elige la representacioacuten de conjunto con la quese trabajaraacute
-- Seleccionar para trabajar con los conjuntos como listas sin
-- elementos repetidos
module Conjuntos
(module ConjuntosConListas)
where
import ConjuntosConListas
-- Seleccionar para trabajar con los conjuntos como listas ordenadas
-- sin elementos repetidos
-- module Conjuntos
-- (module ConjuntosConListasOrdenadasSinRepeticion)
-- where
-- import ConjuntosConListasOrdenadasSinRepeticion
36 Capiacutetulo 1 Conjuntos
Capiacutetulo 2
Relaciones y funciones
21 Relaciones
Las relaciones que existen entre personas nuacutemeros conjuntos y muchas otras enti-dades pueden formalizarse en la idea de relacioacuten binaria En esta seccioacuten se define ydesarrolla este concepto particularizando en el caso de las relaciones homogeacuteneasy en el de las funciones
211 Relacioacuten binaria
Definicioacuten 211 Una relacioacuten binaria 1 (o correspondencia) entre dos conjuntos A yB es un subconjunto del producto cartesiano Atimes B
La funcioacuten (esRelacion xs ys r) se verifica si r es una relacioacuten binaria de xs enys Por ejemplo
-- | Ejemplos
-- gtgtgt esRelacion [31] [247] [(12)(34)]
-- True
-- gtgtgt esRelacion [31] [247] [(12)(31)]
-- False
esRelacion (Ord a Ord b) =gt [a] -gt [b] -gt [(ab)] -gt Bool
esRelacion xs ys r =
r `esSubconjunto` productoCartesiano xs ys
212 Imagen por una relacioacuten
Definicioacuten 212 Si R es una relacioacuten binaria la imagen del elemento x en la relacioacuten Res el conjunto de los valores correspondientes a x en R
1httpsenwikipediaorgwikiBinary_relation
37
38 Capiacutetulo 2 Relaciones y funciones
La funcioacuten (imagenRelacion r x) es la imagen de x en la relacioacuten r
-- | Ejemplos
-- gtgtgt imagenRelacion [(13)(25)(14)] 1
-- [34]
-- gtgtgt imagenRelacion [(13)(25)(14)] 2
-- [5]
-- gtgtgt imagenRelacion [(13)(25)(14)] 3
-- []
imagenRelacion (Ord a Ord b) =gt [(ab)] -gt a -gt [b]
imagenRelacion r x =
nub [y | (zy) lt- r z == x]
213 Dominio de una relacioacuten
Definicioacuten 213 Dada una relacioacuten binaria R su dominio es el conjunto que contiene atodos los valores que se toman en la relacioacuten R
La funcioacuten (dominio r) devuelve el dominio de la relacioacuten r
-- | Ejemplo
-- gtgtgt dominio [(32)(51)(34)]
-- [35]
dominio Ord a =gt [(ab)] -gt [a]
dominio r = listaAConjunto (map fst r)
214 Rango de una relacioacuten
Definicioacuten 214 El rango de una relacioacuten binaria R es el conjunto de las imaacutegenes demediante R
La funcioacuten (rango r) devuelve el rango de la relacioacuten binaria r
-- | Ejemplo
-- gtgtgt rango [(32)(52)(34)]
-- [24]
rango Ord b =gt [(ab)] -gt [b]
rango r = listaAConjunto (map snd r)
215 Antiimagen por una relacioacuten
Definicioacuten 215 La antiimagen del elemento y por una relacioacuten r es el conjunto de loselementos cuya imagen es y
La (antiImagenRelacion r y) es la antiimagen del elemento y en la relacioacuten bina-ria r
22 Relaciones homogeacuteneas 39
-- | Ejemplo
-- gtgtgt antiImagenRelacion [(13)(23)(74)] 3
-- [12]
antiImagenRelacion (Ord a Ord b) =gt [(ab)] -gt b -gt [a]
antiImagenRelacion r y =
nub [x | (xz) lt- r z == y]
216 Relacioacuten funcional
Definicioacuten 216 Dada una relacioacuten binaria R se dice funcional si todos los elementos desu dominio tienen una uacutenica imagen en R
La funcioacuten (esFuncional r) se verifica si la relacioacuten r es funcional
-- | Ejemplos
-- gtgtgt esFuncional [(32)(51)(79)]
-- True
-- gtgtgt esFuncional [(32)(51)(34)]
-- False
-- gtgtgt esFuncional [(32)(51)(32)]
-- True
esFuncional (Ord a Ord b) =gt [(ab)] -gt Bool
esFuncional r =
and [esUnitario (imagenRelacion r x) | x lt- dominio r]
22 Relaciones homogeacuteneas
Para elaborar la presente seccioacuten se han consultado los apuntes de ldquoAacutelgebra baacutesicardquo([6]) asignatura del primer curso del Grado en Matemaacuteticas
Definicioacuten 221 Una relacioacuten binaria entre dos conjuntos A y B se dice que es homogeacute-nea si los conjuntos son iguales es decir si A = B Si el par (x y) isin AA estaacute en la relacioacutenhomogeacutenea R diremos que x estaacute Rndashrelacionado con y o relacionado con y por R Esto senotaraacute frecuentemente xRy (noacutetese que el orden es importante)
La funcioacuten (esRelacionHomogenea xs r) se verifica si r es una relacioacuten binaria ho-mogeacutenea en el conjunto xs
-- | Ejemplos
-- gtgtgt esRelacionHomogenea [14] [(12)(24)(34)(41)]
-- True
-- gtgtgt esRelacionHomogenea [14] [(12)(25)(34)(41)]
-- False
-- gtgtgt esRelacionHomogenea [14] [(12)(34)(41)]
40 Capiacutetulo 2 Relaciones y funciones
-- True
esRelacionHomogenea Ord a =gt [a] -gt [(aa)] -gt Bool
esRelacionHomogenea xs = esRelacion xs xs
Nota 221 El segundo argumento que recibe la funcioacuten ha de ser una lista de parescon ambas componentes del mismo tipo
La funcioacuten (estaRelacionado r x y) se verifica si x estaacute relacionado con y en larelacioacuten homogeacutenea r
-- | Ejemplos
-- gtgtgt estaRelacionado [(13)(25)(46)] 2 5
-- True
-- gtgtgt estaRelacionado [(13)(25)(46)] 2 3
-- False
estaRelacionado Ord a =gt [(aa)] -gt a -gt a -gt Bool
estaRelacionado r x y = (xy) `elem` r
221 Relaciones reflexivas
Definicioacuten 222 Sea R una relacioacuten binaria homogeacutenea en el conjunto A Diremos que Res reflexiva cuando todos los elementos de A estaacuten relacionados por R consigo mismos esdecir cuando forallx isin A se tiene que xRx
La funcioacuten (esReflexiva xs r) se verifica si la relacioacuten r en xs es reflexiva
-- | Ejemplos
-- gtgtgt esReflexiva [12] [(11)(12)(22)]
-- True
-- gtgtgt esReflexiva [12] [(11)(12)]
-- False
esReflexiva Ord a =gt [a] -gt [(aa)] -gt Bool
esReflexiva xs r = zip xs xs `esSubconjunto` r
Nota 222 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xSylarrrarr xminus y es parbull xTylarrrarr x divide a yson relaciones binarias homogeacuteneas reflexivas
222 Relaciones simeacutetricas
Definicioacuten 223 Diremos que una relacioacuten homogeacutenea R es simeacutetrica cuando
forall(x y) isin R minusrarr (y x) isin R
22 Relaciones homogeacuteneas 41
La funcioacuten (esSimetrica r) se verifica si la relacioacuten r es simeacutetrica
-- | Ejemplos
-- gtgtgt esSimetrica [(11)(12)(21)]
-- True
-- gtgtgt esSimetrica [(11)(12)(22)]
-- False
esSimetrica Ord a =gt [(aa)] -gt Bool
esSimetrica r =
listaAConjunto [(yx) | (xy) lt- r] `esSubconjunto` r
Nota 223 En el conjunto N la relacioacuten caracterizada por xSy larrrarr xminus y es par esuna relacioacuten binaria homogeacutenea simeacutetrica
223 Relaciones antisimeacutetricas
Definicioacuten 224 Sea R una relacioacuten binaria homogeacutenea en el conjunto A Diremos que Res antisimeacutetrica cuando
forall(x y)[(x y) isin R and (y x) isin R minusrarr x = y
La funcioacuten (esAntisimetrica r) se verifica si la relacioacuten r es antisimeacutetrica
-- | Ejemplos
-- gtgtgt esAntisimetrica [(12)(31)]
-- True
-- gtgtgt esAntisimetrica [(12)(21)]
-- False
esAntisimetrica Ord a =gt [(aa)] -gt Bool
esAntisimetrica r =
and [x == y | (xy) lt- r (yx) `elem` r]
Nota 224 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xTylarrrarr x divide a ybull xRylarrrarr x lt yson relaciones binarias homogeacuteneas antisimeacutetricas
224 Relaciones transitivas
Definicioacuten 225 Sea R una relacioacuten binaria homogeacutenea en el conjunto A Diremos que Res transitiva cuando forall(x y) (y z) isin R se tiene que xRy e yRz minusrarr xRz
La funcioacuten (esTransitiva r) se verifica si la relacioacuten r es transitiva
42 Capiacutetulo 2 Relaciones y funciones
-- | Ejemplos
-- gtgtgt esTransitiva [(12)(13)(23)]
-- True
-- gtgtgt esTransitiva [(12)(23)]
-- False
esTransitiva Ord a =gt [(aa)] -gt Bool
esTransitiva r =
listaAConjunto [(xz) | (xy) lt- r (wz) lt- r y == w]
`esSubconjunto` r
Nota 225 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xSylarrrarr xminus y es parbull xTylarrrarr x divide a ybull xRylarrrarr x lt yson relaciones binarias homogeacuteneas transitivas
225 Relaciones de equivalencia
Definicioacuten 226 Las relaciones homogeacuteneas que son a la vez reflexivas simeacutetricas y tran-sitivas se denominan relaciones de equivalencia
La funcioacuten (esRelacionEquivalencia xs r) se verifica si r es una relacioacuten de equi-valencia en xs-- | Ejemplos
-- gtgtgt esRelacionEquivalencia [13] [(11)(12)(21)(22)(33)]
-- True
-- gtgtgt esRelacionEquivalencia [13] [(12)(21)(22)(33)]
-- False
-- gtgtgt esRelacionEquivalencia [13] [(11)(12)(22)(33)]
-- False
esRelacionEquivalencia Ord a =gt [a] -gt [(aa)] -gt Bool
esRelacionEquivalencia xs r =
esReflexiva xs r ampamp
esSimetrica r ampamp
esTransitiva r
Nota 226 En el conjunto N la relacioacuten caracterizada por xSy larrrarr xminus y es par esuna relacioacuten de equivalencia
226 Relaciones de orden
Definicioacuten 227 Las relaciones homogeacuteneas que son a la vez reflexivas antisimeacutetricas ytransitivas se denominan relaciones de orden
23 Funciones 43
La funcioacuten (esRelacionOrden xs r) se verifica si r es una relacioacuten de orden en xs
-- | Ejemplo
-- gtgtgt esRelacionOrden [13] [(11)(12)(13)(22)(23)(33)]
-- True
esRelacionOrden Ord a =gt [a] -gt [(aa)] -gt Bool
esRelacionOrden xs r =
esReflexiva xs r ampamp
esAntisimetrica r ampamp
esTransitiva r
Nota 227 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xTylarrrarr x divide a yson relaciones de orden
227 Clases de equivalencia
Definicioacuten 228 Si R es una relacioacuten de equivalencia en A denominamos clase de equi-valencia de un elemento x isin A al conjunto de todos los elementos de A relacionados con xes decir x = R(x) = y isin A|xRy donde la primera notacioacuten se usa si la relacioacuten con laque se estaacute tratando se sobreentiende y la segunda si no es asiacute
La funcioacuten (clasesEquivalencia xs r) devuelve las clases de la relacioacuten de equi-valencia r en xs
-- | Ejemplo
-- gtgtgt let r = [(xy) | x lt- [15] y lt- [15] even (x-y)]
-- gtgtgt clasesEquivalencia [15] r
-- [[135][24]]
clasesEquivalencia Ord a =gt [a] -gt [(aa)] -gt [[a]]
clasesEquivalencia _ [] = []
clasesEquivalencia [] _ = []
clasesEquivalencia (xxs) r = (xc) clasesEquivalencia (xs c) r
where c = filter (estaRelacionado r x) xs
23 Funciones
Definicioacuten 231 Dada una relacioacuten F entre A y B se diraacute que es una funcioacuten si es unarelacioacuten binaria es funcional y todos los elementos de A estaacuten en el dominio
La funcioacuten (esFuncion xs ys f) se verifica si f es una funcioacuten de xs en ys
-- | Ejemplos
-- gtgtgt esFuncion [13] [247] [(17)(32)]
44 Capiacutetulo 2 Relaciones y funciones
-- True
-- gtgtgt esFuncion [13] [247] [(17)]
-- False
-- gtgtgt esFuncion [13] [247] [(14)(17)(32)]
-- False
esFuncion (Ord a Ord b) =gt [a] -gt [b] -gt [(ab)] -gt Bool
esFuncion xs ys f =
esRelacion xs ys f ampamp
xs `esSubconjunto` dominio f ampamp
esFuncional f
Nota 231 A lo largo de la seccioacuten representaremos a las funciones como listas depares
type Funcion a b = [(ab)]
La funcioacuten (funciones xs ys) devuelve todas las posibles funciones del conjuntoxs en ys
-- | Ejemplos
-- gtgtgt pp $ funciones [12] [34]
-- [[(1 3)(2 3)][(1 3)(2 4)][(1 4)(2 3)]
-- [(1 4)(2 4)]]
-- gtgtgt pp $ funciones [12] [345]
-- [[(1 3)(2 3)][(1 3)(2 4)][(1 3)(2 5)]
-- [(1 4)(2 3)][(1 4)(2 4)][(1 4)(2 5)]
-- [(1 5)(2 3)][(1 5)(2 4)][(1 5)(2 5)]]
-- gtgtgt pp $ funciones [012] [34]
-- [[(0 3)(1 3)(2 3)][(0 3)(1 3)(2 4)]
-- [(0 3)(1 4)(2 3)][(0 3)(1 4)(2 4)]
-- [(0 4)(1 3)(2 3)][(0 4)(1 3)(2 4)]
-- [(0 4)(1 4)(2 3)][(0 4)(1 4)(2 4)]]
funciones [a] -gt [b] -gt [Funcion a b]
funciones xs ys =
[zip xs zs | zs lt- variacionesR (length xs) ys]
231 Imagen por una funcioacuten
Definicioacuten 232 Si f es una funcioacuten entre A y B y x es un elemento del conjunto A laimagen del elemento x por la funcioacuten f es el valor asociado a x por la funcioacuten f
La funcioacuten (imagen f x) es la imagen del elemento x en la funcioacuten f
-- | Ejemplos
-- gtgtgt imagen [(17)(32)] 1
-- 7
-- gtgtgt imagen [(17)(32)] 3
23 Funciones 45
-- 2
imagen (Ord a Ord b) =gt Funcion a b -gt a -gt b
imagen f x = head (imagenRelacion f x)
La funcioacuten (imagenConjunto f xs) es la imagen del conjunto xs en la funcioacuten f
-- | Ejemplos
-- gtgtgt imagenConjunto [(17)(32)(43)] [14]
-- [73]
-- gtgtgt imagenConjunto [(17)(32)] [31]
-- [27]
imagenConjunto (Ord a Ord b) =gt Funcion a b -gt [a] -gt [b]
imagenConjunto f xs = nub (map (imagen f) xs)
232 Funciones inyectivas
Definicioacuten 233 Diremos que una funcioacuten f entre dos conjuntos es inyectiva 2 si a ele-mentos distintos del dominio le corresponden elementos distintos de la imagen es decir siforalla b isin dominio( f ) tales que a 6= b f (a) 6= f (b)
La funcioacuten (esInyectiva fs) se verifica si la funcioacuten fs es inyectiva
-- | Ejemplos
-- gtgtgt esInyectiva [(14)(25)(36)]
-- True
-- gtgtgt esInyectiva [(14)(25)(34)]
-- False
-- gtgtgt esInyectiva [(14)(25)(36)(36)]
-- True
esInyectiva (Ord a Ord b) =gt Funcion a b -gt Bool
esInyectiva f =
all esUnitario [antiImagenRelacion f y | y lt- rango f]
233 Funciones sobreyectivas
Definicioacuten 234 Diremos que una funcioacuten f entre dos conjuntos A y B es sobreyectiva3 si todos los elementos de B son imagen de alguacuten elemento de A
La funcioacuten (esSobreyectiva xs ys f) se verifica si la funcioacuten f es sobreyectiva Ala hora de definirla estamos contando con que f es una funcioacuten entre xs y ys
-- | Ejemplos
-- gtgtgt esSobreyectiva [123] [456] [(14)(25)(36)]
2httpsenwikipediaorgwikiInjective_function3httpsenwikipediaorgwikiSurjective_function
46 Capiacutetulo 2 Relaciones y funciones
-- True
-- gtgtgt esSobreyectiva [123] [456] [(14)(25)(34)]
-- False
-- gtgtgt esSobreyectiva [123] [456] [(14)(24)(36)(36)]
-- False
esSobreyectiva (Ord aOrd b) =gt [a] -gt [b] -gt Funcion a b -gt Bool
esSobreyectiva _ ys f = ys `esSubconjunto` rango f
234 Funciones biyectivas
Definicioacuten 235 Diremos que una funcioacuten f entre dos conjuntos A y B es biyectiva 4 sicada elementos de B es imagen de un uacutenico elemento de A
La funcioacuten (esBiyectiva xs ys f) se verifica si la funcioacuten f es biyectiva
-- | Ejemplos
-- gtgtgt esBiyectiva [123] [456] [(14)(25)(36)(36)]
-- True
-- gtgtgt esBiyectiva [123] [456] [(14)(25)(34)]
-- False
-- gtgtgt esBiyectiva [123] [4567] [(14)(25)(36)]
-- False
esBiyectiva (Ord a Ord b) =gt [a] -gt [b] -gt Funcion a b -gt Bool
esBiyectiva xs ys f =
esInyectiva f ampamp esSobreyectiva xs ys f
La funciones biyecciones1 xs ys y biyecciones2 xs ys devuelven la lista de to-das las biyecciones entre los conjuntos xs y ys La primera lo hace filtrando las fun-ciones entre los conjuntos que son biyectivas y la segunda lo hace construyendouacutenicamente las funciones biyectivas entre los conjuntos con el consecuente ahorrocomputacional
ghcigt length (biyecciones1 [17] [ag])
5040
(1675 secs 4146744104 bytes)
ghcigt length (biyecciones2 [17] [ag])
5040
(002 secs 0 bytes)
ghcigt length (biyecciones1 [16] [ag])
0
(253 secs 592625824 bytes)
ghcigt length (biyecciones2 [16] [ag])
0
(001 secs 0 bytes)
4httpsenwikipediaorgwikiBijective_function
23 Funciones 47
biyecciones1 (Ord a Ord b) =gt [a] -gt [b] -gt [Funcion a b]
biyecciones1 xs ys =
filter (esBiyectiva xs ys) (funciones xs ys)
biyecciones2 (Ord a Ord b) =gt [a] -gt [b] -gt [Funcion a b]
biyecciones2 xs ys
| length xs = length ys = []
| otherwise = [zip xs zs | zs lt- permutations ys]
Nota 232 En lo que sigue trabajaremos con la funcioacuten biyecciones2 asiacute que laredefiniremos como biyecciones
biyecciones (Ord a Ord b) =gt [a] -gt [b] -gt [Funcion a b]
biyecciones = biyecciones2
235 Inversa de una funcioacuten
Definicioacuten 236 Si f es una funcioacuten biyectiva entre los conjuntos A y B definimos lafuncioacuten inversa 5 como la funcioacuten que a cada elemento de B le hace corresponder el elementode A del que es imagen en B
El valor de (inversa f) es la funcioacuten inversa de f
-- | Ejemplos
-- gtgtgt inversa [(14)(25)(36)]
-- [(41)(52)(63)]
-- gtgtgt sort (inversa [(1f)(2m)(3a)])
-- [(a3)(f1)(m2)]
inversa (Ord a Ord b) =gt Funcion a b -gt Funcion b a
inversa f = listaAConjunto [(yx) | (xy) lt- f]
Nota 233 Para considerar la inversa de una funcioacuten esta tiene que ser biyectivaLuego (inversa f) asigna a cada elemento del conjunto imagen (que en este casocoincide con la imagen) uno y solo uno del conjunto de salida
La funcioacuten (imagenInversa f y) devuelve el elemento del conjunto de salida de lafuncioacuten f tal que su imagen es y
-- | Ejemplos
-- gtgtgt imagenInversa [(14)(25)(36)] 5
-- 2
-- gtgtgt imagenInversa [(1f)(2m)(3a)] a
-- 3
imagenInversa (Ord a Ord b) =gt Funcion a b -gt b -gt a
imagenInversa f = imagen (inversa f)
5httpsenwikipediaorgwikiInverse_function
48 Capiacutetulo 2 Relaciones y funciones
Capiacutetulo 3
Introduccioacuten a la teoriacutea de grafos
Se dice que la Teoriacutea de Grafos tiene su origen en 1736 cuando Euler dio una so-lucioacuten al problema (hasta entonces no resuelto) de los siete puentes de Koumlnigsbergiquestexiste un camino que atraviese cada uno de los puentes exactamente una vezPara probar que no era posible Euler sustituyoacute cada regioacuten por un nodo y cadapuente por una arista creando el primer grafo que fuera modelo de un problemamatemaacutetico
Figura 31 Dibujo de los puentes de Koumlnigsberg
A
B
C
D
b
c
a
d
f
e
g
Figura 32 Modelo de los puentes de Koumlnigsberg
Desde entonces se ha ido desarrollando esta metodologiacutea hasta convertise en los uacutel-timos antildeos en una herramienta importante en aacutereas del conocimiento muy variadascomo por ejemplo la Investigacioacuten Operativa la Computacioacuten la Ingenieriacutea Eleacutec-trica la Geografiacutea y la Quiacutemica Es por ello que ademaacutes se ha erigido como unanueva disciplina matemaacutetica que generalmente asociada a las ramas de Topologiacuteay AacutelgebraLa utilidad de los grafos se basa en su gran poder de abstraccioacuten y una representa-cioacuten muy clara de cualquier relacioacuten lo que facilita enormemente tanto la fase demodelado como la de resolucioacuten de cualquier problema Gracias a la Teoriacutea de Gra-fos se han desarrollado una gran variedad de algoritmos y meacutetodos de decisioacuten quepodemos implementar a traveacutes de lenguajes funcionales y permiten automatizar laresolucioacuten de muchos problemas a menudo tediosos de resolver a mano
49
50 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
31 Definicioacuten de grafo
En primer lugar vamos a introducir terminologiacutea baacutesica en el desarrollo de la Teoriacuteade Grafos
Definicioacuten 311 Un grafo G es un par (V A) donde V es el conjunto cuyos elementosllamamos veacutertices (o nodos) y A es un conjunto cuyos elementos llamamos aristas
Definicioacuten 312 Una arista de un grafo G = (V A) es un conjunto de dos elementosde V Es decir para dos veacutertices v vprime de G (v vprime) y (vprime v) representa la misma arista
Definicioacuten 313 Dado un grafo G = (V A) diremos que un veacutertice v isin V es adyacentea vprime isin V si (vprime v) isin A
Definicioacuten 314 Si en un grafo dirigido se permiten aristas repetidas lo llamaremos mul-tigrafo Si no se permiten lo llamaremos grafo regular
Nota 311 Denotaremos por |V| al nuacutemero de veacutertices y por |A| al nuacutemero de aristasdel grafo (V A)
Ejemplo 312 Sea G = (V A) un grafo con V = a b c d y A = (a b) (a c) (b d)(d d) En este grafo los veacutertices a d son adyacentes a b
a
b
c
d
32 El TAD de los grafos
En esta seccioacuten nos planteamos la tarea de implementar las definiciones presenta-das anteriormente en un lenguaje funcional En nuestro caso el lenguaje que utili-zaremos seraacute Haskell Definiremos el Tipo Abstracto de Dato (TAD) de los grafos ydaremos algunos ejemplos de posibles representaciones de grafos con las que po-dremos trabajarSi consideramos un grafo finito cualquiera G = (V A) podemos ordenar el conjun-to de los veacutertices y representarlo como V = v1 vn con n = |V|En primer lugar necesitaremos crear un tipo (Grafo) cuya definicioacuten sea compatiblecon la entidad matemaacutetica que representa y que nos permita definir las operacionesque necesitamos para trabajar con los grafos Estas operaciones son
32 El TAD de los grafos 51
creaGrafo -- [a] -gt [(aa)] -gt Grafo a
vertices -- Grafo a -gt [a]
adyacentes -- Grafo a -gt a -gt [a]
aristaEn -- (aa) -gt Grafo a -gt Bool
aristas -- Grafo a -gt [(aa)]
dondebull (creaGrafo vs as) es un grafo tal que el conjunto de sus veacutertices es vs y el de
sus aristas es asbull (vertices g) es la lista de todos los veacutertices del grafo gbull (adyacentes g v) es la lista de los veacutertices adyacentes al veacutertice v en el grafo gbull (aristaEn a g) se verifica si a es una arista del grafo gbull (aristas g) es la lista de las aristas del grafo g
Nota 321 Las funciones que aparecen en la especificacioacuten del TAD no dependende la representacioacuten que elijamos
Ejemplo 322 Veamos un ejemplo de creacioacuten de grafo y su representacioacuten graacutefica
creaGrafo [15] [(12)(13)(15)(24)
(25)(34)(35)(45)]
1
2
34
5
321 Grafos como listas de aristas
En el moacutedulo GrafoConListaDeAristas se definen las funciones del TAD de losgrafos dando su representacioacuten como conjuntos de aristas es decir representandoa un grafo como dos conjuntos la primera seraacute la lista ordenada de los veacutertices y lasegunda la lista ordenada de las aristas (en ambas listas se excluye la posibilidad derepeticiones)
Nota 323 Las ventajas de usar arrays frente a usar listas es que los array tienenacceso constante (O(1)) a sus elementos mientras que las listas tienen acceso lineal(O(n)) y que la actualizacioacuten de un elemento en un array no supone espacio extraSin embargo los arrays son representaciones muy riacutegidas cualquier modificacioacutenen su estructura como cambiar su tamantildeo supone un gran coste computacionalpues se tendriacutea que crear de nuevo el array y ademaacutes sus iacutendices deben pertenecer
52 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
a la clase de los objetos indexables (Ix) luego perdemos mucha flexibilidad en larepresentacioacuten
- LANGUAGE DeriveGeneric -
module GrafoConListaDeAristas
( Grafo
creaGrafo -- [a] -gt [(aa)] -gt Grafo a
vertices -- Grafo a -gt [a]
adyacentes -- Grafo a -gt a -gt [a]
aristaEn -- (aa) -gt Grafo a -gt Bool
aristas -- Grafo a -gt [(aa)]
) where
En las definiciones del presente moacutedulo se usaraacuten las funciones nub y sort de lalibreriacutea DataList
Vamos a definir un nuevo tipo de dato (Grafo a) que representaraacute un grafo a partirde la lista de sus veacutertices (donde los veacutertices son de tipo a) y de aristas (que son paresde veacutertices)
data Grafo a = G [a] [(aa)]
deriving (Eq Show Generic)
instance (Out a) =gt Out (Grafo a)
Las funciones baacutesicas que definiremos a partir de este tipo coincidiraacuten con las indi-cadas en el TAD de los grafosbull (creaGrafo vs as) es el grafo cuyo conjunto de veacutertices es cs y el de sus aristas
es as-- | Ejemplo
-- gtgtgt creaGrafo [15] [(12)(14)(15)(23)(25)(34)(35)]
-- G [12345] [(12)(14)(15)(23)(25)(34)(35)]
creaGrafo Ord a =gt [a] -gt [(aa)] -gt Grafo a
creaGrafo vs as =
G (sort vs) (nub (sort [parOrdenado a | a lt- as]))
parOrdenado Ord a =gt (aa) -gt (aa)
parOrdenado (xy) | x lt= y = (xy)
| otherwise = (yx)
Ejemplo 324 ejGrafo es el grafo
32 El TAD de los grafos 53
1
2
3
4
5
Los ejemplos usaraacuten el siguiente grafo
ejGrafo Grafo Int
ejGrafo = creaGrafo [15]
[(12)(14)(15)(23)(25)(34)(35)(45)]
bull (vertices g) es la lista de los veacutertices del grafo g
-- | Ejemplo
-- gtgtgt vertices ejGrafo
-- [12345]
vertices Grafo a -gt [a]
vertices (G vs _) = vs
bull (adyacentes g v) es la lista de los veacutertices adyacentes al veacutertice v en el grafo g
-- | Ejemplos
-- gtgtgt adyacentes ejGrafo 4
-- [135]
-- gtgtgt adyacentes ejGrafo 3
-- [245]
adyacentes Eq a =gt Grafo a -gt a -gt [a]
adyacentes (G _ as) v =
[u | (ux) lt- as x == v] `union` [u | (xu) lt- as x == v]
bull (aristaEn a g) se verifica si a es una arista del grafo g
-- | Ejemplos
-- gtgtgt (51) `aristaEn` ejGrafo
-- True
-- gtgtgt (31) `aristaEn` ejGrafo
-- False
aristaEn Ord a =gt (aa) -gt Grafo a -gt Bool
aristaEn a (G _ as) = parOrdenado a `elem` as
bull (aristas g) es la lista de las aristas del grafo g
-- | Ejemplo
-- gtgtgt aristas ejGrafo
-- [(12)(14)(15)(23)(25)(34)(35)(45)]
aristas Grafo a -gt [(aa)]
aristas (G _ as) = as
54 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
33 Generador de grafos
En esta seccioacuten presentaremos el generador de grafos que nos permitiraacute generargrafos como listas de aristas arbitrariamente y usarlos como ejemplos o para com-probar propiedadesPara aprender a controlar el tamantildeo de los grafos generados he consultado las si-guientes fuentes QuickCheck A Lightweight Tool for Random Testing of Haskell Programs 1
([3]) Property Testing using QuickCheck 2 ([9])(generaGrafos n) es un generador de grafos de hasta n veacutertices Por ejemplo
ghcigt sample (generaGrafo 5)
G [12] []
G [1] [(11)]
G [] []
G [1234] [(22)]
G [123] [(11)(12)(13)(22)]
G [12345] [(12)(14)(15)(22)(23)(24)(33)(34)(44)(45)]
G [1] []
G [123] [(12)(22)(33)]
G [1234] [(11)(14)(23)(24)(33)(34)(44)]
G [12] []
G [123] [(11)(12)(22)(33)]
ghcigt sample (generaGrafo 2)
G [12] [(12)(22)]
G [12] [(11)]
G [12] [(11)(12)]
G [] []
G [1] [(11)]
G [1] []
G [1] []
G [] []
G [] []
G [] []
G [1] [(11)]
generaGrafo Int -gt Gen (Grafo Int)
generaGrafo s = do
let m = s `mod` 11
n lt- choose (0m)
as lt- sublistOf [(xy) | x lt- [1n] y lt- [xn]]
return (creaGrafo [1n] as)
1httpswwweecsnorthwesternedu~robbycourses395-495-2009-fallquickpdf2httpswwwdccfcuppt~pbvaulastapfslidesquickcheckhtml
34 Ejemplos de grafos 55
Nota 331 Los grafos estaacuten contenidos en la clase de los objetos generables aleato-riamente
instance Arbitrary (Grafo Int) where
arbitrary = sized generaGrafo
En el siguiente ejemplo se pueden observar algunos grafos generados
ghcigt sample (arbitrary Gen (Grafo Int))
G [] []
G [1] [(11)]
G [12] [(11)(12)]
G [1] [(11)]
G [12345678] [(14)(17)(22)(23)(25)(28)(35)
(36)(38)(44)(46)(47)(48)(56)(66)(67)(78)]
G [12345] [(11)(12)(14)(15)(24)(25)(34)(55)]
G [] []
G [] []
G [123] [(11)(22)(23)]
G [1234] [(11)(12)(14)(22)(33)]
G [1234567] [(11)(15)(16)(17)(22)(24)(25)
(26)(27)(33)(35)(46)(47)(55)(57)(66)(77)]
34 Ejemplos de grafos
El objetivo de esta seccioacuten es reunir una coleccioacuten de grafos lo suficientemente ex-tensa y variada como para poder utilizarla como recurso a la hora de comprobar laspropiedades y definiciones de funciones que implementaremos maacutes adelanteEn el proceso de recopilacioacuten de ejemplos se ha trabajado con diversas fuentesbull los apuntes de la asignatura ldquoMatemaacutetica discretardquo ([4])bull los temas de la asignatura ldquoInformaacuteticardquo ([1]) ybull el artiacuteculo ldquoGraph theoryrdquo ([11]) de la Wikipedia
Nota 341 Se utilizaraacute la representacioacuten de los grafos como listas de aristas
341 Grafo nulo
Definicioacuten 341 Un grafo nulo es un grafo que no tiene ni veacutertices ni aristas
La funcioacuten (grafoNulo) devuelve un grafo nulo
grafoNulo Ord a =gt Grafo a
grafoNulo = creaGrafo [] []
La funcioacuten (esGrafoNulo g) se verifica si g es un grafo nulo
56 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- | Ejemplos
-- gtgtgt esGrafoNulo grafoNulo
-- True
-- gtgtgt esGrafoNulo (creaGrafo [] [(12)])
-- False
-- gtgtgt esGrafoNulo (creaGrafo [12] [(12)])
-- False
esGrafoNulo Grafo a -gt Bool
esGrafoNulo g =
null (vertices g) ampamp null (aristas g)
342 Grafo ciclo
Definicioacuten 342 Un ciclo 3 de orden n C(n) es un grafo no dirigido y no ponderadocuyo conjunto de veacutertices viene dado por V = 1 n y el de las aristas por A = (0 1)(1 2) (nminus 2 nminus 1) (nminus 1 0)
La funcioacuten (grafoCiclo n) nos genera el ciclo de orden n
1
23
45
-- | Ejemplos
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
grafoCiclo Int -gt Grafo Int
grafoCiclo 0 = grafoNulo
grafoCiclo 1 = creaGrafo [1] []
grafoCiclo n = creaGrafo [1n]
([(uu+1) | u lt- [1n-1]] ++ [(n1)])
343 Grafo de la amistad
Definicioacuten 343 Un grafo de la amistad 4 de orden n es un grafo con 2n + 1 veacuterticesy 3n aristas formado uniendo n copias del ciclo C3 por un veacutertice comuacuten Lo denotamos porFn3httpseswikipediaorgwikiGrafo_completo4httpseswikipediaorgwikiGrafo_de_la_amistad
34 Ejemplos de grafos 57
La funcioacuten (grafoAmistad n) genera el grafo de la amistad de orden n Por ejemplo
1
2
34
5
1
2
3
4
5
6
7
-- | Ejemplos
-- gtgtgt pp $ grafoAmistad 2
-- G [12345]
-- [(1 2)(1 3)(1 4)(1 5)(2 3)(4 5)]
-- gtgtgt pp $ grafoAmistad 3
-- G [1234567]
-- [(1 2)(1 3)(1 4)(1 5)(1 6)(1 7)(2 3)
-- (4 5)(6 7)]
grafoAmistad Int -gt Grafo Int
grafoAmistad n =
creaGrafo [12n+1]
([(1a) | a lt- [22n+1]] ++
[(ab) | (ab) lt-zip [242n] [352n+1]])
344 Grafo completo
Definicioacuten 344 El grafo completo 5 de orden n K(n) es un grafo no dirigido cuyoconjunto de veacutertices viene dado por V = 1 n y tiene una arista entre cada par deveacutertices distintos
La funcioacuten (completo n) nos genera el grafo completo de orden n Por ejemplo
5httpseswikipediaorgwikiGrafo_completo
58 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
1
2
3
4
-- | Ejemplo
-- gtgtgt completo 4
-- G [1234] [(12)(13)(14)(23)(24)(34)]
completo Int -gt Grafo Int
completo n =
creaGrafo [1n]
[(ab) | a lt- [1n] b lt- [1a-1]]
345 Grafo bipartito
Definicioacuten 345 Un grafo bipartito 6 es un grafo G = (V A) verificando que elconjunto de sus veacutertices se puede dividir en dos subconjuntos disjuntos V1 V2 tales queV1 cupV2 = V de manera que forallu1 u2 isin V1[(u1 u2) 6isin A] y forallv1 v2 isin V2[(v1 v2) 6isin A]Un grafo bipartito completo 7 seraacute entonces un grafo bipartito G = (V1 cup V2 A) en elque todos los veacutertices de una particioacuten estaacuten conectados a los de la otra Si n = |V1| m =
|V2| denotamos al grafo bipartito G = (V1 cupV2 A) por Knm
La funcioacuten (bipartitoCompleto n m) nos genera el grafo bipartito Knm Por ejem-plo
1 2
3 4 5
-- | Ejemplo
-- gtgtgt bipartitoCompleto 2 3
-- G [12345] [(13)(14)(15)(23)(24)(25)]
bipartitoCompleto Int -gt Int -gt Grafo Int
bipartitoCompleto n m =
creaGrafo [1n+m]
[(ab) | a lt- [1n] b lt- [n+1n+m]]
6httpseswikipediaorgwikiGrafo_bipartito7httpseswikipediaorgwikiGrafo_bipartito_completo
34 Ejemplos de grafos 59
La funcioacuten (conjuntosVerticesDisjuntos g) devuelve Nothing si el grafo g no esbipartito y Just(xsys) si lo es donde xs ys es una particioacuten disjunta de los veacuterticesde g
-- | Ejemplo
-- gtgtgt conjuntosVerticesDisjuntos (bipartitoCompleto 3 4)
-- Just ([321][7654])
-- gtgtgt conjuntosVerticesDisjuntos (grafoCiclo 5)
-- Nothing
-- gtgtgt conjuntosVerticesDisjuntos (grafoCiclo 6)
-- Just ([531][642])
conjuntosVerticesDisjuntos Ord a =gt Grafo a -gt Maybe ([a][a])
conjuntosVerticesDisjuntos g
| null (vertices g) = Just ([][])
| otherwise = aux (vertices g) [] [] [] []
where u = union
a = adyacentes g
d xs x = xs [x]
aux [] _ _ r b = if (null (intersect r b))
then (Just (rb))
else Nothing
aux (vvs) [] [] [] [] = aux vs (a v) [v] [v] []
aux (vvs) [] c r b
| null (a v) = aux vs [] (vc) (vr) b
| null ((a v) c) =
if (or [elem u r | u lt- (a v)])
then (if (or [elem u b | u lt- (a v)])
then Nothing
else (aux vs [] (vc) r (vb)))
else (aux vs [] (vc) (vr) b)
| otherwise =
if (or [elem u r | u lt- (a v)])
then (if (or [elem u b | u lt- (a v)])
then Nothing
else (aux vs ((a v) c) (vc) r (vb)))
else (aux vs ((a v) c) (vc) (vr) b)
aux vs (qqs) c r b
| null ((a q) c) =
if (or [elem u r | u lt- (a q)])
then (if (or [elem u b | u lt- (a q)])
then Nothing
else (aux (d vs q) qs (qc) r (qb)))
else (aux (d vs q) qs (qc) (qr) b)
| otherwise =
if (or [elem u r | u lt- (a q)])
then (if (or [elem u b | u lt- (a q)])
then Nothing
else (aux (d vs q) (u ((a q) c) qs)
60 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
(qc) r (qb)))
else (aux (d vs q) (u ((a q) c) qs)
(qc) (qr) b)
La funcioacuten (esBipartito g) se verifica si el grafo g es bipartito
-- | Ejemplo
-- gtgtgt esBipartito (bipartitoCompleto 3 4)
-- True
-- gtgtgt esBipartito (grafoCiclo 5)
-- False
-- gtgtgt esBipartito (grafoCiclo 6)
-- True
esBipartito Ord a =gt Grafo a -gt Bool
esBipartito g = isJust (conjuntosVerticesDisjuntos g)
346 Grafo estrella
Definicioacuten 346 Una estrella 8 de orden n es el grafo bipartito completo K1n Denota-remos a una estrella de orden n por Sn Una estrella con 3 aristas se conoce en ingleacutes comoclaw (garra o garfio)
La funcioacuten (grafoEstrella n) crea un grafo circulante a partir de su orden n
2
34
56
1
-- | Ejemplo
-- gtgtgt grafoEstrella 5
-- G [123456] [(12)(13)(14)(15)(16)]
grafoEstrella Int -gt Grafo Int
grafoEstrella = bipartitoCompleto 1
347 Grafo rueda
Definicioacuten 347 Un grafo rueda 9 de orden n es un grafo no dirigido y no ponderado conn veacutertices que se forma conectando un uacutenico veacutertice a todos los veacutertices de un ciclo Cnminus1 Lodenotaremos por Wn8httpsenwikipediaorgwikiStar_(graph_theory))9httpseswikipediaorgwikiGrafo_rueda
34 Ejemplos de grafos 61
La funcioacuten (grafoRueda n) crea un grafo rueda a partir de su orden n
2
34
56
1
-- | Ejemplo
-- gtgtgt pp $ grafoRueda 6
-- G [123456]
-- [(1 2)(1 3)(1 4)(1 5)(1 6)(2 3)(2 6)
-- (3 4)(4 5)(5 6)]
grafoRueda Int -gt Grafo Int
grafoRueda n =
creaGrafo [1n]
([(1a) | a lt- [2n]] ++
[(ab) | (ab) lt- zip (2[2n-1]) (3n[4n])])
348 Grafo circulante
Definicioacuten 348 Un grafo circulante 10 de orden n ge 3 y saltos s1 sk es un grafono dirigido y no ponderado G = (1 n A) en el que cada nodo foralli isin V es adyacente alos 2k nodos iplusmn s1 iplusmn sk mod n Lo denotaremos por Cirs1sk
n
La funcioacuten (grafoCirculante n ss) crea un grafo circulante a partir de su orden n
y de la lista de sus saltos ss Por ejemplo
2
34
5
6 1
-- | Ejemplo
-- gtgtgt pp $ grafoCirculante 6 [12]
-- G [123456]
-- [(1 2)(1 3)(1 5)(1 6)(2 3)(2 4)(2 6)
-- (3 4)(3 5)(4 5)(4 6)(5 6)]
grafoCirculante Int -gt [Int] -gt Grafo Int
grafoCirculante n ss =
10httpsenwikipediaorgwikiCirculant_graph
62 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
creaGrafo [1n]
[(ab) | a lt- [1n]
b lt- sort (auxCir a ss n)
a lt b]
where auxCir v ss1 k =
concat [[fun (v+s) k fun (v-s) k] | s lt- ss1]
fun a b = if mod a b == 0 then b else mod a b
349 Grafo de Petersen generalizado
El grafo de Petersen generalizado 11 que denotaremos GPnk (con n ge 3 y 1 le k le(nminus 1)2) es un grafo formado por un grafo circulante Cirn
k en el interior rodeadopor un ciclo Cn al que estaacute conectado por una arista saliendo de cada veacutertice deforma que se creen n poliacutegonos regulares El grafo GPnk tiene 2n veacutertices y 3n aristasLa funcioacuten (grafoPetersenGen n k) devuelve el grafo de Petersen generalizadoGPnk
1
2
3
4
5
6
7
8
-- | Ejemplo
-- gtgtgt pp $ grafoPetersenGen 4 2
-- G [12345678]
-- [(1 3)(1 5)(2 4)(2 6)(3 7)(4 8)(5 6)
-- (5 8)(6 7)(7 8)]
grafoPetersenGen Int -gt Int -gt Grafo Int
grafoPetersenGen n k =
creaGrafo [12n]
(filter p (aristas (grafoCirculante n [k])) ++
[(xx+n) | x lt- [1n]] ++
(n+1n+2) (n+12n) [(xx+1) | x lt- [n+22n-1]])
where p (ab) = a lt b
11httpsenwikipediaorgwikiGeneralized_Petersen_graph
34 Ejemplos de grafos 63
3410 Otros grafos importantes
Grafo de Thomson
Definicioacuten 349 El grafo bipartito completo K33 es conocido como el grafo de Thomsony como veremos maacutes adelante seraacute clave a la hora de analizar propiedades topoloacutegicas de losgrafos
1 2 3
4 5 6
La funcioacuten (grafoThomson) genera el grafo de Thomson
-- | Ejemplo
-- gtgtgt pp $ grafoThomson
-- G [123456]
-- [(1 4)(1 5)(1 6)(2 4)(2 5)(2 6)(3 4)
-- (3 5)(3 6)]
grafoThomson Grafo Int
grafoThomson = bipartitoCompleto 3 3
Grafo de Heawood
El grafo de Heawood 12 es un grafo no dirigido regular con 14 veacutertices y 21 aris-tas Todos sus veacutertices son incidentes a exactamente 3 aristas es decir es un grafocuacutebico Tiene importantes propiedades geomeacutetricas y topoloacutegicas
1
2
3
45
6
7
8
9
10
11 12
13
14
12httpsenwikipediaorgwikiHeawood_graph
64 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten grafoHeawood genera el grafo de Heawood
-- | Ejemplo
-- gtgtgt pp $ grafoHeawood
-- G [1234567891011121314]
-- [(1 2)(1 6)(1 14)(2 3)(2 11)(3 4)(3 8)
-- (4 5)(4 13)(5 6)(5 10)(6 7)(7 8)(7 12)
-- (8 9)(9 10)(9 14)(10 11)(11 12)(12 13)
-- (13 14)]
grafoHeawood Grafo Int
grafoHeawood =
creaGrafo [114]
(aristas (grafoCiclo 14) ++
zip [1 23 4 5 7 9]
[611813101214])
Grafo de McGee
El grafo de McGee 13 es un grafo no dirigido cuacutebico con 24 veacutertices y 36 aristasTiene importantes propiedades geomeacutetricas y topoloacutegicas
1
2
3
45
6789
10
11
12
13
14
15
1617
18 19 2021
22
23
24
La funcioacuten grafoMcGee genera el grafo de McGee
-- | Ejemplo
-- gtgtgt pp $ grafoMcGee
-- G [12345678910111213141516171819
-- 2021222324]
-- [(1 2)(1 13)(1 24)(2 3)(2 9)(3 4)(3 20)
13httpsenwikipediaorgwikiMcGee_graph
34 Ejemplos de grafos 65
-- (4 5)(4 16)(5 6)(5 12)(6 7)(6 23)(7 8)
-- (7 19)(8 9)(8 15)(9 10)(10 11)(10 22)
-- (11 12)(11 18)(12 13)(13 14)(14 15)
-- (14 21)(15 16)(16 17)(17 18)(17 24)
-- (18 19)(19 20)(20 21)(21 22)(22 23)
-- (23 24)]
grafoMcGee Grafo Int
grafoMcGee =
creaGrafo [124]
(aristas (grafoCiclo 24) ++
zip [ 12 3 4 5 6 7 810111417]
[13920161223191522182124])
Grafo TuttendashCoxeter
El grafo TuttendashCoxeter 14 es un grafo no dirigido cuacutebico con 30 veacutertices y 45 aristasTiene importantes propiedades geomeacutetricas y topoloacutegicas
1
2
3
4
56
7891011
12
13
14
15
16
17
18
19
2021
22 23 24 2526
27
28
29
30
La funcioacuten grafoTutteCoxeter genera el grafo TuttendashCoxeter
-- | Ejemplo
-- gtgtgt pp $ grafoTutteCoxeter
-- G [12345678910111213141516171819
-- 2021222324252627282930]
14httpsenwikipediaorgwikiTutteT1textendashCoxeter_graph
66 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- [(1 2)(1 18)(1 30)(2 3)(2 23)(3 4)
-- (3 10)(4 5)(4 27)(5 6)(5 14)(6 7)(6 19)
-- (7 8)(7 24)(8 9)(8 29)(9 10)(9 16)
-- (10 11)(11 12)(11 20)(12 13)(12 25)
-- (13 14)(13 30)(14 15)(15 16)(15 22)
-- (16 17)(17 18)(17 26)(18 19)(19 20)
-- (20 21)(21 22)(21 28)(22 23)(23 24)
-- (24 25)(25 26)(26 27)(27 28)(28 29)
-- (29 30)]
grafoTutteCoxeter Grafo Int
grafoTutteCoxeter =
creaGrafo [130]
(aristas (grafoCiclo 30) ++
zip [ 1 2 3 4 5 6 7 8 9111213151721]
[182310271419242916202530222628])
Grafo de Petersen
El grafo de Petersen 15 se define como el grafo de Petersen generalizado GP52 esdecir es un grafo cuacutebico formado por los veacutertices de un pentaacutegono conectados alos veacutertices de una estrella de cinco puntas en la que cada nodo es adyacente a losnodos que estaacuten a un salto 2 de eacutel Es usado como ejemplo y como contraejemplo enmuchos problemas de la Teoriacutea de grafos
6
7
8 9
101
2
3 4
5
La funcioacuten grafoPetersen devuelve el grafo de Petersen
-- | Ejemplo
-- gtgtgt pp $ grafoPetersen
-- G [12345678910]
-- [(1 3)(1 4)(1 6)(2 4)(2 5)(2 7)(3 5)
-- (3 8)(4 9)(5 10)(6 7)(6 10)(7 8)(8 9)
-- (9 10)]
grafoPetersen Grafo Int
grafoPetersen = grafoPetersenGen 5 2
15httpsenwikipediaorgwikiPetersen_graph
35 Definiciones y propiedades 67
Grafo de MoeumlbiusndashCantor
El grafo de MoeumlbiusndashCantor 16 se define como el grafo de Petersen generalizadoGP83 es decir es un grafo cuacutebico formado por los veacutertices de un octoacutegono conecta-dos a los veacutertices de una estrella de ocho puntas en la que cada nodo es adyacente alos nodos que estaacuten a un salto 3 de eacutel Al igual que el grafo de Petersen tiene impor-tantes propiedades que lo hacen ser ejemplo y contraejemplo de muchos problemasde la Teoriacutea de Grafos
9
10
11
12
13
14
15
16
1
23
4
5
67
8
La funcioacuten grafoMoebiusCantor genera el grafo de MoeumlbiusndashCantor
-- | Ejemplo
-- gtgtgt pp $ grafoMoebiusCantor
-- G [12345678910111213141516]
-- [(1 4)(1 6)(1 9)(2 5)(2 7)(2 10)(3 6)
-- (3 8)(3 11)(4 7)(4 12)(5 8)(5 13)(6 14)
-- (7 15)(8 16)(9 10)(9 16)(10 11)(11 12)
-- (12 13)(13 14)(14 15)(15 16)]
grafoMoebiusCantor Grafo Int
grafoMoebiusCantor = grafoPetersenGen 8 3
35 Definiciones y propiedades
Una vez construida una pequentildea fuente de ejemplos estamos en condiciones deimplementar las definiciones sobre grafos en Haskell y ver que funcionan correc-tamente Ademaacutes comprobaremos que se cumplen las propiedades baacutesicas que sehan presentado en el tema Introduccioacuten a la teoriacutea de grafos de ldquoMatemaacutetica discretardquo([4])
16httpsenwikipediaorgwikiMoeumlbius-Kantor_graph
68 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Nota 351 Se utilizaraacute el tipo abstracto de grafos presentados en la seccioacuten 32 y seutilizaraacuten las librerias DataList y TestQuickCheck
351 Definiciones de grafos
Definicioacuten 351 El orden de un grafo G = (V A) se define como su nuacutemero de veacuterticesLo denotaremos por |V(G)|
La funcioacuten (orden g) devuelve el orden del grafo g
-- | Ejemplos
-- gtgtgt orden (grafoCiclo 4)
-- 4
-- gtgtgt orden (grafoEstrella 4)
-- 5
orden Grafo a -gt Int
orden = length vertices
Definicioacuten 352 El tamantildeo de un grafo G = (V A) se define como su nuacutemero de aristasLo denotaremos por |A(G)|
La funcioacuten (tamantildeo g) devuelve el orden del grafo g
-- | Ejemplos
-- gtgtgt tamantildeo (grafoCiclo 4)
-- 4
-- gtgtgt tamantildeo grafoPetersen
-- 15
tamantildeo Grafo a -gt Int
tamantildeo = length aristas
Definicioacuten 353 Diremos que dos aristas a aprime son incidentes si tienen interseccioacuten novaciacutea es decir si tienen alguacuten veacutertice en comuacuten
La funcioacuten (sonIncidentes a a) se verifica si las aristas a y a son incidentes
-- | Ejemplos
-- gtgtgt sonIncidentes (12) (24)
-- True
-- gtgtgt sonIncidentes (12) (34)
-- False
sonIncidentes Eq a =gt (aa) -gt (aa) -gt Bool
sonIncidentes (u1u2) (v1v2) =
or [u1 == v1 u1 == v2 u2 == v1 u2 == v2]
Definicioacuten 354 Diremos que una arista de un grafo G es un lazo si va de un veacutertice ensiacute mismo
35 Definiciones y propiedades 69
La funcioacuten (lazos g) devuelve los lazos del grafo g
-- | Ejemplos
-- gtgtgt lazos (creaGrafo [12] [(11)(12)(22)])
-- [(11)(22)]
-- gtgtgt lazos (grafoCiclo 5)
-- []
lazos Eq a =gt Grafo a -gt [(aa)]
lazos g = [(uv) | (uv) lt- aristas g u == v]
La funcioacuten (esLazo a) se verifica si la arista a es un lazo
-- | Ejemplos
-- gtgtgt esLazo (44)
-- True
-- gtgtgt esLazo (12)
-- False
esLazo Eq a =gt (aa) -gt Bool
esLazo (uv) = u == v
Definicioacuten 355 Dado un grafo G = (V A) fijado un veacutertice v isin V al conjunto deveacutertices que son adyacentes a v lo llamaremos entorno de v y lo denotaremos por N(v) =u isin V|(u v) isin A
La funcioacuten (entorno g v) devuelve el entorno del veacutertice v en el grafo g
-- | Ejemplo
-- gtgtgt entorno (creaGrafo [15] [(12)(13)(23)]) 2
-- [13]
entorno Eq a =gt Grafo a -gt a -gt [a]
entorno = adyacentes
Definicioacuten 356 Sea G = (V A) un grafo El grado (o valencia) de v isin V es grad(v) =|N(v)|
La funcioacuten (grado g v) devuelve el grado del veacutertice v en el grafo g
-- | Ejemplos
-- gtgtgt grado (creaGrafo [15] [(12)(13)(23)]) 2
-- 2
-- gtgtgt grado (grafoEstrella 5) 1
-- 5
grado Eq a =gt Grafo a -gt a -gt Int
grado g v = length (entorno g v)
Definicioacuten 357 Un veacutertice v de un grafo es aislado si su grado es 0
La funcioacuten (esAislado g v) se verifica si el veacutertice v es aislado en el grafo g
70 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- | Ejemplos
-- gtgtgt esAislado (creaGrafo [15] [(12)(13)(23)]) 4
-- True
-- gtgtgt esAislado (creaGrafo [15] [(12)(13)(23)]) 3
-- False
esAislado Eq a =gt Grafo a -gt a -gt Bool
esAislado g v = grado g v == 0
Definicioacuten 358 Un grafo es regular si todos sus veacutertices tienen el mismo grado
La funcioacuten (esRegular g) se verifica si el grafo g es regular
-- | Ejemplos
-- gtgtgt esRegular (creaGrafo [13] [(12)(13)(23)])
-- True
-- gtgtgt esRegular (creaGrafo [14] [(12)(13)(24)])
-- False
esRegular Eq a =gt Grafo a -gt Bool
esRegular g = all (==x) xs
where (xxs) = [grado g v | v lt- vertices g]
Definicioacuten 359 Dado un grafo G = (V A) llamamos valencia miacutenima o grado miacuteni-mo de G al valor δ(G) = mıngrad(v)|v isin V
La funcioacuten (valenciaMin g) devuelve la valencia miacutenima del grafo g
-- | Ejemplo
-- gtgtgt valenciaMin (creaGrafo [14] [(12)(13)(24)])
-- 1
valenciaMin Ord a =gt Grafo a -gt Int
valenciaMin g = minimum [grado g v | v lt- vertices g]
Definicioacuten 3510 Dado un grafo G = (V A) llamamos valencia maacutexima o gradomaacuteximo de G al valor δ(G) = maxgrad(v)|v isin V
La funcioacuten (valenciaMax g) devuelve la valencia maacutexima del grafo g
-- | Ejemplo
-- gtgtgt valenciaMax (creaGrafo [14] [(12)(13)(24)])
-- 2
valenciaMax Ord a =gt Grafo a -gt Int
valenciaMax g = maximum [grado g v | v lt- vertices g]
Definicioacuten 3511 Se dice que un grafo es simple si no contiene lazos ni aristas repetidas
La funcioacuten (esSimple g) se verifica si g es un grafo simple
35 Definiciones y propiedades 71
-- | Ejemplos
-- gtgtgt esSimple (creaGrafo [13] [(12)(13)(23)])
-- True
-- gtgtgt esSimple (creaGrafo [13] [(11)(12)(23)])
-- False
esSimple Ord a =gt Grafo a -gt Bool
esSimple g =
and [not ((xx) `aristaEn` g) | x lt- vertices g]
Definicioacuten 3512 Sea G un grafo Llamamos secuencia de grados de G a la lista degrados de sus veacutertices La secuencia se suele presentar en orden decreciente d1 ge d2 gemiddot middot middot ge dn
La funcioacuten (secuenciaGrados g) devuelve la secuencia de los grados del grafo g enorden decreciente
-- | Ejemplo
-- gtgtgt secuenciaGrados (creaGrafo [15] [(12)(13)(14)(24)])
-- [32210]
secuenciaGrados Eq a =gt Grafo a -gt [Int]
secuenciaGrados g = sortBy (flip compare) [grado g v | v lt- vertices g]
Nota 352 iquestQueacute listas de n nuacutemeros enteros son secuencias de grafos de n veacuterticesbull Si sumn
i=1 di es impar no hay ningunobull Si sumn
i=1 di es par entonces siempre hay un grafo con esa secuencia de grados (aun-que no necesariamente simple)
Definicioacuten 3513 Una secuencia graacutefica es una lista de nuacutemero enteros no negativos quees la secuencia de grados para alguacuten grafo simple
La funcioacuten (secuenciaGrafica ss) se verifica si existe alguacuten grafo con la secuenciade grados ss
-- | Ejemplos
-- gtgtgt secuenciaGrafica [32210]
-- True
-- gtgtgt secuenciaGrafica [3222]
-- False
secuenciaGrafica [Int] -gt Bool
secuenciaGrafica ss = even (sum ss) ampamp all p ss
where p s = s gt= 0 ampamp s lt= length ss
Definicioacuten 3514 Dado un grafo G = (V A) diremos que Gprime = (Vprime Aprime) es un subgrafode G si Vprime sube V y Aprime sube A
72 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (esSubgrafo g g) se verifica si g es un subgrafo de g
-- |Ejemplos
-- gtgtgt esSubgrafo (bipartitoCompleto 3 2) (bipartitoCompleto 3 3)
-- True
-- gtgtgt esSubgrafo (grafoEstrella 4) (grafoEstrella 5)
-- True
-- gtgtgt esSubgrafo (completo 5) (completo 4)
-- False
-- gtgtgt esSubgrafo (completo 3) (completo 4)
-- True
esSubgrafo Ord a =gt Grafo a -gt Grafo a -gt Bool
esSubgrafo g g =
vertices g `esSubconjunto` vertices g ampamp
aristas g `esSubconjunto` aristas g
Definicioacuten 3515 Si Gprime = (Vprime Aprime) es un subgrafo de G = (V A) tal que Vprime = Vdiremos que Gprime es un subgrafo maximal grafo recubridor o grafo de expansioacuten (eningleacutes spanning grah) de G
La funcioacuten (esSubgrafoMax g g) se verifica si g es un subgrafo maximal de g
-- | Ejemplos
-- gtgtgt esSubgrafoMax (grafoRueda 3) (grafoRueda 4)
-- False
-- gtgtgt esSubgrafoMax (grafoCiclo 4) (grafoRueda 4)
-- True
-- gtgtgt esSubgrafoMax (creaGrafo [13] [(12)]) (grafoCiclo 3)
-- True
-- gtgtgt esSubgrafoMax (creaGrafo [12] [(12)]) (grafoCiclo 3)
-- False
esSubgrafoMax Ord a =gt Grafo a -gt Grafo a -gt Bool
esSubgrafoMax g g =
g `esSubgrafo` g ampamp conjuntosIguales (vertices g) (vertices g)
Definicioacuten 3516 Sean Gprime = (Vprime Aprime) G = (V A) dos grafos si Vprime sub V o Aprime sub A sedice que Gprime es un subgrafo propio de G y se denota por Gprime sub G
La funcioacuten (esSubgrafoPropio g g) se verifica si g es un subgrafo propio de g
-- | Ejemplos
-- gtgtgt esSubgrafoPropio (grafoRueda 3) (grafoRueda 4)
-- True
-- gtgtgt esSubgrafoPropio (grafoRueda 4) (grafoCiclo 5)
-- False
-- gtgtgt esSubgrafoPropio (creaGrafo [13] [(12)]) (grafoCiclo 3)
-- True
-- gtgtgt esSubgrafoPropio (creaGrafo [12] [(12)]) (grafoCiclo 3)
35 Definiciones y propiedades 73
-- True
esSubgrafoPropio Ord a =gt Grafo a -gt Grafo a -gt Bool
esSubgrafoPropio g g =
esSubgrafo g g ampamp
(not (conjuntosIguales (vertices g) (vertices g)) ||
not (conjuntosIguales (aristas g) (aristas g)))
352 Propiedades de grafos
Teorema 3517 (Lema del apretoacuten de manos) En todo grafo simple el nuacutemero de veacuterticesde grado impar es par o cero
Vamos a comprobar que se verifica el lema del apretoacuten de manos utilizando la fun-cioacuten prop_LemaApretonDeManos
ghcigt quickCheck prop_LemaApretonDeManos
+++ OK passed 100 tests
prop_LemaApretonDeManos Grafo Int -gt Bool
prop_LemaApretonDeManos g =
even (length (filter odd [grado g v | v lt- vertices g]))
where g = creaGrafo (vertices g)
[(xy) | (xy) lt- aristas g x = y]
Teorema 3518 (HavelndashHakimi) Si n gt 1 y D = [d1 dn] es una lista de enterosentonces D es secuencia graacutefica si y soacutelo si la secuencia Dprime obtenida borrando el mayorelemento dmax y restando 1 a los siguientes dmax elementos maacutes grandes es graacutefica
Vamos a comprobar que se verifica el teorema de HavelndashHakimi utilizando la fun-cioacuten prop_HavelHakimi
ghcigt quickCheck prop_HavelHakimi
+++ OK passed 100 tests
prop_HavelHakimi [Int] -gt Bool
prop_HavelHakimi [] = True
prop_HavelHakimi (sss) =
not (secuenciaGrafica (sss) ampamp not (esVacio ss)) ||
secuenciaGrafica (map (x -gt x-1) (take s ss) ++ drop s ss)
353 Operaciones y propiedades sobre grafos
Eliminacioacuten de una arista
Definicioacuten 3519 Sea G = (V A) un grafo y sea (u v) isin A Definimos el grafo G (u v) como el subgrafo de G Gprime = (Vprime Aprime) con Vprime = V y Aprime = A (u v) Esta
74 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
operacioacuten se denomina eliminar una arista
La funcioacuten (eliminaArista g a) elimina la arista a del grafo g
-- | Ejemplos
-- gtgtgt eliminaArista (creaGrafo [14] [(12)(14)(24)]) (14)
-- G [1234] [(12)(24)]
-- gtgtgt eliminaArista (creaGrafo [14] [(12)(14)(24)]) (41)
-- G [1234] [(12)(24)]
-- gtgtgt eliminaArista (creaGrafo [14] [(12)(14)(24)]) (43)
-- G [1234] [(12)(14)(24)]
eliminaArista Ord a =gt Grafo a -gt (aa) -gt Grafo a
eliminaArista g (ab) =
creaGrafo (vertices g)
(aristas g [(ab)(ba)])
La funcioacuten (eliminaLazos g) devuelve un nuevo grafo obtenido a partir del grafog eliminando todas las aristas que fueran lazos
-- | Ejemplos
-- gtgtgt eliminaLazos (creaGrafo [12] [(11)(12)(22)])
-- G [12] [(12)]
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
-- gtgtgt eliminaLazos (grafoCiclo 5)
-- G [12345] [(12)(15)(23)(34)(45)]
eliminaLazos Ord a =gt Grafo a -gt Grafo a
eliminaLazos g = creaGrafo (vertices g)
[(xy) | (xy) lt- aristas g x = y]
Eliminacioacuten un veacutertice
Definicioacuten 3520 Sea G = (V A) un grafo y sea v isin V Definimos el grafo G v como elsubgrafo de G Gprime = (Vprime Aprime) con Vprime = V v y Aprime = A a isin A|v es un extremo de aEsta operacioacuten se denomina eliminar un veacutertice
La funcioacuten (eliminaVertice g v) elimina el veacutertice v del grafo g
-- | Ejemplos
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(24)]) 1
-- G [234] [(24)]
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(24)]) 4
-- G [123] [(12)]
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(24)]) 3
-- G [124] [(12)(14)(24)]
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(13)]) 1
-- G [234] []
eliminaVertice Ord a =gt Grafo a -gt a -gt Grafo a
35 Definiciones y propiedades 75
eliminaVertice g v =
creaGrafo (vertices g [v])
(as [(ab) | (ab) lt- as a == v || b == v])
where as = aristas g
Suma de aristas
Definicioacuten 3521 Sea G = (V A) un grafo y sean u v isin V tales que (u v) (v u) 6isin ADefinimos el grafo G + (u v) como el grafo Gprime = (V A cup (u v)) Esta operacioacuten sedenomina suma de una arista
La funcioacuten (sumaArista g a) suma la arista a al grafo g
-- | Ejemplos
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
-- gtgtgt sumaArista (grafoCiclo 5) (13)
-- G [12345] [(12)(13)(15)(23)(34)(45)]
sumaArista Ord a =gt Grafo a -gt (aa) -gt Grafo a
sumaArista g a =
creaGrafo (vertices g) (a aristas g)
Suma de veacutertices
Definicioacuten 3522 Sea G = (V A) un grafo y sea v 6isin V Definimos el grafo G + v comoel grafo Gprime = (Vprime Aprime) donde Vprime = V cup v Aprime = Acup (u v)|u isin V Esta operacioacuten sedenomina suma de un veacutertice
La funcioacuten (sumaVertice g a) suma el veacutertice a al grafo g
-- | Ejemplo
-- gtgtgt grafoCiclo 3
-- G [123] [(12)(13)(23)]
-- gtgtgt sumaVertice (grafoCiclo 3) 4
-- G [1234] [(12)(13)(14)(23)(24)(34)]
sumaVertice Ord a =gt Grafo a -gt a -gt Grafo a
sumaVertice g v =
creaGrafo (v vs) (aristas g ++ [(uv) | u lt- vs])
where vs = vertices g
Propiedad de los grafos completos
Proposicioacuten 3523 La familia de grafos completos Kn verifica que Kn = Knminus1 + n
Vamos a ver que se cumple la propiedad utilizando la funcioacuten prop_completos
76 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
ghcigt quickCheck prop_completos
+++ OK passed 100 tests
prop_completos Int -gt Property
prop_completos n = n gt= 2 ==gt
completo n == sumaVertice (completo (n-1)) n
A partir de esta propiedad se puede dar una definicioacuten alternativa de la funcioacuten(completo n) que devuelve el grafo completo Kn La nueva funcioacuten seraacute (completo2n)
completo2 Int -gt Grafo Int
completo2 0 = grafoNulo
completo2 n = sumaVertice (completo2 (n-1)) n
Vamos a comprobar la equivalencia de ambas deficiones
ghcigt prop_EquiCompleto
True
prop_EquiCompleto Bool
prop_EquiCompleto = and [completo n == completo2 n | n lt- [050]]
Vamos a ver cuaacutel de las definiciones es maacutes eficiente
ghcigt tamantildeo (completo 100)
4950
(117 secs 0 bytes)
ghcigt tamantildeo (completo2 100)
4950
(1549 secs 61756056 bytes)
La funcioacuten (completo n) es maacutes eficiente asiacute que seraacute la que seguiremos utilizando
Suma de grafos
Definicioacuten 3524 Sean G = (V A) Gprime = (Vprime A) dos grafos Definimos el grafo sumade G y Gprime como el grafo G + Gprime = (V cup Vprime A cup Aprime cup (u v)|u isin V v isin Vprime) Estaoperacioacuten se denomina suma de grafos
La funcioacuten (sumaGrafos g g) suma los grafos g y g
-- | Ejemplo
-- gtgtgt let g1 = creaGrafo [13] [(11)(13)(23)]
-- gtgtgt let g2 = creaGrafo [46] [(46)(56)]
-- gtgtgt pp $ sumaGrafos g1 g2
-- G [123456]
-- [(1 1)(1 3)(1 4)(1 5)(1 6)(2 3)(2 4)
-- (2 5)(2 6)(3 4)(3 5)(3 6)(4 6)(5 6)]
sumaGrafos Ord a =gt Grafo a -gt Grafo a -gt Grafo a
35 Definiciones y propiedades 77
sumaGrafos g1 g2 =
creaGrafo (vs1 `union` vs2)
(aristas g1 `union`
aristas g2 `union`
[(uv) | u lt- vs1 v lt- vs2])
where vs1 = vertices g1
vs2 = vertices g2
Unioacuten de grafos
Definicioacuten 3525 Sean G = (V A) Gprime = (Vprime A) dos grafos Definimos el grafo unioacutende G y Gprime como el grafo G cup H = (V cupVprime A cup Aprime) Esta operacioacuten se denomina unioacuten degrafos
La funcioacuten (unionGrafos g g) une los grafos g y g Por ejemplo
-- | Ejemplo
-- gtgtgt let g1 = creaGrafo [13] [(11)(13)(23)]
-- gtgtgt let g2 = creaGrafo [46] [(46)(56)]
-- gtgtgt unionGrafos g1 g2
-- G [123456] [(11)(13)(23)(46)(56)]
unionGrafos Ord a =gt Grafo a -gt Grafo a -gt Grafo a
unionGrafos g1 g2 =
creaGrafo (vertices g1 `union` vertices g2)
(aristas g1 `union` aristas g2)
Grafo complementario
Definicioacuten 3526 Dado un grafo G = (V A) se define el grafo complementario de Gcomo G = (V A) donde A = (u v)|u v isin V (u v) 6isin A
La funcioacuten (grafoComplementario g) devuelve el grafo complementario de g
-- | Ejemplo
-- gtgtgt grafoComplementario (creaGrafo [13] [(11)(13)(23)])
-- G [123] [(12)(22)(33)]
grafoComplementario Ord a =gt Grafo a -gt Grafo a
grafoComplementario g =
creaGrafo vs
[(uv)| u lt- vs v lt- vs u lt= v not ((uv) `aristaEn` g)]
where vs = vertices g
Definicioacuten 3527 Dado un grafo diremos que es completo si su complementario sin lazosno tiene aristas
La funcioacuten (esCompleto g) se verifica si el grafo g es completo
78 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- Ejemplos
-- gtgtgt esCompleto (completo 4)
-- True
-- gtgtgt esCompleto (grafoCiclo 5)
-- False
esCompleto Ord a =gt Grafo a -gt Bool
esCompleto g =
tamantildeo (eliminaLazos (grafoComplementario g)) == 0
36 Morfismos de grafos
Llegados a este punto es importante resaltar que un grafo se define como una en-tidad matemaacutetica abstracta es evidente que lo importante de un grafo no son losnombres de sus veacutertices ni su representacioacuten graacutefica La propiedad que caracterizaa un grafo es la forma en que sus veacutertices estaacuten unidos por las aristasA priori los siguientes grafos pueden parecer distintos
a
bc
de
1
23
45
Sin embargo ambos grafos son grafos de cinco veacutertices que tienen las mismas rela-ciones de vecindad entre sus nodos En esta seccioacuten estudiaremos estas relacionesque establecen las aristas entre los veacutertices de un grafo y presentaremos algoritmosque nos permitan identificar cuaacutendo dos grafos se pueden relacionar mediante apli-caciones entre sus veacutertices cumpliendo ciertas caracteriacutesicas
361 Morfismos
Definicioacuten 361 Si f es una funcioacuten entre dos grafos G = (V A) y Gprime = (Vprime Aprime)diremos que conserva la adyacencia si forallu v isin V se verifica que si (u v) isin A entonces( f (u) f (v)) isin Aprime
La funcioacuten (conservaAdyacencia g h f) se verifica si la funcioacuten f entre los grafosg y h conserva las adyacencias
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [14] [(12)(23)(34)]
-- gtgtgt let g2 = creaGrafo [14] [(12)(23)(24)]
-- gtgtgt let g3 = creaGrafo [4610] [(48)(68)(810)]
36 Morfismos de grafos 79
-- gtgtgt conservaAdyacencia g1 g3 [(14)(26)(38)(410)]
-- False
-- gtgtgt conservaAdyacencia g2 g3 [(14)(28)(36)(410)]
-- True
conservaAdyacencia (Ord a Ord b) =gt
Grafo a -gt Grafo b -gt Funcion a b -gt Bool
conservaAdyacencia g h f =
and [(imagen f ximagen f y) `aristaEn` h | (xy) lt- aristas g]
Definicioacuten 362 Dados dos grafos simples G = (V A) y Gprime = (Vprime Aprime) un morfismoentre G y Gprime es una funcioacuten φ V rarr Vprime que conserva las adyacencias
La funcioacuten (esMorfismo g h vvs) se verifica si la funcioacuten representada por vvs esun morfismo entre los grafos g y h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(12)(32)]
-- gtgtgt let g2 = creaGrafo [456] [(46)(56)]
-- gtgtgt esMorfismo g1 g2 [(14)(26)(35)]
-- True
-- gtgtgt esMorfismo g1 g2 [(14)(25)(36)]
-- False
-- gtgtgt esMorfismo g1 g2 [(14)(26)(35)(79)]
-- False
esMorfismo (Ord aOrd b) =gt Grafo a -gt Grafo b -gt
Funcion a b -gt Bool
esMorfismo g1 g2 f =
esFuncion (vertices g1) (vertices g2) f ampamp
conservaAdyacencia g1 g2 f
La funcioacuten (morfismos g h) devuelve todos los posibles morfismos entre los grafosg y h
-- | Ejemplos
-- gtgtgt grafoCiclo 3
-- G [123] [(12)(13)(23)]
-- gtgtgt let g = creaGrafo [46] [(44)(66)]
-- gtgtgt morfismos (grafoCiclo 3) g
-- [[(14)(24)(34)][(16)(26)(36)]]
-- gtgtgt morfismos g (grafoCiclo 3)
-- []
morfismos (Ord a Ord b) =gt Grafo a -gt Grafo b -gt [[(ab)]]
morfismos g h =
[f | f lt- funciones (vertices g) (vertices h)
conservaAdyacencia g h f]
80 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
362 Complejidad del problema de homomorfismo de grafos
En general en computacioacuten un problema algoriacutetmico consta de un conjunto I detodas las posibles entradas para el problema llamado el conjunto de instancias y deuna pregunta Q sobre esas instancias Resolver uno de estos problemas consiste endesarrollar un algoritmo cuya entrada es una instancia del problema y cuya salidaes una respuesta a la pregunta del problemaDecimos que un problema es de decisioacuten cuando las posibles respuestas a la pre-gunta son ldquosiacuterdquo o ldquonordquo Un ejemplo de problema de este tipo seriacutea dados dos grafosdecidir si estos son homomorfos o noA la hora de implementar un algoritmo que deacute solucioacuten al problema que estemosconsiderando es importante tener en cuenta el nuacutemero de pasos que efectuacutea hastaencontrar una respuesta Un algoritmo de tiempo polinomial se define como aquelcon funcioacuten de complejidad temporal en O(p(n)) para alguna funcioacuten polinoacutemicap donde n denota el tamantildeo de la entrada Cualquier algoritmo cuya funcioacuten decomplejidad temporal no pueda ser acotada de esta manera se denomina algoritmode tiempo exponencialLa mayoriacutea de los algoritmos de tiempo exponencial son simples variaciones de unabuacutesqueda exhaustiva mientras que los algoritmos de tiempo polinomial usualmen-te se obtienen mediante un anaacutelisis maacutes profundo de la estructura del problema Enla Teoriacutea de la complejidad computacional existe el consenso de que un problemano estaacute ldquobien resueltordquo hasta que se conozca un algoritmo de tiempo polinomialque lo resuelva Por tanto nos referiremos a un problema como ldquointratablerdquo si estan difiacutecil que no existe algoritmo de tiempo polinomial capaz de resolverloLos problemas de decisioacuten para los que existen algoritmos polinomiales consti-tuyen la clase P y son llamados polinomiales Un problema de decisioacuten es no-determiniacutestico polinomial cuando cualquier instancia que produce respuesta ldquosiacuterdquoposee una comprobacioacuten de correctitud (tambieacuten llamada certificado) verificable entiempo polinomia en el tamantildeo de la instancia Estos problemas de decisioacuten se di-ce que pertenecen a la clase NP Claramente P sube NP Sin embargo no se sabe siesta inclusioacuten es estricta uno de los principales problemas abiertos en Teoriacutea de lacomputacioacuten es saber si P 6= NPUna reduccioacuten es una transformacioacuten de un problema en otro problema Intuitiva-mente un problema Q puede ser reducido a otro problema Qprime si cualquier instanciadel problema Q puede ser ldquofaacutecilmenterdquo expresada como una instancia del problemaQprime y cuya solucioacuten proporcione una solucioacuten para la instancia de QLas reducciones en tiempo polinomial nos dotan de elementos para probar de unamanera formal que un problema es al menos tan difiacutecil que otro con una dife-rencia de un factor polinomial Estas son esenciales para definir a los problemas
36 Morfismos de grafos 81
NP-completos ademaacutes de ayudar a comprender los mismosLa clase de los problemas NP-completos contiene a los problemas maacutes difiacuteciles enNP en el sentido de que son los que esteacuten maacutes lejos de estar en P Debido a que elproblema P = NP no ha sido resuelto el hecho de reducir un problema B a otroproblema A indicariacutea que no se conoce solucioacuten en tiempo polinomial para A Estoes debido a que una solucioacuten en tiempo polinomial para A tendriacutea como conse-cuencia la existencia de una solucioacuten polinomial para B De manera similar debidoa que todos los problemas NP pueden ser reducidos a este conjunto encontrar unproblema NP-completo que pueda ser resuelto en un tiempo polinomial significariacuteaque P = NPEl problema de decidir si dos grafos son homomorfos es un problema de decisioacutenNP-completo La NP-completitud del problema se demuestra mediante la reduccioacutende este problema al problema de la clique 17En el proceso de recopilacioacuten de imformacioacuten acerca de la Teoriacutea de la complejidadse ha trabajado con dos fuentesbull la tesis de licenciatura de Pablo Burzyn ldquoComplejidad computacional en proble-
mas de modificacioacuten de aristas en grafosrdquo ([2]) ybull el artiacuteculo ldquoTeoriacutea de la complejidad computacionalrdquo ([12]) de la Wikipedia
363 Isomorfismos
Definicioacuten 363 Dados dos grafos simples G = (V A) y Gprime = (Vprime Aprime) un isomorfis-mo entre G y Gprime es un morfismo biyectivo cuyo inverso es morfismo entre Gprime y G
La funcioacuten (esIsomorfismo g h f) se verifica si la aplicacioacuten f es un isomorfismoentre los grafos g y h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt esIsomorfismo g1 g2 [(12)(24)(36)]
-- True
-- gtgtgt esIsomorfismo g1 g2 [(12)(22)(36)]
-- False
esIsomorfismo (Ord aOrd b) =gt
Grafo a -gt Grafo b -gt Funcion a b -gt Bool
esIsomorfismo g h f =
esBiyectiva vs1 vs2 f ampamp
esMorfismo g h f ampamp
esMorfismo h g (inversa f)
where vs1 = vertices g
vs2 = vertices h
17httpseswikipediaorgwikiProblema_de_la_clique
82 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (isomorfismos1 g h) devuelve todos los isomorfismos posibles entrelos grafos g y h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfismos1 g1 g2
-- [[(12)(24)(36)]]
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfismos1 g3 g4
-- []
-- gtgtgt let g5 = creaGrafo [123] [(11)(22)(33)]
-- gtgtgt let g6 = creaGrafo [246] [(22)(44)(66)]
-- gtgtgt pp $ isomorfismos1 g5 g6
-- [[(1 2)(2 4)(3 6)][(1 4)(2 2)(3 6)]
-- [(1 6)(2 4)(3 2)][(1 4)(2 6)(3 2)]
-- [(1 6)(2 2)(3 4)][(1 2)(2 6)(3 4)]]
isomorfismos1 (Ord aOrd b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos1 g h =
[f | f lt- biyecciones vs1 vs2
conservaAdyacencia g h f
conservaAdyacencia h g (inversa f)]
where vs1 = vertices g
vs2 = vertices h
Definicioacuten 364 Dos grafos G y H se dicen isomorfos si existe alguacuten isomorfismo entreellos
La funcioacuten isomorfos1 g h se verifica si los grafos g y h son isomorfos
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfos1 g1 g2
-- True
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfos1 g3 g4
-- False
isomorfos1 (Ord aOrd b) =gt Grafo a -gt Grafo b -gt Bool
isomorfos1 g = not null isomorfismos1 g
Nota 361 Al tener Haskell una evaluacioacuten perezosa la funcioacuten (isomorfos g h)
no necesita generar todos los isomorfismos entre los grafos g y h
Definicioacuten 365 Sea G = (V A) un grafo Un invariante por isomorfismos de G esuna propiedad de G que tiene el mismo valor para todos los grafos que son isomorfos a eacutel
36 Morfismos de grafos 83
esInvariantePorIsomorfismos
Eq a =gt (Grafo Int -gt a) -gt Grafo Int -gt Grafo Int -gt Bool
esInvariantePorIsomorfismos p g h =
isomorfos g h --gt (p g == p h)
where (--gt) = (lt=)
Teorema 366 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un iso-morfismo Entonces se verifica que |V(G)| = |V(Gprime)| es decir el orden de un grafo es uninvariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos orden)
+++ OK passed 100 tests
Teorema 367 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces se verifica que |A(G)| = |A(Gprime)| es decir el tamantildeo de un grafo es uninvariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos tamantildeo)
+++ OK passed 100 tests
Teorema 368 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces tienen la misma secuencia de grados es decir la secuencia de grados de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos secuenciaGrados)
+++ OK passed 100 tests
A partir de las propiedades que hemos demostrado de los isomorfismos vamos adar otra definicioacuten equivalente de las funciones (isomorfismos1 g h) y (isomorfos1
g h)
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfismos2 g1 g2
-- [[(12)(24)(36)]]
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfismos2 g3 g4
-- []
-- gtgtgt let g5 = creaGrafo [123] [(11)(22)(33)]
84 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- gtgtgt let g6 = creaGrafo [246] [(22)(44)(66)]
-- gtgtgt pp $ isomorfismos2 g5 g6
-- [[(1 2)(2 4)(3 6)][(1 4)(2 2)(3 6)]
-- [(1 6)(2 4)(3 2)][(1 4)(2 6)(3 2)]
-- [(1 6)(2 2)(3 4)][(1 2)(2 6)(3 4)]]
isomorfismos2 (Ord a Ord b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos2 g h
| orden g = orden h = []
| tamantildeo g = tamantildeo h = []
| secuenciaGrados g = secuenciaGrados h = []
| otherwise = [f | f lt- biyecciones vs1 vs2
conservaAdyacencia g h f]
where vs1 = vertices g
vs2 = vertices h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfos2 g1 g2
-- True
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfos2 g3 g4
-- False
isomorfos2 (Ord a Ord b) =gt Grafo a -gt Grafo b -gt Bool
isomorfos2 g =
not null isomorfismos2 g
isomorfismos3 (Ord a Ord b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos3 g h
| orden g = orden h = []
| tamantildeo g = tamantildeo h = []
| secuenciaGrados g = secuenciaGrados h = []
| otherwise = filter (conservaAdyacencia g h) (posibles g h)
verticesPorGrados g =
[filter (p n) (vertices g) | n lt- nub (secuenciaGrados g)]
where p m v = grado g v == m
aux1 [] _ = []
aux1 (xsxss) (ysyss) = (map (zip xs) (permutations ys))aux1 xss yss
aux2 [] = []
aux2 (xss[]) = xss
aux2 (xssyss[]) = [xs ++ ys | xs lt- xss ys lt- yss]
aux2 (xssyssxsss) =
aux2 ([xs ++ ys | xs lt- xss ys lt- yss]xsss)
36 Morfismos de grafos 85
posibles g h =
aux2 (aux1 (verticesPorGrados g) (verticesPorGrados h))
Vamos a comparar la eficiencia entre ambas definiciones
Nota 362 La nueva definicioacuten de (isomorfismos3 g h) es la maacutes eficiente con gra-fos poco regulares sin embargo cuando todos los veacutertices tienen el mismo grado(isomorfismos2 g h) sigue siendo mejor opcioacuten (aunque no hay mucha diferenciaen el coste computacional)ghcigt let n = 6 in (length (isomorfismos1 (completo n) (completo n)))
720
(018 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos2 (completo n) (completo n)))
720
(018 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos3 (completo n) (completo n)))
720
(018 secs 26123800 bytes)
ghcigt let n = 6 in (length (isomorfismos1 (grafoCiclo n) (grafoCiclo n)))
12
(004 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos2 (grafoCiclo n) (grafoCiclo n)))
12
(004 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos3 (grafoCiclo n) (grafoCiclo n)))
12
(004 secs 0 bytes)
ghcigt length (isomorfismos1 (grafoCiclo 6) (completo 7))
0
(000 secs 0 bytes)
ghcigt length (isomorfismos2 (grafoCiclo 6) (completo 7))
0
(001 secs 0 bytes)
ghcigt length (isomorfismos3 (grafoCiclo 6) (completo 7))
0
(000 secs 0 bytes)
ghcigt isomorfos1 (completo 10) (grafoCiclo 10)
False
(5190 secs 12841861176 bytes)
ghcigt isomorfos2 (completo 10) (grafoCiclo 10)
False
(000 secs 0 bytes)
ghcigt isomorfos3 (completo 10) (grafoCiclo 10)
False
86 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
(000 secs 0 bytes)
ghcigt isomorfos1 (grafoCiclo 10) (grafoRueda 10)
False
(7390 secs 16433969976 bytes)
ghcigt isomorfos2 (grafoCiclo 100) (grafoRueda 100)
False
(000 secs 0 bytes)
ghcigt isomorfos3 (grafoCiclo 100) (grafoRueda 100)
False
(000 secs 0 bytes)
ghcigt length (isomorfismos2 (grafoRueda 10) (grafoRueda 10))
18
(10112 secs 23237139992 bytes)
ghcigt length (isomorfismos3 (grafoRueda 10) (grafoRueda 10))
18
(4467 secs 9021442440 bytes)
Nota 363 Cuando los grafos son isomorfos comprobar que tienen el mismo nuacuteme-ro de veacutertices el mismo nuacutemero de aristas y la misma secuencia graacutefica no requieremucho tiempo ni espacio dando lugar a costes muy similares entre los dos paresde definiciones Sin embargo cuando los grafos tienen el mismo nuacutemero de veacuterticesy fallan en alguna de las demaacutes propiedades el resultado es muy costoso para laprimera definicioacuten mientras que es inmediato con la segundaA partir de ahora utilizaremos la funcioacuten isomorfismos2 para calcular los isomor-fismos entre dos grafos y la funcioacuten isomorfos para determinar si dos grafos sonisomorfos de modo que las renombraremos por isomorfismos y isomorfismos res-pectivamente
isomorfismos (Ord aOrd b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos = isomorfismos2
isomorfos (Ord aOrd b) =gt Grafo a -gt Grafo b -gt Bool
isomorfos = isomorfos2
364 Automorfismos
Definicioacuten 369 Dado un grafo simple G = (V A) un automorfismo de G es un iso-morfismo de G en siacute mismo
La funcioacuten (esAutomorfismo g f) se verifica si la aplicacioacuten f es un automorfismode g
-- | Ejemplos
-- gtgtgt let g = creaGrafo [123] [(12)(13)]
37 Caminos en grafos 87
-- gtgtgt esAutomorfismo g [(11)(23)(32)]
-- True
-- gtgtgt esAutomorfismo g [(12)(23)(31)]
-- False
esAutomorfismo Ord a =gt Grafo a -gt Funcion a a -gt Bool
esAutomorfismo g = esIsomorfismo g g
La funcioacuten (automorfismos g) devuelve la lista de todos los posibles automorfis-mos en g
-- | Ejemplo
-- gtgtgt automorfismos (creaGrafo [123] [(12)(13)])
-- [[(11)(22)(33)][(11)(23)(32)]]
automorfismos Ord a =gt Grafo a -gt [Funcion a a]
automorfismos g = isomorfismos1 g g
Nota 364 Cuando trabajamos con automorfismos es mejor utilizar en su defini-cioacuten la funcioacuten isomorfismos1 en vez de isomorfismos2 pues ser isomorfos es unarelacioacuten reflexiva es decir un grafo siempre es isomorfo a siacute mismo
37 Caminos en grafos
Una de las aplicaciones de la teoriacutea de grafos es la determinacioacuten de trayectos o re-corridos en una red de transporte o de distribucioacuten de productos Asiacute si cada veacuterticerepresenta un punto de intereacutes y cada arista representa una conexioacuten entre dos pun-tos usando grafos como modelos podemos simplificar el problema de encontrar laruta maacutes ventajosa en cada caso
371 Definicioacuten de camino
Definicioacuten 371 Sea G = (V A) un grafo simple y sean u v isin V dos veacutertices Uncamino entre u y v es una sucesioacuten de veacutertices de G u = v0 v1 v2 vkminus1 vk = vdonde foralli isin 0 kminus 1 (vi vi+1) isin A
La funcioacuten (esCamino g c) se verifica si la sucesioacuten de veacutertices c es un camino enel grafo g
-- | Ejemplo
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
-- gtgtgt esCamino (grafoCiclo 5) [123451]
-- True
-- gtgtgt esCamino (grafoCiclo 5) [124531]
-- False
88 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
esCamino Ord a =gt Grafo a -gt [a] -gt Bool
esCamino g c = all (`aristaEn` g) (zip c (tail c))
La funcioacuten (aristasCamino c) devuelve la lista de las aristas recorridas en el ca-mino c
-- | Ejemplos
-- gtgtgt aristasCamino [123]
-- [(12)(23)]
-- gtgtgt aristasCamino [1231]
-- [(12)(23)(13)]
-- gtgtgt aristasCamino [1232]
-- [(12)(23)(23)]
aristasCamino Ord a =gt [a] -gt [(aa)]
aristasCamino c =
map parOrdenado (zip c (tail c))
where parOrdenado (uv) | u lt= v = (uv)
| otherwise = (vu)
La funcioacuten (verticesCamino c) devuelve la lista de las vertices recorridas en elcamino c
-- | Ejemplo
-- gtgtgt verticesCamino [1231]
-- [123]
verticesCamino Ord a =gt [a] -gt [a]
verticesCamino c = nub c
Definicioacuten 372 Se llama longitud de un camino al nuacutemero de veces que se atraviesa unaarista en dicho camino
La funcioacuten (longitudCamino c) devuelve la longitud del camino c
-- | Ejemplo
-- gtgtgt longitudCamino [427]
-- 2
longitudCamino [a] -gt Int
longitudCamino c = length c - 1
La funcioacuten (todosCaminos g u v k) devuelve todos los caminos entre los veacuterticesu y v en el grafo g que tienen longitud k
-- | Ejemplo
-- gtgtgt todosCaminos (creaGrafo [12] [(12)]) 1 2 3
-- [[1212]]
-- gtgtgt todosCaminos (bipartitoCompleto 2 3) 1 3 3
-- [[1313][1323][1413][1423][1513][1523]]
todosCaminos Ord a =gt Grafo a -gt a -gt a -gt Int -gt [[a]]
todosCaminos g u v 0 = if u == v ampamp elem u (vertices g)
37 Caminos en grafos 89
then [[u]]
else []
todosCaminos g u v 1 = if aristaEn (uv) g
then [[uv]]
else []
todosCaminos g u v k =
filter p [uvs | n lt- [1k-1] w lt- a u vs lt- tC w v n]
where p xs = longitudCamino xs == k
a = adyacentes g
tC = todosCaminos g
La funcioacuten (numeroCaminosDeLongitud g u v k) es el nuacutemero de caminos de lon-gitud k uniendo los veacutertices u y v en el grafo g
-- | Ejemplos
-- gtgtgt numeroCaminosDeLongitud (completo 7) 1 4 5
-- 1111
-- gtgtgt numeroCaminosDeLongitud grafoPetersen 1 4 3
-- 5
numeroCaminosDeLongitud Ord a =gt Grafo a -gt a -gt a -gt Int -gt Int
numeroCaminosDeLongitud g u v = length todosCaminos g u v
372 Recorridos
Definicioacuten 373 Sea G = (V A) un grafo y sean u v isin V Un camino entre u y v queno repite aristas (quizaacutes veacutertices) se llama recorrido
La funcioacuten (esRecorrido g c) se verifica si el camino c es un recorrido en el grafog
-- | Ejemplo
-- gtgtgt esRecorrido (grafoCiclo 4) [214]
-- True
-- gtgtgt esRecorrido (grafoCiclo 4) [2141]
-- False
-- gtgtgt esRecorrido (grafoCiclo 4) [213]
-- False
esRecorrido Ord a =gt Grafo a -gt [a] -gt Bool
esRecorrido g c =
esCamino g c ampamp sinRepetidos (aristasCamino c)
373 Caminos simples
Definicioacuten 374 Un camino que no repite veacutertices (y por tanto tampoco aristas) se llamacamino simple
90 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (esCaminoSimple g c) se verifica si el camino c es un camino simple enel grafo g
-- | Ejemplos
-- gtgtgt esCaminoSimple (creaGrafo [12] [(11)(12)]) [112]
-- False
-- gtgtgt esCaminoSimple (grafoCiclo 4) [214]
-- True
-- gtgtgt esCaminoSimple (grafoCiclo 4) [14321]
-- True
-- gtgtgt esCaminoSimple (grafoCiclo 4) [43212]
-- False
esCaminoSimple Ord a =gt Grafo a -gt [a] -gt Bool
esCaminoSimple g [] = True
esCaminoSimple g vs =
esRecorrido g vs ampamp noRepiteVertices vs
where noRepiteVertices (xxs)
| sinRepetidos (xxs) = True
| x == last xs ampamp sinRepetidos xs = True
| otherwise = False
La funcioacuten (todosArcosBP g u v) devuelve una lista con todos los caminos simplesposibles en el grafo g entre los veacutertices u y v utilizando una algoritmo de buacutesquedaen profundidad sobre el grafo g Este algoritmo recorre el grafo de izquierda a dere-cha y de forma al visitar un nodo explora todos los caminos que pueden continuarpor eacutel antes de pasar al siquiente
-- | Ejemplos
-- gtgtgt grafoCiclo 4
-- G [1234] [(12)(14)(23)(34)]
-- gtgtgt todosArcosBP (grafoCiclo 4) 1 4
-- [[14][1234]]
-- gtgtgt todosArcosBP (grafoCiclo 4) 4 1
-- [[4321][41]]
-- gtgtgt todosArcosBP (creaGrafo [14] [(12)(34)]) 1 4
-- []
-- gtgtgt todosArcosBP (creaGrafo [12] [(11)(12)]) 1 1
-- [[1]]
todosArcosBP Ord a =gt Grafo a -gt a -gt a -gt [[a]]
todosArcosBP g x y = aux [[y]]
where aux [] = []
aux ([]zss) = aux zss
aux ((zzs)zss)
| z == x = (zzs) aux zss
| otherwise =
aux ([vzzs | v lt- adyacentes g z zs] ++ zss)
g = eliminaLazos g
eliminaLazos h = creaGrafo (vertices h)
37 Caminos en grafos 91
[(xy) | (xy) lt- aristas h x = y]
La funcioacuten (todosArcosBA g u v) devuelve una lista con todos los caminos simplesposibles en el grafo g entre los veacutertices u y v utilizando una algoritmo de buacutesquedaen anchura sobre el grafo g Este algoritmo recorre el grafo por niveles de formaque el primer camino de la lista es de longitud miacutenima
-- | Ejemplos
-- gtgtgt grafoCiclo 4
-- G [1234] [(12)(14)(23)(34)]
-- gtgtgt todosArcosBA (grafoCiclo 4) 1 4
-- [[14][1234]]
-- gtgtgt todosArcosBA (grafoCiclo 4) 4 1
-- [[41][4321]]
-- gtgtgt todosArcosBA (creaGrafo [14] [(12)(34)]) 1 4
-- []
-- gtgtgt todosArcosBA (creaGrafo [12] [(11)(12)]) 1 1
-- [[1]]
todosArcosBA Ord a =gt Grafo a -gt a -gt a -gt [[a]]
todosArcosBA g x y = aux [[y]]
where aux [] = []
aux ([]zss) = aux zss
aux ((zzs)zss)
| z == x = (zzs) aux zss
| otherwise =
aux (zss ++ [vzzs | v lt- adyacentes g z zs])
g = eliminaLazos g
Vamos a comprobar con QuickCheck que el primer elemento de la lista que de-vuelve la funcioacuten (todosArcosBA g u v) es de longitud miacutenima Para ello vamos autilizar la funcioacuten (parDeVertices g) que es un generador de pares de veacutertices delgrafo no nulo g Por ejemplo
ghcigt sample (parDeVertices (creaGrafo [19] []))
(39)
(93)
(74)
(43)
(28)
(72)
(84)
(53)
(72)
(31)
(72)
92 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
parDeVertices Grafo Int -gt Gen (IntInt)
parDeVertices g = do
x lt- elements vs
y lt- elements vs
return (xy)
where vs = vertices g
La propiedad es
prop_todosArcosBA Grafo Int -gt Property
prop_todosArcosBA g =
not (esGrafoNulo g) ==gt
forAll (parDeVertices g)
((xy) -gt let zss = todosArcosBA g x y
in null zss || longitudCamino (head zss) ==
minimum (map longitudCamino zss))
La comprobacioacuten es
ghcigt quickCheck prop_todosArcosBA
+++ OK passed 100 tests
Veamos que la funcioacuten (todosArcosBP g u v) no verifica la propiedad
ghcigt quickCheck prop_todosArcosBP
Failed Falsifiable (after 6 tests)
G [12345] [(12)(14)(15)(22)(23)(24)(44)(45)(55)]
(52)
prop_todosArcosBP Grafo Int -gt Property
prop_todosArcosBP g =
not (esGrafoNulo g) ==gt
forAll (parDeVertices g)
((xy) -gt let zss = todosArcosBP g x y
in null zss || longitudCamino (head zss) ==
minimum (map longitudCamino zss))
La funcioacuten (numeroArcosDeLongitud g u v k) devuelve el nuacutemero de caminos en-tre los veacutertices u y v en el grafo g que tienen longitud k
-- | Ejemplos
-- gtgtgt numeroArcosDeLongitud (completo 6) 1 3 4
-- 24
-- gtgtgt numeroArcosDeLongitud grafoPetersen 1 3 4
-- 4
numeroArcosDeLongitud Ord a =gt Grafo a -gt a -gt a -gt Int -gt Int
numeroArcosDeLongitud g u v k =
length (filter p (todosArcosBA g u v))
where p vs = longitudCamino vs == k
37 Caminos en grafos 93
374 Conexioacuten
Definicioacuten 375 Dado un grafo G = (V A) sean u v isin V Si existe alguacuten camino entreu y v en el grafo G diremos que estaacuten conectados y lo denotamos por u v
La funcioacuten (estanConectados g u v) se verifica si los veacutertices u y v estaacuten conecta-dos en el grafo g
-- | Ejemplos
-- gtgtgt estanConectados (creaGrafo [14] [(12)(24)]) 1 4
-- True
-- gtgtgt estanConectados (creaGrafo [14] [(12)(34)]) 1 4
-- False
estanConectados Ord a =gt Grafo a -gt a -gt a -gt Bool
estanConectados g u v
| esGrafoNulo g = False
| otherwise = not (null (todosArcosBA g u v))
Nota 371 La funcioacuten (estanConectados g u v) no necesita calcular todos los ca-minos entre u y v Puesto que Haskell utiliza por defecto evaluacioacuten perezosa siexiste alguacuten camino entre los dos veacutertices basta calcular el primero para saber quela lista de todos los caminos no es vaciacutea
375 Distancia
Definicioacuten 376 Se define la distancia entre u y v en el grafo G como la longitud delcamino maacutes corto que los une Si u y v no estaacuten conectados decimos que la distancia esinfinita
La funcioacuten (distancia g u v) devuelve la distancia entre los veacutertices u y v en elgrafo g En caso de que los veacutertices no esteacuten conectados devuelve el valor Nothing
-- | Ejemplos
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 1
-- Just 0
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 2
-- Just 1
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 3
-- Just 2
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 4
-- Nothing
distancia Ord a =gt Grafo a -gt a -gt a -gt Maybe Int
distancia g u v
| estanConectados g u v =
Just (longitudCamino (head (todosArcosBA g u v)))
| otherwise = Nothing
94 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Definicioacuten 377 Dado G = (V A) un grafo sean u v isin V Un camino entre u y v cuyalongitud coincide con la distancia entre los veacutertices se llama geodeacutesica entre u y v
La funcioacuten (esGeodesica g c) se verifica si el camino c es una geodeacutesica entre susextremos en el grafo g
-- | Ejemplos
-- gtgtgt let g = creaGrafo [14] [(12)(13)(23)(34)]
-- gtgtgt esGeodesica g [134]
-- True
-- gtgtgt esGeodesica g [1234]
-- False
esGeodesica Ord a =gt Grafo a -gt [a] -gt Bool
esGeodesica g c =
esCamino g c ampamp
longitudCamino c == fromJust (distancia g u v)
where u = head c
v = last c
Nota 372 No hace falta imponer en la definicioacuten de la funcioacuten que el camino seaun recorrido pues el camino de miacutenima longitud entre dos veacutertices es siempre unrecorrido
376 Caminos cerrados
Definicioacuten 378 Un camino en un grafo G se dice cerrado si sus extremos son igualesDiremos que un camino cerrado de longitud tres es un triaacutengulo
La funcioacuten (esCerrado g c) se verifica si el camino c es cerrado en el grafo g
-- | Ejemplos
-- gtgtgt let g = creaGrafo [14] [(12)(13)(23)(34)]
-- gtgtgt esCerrado g [1231]
-- True
-- gtgtgt esCerrado g [123]
-- False
-- gtgtgt esCerrado g [1241]
-- False
esCerrado (Ord a) =gt Grafo a -gt [a] -gt Bool
esCerrado _ [] = False
esCerrado g (vc) =
esCamino g c ampamp v == last c
La funcioacuten (triangulos g v) devuelve la lista de todos los triaacutengulos que pasanpor el veacutertice v en el grafo g
-- | Ejemplos
-- gtgtgt triangulos (completo 4) 3
37 Caminos en grafos 95
-- [[3123][3143][3213][3243][3413][3423]]
-- gtgtgt triangulos (grafoCiclo 6) 1
-- []
triangulos Ord a =gt Grafo a -gt a -gt [[a]]
triangulos g u = todosCaminos g u u 3
377 Circuitos
Definicioacuten 379 Un recorrido en un grafo G se dice circuito si sus extremos son iguales
La funcioacuten (esCircuito g c) se verifica si la sucesioacuten de veacutertices c es un circuitoen el grafo g
-- | Ejemplos
-- gtgtgt grafoCiclo 4
-- G [1234] [(12)(14)(23)(34)]
-- gtgtgt esCircuito (grafoCiclo 4) [12341]
-- True
-- gtgtgt esCircuito (grafoCiclo 4) [1234]
-- False
-- gtgtgt esCircuito (grafoCiclo 4) [1234141]
-- False
esCircuito (Ord a) =gt Grafo a -gt [a] -gt Bool
esCircuito g c =
esRecorrido g c ampamp esCerrado g c
378 Ciclos
Definicioacuten 3710 Un camino simple en un grafo G se dice que es un ciclo si sus extremosson iguales
La funcioacuten (esCiclo g c) se verifica si el camino c es un ciclo en el grafo g
-- | Ejemplos
-- gtgtgt esCiclo (grafoCiclo 4) [121]
-- False
-- gtgtgt esCiclo (grafoCiclo 4) [12341]
-- True
-- gtgtgt esCiclo (grafoCiclo 4) [1234]
-- False
-- gtgtgt esCiclo (grafoCiclo 4) [1234141]
-- False
esCiclo (Ord a) =gt Grafo a -gt [a] -gt Bool
esCiclo g c =
esCaminoSimple g c ampamp esCerrado g c
96 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (todosCiclos g v) devuelve todos los ciclos en el grafo g que pasan porel veacutertice v
-- | Ejemplos
-- gtgtgt todosCiclos (grafoCiclo 4) 3
-- [[34123][32143]]
-- gtgtgt todosCiclos (completo 3) 2
-- [[2312][2132]]
-- gtgtgt todosCiclos (creaGrafo [123] [(11)(12)(13)(23)]) 1
-- [[1][1321][1231]]
-- gtgtgt todosCiclos (creaGrafo [12] [(12)(22)(23)]) 2
-- [[2]]
todosCiclos Ord a =gt Grafo a -gt a -gt [[a]]
todosCiclos g x =
map f (filter p (concat [todosArcosBA g x u | u lt- a x]))
where p c = longitudCamino c = 1
f c | longitudCamino c == 0 = c
| otherwise = c ++ [x]
a = adyacentes g
Nota 373 El algoritmo utilizado en la definicioacuten de (todosCiclos g) es el de buacutes-queda en anchura Este algoritmo recorre el grafo por niveles de forma que el pri-mer camino de la lista es de longitud miacutenima
379 Grafos aciacuteclicos
Definicioacuten 3711 Diremos que un grafo G = (V A) es aciacuteclico si no contiene ninguacutenciclo es decir si forallv isin V no existe ninguacuten camino simple que comience y termine en v
La funcioacuten (esAciclico g) se verifica si el grafo g es aciacuteclico
-- | Ejemplo
-- gtgtgt esAciclico (creaGrafo [14] [(12)(24)])
-- True
-- gtgtgt esAciclico (grafoCiclo 5)
-- False
-- gtgtgt esAciclico (grafoEstrella 6)
-- True
esAciclico Ord a =gt Grafo a -gt Bool
esAciclico g =
and [null (todosCiclos g x) | x lt- vertices g]
38 Conectividad de los grafos 97
38 Conectividad de los grafos
381 Estar conectados por un camino
Teorema 381 Dado un grafo G la relacioacuten u sim v (estar conectados por un camino) es unarelacioacuten de equivalencia
La funcioacuten (estarConectadosCamino g) devuelve la relacioacuten entre los veacutertices delgrafo g de estar conectados por un camino en eacutel
-- | Ejemplo
-- gtgtgt estarConectadosCamino (creaGrafo [14] [(12)(24)])
-- [(11)(12)(14)(21)(22)(24)(33)(41)(42)(44)]
estarConectadosCamino Ord a =gt Grafo a -gt [(aa)]
estarConectadosCamino g =
[(uv) | u lt- vs v lt- vs estanConectados g u v]
where vs = vertices g
A continuacioacuten comprobaremos el resultado con QuickCheck
ghcigt quickCheck prop_conectadosRelEqui
+++ OK passed 100 tests
prop_conectadosRelEqui Grafo Int -gt Bool
prop_conectadosRelEqui g =
esRelacionEquivalencia (vertices g) (estarConectadosCamino g)
382 Componentes conexas de un grafo
Definicioacuten 382 Las clases de equivalencia obtenidas por la relacioacuten sim estar conectadospor un camino en un grafo G inducen subgrafos en G los veacutertices y todas las aristas de loscaminos que los conectan que reciben el nombre de componentes conexas por caminosde G
La funcioacuten (componentesConexas1 g) devuelve las componentes conexas por cami-nos del grafo g
-- | Ejemplos
-- gtgtgt componentesConexas (creaGrafo [15] [(12)(23)])
-- [[123][4][5]]
-- gtgtgt componentesConexas (creaGrafo [15] [(12)(23)(45)])
-- [[123][45]]
-- gtgtgt componentesConexas (creaGrafo [13] [(12)(23)])
-- [[123]]
componentesConexas1 Ord a =gt Grafo a -gt [[a]]
componentesConexas1 g =
clasesEquivalencia (vertices g) (estarConectadosCamino g)
98 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Vamos a definir dos nuevas funciones una que compruebe si el grafo es nulo o com-pleto pues en dichos casos las componentes seraacuten el conjunto vaciacuteo y el conjuntodel conjunto de veacutertices respectivamente y otra con un algoritmo algo maacutes comple-jo
componentesConexas2 Ord a =gt Grafo a -gt [[a]]
componentesConexas2 g
| esGrafoNulo g = []
| esCompleto g = [vertices g]
| otherwise =
clasesEquivalencia (vertices g) (estarConectadosCamino g)
componentesConexas3 Ord a =gt Grafo a -gt [[a]]
componentesConexas3 g = aux (vertices g) [] []
where aux [] [] [] = []
aux [] xs ys = [xs]
aux (vvs) [] [] =
aux (vs (a v)) (i v (a v)) (a v)
aux vs xs ys | null ((ug [a v | v lt- ys]) xs) =
xs aux vs [] []
| otherwise =
aux (vs ug [a v | v lt- ys])
(u xs (ug [a v | v lt- ys]))
(ug [a v | v lt- ys] ys)
a = adyacentes g
i = inserta
ug = unionGeneral
u = unionConjuntos
La comprobacioacuten con QuickCheck de la equivalencia de las definiciones es
ghcigt quickCheck prop_EquiComponentesConexas
+++ OK passed 100 tests
ghcigt quickCheck prop_EquiComponentesConexas2
+++ OK passed 100 tests
prop_EquiComponentesConexas Grafo Int -gt Bool
prop_EquiComponentesConexas g =
componentesConexas1 g == componentesConexas2 g
prop_EquiComponentesConexas2 Grafo Int -gt Bool
prop_EquiComponentesConexas2 g =
componentesConexas1 g == componentesConexas3 g
Comparemos ahora la eficiencia de las definiciones
ghcigt componentesConexas1 grafoNulo
[]
(003 secs 0 bytes)
38 Conectividad de los grafos 99
ghcigt componentesConexas2 grafoNulo
[]
(001 secs 0 bytes)
ghcigt componentesConexas3 grafoNulo
[]
(001 secs 0 bytes)
ghcigt length (componentesConexas1 (completo 50))
1
(023 secs 0 bytes)
ghcigt length (componentesConexas2 (completo 50))
1
(016 secs 0 bytes)
ghcigt length (componentesConexas3 (completo 50))
1
(008 secs 0 bytes)
ghcigt length (componentesConexas1 (completo 100))
1
(217 secs 205079912 bytes)
ghcigt length (componentesConexas2 (completo 100))
1
(285 secs 0 bytes)
ghcigt length (componentesConexas3 (completo 100))
1
(119 secs 0 bytes)
ghcigt length (componentesConexas1 (completo 150))
1
(1295 secs 742916792 bytes)
ghcigt length (componentesConexas2 (completo 150))
1
(2048 secs 0 bytes)
ghcigt length (componentesConexas3 (completo 150))
1
(964 secs 0 bytes)
Con grafos completos de gran tamantildeo Haskell tarda maacutes tiempo en comprobar quees completo que en calcular directamente sus clases de equivalencia y para grafosnulos apenas hay diferencia en el coste entre la primera y la segunda definicioacuten Porotra parte la tercera definicioacuten es la maacutes eficiente en todos los casos y seraacute por tantola que utilizaremos a lo largo del trabajo
componentesConexas Ord a =gt Grafo a -gt [[a]]
componentesConexas = componentesConexas3
La funcioacuten (numeroComponentes g) devuelve el nuacutemero de componentes conexasdel grafo g
-- Ejemplos
-- gtgtgt numeroComponentes (creaGrafo [15] [(12)(23)(45)])
100 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- 2
-- gtgtgt numeroComponentes (creaGrafo [14] [(12)(22)(34)])
-- 2
numeroComponentes Ord a =gt Grafo a -gt Int
numeroComponentes g
| null (aristas g) = orden g
| otherwise = length (componentesConexas g)
Nota 381 Hemos comprobado para la definicioacuten anterior que comprobar si un gra-fo es completo es muy costoso luego no conviene antildeadirlo como patroacuten
383 Grafos conexos
Definicioacuten 383 Dado un grafo diremos que es conexo si la relacioacuten tiene una uacutenica clasede equivalencia en eacutel es decir si el grafo tiene una uacutenica componente conexa
La funcioacuten (esConexo g) se verifica si el grafo g es conexo
-- Ejemplos
-- gtgtgt esConexo (creaGrafo [13] [(12)(23)])
-- True
-- gtgtgt esConexo (creaGrafo [15] [(12)(23)(45)])
-- False
esConexo Ord a =gt Grafo a -gt Bool
esConexo g = length (componentesConexas g) == 1
esConexo2 Ord a =gt Grafo a -gt Bool
esConexo2 g
| esGrafoNulo g = False
| esUnitario (vertices g) = True
| otherwise = aux (vertices g) [] []
where aux [] [] [] = False
aux [] xs _ = True
aux (vvs) [] [] | null vs = True
| null (a v) = False
| otherwise =
aux (vs a v) (i v (a v)) (a v)
aux vs xs ys | null ((ug [a v | v lt- xs]) xs) = False
| otherwise =
aux (vs (ug [a v | v lt- xs]))
(u (ug [a v | v lt- xs]) xs)
((ug [a v | v lt- xs]) xs)
a = adyacentes g
ug = unionGeneral
i = inserta
u = unionConjuntos
38 Conectividad de los grafos 101
La comprobacioacuten de la equivalencia de las definiciones con QuickCheck es
ghcigt quickCheck prop_EquiEsConexo
+++ OK passed 100 tests
prop_EquiEsConexo Grafo Int -gt Bool
prop_EquiEsConexo g =
esConexo g == esConexo2 g
Vamos a comparar ahora su eficiencia
ghcigt let g1 = grafoCiclo 100
(000 secs 0 bytes)
ghcigt let g = creaGrafo (vertices g1) (aristas g1 [(23)(9899)])
(000 secs 0 bytes)
ghcigt esConexo g
False
(117 secs 151632168 bytes)
ghcigt esConexo2 g
False
(001 secs 0 bytes)
ghcigt esConexo (grafoCiclo 500)
True
(7341 secs 10448270712 bytes)
ghcigt esConexo2 (grafoCiclo 500)
True
(18939 secs 18468849096 bytes)
ghcigt esConexo (grafoCiclo 500)
True
(7341 secs 10448270712 bytes)
ghcigt esConexo2 (grafoCiclo 500)
True
(18939 secs 18468849096 bytes)
En principio no nos proporciona ninguna ventaja la segunda definicioacuten asiacute que tra-bajaremos con la primera que hemos dado ya que es mucho maacutes sencilla
Teorema 384 Sea G un grafo G = (V A) es conexo si y solamente si forallu v isin V existe uncamino entre u y v
Vamos a comprobar el resultado con QuickCheck
ghcigt quickCheck prop_caracterizaGrafoConexo
+++ OK passed 100 tests
prop_caracterizaGrafoConexo Grafo Int -gt Property
prop_caracterizaGrafoConexo g =
not (esGrafoNulo g) ==gt
esConexo g == and [estanConectados g u v
| u lt- vertices g v lt- vertices g]
102 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
384 Excentricidad
Definicioacuten 385 Sean G = (V A) un grafo y v isin V Se define la excentricidad de v comoel maacuteximo de las distancias entre v y el resto de veacutertices de G La denotaremos por e(v)
La funcioacuten (excentricidad g v) devuelve la excentricidad del veacutertice v en el grafog
-- | Ejemplos
-- gtgtgt let g = creaGrafo [13] [(12)(23)(33)]
-- gtgtgt excentricidad g 1
-- Just 2
-- gtgtgt excentricidad g 2
-- Just 1
-- gtgtgt excentricidad (creaGrafo [13] [(12)(33)]) 1
-- Nothing
excentricidad Ord a =gt Grafo a -gt a -gt Maybe Int
excentricidad g u
| esGrafoNulo g = Nothing
| orden g == 1 = Just 0
| Nothing `elem` distancias = Nothing
| otherwise = maximum distancias
where distancias = [distancia g u v | v lt- vertices g [u]]
La funcioacuten (excentricidades g) devuelve la lista ordenada de las excentricidadesde los veacutertices del grafo g
-- | Ejemplos
-- gtgtgt excentricidades (creaGrafo [13] [(12)(23)(33)])
-- [Just 1Just 2Just 2]
-- gtgtgt excentricidades (creaGrafo [13] [(12)(33)])
-- [NothingNothingNothing]
excentricidades Ord a =gt Grafo a -gt [Maybe Int]
excentricidades g = sort (map (excentricidad g) (vertices g))
385 Diaacutemetro
Definicioacuten 386 Sea G = (V A) un grafo Se define el diaacutemetro de G como el maacuteximo delas distancias entre los veacutertices en V Lo denotaremos por d(G)
La funcioacuten (diametro g) devuelve el diaacutemetro del grafo g
-- | Ejemplos
-- gtgtgt diametro (creaGrafo [13] [(12)(23)(33)])
-- Just 2
-- gtgtgt diametro (creaGrafo [13] [(12)(33)])
-- Nothing
diametro Ord a =gt Grafo a -gt Maybe Int
38 Conectividad de los grafos 103
diametro g
| esGrafoNulo g = Nothing
| Nothing `elem` distancias = Nothing
| otherwise = maximum distancias
where vs = vertices g
distancias = [distancia g u v | u lt- vs v lt- vs u lt= v]
386 Radio
Definicioacuten 387 Sean G = (V A) un grafo y v isin V Se define el radio de G como elmiacutenimo de las excentricidades de sus veacutertices Lo denotaremos por r(G)
La funcioacuten (radio g) devuelve el radio del grafo g
-- | Ejemplos
-- gtgtgt radio (creaGrafo [13] [(12)(23)(33)])
-- Just 1
-- gtgtgt radio (creaGrafo [13] [(12)(33)])
-- Nothing
radio Ord a =gt Grafo a -gt Maybe Int
radio g
| esGrafoNulo g = Nothing
| Nothing `elem` ds = Nothing
| otherwise = minimum ds
where ds = [excentricidad g v | v lt- vertices g]
387 Centro
Definicioacuten 388 Sean G = (V A) un grafo Llamamos centro del grafo G al conjunto deveacutertices de excentricidad miacutenima A estos veacutertices se les denomina veacutertices centrales
La funcioacuten (centro g) devuelve el centro del grafo g Por ejemplo
-- | Ejemplos
-- gtgtgt centro (creaGrafo [13] [(12)(23)(33)])
-- [2]
-- gtgtgt centro (creaGrafo [13] [(12)(13)(23)])
-- [123]
-- gtgtgt centro (creaGrafo [13] [(12)(33)])
-- [123]
centro Ord a =gt Grafo a -gt [a]
centro g = [v | v lt- vertices g excentricidad g v == r]
where r = radio g
104 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
388 Grosor
Definicioacuten 389 Sean G = (V A) un grafo Se llama grosor o cintura del grafo G almiacutenimo de las longitudes de los ciclos de G Si el grafo no posee ciclos (es decir es un grafoaciacuteclico) se dice que su cintura es infinita
La funcioacuten (grosor g) devuelve el grosor del grafo g
-- | Ejemplos
-- gtgtgt grosor (creaGrafo [123] [(12)(23)])
-- Nothing
-- gtgtgt grosor (creaGrafo [123] [(11)(12)(23)(34)])
-- Just 0
-- gtgtgt grosor grafoPetersen
-- Just 5
-- gtgtgt grosor grafoMoebiusCantor
-- Just 6
-- gtgtgt grosor grafoHeawood
-- Just 6
-- gtgtgt grosor grafoMcGee
-- Just 7
-- gtgtgt grosor grafoTutteCoxeter
-- Just 8
grosor Ord a =gt Grafo a -gt Maybe Int
grosor g
| esAciclico g = Nothing
| otherwise = Just (minimum [longitudCamino (head yss)
| x lt- vertices g
let yss = todosCiclos g x
not (null yss)])
Propiedades del grosor de los grafos
Teorema 3810 El grosor del grafo ciclo de orden n Cn es infin si n lt 3 y 3 en caso contrario
La propiedad se expresa por
prop_grosor_grafoCiclo Int -gt Bool
prop_grosor_grafoCiclo n =
grosor (grafoCiclo n) == if n lt 3
then Nothing
else Just n
Su comprobacioacuten para n le 30 es
ghcigt all prop_grosor_grafoCiclo [130]
True
Teorema 3811 El grosor del grafo amistad de orden n es 3 para todo n
38 Conectividad de los grafos 105
prop_grosor_grafoAmistad Int -gt Bool
prop_grosor_grafoAmistad n =
grosor (grafoAmistad n) == Just 3
Su comprobacioacuten para n le 30 es
ghcigt all prop_grosor_grafoAmistad [130]
True
Teorema 3812 El grosor del grafo completo de orden n Kn es infin si n lt 3 y 3 en casocontrario
La propiedad se expresa por
prop_grosor_completo Int -gt Bool
prop_grosor_completo n =
grosor (completo n) == if n lt 3
then Nothing
else Just 3
Su comprobacioacuten para n le 30 es
ghcigt all prop_grosor_completo [130]
True
Teorema 3813 El grosor del grafo bipartito completo de orden Kmn es infin si m = 1 oacuten = 1 y es 4 en caso contrario y 3 en caso contrario
La propiedad se expresa por
prop_grosor_bipartitoCompleto Int -gt Int -gt Bool
prop_grosor_bipartitoCompleto m n =
grosor (bipartitoCompleto m n) == if m == 1 || n == 1
then Nothing
else Just 4
Su comprobacioacuten para 1 le m le n le 15 es
ghcigt and [prop_grosor_bipartitoCompleto m n | m lt- [115] n lt- [m15]]
True
Teorema 3814 El grosor del grafo rueda de orden n Wn es infin si n lt 3 y 3 en caso contrario
La propiedad se expresa por
prop_grosor_grafoRueda Int -gt Bool
prop_grosor_grafoRueda n =
grosor (grafoRueda n) == if n lt 3
then Nothing
else Just 3
106 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Su comprobacioacuten para 1 le n le 30 es
ghcigt all prop_grosor_grafoRueda [130]
True
389 Propiedades e invariantes por isomorfismos
Teorema 3815 Sean G = (V A) y Gprime = (Vprime Aprime) grafos isomorfos con φ V rarr Vprime unisomorfismo Entonces dados u v isin V u sim v si y solamente si φ(u) sim φ(v)
La comprobacioacuten del teorema con QuickCheck es
ghcigt quickCheck prop_ConexionIsomorfismo1
+++ OK passed 100 tests
prop_ConexionIsomorfismo1 Grafo Int -gt Grafo Int -gt Bool
prop_ConexionIsomorfismo1 g h =
not (isomorfos g h) ||
and [ec g u v == ec h (imagen phi u) (imagen phi v)
| u lt- vs
v lt- vs
phi lt- isomorfismos g h]
where vs = vertices g
ec = estanConectados
Teorema 3816 Sean G = (V A) y Gprime = (Vprime Aprime) grafos isomorfos con φ V rarr Vprime unisomorfismo Entonces φ lleva cada componente conexa de G en una componente conexa deGprime
La comprobacioacuten del teorema con QuickCheck es
ghcigt quickCheck prop_ConexionIsomorfismo2
+++ OK passed 100 tests
prop_ConexionIsomorfismo2 Grafo Int -gt Grafo Int -gt Bool
prop_ConexionIsomorfismo2 g h =
not(isomorfos g h) ||
and [conjuntosIguales cch (aux f) | f lt- isomorfismos g h]
where cch = componentesConexas h
ccg = componentesConexas g
aux f = map (sort imagenConjunto f) ccg
Teorema 3817 Sean G = (V A) y Gprime = (Vprime Aprime) grafos isomorfos con φ V rarr Vprime unisomorfismo Entonces G y Gprime tienen el mismo nuacutemero de componentes conexas
La comprobacioacuten del teorema con QuickCheck es
38 Conectividad de los grafos 107
ghcigt quickCheck prop_ConexionIsomorfismo3
+++ OK passed 100 tests
prop_ConexionIsomorfismo3 Grafo Int -gt Grafo Int -gt Bool
prop_ConexionIsomorfismo3 g h =
not (isomorfos g h) ||
numeroComponentes g == numeroComponentes h
Teorema 3818 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que el diaacutemetro de G es igual al diaacutemetro de Gprime es decir el diaacutemetrode un grafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos diametro)
+++ OK passed 100 tests
Teorema 3819 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces se verifica que el radio de G es igual al radio de Gprime es decir el radio de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos radio)
+++ OK passed 100 tests
Teorema 3820 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que el grosor de G es igual al grosor de Gprime es decir el grosor de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos grosor)
+++ OK passed 100 tests
Teorema 3821 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que el centro de G es igual al centro de Gprime es decir el centro de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos centro)
+++ OK passed 100 tests
Teorema 3822 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces se verifica que el nuacutemero de componentes conexas de G es igual al nuacutemerode las de Gprime es decir el nuacutemero de componentes conexas de un grafo es un invariante porisomorfismos
108 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos numeroComponentes)
+++ OK passed 100 tests
Teorema 3823 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que los valores que toman las excentricidades de los veacutertices G esigual al de los veacutertices de Gprime es decir el conjunto de valores que toman las excentricidadesde los veacutertices es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos excentricidades)
+++ OK passed 100 tests
Capiacutetulo 4
Matrices asociadas a grafos
En este capiacutetulo se definiraacuten algunas representaciones de grafos como matrices secomprobaraacuten sus propiedades y volveremos a definir algunos conceptos del capiacutetu-lo 3 ahora utilizando matricesPara elaborar el contenido del capiacutetulo utilizareacute el segundo tema del trabajo fin degrado de Fco Javier Franco Galviacuten Aspectos algebraicos en teoriacutea de grafos ([7]) En eltrabajo el autor introduce los conceptos de matriz de adyacencia matriz de incidenciay otras matrices asociadas a grafos
41 Generador de grafos simples
En esta seccioacuten presentaremos el generador de grafos que nos permitiraacute generargrafos simples como listas de aristas arbitrariamente y usarlos como ejemplos opara comprobar propiedades en la seccioacuten de matrices asociadas a grafos(grafoSimple) es un generador de grafos simples de hasta 10 veacutertices Por ejemplo
ghcigt sample grafoSimple
G [12345678] [(14)(15)(16)(17)(18)(23)
(24)(25)(27)(35)(37)(45)(46)(56)(67)]
G [123456789] [(14)(18)(23)(25)(29)
(34)(35)(36)(38)(39)(46)(48)(49)
(58)(59)(69)(78)]
G [123456] [(12)(13)(24)(25)(26)(35)(56)]
G [1234567] [(12)(13)(14)(24)(25)(26)
(36)(45)(46)(67)]
G [1234] [(13)(14)(23)(34)]
G [123] [(23)]
G [12] [(12)]
G [123456] [(16)(24)(26)(35)(36)(56)]
G [123456789] [(12)(14)(15)(16)(17)(24)
(34)(37)(38)(39)(45)(47)(49)(56)(57)
(58)(59)(67)(69)(78)(79)]
109
110 Capiacutetulo 4 Matrices asociadas a grafos
G [123456789] [(13)(14)(15)(16)(23)(24)
(29)(35)(39)(45)(47)(48)(49)(57)(58)
(59)(67)(68)(69)(79)]
G [1] []
grafoSimple Gen (Grafo Int)
grafoSimple = do
n lt- choose (010)
as lt- sublistOf [(xy) | x lt- [1n] y lt- [x+1n]]
return (creaGrafo [1n] as)
42 Matrices de adyacencia
421 Definicioacuten y propiedades
Usaremos la funcioacuten (imprimeMatriz p) para imprimir por pantalla la matriz p conuna fila por liacutenea
-- | Ejemplo
-- gtgtgt imprimeMatriz (fromLists [[134][357][479]])
-- [134]
-- [357]
-- [479]
imprimeMatriz Show a =gt Matrix a -gt IO ()
imprimeMatriz p =
mapM_ print (toLists p)
Definicioacuten 421 Sea G = (V A) un grafo simple con V = v1 vn Se define sumatriz de adyacencia como Antimesn = (aij) donde el elemento aij toma el valor 1 si existealguna arista en A uniendo los veacutertices vi y vj y 0 en caso contrario
Nota 421 La matriz de adyacencia depende del etiquetado del grafo
La funcioacuten (matrizAdyacencia g) es la matriz de adyacencia del grafo g
-- | Ejemplo
-- gtgtgt imprimeMatriz (matrizAdyacencia (grafoCiclo 4))
-- [0101]
-- [1010]
-- [0101]
-- [1010]
-- gtgtgt imprimeMatriz (matrizAdyacencia (completo 4))
-- [0111]
-- [1011]
-- [1101]
-- [1110]
42 Matrices de adyacencia 111
matrizAdyacencia Grafo Int -gt Matrix Int
matrizAdyacencia g = matrix n n f
where n = orden g
f (ij) | (ij) `aristaEn` g = 1
| otherwise = 0
422 Propiedades baacutesicas de las matrices
La funcioacuten (esSimetrica p) se verifica si la matriz p es simeacutetrica
-- ejemplo
-- gtgtgt esSimetrica (fromLists [[134][357][479]])
-- True
-- gtgtgt esSimetrica (fromLists [[134][357][497]])
-- False
esSimetrica Eq a =gt Matrix a -gt Bool
esSimetrica p =
transpose p == p
La funcioacuten (potencia p n) devuelvela potencia nndasheacutesima de la matriz cuadrada p
-- Ejemplo
-- gtgtgt potencia (fromLists [[134][357][479]]) 3
-- ( 408 735 975 )
-- ( 735 1323 1755 )
-- ( 975 1755 2328 )
potencia Num a =gt Matrix a -gt Int -gt Matrix a
potencia p 1 = p
potencia p n = if (odd n)
then (m p (potencia (m p p) (div (n-1) 2)))
else (potencia (m p p) (div (n-1) 2))
where m = multStd2
423 Propiedades de las matrices de adyacencia
Teorema 422 Para todo n la matriz de adyacencia del grafo ciclo de orden n Cn es simeacute-trica
ghcigt all prop_simetricaAdyacenciaCompleto [130]
True
prop_simetricaAdyacenciaCompleto Int -gt Bool
prop_simetricaAdyacenciaCompleto n =
esSimetrica (matrizAdyacencia (completo n))
La funcioacuten (tamantildeoM g) devuelve el tamantildeo del grafo simple g calculado usandosu matriz de adyacencia
112 Capiacutetulo 4 Matrices asociadas a grafos
-- | Ejemplos
-- gtgtgt tamantildeoM (grafoCiclo 4)
-- 4
-- gtgtgt tamantildeoM grafoPetersen
-- 15
tamantildeoM Grafo Int -gt Int
tamantildeoM g = sum (toList (matrizAdyacencia g)) `div` 2
Teorema 423 El tamantildeo de un grafo simple es la mitad de la suma de los elementos de sumatriz de adyacencia
La comprobacioacuten del teorema con QuickCheck es
ghcigt quickCheck prop_tamantildeoMatriz
+++ OK passed 100 tests
prop_tamantildeoMatriz Property
prop_tamantildeoMatriz =
forAll grafoSimple
(g -gt tamantildeo g == tamantildeoM g)
Teorema 424 Si un grafo G = (V A) tiene un veacutertice aislado vi tanto la fila como lacolumna indasheacutesima de su matriz de adyacencia estaraacuten formadas por ceros
esAisladoM Grafo Int -gt Int -gt Bool
esAisladoM g v = if (all (==0)
(((toLists (ma g)) (v-1))
++((toLists (t (ma g))) (v-1))))
then True
else False
where ma = matrizAdyacencia
t = transpose
La comprobacioacuten del teorema es
ghcigt quickCheck prop_esAisladoMatriz
+++ OK passed 100 tests
prop_esAisladoMatriz Property
prop_esAisladoMatriz =
forAll grafoSimple
(g -gt and [esAislado g v == esAisladoM g v
| v lt- vertices g])
Teorema 425 Sea un grafo G = (V A) simple no dirigido con V = v1 vn Lasuma de los elementos de la fila (o columna) indasheacutesima de su matriz de adyacencia coincide conel grado del veacutertice vi Es decir
42 Matrices de adyacencia 113
δ(vi) =n
sumj=1
aij =n
sumj=1
aji
gradoM Grafo Int -gt Int -gt Int
gradoM g v = sum ((toLists (ma g)) (v-1))
where ma = matrizAdyacencia
La comprobacioacuten del teorema es
ghcigt quickCheck prop_gradoMatriz
+++ OK passed 100 tests
prop_gradoMatriz Property
prop_gradoMatriz =
forAll grafoSimple
(g -gt and [grado g v == gradoM g v | v lt- vertices g])
Teorema 426 Sea G = (V A) un grafo bipartito de conjuntos de veacutertices disjuntosV1 = v1 vk y V2 = vk+1 vn tal que V = V1 cup V2 y soacutelo existen aristasque conectan veacutertices de V1 con veacutertices de V2 Entonces con este etiquetado de V la matrizde adyacencia de G tiene la forma
A =
(θ BBt θ
)
prop_BipartitoMatriz Grafo Int -gt Property
prop_BipartitoMatriz g =
esBipartito g ==gt
all (==0) [ getElem u v m | [uv] lt- (f (fromJust p))]
where f (xsys) = filter p (subsequences xs ++ subsequences ys)
where p zs = length zs == 2
p = conjuntosVerticesDisjuntos g
m = matrizAdyacencia g
424 Caminos y arcos
En esta seccioacuten se presentaraacute la informacioacuten que contiene la matriz de adyacenciade un grafo en relacioacuten a los caminos que se encuentran en eacutel
Teorema 427 Sea G = (V A) un grafo con V = v1 vn y matriz de adyacenciaA = (aij) Entonces forallk ge 0 el elemento (i j) de Ak que denotaremos por ak
ij es elnuacutemero de caminos de longitud k desde el veacutertice vi al veacutertice vj
114 Capiacutetulo 4 Matrices asociadas a grafos
numeroCaminosDeLongitudM Grafo Int -gt Int -gt Int -gt Int -gt Int
numeroCaminosDeLongitudM g u v k = getElem u v mk
where ma = matrizAdyacencia g
n = orden g
mk = foldr (multStd2) (identity n) (take k (repeat ma))
La comprobacioacuten del teorema para k le 6 es
ghcigt quickCheck prop_numeroCaminosMatriz
+++ OK passed 100 tests
prop_numeroCaminosMatriz Grafo Int -gt Gen Bool
prop_numeroCaminosMatriz g = do
k lt- choose (06)
let vs = vertices g
return (and [ numeroCaminosDeLongitud g u v k ==
numeroCaminosDeLongitudM g u v k
|(uv) lt- productoCartesiano vs vs u lt v])
De este teorema se deducen las siguientes propiedades
Teorema 428 Sea G un grafo simple Siguiendo la notacioacuten del teorema anterior se tieneque1 a(2)ii = δ(vi)
2 a(3)ii es el nuacutemero de triaacutengulos que contienen al veacutertice vi
gradoCaminosM Grafo Int -gt Int -gt Int
gradoCaminosM g v = getElem v v m2
where m = matrizAdyacencia g
m2 = multStd2 m m
numeroTriangulosM Grafo Int -gt Int -gt Int
numeroTriangulosM g v = getElem v v (potencia m 3)
where m = matrizAdyacencia g
La comprobacioacuten con QuickCheck es
ghcigt quickCheck prop_GradoCaminosMatriz
+++ OK passed 100 tests
ghcigt quickCheck prop_TriangulosMatriz
+++ OK passed 100 tests
prop_GradoCaminosMatriz Grafo Int -gt Bool
prop_GradoCaminosMatriz g =
and [ grado g v == gradoCaminosM g v | v lt- vertices g]
42 Matrices de adyacencia 115
prop_TriangulosMatriz Property
prop_TriangulosMatriz =
forAll grafoSimple
(g -gt and [length (triangulos g v) ==
numeroTriangulosM g v | v lt- vertices g])
116 Capiacutetulo 4 Matrices asociadas a grafos
Capiacutetulo 5
Apeacutendices
51 Sistemas utilizados
El desarrollo de mi Trabajo de Fin de Grado requeriacutea de una infraestructura teacutecnicaque he tenido que trabajar antes de comenzar a desarrollar el contenido A conti-nuacioacuten voy a nombrar y comentar los sistemas y paquetes que he utilizado a lolargo del proyectobull Ubuntu como sistema operativo El primer paso fue instalar Ubuntu en mi orde-
nador portaacutetil personal Para ello seguiacute las recomendaciones de mi compantildeeroEduardo Paluzo quien ya lo habiacutea hecho antesPrimero me descargueacute la imagen del sistema Ubuntu 1604 LTS (para procesadorde 64 bits) desde la paacutegina de descargas de Ubuntu 1 y tambieacuten la herramientaLinuxLive USB Creator 2 que transformariacutea mi pendrive en una unidad USB Boo-teable cargada con la imagen de Ubuntu Una vez tuve la unidad USB preparadaprocediacute a instalar el nuevo sistema apagueacute el dispositivo y al encenderlo entreacuteen el Boot Menu de la BIOS del portaacutetil para arrancar desde el Pendrive en vez dehacerlo desde el disco duro Automaacuteticamente comenzoacute la instalacioacuten de Ubuntuy solo tuve que seguir las instrucciones del asistente para montar Ubuntu mante-niendo ademaacutes Windows 10 que era el sistema operativo con el que habiacutea estadotrabajando hasta ese momentoEl resultado fue un poco agridulce pues la instalacioacuten de Ubuntu se habiacutea reali-zado con eacutexito sin embargo al intentar arrancar Windows desde la nueva GRUBme daba un error al cargar la imagen del sistema Despueacutes de buscar el error queme apareciacutea en varios foros encontreacute una solucioacuten a mi problema deshabiliteacute elSecurity Boot desde la BIOS y pude volver a arrancar Windows 10 con normali-dad
1httpwwwubuntucomdownloaddesktop2httpwwwlinuxliveusbcom
117
118 Capiacutetulo 5 Apeacutendices
bull LATEX como sistema de composicioacuten de textos La distribucioacuten de LATEXTex Livecomo la mayoriacutea de software que he utilizado la descargueacute utilizando el Gestorde Paquetes Synaptic Anteriormente soacutelo habiacutea utilizado TexMaker como editorde LATEX asiacute que fue el primero que descargueacute Maacutes tarde mi tutor Joseacute Antoniome sugirioacute que mejor descargara el paquete AUCTex pues me permitiriacutea trabajarcon archivos TEX desde el editor Emacs asiacute lo hice y es el que he utilizado pararedactar el trabajo Ademaacutes de los que me recomendaba el gestor solo he tenidoque descargarme el paquete spanish de babel para poder componer el trabajo puesel paquete Tikz que he utilizado para representar los grafos veniacutea incluido en lassugerencias de Synapticbull Haskell como lenguaje de programacioacuten Ya habiacutea trabajado anteriormente con
este lenguaje en el grado y sabiacutea que soacutelo teniacutea que descargarme la plataforma deHaskell y podriacutea trabajar con el editor Emacs Seguiacute las indicaciones que se dan alos estudiantes de primer curso en la paacutegina del Dpto de Ciencias de la Compu-tacioacuten e Inteligencia Artificial 3 y me descargueacute los paquetes haskell-platform yhaskell-mode desde el Gestor de Paquetes Synaptic La versioacuten de la plataforma deHaskell con la que he trabajado es la 2014200debian2 y la del compilador GHC la7103-7bull Dropbox como sistema de almacenamiento compartido Ya habiacutea trabajado con
Dropbox en el pasado asiacute que crear una carpeta compartida con mis tutores nofue ninguacuten problema sin embargo al estar Dropbox sujeto a software no libre nome resultoacute tan sencillo instalarlo en mi nuevo sistema En primer lugar intenteacutehacerlo directamente desde Ubuntu Software que intentoacute instalar Dropbox Nauti-lus y abrioacute dos instalaciones en paralelo Se quedoacute colgado el ordenador asiacute quemateacute los procesos de instalacioacuten activos reinicieacute el sistema y me descargueacute direc-tamente el paquete de instalacioacuten desde la paacutegina de descargas de Dropbox 4 y loejecuteacute desde la terminalbull Git como sistema remoto de control de versiones Era la primera vez que trabaja-
ba con Git y me costoacute bastante adaptarme Mi tutor Joseacute Antonio y mi compantildeeroEduardo Paluzo me ayudaron mucho e hicieron el proceso de adaptacioacuten muchomaacutes aacutegil El manual que Eduardo ha redactado y presenta en su Trabajo Fin deGrado me ha sido muy uacutetil es una pequentildea guiacutea que cualquier interesado en elempleo de Git puede utilizar como introduccioacuten La instalacioacuten no resultoacute com-plicada a traveacutes del Gestor de Paquetes Synaptic me descargueacute el paquete elpa-magity todos los demaacutes paquetes necesarios para trabajar con Git en mi portaacutetil usandoel editor Emacs Eduardo me ayudoacute a crear el repositorio MDenHaskell en la plata-forma GitHub y clonarlo en mi ordenador personal Dicho repositorio contiene el
3httpwwwcsuses~jalonsocursosi1m-15sistemasphp4httpswwwdropboxcomesinstallos=lnx
52 Mapa de decisiones de disentildeo en conjuntos 119
total del trabajo y se almacena de forma puacuteblica La versioacuten de Magit que utilizoes la 250-2
52 Mapa de decisiones de disentildeo en conjuntos
Una vez comenzado el trabajo y habiendo hecho ya varias secciones acerca de laTeoriacutea de Grafos se puso de manifiesto la conveniencia de crear nuevos capiacutetulosintroduciendo conceptos de la Teoriacutea de Conjuntos y las relaciones que se puedenpresentar entre sus elementosHaskell tiene una libreriacutea especiacutefica para conjuntos DataSet sin embargo no estan intuitiva ni tan eficiente como la de listas (DataList) A lo largo del proyecto hecreado un moacutedulo que permite trabajar con conjuntos utilizando tanto su represen-tacioacuten como listas ordenadas sin elementos repetidos como su representacioacuten comolistas sin elementos repetidos Dicho moacutedulo se llama Conjuntos y lo presento en elprimer capiacutetulo del Trabajo
53 Mapa de decisiones de disentildeo en grafos
Al comienzo del proyecto la idea era que las primeras representaciones con lasque trabajara fueran las de grafos como vectores de adyacencia y grafos como matricesde adyacencia que se utilizan en Informaacutetica en el primer curso del Grado con lasque ya habiacutea trabajado y estaba familiarizadaLas definiciones de Informaacutetica estaacuten pensadas para grafos ponderados (dirigidoso no seguacuten se eligiera) mientras que en Matemaacutetica Discreta apenas se usan grafosdirigidos o ponderados por tanto el primer cambio en la representacioacuten utilizadafue simplificar las definiciones de modo que solo trabajaacuteramos con grafos no diri-gidos y no ponderados pero manteniendo las estructuras vectorial y matricial quemanteniacutean la eficienciaLas representaciones que utilizan arrays en Haskell son muy restrictivas pues soloadmiten vectores y matrices que se puedan indexar lo que hace muy complicadostodos los algoritmos que impliquen alguacuten cambio en los veacutertices de los grafos yademaacutes no permite trabajar con todos los tipos de veacutertices que pudieacuteramos desearDecidimos volver a cambiar la representacioacuten y esta vez nos decantamos por larepresentacioacuten de grafos como listas de aristas perdiendo en eficiencia pero ganandomucho en flexibilidad de escrituraPor uacuteltimo mis tutores sugirieron dar una representacioacuten de los grafos mediantesus matrices de adyacencia y comprobar la equivalencia de las definiciones que yahabiacutea hecho en otros moacutedulos con las dadas para esta representacioacuten Para ello he
120 Capiacutetulo 5 Apeacutendices
trabajado con la libreriacutea DataMatrix de Haskell
Bibliografiacutea
[1] J Alonso Temas de programacioacuten funcional Technical report Univ de Sevilla2015
[2] P Burzyn Complejidad computacional en problemas de modificacioacuten de aris-tas en grafos Technical report Univ de Buenos Aires
[3] K Claessen and J Hughes QuickCheckA Lightweight Tool for Random Tes-ting of Haskell Programs Technical report Chalmers University of Technology2000
[4] M Caacuterdenas Matemaacutetica discreta Technical report Univ de Sevilla 2015
[5] D de Matemaacuteticas El regalo de Cantor Technical report IES Matarrantildea deValderrobres 2009
[6] D de Aacutelgebra Aacutelgebra Baacutesica tema 1 Conjuntos Technical report Univ deSevilla 2015
[7] F Franco Aspectos algebraicos en Teoriacutea de Grafos Technical report Univ deSevilla 2016
[8] F Rabhi and G Lapalme Algorithms A functional programming approachAddison-Wesley Longman Publishing Co Inc Boston MA USA 1st edition1999
[9] P Vasconcelos Property Testing using QuickCheck Technical report Univer-sidade do Porto 2016
[10] Wikipedia Set (mathematics) Technical report Wikipedia La Enciclopedialibre 2016
[11] Wikipedia AnexoGaleriacutea de grafos Technical report Wikipedia La Enciclo-pedia libre 2016
[12] Wikipedia Teoriacutea de la complejidad computacional Technical report Wikipe-dia La Enciclopedia libre 2017
121
Iacutendice alfabeacutetico
Grafo 18 52adyacentes 53antiImagenRelacion 38aristaEn 53aristasCamino 88aristas 53automorfismos 87bipartitoCompleto 58biyecciones 47cardinal 22 31centro 103clasesEquivalencia 43combinaciones 25 34complementario 22 31completo 58componentesConexas1 97componentesConexas2 98componentesConexas3 98conjuntosIguales 30conjuntosIguales 21conjuntosVerticesDisjuntos 59conservaAdyacencia 78creaGrafo 52diametro 102distancia 93dominio 38eliminaArista 74eliminaLazos 74eliminaVertice 74elimina 19 28entorno 69esAisladoM 112
esAislado 69esAntisimetrica 41esAutomorfismo 86esBipartito 60esCamino 87esCerrado 94esCircuito 95esCompleto 77esConexo 100esFuncional 39esFuncion 43esGeodesica 94esInyectiva 45esIsomorfismo 81esLazo 69esReflexiva 40esRegular 70esRelacionEquivalencia 42esRelacionHomogenea 39esRelacionOrden 43esRelacion 37esSimetrica 41 111esSimple 70esSobreyectiva 45 46esSubconjuntoPropio 21 30esSubconjunto 20 29esSubgrafoMax 72esSubgrafoPropio 72esSubgrafo 72esTransitiva 41esUnitario 23 32esVacio 18 27
122
Iacutendice alfabeacutetico 123
estaRelacionado 40estanConectados 93excentricidades 102excentricidad 102funciones 44generaGrafo 54gradoM 113 114grado 69grafoAmistad 57grafoCiclo 56grafoCirculante 61grafoComplementario 77grafoEstrella 60grafoHeawood 64grafoMcGee 64grafoMoebiusCantor 67grafoNulo 55grafoPetersenGen 62grafoPetersen 66grafoRueda 61grafoSimple 110grafoThomson 63grafoTutteCoxeter 65grosor 104imagenConjunto 45imagenInversa 47imagenRelacion 38imagen 44imprimeMatriz 110inserta 18 27interseccion 33interseccion 24inversa 47isomorfismos 82isomorfos 82longitudCamino 88matrizAdyacencia 110minimoElemento 19 28morfismos 79
numeroArcosDeLongitud 92numeroCaminosDeLongitud 89numeroCaminosDeLongitugM 113numeroComponentesConexas 99numeroTriangulosM 114orden 68parDeVertices 91pertenece 19 28potencia 111productoCartesiano 34productoCartesiano 25prop_HavelHakimi 73prop_LemaApretonDeManos 73prop_completos 76prop_BipartitoMatriz 113prop_ConectadosRelEqui 97prop_ConexionIsomorfismo1 106prop_ConexionIsomorfismo2 106prop_ConexionIsomorfismo3 107prop_GradoMatriz 114prop_TriangulosMatriz 114prop_esAisladoMatriz 112prop_gradoMatriz 113prop_numeroCaminosMatriz 114prop_simetricaAdyacenciaCompleto 111prop_tamantildeoMatriz 112prop_todosArcosBA 92radio 103rango 38secuenciaGrados 71secuenciaGrafica 71sinRepetidos 19 29sonIncidentes 68sumaArista 75sumaGrafos 76 77sumaVertice 75tamantildeoM 111tamantildeo 68todosArcosBA 91
124 Iacutendice alfabeacutetico
todosArcos 90todosCaminos 88todosCiclos 96triangulos 94unionConjuntos 23 32unionGeneral 24 33vacio 18 27valenciaMax 70valenciaMin 70variaciones 26 35verticesCamino 88vertices 53
Iacutendice general
Agradecimientos 7
Abstract 9
Introduccioacuten 11
1 Conjuntos 15
11 El TAD de los conjuntos 16
12 Representaciones de conjuntos 17121 Conjuntos como listas ordenadas sin repeticioacuten 17122 Definicioacuten de conjunto 19123 Subconjuntos 20124 Igualdad de conjuntos 21125 Subconjuntos propios 21126 Complementario de un conjunto 22127 Cardinal de un conjunto 22128 Conjunto unitario 23129 Unioacuten de conjuntos 231210 Interseccioacuten de conjuntos 241211 Producto cartesiano 251212 Combinaciones 251213 Variaciones con repeticioacuten 261214 Conjuntos como listas sin repeticioacuten 261215 Definicioacuten de conjunto 281216 Subconjuntos 291217 Igualdad de conjuntos 301218 Subconjuntos propios 301219 Complementario de un conjunto 311220 Cardinal de un conjunto 311221 Conjunto unitario 321222 Unioacuten de conjuntos 32
3
4 Iacutendice general
1223 Interseccioacuten de conjuntos 331224 Producto cartesiano 341225 Combinaciones 341226 Variaciones con repeticioacuten 35
13 Eleccioacuten de la representacioacuten de conjuntos 35
2 Relaciones y funciones 37
21 Relaciones 37211 Relacioacuten binaria 37212 Imagen por una relacioacuten 37213 Dominio de una relacioacuten 38214 Rango de una relacioacuten 38215 Antiimagen por una relacioacuten 38216 Relacioacuten funcional 39
22 Relaciones homogeacuteneas 39221 Relaciones reflexivas 40222 Relaciones simeacutetricas 40223 Relaciones antisimeacutetricas 41224 Relaciones transitivas 41225 Relaciones de equivalencia 42226 Relaciones de orden 42227 Clases de equivalencia 43
23 Funciones 43231 Imagen por una funcioacuten 44232 Funciones inyectivas 45233 Funciones sobreyectivas 45234 Funciones biyectivas 46235 Inversa de una funcioacuten 47
3 Introduccioacuten a la teoriacutea de grafos 49
31 Definicioacuten de grafo 50
32 El TAD de los grafos 50321 Grafos como listas de aristas 51
33 Generador de grafos 54
34 Ejemplos de grafos 55341 Grafo nulo 55342 Grafo ciclo 56343 Grafo de la amistad 56
Iacutendice general 5
344 Grafo completo 57345 Grafo bipartito 58346 Grafo estrella 60347 Grafo rueda 60348 Grafo circulante 61349 Grafo de Petersen generalizado 623410 Otros grafos importantes 63
35 Definiciones y propiedades 67351 Definiciones de grafos 68352 Propiedades de grafos 73353 Operaciones y propiedades sobre grafos 73
36 Morfismos de grafos 78361 Morfismos 78362 Complejidad del problema de homomorfismo de grafos 80363 Isomorfismos 81364 Automorfismos 86
37 Caminos en grafos 87371 Definicioacuten de camino 87372 Recorridos 89373 Caminos simples 89374 Conexioacuten 93375 Distancia 93376 Caminos cerrados 94377 Circuitos 95378 Ciclos 95379 Grafos aciacuteclicos 96
38 Conectividad de los grafos 97381 Estar conectados por un camino 97382 Componentes conexas de un grafo 97383 Grafos conexos 100384 Excentricidad 102385 Diaacutemetro 102386 Radio 103387 Centro 103388 Grosor 104389 Propiedades e invariantes por isomorfismos 106
6 Iacutendice general
4 Matrices asociadas a grafos 109
41 Generador de grafos simples 109
42 Matrices de adyacencia 110421 Definicioacuten y propiedades 110422 Propiedades baacutesicas de las matrices 111423 Propiedades de las matrices de adyacencia 111424 Caminos y arcos 113
5 Apeacutendices 117
51 Sistemas utilizados 117
52 Mapa de decisiones de disentildeo en conjuntos 119
53 Mapa de decisiones de disentildeo en grafos 119
Bibliografiacutea 121
Indice de definiciones 121
Agradecimientos
Quisiera agradecer a todas las personas que me han apoyado y prestado sus co-nocimientos a lo largo de estos cuatro antildeos del grado Gracias a ellos el esfuerzo hamerecido la pena
En primer lugar me gustariacutea destacar a Mariacutea Joseacute Hidalgo Doblado y Joseacute An-tonio Alonso Jimeacutenez mi tutores en este Trabajo de Fin de Grado Les agradezco detodo corazoacuten la constancia y la atencioacuten que me han brindado a pesar de las dificul-tades que supone realizar el proyecto durante un curso en el que estoy disfrutandola oportunidad de la movilidad internacional Erasmus Son para miacute un referente y unclaro ejemplo de lo que se puede conseguir con esfuerzo y trabajo en equipo
Seguidamente expresar mi gratitud al resto de profesores y trabajadores de la Uni-versidad de Sevilla especialmente a aquellos que se esfuerzan por mejorar la institu-cioacuten diacutea a diacutea
Quiero agradecer tambieacuten este trabajo a mi familia en especial a mis padres que meapoyaron desde el principio cuando tomeacute la decisioacuten de cambiar de carrera y siemprehan intentado brindarnos a mi hermana y a miacute con lo mejor
Finalmente a mis amigos y compantildeeros que han hecho de esta primera etapa uni-versitaria un capiacutetulo de mi vida lleno de bonitos recuerdos En especial a Pedro conquien he tenido la suerte de compartir todo
Muchas gracias a todos
7
8 Iacutendice general
Abstract
Discrete mathematics is characterized as the branch of mathematics dealing withfinite and numerable sets Concepts and notations from discrete mathematics are use-ful in studying and describing objects and real-life problems In particular the graphtheory has numerous applications in logistics
Throughout this project some of the knowlegde adquired from the course ldquoMa-temaacutetica Discretardquo will be given a computational implementation The code will bewritten in Haskell language and a free version of it will be available in GitHub underthe name MDenHaskell The work will focus on the graph theory and will provide so-me examples and algorithms in order to give an introduction of it and how it can beimplemented in Haskell
At first two chapters will be presented as a gentle reminder of basic concepts rela-ted to the set theory and the relations that can be established among them The thirdchapter will introduce the main topic graph theory with different representationsdefinitions and examples on graphs It will go through aspects such as morphismconnectivity and paths in graphs Finally some properties and advantages of workingwith adjacency matrices will be presented in the fourth chapter
This project leaves the door open for the community of programmers to continueand improve it It can be used as a self-learning tool as well as to make calculationsthat by hand would be tedious
9
10 Iacutendice general
Introduccioacuten
El objetivo del trabajo es la implementacioacuten de algoritmos de matemaacutetica discretaen Haskell Los puntos de partida son
los temas de la asignatura ldquoMatemaacutetica discretardquo ([4])los temas de la asignatura ldquoInformaacuteticardquo ([1])el capiacutetulo 7 del libro ldquoAlgorithms A functional programming approachrdquo ([8]) yel artiacuteculo ldquoGraph theoryrdquo ([11]) de la WikipediaHaskell es un lenguaje de programacioacuten funcional desarrollado en los uacuteltimos antildeos
por la comunidad de programadores con la intencioacuten de usarlo como instrumentopara la ensentildeanza de programacioacuten funcional La motivacioacuten de este desarrollo eshacer el anaacutelisis y disentildeo de programas maacutes simple y permitir que los algoritmos seanfaacutecilmente adaptables a otros lenguajes de programacioacuten funcionales
En comparacioacuten con otros lenguajes de programacioacuten imperativos la sintaxis deHaskell permite definir funciones de forma maacutes clara y compacta En Haskell las fun-ciones se consideran valores al mismo nivel que los tipos enteros o cadenas en cual-quier lenguaje Por ello al igual que es habitual que en todos los lenguajes una funcioacutenreciba datos de entrada (de tipo entero flotante cadena etc) y devuelva datos (de losmismos tipos) en los lenguajes funcionales una funcioacuten puede recibir como dato deentrada una funcioacuten y devolver otra funcioacuten como salida que puede ser construida apartir de sus entradas y por operaciones entre funciones como la composicioacuten Estacapacidad nos proporciona meacutetodos maacutes potentes para construir y combinar los di-versos moacutedulos de los que se compone un programa Por ejemplo emulando la formade operar sobre funciones que habitualmente se usa en matemaacuteticas
La matemaacutetica discreta consiste en el estudio de las propiedades de los conjuntosfinitos o infinitos numerables lo que hace posible su directa implementacioacuten compu-tacional En particular la asignatura ldquoMatemaacutetica Discretardquo del grado se centra enestudiar propiedades y algoritmos de la combinatoria y la teoriacutea de grafos A lo largodel trabajo se implementaraacuten en Haskell definiciones y algoritmos con los que ya seha tenido una primera aproximacioacuten teoacuterica durante el grado
Los dos primeros capiacutetulos del trabajo sientan la base que permitiraacute en los dos si-guientes una aproximacioacuten a la teoriacutea de grafos En el primero se hace una introduc-cioacuten a la teoriacutea de conjuntos y se dan dos posibles representaciones de conjuntos con
11
12 Iacutendice general
las que trabajar en Haskell En el segundo se presentan los conceptos de ldquorelacioacutenrdquo yde ldquofuncioacutenrdquo que al igual que los conjuntos son necesarios para definir aplicacionesde los grafos Su redaccioacuten sigue la liacutenea de la primera parte de la asignatura ldquoAacutelgebraBaacutesicardquo del grado
En el tercer capiacutetulo del trabajo se hace una introduccioacuten a la teoriacutea de grafos Enprimer lugar se dan una representacioacuten con la que trabajar en Haskell y un generadorde grafos que permitiraacute comprobar propiedades con QuickCheck Seguidamente sepresenta una galeriacutea de grafos conocidos que se utilizaraacuten como ejemplos para lasdefiniciones y los algoritmos de las secciones siguientes Las primeras seraacuten algunasdeficiones baacutesicas y despueacutes se trataraacuten los conceptos de ldquomorfismosrdquo ldquocaminosrdquo yldquoconectividadrdquo en grafos
Por uacuteltimo en el cuarto capiacutetulo se da una representacioacuten de los grafos a traveacutesde su matriz de adyacencia Se implementaraacuten algunos de los resultados que JavierFranco Galviacuten expuso en su Trabajo Fin de Grado Aspectos algebraicos en teoriacutea de grafosy se comprueba que concuerdan con el desarrollo hecho en el capiacutetulo anterior
Cabe destacar el trabajo con los diferentes sistemas y programas que se han utiliza-do a lo largo del proyecto
Ubuntu como sistema operativoel editor de textos Emacs que ha permitido el uso de Haskell literario para la redaccioacutendel trabajoel paquete de produccioacuten de graacuteficos vectoriales Tikz de LATEX mediante el que seha dado la representacioacuten graacutefica de los ejemplos de grafosGitHub como sistema remoto de control de versionesy DocTest como sistema de validacioacuten de moacutedulosSe va a hacer una breve introduccioacuten los sistemas maacutes destacados
Ubuntu
Ubuntu es un sistema operativo creado a partir de GNULinux con la intencioacuten dehacer una versioacuten de este maacutes sencilla de manejar y que permitiera acceso al soft-ware libre para todo el mundo por igual La primera distribuioacuten oficial de Ubuntufue la versioacuten 410 y tuvo lugar en 2004 Desde entonces el proyecto ha captadola atencioacuten de miles de entusiastas del software libre que han querido unirse a lacomunidad UbuntuSoftware libre significa que los usuarios tienen la libertad de ejecutar copiar distri-buir estudiar modificar y mejorar el software Es una cuestioacuten de libertad no deprecio Para entender el concepto debe pensarse en laquolibreraquo como en laquolibertad deexpresioacutenraquo
Iacutendice general 13
Maacutes precisamente software libre significa que los usuarios de un programa tienenlas cuatro libertades esencialesbull La libertad de ejecutar el programa como lo desee con cualquier propoacutesito (liber-
tad 0)bull La libertad de estudiar el funcionamiento del programa y adaptarlo a sus necesi-
dades (libertad 1) El acceso al coacutedigo fuente es un prerrequisito para estobull La libertad de redistribuir copias para ayudar a los demaacutes (libertad 2)bull La libertad de mejorar el programa y de publicar las mejoras de modo que toda la
comunidad se beneficie (libertad 3) El acceso al coacutedigo fuente es un prerrequisitopara esto
Debido a la evolucioacuten de la tecnologiacutea y del uso de la red estas libertades son ahoraauacuten maacutes importantes que en el pasadoLo que diferencia a Ubuntu de otros sistemas ofrecidos por Linux es que los equiposcomercial y comunitario colaboran juntos en el desarrollo de un uacutenico proyecto Lasnovedades y avances estaacuten libremente a disposicioacuten de todos los usuarios y sonvoluntarios quienes se hacen cargo de los elementos maacutes criacuteticos del trabajoEn la paacutegina web de Ubuntu 1 se puede obtener maacutes informacioacuten acerca del siste-ma y en la paacutegina web de GNU 2 se puede encontrar maacutes informacioacuten acerca delsoftware libre
Haskell literario con Emacs
Haskell es un lenguaje de programacioacuten puramente funcional basado en lambdacalculus 3 Se caracteriza por sus programas concisos un potente sistema de tiposel trabajo con listas funciones recursivas y de orden superior y por tener evaluacioacutenperezosaTener que escribir coacutedigos largos y complicados hace la tarea del programador muycostosa Los lenguajes de programacioacuten funcional como Haskell lo intentan hacenmaacutes sencillo Aunque no se esteacute en la posicioacuten de usar Haskell en un proyecto de-terminado aprender su razonamiento puede ayudar a mejorar en cualquier otrolenguajeA la hora de elaborar la memoria de un proyecto en el que se estaacute utilizando Haskellla posibilidad de escribir coacutedigo y texto en un formato de calidad otorga globali-dad al trabajo El editor Emacs de GNU permite en particular trabajar en paralelocon Haskell y con Latex El trabajar con Haskell literario ha ayudado a detectar ysolventar errores maacutes raacutepido asiacute como a dar una estructura consolidada al trabajo
1httpswwwubuntucom2httpswwwgnuorg3httpsenwikipediaorgwikiLambda_calculus
14 Iacutendice general
En la paacutegina web del Departamento de Computacioacuten 4 se puede encontrar maacutesinformacioacuten acerca de Haskell y Emacs
GitHub
GitHub es una plataforma de desarrollo colaborativo que permite alojar proyectosusando el control de versiones de Git El trabajo con un sistema como este hacemucho maacutes faacutecil el trabajo en grupo pues cada individuo puede trabajar desde suordenador propio en paralelo a los demaacutes y remotamente ir actualizando el proyectosin perder la posibilidad de restaurarlo a una versioacuten anteriorEn particular GitHub ha sido una excelente herramienta de control de este TrabajoFin de Grado pues los tutores han podido seguir en cada momento el trabajo rea-lizado detectar faacutecilmente los errores y hacer modificaciones directamente sobre eldocumentoEl compantildeero Eduardo Paluzo Hidalgo hace en su Trabajo Fin de Grado una pe-quentildea introduccioacuten al uso de Github y a la instalacioacuten de magit en una distribucioacutenUbuntu muy recomendable para todos aquellos (especialmente los maacutes principian-tes) que tengan intereacutes en trabajar con este sistemaSe puede encontrar maacutes informacioacuten acerca de esta plataforma en la paacutegina web deGit 5
DocTest
DocTest para Haskell es un programa de verificacioacuten dinaacutemica de ejemplos Si se si-gue un determinado formato a la hora de escribir los ejemplos para las funciones deun documento en Haskell Doctest se encarga de comprobar que los ejemplos seancorrectos Estas validaciones han resultado claves en la realizacioacuten del trabajo puesalgunas definiciones han sido modificadas de forma casi continua y este proyectoespecialmente se basa en lo anterior para poder seguir construyendoSu uso es muy sencillo una vez instalado el correspondiente paquete y escrito losejemplos en el formato requerido solo hay que ejecutar el programa desde la consoladando como argumento el fichero que se desea validarSe puede enontrar maacutes informaioacuten acerca del programa y de coacutemo descargarlo ensu repositorio de GitHub 6
4httpwwwcsuses~jalonsocursosi1m-16temastema-1html5httpsgit-scmcom6httpsgithubcomsoldoctest
Capiacutetulo 1
Conjuntos
El concepto de conjunto aparece en todos los campos de las Matemaacuteticas pero iquestqueacutedebe entenderse por eacutel La Teoriacutea de conjuntos fue introducida por Georg Cantor(1845-1917) desde 1869 Cantor ejercioacute como profesor en la Universidad de Halley entre 1879 y 1884 publicoacute una serie de seis artiacuteculos en el Mathematische Annalenen los que hizo una introduccioacuten baacutesica a la teoriacutea de conjuntos En su Beitraumlge zurBegruumlndung der transfiniten Mengenlehre Cantor dio la siguiente definicioacuten de con-junto
Figura 11 Fragmento del texto traducido al ingleacutes en el que Cantor da la definicioacuten de conjunto
laquoDebemos entender por ldquoconjuntordquo (Menge) cualquier coleccioacuten vista co-mo un todo (Zusammenfassung zu einem Ganzen) M de objetos separa-dos y bien definidos m de nuestra intuicioacuten o pensamiento Estos objetosson los ldquoelementosrdquo de Mraquo
Felix Hausdorff en 1914 dice laquoun conjunto es una reunioacuten de cosas que constitu-yen una totalidad es decir una nueva cosaraquo y antildeade laquoesto puede difiacutecilmente seruna definicioacuten pero sirve como demostracioacuten expresiva del concepto de conjunto atraveacutes de conjuntos sencillos como el conjunto de habitantes de una ciudad o el deaacutetomos de Hidroacutegeno del SolraquoUn conjunto asiacute definido no tiene que estar compuesto necesariamente de elementoshomogeacuteneos y ademaacutes da lugar a cuestiones filosoacuteficas como si podemos llamar
15
16 Capiacutetulo 1 Conjuntos
conjunto a aquel que no posee ninguacuten elemento Matemaacuteticamente conviene aceptarsolo elementos que compartan alguna propiedad y definir el conjunto vaciacuteo comoaquel que no tiene elemento algunoEl gran meacuterito de Cantor fue considerar conjuntos transfinitos (que tiene infinitoselementos) concepto inaudito hasta avanzado el siglo XIX hablar del cardinal de unconjunto como el nuacutemero de sus elementos y hablar de conjuntos equivalentes cuan-do puede establecerse una biyeccioacuten entre ellos ideas ya apuntadas por Bolzanoquien se centroacute demasiado en el aspecto filosoacutefico sin llegar a formalizar sus ideas
A lo largo de la seccioacuten haremos una pequentildea introduccioacuten a la Teoriacutea de Conjun-tos presentando formalmente sus conceptos maacutes importantes A la hora de elaborarel contenido se han utilizado los siguientes recursos bibliograacuteficosbull el primer tema de la asignatura ldquoAacutelgebra baacutesicardquo ([6])bull los temas de la asignatura ldquoInformaacuteticardquo ([1])bull el artiacuteculo de la Wikipedia ldquoSet (mathematics)rdquo ([10] ylowast el artiacuteculo ldquoEl regalo de Cantorrdquo ([5])
11 El TAD de los conjuntos
En la presente seccioacuten se definen las operaciones baacutesicas necesarias para trabajarcon conjuntos en un lenguaje funcional En nuestro caso el lenguaje que utilizare-mos seraacute Haskell Daremos la signatura del Tipo Abstracto de Dato (TAD) de losconjuntos y daremos algunos ejemplos de posibles representaciones de conjuntoscon las que podriacuteamos trabajarA continuacioacuten presentamos las operaciones definidas en el TAD de los conjuntos
vacio Conj a
inserta Eq a =gt a -gt Conj a -gt Conj a
elimina Eq a =gt a -gt Conj a -gt Conj a
pertenece Eq a =gt Conj a -gt a -gt Bool
esVacio Conj a -gt Bool
minimoElemento Ord a =gt Conj a -gt a
dondebull (vacio) es el conjunto vaciacuteobull (inserta x c) es el conjunto obtenido antildeadiendo el elemento x al conjunto cbull (elimina x c) es el conjunto obtenido eliminando el elemento x del conjunto cbull (pertenece x c) se verifica si x pertenece al conjunto cbull (esVacio c) se verifica si c no tiene ninguacuten elementobull (minimoElemento c) devuelve el miacutenimo elemento del conjunto c
12 Representaciones de conjuntos 17
Hemos de tener en cuenta que a la hora de crear un nuevo tipo de dato con el querepresentar a los conjuntos este debe ser compatible con la entidad matemaacutetica querepresenta
Estas son algunas de las posibles representaciones con las que podriacuteamos trabajarcon conjuntos en Haskellbull En primer lugar podemos trabajar con la libreriacutea DataSet en este caso la imple-
mentacioacuten del tipo de dato Set estaacute basado en aacuterboles binarios balanceadosbull Por otra parte podemos definir un nuevo tipo Cj xs con el que trabajar con con-
juntos como listas no ordenadas con duplicados como listas no ordenadas sinduplicados o como listas ordenadas sin duplicadosbull Otra opcioacuten seriacutea trabajar directamente con conjuntos como listas para ello de-
bemos ignorar las repeticiones y el orden con vista a la igualdad de conjuntosbull Los conjuntos que soacutelo contienen nuacutemeros (de tipo Int) entre 0 y nminus 1 se pueden
representar como nuacutemeros binarios con n bits donde el bit i(0 le i lt n) es 1 syssel nuacutemero i pertenece al conjunto
Nota 111 Las funciones que aparecen en la especificacioacuten del TAD no dependende la representacioacuten que elijamos
12 Representaciones de conjuntos
121 Conjuntos como listas ordenadas sin repeticioacuten
En el moacutedulo ConjuntosConListasOrdenadasSinRepeticion se definen las funcio-nes del TAD de los conjuntos dando su representacioacuten como listas ordenadas sinrepeticioacuten
module ConjuntosConListasOrdenadasSinRepeticion
( Conj
vacio
inserta
listaAConjunto
elimina
pertenece
esVacio
minimoElemento
sinRepetidos
esUnitario
esSubconjunto
conjuntosIguales
esSubconjuntoPropio
complementario
18 Capiacutetulo 1 Conjuntos
cardinal
unionConjuntos
unionGeneral
interseccion
productoCartesiano
combinaciones
variacionesR
) where
En las definiciones del presente moacutedulo se usaraacuten algunas funciones de la libreriacuteaDataList
Vamos a definir un nuevo tipo de dato (Conj a) que representa a los conjuntoscomo listas ordenadas sin repeticioacuten
type Conj a = [a]
Las funciones baacutesicas que definiremos a partir de este tipo coincidiraacuten con las indi-cadas en el TAD de los conjuntosbull (vacio) es el conjunto vaciacuteo
-- | Ejemplo
-- gtgtgt vacio
-- []
vacio Conj a
vacio = []
bull (inserta x c) es el conjunto obtenido antildeadiendo el elemento x al conjunto c
-- | Ejemplo
-- gtgtgt inserta 5 vacio
-- [5]
-- gtgtgt foldr inserta vacio [2211242]
-- [124]
inserta Ord a =gt a -gt Conj a -gt Conj a
inserta x [] = [x]
inserta x ys
| pertenece ys x = ys
| otherwise = insert x ys
bull (listaAConjunto xs) devuelve el conjunto cuyos elementos son los de la lista xs
-- | Ejemplo
-- gtgtgt listaAConjunto [2211242]
-- [124]
listaAConjunto Ord a =gt [a] -gt Conj a
listaAConjunto = sort nub
bull (esVacio c) se verifica si c es el conjunto vaciacuteo
12 Representaciones de conjuntos 19
-- | Ejemplos
-- gtgtgt esVacio (listaAConjunto [25137532190])
-- False
-- gtgtgt esVacio vacio
-- True
esVacio Conj a -gt Bool
esVacio = null
bull (pertenece x c) se verifica si x es un elemento del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt pertenece c1 3
-- True
-- gtgtgt pertenece c1 4
-- False
pertenece Ord a =gt Conj a -gt a -gt Bool
pertenece ys x =
x == head (dropWhile (ltx) ys)
bull (elimina x c) es el conjunto obtenido eliminando el elemento x del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt elimina 3 c1
-- [012579]
-- gtgtgt elimina 4 c1
-- [0123579]
elimina Ord a =gt a -gt Conj a -gt Conj a
elimina x ys = us ++ dropWhile (==x) vs
where (usvs) = span (ltx) ys
bull (minimoElemento c) devuelve el miacutenimo elemento del conjunto c
-- | Ejemplos
-- gtgtgt minimoElemento (listaAConjunto [25137532190])
-- 0
-- gtgtgt minimoElemento (listaAConjunto ([ae] ++ [AE]))
-- A
minimoElemento Ord a =gt Conj a -gt a
minimoElemento = head
122 Definicioacuten de conjunto
Nota 121 Al trabajar con la representacioacuten de conjuntos como listas en Haskellhemos de cuidar que los ejemplos con los que trabajemos no tengan elementos re-petidos La funcioacuten (sinRepetidos xs) se verifica si la lista xs no tiene ninguacuten ele-mento repetido
20 Capiacutetulo 1 Conjuntos
-- | Ejemplos
-- gtgtgt sinRepetidos []
-- True
-- gtgtgt sinRepetidos [1231]
-- False
sinRepetidos Eq a =gt [a] -gt Bool
sinRepetidos xs = nub xs == xs
Los conjuntos pueden definirse de manera expliacutecita citando todos sus elementosentre llaves de manera impliacutecita dando una o varias caracteriacutesticas que determi-nen si un objeto dado estaacute o no en el conjunto Por ejemplo los conjuntos 1 2 3 4y x isinN|1 le x le 4 son el mismo definido de forma explicita e impliacutecita respecti-vamente
Nota 122 La definicioacuten impliacutecita es necesaria cuando el conjunto en cuestioacuten tieneuna cantidad infinita de elementos En general los conjuntos se notaraacuten con letrasmayuacutesculas A B y los elementos con letras minuacutesculas a b
Cuando trabajamos con conjuntos concretos siempre existe un contexto donde esosconjuntos existen Por ejemplo si A = minus1 1 2 3 4 5 y B = x|x isin Nes par elcontexto donde podemos considerar A y B es el conjunto de los nuacutemeros enterosZ En general a este conjunto se le denomina conjunto universal De una forma algomaacutes precisa podemos dar la siguiente definicioacuten
Definicioacuten 121 El conjunto universal que notaremos por U es un conjunto del queson subconjuntos todos los posibles conjuntos que originan el problema que tratamos
123 Subconjuntos
Definicioacuten 122 Dados dos conjuntos A y B si todo elemento de A es a su vez elementode B diremos que A es un subconjunto de B y lo notaremos A sube B En caso contrario senotaraacute A 6sube B
La funcioacuten (esSubconjunto c1 c2) se verifica si c1 es un subconjunto de c2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
-- gtgtgt c1 `esSubconjunto` c2
-- True
-- gtgtgt c1 `esSubconjunto` vacio
-- False
-- gtgtgt vacio `esSubconjunto` c2
12 Representaciones de conjuntos 21
-- True
-- gtgtgt c3 `esSubconjunto` c4
-- True
-- gtgtgt c2 `esSubconjunto` c1
-- False
esSubconjunto Ord a =gt Conj a -gt Conj a -gt Bool
esSubconjunto [] _ = True
esSubconjunto (xxs) ys =
x == head vs ampamp esSubconjunto xs (tail vs)
where (usvs) = span (ltx) ys
124 Igualdad de conjuntos
Definicioacuten 123 Dados dos conjuntos A y B diremos que son iguales si tienen los mismoselementos es decir si se verifica que A sube B y B sube A Lo notaremos A = B
La funcioacuten (conjuntosIguales c1 c2) se verifica si los conjuntos xs y ys son igua-les
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
-- gtgtgt let c5 = listaAConjunto [4444442]
-- gtgtgt conjuntosIguales c1 c2
-- False
-- gtgtgt conjuntosIguales c3 c4
-- True
-- gtgtgt conjuntosIguales c1 c5
-- True
conjuntosIguales Ord a =gt Conj a -gt Conj a -gt Bool
conjuntosIguales = (==)
125 Subconjuntos propios
Definicioacuten 124 Los subconjuntos de A distintos del empty y del mismo A se denominansubconjuntos propios de A
La funcioacuten (esSubconjuntoPropio c1 c2) se verifica si c1 es un subconjunto pro-pio de c2
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt esSubconjuntoPropio u u
22 Capiacutetulo 1 Conjuntos
-- False
-- gtgtgt esSubconjuntoPropio c1 u
-- True
esSubconjuntoPropio Ord a =gt Conj a -gt Conj a -gt Bool
esSubconjuntoPropio c1 c2 =
not (null c1) ampamp esSubconjunto c1 c2 ampamp c1 = c2
126 Complementario de un conjunto
Definicioacuten 125 Dado un conjunto A se define el complementario de A que notaremospor A como
A = x|x isin U x 6isin A
La funcioacuten (complementario u c) devuelve el complementario del conjunto c y enel universo u
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt let c2 = listaAConjunto [14689]
-- gtgtgt complementario u c1
-- [14689]
-- gtgtgt complementario u u
-- []
-- gtgtgt complementario u vacio
-- [123456789]
-- gtgtgt complementario u c2
-- [2357]
complementario Ord a =gt Conj a -gt Conj a -gt Conj a
complementario [] _ = []
complementario xs [] = xs
complementario (xxs) (yys)
| x lt y = x complementario xs (yys)
| otherwise = complementario xs ys
127 Cardinal de un conjunto
Definicioacuten 126 Dado un conjunto finito A denominaremos cardinal de A al nuacutemero deelementos que tiene y lo notaremos |A|
La funcioacuten (cardinal xs) devuelve el cardinal del conjunto xs
-- | Ejemplos
-- gtgtgt cardinal vacio
-- 0
-- gtgtgt cardinal (listaAConjunto [110])
12 Representaciones de conjuntos 23
-- 10
-- gtgtgt cardinal (listaAConjunto chocolate)
-- 7
cardinal Ord a =gt Conj a -gt Int
cardinal = length
128 Conjunto unitario
Definicioacuten 127 Un conjunto con un uacutenico elemento se denomina unitario
Nota 123 Notemos que si X = x es un conjunto unitario debemos distinguirentre el conjunto X y el elemento x
La funcioacuten (esUnitario c) se verifica si el conjunto c es unitario
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto (take 10 (repeat 5))
-- gtgtgt let c2 = listaAConjunto valverde
-- gtgtgt let c3 = listaAConjunto coco
-- gtgtgt esUnitario c1
-- True
-- gtgtgt esUnitario c2
-- False
-- gtgtgt esUnitario c2
-- False
esUnitario Ord a =gt Conj a -gt Bool
esUnitario c =
c == take 1 c
129 Unioacuten de conjuntos
Definicioacuten 128 Dados dos conjuntos A y B se define la unioacuten de A y B notado A cup Bcomo el conjunto formado por aquellos elementos que pertenecen al menos a uno de los dosconjuntos A oacute B es decir
A cup B = x | x isin A or x isin B
La funcioacuten (unionConjuntos c1 c2) devuelve la unioacuten de los conjuntos xs y ys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [139]
-- gtgtgt let c2 = listaAConjunto [249]
-- gtgtgt unionConjuntos c1 c2
-- [123456789]
unionConjuntos Ord a =gt Conj a -gt Conj a -gt Conj a
unionConjuntos [] [] = []
24 Capiacutetulo 1 Conjuntos
unionConjuntos [] ys = ys
unionConjuntos xs [] = xs
unionConjuntos (xxs) (yys)
| x lt y = x unionConjuntos xs (yys)
| x == y = x unionConjuntos xs ys
| otherwise = y unionConjuntos (xxs) ys
Definicioacuten 129 Dada una familia de conjuntos Ai con i isin I se define la unioacuten ge-neral de los conjuntos Ai notado
⋃iisinI Ai como el conjunto formado por aquellos elementos
que pertenecen al menos a uno de los conjuntos de la familia es decir
⋃iisinI
Ai = x | x isin Ai foralli isin I
La funcioacuten (unionGeneral xss) devuelve la unioacuten general de la familia de conjun-tos de la lista xss
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1415]
-- gtgtgt let c2 = listaAConjunto [2515]
-- gtgtgt let c3 = listaAConjunto [3615]
-- gtgtgt unionGeneral [c1c2c3]
-- [123456789101112131415]
unionGeneral Ord a =gt [Conj a] -gt Conj a
unionGeneral = foldr unionConjuntos vacio
1210 Interseccioacuten de conjuntos
Definicioacuten 1210 Dados dos conjuntos A y B se define la interseccioacuten de A y B notadoA cap B como el conjunto formado por aquellos elementos que pertenecen a cada uno de losdos conjuntos A y B es decir
A cap B = x | x isin A and x isin B
La funcioacuten (interseccion c1 c2) devuelve la interseccioacuten de los conjuntos c1 yc2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1320]
-- gtgtgt let c2 = listaAConjunto [2420]
-- gtgtgt let c3 = listaAConjunto [2430]
-- gtgtgt let c4 = listaAConjunto [4830]
-- gtgtgt interseccion c1 c2
-- []
-- gtgtgt interseccion c3 c4
12 Representaciones de conjuntos 25
-- [481216202428]
interseccion Ord a =gt Conj a -gt Conj a -gt Conj a
interseccion (xxs) (yys)
| x lt y = interseccion xs (yys)
| x gt y = interseccion (xxs) ys
| otherwise = x interseccion xs ys
interseccion _ _ = []
1211 Producto cartesiano
Definicioacuten 1211 El producto cartesiano 1 de dos conjuntos A y B es una operacioacutensobre ellos que resulta en un nuevo conjunto Atimes B que contiene a todos los pares ordenadostales que la primera componente pertenece a A y la segunda pertenece a B es decir
Atimes B = (a b) | a isin A b isin B
La funcioacuten (productoCartesiano c1 c2) devuelve el producto cartesiano de xs eys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [31]
-- gtgtgt let c2 = listaAConjunto [247]
-- gtgtgt productoCartesiano c1 c2
-- [(12)(14)(17)(32)(34)(37)]
-- gtgtgt productoCartesiano c2 c1
-- [(21)(23)(41)(43)(71)(73)]
productoCartesiano (Ord a Ord b) =gt Conj a -gt Conj b -gt Conj (ab)
productoCartesiano xs ys=
listaAConjunto [(xy) | x lt- xs y lt- ys]
1212 Combinaciones
Definicioacuten 1212 Las combinaciones de un conjunto S tomados en grupos de n son todoslos subconjuntos de S con n elementos
La funcioacuten (combinaciones n xs) devuelve las combinaciones de los elementos dexs en listas de n elementos
-- | Ejemplos
-- gtgtgt combinaciones 3 [ad]
-- [abcabdacdbcd]
-- gtgtgt combinaciones 2 [248]
-- [[24][26][28][46][48][68]]
1httpsenwikipediaorgwikiCartesian_product
26 Capiacutetulo 1 Conjuntos
combinaciones Integer -gt [a] -gt [[a]]
combinaciones 0 _ = [[]]
combinaciones _ [] = []
combinaciones k (xxs) =
[xys | ys lt- combinaciones (k-1) xs] ++ combinaciones k xs
1213 Variaciones con repeticioacuten
Definicioacuten 1213 Las variaciones con repeticioacuten de m elementos tomados en grupos den es el nuacutemero de diferentes nndashtuplas de un conjunto de m elementos
La funcioacuten (variacionesR n xs) devuelve las variaciones con con repeticioacuten de loselementos de xs en listas de n elementos
-- | Ejemplos
-- gtgtgt variacionesR 3 [ab]
-- [aaaaababaabbbaababbbabbb]
-- gtgtgt variacionesR 2 [235]
-- [[22][23][25][32][33][35][52][53][55]]
variacionesR Int -gt [a] -gt [[a]]
variacionesR _ [] = [[]]
variacionesR 0 _ = [[]]
variacionesR k us =
[uvs | u lt- us vs lt- variacionesR (k-1) us]
1214 Conjuntos como listas sin repeticioacuten
En el moacutedulo ConjuntosConListas se definen las funciones del TAD de los conjun-tos dando su representacioacuten como listas sin elementos repetidos
module ConjuntosConListas
( Conj
vacio
inserta
listaAConjunto
elimina
pertenece
esVacio
minimoElemento
sinRepetidos
esUnitario
esSubconjunto
conjuntosIguales
esSubconjuntoPropio
complementario
cardinal
12 Representaciones de conjuntos 27
unionConjuntos
unionGeneral
interseccion
productoCartesiano
combinaciones
variacionesR
) where
En las definiciones del presente moacutedulo se usaraacuten algunas funciones de la libreriacuteaDataList
Vamos a definir un nuevo tipo de dato (Conj a) que representa a los conjuntoscomo listas sin elementos repetidos
type Conj a = [a]
Las funciones baacutesicas que definiremos a partir de este tipo coincidiraacuten con las indi-cadas en el TAD de los conjuntosbull (vacio) es el conjunto vaciacuteo
-- | Ejemplo
-- gtgtgt vacio
-- []
vacio Conj a
vacio = []
bull (inserta x c) es el conjunto obtenido antildeadiendo el elemento x al conjunto c
-- | Ejemplo
-- gtgtgt inserta 5 vacio
-- [5]
-- gtgtgt foldr inserta vacio [2211242]
-- [142]
inserta Eq a =gt a -gt Conj a -gt Conj a
inserta x [] = [x]
inserta x ys | elem x ys = ys
| otherwise = xys
bull (listaAConjunto xs) devuelve el conjunto cuyos elementos son los de la lista xs
-- | Ejemplo
-- gtgtgt listaAConjunto [2211242]
-- [214]
listaAConjunto Eq a =gt [a] -gt Conj a
listaAConjunto = nub
bull (esVacio c) se verifica si c es el conjunto vaciacuteo
-- | Ejemplos
-- gtgtgt esVacio (listaAConjunto [25137532190])
-- False
28 Capiacutetulo 1 Conjuntos
-- gtgtgt esVacio vacio
-- True
esVacio Conj a -gt Bool
esVacio = null
bull (pertenece x c) se verifica si x es un elemento del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt pertenece 3 c1
-- True
-- gtgtgt pertenece 4 c1
-- False
pertenece Eq a =gt a -gt Conj a -gt Bool
pertenece = elem
bull (elimina x c) es el conjunto obtenido eliminando el elemento x del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt elimina 3 c1
-- [251790]
-- gtgtgt elimina 4 c1
-- [2513790]
elimina Eq a =gt a -gt Conj a -gt Conj a
elimina = delete
bull (minimoElemento c) devuelve el miacutenimo elemento del conjunto c
-- | Ejemplos
-- gtgtgt minimoElemento (listaAConjunto [25137532190])
-- 0
-- gtgtgt minimoElemento (listaAConjunto ([ae] ++ [AE]))
-- A
minimoElemento Ord a =gt Conj a -gt a
minimoElemento = minimum
1215 Definicioacuten de conjunto
Definicioacuten 1214 Llamaremos conjunto a una coleccioacuten de objetos que llamaremos ele-mentos distintos entre siacute y que comparten una propiedad Para que un conjunto esteacute biendefinido debe ser posible discernir si un objeto arbitrario estaacute o no en eacutel
Si el elemento a pertenece al conjunto A escribiremos a isin A En caso contrarioescribiremos a 6isin A
Nota 124 En Haskell para poder discernir si un objeto arbitrario pertenece a unconjunto se necesita que su tipo pertenezca a la clase Eq
12 Representaciones de conjuntos 29
Nota 125 Al trabajar con la representacioacuten de conjuntos como listas en Haskellhemos de cuidar que los ejemplos con los que trabajemos no tengan elementos re-petidos La funcioacuten (sinRepetidos xs) se verifica si la lista xs no tiene ninguacuten ele-mento repetido
-- | Ejemplos
-- gtgtgt sinRepetidos []
-- True
-- gtgtgt sinRepetidos [1231]
-- False
sinRepetidos Eq a =gt [a] -gt Bool
sinRepetidos xs = nub xs == xs
Los conjuntos pueden definirse de manera expliacutecita citando todos sus elementosentre llaves de manera impliacutecita dando una o varias caracteriacutesticas que determi-nen si un objeto dado estaacute o no en el conjunto Por ejemplo los conjuntos 1 2 3 4y x isinN|1 le x le 4 son el mismo definido de forma explicita e impliacutecita respecti-vamente
Nota 126 La definicioacuten impliacutecita es necesaria cuando el conjunto en cuestioacuten tieneuna cantidad infinita de elementos En general los conjuntos se notaraacuten con letrasmayuacutesculas A B y los elementos con letras minuacutesculas a b
Cuando trabajamos con conjuntos concretos siempre existe un contexto donde esosconjuntos existen Por ejemplo si A = minus1 1 2 3 4 5 y B = x|x isin Nes par elcontexto donde podemos considerar A y B es el conjunto de los nuacutemeros enterosZ En general a este conjunto se le denomina conjunto universal De una forma algomaacutes precisa podemos dar la siguiente definicioacuten
Definicioacuten 1215 El conjunto universal que notaremos por U es un conjunto del queson subconjuntos todos los posibles conjuntos que originan el problema que tratamos
1216 Subconjuntos
Definicioacuten 1216 Dados dos conjuntos A y B si todo elemento de A es a su vez elementode B diremos que A es un subconjunto de B y lo notaremos A sube B En caso contrario senotaraacute A 6sube B
La funcioacuten (esSubconjunto c1 c2) se verifica si c1 es un subconjunto de c2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
30 Capiacutetulo 1 Conjuntos
-- gtgtgt c1 `esSubconjunto` c2
-- True
-- gtgtgt c1 `esSubconjunto` vacio
-- False
-- gtgtgt vacio `esSubconjunto` c2
-- True
-- gtgtgt c3 `esSubconjunto` c4
-- True
-- gtgtgt c2 `esSubconjunto` c1
-- False
esSubconjunto Eq a =gt [a] -gt [a] -gt Bool
esSubconjunto c1 c2 = all (`elem` c2) c1
1217 Igualdad de conjuntos
Definicioacuten 1217 Dados dos conjuntos A y B diremos que son iguales si tienen losmismos elementos es decir si se verifica que A sube B y B sube A Lo notaremos A = B
La funcioacuten (conjuntosIguales c1 c2) se verifica si los conjuntos xs y ys son igua-les
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
-- gtgtgt let c5 = listaAConjunto [4444442]
-- gtgtgt conjuntosIguales c1 c2
-- False
-- gtgtgt conjuntosIguales c3 c4
-- True
-- gtgtgt conjuntosIguales c1 c5
-- True
conjuntosIguales Eq a =gt [a] -gt [a] -gt Bool
conjuntosIguales c1 c2 =
esSubconjunto c1 c2 ampamp esSubconjunto c2 c1
1218 Subconjuntos propios
Definicioacuten 1218 Los subconjuntos de A distintos del empty y del mismo A se denominansubconjuntos propios de A
La funcioacuten (esSubconjuntoPropio c1 c2) se verifica si c1 es un subconjunto pro-pio de c2
12 Representaciones de conjuntos 31
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt esSubconjuntoPropio u u
-- False
-- gtgtgt esSubconjuntoPropio c1 u
-- True
esSubconjuntoPropio Eq a =gt [a] -gt [a] -gt Bool
esSubconjuntoPropio c1 c2
| null c1 = False
| conjuntosIguales c1 c2 = False
| otherwise = esSubconjunto c1 c2
1219 Complementario de un conjunto
Definicioacuten 1219 Dado un conjunto A se define el complementario de A que notaremospor A como
A = x|x isin U x 6isin A
La funcioacuten (complementario u c) devuelve el complementario del conjunto c y enel universo u
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt let c2 = listaAConjunto [14689]
-- gtgtgt complementario u c1
-- [14689]
-- gtgtgt complementario u u
-- []
-- gtgtgt complementario u vacio
-- [123456789]
-- gtgtgt complementario u c2
-- [2357]
complementario Eq a =gt [a] -gt [a] -gt [a]
complementario = ()
1220 Cardinal de un conjunto
Definicioacuten 1220 Dado un conjunto finito A denominaremos cardinal de A al nuacutemerode elementos que tiene y lo notaremos |A|
La funcioacuten (cardinal xs) devuelve el cardinal del conjunto xs
32 Capiacutetulo 1 Conjuntos
-- | Ejemplos
-- gtgtgt cardinal vacio
-- 0
-- gtgtgt cardinal (listaAConjunto [110])
-- 10
-- gtgtgt cardinal (listaAConjunto chocolate)
-- 7
cardinal [a] -gt Int
cardinal = length
1221 Conjunto unitario
Definicioacuten 1221 Un conjunto con un uacutenico elemento se denomina unitario
Nota 127 Notemos que si X = x es un conjunto unitario debemos distinguirentre el conjunto X y el elemento x
La funcioacuten (esUnitario c) se verifica si el conjunto c es unitario
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto (take 10 (repeat 5))
-- gtgtgt let c2 = listaAConjunto valverde
-- gtgtgt let c3 = listaAConjunto coco
-- gtgtgt esUnitario c1
-- True
-- gtgtgt esUnitario c2
-- False
-- gtgtgt esUnitario c2
-- False
esUnitario Eq a =gt [a] -gt Bool
esUnitario c = c == take 1 c
1222 Unioacuten de conjuntos
Definicioacuten 1222 Dados dos conjuntos A y B se define la unioacuten de A y B notado A cup Bcomo el conjunto formado por aquellos elementos que pertenecen al menos a uno de los dosconjuntos A oacute B es decir
A cup B = x | x isin A or x isin B
La funcioacuten (unionConjuntos c1 c2) devuelve la unioacuten de los conjuntos xs y ys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [139]
-- gtgtgt let c2 = listaAConjunto [249]
12 Representaciones de conjuntos 33
-- gtgtgt unionConjuntos c1 c2
-- [135792468]
unionConjuntos Eq a =gt [a] -gt [a] -gt [a]
unionConjuntos = union
Definicioacuten 1223 Dada una familia de conjuntos Ai con i isin I se define la unioacuten ge-neral de los conjuntos Ai notado
⋃iisinI Ai como el conjunto formado por aquellos elementos
que pertenecen al menos a uno de los conjuntos de la familia es decir
⋃iisinI
Ai = x | x isin Ai foralli isin I
La funcioacuten (unionGeneral xss) devuelve la unioacuten general de la familia de conjun-tos de la lista xss
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1415]
-- gtgtgt let c2 = listaAConjunto [2515]
-- gtgtgt let c3 = listaAConjunto [3615]
-- gtgtgt unionGeneral [c1c2c3]
-- [147101325811143691215]
unionGeneral Eq a =gt [[a]] -gt [a]
unionGeneral = foldr unionConjuntos []
1223 Interseccioacuten de conjuntos
Definicioacuten 1224 Dados dos conjuntos A y B se define la interseccioacuten de A y B notadoA cap B como el conjunto formado por aquellos elementos que pertenecen a cada uno de losdos conjuntos A y B es decir
A cap B = x | x isin A and x isin B
La funcioacuten (interseccion c1 c2) devuelve la interseccioacuten de los conjuntos c1 yc2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1320]
-- gtgtgt let c2 = listaAConjunto [2420]
-- gtgtgt let c3 = listaAConjunto [2430]
-- gtgtgt let c4 = listaAConjunto [4830]
-- gtgtgt interseccion c1 c2
-- []
-- gtgtgt interseccion c3 c4
-- [481216202428]
34 Capiacutetulo 1 Conjuntos
interseccion Eq a =gt [a] -gt [a] -gt [a]
interseccion = intersect
1224 Producto cartesiano
Definicioacuten 1225 El producto cartesiano 2 de dos conjuntos A y B es una operacioacutensobre ellos que resulta en un nuevo conjunto Atimes B que contiene a todos los pares ordenadostales que la primera componente pertenece a A y la segunda pertenece a B es decir
Atimes B = (a b) | a isin A b isin B
La funcioacuten (productoCartesiano c1 c2) devuelve el producto cartesiano de xs eys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [31]
-- gtgtgt let c2 = listaAConjunto [247]
-- gtgtgt productoCartesiano c1 c2
-- [(32)(34)(37)(12)(14)(17)]
-- gtgtgt productoCartesiano c2 c1
-- [(23)(21)(43)(41)(73)(71)]
productoCartesiano [a] -gt [b] -gt [(ab)]
productoCartesiano xs ys = [ (xy) | x lt- xs y lt- ys]
1225 Combinaciones
Definicioacuten 1226 Las combinaciones de un conjunto S tomados en grupos de n son todoslos subconjuntos de S con n elementos
La funcioacuten (combinaciones n xs) devuelve las combinaciones de los elementos dexs en listas de n elementos
-- | Ejemplos
-- gtgtgt combinaciones 3 [ad]
-- [abcabdacdbcd]
-- gtgtgt combinaciones 2 [248]
-- [[24][26][28][46][48][68]]
combinaciones Integer -gt [a] -gt [[a]]
combinaciones 0 _ = [[]]
combinaciones _ [] = []
combinaciones k (xxs) =
[xys | ys lt- combinaciones (k-1) xs] ++ combinaciones k xs
2httpsenwikipediaorgwikiCartesian_product
13 Eleccioacuten de la representacioacuten de conjuntos 35
1226 Variaciones con repeticioacuten
Definicioacuten 1227 Las variaciones con repeticioacuten de m elementos tomados en grupos den es el nuacutemero de diferentes nndashtuplas de un conjunto de m elementos
La funcioacuten (variacionesR n xs) devuelve las variaciones con con repeticioacuten de loselementos de xs en listas de n elementos
-- | Ejemplos
-- gtgtgt variacionesR 3 [ab]
-- [aaaaababaabbbaababbbabbb]
-- gtgtgt variacionesR 2 [235]
-- [[22][23][25][32][33][35][52][53][55]]
variacionesR Int -gt [a] -gt [[a]]
variacionesR _ [] = [[]]
variacionesR 0 _ = [[]]
variacionesR k us =
[uvs | u lt- us vs lt- variacionesR (k-1) us]
13 Eleccioacuten de la representacioacuten de conjuntos
Nota 131 En el moacutedulo Conjuntos se elige la representacioacuten de conjunto con la quese trabajaraacute
-- Seleccionar para trabajar con los conjuntos como listas sin
-- elementos repetidos
module Conjuntos
(module ConjuntosConListas)
where
import ConjuntosConListas
-- Seleccionar para trabajar con los conjuntos como listas ordenadas
-- sin elementos repetidos
-- module Conjuntos
-- (module ConjuntosConListasOrdenadasSinRepeticion)
-- where
-- import ConjuntosConListasOrdenadasSinRepeticion
36 Capiacutetulo 1 Conjuntos
Capiacutetulo 2
Relaciones y funciones
21 Relaciones
Las relaciones que existen entre personas nuacutemeros conjuntos y muchas otras enti-dades pueden formalizarse en la idea de relacioacuten binaria En esta seccioacuten se define ydesarrolla este concepto particularizando en el caso de las relaciones homogeacuteneasy en el de las funciones
211 Relacioacuten binaria
Definicioacuten 211 Una relacioacuten binaria 1 (o correspondencia) entre dos conjuntos A yB es un subconjunto del producto cartesiano Atimes B
La funcioacuten (esRelacion xs ys r) se verifica si r es una relacioacuten binaria de xs enys Por ejemplo
-- | Ejemplos
-- gtgtgt esRelacion [31] [247] [(12)(34)]
-- True
-- gtgtgt esRelacion [31] [247] [(12)(31)]
-- False
esRelacion (Ord a Ord b) =gt [a] -gt [b] -gt [(ab)] -gt Bool
esRelacion xs ys r =
r `esSubconjunto` productoCartesiano xs ys
212 Imagen por una relacioacuten
Definicioacuten 212 Si R es una relacioacuten binaria la imagen del elemento x en la relacioacuten Res el conjunto de los valores correspondientes a x en R
1httpsenwikipediaorgwikiBinary_relation
37
38 Capiacutetulo 2 Relaciones y funciones
La funcioacuten (imagenRelacion r x) es la imagen de x en la relacioacuten r
-- | Ejemplos
-- gtgtgt imagenRelacion [(13)(25)(14)] 1
-- [34]
-- gtgtgt imagenRelacion [(13)(25)(14)] 2
-- [5]
-- gtgtgt imagenRelacion [(13)(25)(14)] 3
-- []
imagenRelacion (Ord a Ord b) =gt [(ab)] -gt a -gt [b]
imagenRelacion r x =
nub [y | (zy) lt- r z == x]
213 Dominio de una relacioacuten
Definicioacuten 213 Dada una relacioacuten binaria R su dominio es el conjunto que contiene atodos los valores que se toman en la relacioacuten R
La funcioacuten (dominio r) devuelve el dominio de la relacioacuten r
-- | Ejemplo
-- gtgtgt dominio [(32)(51)(34)]
-- [35]
dominio Ord a =gt [(ab)] -gt [a]
dominio r = listaAConjunto (map fst r)
214 Rango de una relacioacuten
Definicioacuten 214 El rango de una relacioacuten binaria R es el conjunto de las imaacutegenes demediante R
La funcioacuten (rango r) devuelve el rango de la relacioacuten binaria r
-- | Ejemplo
-- gtgtgt rango [(32)(52)(34)]
-- [24]
rango Ord b =gt [(ab)] -gt [b]
rango r = listaAConjunto (map snd r)
215 Antiimagen por una relacioacuten
Definicioacuten 215 La antiimagen del elemento y por una relacioacuten r es el conjunto de loselementos cuya imagen es y
La (antiImagenRelacion r y) es la antiimagen del elemento y en la relacioacuten bina-ria r
22 Relaciones homogeacuteneas 39
-- | Ejemplo
-- gtgtgt antiImagenRelacion [(13)(23)(74)] 3
-- [12]
antiImagenRelacion (Ord a Ord b) =gt [(ab)] -gt b -gt [a]
antiImagenRelacion r y =
nub [x | (xz) lt- r z == y]
216 Relacioacuten funcional
Definicioacuten 216 Dada una relacioacuten binaria R se dice funcional si todos los elementos desu dominio tienen una uacutenica imagen en R
La funcioacuten (esFuncional r) se verifica si la relacioacuten r es funcional
-- | Ejemplos
-- gtgtgt esFuncional [(32)(51)(79)]
-- True
-- gtgtgt esFuncional [(32)(51)(34)]
-- False
-- gtgtgt esFuncional [(32)(51)(32)]
-- True
esFuncional (Ord a Ord b) =gt [(ab)] -gt Bool
esFuncional r =
and [esUnitario (imagenRelacion r x) | x lt- dominio r]
22 Relaciones homogeacuteneas
Para elaborar la presente seccioacuten se han consultado los apuntes de ldquoAacutelgebra baacutesicardquo([6]) asignatura del primer curso del Grado en Matemaacuteticas
Definicioacuten 221 Una relacioacuten binaria entre dos conjuntos A y B se dice que es homogeacute-nea si los conjuntos son iguales es decir si A = B Si el par (x y) isin AA estaacute en la relacioacutenhomogeacutenea R diremos que x estaacute Rndashrelacionado con y o relacionado con y por R Esto senotaraacute frecuentemente xRy (noacutetese que el orden es importante)
La funcioacuten (esRelacionHomogenea xs r) se verifica si r es una relacioacuten binaria ho-mogeacutenea en el conjunto xs
-- | Ejemplos
-- gtgtgt esRelacionHomogenea [14] [(12)(24)(34)(41)]
-- True
-- gtgtgt esRelacionHomogenea [14] [(12)(25)(34)(41)]
-- False
-- gtgtgt esRelacionHomogenea [14] [(12)(34)(41)]
40 Capiacutetulo 2 Relaciones y funciones
-- True
esRelacionHomogenea Ord a =gt [a] -gt [(aa)] -gt Bool
esRelacionHomogenea xs = esRelacion xs xs
Nota 221 El segundo argumento que recibe la funcioacuten ha de ser una lista de parescon ambas componentes del mismo tipo
La funcioacuten (estaRelacionado r x y) se verifica si x estaacute relacionado con y en larelacioacuten homogeacutenea r
-- | Ejemplos
-- gtgtgt estaRelacionado [(13)(25)(46)] 2 5
-- True
-- gtgtgt estaRelacionado [(13)(25)(46)] 2 3
-- False
estaRelacionado Ord a =gt [(aa)] -gt a -gt a -gt Bool
estaRelacionado r x y = (xy) `elem` r
221 Relaciones reflexivas
Definicioacuten 222 Sea R una relacioacuten binaria homogeacutenea en el conjunto A Diremos que Res reflexiva cuando todos los elementos de A estaacuten relacionados por R consigo mismos esdecir cuando forallx isin A se tiene que xRx
La funcioacuten (esReflexiva xs r) se verifica si la relacioacuten r en xs es reflexiva
-- | Ejemplos
-- gtgtgt esReflexiva [12] [(11)(12)(22)]
-- True
-- gtgtgt esReflexiva [12] [(11)(12)]
-- False
esReflexiva Ord a =gt [a] -gt [(aa)] -gt Bool
esReflexiva xs r = zip xs xs `esSubconjunto` r
Nota 222 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xSylarrrarr xminus y es parbull xTylarrrarr x divide a yson relaciones binarias homogeacuteneas reflexivas
222 Relaciones simeacutetricas
Definicioacuten 223 Diremos que una relacioacuten homogeacutenea R es simeacutetrica cuando
forall(x y) isin R minusrarr (y x) isin R
22 Relaciones homogeacuteneas 41
La funcioacuten (esSimetrica r) se verifica si la relacioacuten r es simeacutetrica
-- | Ejemplos
-- gtgtgt esSimetrica [(11)(12)(21)]
-- True
-- gtgtgt esSimetrica [(11)(12)(22)]
-- False
esSimetrica Ord a =gt [(aa)] -gt Bool
esSimetrica r =
listaAConjunto [(yx) | (xy) lt- r] `esSubconjunto` r
Nota 223 En el conjunto N la relacioacuten caracterizada por xSy larrrarr xminus y es par esuna relacioacuten binaria homogeacutenea simeacutetrica
223 Relaciones antisimeacutetricas
Definicioacuten 224 Sea R una relacioacuten binaria homogeacutenea en el conjunto A Diremos que Res antisimeacutetrica cuando
forall(x y)[(x y) isin R and (y x) isin R minusrarr x = y
La funcioacuten (esAntisimetrica r) se verifica si la relacioacuten r es antisimeacutetrica
-- | Ejemplos
-- gtgtgt esAntisimetrica [(12)(31)]
-- True
-- gtgtgt esAntisimetrica [(12)(21)]
-- False
esAntisimetrica Ord a =gt [(aa)] -gt Bool
esAntisimetrica r =
and [x == y | (xy) lt- r (yx) `elem` r]
Nota 224 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xTylarrrarr x divide a ybull xRylarrrarr x lt yson relaciones binarias homogeacuteneas antisimeacutetricas
224 Relaciones transitivas
Definicioacuten 225 Sea R una relacioacuten binaria homogeacutenea en el conjunto A Diremos que Res transitiva cuando forall(x y) (y z) isin R se tiene que xRy e yRz minusrarr xRz
La funcioacuten (esTransitiva r) se verifica si la relacioacuten r es transitiva
42 Capiacutetulo 2 Relaciones y funciones
-- | Ejemplos
-- gtgtgt esTransitiva [(12)(13)(23)]
-- True
-- gtgtgt esTransitiva [(12)(23)]
-- False
esTransitiva Ord a =gt [(aa)] -gt Bool
esTransitiva r =
listaAConjunto [(xz) | (xy) lt- r (wz) lt- r y == w]
`esSubconjunto` r
Nota 225 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xSylarrrarr xminus y es parbull xTylarrrarr x divide a ybull xRylarrrarr x lt yson relaciones binarias homogeacuteneas transitivas
225 Relaciones de equivalencia
Definicioacuten 226 Las relaciones homogeacuteneas que son a la vez reflexivas simeacutetricas y tran-sitivas se denominan relaciones de equivalencia
La funcioacuten (esRelacionEquivalencia xs r) se verifica si r es una relacioacuten de equi-valencia en xs-- | Ejemplos
-- gtgtgt esRelacionEquivalencia [13] [(11)(12)(21)(22)(33)]
-- True
-- gtgtgt esRelacionEquivalencia [13] [(12)(21)(22)(33)]
-- False
-- gtgtgt esRelacionEquivalencia [13] [(11)(12)(22)(33)]
-- False
esRelacionEquivalencia Ord a =gt [a] -gt [(aa)] -gt Bool
esRelacionEquivalencia xs r =
esReflexiva xs r ampamp
esSimetrica r ampamp
esTransitiva r
Nota 226 En el conjunto N la relacioacuten caracterizada por xSy larrrarr xminus y es par esuna relacioacuten de equivalencia
226 Relaciones de orden
Definicioacuten 227 Las relaciones homogeacuteneas que son a la vez reflexivas antisimeacutetricas ytransitivas se denominan relaciones de orden
23 Funciones 43
La funcioacuten (esRelacionOrden xs r) se verifica si r es una relacioacuten de orden en xs
-- | Ejemplo
-- gtgtgt esRelacionOrden [13] [(11)(12)(13)(22)(23)(33)]
-- True
esRelacionOrden Ord a =gt [a] -gt [(aa)] -gt Bool
esRelacionOrden xs r =
esReflexiva xs r ampamp
esAntisimetrica r ampamp
esTransitiva r
Nota 227 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xTylarrrarr x divide a yson relaciones de orden
227 Clases de equivalencia
Definicioacuten 228 Si R es una relacioacuten de equivalencia en A denominamos clase de equi-valencia de un elemento x isin A al conjunto de todos los elementos de A relacionados con xes decir x = R(x) = y isin A|xRy donde la primera notacioacuten se usa si la relacioacuten con laque se estaacute tratando se sobreentiende y la segunda si no es asiacute
La funcioacuten (clasesEquivalencia xs r) devuelve las clases de la relacioacuten de equi-valencia r en xs
-- | Ejemplo
-- gtgtgt let r = [(xy) | x lt- [15] y lt- [15] even (x-y)]
-- gtgtgt clasesEquivalencia [15] r
-- [[135][24]]
clasesEquivalencia Ord a =gt [a] -gt [(aa)] -gt [[a]]
clasesEquivalencia _ [] = []
clasesEquivalencia [] _ = []
clasesEquivalencia (xxs) r = (xc) clasesEquivalencia (xs c) r
where c = filter (estaRelacionado r x) xs
23 Funciones
Definicioacuten 231 Dada una relacioacuten F entre A y B se diraacute que es una funcioacuten si es unarelacioacuten binaria es funcional y todos los elementos de A estaacuten en el dominio
La funcioacuten (esFuncion xs ys f) se verifica si f es una funcioacuten de xs en ys
-- | Ejemplos
-- gtgtgt esFuncion [13] [247] [(17)(32)]
44 Capiacutetulo 2 Relaciones y funciones
-- True
-- gtgtgt esFuncion [13] [247] [(17)]
-- False
-- gtgtgt esFuncion [13] [247] [(14)(17)(32)]
-- False
esFuncion (Ord a Ord b) =gt [a] -gt [b] -gt [(ab)] -gt Bool
esFuncion xs ys f =
esRelacion xs ys f ampamp
xs `esSubconjunto` dominio f ampamp
esFuncional f
Nota 231 A lo largo de la seccioacuten representaremos a las funciones como listas depares
type Funcion a b = [(ab)]
La funcioacuten (funciones xs ys) devuelve todas las posibles funciones del conjuntoxs en ys
-- | Ejemplos
-- gtgtgt pp $ funciones [12] [34]
-- [[(1 3)(2 3)][(1 3)(2 4)][(1 4)(2 3)]
-- [(1 4)(2 4)]]
-- gtgtgt pp $ funciones [12] [345]
-- [[(1 3)(2 3)][(1 3)(2 4)][(1 3)(2 5)]
-- [(1 4)(2 3)][(1 4)(2 4)][(1 4)(2 5)]
-- [(1 5)(2 3)][(1 5)(2 4)][(1 5)(2 5)]]
-- gtgtgt pp $ funciones [012] [34]
-- [[(0 3)(1 3)(2 3)][(0 3)(1 3)(2 4)]
-- [(0 3)(1 4)(2 3)][(0 3)(1 4)(2 4)]
-- [(0 4)(1 3)(2 3)][(0 4)(1 3)(2 4)]
-- [(0 4)(1 4)(2 3)][(0 4)(1 4)(2 4)]]
funciones [a] -gt [b] -gt [Funcion a b]
funciones xs ys =
[zip xs zs | zs lt- variacionesR (length xs) ys]
231 Imagen por una funcioacuten
Definicioacuten 232 Si f es una funcioacuten entre A y B y x es un elemento del conjunto A laimagen del elemento x por la funcioacuten f es el valor asociado a x por la funcioacuten f
La funcioacuten (imagen f x) es la imagen del elemento x en la funcioacuten f
-- | Ejemplos
-- gtgtgt imagen [(17)(32)] 1
-- 7
-- gtgtgt imagen [(17)(32)] 3
23 Funciones 45
-- 2
imagen (Ord a Ord b) =gt Funcion a b -gt a -gt b
imagen f x = head (imagenRelacion f x)
La funcioacuten (imagenConjunto f xs) es la imagen del conjunto xs en la funcioacuten f
-- | Ejemplos
-- gtgtgt imagenConjunto [(17)(32)(43)] [14]
-- [73]
-- gtgtgt imagenConjunto [(17)(32)] [31]
-- [27]
imagenConjunto (Ord a Ord b) =gt Funcion a b -gt [a] -gt [b]
imagenConjunto f xs = nub (map (imagen f) xs)
232 Funciones inyectivas
Definicioacuten 233 Diremos que una funcioacuten f entre dos conjuntos es inyectiva 2 si a ele-mentos distintos del dominio le corresponden elementos distintos de la imagen es decir siforalla b isin dominio( f ) tales que a 6= b f (a) 6= f (b)
La funcioacuten (esInyectiva fs) se verifica si la funcioacuten fs es inyectiva
-- | Ejemplos
-- gtgtgt esInyectiva [(14)(25)(36)]
-- True
-- gtgtgt esInyectiva [(14)(25)(34)]
-- False
-- gtgtgt esInyectiva [(14)(25)(36)(36)]
-- True
esInyectiva (Ord a Ord b) =gt Funcion a b -gt Bool
esInyectiva f =
all esUnitario [antiImagenRelacion f y | y lt- rango f]
233 Funciones sobreyectivas
Definicioacuten 234 Diremos que una funcioacuten f entre dos conjuntos A y B es sobreyectiva3 si todos los elementos de B son imagen de alguacuten elemento de A
La funcioacuten (esSobreyectiva xs ys f) se verifica si la funcioacuten f es sobreyectiva Ala hora de definirla estamos contando con que f es una funcioacuten entre xs y ys
-- | Ejemplos
-- gtgtgt esSobreyectiva [123] [456] [(14)(25)(36)]
2httpsenwikipediaorgwikiInjective_function3httpsenwikipediaorgwikiSurjective_function
46 Capiacutetulo 2 Relaciones y funciones
-- True
-- gtgtgt esSobreyectiva [123] [456] [(14)(25)(34)]
-- False
-- gtgtgt esSobreyectiva [123] [456] [(14)(24)(36)(36)]
-- False
esSobreyectiva (Ord aOrd b) =gt [a] -gt [b] -gt Funcion a b -gt Bool
esSobreyectiva _ ys f = ys `esSubconjunto` rango f
234 Funciones biyectivas
Definicioacuten 235 Diremos que una funcioacuten f entre dos conjuntos A y B es biyectiva 4 sicada elementos de B es imagen de un uacutenico elemento de A
La funcioacuten (esBiyectiva xs ys f) se verifica si la funcioacuten f es biyectiva
-- | Ejemplos
-- gtgtgt esBiyectiva [123] [456] [(14)(25)(36)(36)]
-- True
-- gtgtgt esBiyectiva [123] [456] [(14)(25)(34)]
-- False
-- gtgtgt esBiyectiva [123] [4567] [(14)(25)(36)]
-- False
esBiyectiva (Ord a Ord b) =gt [a] -gt [b] -gt Funcion a b -gt Bool
esBiyectiva xs ys f =
esInyectiva f ampamp esSobreyectiva xs ys f
La funciones biyecciones1 xs ys y biyecciones2 xs ys devuelven la lista de to-das las biyecciones entre los conjuntos xs y ys La primera lo hace filtrando las fun-ciones entre los conjuntos que son biyectivas y la segunda lo hace construyendouacutenicamente las funciones biyectivas entre los conjuntos con el consecuente ahorrocomputacional
ghcigt length (biyecciones1 [17] [ag])
5040
(1675 secs 4146744104 bytes)
ghcigt length (biyecciones2 [17] [ag])
5040
(002 secs 0 bytes)
ghcigt length (biyecciones1 [16] [ag])
0
(253 secs 592625824 bytes)
ghcigt length (biyecciones2 [16] [ag])
0
(001 secs 0 bytes)
4httpsenwikipediaorgwikiBijective_function
23 Funciones 47
biyecciones1 (Ord a Ord b) =gt [a] -gt [b] -gt [Funcion a b]
biyecciones1 xs ys =
filter (esBiyectiva xs ys) (funciones xs ys)
biyecciones2 (Ord a Ord b) =gt [a] -gt [b] -gt [Funcion a b]
biyecciones2 xs ys
| length xs = length ys = []
| otherwise = [zip xs zs | zs lt- permutations ys]
Nota 232 En lo que sigue trabajaremos con la funcioacuten biyecciones2 asiacute que laredefiniremos como biyecciones
biyecciones (Ord a Ord b) =gt [a] -gt [b] -gt [Funcion a b]
biyecciones = biyecciones2
235 Inversa de una funcioacuten
Definicioacuten 236 Si f es una funcioacuten biyectiva entre los conjuntos A y B definimos lafuncioacuten inversa 5 como la funcioacuten que a cada elemento de B le hace corresponder el elementode A del que es imagen en B
El valor de (inversa f) es la funcioacuten inversa de f
-- | Ejemplos
-- gtgtgt inversa [(14)(25)(36)]
-- [(41)(52)(63)]
-- gtgtgt sort (inversa [(1f)(2m)(3a)])
-- [(a3)(f1)(m2)]
inversa (Ord a Ord b) =gt Funcion a b -gt Funcion b a
inversa f = listaAConjunto [(yx) | (xy) lt- f]
Nota 233 Para considerar la inversa de una funcioacuten esta tiene que ser biyectivaLuego (inversa f) asigna a cada elemento del conjunto imagen (que en este casocoincide con la imagen) uno y solo uno del conjunto de salida
La funcioacuten (imagenInversa f y) devuelve el elemento del conjunto de salida de lafuncioacuten f tal que su imagen es y
-- | Ejemplos
-- gtgtgt imagenInversa [(14)(25)(36)] 5
-- 2
-- gtgtgt imagenInversa [(1f)(2m)(3a)] a
-- 3
imagenInversa (Ord a Ord b) =gt Funcion a b -gt b -gt a
imagenInversa f = imagen (inversa f)
5httpsenwikipediaorgwikiInverse_function
48 Capiacutetulo 2 Relaciones y funciones
Capiacutetulo 3
Introduccioacuten a la teoriacutea de grafos
Se dice que la Teoriacutea de Grafos tiene su origen en 1736 cuando Euler dio una so-lucioacuten al problema (hasta entonces no resuelto) de los siete puentes de Koumlnigsbergiquestexiste un camino que atraviese cada uno de los puentes exactamente una vezPara probar que no era posible Euler sustituyoacute cada regioacuten por un nodo y cadapuente por una arista creando el primer grafo que fuera modelo de un problemamatemaacutetico
Figura 31 Dibujo de los puentes de Koumlnigsberg
A
B
C
D
b
c
a
d
f
e
g
Figura 32 Modelo de los puentes de Koumlnigsberg
Desde entonces se ha ido desarrollando esta metodologiacutea hasta convertise en los uacutel-timos antildeos en una herramienta importante en aacutereas del conocimiento muy variadascomo por ejemplo la Investigacioacuten Operativa la Computacioacuten la Ingenieriacutea Eleacutec-trica la Geografiacutea y la Quiacutemica Es por ello que ademaacutes se ha erigido como unanueva disciplina matemaacutetica que generalmente asociada a las ramas de Topologiacuteay AacutelgebraLa utilidad de los grafos se basa en su gran poder de abstraccioacuten y una representa-cioacuten muy clara de cualquier relacioacuten lo que facilita enormemente tanto la fase demodelado como la de resolucioacuten de cualquier problema Gracias a la Teoriacutea de Gra-fos se han desarrollado una gran variedad de algoritmos y meacutetodos de decisioacuten quepodemos implementar a traveacutes de lenguajes funcionales y permiten automatizar laresolucioacuten de muchos problemas a menudo tediosos de resolver a mano
49
50 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
31 Definicioacuten de grafo
En primer lugar vamos a introducir terminologiacutea baacutesica en el desarrollo de la Teoriacuteade Grafos
Definicioacuten 311 Un grafo G es un par (V A) donde V es el conjunto cuyos elementosllamamos veacutertices (o nodos) y A es un conjunto cuyos elementos llamamos aristas
Definicioacuten 312 Una arista de un grafo G = (V A) es un conjunto de dos elementosde V Es decir para dos veacutertices v vprime de G (v vprime) y (vprime v) representa la misma arista
Definicioacuten 313 Dado un grafo G = (V A) diremos que un veacutertice v isin V es adyacentea vprime isin V si (vprime v) isin A
Definicioacuten 314 Si en un grafo dirigido se permiten aristas repetidas lo llamaremos mul-tigrafo Si no se permiten lo llamaremos grafo regular
Nota 311 Denotaremos por |V| al nuacutemero de veacutertices y por |A| al nuacutemero de aristasdel grafo (V A)
Ejemplo 312 Sea G = (V A) un grafo con V = a b c d y A = (a b) (a c) (b d)(d d) En este grafo los veacutertices a d son adyacentes a b
a
b
c
d
32 El TAD de los grafos
En esta seccioacuten nos planteamos la tarea de implementar las definiciones presenta-das anteriormente en un lenguaje funcional En nuestro caso el lenguaje que utili-zaremos seraacute Haskell Definiremos el Tipo Abstracto de Dato (TAD) de los grafos ydaremos algunos ejemplos de posibles representaciones de grafos con las que po-dremos trabajarSi consideramos un grafo finito cualquiera G = (V A) podemos ordenar el conjun-to de los veacutertices y representarlo como V = v1 vn con n = |V|En primer lugar necesitaremos crear un tipo (Grafo) cuya definicioacuten sea compatiblecon la entidad matemaacutetica que representa y que nos permita definir las operacionesque necesitamos para trabajar con los grafos Estas operaciones son
32 El TAD de los grafos 51
creaGrafo -- [a] -gt [(aa)] -gt Grafo a
vertices -- Grafo a -gt [a]
adyacentes -- Grafo a -gt a -gt [a]
aristaEn -- (aa) -gt Grafo a -gt Bool
aristas -- Grafo a -gt [(aa)]
dondebull (creaGrafo vs as) es un grafo tal que el conjunto de sus veacutertices es vs y el de
sus aristas es asbull (vertices g) es la lista de todos los veacutertices del grafo gbull (adyacentes g v) es la lista de los veacutertices adyacentes al veacutertice v en el grafo gbull (aristaEn a g) se verifica si a es una arista del grafo gbull (aristas g) es la lista de las aristas del grafo g
Nota 321 Las funciones que aparecen en la especificacioacuten del TAD no dependende la representacioacuten que elijamos
Ejemplo 322 Veamos un ejemplo de creacioacuten de grafo y su representacioacuten graacutefica
creaGrafo [15] [(12)(13)(15)(24)
(25)(34)(35)(45)]
1
2
34
5
321 Grafos como listas de aristas
En el moacutedulo GrafoConListaDeAristas se definen las funciones del TAD de losgrafos dando su representacioacuten como conjuntos de aristas es decir representandoa un grafo como dos conjuntos la primera seraacute la lista ordenada de los veacutertices y lasegunda la lista ordenada de las aristas (en ambas listas se excluye la posibilidad derepeticiones)
Nota 323 Las ventajas de usar arrays frente a usar listas es que los array tienenacceso constante (O(1)) a sus elementos mientras que las listas tienen acceso lineal(O(n)) y que la actualizacioacuten de un elemento en un array no supone espacio extraSin embargo los arrays son representaciones muy riacutegidas cualquier modificacioacutenen su estructura como cambiar su tamantildeo supone un gran coste computacionalpues se tendriacutea que crear de nuevo el array y ademaacutes sus iacutendices deben pertenecer
52 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
a la clase de los objetos indexables (Ix) luego perdemos mucha flexibilidad en larepresentacioacuten
- LANGUAGE DeriveGeneric -
module GrafoConListaDeAristas
( Grafo
creaGrafo -- [a] -gt [(aa)] -gt Grafo a
vertices -- Grafo a -gt [a]
adyacentes -- Grafo a -gt a -gt [a]
aristaEn -- (aa) -gt Grafo a -gt Bool
aristas -- Grafo a -gt [(aa)]
) where
En las definiciones del presente moacutedulo se usaraacuten las funciones nub y sort de lalibreriacutea DataList
Vamos a definir un nuevo tipo de dato (Grafo a) que representaraacute un grafo a partirde la lista de sus veacutertices (donde los veacutertices son de tipo a) y de aristas (que son paresde veacutertices)
data Grafo a = G [a] [(aa)]
deriving (Eq Show Generic)
instance (Out a) =gt Out (Grafo a)
Las funciones baacutesicas que definiremos a partir de este tipo coincidiraacuten con las indi-cadas en el TAD de los grafosbull (creaGrafo vs as) es el grafo cuyo conjunto de veacutertices es cs y el de sus aristas
es as-- | Ejemplo
-- gtgtgt creaGrafo [15] [(12)(14)(15)(23)(25)(34)(35)]
-- G [12345] [(12)(14)(15)(23)(25)(34)(35)]
creaGrafo Ord a =gt [a] -gt [(aa)] -gt Grafo a
creaGrafo vs as =
G (sort vs) (nub (sort [parOrdenado a | a lt- as]))
parOrdenado Ord a =gt (aa) -gt (aa)
parOrdenado (xy) | x lt= y = (xy)
| otherwise = (yx)
Ejemplo 324 ejGrafo es el grafo
32 El TAD de los grafos 53
1
2
3
4
5
Los ejemplos usaraacuten el siguiente grafo
ejGrafo Grafo Int
ejGrafo = creaGrafo [15]
[(12)(14)(15)(23)(25)(34)(35)(45)]
bull (vertices g) es la lista de los veacutertices del grafo g
-- | Ejemplo
-- gtgtgt vertices ejGrafo
-- [12345]
vertices Grafo a -gt [a]
vertices (G vs _) = vs
bull (adyacentes g v) es la lista de los veacutertices adyacentes al veacutertice v en el grafo g
-- | Ejemplos
-- gtgtgt adyacentes ejGrafo 4
-- [135]
-- gtgtgt adyacentes ejGrafo 3
-- [245]
adyacentes Eq a =gt Grafo a -gt a -gt [a]
adyacentes (G _ as) v =
[u | (ux) lt- as x == v] `union` [u | (xu) lt- as x == v]
bull (aristaEn a g) se verifica si a es una arista del grafo g
-- | Ejemplos
-- gtgtgt (51) `aristaEn` ejGrafo
-- True
-- gtgtgt (31) `aristaEn` ejGrafo
-- False
aristaEn Ord a =gt (aa) -gt Grafo a -gt Bool
aristaEn a (G _ as) = parOrdenado a `elem` as
bull (aristas g) es la lista de las aristas del grafo g
-- | Ejemplo
-- gtgtgt aristas ejGrafo
-- [(12)(14)(15)(23)(25)(34)(35)(45)]
aristas Grafo a -gt [(aa)]
aristas (G _ as) = as
54 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
33 Generador de grafos
En esta seccioacuten presentaremos el generador de grafos que nos permitiraacute generargrafos como listas de aristas arbitrariamente y usarlos como ejemplos o para com-probar propiedadesPara aprender a controlar el tamantildeo de los grafos generados he consultado las si-guientes fuentes QuickCheck A Lightweight Tool for Random Testing of Haskell Programs 1
([3]) Property Testing using QuickCheck 2 ([9])(generaGrafos n) es un generador de grafos de hasta n veacutertices Por ejemplo
ghcigt sample (generaGrafo 5)
G [12] []
G [1] [(11)]
G [] []
G [1234] [(22)]
G [123] [(11)(12)(13)(22)]
G [12345] [(12)(14)(15)(22)(23)(24)(33)(34)(44)(45)]
G [1] []
G [123] [(12)(22)(33)]
G [1234] [(11)(14)(23)(24)(33)(34)(44)]
G [12] []
G [123] [(11)(12)(22)(33)]
ghcigt sample (generaGrafo 2)
G [12] [(12)(22)]
G [12] [(11)]
G [12] [(11)(12)]
G [] []
G [1] [(11)]
G [1] []
G [1] []
G [] []
G [] []
G [] []
G [1] [(11)]
generaGrafo Int -gt Gen (Grafo Int)
generaGrafo s = do
let m = s `mod` 11
n lt- choose (0m)
as lt- sublistOf [(xy) | x lt- [1n] y lt- [xn]]
return (creaGrafo [1n] as)
1httpswwweecsnorthwesternedu~robbycourses395-495-2009-fallquickpdf2httpswwwdccfcuppt~pbvaulastapfslidesquickcheckhtml
34 Ejemplos de grafos 55
Nota 331 Los grafos estaacuten contenidos en la clase de los objetos generables aleato-riamente
instance Arbitrary (Grafo Int) where
arbitrary = sized generaGrafo
En el siguiente ejemplo se pueden observar algunos grafos generados
ghcigt sample (arbitrary Gen (Grafo Int))
G [] []
G [1] [(11)]
G [12] [(11)(12)]
G [1] [(11)]
G [12345678] [(14)(17)(22)(23)(25)(28)(35)
(36)(38)(44)(46)(47)(48)(56)(66)(67)(78)]
G [12345] [(11)(12)(14)(15)(24)(25)(34)(55)]
G [] []
G [] []
G [123] [(11)(22)(23)]
G [1234] [(11)(12)(14)(22)(33)]
G [1234567] [(11)(15)(16)(17)(22)(24)(25)
(26)(27)(33)(35)(46)(47)(55)(57)(66)(77)]
34 Ejemplos de grafos
El objetivo de esta seccioacuten es reunir una coleccioacuten de grafos lo suficientemente ex-tensa y variada como para poder utilizarla como recurso a la hora de comprobar laspropiedades y definiciones de funciones que implementaremos maacutes adelanteEn el proceso de recopilacioacuten de ejemplos se ha trabajado con diversas fuentesbull los apuntes de la asignatura ldquoMatemaacutetica discretardquo ([4])bull los temas de la asignatura ldquoInformaacuteticardquo ([1]) ybull el artiacuteculo ldquoGraph theoryrdquo ([11]) de la Wikipedia
Nota 341 Se utilizaraacute la representacioacuten de los grafos como listas de aristas
341 Grafo nulo
Definicioacuten 341 Un grafo nulo es un grafo que no tiene ni veacutertices ni aristas
La funcioacuten (grafoNulo) devuelve un grafo nulo
grafoNulo Ord a =gt Grafo a
grafoNulo = creaGrafo [] []
La funcioacuten (esGrafoNulo g) se verifica si g es un grafo nulo
56 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- | Ejemplos
-- gtgtgt esGrafoNulo grafoNulo
-- True
-- gtgtgt esGrafoNulo (creaGrafo [] [(12)])
-- False
-- gtgtgt esGrafoNulo (creaGrafo [12] [(12)])
-- False
esGrafoNulo Grafo a -gt Bool
esGrafoNulo g =
null (vertices g) ampamp null (aristas g)
342 Grafo ciclo
Definicioacuten 342 Un ciclo 3 de orden n C(n) es un grafo no dirigido y no ponderadocuyo conjunto de veacutertices viene dado por V = 1 n y el de las aristas por A = (0 1)(1 2) (nminus 2 nminus 1) (nminus 1 0)
La funcioacuten (grafoCiclo n) nos genera el ciclo de orden n
1
23
45
-- | Ejemplos
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
grafoCiclo Int -gt Grafo Int
grafoCiclo 0 = grafoNulo
grafoCiclo 1 = creaGrafo [1] []
grafoCiclo n = creaGrafo [1n]
([(uu+1) | u lt- [1n-1]] ++ [(n1)])
343 Grafo de la amistad
Definicioacuten 343 Un grafo de la amistad 4 de orden n es un grafo con 2n + 1 veacuterticesy 3n aristas formado uniendo n copias del ciclo C3 por un veacutertice comuacuten Lo denotamos porFn3httpseswikipediaorgwikiGrafo_completo4httpseswikipediaorgwikiGrafo_de_la_amistad
34 Ejemplos de grafos 57
La funcioacuten (grafoAmistad n) genera el grafo de la amistad de orden n Por ejemplo
1
2
34
5
1
2
3
4
5
6
7
-- | Ejemplos
-- gtgtgt pp $ grafoAmistad 2
-- G [12345]
-- [(1 2)(1 3)(1 4)(1 5)(2 3)(4 5)]
-- gtgtgt pp $ grafoAmistad 3
-- G [1234567]
-- [(1 2)(1 3)(1 4)(1 5)(1 6)(1 7)(2 3)
-- (4 5)(6 7)]
grafoAmistad Int -gt Grafo Int
grafoAmistad n =
creaGrafo [12n+1]
([(1a) | a lt- [22n+1]] ++
[(ab) | (ab) lt-zip [242n] [352n+1]])
344 Grafo completo
Definicioacuten 344 El grafo completo 5 de orden n K(n) es un grafo no dirigido cuyoconjunto de veacutertices viene dado por V = 1 n y tiene una arista entre cada par deveacutertices distintos
La funcioacuten (completo n) nos genera el grafo completo de orden n Por ejemplo
5httpseswikipediaorgwikiGrafo_completo
58 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
1
2
3
4
-- | Ejemplo
-- gtgtgt completo 4
-- G [1234] [(12)(13)(14)(23)(24)(34)]
completo Int -gt Grafo Int
completo n =
creaGrafo [1n]
[(ab) | a lt- [1n] b lt- [1a-1]]
345 Grafo bipartito
Definicioacuten 345 Un grafo bipartito 6 es un grafo G = (V A) verificando que elconjunto de sus veacutertices se puede dividir en dos subconjuntos disjuntos V1 V2 tales queV1 cupV2 = V de manera que forallu1 u2 isin V1[(u1 u2) 6isin A] y forallv1 v2 isin V2[(v1 v2) 6isin A]Un grafo bipartito completo 7 seraacute entonces un grafo bipartito G = (V1 cup V2 A) en elque todos los veacutertices de una particioacuten estaacuten conectados a los de la otra Si n = |V1| m =
|V2| denotamos al grafo bipartito G = (V1 cupV2 A) por Knm
La funcioacuten (bipartitoCompleto n m) nos genera el grafo bipartito Knm Por ejem-plo
1 2
3 4 5
-- | Ejemplo
-- gtgtgt bipartitoCompleto 2 3
-- G [12345] [(13)(14)(15)(23)(24)(25)]
bipartitoCompleto Int -gt Int -gt Grafo Int
bipartitoCompleto n m =
creaGrafo [1n+m]
[(ab) | a lt- [1n] b lt- [n+1n+m]]
6httpseswikipediaorgwikiGrafo_bipartito7httpseswikipediaorgwikiGrafo_bipartito_completo
34 Ejemplos de grafos 59
La funcioacuten (conjuntosVerticesDisjuntos g) devuelve Nothing si el grafo g no esbipartito y Just(xsys) si lo es donde xs ys es una particioacuten disjunta de los veacuterticesde g
-- | Ejemplo
-- gtgtgt conjuntosVerticesDisjuntos (bipartitoCompleto 3 4)
-- Just ([321][7654])
-- gtgtgt conjuntosVerticesDisjuntos (grafoCiclo 5)
-- Nothing
-- gtgtgt conjuntosVerticesDisjuntos (grafoCiclo 6)
-- Just ([531][642])
conjuntosVerticesDisjuntos Ord a =gt Grafo a -gt Maybe ([a][a])
conjuntosVerticesDisjuntos g
| null (vertices g) = Just ([][])
| otherwise = aux (vertices g) [] [] [] []
where u = union
a = adyacentes g
d xs x = xs [x]
aux [] _ _ r b = if (null (intersect r b))
then (Just (rb))
else Nothing
aux (vvs) [] [] [] [] = aux vs (a v) [v] [v] []
aux (vvs) [] c r b
| null (a v) = aux vs [] (vc) (vr) b
| null ((a v) c) =
if (or [elem u r | u lt- (a v)])
then (if (or [elem u b | u lt- (a v)])
then Nothing
else (aux vs [] (vc) r (vb)))
else (aux vs [] (vc) (vr) b)
| otherwise =
if (or [elem u r | u lt- (a v)])
then (if (or [elem u b | u lt- (a v)])
then Nothing
else (aux vs ((a v) c) (vc) r (vb)))
else (aux vs ((a v) c) (vc) (vr) b)
aux vs (qqs) c r b
| null ((a q) c) =
if (or [elem u r | u lt- (a q)])
then (if (or [elem u b | u lt- (a q)])
then Nothing
else (aux (d vs q) qs (qc) r (qb)))
else (aux (d vs q) qs (qc) (qr) b)
| otherwise =
if (or [elem u r | u lt- (a q)])
then (if (or [elem u b | u lt- (a q)])
then Nothing
else (aux (d vs q) (u ((a q) c) qs)
60 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
(qc) r (qb)))
else (aux (d vs q) (u ((a q) c) qs)
(qc) (qr) b)
La funcioacuten (esBipartito g) se verifica si el grafo g es bipartito
-- | Ejemplo
-- gtgtgt esBipartito (bipartitoCompleto 3 4)
-- True
-- gtgtgt esBipartito (grafoCiclo 5)
-- False
-- gtgtgt esBipartito (grafoCiclo 6)
-- True
esBipartito Ord a =gt Grafo a -gt Bool
esBipartito g = isJust (conjuntosVerticesDisjuntos g)
346 Grafo estrella
Definicioacuten 346 Una estrella 8 de orden n es el grafo bipartito completo K1n Denota-remos a una estrella de orden n por Sn Una estrella con 3 aristas se conoce en ingleacutes comoclaw (garra o garfio)
La funcioacuten (grafoEstrella n) crea un grafo circulante a partir de su orden n
2
34
56
1
-- | Ejemplo
-- gtgtgt grafoEstrella 5
-- G [123456] [(12)(13)(14)(15)(16)]
grafoEstrella Int -gt Grafo Int
grafoEstrella = bipartitoCompleto 1
347 Grafo rueda
Definicioacuten 347 Un grafo rueda 9 de orden n es un grafo no dirigido y no ponderado conn veacutertices que se forma conectando un uacutenico veacutertice a todos los veacutertices de un ciclo Cnminus1 Lodenotaremos por Wn8httpsenwikipediaorgwikiStar_(graph_theory))9httpseswikipediaorgwikiGrafo_rueda
34 Ejemplos de grafos 61
La funcioacuten (grafoRueda n) crea un grafo rueda a partir de su orden n
2
34
56
1
-- | Ejemplo
-- gtgtgt pp $ grafoRueda 6
-- G [123456]
-- [(1 2)(1 3)(1 4)(1 5)(1 6)(2 3)(2 6)
-- (3 4)(4 5)(5 6)]
grafoRueda Int -gt Grafo Int
grafoRueda n =
creaGrafo [1n]
([(1a) | a lt- [2n]] ++
[(ab) | (ab) lt- zip (2[2n-1]) (3n[4n])])
348 Grafo circulante
Definicioacuten 348 Un grafo circulante 10 de orden n ge 3 y saltos s1 sk es un grafono dirigido y no ponderado G = (1 n A) en el que cada nodo foralli isin V es adyacente alos 2k nodos iplusmn s1 iplusmn sk mod n Lo denotaremos por Cirs1sk
n
La funcioacuten (grafoCirculante n ss) crea un grafo circulante a partir de su orden n
y de la lista de sus saltos ss Por ejemplo
2
34
5
6 1
-- | Ejemplo
-- gtgtgt pp $ grafoCirculante 6 [12]
-- G [123456]
-- [(1 2)(1 3)(1 5)(1 6)(2 3)(2 4)(2 6)
-- (3 4)(3 5)(4 5)(4 6)(5 6)]
grafoCirculante Int -gt [Int] -gt Grafo Int
grafoCirculante n ss =
10httpsenwikipediaorgwikiCirculant_graph
62 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
creaGrafo [1n]
[(ab) | a lt- [1n]
b lt- sort (auxCir a ss n)
a lt b]
where auxCir v ss1 k =
concat [[fun (v+s) k fun (v-s) k] | s lt- ss1]
fun a b = if mod a b == 0 then b else mod a b
349 Grafo de Petersen generalizado
El grafo de Petersen generalizado 11 que denotaremos GPnk (con n ge 3 y 1 le k le(nminus 1)2) es un grafo formado por un grafo circulante Cirn
k en el interior rodeadopor un ciclo Cn al que estaacute conectado por una arista saliendo de cada veacutertice deforma que se creen n poliacutegonos regulares El grafo GPnk tiene 2n veacutertices y 3n aristasLa funcioacuten (grafoPetersenGen n k) devuelve el grafo de Petersen generalizadoGPnk
1
2
3
4
5
6
7
8
-- | Ejemplo
-- gtgtgt pp $ grafoPetersenGen 4 2
-- G [12345678]
-- [(1 3)(1 5)(2 4)(2 6)(3 7)(4 8)(5 6)
-- (5 8)(6 7)(7 8)]
grafoPetersenGen Int -gt Int -gt Grafo Int
grafoPetersenGen n k =
creaGrafo [12n]
(filter p (aristas (grafoCirculante n [k])) ++
[(xx+n) | x lt- [1n]] ++
(n+1n+2) (n+12n) [(xx+1) | x lt- [n+22n-1]])
where p (ab) = a lt b
11httpsenwikipediaorgwikiGeneralized_Petersen_graph
34 Ejemplos de grafos 63
3410 Otros grafos importantes
Grafo de Thomson
Definicioacuten 349 El grafo bipartito completo K33 es conocido como el grafo de Thomsony como veremos maacutes adelante seraacute clave a la hora de analizar propiedades topoloacutegicas de losgrafos
1 2 3
4 5 6
La funcioacuten (grafoThomson) genera el grafo de Thomson
-- | Ejemplo
-- gtgtgt pp $ grafoThomson
-- G [123456]
-- [(1 4)(1 5)(1 6)(2 4)(2 5)(2 6)(3 4)
-- (3 5)(3 6)]
grafoThomson Grafo Int
grafoThomson = bipartitoCompleto 3 3
Grafo de Heawood
El grafo de Heawood 12 es un grafo no dirigido regular con 14 veacutertices y 21 aris-tas Todos sus veacutertices son incidentes a exactamente 3 aristas es decir es un grafocuacutebico Tiene importantes propiedades geomeacutetricas y topoloacutegicas
1
2
3
45
6
7
8
9
10
11 12
13
14
12httpsenwikipediaorgwikiHeawood_graph
64 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten grafoHeawood genera el grafo de Heawood
-- | Ejemplo
-- gtgtgt pp $ grafoHeawood
-- G [1234567891011121314]
-- [(1 2)(1 6)(1 14)(2 3)(2 11)(3 4)(3 8)
-- (4 5)(4 13)(5 6)(5 10)(6 7)(7 8)(7 12)
-- (8 9)(9 10)(9 14)(10 11)(11 12)(12 13)
-- (13 14)]
grafoHeawood Grafo Int
grafoHeawood =
creaGrafo [114]
(aristas (grafoCiclo 14) ++
zip [1 23 4 5 7 9]
[611813101214])
Grafo de McGee
El grafo de McGee 13 es un grafo no dirigido cuacutebico con 24 veacutertices y 36 aristasTiene importantes propiedades geomeacutetricas y topoloacutegicas
1
2
3
45
6789
10
11
12
13
14
15
1617
18 19 2021
22
23
24
La funcioacuten grafoMcGee genera el grafo de McGee
-- | Ejemplo
-- gtgtgt pp $ grafoMcGee
-- G [12345678910111213141516171819
-- 2021222324]
-- [(1 2)(1 13)(1 24)(2 3)(2 9)(3 4)(3 20)
13httpsenwikipediaorgwikiMcGee_graph
34 Ejemplos de grafos 65
-- (4 5)(4 16)(5 6)(5 12)(6 7)(6 23)(7 8)
-- (7 19)(8 9)(8 15)(9 10)(10 11)(10 22)
-- (11 12)(11 18)(12 13)(13 14)(14 15)
-- (14 21)(15 16)(16 17)(17 18)(17 24)
-- (18 19)(19 20)(20 21)(21 22)(22 23)
-- (23 24)]
grafoMcGee Grafo Int
grafoMcGee =
creaGrafo [124]
(aristas (grafoCiclo 24) ++
zip [ 12 3 4 5 6 7 810111417]
[13920161223191522182124])
Grafo TuttendashCoxeter
El grafo TuttendashCoxeter 14 es un grafo no dirigido cuacutebico con 30 veacutertices y 45 aristasTiene importantes propiedades geomeacutetricas y topoloacutegicas
1
2
3
4
56
7891011
12
13
14
15
16
17
18
19
2021
22 23 24 2526
27
28
29
30
La funcioacuten grafoTutteCoxeter genera el grafo TuttendashCoxeter
-- | Ejemplo
-- gtgtgt pp $ grafoTutteCoxeter
-- G [12345678910111213141516171819
-- 2021222324252627282930]
14httpsenwikipediaorgwikiTutteT1textendashCoxeter_graph
66 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- [(1 2)(1 18)(1 30)(2 3)(2 23)(3 4)
-- (3 10)(4 5)(4 27)(5 6)(5 14)(6 7)(6 19)
-- (7 8)(7 24)(8 9)(8 29)(9 10)(9 16)
-- (10 11)(11 12)(11 20)(12 13)(12 25)
-- (13 14)(13 30)(14 15)(15 16)(15 22)
-- (16 17)(17 18)(17 26)(18 19)(19 20)
-- (20 21)(21 22)(21 28)(22 23)(23 24)
-- (24 25)(25 26)(26 27)(27 28)(28 29)
-- (29 30)]
grafoTutteCoxeter Grafo Int
grafoTutteCoxeter =
creaGrafo [130]
(aristas (grafoCiclo 30) ++
zip [ 1 2 3 4 5 6 7 8 9111213151721]
[182310271419242916202530222628])
Grafo de Petersen
El grafo de Petersen 15 se define como el grafo de Petersen generalizado GP52 esdecir es un grafo cuacutebico formado por los veacutertices de un pentaacutegono conectados alos veacutertices de una estrella de cinco puntas en la que cada nodo es adyacente a losnodos que estaacuten a un salto 2 de eacutel Es usado como ejemplo y como contraejemplo enmuchos problemas de la Teoriacutea de grafos
6
7
8 9
101
2
3 4
5
La funcioacuten grafoPetersen devuelve el grafo de Petersen
-- | Ejemplo
-- gtgtgt pp $ grafoPetersen
-- G [12345678910]
-- [(1 3)(1 4)(1 6)(2 4)(2 5)(2 7)(3 5)
-- (3 8)(4 9)(5 10)(6 7)(6 10)(7 8)(8 9)
-- (9 10)]
grafoPetersen Grafo Int
grafoPetersen = grafoPetersenGen 5 2
15httpsenwikipediaorgwikiPetersen_graph
35 Definiciones y propiedades 67
Grafo de MoeumlbiusndashCantor
El grafo de MoeumlbiusndashCantor 16 se define como el grafo de Petersen generalizadoGP83 es decir es un grafo cuacutebico formado por los veacutertices de un octoacutegono conecta-dos a los veacutertices de una estrella de ocho puntas en la que cada nodo es adyacente alos nodos que estaacuten a un salto 3 de eacutel Al igual que el grafo de Petersen tiene impor-tantes propiedades que lo hacen ser ejemplo y contraejemplo de muchos problemasde la Teoriacutea de Grafos
9
10
11
12
13
14
15
16
1
23
4
5
67
8
La funcioacuten grafoMoebiusCantor genera el grafo de MoeumlbiusndashCantor
-- | Ejemplo
-- gtgtgt pp $ grafoMoebiusCantor
-- G [12345678910111213141516]
-- [(1 4)(1 6)(1 9)(2 5)(2 7)(2 10)(3 6)
-- (3 8)(3 11)(4 7)(4 12)(5 8)(5 13)(6 14)
-- (7 15)(8 16)(9 10)(9 16)(10 11)(11 12)
-- (12 13)(13 14)(14 15)(15 16)]
grafoMoebiusCantor Grafo Int
grafoMoebiusCantor = grafoPetersenGen 8 3
35 Definiciones y propiedades
Una vez construida una pequentildea fuente de ejemplos estamos en condiciones deimplementar las definiciones sobre grafos en Haskell y ver que funcionan correc-tamente Ademaacutes comprobaremos que se cumplen las propiedades baacutesicas que sehan presentado en el tema Introduccioacuten a la teoriacutea de grafos de ldquoMatemaacutetica discretardquo([4])
16httpsenwikipediaorgwikiMoeumlbius-Kantor_graph
68 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Nota 351 Se utilizaraacute el tipo abstracto de grafos presentados en la seccioacuten 32 y seutilizaraacuten las librerias DataList y TestQuickCheck
351 Definiciones de grafos
Definicioacuten 351 El orden de un grafo G = (V A) se define como su nuacutemero de veacuterticesLo denotaremos por |V(G)|
La funcioacuten (orden g) devuelve el orden del grafo g
-- | Ejemplos
-- gtgtgt orden (grafoCiclo 4)
-- 4
-- gtgtgt orden (grafoEstrella 4)
-- 5
orden Grafo a -gt Int
orden = length vertices
Definicioacuten 352 El tamantildeo de un grafo G = (V A) se define como su nuacutemero de aristasLo denotaremos por |A(G)|
La funcioacuten (tamantildeo g) devuelve el orden del grafo g
-- | Ejemplos
-- gtgtgt tamantildeo (grafoCiclo 4)
-- 4
-- gtgtgt tamantildeo grafoPetersen
-- 15
tamantildeo Grafo a -gt Int
tamantildeo = length aristas
Definicioacuten 353 Diremos que dos aristas a aprime son incidentes si tienen interseccioacuten novaciacutea es decir si tienen alguacuten veacutertice en comuacuten
La funcioacuten (sonIncidentes a a) se verifica si las aristas a y a son incidentes
-- | Ejemplos
-- gtgtgt sonIncidentes (12) (24)
-- True
-- gtgtgt sonIncidentes (12) (34)
-- False
sonIncidentes Eq a =gt (aa) -gt (aa) -gt Bool
sonIncidentes (u1u2) (v1v2) =
or [u1 == v1 u1 == v2 u2 == v1 u2 == v2]
Definicioacuten 354 Diremos que una arista de un grafo G es un lazo si va de un veacutertice ensiacute mismo
35 Definiciones y propiedades 69
La funcioacuten (lazos g) devuelve los lazos del grafo g
-- | Ejemplos
-- gtgtgt lazos (creaGrafo [12] [(11)(12)(22)])
-- [(11)(22)]
-- gtgtgt lazos (grafoCiclo 5)
-- []
lazos Eq a =gt Grafo a -gt [(aa)]
lazos g = [(uv) | (uv) lt- aristas g u == v]
La funcioacuten (esLazo a) se verifica si la arista a es un lazo
-- | Ejemplos
-- gtgtgt esLazo (44)
-- True
-- gtgtgt esLazo (12)
-- False
esLazo Eq a =gt (aa) -gt Bool
esLazo (uv) = u == v
Definicioacuten 355 Dado un grafo G = (V A) fijado un veacutertice v isin V al conjunto deveacutertices que son adyacentes a v lo llamaremos entorno de v y lo denotaremos por N(v) =u isin V|(u v) isin A
La funcioacuten (entorno g v) devuelve el entorno del veacutertice v en el grafo g
-- | Ejemplo
-- gtgtgt entorno (creaGrafo [15] [(12)(13)(23)]) 2
-- [13]
entorno Eq a =gt Grafo a -gt a -gt [a]
entorno = adyacentes
Definicioacuten 356 Sea G = (V A) un grafo El grado (o valencia) de v isin V es grad(v) =|N(v)|
La funcioacuten (grado g v) devuelve el grado del veacutertice v en el grafo g
-- | Ejemplos
-- gtgtgt grado (creaGrafo [15] [(12)(13)(23)]) 2
-- 2
-- gtgtgt grado (grafoEstrella 5) 1
-- 5
grado Eq a =gt Grafo a -gt a -gt Int
grado g v = length (entorno g v)
Definicioacuten 357 Un veacutertice v de un grafo es aislado si su grado es 0
La funcioacuten (esAislado g v) se verifica si el veacutertice v es aislado en el grafo g
70 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- | Ejemplos
-- gtgtgt esAislado (creaGrafo [15] [(12)(13)(23)]) 4
-- True
-- gtgtgt esAislado (creaGrafo [15] [(12)(13)(23)]) 3
-- False
esAislado Eq a =gt Grafo a -gt a -gt Bool
esAislado g v = grado g v == 0
Definicioacuten 358 Un grafo es regular si todos sus veacutertices tienen el mismo grado
La funcioacuten (esRegular g) se verifica si el grafo g es regular
-- | Ejemplos
-- gtgtgt esRegular (creaGrafo [13] [(12)(13)(23)])
-- True
-- gtgtgt esRegular (creaGrafo [14] [(12)(13)(24)])
-- False
esRegular Eq a =gt Grafo a -gt Bool
esRegular g = all (==x) xs
where (xxs) = [grado g v | v lt- vertices g]
Definicioacuten 359 Dado un grafo G = (V A) llamamos valencia miacutenima o grado miacuteni-mo de G al valor δ(G) = mıngrad(v)|v isin V
La funcioacuten (valenciaMin g) devuelve la valencia miacutenima del grafo g
-- | Ejemplo
-- gtgtgt valenciaMin (creaGrafo [14] [(12)(13)(24)])
-- 1
valenciaMin Ord a =gt Grafo a -gt Int
valenciaMin g = minimum [grado g v | v lt- vertices g]
Definicioacuten 3510 Dado un grafo G = (V A) llamamos valencia maacutexima o gradomaacuteximo de G al valor δ(G) = maxgrad(v)|v isin V
La funcioacuten (valenciaMax g) devuelve la valencia maacutexima del grafo g
-- | Ejemplo
-- gtgtgt valenciaMax (creaGrafo [14] [(12)(13)(24)])
-- 2
valenciaMax Ord a =gt Grafo a -gt Int
valenciaMax g = maximum [grado g v | v lt- vertices g]
Definicioacuten 3511 Se dice que un grafo es simple si no contiene lazos ni aristas repetidas
La funcioacuten (esSimple g) se verifica si g es un grafo simple
35 Definiciones y propiedades 71
-- | Ejemplos
-- gtgtgt esSimple (creaGrafo [13] [(12)(13)(23)])
-- True
-- gtgtgt esSimple (creaGrafo [13] [(11)(12)(23)])
-- False
esSimple Ord a =gt Grafo a -gt Bool
esSimple g =
and [not ((xx) `aristaEn` g) | x lt- vertices g]
Definicioacuten 3512 Sea G un grafo Llamamos secuencia de grados de G a la lista degrados de sus veacutertices La secuencia se suele presentar en orden decreciente d1 ge d2 gemiddot middot middot ge dn
La funcioacuten (secuenciaGrados g) devuelve la secuencia de los grados del grafo g enorden decreciente
-- | Ejemplo
-- gtgtgt secuenciaGrados (creaGrafo [15] [(12)(13)(14)(24)])
-- [32210]
secuenciaGrados Eq a =gt Grafo a -gt [Int]
secuenciaGrados g = sortBy (flip compare) [grado g v | v lt- vertices g]
Nota 352 iquestQueacute listas de n nuacutemeros enteros son secuencias de grafos de n veacuterticesbull Si sumn
i=1 di es impar no hay ningunobull Si sumn
i=1 di es par entonces siempre hay un grafo con esa secuencia de grados (aun-que no necesariamente simple)
Definicioacuten 3513 Una secuencia graacutefica es una lista de nuacutemero enteros no negativos quees la secuencia de grados para alguacuten grafo simple
La funcioacuten (secuenciaGrafica ss) se verifica si existe alguacuten grafo con la secuenciade grados ss
-- | Ejemplos
-- gtgtgt secuenciaGrafica [32210]
-- True
-- gtgtgt secuenciaGrafica [3222]
-- False
secuenciaGrafica [Int] -gt Bool
secuenciaGrafica ss = even (sum ss) ampamp all p ss
where p s = s gt= 0 ampamp s lt= length ss
Definicioacuten 3514 Dado un grafo G = (V A) diremos que Gprime = (Vprime Aprime) es un subgrafode G si Vprime sube V y Aprime sube A
72 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (esSubgrafo g g) se verifica si g es un subgrafo de g
-- |Ejemplos
-- gtgtgt esSubgrafo (bipartitoCompleto 3 2) (bipartitoCompleto 3 3)
-- True
-- gtgtgt esSubgrafo (grafoEstrella 4) (grafoEstrella 5)
-- True
-- gtgtgt esSubgrafo (completo 5) (completo 4)
-- False
-- gtgtgt esSubgrafo (completo 3) (completo 4)
-- True
esSubgrafo Ord a =gt Grafo a -gt Grafo a -gt Bool
esSubgrafo g g =
vertices g `esSubconjunto` vertices g ampamp
aristas g `esSubconjunto` aristas g
Definicioacuten 3515 Si Gprime = (Vprime Aprime) es un subgrafo de G = (V A) tal que Vprime = Vdiremos que Gprime es un subgrafo maximal grafo recubridor o grafo de expansioacuten (eningleacutes spanning grah) de G
La funcioacuten (esSubgrafoMax g g) se verifica si g es un subgrafo maximal de g
-- | Ejemplos
-- gtgtgt esSubgrafoMax (grafoRueda 3) (grafoRueda 4)
-- False
-- gtgtgt esSubgrafoMax (grafoCiclo 4) (grafoRueda 4)
-- True
-- gtgtgt esSubgrafoMax (creaGrafo [13] [(12)]) (grafoCiclo 3)
-- True
-- gtgtgt esSubgrafoMax (creaGrafo [12] [(12)]) (grafoCiclo 3)
-- False
esSubgrafoMax Ord a =gt Grafo a -gt Grafo a -gt Bool
esSubgrafoMax g g =
g `esSubgrafo` g ampamp conjuntosIguales (vertices g) (vertices g)
Definicioacuten 3516 Sean Gprime = (Vprime Aprime) G = (V A) dos grafos si Vprime sub V o Aprime sub A sedice que Gprime es un subgrafo propio de G y se denota por Gprime sub G
La funcioacuten (esSubgrafoPropio g g) se verifica si g es un subgrafo propio de g
-- | Ejemplos
-- gtgtgt esSubgrafoPropio (grafoRueda 3) (grafoRueda 4)
-- True
-- gtgtgt esSubgrafoPropio (grafoRueda 4) (grafoCiclo 5)
-- False
-- gtgtgt esSubgrafoPropio (creaGrafo [13] [(12)]) (grafoCiclo 3)
-- True
-- gtgtgt esSubgrafoPropio (creaGrafo [12] [(12)]) (grafoCiclo 3)
35 Definiciones y propiedades 73
-- True
esSubgrafoPropio Ord a =gt Grafo a -gt Grafo a -gt Bool
esSubgrafoPropio g g =
esSubgrafo g g ampamp
(not (conjuntosIguales (vertices g) (vertices g)) ||
not (conjuntosIguales (aristas g) (aristas g)))
352 Propiedades de grafos
Teorema 3517 (Lema del apretoacuten de manos) En todo grafo simple el nuacutemero de veacuterticesde grado impar es par o cero
Vamos a comprobar que se verifica el lema del apretoacuten de manos utilizando la fun-cioacuten prop_LemaApretonDeManos
ghcigt quickCheck prop_LemaApretonDeManos
+++ OK passed 100 tests
prop_LemaApretonDeManos Grafo Int -gt Bool
prop_LemaApretonDeManos g =
even (length (filter odd [grado g v | v lt- vertices g]))
where g = creaGrafo (vertices g)
[(xy) | (xy) lt- aristas g x = y]
Teorema 3518 (HavelndashHakimi) Si n gt 1 y D = [d1 dn] es una lista de enterosentonces D es secuencia graacutefica si y soacutelo si la secuencia Dprime obtenida borrando el mayorelemento dmax y restando 1 a los siguientes dmax elementos maacutes grandes es graacutefica
Vamos a comprobar que se verifica el teorema de HavelndashHakimi utilizando la fun-cioacuten prop_HavelHakimi
ghcigt quickCheck prop_HavelHakimi
+++ OK passed 100 tests
prop_HavelHakimi [Int] -gt Bool
prop_HavelHakimi [] = True
prop_HavelHakimi (sss) =
not (secuenciaGrafica (sss) ampamp not (esVacio ss)) ||
secuenciaGrafica (map (x -gt x-1) (take s ss) ++ drop s ss)
353 Operaciones y propiedades sobre grafos
Eliminacioacuten de una arista
Definicioacuten 3519 Sea G = (V A) un grafo y sea (u v) isin A Definimos el grafo G (u v) como el subgrafo de G Gprime = (Vprime Aprime) con Vprime = V y Aprime = A (u v) Esta
74 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
operacioacuten se denomina eliminar una arista
La funcioacuten (eliminaArista g a) elimina la arista a del grafo g
-- | Ejemplos
-- gtgtgt eliminaArista (creaGrafo [14] [(12)(14)(24)]) (14)
-- G [1234] [(12)(24)]
-- gtgtgt eliminaArista (creaGrafo [14] [(12)(14)(24)]) (41)
-- G [1234] [(12)(24)]
-- gtgtgt eliminaArista (creaGrafo [14] [(12)(14)(24)]) (43)
-- G [1234] [(12)(14)(24)]
eliminaArista Ord a =gt Grafo a -gt (aa) -gt Grafo a
eliminaArista g (ab) =
creaGrafo (vertices g)
(aristas g [(ab)(ba)])
La funcioacuten (eliminaLazos g) devuelve un nuevo grafo obtenido a partir del grafog eliminando todas las aristas que fueran lazos
-- | Ejemplos
-- gtgtgt eliminaLazos (creaGrafo [12] [(11)(12)(22)])
-- G [12] [(12)]
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
-- gtgtgt eliminaLazos (grafoCiclo 5)
-- G [12345] [(12)(15)(23)(34)(45)]
eliminaLazos Ord a =gt Grafo a -gt Grafo a
eliminaLazos g = creaGrafo (vertices g)
[(xy) | (xy) lt- aristas g x = y]
Eliminacioacuten un veacutertice
Definicioacuten 3520 Sea G = (V A) un grafo y sea v isin V Definimos el grafo G v como elsubgrafo de G Gprime = (Vprime Aprime) con Vprime = V v y Aprime = A a isin A|v es un extremo de aEsta operacioacuten se denomina eliminar un veacutertice
La funcioacuten (eliminaVertice g v) elimina el veacutertice v del grafo g
-- | Ejemplos
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(24)]) 1
-- G [234] [(24)]
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(24)]) 4
-- G [123] [(12)]
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(24)]) 3
-- G [124] [(12)(14)(24)]
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(13)]) 1
-- G [234] []
eliminaVertice Ord a =gt Grafo a -gt a -gt Grafo a
35 Definiciones y propiedades 75
eliminaVertice g v =
creaGrafo (vertices g [v])
(as [(ab) | (ab) lt- as a == v || b == v])
where as = aristas g
Suma de aristas
Definicioacuten 3521 Sea G = (V A) un grafo y sean u v isin V tales que (u v) (v u) 6isin ADefinimos el grafo G + (u v) como el grafo Gprime = (V A cup (u v)) Esta operacioacuten sedenomina suma de una arista
La funcioacuten (sumaArista g a) suma la arista a al grafo g
-- | Ejemplos
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
-- gtgtgt sumaArista (grafoCiclo 5) (13)
-- G [12345] [(12)(13)(15)(23)(34)(45)]
sumaArista Ord a =gt Grafo a -gt (aa) -gt Grafo a
sumaArista g a =
creaGrafo (vertices g) (a aristas g)
Suma de veacutertices
Definicioacuten 3522 Sea G = (V A) un grafo y sea v 6isin V Definimos el grafo G + v comoel grafo Gprime = (Vprime Aprime) donde Vprime = V cup v Aprime = Acup (u v)|u isin V Esta operacioacuten sedenomina suma de un veacutertice
La funcioacuten (sumaVertice g a) suma el veacutertice a al grafo g
-- | Ejemplo
-- gtgtgt grafoCiclo 3
-- G [123] [(12)(13)(23)]
-- gtgtgt sumaVertice (grafoCiclo 3) 4
-- G [1234] [(12)(13)(14)(23)(24)(34)]
sumaVertice Ord a =gt Grafo a -gt a -gt Grafo a
sumaVertice g v =
creaGrafo (v vs) (aristas g ++ [(uv) | u lt- vs])
where vs = vertices g
Propiedad de los grafos completos
Proposicioacuten 3523 La familia de grafos completos Kn verifica que Kn = Knminus1 + n
Vamos a ver que se cumple la propiedad utilizando la funcioacuten prop_completos
76 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
ghcigt quickCheck prop_completos
+++ OK passed 100 tests
prop_completos Int -gt Property
prop_completos n = n gt= 2 ==gt
completo n == sumaVertice (completo (n-1)) n
A partir de esta propiedad se puede dar una definicioacuten alternativa de la funcioacuten(completo n) que devuelve el grafo completo Kn La nueva funcioacuten seraacute (completo2n)
completo2 Int -gt Grafo Int
completo2 0 = grafoNulo
completo2 n = sumaVertice (completo2 (n-1)) n
Vamos a comprobar la equivalencia de ambas deficiones
ghcigt prop_EquiCompleto
True
prop_EquiCompleto Bool
prop_EquiCompleto = and [completo n == completo2 n | n lt- [050]]
Vamos a ver cuaacutel de las definiciones es maacutes eficiente
ghcigt tamantildeo (completo 100)
4950
(117 secs 0 bytes)
ghcigt tamantildeo (completo2 100)
4950
(1549 secs 61756056 bytes)
La funcioacuten (completo n) es maacutes eficiente asiacute que seraacute la que seguiremos utilizando
Suma de grafos
Definicioacuten 3524 Sean G = (V A) Gprime = (Vprime A) dos grafos Definimos el grafo sumade G y Gprime como el grafo G + Gprime = (V cup Vprime A cup Aprime cup (u v)|u isin V v isin Vprime) Estaoperacioacuten se denomina suma de grafos
La funcioacuten (sumaGrafos g g) suma los grafos g y g
-- | Ejemplo
-- gtgtgt let g1 = creaGrafo [13] [(11)(13)(23)]
-- gtgtgt let g2 = creaGrafo [46] [(46)(56)]
-- gtgtgt pp $ sumaGrafos g1 g2
-- G [123456]
-- [(1 1)(1 3)(1 4)(1 5)(1 6)(2 3)(2 4)
-- (2 5)(2 6)(3 4)(3 5)(3 6)(4 6)(5 6)]
sumaGrafos Ord a =gt Grafo a -gt Grafo a -gt Grafo a
35 Definiciones y propiedades 77
sumaGrafos g1 g2 =
creaGrafo (vs1 `union` vs2)
(aristas g1 `union`
aristas g2 `union`
[(uv) | u lt- vs1 v lt- vs2])
where vs1 = vertices g1
vs2 = vertices g2
Unioacuten de grafos
Definicioacuten 3525 Sean G = (V A) Gprime = (Vprime A) dos grafos Definimos el grafo unioacutende G y Gprime como el grafo G cup H = (V cupVprime A cup Aprime) Esta operacioacuten se denomina unioacuten degrafos
La funcioacuten (unionGrafos g g) une los grafos g y g Por ejemplo
-- | Ejemplo
-- gtgtgt let g1 = creaGrafo [13] [(11)(13)(23)]
-- gtgtgt let g2 = creaGrafo [46] [(46)(56)]
-- gtgtgt unionGrafos g1 g2
-- G [123456] [(11)(13)(23)(46)(56)]
unionGrafos Ord a =gt Grafo a -gt Grafo a -gt Grafo a
unionGrafos g1 g2 =
creaGrafo (vertices g1 `union` vertices g2)
(aristas g1 `union` aristas g2)
Grafo complementario
Definicioacuten 3526 Dado un grafo G = (V A) se define el grafo complementario de Gcomo G = (V A) donde A = (u v)|u v isin V (u v) 6isin A
La funcioacuten (grafoComplementario g) devuelve el grafo complementario de g
-- | Ejemplo
-- gtgtgt grafoComplementario (creaGrafo [13] [(11)(13)(23)])
-- G [123] [(12)(22)(33)]
grafoComplementario Ord a =gt Grafo a -gt Grafo a
grafoComplementario g =
creaGrafo vs
[(uv)| u lt- vs v lt- vs u lt= v not ((uv) `aristaEn` g)]
where vs = vertices g
Definicioacuten 3527 Dado un grafo diremos que es completo si su complementario sin lazosno tiene aristas
La funcioacuten (esCompleto g) se verifica si el grafo g es completo
78 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- Ejemplos
-- gtgtgt esCompleto (completo 4)
-- True
-- gtgtgt esCompleto (grafoCiclo 5)
-- False
esCompleto Ord a =gt Grafo a -gt Bool
esCompleto g =
tamantildeo (eliminaLazos (grafoComplementario g)) == 0
36 Morfismos de grafos
Llegados a este punto es importante resaltar que un grafo se define como una en-tidad matemaacutetica abstracta es evidente que lo importante de un grafo no son losnombres de sus veacutertices ni su representacioacuten graacutefica La propiedad que caracterizaa un grafo es la forma en que sus veacutertices estaacuten unidos por las aristasA priori los siguientes grafos pueden parecer distintos
a
bc
de
1
23
45
Sin embargo ambos grafos son grafos de cinco veacutertices que tienen las mismas rela-ciones de vecindad entre sus nodos En esta seccioacuten estudiaremos estas relacionesque establecen las aristas entre los veacutertices de un grafo y presentaremos algoritmosque nos permitan identificar cuaacutendo dos grafos se pueden relacionar mediante apli-caciones entre sus veacutertices cumpliendo ciertas caracteriacutesicas
361 Morfismos
Definicioacuten 361 Si f es una funcioacuten entre dos grafos G = (V A) y Gprime = (Vprime Aprime)diremos que conserva la adyacencia si forallu v isin V se verifica que si (u v) isin A entonces( f (u) f (v)) isin Aprime
La funcioacuten (conservaAdyacencia g h f) se verifica si la funcioacuten f entre los grafosg y h conserva las adyacencias
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [14] [(12)(23)(34)]
-- gtgtgt let g2 = creaGrafo [14] [(12)(23)(24)]
-- gtgtgt let g3 = creaGrafo [4610] [(48)(68)(810)]
36 Morfismos de grafos 79
-- gtgtgt conservaAdyacencia g1 g3 [(14)(26)(38)(410)]
-- False
-- gtgtgt conservaAdyacencia g2 g3 [(14)(28)(36)(410)]
-- True
conservaAdyacencia (Ord a Ord b) =gt
Grafo a -gt Grafo b -gt Funcion a b -gt Bool
conservaAdyacencia g h f =
and [(imagen f ximagen f y) `aristaEn` h | (xy) lt- aristas g]
Definicioacuten 362 Dados dos grafos simples G = (V A) y Gprime = (Vprime Aprime) un morfismoentre G y Gprime es una funcioacuten φ V rarr Vprime que conserva las adyacencias
La funcioacuten (esMorfismo g h vvs) se verifica si la funcioacuten representada por vvs esun morfismo entre los grafos g y h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(12)(32)]
-- gtgtgt let g2 = creaGrafo [456] [(46)(56)]
-- gtgtgt esMorfismo g1 g2 [(14)(26)(35)]
-- True
-- gtgtgt esMorfismo g1 g2 [(14)(25)(36)]
-- False
-- gtgtgt esMorfismo g1 g2 [(14)(26)(35)(79)]
-- False
esMorfismo (Ord aOrd b) =gt Grafo a -gt Grafo b -gt
Funcion a b -gt Bool
esMorfismo g1 g2 f =
esFuncion (vertices g1) (vertices g2) f ampamp
conservaAdyacencia g1 g2 f
La funcioacuten (morfismos g h) devuelve todos los posibles morfismos entre los grafosg y h
-- | Ejemplos
-- gtgtgt grafoCiclo 3
-- G [123] [(12)(13)(23)]
-- gtgtgt let g = creaGrafo [46] [(44)(66)]
-- gtgtgt morfismos (grafoCiclo 3) g
-- [[(14)(24)(34)][(16)(26)(36)]]
-- gtgtgt morfismos g (grafoCiclo 3)
-- []
morfismos (Ord a Ord b) =gt Grafo a -gt Grafo b -gt [[(ab)]]
morfismos g h =
[f | f lt- funciones (vertices g) (vertices h)
conservaAdyacencia g h f]
80 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
362 Complejidad del problema de homomorfismo de grafos
En general en computacioacuten un problema algoriacutetmico consta de un conjunto I detodas las posibles entradas para el problema llamado el conjunto de instancias y deuna pregunta Q sobre esas instancias Resolver uno de estos problemas consiste endesarrollar un algoritmo cuya entrada es una instancia del problema y cuya salidaes una respuesta a la pregunta del problemaDecimos que un problema es de decisioacuten cuando las posibles respuestas a la pre-gunta son ldquosiacuterdquo o ldquonordquo Un ejemplo de problema de este tipo seriacutea dados dos grafosdecidir si estos son homomorfos o noA la hora de implementar un algoritmo que deacute solucioacuten al problema que estemosconsiderando es importante tener en cuenta el nuacutemero de pasos que efectuacutea hastaencontrar una respuesta Un algoritmo de tiempo polinomial se define como aquelcon funcioacuten de complejidad temporal en O(p(n)) para alguna funcioacuten polinoacutemicap donde n denota el tamantildeo de la entrada Cualquier algoritmo cuya funcioacuten decomplejidad temporal no pueda ser acotada de esta manera se denomina algoritmode tiempo exponencialLa mayoriacutea de los algoritmos de tiempo exponencial son simples variaciones de unabuacutesqueda exhaustiva mientras que los algoritmos de tiempo polinomial usualmen-te se obtienen mediante un anaacutelisis maacutes profundo de la estructura del problema Enla Teoriacutea de la complejidad computacional existe el consenso de que un problemano estaacute ldquobien resueltordquo hasta que se conozca un algoritmo de tiempo polinomialque lo resuelva Por tanto nos referiremos a un problema como ldquointratablerdquo si estan difiacutecil que no existe algoritmo de tiempo polinomial capaz de resolverloLos problemas de decisioacuten para los que existen algoritmos polinomiales consti-tuyen la clase P y son llamados polinomiales Un problema de decisioacuten es no-determiniacutestico polinomial cuando cualquier instancia que produce respuesta ldquosiacuterdquoposee una comprobacioacuten de correctitud (tambieacuten llamada certificado) verificable entiempo polinomia en el tamantildeo de la instancia Estos problemas de decisioacuten se di-ce que pertenecen a la clase NP Claramente P sube NP Sin embargo no se sabe siesta inclusioacuten es estricta uno de los principales problemas abiertos en Teoriacutea de lacomputacioacuten es saber si P 6= NPUna reduccioacuten es una transformacioacuten de un problema en otro problema Intuitiva-mente un problema Q puede ser reducido a otro problema Qprime si cualquier instanciadel problema Q puede ser ldquofaacutecilmenterdquo expresada como una instancia del problemaQprime y cuya solucioacuten proporcione una solucioacuten para la instancia de QLas reducciones en tiempo polinomial nos dotan de elementos para probar de unamanera formal que un problema es al menos tan difiacutecil que otro con una dife-rencia de un factor polinomial Estas son esenciales para definir a los problemas
36 Morfismos de grafos 81
NP-completos ademaacutes de ayudar a comprender los mismosLa clase de los problemas NP-completos contiene a los problemas maacutes difiacuteciles enNP en el sentido de que son los que esteacuten maacutes lejos de estar en P Debido a que elproblema P = NP no ha sido resuelto el hecho de reducir un problema B a otroproblema A indicariacutea que no se conoce solucioacuten en tiempo polinomial para A Estoes debido a que una solucioacuten en tiempo polinomial para A tendriacutea como conse-cuencia la existencia de una solucioacuten polinomial para B De manera similar debidoa que todos los problemas NP pueden ser reducidos a este conjunto encontrar unproblema NP-completo que pueda ser resuelto en un tiempo polinomial significariacuteaque P = NPEl problema de decidir si dos grafos son homomorfos es un problema de decisioacutenNP-completo La NP-completitud del problema se demuestra mediante la reduccioacutende este problema al problema de la clique 17En el proceso de recopilacioacuten de imformacioacuten acerca de la Teoriacutea de la complejidadse ha trabajado con dos fuentesbull la tesis de licenciatura de Pablo Burzyn ldquoComplejidad computacional en proble-
mas de modificacioacuten de aristas en grafosrdquo ([2]) ybull el artiacuteculo ldquoTeoriacutea de la complejidad computacionalrdquo ([12]) de la Wikipedia
363 Isomorfismos
Definicioacuten 363 Dados dos grafos simples G = (V A) y Gprime = (Vprime Aprime) un isomorfis-mo entre G y Gprime es un morfismo biyectivo cuyo inverso es morfismo entre Gprime y G
La funcioacuten (esIsomorfismo g h f) se verifica si la aplicacioacuten f es un isomorfismoentre los grafos g y h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt esIsomorfismo g1 g2 [(12)(24)(36)]
-- True
-- gtgtgt esIsomorfismo g1 g2 [(12)(22)(36)]
-- False
esIsomorfismo (Ord aOrd b) =gt
Grafo a -gt Grafo b -gt Funcion a b -gt Bool
esIsomorfismo g h f =
esBiyectiva vs1 vs2 f ampamp
esMorfismo g h f ampamp
esMorfismo h g (inversa f)
where vs1 = vertices g
vs2 = vertices h
17httpseswikipediaorgwikiProblema_de_la_clique
82 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (isomorfismos1 g h) devuelve todos los isomorfismos posibles entrelos grafos g y h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfismos1 g1 g2
-- [[(12)(24)(36)]]
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfismos1 g3 g4
-- []
-- gtgtgt let g5 = creaGrafo [123] [(11)(22)(33)]
-- gtgtgt let g6 = creaGrafo [246] [(22)(44)(66)]
-- gtgtgt pp $ isomorfismos1 g5 g6
-- [[(1 2)(2 4)(3 6)][(1 4)(2 2)(3 6)]
-- [(1 6)(2 4)(3 2)][(1 4)(2 6)(3 2)]
-- [(1 6)(2 2)(3 4)][(1 2)(2 6)(3 4)]]
isomorfismos1 (Ord aOrd b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos1 g h =
[f | f lt- biyecciones vs1 vs2
conservaAdyacencia g h f
conservaAdyacencia h g (inversa f)]
where vs1 = vertices g
vs2 = vertices h
Definicioacuten 364 Dos grafos G y H se dicen isomorfos si existe alguacuten isomorfismo entreellos
La funcioacuten isomorfos1 g h se verifica si los grafos g y h son isomorfos
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfos1 g1 g2
-- True
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfos1 g3 g4
-- False
isomorfos1 (Ord aOrd b) =gt Grafo a -gt Grafo b -gt Bool
isomorfos1 g = not null isomorfismos1 g
Nota 361 Al tener Haskell una evaluacioacuten perezosa la funcioacuten (isomorfos g h)
no necesita generar todos los isomorfismos entre los grafos g y h
Definicioacuten 365 Sea G = (V A) un grafo Un invariante por isomorfismos de G esuna propiedad de G que tiene el mismo valor para todos los grafos que son isomorfos a eacutel
36 Morfismos de grafos 83
esInvariantePorIsomorfismos
Eq a =gt (Grafo Int -gt a) -gt Grafo Int -gt Grafo Int -gt Bool
esInvariantePorIsomorfismos p g h =
isomorfos g h --gt (p g == p h)
where (--gt) = (lt=)
Teorema 366 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un iso-morfismo Entonces se verifica que |V(G)| = |V(Gprime)| es decir el orden de un grafo es uninvariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos orden)
+++ OK passed 100 tests
Teorema 367 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces se verifica que |A(G)| = |A(Gprime)| es decir el tamantildeo de un grafo es uninvariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos tamantildeo)
+++ OK passed 100 tests
Teorema 368 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces tienen la misma secuencia de grados es decir la secuencia de grados de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos secuenciaGrados)
+++ OK passed 100 tests
A partir de las propiedades que hemos demostrado de los isomorfismos vamos adar otra definicioacuten equivalente de las funciones (isomorfismos1 g h) y (isomorfos1
g h)
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfismos2 g1 g2
-- [[(12)(24)(36)]]
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfismos2 g3 g4
-- []
-- gtgtgt let g5 = creaGrafo [123] [(11)(22)(33)]
84 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- gtgtgt let g6 = creaGrafo [246] [(22)(44)(66)]
-- gtgtgt pp $ isomorfismos2 g5 g6
-- [[(1 2)(2 4)(3 6)][(1 4)(2 2)(3 6)]
-- [(1 6)(2 4)(3 2)][(1 4)(2 6)(3 2)]
-- [(1 6)(2 2)(3 4)][(1 2)(2 6)(3 4)]]
isomorfismos2 (Ord a Ord b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos2 g h
| orden g = orden h = []
| tamantildeo g = tamantildeo h = []
| secuenciaGrados g = secuenciaGrados h = []
| otherwise = [f | f lt- biyecciones vs1 vs2
conservaAdyacencia g h f]
where vs1 = vertices g
vs2 = vertices h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfos2 g1 g2
-- True
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfos2 g3 g4
-- False
isomorfos2 (Ord a Ord b) =gt Grafo a -gt Grafo b -gt Bool
isomorfos2 g =
not null isomorfismos2 g
isomorfismos3 (Ord a Ord b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos3 g h
| orden g = orden h = []
| tamantildeo g = tamantildeo h = []
| secuenciaGrados g = secuenciaGrados h = []
| otherwise = filter (conservaAdyacencia g h) (posibles g h)
verticesPorGrados g =
[filter (p n) (vertices g) | n lt- nub (secuenciaGrados g)]
where p m v = grado g v == m
aux1 [] _ = []
aux1 (xsxss) (ysyss) = (map (zip xs) (permutations ys))aux1 xss yss
aux2 [] = []
aux2 (xss[]) = xss
aux2 (xssyss[]) = [xs ++ ys | xs lt- xss ys lt- yss]
aux2 (xssyssxsss) =
aux2 ([xs ++ ys | xs lt- xss ys lt- yss]xsss)
36 Morfismos de grafos 85
posibles g h =
aux2 (aux1 (verticesPorGrados g) (verticesPorGrados h))
Vamos a comparar la eficiencia entre ambas definiciones
Nota 362 La nueva definicioacuten de (isomorfismos3 g h) es la maacutes eficiente con gra-fos poco regulares sin embargo cuando todos los veacutertices tienen el mismo grado(isomorfismos2 g h) sigue siendo mejor opcioacuten (aunque no hay mucha diferenciaen el coste computacional)ghcigt let n = 6 in (length (isomorfismos1 (completo n) (completo n)))
720
(018 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos2 (completo n) (completo n)))
720
(018 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos3 (completo n) (completo n)))
720
(018 secs 26123800 bytes)
ghcigt let n = 6 in (length (isomorfismos1 (grafoCiclo n) (grafoCiclo n)))
12
(004 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos2 (grafoCiclo n) (grafoCiclo n)))
12
(004 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos3 (grafoCiclo n) (grafoCiclo n)))
12
(004 secs 0 bytes)
ghcigt length (isomorfismos1 (grafoCiclo 6) (completo 7))
0
(000 secs 0 bytes)
ghcigt length (isomorfismos2 (grafoCiclo 6) (completo 7))
0
(001 secs 0 bytes)
ghcigt length (isomorfismos3 (grafoCiclo 6) (completo 7))
0
(000 secs 0 bytes)
ghcigt isomorfos1 (completo 10) (grafoCiclo 10)
False
(5190 secs 12841861176 bytes)
ghcigt isomorfos2 (completo 10) (grafoCiclo 10)
False
(000 secs 0 bytes)
ghcigt isomorfos3 (completo 10) (grafoCiclo 10)
False
86 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
(000 secs 0 bytes)
ghcigt isomorfos1 (grafoCiclo 10) (grafoRueda 10)
False
(7390 secs 16433969976 bytes)
ghcigt isomorfos2 (grafoCiclo 100) (grafoRueda 100)
False
(000 secs 0 bytes)
ghcigt isomorfos3 (grafoCiclo 100) (grafoRueda 100)
False
(000 secs 0 bytes)
ghcigt length (isomorfismos2 (grafoRueda 10) (grafoRueda 10))
18
(10112 secs 23237139992 bytes)
ghcigt length (isomorfismos3 (grafoRueda 10) (grafoRueda 10))
18
(4467 secs 9021442440 bytes)
Nota 363 Cuando los grafos son isomorfos comprobar que tienen el mismo nuacuteme-ro de veacutertices el mismo nuacutemero de aristas y la misma secuencia graacutefica no requieremucho tiempo ni espacio dando lugar a costes muy similares entre los dos paresde definiciones Sin embargo cuando los grafos tienen el mismo nuacutemero de veacuterticesy fallan en alguna de las demaacutes propiedades el resultado es muy costoso para laprimera definicioacuten mientras que es inmediato con la segundaA partir de ahora utilizaremos la funcioacuten isomorfismos2 para calcular los isomor-fismos entre dos grafos y la funcioacuten isomorfos para determinar si dos grafos sonisomorfos de modo que las renombraremos por isomorfismos y isomorfismos res-pectivamente
isomorfismos (Ord aOrd b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos = isomorfismos2
isomorfos (Ord aOrd b) =gt Grafo a -gt Grafo b -gt Bool
isomorfos = isomorfos2
364 Automorfismos
Definicioacuten 369 Dado un grafo simple G = (V A) un automorfismo de G es un iso-morfismo de G en siacute mismo
La funcioacuten (esAutomorfismo g f) se verifica si la aplicacioacuten f es un automorfismode g
-- | Ejemplos
-- gtgtgt let g = creaGrafo [123] [(12)(13)]
37 Caminos en grafos 87
-- gtgtgt esAutomorfismo g [(11)(23)(32)]
-- True
-- gtgtgt esAutomorfismo g [(12)(23)(31)]
-- False
esAutomorfismo Ord a =gt Grafo a -gt Funcion a a -gt Bool
esAutomorfismo g = esIsomorfismo g g
La funcioacuten (automorfismos g) devuelve la lista de todos los posibles automorfis-mos en g
-- | Ejemplo
-- gtgtgt automorfismos (creaGrafo [123] [(12)(13)])
-- [[(11)(22)(33)][(11)(23)(32)]]
automorfismos Ord a =gt Grafo a -gt [Funcion a a]
automorfismos g = isomorfismos1 g g
Nota 364 Cuando trabajamos con automorfismos es mejor utilizar en su defini-cioacuten la funcioacuten isomorfismos1 en vez de isomorfismos2 pues ser isomorfos es unarelacioacuten reflexiva es decir un grafo siempre es isomorfo a siacute mismo
37 Caminos en grafos
Una de las aplicaciones de la teoriacutea de grafos es la determinacioacuten de trayectos o re-corridos en una red de transporte o de distribucioacuten de productos Asiacute si cada veacuterticerepresenta un punto de intereacutes y cada arista representa una conexioacuten entre dos pun-tos usando grafos como modelos podemos simplificar el problema de encontrar laruta maacutes ventajosa en cada caso
371 Definicioacuten de camino
Definicioacuten 371 Sea G = (V A) un grafo simple y sean u v isin V dos veacutertices Uncamino entre u y v es una sucesioacuten de veacutertices de G u = v0 v1 v2 vkminus1 vk = vdonde foralli isin 0 kminus 1 (vi vi+1) isin A
La funcioacuten (esCamino g c) se verifica si la sucesioacuten de veacutertices c es un camino enel grafo g
-- | Ejemplo
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
-- gtgtgt esCamino (grafoCiclo 5) [123451]
-- True
-- gtgtgt esCamino (grafoCiclo 5) [124531]
-- False
88 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
esCamino Ord a =gt Grafo a -gt [a] -gt Bool
esCamino g c = all (`aristaEn` g) (zip c (tail c))
La funcioacuten (aristasCamino c) devuelve la lista de las aristas recorridas en el ca-mino c
-- | Ejemplos
-- gtgtgt aristasCamino [123]
-- [(12)(23)]
-- gtgtgt aristasCamino [1231]
-- [(12)(23)(13)]
-- gtgtgt aristasCamino [1232]
-- [(12)(23)(23)]
aristasCamino Ord a =gt [a] -gt [(aa)]
aristasCamino c =
map parOrdenado (zip c (tail c))
where parOrdenado (uv) | u lt= v = (uv)
| otherwise = (vu)
La funcioacuten (verticesCamino c) devuelve la lista de las vertices recorridas en elcamino c
-- | Ejemplo
-- gtgtgt verticesCamino [1231]
-- [123]
verticesCamino Ord a =gt [a] -gt [a]
verticesCamino c = nub c
Definicioacuten 372 Se llama longitud de un camino al nuacutemero de veces que se atraviesa unaarista en dicho camino
La funcioacuten (longitudCamino c) devuelve la longitud del camino c
-- | Ejemplo
-- gtgtgt longitudCamino [427]
-- 2
longitudCamino [a] -gt Int
longitudCamino c = length c - 1
La funcioacuten (todosCaminos g u v k) devuelve todos los caminos entre los veacuterticesu y v en el grafo g que tienen longitud k
-- | Ejemplo
-- gtgtgt todosCaminos (creaGrafo [12] [(12)]) 1 2 3
-- [[1212]]
-- gtgtgt todosCaminos (bipartitoCompleto 2 3) 1 3 3
-- [[1313][1323][1413][1423][1513][1523]]
todosCaminos Ord a =gt Grafo a -gt a -gt a -gt Int -gt [[a]]
todosCaminos g u v 0 = if u == v ampamp elem u (vertices g)
37 Caminos en grafos 89
then [[u]]
else []
todosCaminos g u v 1 = if aristaEn (uv) g
then [[uv]]
else []
todosCaminos g u v k =
filter p [uvs | n lt- [1k-1] w lt- a u vs lt- tC w v n]
where p xs = longitudCamino xs == k
a = adyacentes g
tC = todosCaminos g
La funcioacuten (numeroCaminosDeLongitud g u v k) es el nuacutemero de caminos de lon-gitud k uniendo los veacutertices u y v en el grafo g
-- | Ejemplos
-- gtgtgt numeroCaminosDeLongitud (completo 7) 1 4 5
-- 1111
-- gtgtgt numeroCaminosDeLongitud grafoPetersen 1 4 3
-- 5
numeroCaminosDeLongitud Ord a =gt Grafo a -gt a -gt a -gt Int -gt Int
numeroCaminosDeLongitud g u v = length todosCaminos g u v
372 Recorridos
Definicioacuten 373 Sea G = (V A) un grafo y sean u v isin V Un camino entre u y v queno repite aristas (quizaacutes veacutertices) se llama recorrido
La funcioacuten (esRecorrido g c) se verifica si el camino c es un recorrido en el grafog
-- | Ejemplo
-- gtgtgt esRecorrido (grafoCiclo 4) [214]
-- True
-- gtgtgt esRecorrido (grafoCiclo 4) [2141]
-- False
-- gtgtgt esRecorrido (grafoCiclo 4) [213]
-- False
esRecorrido Ord a =gt Grafo a -gt [a] -gt Bool
esRecorrido g c =
esCamino g c ampamp sinRepetidos (aristasCamino c)
373 Caminos simples
Definicioacuten 374 Un camino que no repite veacutertices (y por tanto tampoco aristas) se llamacamino simple
90 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (esCaminoSimple g c) se verifica si el camino c es un camino simple enel grafo g
-- | Ejemplos
-- gtgtgt esCaminoSimple (creaGrafo [12] [(11)(12)]) [112]
-- False
-- gtgtgt esCaminoSimple (grafoCiclo 4) [214]
-- True
-- gtgtgt esCaminoSimple (grafoCiclo 4) [14321]
-- True
-- gtgtgt esCaminoSimple (grafoCiclo 4) [43212]
-- False
esCaminoSimple Ord a =gt Grafo a -gt [a] -gt Bool
esCaminoSimple g [] = True
esCaminoSimple g vs =
esRecorrido g vs ampamp noRepiteVertices vs
where noRepiteVertices (xxs)
| sinRepetidos (xxs) = True
| x == last xs ampamp sinRepetidos xs = True
| otherwise = False
La funcioacuten (todosArcosBP g u v) devuelve una lista con todos los caminos simplesposibles en el grafo g entre los veacutertices u y v utilizando una algoritmo de buacutesquedaen profundidad sobre el grafo g Este algoritmo recorre el grafo de izquierda a dere-cha y de forma al visitar un nodo explora todos los caminos que pueden continuarpor eacutel antes de pasar al siquiente
-- | Ejemplos
-- gtgtgt grafoCiclo 4
-- G [1234] [(12)(14)(23)(34)]
-- gtgtgt todosArcosBP (grafoCiclo 4) 1 4
-- [[14][1234]]
-- gtgtgt todosArcosBP (grafoCiclo 4) 4 1
-- [[4321][41]]
-- gtgtgt todosArcosBP (creaGrafo [14] [(12)(34)]) 1 4
-- []
-- gtgtgt todosArcosBP (creaGrafo [12] [(11)(12)]) 1 1
-- [[1]]
todosArcosBP Ord a =gt Grafo a -gt a -gt a -gt [[a]]
todosArcosBP g x y = aux [[y]]
where aux [] = []
aux ([]zss) = aux zss
aux ((zzs)zss)
| z == x = (zzs) aux zss
| otherwise =
aux ([vzzs | v lt- adyacentes g z zs] ++ zss)
g = eliminaLazos g
eliminaLazos h = creaGrafo (vertices h)
37 Caminos en grafos 91
[(xy) | (xy) lt- aristas h x = y]
La funcioacuten (todosArcosBA g u v) devuelve una lista con todos los caminos simplesposibles en el grafo g entre los veacutertices u y v utilizando una algoritmo de buacutesquedaen anchura sobre el grafo g Este algoritmo recorre el grafo por niveles de formaque el primer camino de la lista es de longitud miacutenima
-- | Ejemplos
-- gtgtgt grafoCiclo 4
-- G [1234] [(12)(14)(23)(34)]
-- gtgtgt todosArcosBA (grafoCiclo 4) 1 4
-- [[14][1234]]
-- gtgtgt todosArcosBA (grafoCiclo 4) 4 1
-- [[41][4321]]
-- gtgtgt todosArcosBA (creaGrafo [14] [(12)(34)]) 1 4
-- []
-- gtgtgt todosArcosBA (creaGrafo [12] [(11)(12)]) 1 1
-- [[1]]
todosArcosBA Ord a =gt Grafo a -gt a -gt a -gt [[a]]
todosArcosBA g x y = aux [[y]]
where aux [] = []
aux ([]zss) = aux zss
aux ((zzs)zss)
| z == x = (zzs) aux zss
| otherwise =
aux (zss ++ [vzzs | v lt- adyacentes g z zs])
g = eliminaLazos g
Vamos a comprobar con QuickCheck que el primer elemento de la lista que de-vuelve la funcioacuten (todosArcosBA g u v) es de longitud miacutenima Para ello vamos autilizar la funcioacuten (parDeVertices g) que es un generador de pares de veacutertices delgrafo no nulo g Por ejemplo
ghcigt sample (parDeVertices (creaGrafo [19] []))
(39)
(93)
(74)
(43)
(28)
(72)
(84)
(53)
(72)
(31)
(72)
92 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
parDeVertices Grafo Int -gt Gen (IntInt)
parDeVertices g = do
x lt- elements vs
y lt- elements vs
return (xy)
where vs = vertices g
La propiedad es
prop_todosArcosBA Grafo Int -gt Property
prop_todosArcosBA g =
not (esGrafoNulo g) ==gt
forAll (parDeVertices g)
((xy) -gt let zss = todosArcosBA g x y
in null zss || longitudCamino (head zss) ==
minimum (map longitudCamino zss))
La comprobacioacuten es
ghcigt quickCheck prop_todosArcosBA
+++ OK passed 100 tests
Veamos que la funcioacuten (todosArcosBP g u v) no verifica la propiedad
ghcigt quickCheck prop_todosArcosBP
Failed Falsifiable (after 6 tests)
G [12345] [(12)(14)(15)(22)(23)(24)(44)(45)(55)]
(52)
prop_todosArcosBP Grafo Int -gt Property
prop_todosArcosBP g =
not (esGrafoNulo g) ==gt
forAll (parDeVertices g)
((xy) -gt let zss = todosArcosBP g x y
in null zss || longitudCamino (head zss) ==
minimum (map longitudCamino zss))
La funcioacuten (numeroArcosDeLongitud g u v k) devuelve el nuacutemero de caminos en-tre los veacutertices u y v en el grafo g que tienen longitud k
-- | Ejemplos
-- gtgtgt numeroArcosDeLongitud (completo 6) 1 3 4
-- 24
-- gtgtgt numeroArcosDeLongitud grafoPetersen 1 3 4
-- 4
numeroArcosDeLongitud Ord a =gt Grafo a -gt a -gt a -gt Int -gt Int
numeroArcosDeLongitud g u v k =
length (filter p (todosArcosBA g u v))
where p vs = longitudCamino vs == k
37 Caminos en grafos 93
374 Conexioacuten
Definicioacuten 375 Dado un grafo G = (V A) sean u v isin V Si existe alguacuten camino entreu y v en el grafo G diremos que estaacuten conectados y lo denotamos por u v
La funcioacuten (estanConectados g u v) se verifica si los veacutertices u y v estaacuten conecta-dos en el grafo g
-- | Ejemplos
-- gtgtgt estanConectados (creaGrafo [14] [(12)(24)]) 1 4
-- True
-- gtgtgt estanConectados (creaGrafo [14] [(12)(34)]) 1 4
-- False
estanConectados Ord a =gt Grafo a -gt a -gt a -gt Bool
estanConectados g u v
| esGrafoNulo g = False
| otherwise = not (null (todosArcosBA g u v))
Nota 371 La funcioacuten (estanConectados g u v) no necesita calcular todos los ca-minos entre u y v Puesto que Haskell utiliza por defecto evaluacioacuten perezosa siexiste alguacuten camino entre los dos veacutertices basta calcular el primero para saber quela lista de todos los caminos no es vaciacutea
375 Distancia
Definicioacuten 376 Se define la distancia entre u y v en el grafo G como la longitud delcamino maacutes corto que los une Si u y v no estaacuten conectados decimos que la distancia esinfinita
La funcioacuten (distancia g u v) devuelve la distancia entre los veacutertices u y v en elgrafo g En caso de que los veacutertices no esteacuten conectados devuelve el valor Nothing
-- | Ejemplos
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 1
-- Just 0
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 2
-- Just 1
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 3
-- Just 2
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 4
-- Nothing
distancia Ord a =gt Grafo a -gt a -gt a -gt Maybe Int
distancia g u v
| estanConectados g u v =
Just (longitudCamino (head (todosArcosBA g u v)))
| otherwise = Nothing
94 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Definicioacuten 377 Dado G = (V A) un grafo sean u v isin V Un camino entre u y v cuyalongitud coincide con la distancia entre los veacutertices se llama geodeacutesica entre u y v
La funcioacuten (esGeodesica g c) se verifica si el camino c es una geodeacutesica entre susextremos en el grafo g
-- | Ejemplos
-- gtgtgt let g = creaGrafo [14] [(12)(13)(23)(34)]
-- gtgtgt esGeodesica g [134]
-- True
-- gtgtgt esGeodesica g [1234]
-- False
esGeodesica Ord a =gt Grafo a -gt [a] -gt Bool
esGeodesica g c =
esCamino g c ampamp
longitudCamino c == fromJust (distancia g u v)
where u = head c
v = last c
Nota 372 No hace falta imponer en la definicioacuten de la funcioacuten que el camino seaun recorrido pues el camino de miacutenima longitud entre dos veacutertices es siempre unrecorrido
376 Caminos cerrados
Definicioacuten 378 Un camino en un grafo G se dice cerrado si sus extremos son igualesDiremos que un camino cerrado de longitud tres es un triaacutengulo
La funcioacuten (esCerrado g c) se verifica si el camino c es cerrado en el grafo g
-- | Ejemplos
-- gtgtgt let g = creaGrafo [14] [(12)(13)(23)(34)]
-- gtgtgt esCerrado g [1231]
-- True
-- gtgtgt esCerrado g [123]
-- False
-- gtgtgt esCerrado g [1241]
-- False
esCerrado (Ord a) =gt Grafo a -gt [a] -gt Bool
esCerrado _ [] = False
esCerrado g (vc) =
esCamino g c ampamp v == last c
La funcioacuten (triangulos g v) devuelve la lista de todos los triaacutengulos que pasanpor el veacutertice v en el grafo g
-- | Ejemplos
-- gtgtgt triangulos (completo 4) 3
37 Caminos en grafos 95
-- [[3123][3143][3213][3243][3413][3423]]
-- gtgtgt triangulos (grafoCiclo 6) 1
-- []
triangulos Ord a =gt Grafo a -gt a -gt [[a]]
triangulos g u = todosCaminos g u u 3
377 Circuitos
Definicioacuten 379 Un recorrido en un grafo G se dice circuito si sus extremos son iguales
La funcioacuten (esCircuito g c) se verifica si la sucesioacuten de veacutertices c es un circuitoen el grafo g
-- | Ejemplos
-- gtgtgt grafoCiclo 4
-- G [1234] [(12)(14)(23)(34)]
-- gtgtgt esCircuito (grafoCiclo 4) [12341]
-- True
-- gtgtgt esCircuito (grafoCiclo 4) [1234]
-- False
-- gtgtgt esCircuito (grafoCiclo 4) [1234141]
-- False
esCircuito (Ord a) =gt Grafo a -gt [a] -gt Bool
esCircuito g c =
esRecorrido g c ampamp esCerrado g c
378 Ciclos
Definicioacuten 3710 Un camino simple en un grafo G se dice que es un ciclo si sus extremosson iguales
La funcioacuten (esCiclo g c) se verifica si el camino c es un ciclo en el grafo g
-- | Ejemplos
-- gtgtgt esCiclo (grafoCiclo 4) [121]
-- False
-- gtgtgt esCiclo (grafoCiclo 4) [12341]
-- True
-- gtgtgt esCiclo (grafoCiclo 4) [1234]
-- False
-- gtgtgt esCiclo (grafoCiclo 4) [1234141]
-- False
esCiclo (Ord a) =gt Grafo a -gt [a] -gt Bool
esCiclo g c =
esCaminoSimple g c ampamp esCerrado g c
96 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (todosCiclos g v) devuelve todos los ciclos en el grafo g que pasan porel veacutertice v
-- | Ejemplos
-- gtgtgt todosCiclos (grafoCiclo 4) 3
-- [[34123][32143]]
-- gtgtgt todosCiclos (completo 3) 2
-- [[2312][2132]]
-- gtgtgt todosCiclos (creaGrafo [123] [(11)(12)(13)(23)]) 1
-- [[1][1321][1231]]
-- gtgtgt todosCiclos (creaGrafo [12] [(12)(22)(23)]) 2
-- [[2]]
todosCiclos Ord a =gt Grafo a -gt a -gt [[a]]
todosCiclos g x =
map f (filter p (concat [todosArcosBA g x u | u lt- a x]))
where p c = longitudCamino c = 1
f c | longitudCamino c == 0 = c
| otherwise = c ++ [x]
a = adyacentes g
Nota 373 El algoritmo utilizado en la definicioacuten de (todosCiclos g) es el de buacutes-queda en anchura Este algoritmo recorre el grafo por niveles de forma que el pri-mer camino de la lista es de longitud miacutenima
379 Grafos aciacuteclicos
Definicioacuten 3711 Diremos que un grafo G = (V A) es aciacuteclico si no contiene ninguacutenciclo es decir si forallv isin V no existe ninguacuten camino simple que comience y termine en v
La funcioacuten (esAciclico g) se verifica si el grafo g es aciacuteclico
-- | Ejemplo
-- gtgtgt esAciclico (creaGrafo [14] [(12)(24)])
-- True
-- gtgtgt esAciclico (grafoCiclo 5)
-- False
-- gtgtgt esAciclico (grafoEstrella 6)
-- True
esAciclico Ord a =gt Grafo a -gt Bool
esAciclico g =
and [null (todosCiclos g x) | x lt- vertices g]
38 Conectividad de los grafos 97
38 Conectividad de los grafos
381 Estar conectados por un camino
Teorema 381 Dado un grafo G la relacioacuten u sim v (estar conectados por un camino) es unarelacioacuten de equivalencia
La funcioacuten (estarConectadosCamino g) devuelve la relacioacuten entre los veacutertices delgrafo g de estar conectados por un camino en eacutel
-- | Ejemplo
-- gtgtgt estarConectadosCamino (creaGrafo [14] [(12)(24)])
-- [(11)(12)(14)(21)(22)(24)(33)(41)(42)(44)]
estarConectadosCamino Ord a =gt Grafo a -gt [(aa)]
estarConectadosCamino g =
[(uv) | u lt- vs v lt- vs estanConectados g u v]
where vs = vertices g
A continuacioacuten comprobaremos el resultado con QuickCheck
ghcigt quickCheck prop_conectadosRelEqui
+++ OK passed 100 tests
prop_conectadosRelEqui Grafo Int -gt Bool
prop_conectadosRelEqui g =
esRelacionEquivalencia (vertices g) (estarConectadosCamino g)
382 Componentes conexas de un grafo
Definicioacuten 382 Las clases de equivalencia obtenidas por la relacioacuten sim estar conectadospor un camino en un grafo G inducen subgrafos en G los veacutertices y todas las aristas de loscaminos que los conectan que reciben el nombre de componentes conexas por caminosde G
La funcioacuten (componentesConexas1 g) devuelve las componentes conexas por cami-nos del grafo g
-- | Ejemplos
-- gtgtgt componentesConexas (creaGrafo [15] [(12)(23)])
-- [[123][4][5]]
-- gtgtgt componentesConexas (creaGrafo [15] [(12)(23)(45)])
-- [[123][45]]
-- gtgtgt componentesConexas (creaGrafo [13] [(12)(23)])
-- [[123]]
componentesConexas1 Ord a =gt Grafo a -gt [[a]]
componentesConexas1 g =
clasesEquivalencia (vertices g) (estarConectadosCamino g)
98 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Vamos a definir dos nuevas funciones una que compruebe si el grafo es nulo o com-pleto pues en dichos casos las componentes seraacuten el conjunto vaciacuteo y el conjuntodel conjunto de veacutertices respectivamente y otra con un algoritmo algo maacutes comple-jo
componentesConexas2 Ord a =gt Grafo a -gt [[a]]
componentesConexas2 g
| esGrafoNulo g = []
| esCompleto g = [vertices g]
| otherwise =
clasesEquivalencia (vertices g) (estarConectadosCamino g)
componentesConexas3 Ord a =gt Grafo a -gt [[a]]
componentesConexas3 g = aux (vertices g) [] []
where aux [] [] [] = []
aux [] xs ys = [xs]
aux (vvs) [] [] =
aux (vs (a v)) (i v (a v)) (a v)
aux vs xs ys | null ((ug [a v | v lt- ys]) xs) =
xs aux vs [] []
| otherwise =
aux (vs ug [a v | v lt- ys])
(u xs (ug [a v | v lt- ys]))
(ug [a v | v lt- ys] ys)
a = adyacentes g
i = inserta
ug = unionGeneral
u = unionConjuntos
La comprobacioacuten con QuickCheck de la equivalencia de las definiciones es
ghcigt quickCheck prop_EquiComponentesConexas
+++ OK passed 100 tests
ghcigt quickCheck prop_EquiComponentesConexas2
+++ OK passed 100 tests
prop_EquiComponentesConexas Grafo Int -gt Bool
prop_EquiComponentesConexas g =
componentesConexas1 g == componentesConexas2 g
prop_EquiComponentesConexas2 Grafo Int -gt Bool
prop_EquiComponentesConexas2 g =
componentesConexas1 g == componentesConexas3 g
Comparemos ahora la eficiencia de las definiciones
ghcigt componentesConexas1 grafoNulo
[]
(003 secs 0 bytes)
38 Conectividad de los grafos 99
ghcigt componentesConexas2 grafoNulo
[]
(001 secs 0 bytes)
ghcigt componentesConexas3 grafoNulo
[]
(001 secs 0 bytes)
ghcigt length (componentesConexas1 (completo 50))
1
(023 secs 0 bytes)
ghcigt length (componentesConexas2 (completo 50))
1
(016 secs 0 bytes)
ghcigt length (componentesConexas3 (completo 50))
1
(008 secs 0 bytes)
ghcigt length (componentesConexas1 (completo 100))
1
(217 secs 205079912 bytes)
ghcigt length (componentesConexas2 (completo 100))
1
(285 secs 0 bytes)
ghcigt length (componentesConexas3 (completo 100))
1
(119 secs 0 bytes)
ghcigt length (componentesConexas1 (completo 150))
1
(1295 secs 742916792 bytes)
ghcigt length (componentesConexas2 (completo 150))
1
(2048 secs 0 bytes)
ghcigt length (componentesConexas3 (completo 150))
1
(964 secs 0 bytes)
Con grafos completos de gran tamantildeo Haskell tarda maacutes tiempo en comprobar quees completo que en calcular directamente sus clases de equivalencia y para grafosnulos apenas hay diferencia en el coste entre la primera y la segunda definicioacuten Porotra parte la tercera definicioacuten es la maacutes eficiente en todos los casos y seraacute por tantola que utilizaremos a lo largo del trabajo
componentesConexas Ord a =gt Grafo a -gt [[a]]
componentesConexas = componentesConexas3
La funcioacuten (numeroComponentes g) devuelve el nuacutemero de componentes conexasdel grafo g
-- Ejemplos
-- gtgtgt numeroComponentes (creaGrafo [15] [(12)(23)(45)])
100 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- 2
-- gtgtgt numeroComponentes (creaGrafo [14] [(12)(22)(34)])
-- 2
numeroComponentes Ord a =gt Grafo a -gt Int
numeroComponentes g
| null (aristas g) = orden g
| otherwise = length (componentesConexas g)
Nota 381 Hemos comprobado para la definicioacuten anterior que comprobar si un gra-fo es completo es muy costoso luego no conviene antildeadirlo como patroacuten
383 Grafos conexos
Definicioacuten 383 Dado un grafo diremos que es conexo si la relacioacuten tiene una uacutenica clasede equivalencia en eacutel es decir si el grafo tiene una uacutenica componente conexa
La funcioacuten (esConexo g) se verifica si el grafo g es conexo
-- Ejemplos
-- gtgtgt esConexo (creaGrafo [13] [(12)(23)])
-- True
-- gtgtgt esConexo (creaGrafo [15] [(12)(23)(45)])
-- False
esConexo Ord a =gt Grafo a -gt Bool
esConexo g = length (componentesConexas g) == 1
esConexo2 Ord a =gt Grafo a -gt Bool
esConexo2 g
| esGrafoNulo g = False
| esUnitario (vertices g) = True
| otherwise = aux (vertices g) [] []
where aux [] [] [] = False
aux [] xs _ = True
aux (vvs) [] [] | null vs = True
| null (a v) = False
| otherwise =
aux (vs a v) (i v (a v)) (a v)
aux vs xs ys | null ((ug [a v | v lt- xs]) xs) = False
| otherwise =
aux (vs (ug [a v | v lt- xs]))
(u (ug [a v | v lt- xs]) xs)
((ug [a v | v lt- xs]) xs)
a = adyacentes g
ug = unionGeneral
i = inserta
u = unionConjuntos
38 Conectividad de los grafos 101
La comprobacioacuten de la equivalencia de las definiciones con QuickCheck es
ghcigt quickCheck prop_EquiEsConexo
+++ OK passed 100 tests
prop_EquiEsConexo Grafo Int -gt Bool
prop_EquiEsConexo g =
esConexo g == esConexo2 g
Vamos a comparar ahora su eficiencia
ghcigt let g1 = grafoCiclo 100
(000 secs 0 bytes)
ghcigt let g = creaGrafo (vertices g1) (aristas g1 [(23)(9899)])
(000 secs 0 bytes)
ghcigt esConexo g
False
(117 secs 151632168 bytes)
ghcigt esConexo2 g
False
(001 secs 0 bytes)
ghcigt esConexo (grafoCiclo 500)
True
(7341 secs 10448270712 bytes)
ghcigt esConexo2 (grafoCiclo 500)
True
(18939 secs 18468849096 bytes)
ghcigt esConexo (grafoCiclo 500)
True
(7341 secs 10448270712 bytes)
ghcigt esConexo2 (grafoCiclo 500)
True
(18939 secs 18468849096 bytes)
En principio no nos proporciona ninguna ventaja la segunda definicioacuten asiacute que tra-bajaremos con la primera que hemos dado ya que es mucho maacutes sencilla
Teorema 384 Sea G un grafo G = (V A) es conexo si y solamente si forallu v isin V existe uncamino entre u y v
Vamos a comprobar el resultado con QuickCheck
ghcigt quickCheck prop_caracterizaGrafoConexo
+++ OK passed 100 tests
prop_caracterizaGrafoConexo Grafo Int -gt Property
prop_caracterizaGrafoConexo g =
not (esGrafoNulo g) ==gt
esConexo g == and [estanConectados g u v
| u lt- vertices g v lt- vertices g]
102 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
384 Excentricidad
Definicioacuten 385 Sean G = (V A) un grafo y v isin V Se define la excentricidad de v comoel maacuteximo de las distancias entre v y el resto de veacutertices de G La denotaremos por e(v)
La funcioacuten (excentricidad g v) devuelve la excentricidad del veacutertice v en el grafog
-- | Ejemplos
-- gtgtgt let g = creaGrafo [13] [(12)(23)(33)]
-- gtgtgt excentricidad g 1
-- Just 2
-- gtgtgt excentricidad g 2
-- Just 1
-- gtgtgt excentricidad (creaGrafo [13] [(12)(33)]) 1
-- Nothing
excentricidad Ord a =gt Grafo a -gt a -gt Maybe Int
excentricidad g u
| esGrafoNulo g = Nothing
| orden g == 1 = Just 0
| Nothing `elem` distancias = Nothing
| otherwise = maximum distancias
where distancias = [distancia g u v | v lt- vertices g [u]]
La funcioacuten (excentricidades g) devuelve la lista ordenada de las excentricidadesde los veacutertices del grafo g
-- | Ejemplos
-- gtgtgt excentricidades (creaGrafo [13] [(12)(23)(33)])
-- [Just 1Just 2Just 2]
-- gtgtgt excentricidades (creaGrafo [13] [(12)(33)])
-- [NothingNothingNothing]
excentricidades Ord a =gt Grafo a -gt [Maybe Int]
excentricidades g = sort (map (excentricidad g) (vertices g))
385 Diaacutemetro
Definicioacuten 386 Sea G = (V A) un grafo Se define el diaacutemetro de G como el maacuteximo delas distancias entre los veacutertices en V Lo denotaremos por d(G)
La funcioacuten (diametro g) devuelve el diaacutemetro del grafo g
-- | Ejemplos
-- gtgtgt diametro (creaGrafo [13] [(12)(23)(33)])
-- Just 2
-- gtgtgt diametro (creaGrafo [13] [(12)(33)])
-- Nothing
diametro Ord a =gt Grafo a -gt Maybe Int
38 Conectividad de los grafos 103
diametro g
| esGrafoNulo g = Nothing
| Nothing `elem` distancias = Nothing
| otherwise = maximum distancias
where vs = vertices g
distancias = [distancia g u v | u lt- vs v lt- vs u lt= v]
386 Radio
Definicioacuten 387 Sean G = (V A) un grafo y v isin V Se define el radio de G como elmiacutenimo de las excentricidades de sus veacutertices Lo denotaremos por r(G)
La funcioacuten (radio g) devuelve el radio del grafo g
-- | Ejemplos
-- gtgtgt radio (creaGrafo [13] [(12)(23)(33)])
-- Just 1
-- gtgtgt radio (creaGrafo [13] [(12)(33)])
-- Nothing
radio Ord a =gt Grafo a -gt Maybe Int
radio g
| esGrafoNulo g = Nothing
| Nothing `elem` ds = Nothing
| otherwise = minimum ds
where ds = [excentricidad g v | v lt- vertices g]
387 Centro
Definicioacuten 388 Sean G = (V A) un grafo Llamamos centro del grafo G al conjunto deveacutertices de excentricidad miacutenima A estos veacutertices se les denomina veacutertices centrales
La funcioacuten (centro g) devuelve el centro del grafo g Por ejemplo
-- | Ejemplos
-- gtgtgt centro (creaGrafo [13] [(12)(23)(33)])
-- [2]
-- gtgtgt centro (creaGrafo [13] [(12)(13)(23)])
-- [123]
-- gtgtgt centro (creaGrafo [13] [(12)(33)])
-- [123]
centro Ord a =gt Grafo a -gt [a]
centro g = [v | v lt- vertices g excentricidad g v == r]
where r = radio g
104 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
388 Grosor
Definicioacuten 389 Sean G = (V A) un grafo Se llama grosor o cintura del grafo G almiacutenimo de las longitudes de los ciclos de G Si el grafo no posee ciclos (es decir es un grafoaciacuteclico) se dice que su cintura es infinita
La funcioacuten (grosor g) devuelve el grosor del grafo g
-- | Ejemplos
-- gtgtgt grosor (creaGrafo [123] [(12)(23)])
-- Nothing
-- gtgtgt grosor (creaGrafo [123] [(11)(12)(23)(34)])
-- Just 0
-- gtgtgt grosor grafoPetersen
-- Just 5
-- gtgtgt grosor grafoMoebiusCantor
-- Just 6
-- gtgtgt grosor grafoHeawood
-- Just 6
-- gtgtgt grosor grafoMcGee
-- Just 7
-- gtgtgt grosor grafoTutteCoxeter
-- Just 8
grosor Ord a =gt Grafo a -gt Maybe Int
grosor g
| esAciclico g = Nothing
| otherwise = Just (minimum [longitudCamino (head yss)
| x lt- vertices g
let yss = todosCiclos g x
not (null yss)])
Propiedades del grosor de los grafos
Teorema 3810 El grosor del grafo ciclo de orden n Cn es infin si n lt 3 y 3 en caso contrario
La propiedad se expresa por
prop_grosor_grafoCiclo Int -gt Bool
prop_grosor_grafoCiclo n =
grosor (grafoCiclo n) == if n lt 3
then Nothing
else Just n
Su comprobacioacuten para n le 30 es
ghcigt all prop_grosor_grafoCiclo [130]
True
Teorema 3811 El grosor del grafo amistad de orden n es 3 para todo n
38 Conectividad de los grafos 105
prop_grosor_grafoAmistad Int -gt Bool
prop_grosor_grafoAmistad n =
grosor (grafoAmistad n) == Just 3
Su comprobacioacuten para n le 30 es
ghcigt all prop_grosor_grafoAmistad [130]
True
Teorema 3812 El grosor del grafo completo de orden n Kn es infin si n lt 3 y 3 en casocontrario
La propiedad se expresa por
prop_grosor_completo Int -gt Bool
prop_grosor_completo n =
grosor (completo n) == if n lt 3
then Nothing
else Just 3
Su comprobacioacuten para n le 30 es
ghcigt all prop_grosor_completo [130]
True
Teorema 3813 El grosor del grafo bipartito completo de orden Kmn es infin si m = 1 oacuten = 1 y es 4 en caso contrario y 3 en caso contrario
La propiedad se expresa por
prop_grosor_bipartitoCompleto Int -gt Int -gt Bool
prop_grosor_bipartitoCompleto m n =
grosor (bipartitoCompleto m n) == if m == 1 || n == 1
then Nothing
else Just 4
Su comprobacioacuten para 1 le m le n le 15 es
ghcigt and [prop_grosor_bipartitoCompleto m n | m lt- [115] n lt- [m15]]
True
Teorema 3814 El grosor del grafo rueda de orden n Wn es infin si n lt 3 y 3 en caso contrario
La propiedad se expresa por
prop_grosor_grafoRueda Int -gt Bool
prop_grosor_grafoRueda n =
grosor (grafoRueda n) == if n lt 3
then Nothing
else Just 3
106 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Su comprobacioacuten para 1 le n le 30 es
ghcigt all prop_grosor_grafoRueda [130]
True
389 Propiedades e invariantes por isomorfismos
Teorema 3815 Sean G = (V A) y Gprime = (Vprime Aprime) grafos isomorfos con φ V rarr Vprime unisomorfismo Entonces dados u v isin V u sim v si y solamente si φ(u) sim φ(v)
La comprobacioacuten del teorema con QuickCheck es
ghcigt quickCheck prop_ConexionIsomorfismo1
+++ OK passed 100 tests
prop_ConexionIsomorfismo1 Grafo Int -gt Grafo Int -gt Bool
prop_ConexionIsomorfismo1 g h =
not (isomorfos g h) ||
and [ec g u v == ec h (imagen phi u) (imagen phi v)
| u lt- vs
v lt- vs
phi lt- isomorfismos g h]
where vs = vertices g
ec = estanConectados
Teorema 3816 Sean G = (V A) y Gprime = (Vprime Aprime) grafos isomorfos con φ V rarr Vprime unisomorfismo Entonces φ lleva cada componente conexa de G en una componente conexa deGprime
La comprobacioacuten del teorema con QuickCheck es
ghcigt quickCheck prop_ConexionIsomorfismo2
+++ OK passed 100 tests
prop_ConexionIsomorfismo2 Grafo Int -gt Grafo Int -gt Bool
prop_ConexionIsomorfismo2 g h =
not(isomorfos g h) ||
and [conjuntosIguales cch (aux f) | f lt- isomorfismos g h]
where cch = componentesConexas h
ccg = componentesConexas g
aux f = map (sort imagenConjunto f) ccg
Teorema 3817 Sean G = (V A) y Gprime = (Vprime Aprime) grafos isomorfos con φ V rarr Vprime unisomorfismo Entonces G y Gprime tienen el mismo nuacutemero de componentes conexas
La comprobacioacuten del teorema con QuickCheck es
38 Conectividad de los grafos 107
ghcigt quickCheck prop_ConexionIsomorfismo3
+++ OK passed 100 tests
prop_ConexionIsomorfismo3 Grafo Int -gt Grafo Int -gt Bool
prop_ConexionIsomorfismo3 g h =
not (isomorfos g h) ||
numeroComponentes g == numeroComponentes h
Teorema 3818 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que el diaacutemetro de G es igual al diaacutemetro de Gprime es decir el diaacutemetrode un grafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos diametro)
+++ OK passed 100 tests
Teorema 3819 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces se verifica que el radio de G es igual al radio de Gprime es decir el radio de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos radio)
+++ OK passed 100 tests
Teorema 3820 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que el grosor de G es igual al grosor de Gprime es decir el grosor de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos grosor)
+++ OK passed 100 tests
Teorema 3821 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que el centro de G es igual al centro de Gprime es decir el centro de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos centro)
+++ OK passed 100 tests
Teorema 3822 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces se verifica que el nuacutemero de componentes conexas de G es igual al nuacutemerode las de Gprime es decir el nuacutemero de componentes conexas de un grafo es un invariante porisomorfismos
108 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos numeroComponentes)
+++ OK passed 100 tests
Teorema 3823 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que los valores que toman las excentricidades de los veacutertices G esigual al de los veacutertices de Gprime es decir el conjunto de valores que toman las excentricidadesde los veacutertices es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos excentricidades)
+++ OK passed 100 tests
Capiacutetulo 4
Matrices asociadas a grafos
En este capiacutetulo se definiraacuten algunas representaciones de grafos como matrices secomprobaraacuten sus propiedades y volveremos a definir algunos conceptos del capiacutetu-lo 3 ahora utilizando matricesPara elaborar el contenido del capiacutetulo utilizareacute el segundo tema del trabajo fin degrado de Fco Javier Franco Galviacuten Aspectos algebraicos en teoriacutea de grafos ([7]) En eltrabajo el autor introduce los conceptos de matriz de adyacencia matriz de incidenciay otras matrices asociadas a grafos
41 Generador de grafos simples
En esta seccioacuten presentaremos el generador de grafos que nos permitiraacute generargrafos simples como listas de aristas arbitrariamente y usarlos como ejemplos opara comprobar propiedades en la seccioacuten de matrices asociadas a grafos(grafoSimple) es un generador de grafos simples de hasta 10 veacutertices Por ejemplo
ghcigt sample grafoSimple
G [12345678] [(14)(15)(16)(17)(18)(23)
(24)(25)(27)(35)(37)(45)(46)(56)(67)]
G [123456789] [(14)(18)(23)(25)(29)
(34)(35)(36)(38)(39)(46)(48)(49)
(58)(59)(69)(78)]
G [123456] [(12)(13)(24)(25)(26)(35)(56)]
G [1234567] [(12)(13)(14)(24)(25)(26)
(36)(45)(46)(67)]
G [1234] [(13)(14)(23)(34)]
G [123] [(23)]
G [12] [(12)]
G [123456] [(16)(24)(26)(35)(36)(56)]
G [123456789] [(12)(14)(15)(16)(17)(24)
(34)(37)(38)(39)(45)(47)(49)(56)(57)
(58)(59)(67)(69)(78)(79)]
109
110 Capiacutetulo 4 Matrices asociadas a grafos
G [123456789] [(13)(14)(15)(16)(23)(24)
(29)(35)(39)(45)(47)(48)(49)(57)(58)
(59)(67)(68)(69)(79)]
G [1] []
grafoSimple Gen (Grafo Int)
grafoSimple = do
n lt- choose (010)
as lt- sublistOf [(xy) | x lt- [1n] y lt- [x+1n]]
return (creaGrafo [1n] as)
42 Matrices de adyacencia
421 Definicioacuten y propiedades
Usaremos la funcioacuten (imprimeMatriz p) para imprimir por pantalla la matriz p conuna fila por liacutenea
-- | Ejemplo
-- gtgtgt imprimeMatriz (fromLists [[134][357][479]])
-- [134]
-- [357]
-- [479]
imprimeMatriz Show a =gt Matrix a -gt IO ()
imprimeMatriz p =
mapM_ print (toLists p)
Definicioacuten 421 Sea G = (V A) un grafo simple con V = v1 vn Se define sumatriz de adyacencia como Antimesn = (aij) donde el elemento aij toma el valor 1 si existealguna arista en A uniendo los veacutertices vi y vj y 0 en caso contrario
Nota 421 La matriz de adyacencia depende del etiquetado del grafo
La funcioacuten (matrizAdyacencia g) es la matriz de adyacencia del grafo g
-- | Ejemplo
-- gtgtgt imprimeMatriz (matrizAdyacencia (grafoCiclo 4))
-- [0101]
-- [1010]
-- [0101]
-- [1010]
-- gtgtgt imprimeMatriz (matrizAdyacencia (completo 4))
-- [0111]
-- [1011]
-- [1101]
-- [1110]
42 Matrices de adyacencia 111
matrizAdyacencia Grafo Int -gt Matrix Int
matrizAdyacencia g = matrix n n f
where n = orden g
f (ij) | (ij) `aristaEn` g = 1
| otherwise = 0
422 Propiedades baacutesicas de las matrices
La funcioacuten (esSimetrica p) se verifica si la matriz p es simeacutetrica
-- ejemplo
-- gtgtgt esSimetrica (fromLists [[134][357][479]])
-- True
-- gtgtgt esSimetrica (fromLists [[134][357][497]])
-- False
esSimetrica Eq a =gt Matrix a -gt Bool
esSimetrica p =
transpose p == p
La funcioacuten (potencia p n) devuelvela potencia nndasheacutesima de la matriz cuadrada p
-- Ejemplo
-- gtgtgt potencia (fromLists [[134][357][479]]) 3
-- ( 408 735 975 )
-- ( 735 1323 1755 )
-- ( 975 1755 2328 )
potencia Num a =gt Matrix a -gt Int -gt Matrix a
potencia p 1 = p
potencia p n = if (odd n)
then (m p (potencia (m p p) (div (n-1) 2)))
else (potencia (m p p) (div (n-1) 2))
where m = multStd2
423 Propiedades de las matrices de adyacencia
Teorema 422 Para todo n la matriz de adyacencia del grafo ciclo de orden n Cn es simeacute-trica
ghcigt all prop_simetricaAdyacenciaCompleto [130]
True
prop_simetricaAdyacenciaCompleto Int -gt Bool
prop_simetricaAdyacenciaCompleto n =
esSimetrica (matrizAdyacencia (completo n))
La funcioacuten (tamantildeoM g) devuelve el tamantildeo del grafo simple g calculado usandosu matriz de adyacencia
112 Capiacutetulo 4 Matrices asociadas a grafos
-- | Ejemplos
-- gtgtgt tamantildeoM (grafoCiclo 4)
-- 4
-- gtgtgt tamantildeoM grafoPetersen
-- 15
tamantildeoM Grafo Int -gt Int
tamantildeoM g = sum (toList (matrizAdyacencia g)) `div` 2
Teorema 423 El tamantildeo de un grafo simple es la mitad de la suma de los elementos de sumatriz de adyacencia
La comprobacioacuten del teorema con QuickCheck es
ghcigt quickCheck prop_tamantildeoMatriz
+++ OK passed 100 tests
prop_tamantildeoMatriz Property
prop_tamantildeoMatriz =
forAll grafoSimple
(g -gt tamantildeo g == tamantildeoM g)
Teorema 424 Si un grafo G = (V A) tiene un veacutertice aislado vi tanto la fila como lacolumna indasheacutesima de su matriz de adyacencia estaraacuten formadas por ceros
esAisladoM Grafo Int -gt Int -gt Bool
esAisladoM g v = if (all (==0)
(((toLists (ma g)) (v-1))
++((toLists (t (ma g))) (v-1))))
then True
else False
where ma = matrizAdyacencia
t = transpose
La comprobacioacuten del teorema es
ghcigt quickCheck prop_esAisladoMatriz
+++ OK passed 100 tests
prop_esAisladoMatriz Property
prop_esAisladoMatriz =
forAll grafoSimple
(g -gt and [esAislado g v == esAisladoM g v
| v lt- vertices g])
Teorema 425 Sea un grafo G = (V A) simple no dirigido con V = v1 vn Lasuma de los elementos de la fila (o columna) indasheacutesima de su matriz de adyacencia coincide conel grado del veacutertice vi Es decir
42 Matrices de adyacencia 113
δ(vi) =n
sumj=1
aij =n
sumj=1
aji
gradoM Grafo Int -gt Int -gt Int
gradoM g v = sum ((toLists (ma g)) (v-1))
where ma = matrizAdyacencia
La comprobacioacuten del teorema es
ghcigt quickCheck prop_gradoMatriz
+++ OK passed 100 tests
prop_gradoMatriz Property
prop_gradoMatriz =
forAll grafoSimple
(g -gt and [grado g v == gradoM g v | v lt- vertices g])
Teorema 426 Sea G = (V A) un grafo bipartito de conjuntos de veacutertices disjuntosV1 = v1 vk y V2 = vk+1 vn tal que V = V1 cup V2 y soacutelo existen aristasque conectan veacutertices de V1 con veacutertices de V2 Entonces con este etiquetado de V la matrizde adyacencia de G tiene la forma
A =
(θ BBt θ
)
prop_BipartitoMatriz Grafo Int -gt Property
prop_BipartitoMatriz g =
esBipartito g ==gt
all (==0) [ getElem u v m | [uv] lt- (f (fromJust p))]
where f (xsys) = filter p (subsequences xs ++ subsequences ys)
where p zs = length zs == 2
p = conjuntosVerticesDisjuntos g
m = matrizAdyacencia g
424 Caminos y arcos
En esta seccioacuten se presentaraacute la informacioacuten que contiene la matriz de adyacenciade un grafo en relacioacuten a los caminos que se encuentran en eacutel
Teorema 427 Sea G = (V A) un grafo con V = v1 vn y matriz de adyacenciaA = (aij) Entonces forallk ge 0 el elemento (i j) de Ak que denotaremos por ak
ij es elnuacutemero de caminos de longitud k desde el veacutertice vi al veacutertice vj
114 Capiacutetulo 4 Matrices asociadas a grafos
numeroCaminosDeLongitudM Grafo Int -gt Int -gt Int -gt Int -gt Int
numeroCaminosDeLongitudM g u v k = getElem u v mk
where ma = matrizAdyacencia g
n = orden g
mk = foldr (multStd2) (identity n) (take k (repeat ma))
La comprobacioacuten del teorema para k le 6 es
ghcigt quickCheck prop_numeroCaminosMatriz
+++ OK passed 100 tests
prop_numeroCaminosMatriz Grafo Int -gt Gen Bool
prop_numeroCaminosMatriz g = do
k lt- choose (06)
let vs = vertices g
return (and [ numeroCaminosDeLongitud g u v k ==
numeroCaminosDeLongitudM g u v k
|(uv) lt- productoCartesiano vs vs u lt v])
De este teorema se deducen las siguientes propiedades
Teorema 428 Sea G un grafo simple Siguiendo la notacioacuten del teorema anterior se tieneque1 a(2)ii = δ(vi)
2 a(3)ii es el nuacutemero de triaacutengulos que contienen al veacutertice vi
gradoCaminosM Grafo Int -gt Int -gt Int
gradoCaminosM g v = getElem v v m2
where m = matrizAdyacencia g
m2 = multStd2 m m
numeroTriangulosM Grafo Int -gt Int -gt Int
numeroTriangulosM g v = getElem v v (potencia m 3)
where m = matrizAdyacencia g
La comprobacioacuten con QuickCheck es
ghcigt quickCheck prop_GradoCaminosMatriz
+++ OK passed 100 tests
ghcigt quickCheck prop_TriangulosMatriz
+++ OK passed 100 tests
prop_GradoCaminosMatriz Grafo Int -gt Bool
prop_GradoCaminosMatriz g =
and [ grado g v == gradoCaminosM g v | v lt- vertices g]
42 Matrices de adyacencia 115
prop_TriangulosMatriz Property
prop_TriangulosMatriz =
forAll grafoSimple
(g -gt and [length (triangulos g v) ==
numeroTriangulosM g v | v lt- vertices g])
116 Capiacutetulo 4 Matrices asociadas a grafos
Capiacutetulo 5
Apeacutendices
51 Sistemas utilizados
El desarrollo de mi Trabajo de Fin de Grado requeriacutea de una infraestructura teacutecnicaque he tenido que trabajar antes de comenzar a desarrollar el contenido A conti-nuacioacuten voy a nombrar y comentar los sistemas y paquetes que he utilizado a lolargo del proyectobull Ubuntu como sistema operativo El primer paso fue instalar Ubuntu en mi orde-
nador portaacutetil personal Para ello seguiacute las recomendaciones de mi compantildeeroEduardo Paluzo quien ya lo habiacutea hecho antesPrimero me descargueacute la imagen del sistema Ubuntu 1604 LTS (para procesadorde 64 bits) desde la paacutegina de descargas de Ubuntu 1 y tambieacuten la herramientaLinuxLive USB Creator 2 que transformariacutea mi pendrive en una unidad USB Boo-teable cargada con la imagen de Ubuntu Una vez tuve la unidad USB preparadaprocediacute a instalar el nuevo sistema apagueacute el dispositivo y al encenderlo entreacuteen el Boot Menu de la BIOS del portaacutetil para arrancar desde el Pendrive en vez dehacerlo desde el disco duro Automaacuteticamente comenzoacute la instalacioacuten de Ubuntuy solo tuve que seguir las instrucciones del asistente para montar Ubuntu mante-niendo ademaacutes Windows 10 que era el sistema operativo con el que habiacutea estadotrabajando hasta ese momentoEl resultado fue un poco agridulce pues la instalacioacuten de Ubuntu se habiacutea reali-zado con eacutexito sin embargo al intentar arrancar Windows desde la nueva GRUBme daba un error al cargar la imagen del sistema Despueacutes de buscar el error queme apareciacutea en varios foros encontreacute una solucioacuten a mi problema deshabiliteacute elSecurity Boot desde la BIOS y pude volver a arrancar Windows 10 con normali-dad
1httpwwwubuntucomdownloaddesktop2httpwwwlinuxliveusbcom
117
118 Capiacutetulo 5 Apeacutendices
bull LATEX como sistema de composicioacuten de textos La distribucioacuten de LATEXTex Livecomo la mayoriacutea de software que he utilizado la descargueacute utilizando el Gestorde Paquetes Synaptic Anteriormente soacutelo habiacutea utilizado TexMaker como editorde LATEX asiacute que fue el primero que descargueacute Maacutes tarde mi tutor Joseacute Antoniome sugirioacute que mejor descargara el paquete AUCTex pues me permitiriacutea trabajarcon archivos TEX desde el editor Emacs asiacute lo hice y es el que he utilizado pararedactar el trabajo Ademaacutes de los que me recomendaba el gestor solo he tenidoque descargarme el paquete spanish de babel para poder componer el trabajo puesel paquete Tikz que he utilizado para representar los grafos veniacutea incluido en lassugerencias de Synapticbull Haskell como lenguaje de programacioacuten Ya habiacutea trabajado anteriormente con
este lenguaje en el grado y sabiacutea que soacutelo teniacutea que descargarme la plataforma deHaskell y podriacutea trabajar con el editor Emacs Seguiacute las indicaciones que se dan alos estudiantes de primer curso en la paacutegina del Dpto de Ciencias de la Compu-tacioacuten e Inteligencia Artificial 3 y me descargueacute los paquetes haskell-platform yhaskell-mode desde el Gestor de Paquetes Synaptic La versioacuten de la plataforma deHaskell con la que he trabajado es la 2014200debian2 y la del compilador GHC la7103-7bull Dropbox como sistema de almacenamiento compartido Ya habiacutea trabajado con
Dropbox en el pasado asiacute que crear una carpeta compartida con mis tutores nofue ninguacuten problema sin embargo al estar Dropbox sujeto a software no libre nome resultoacute tan sencillo instalarlo en mi nuevo sistema En primer lugar intenteacutehacerlo directamente desde Ubuntu Software que intentoacute instalar Dropbox Nauti-lus y abrioacute dos instalaciones en paralelo Se quedoacute colgado el ordenador asiacute quemateacute los procesos de instalacioacuten activos reinicieacute el sistema y me descargueacute direc-tamente el paquete de instalacioacuten desde la paacutegina de descargas de Dropbox 4 y loejecuteacute desde la terminalbull Git como sistema remoto de control de versiones Era la primera vez que trabaja-
ba con Git y me costoacute bastante adaptarme Mi tutor Joseacute Antonio y mi compantildeeroEduardo Paluzo me ayudaron mucho e hicieron el proceso de adaptacioacuten muchomaacutes aacutegil El manual que Eduardo ha redactado y presenta en su Trabajo Fin deGrado me ha sido muy uacutetil es una pequentildea guiacutea que cualquier interesado en elempleo de Git puede utilizar como introduccioacuten La instalacioacuten no resultoacute com-plicada a traveacutes del Gestor de Paquetes Synaptic me descargueacute el paquete elpa-magity todos los demaacutes paquetes necesarios para trabajar con Git en mi portaacutetil usandoel editor Emacs Eduardo me ayudoacute a crear el repositorio MDenHaskell en la plata-forma GitHub y clonarlo en mi ordenador personal Dicho repositorio contiene el
3httpwwwcsuses~jalonsocursosi1m-15sistemasphp4httpswwwdropboxcomesinstallos=lnx
52 Mapa de decisiones de disentildeo en conjuntos 119
total del trabajo y se almacena de forma puacuteblica La versioacuten de Magit que utilizoes la 250-2
52 Mapa de decisiones de disentildeo en conjuntos
Una vez comenzado el trabajo y habiendo hecho ya varias secciones acerca de laTeoriacutea de Grafos se puso de manifiesto la conveniencia de crear nuevos capiacutetulosintroduciendo conceptos de la Teoriacutea de Conjuntos y las relaciones que se puedenpresentar entre sus elementosHaskell tiene una libreriacutea especiacutefica para conjuntos DataSet sin embargo no estan intuitiva ni tan eficiente como la de listas (DataList) A lo largo del proyecto hecreado un moacutedulo que permite trabajar con conjuntos utilizando tanto su represen-tacioacuten como listas ordenadas sin elementos repetidos como su representacioacuten comolistas sin elementos repetidos Dicho moacutedulo se llama Conjuntos y lo presento en elprimer capiacutetulo del Trabajo
53 Mapa de decisiones de disentildeo en grafos
Al comienzo del proyecto la idea era que las primeras representaciones con lasque trabajara fueran las de grafos como vectores de adyacencia y grafos como matricesde adyacencia que se utilizan en Informaacutetica en el primer curso del Grado con lasque ya habiacutea trabajado y estaba familiarizadaLas definiciones de Informaacutetica estaacuten pensadas para grafos ponderados (dirigidoso no seguacuten se eligiera) mientras que en Matemaacutetica Discreta apenas se usan grafosdirigidos o ponderados por tanto el primer cambio en la representacioacuten utilizadafue simplificar las definiciones de modo que solo trabajaacuteramos con grafos no diri-gidos y no ponderados pero manteniendo las estructuras vectorial y matricial quemanteniacutean la eficienciaLas representaciones que utilizan arrays en Haskell son muy restrictivas pues soloadmiten vectores y matrices que se puedan indexar lo que hace muy complicadostodos los algoritmos que impliquen alguacuten cambio en los veacutertices de los grafos yademaacutes no permite trabajar con todos los tipos de veacutertices que pudieacuteramos desearDecidimos volver a cambiar la representacioacuten y esta vez nos decantamos por larepresentacioacuten de grafos como listas de aristas perdiendo en eficiencia pero ganandomucho en flexibilidad de escrituraPor uacuteltimo mis tutores sugirieron dar una representacioacuten de los grafos mediantesus matrices de adyacencia y comprobar la equivalencia de las definiciones que yahabiacutea hecho en otros moacutedulos con las dadas para esta representacioacuten Para ello he
120 Capiacutetulo 5 Apeacutendices
trabajado con la libreriacutea DataMatrix de Haskell
Bibliografiacutea
[1] J Alonso Temas de programacioacuten funcional Technical report Univ de Sevilla2015
[2] P Burzyn Complejidad computacional en problemas de modificacioacuten de aris-tas en grafos Technical report Univ de Buenos Aires
[3] K Claessen and J Hughes QuickCheckA Lightweight Tool for Random Tes-ting of Haskell Programs Technical report Chalmers University of Technology2000
[4] M Caacuterdenas Matemaacutetica discreta Technical report Univ de Sevilla 2015
[5] D de Matemaacuteticas El regalo de Cantor Technical report IES Matarrantildea deValderrobres 2009
[6] D de Aacutelgebra Aacutelgebra Baacutesica tema 1 Conjuntos Technical report Univ deSevilla 2015
[7] F Franco Aspectos algebraicos en Teoriacutea de Grafos Technical report Univ deSevilla 2016
[8] F Rabhi and G Lapalme Algorithms A functional programming approachAddison-Wesley Longman Publishing Co Inc Boston MA USA 1st edition1999
[9] P Vasconcelos Property Testing using QuickCheck Technical report Univer-sidade do Porto 2016
[10] Wikipedia Set (mathematics) Technical report Wikipedia La Enciclopedialibre 2016
[11] Wikipedia AnexoGaleriacutea de grafos Technical report Wikipedia La Enciclo-pedia libre 2016
[12] Wikipedia Teoriacutea de la complejidad computacional Technical report Wikipe-dia La Enciclopedia libre 2017
121
Iacutendice alfabeacutetico
Grafo 18 52adyacentes 53antiImagenRelacion 38aristaEn 53aristasCamino 88aristas 53automorfismos 87bipartitoCompleto 58biyecciones 47cardinal 22 31centro 103clasesEquivalencia 43combinaciones 25 34complementario 22 31completo 58componentesConexas1 97componentesConexas2 98componentesConexas3 98conjuntosIguales 30conjuntosIguales 21conjuntosVerticesDisjuntos 59conservaAdyacencia 78creaGrafo 52diametro 102distancia 93dominio 38eliminaArista 74eliminaLazos 74eliminaVertice 74elimina 19 28entorno 69esAisladoM 112
esAislado 69esAntisimetrica 41esAutomorfismo 86esBipartito 60esCamino 87esCerrado 94esCircuito 95esCompleto 77esConexo 100esFuncional 39esFuncion 43esGeodesica 94esInyectiva 45esIsomorfismo 81esLazo 69esReflexiva 40esRegular 70esRelacionEquivalencia 42esRelacionHomogenea 39esRelacionOrden 43esRelacion 37esSimetrica 41 111esSimple 70esSobreyectiva 45 46esSubconjuntoPropio 21 30esSubconjunto 20 29esSubgrafoMax 72esSubgrafoPropio 72esSubgrafo 72esTransitiva 41esUnitario 23 32esVacio 18 27
122
Iacutendice alfabeacutetico 123
estaRelacionado 40estanConectados 93excentricidades 102excentricidad 102funciones 44generaGrafo 54gradoM 113 114grado 69grafoAmistad 57grafoCiclo 56grafoCirculante 61grafoComplementario 77grafoEstrella 60grafoHeawood 64grafoMcGee 64grafoMoebiusCantor 67grafoNulo 55grafoPetersenGen 62grafoPetersen 66grafoRueda 61grafoSimple 110grafoThomson 63grafoTutteCoxeter 65grosor 104imagenConjunto 45imagenInversa 47imagenRelacion 38imagen 44imprimeMatriz 110inserta 18 27interseccion 33interseccion 24inversa 47isomorfismos 82isomorfos 82longitudCamino 88matrizAdyacencia 110minimoElemento 19 28morfismos 79
numeroArcosDeLongitud 92numeroCaminosDeLongitud 89numeroCaminosDeLongitugM 113numeroComponentesConexas 99numeroTriangulosM 114orden 68parDeVertices 91pertenece 19 28potencia 111productoCartesiano 34productoCartesiano 25prop_HavelHakimi 73prop_LemaApretonDeManos 73prop_completos 76prop_BipartitoMatriz 113prop_ConectadosRelEqui 97prop_ConexionIsomorfismo1 106prop_ConexionIsomorfismo2 106prop_ConexionIsomorfismo3 107prop_GradoMatriz 114prop_TriangulosMatriz 114prop_esAisladoMatriz 112prop_gradoMatriz 113prop_numeroCaminosMatriz 114prop_simetricaAdyacenciaCompleto 111prop_tamantildeoMatriz 112prop_todosArcosBA 92radio 103rango 38secuenciaGrados 71secuenciaGrafica 71sinRepetidos 19 29sonIncidentes 68sumaArista 75sumaGrafos 76 77sumaVertice 75tamantildeoM 111tamantildeo 68todosArcosBA 91
124 Iacutendice alfabeacutetico
todosArcos 90todosCaminos 88todosCiclos 96triangulos 94unionConjuntos 23 32unionGeneral 24 33vacio 18 27valenciaMax 70valenciaMin 70variaciones 26 35verticesCamino 88vertices 53
4 Iacutendice general
1223 Interseccioacuten de conjuntos 331224 Producto cartesiano 341225 Combinaciones 341226 Variaciones con repeticioacuten 35
13 Eleccioacuten de la representacioacuten de conjuntos 35
2 Relaciones y funciones 37
21 Relaciones 37211 Relacioacuten binaria 37212 Imagen por una relacioacuten 37213 Dominio de una relacioacuten 38214 Rango de una relacioacuten 38215 Antiimagen por una relacioacuten 38216 Relacioacuten funcional 39
22 Relaciones homogeacuteneas 39221 Relaciones reflexivas 40222 Relaciones simeacutetricas 40223 Relaciones antisimeacutetricas 41224 Relaciones transitivas 41225 Relaciones de equivalencia 42226 Relaciones de orden 42227 Clases de equivalencia 43
23 Funciones 43231 Imagen por una funcioacuten 44232 Funciones inyectivas 45233 Funciones sobreyectivas 45234 Funciones biyectivas 46235 Inversa de una funcioacuten 47
3 Introduccioacuten a la teoriacutea de grafos 49
31 Definicioacuten de grafo 50
32 El TAD de los grafos 50321 Grafos como listas de aristas 51
33 Generador de grafos 54
34 Ejemplos de grafos 55341 Grafo nulo 55342 Grafo ciclo 56343 Grafo de la amistad 56
Iacutendice general 5
344 Grafo completo 57345 Grafo bipartito 58346 Grafo estrella 60347 Grafo rueda 60348 Grafo circulante 61349 Grafo de Petersen generalizado 623410 Otros grafos importantes 63
35 Definiciones y propiedades 67351 Definiciones de grafos 68352 Propiedades de grafos 73353 Operaciones y propiedades sobre grafos 73
36 Morfismos de grafos 78361 Morfismos 78362 Complejidad del problema de homomorfismo de grafos 80363 Isomorfismos 81364 Automorfismos 86
37 Caminos en grafos 87371 Definicioacuten de camino 87372 Recorridos 89373 Caminos simples 89374 Conexioacuten 93375 Distancia 93376 Caminos cerrados 94377 Circuitos 95378 Ciclos 95379 Grafos aciacuteclicos 96
38 Conectividad de los grafos 97381 Estar conectados por un camino 97382 Componentes conexas de un grafo 97383 Grafos conexos 100384 Excentricidad 102385 Diaacutemetro 102386 Radio 103387 Centro 103388 Grosor 104389 Propiedades e invariantes por isomorfismos 106
6 Iacutendice general
4 Matrices asociadas a grafos 109
41 Generador de grafos simples 109
42 Matrices de adyacencia 110421 Definicioacuten y propiedades 110422 Propiedades baacutesicas de las matrices 111423 Propiedades de las matrices de adyacencia 111424 Caminos y arcos 113
5 Apeacutendices 117
51 Sistemas utilizados 117
52 Mapa de decisiones de disentildeo en conjuntos 119
53 Mapa de decisiones de disentildeo en grafos 119
Bibliografiacutea 121
Indice de definiciones 121
Agradecimientos
Quisiera agradecer a todas las personas que me han apoyado y prestado sus co-nocimientos a lo largo de estos cuatro antildeos del grado Gracias a ellos el esfuerzo hamerecido la pena
En primer lugar me gustariacutea destacar a Mariacutea Joseacute Hidalgo Doblado y Joseacute An-tonio Alonso Jimeacutenez mi tutores en este Trabajo de Fin de Grado Les agradezco detodo corazoacuten la constancia y la atencioacuten que me han brindado a pesar de las dificul-tades que supone realizar el proyecto durante un curso en el que estoy disfrutandola oportunidad de la movilidad internacional Erasmus Son para miacute un referente y unclaro ejemplo de lo que se puede conseguir con esfuerzo y trabajo en equipo
Seguidamente expresar mi gratitud al resto de profesores y trabajadores de la Uni-versidad de Sevilla especialmente a aquellos que se esfuerzan por mejorar la institu-cioacuten diacutea a diacutea
Quiero agradecer tambieacuten este trabajo a mi familia en especial a mis padres que meapoyaron desde el principio cuando tomeacute la decisioacuten de cambiar de carrera y siemprehan intentado brindarnos a mi hermana y a miacute con lo mejor
Finalmente a mis amigos y compantildeeros que han hecho de esta primera etapa uni-versitaria un capiacutetulo de mi vida lleno de bonitos recuerdos En especial a Pedro conquien he tenido la suerte de compartir todo
Muchas gracias a todos
7
8 Iacutendice general
Abstract
Discrete mathematics is characterized as the branch of mathematics dealing withfinite and numerable sets Concepts and notations from discrete mathematics are use-ful in studying and describing objects and real-life problems In particular the graphtheory has numerous applications in logistics
Throughout this project some of the knowlegde adquired from the course ldquoMa-temaacutetica Discretardquo will be given a computational implementation The code will bewritten in Haskell language and a free version of it will be available in GitHub underthe name MDenHaskell The work will focus on the graph theory and will provide so-me examples and algorithms in order to give an introduction of it and how it can beimplemented in Haskell
At first two chapters will be presented as a gentle reminder of basic concepts rela-ted to the set theory and the relations that can be established among them The thirdchapter will introduce the main topic graph theory with different representationsdefinitions and examples on graphs It will go through aspects such as morphismconnectivity and paths in graphs Finally some properties and advantages of workingwith adjacency matrices will be presented in the fourth chapter
This project leaves the door open for the community of programmers to continueand improve it It can be used as a self-learning tool as well as to make calculationsthat by hand would be tedious
9
10 Iacutendice general
Introduccioacuten
El objetivo del trabajo es la implementacioacuten de algoritmos de matemaacutetica discretaen Haskell Los puntos de partida son
los temas de la asignatura ldquoMatemaacutetica discretardquo ([4])los temas de la asignatura ldquoInformaacuteticardquo ([1])el capiacutetulo 7 del libro ldquoAlgorithms A functional programming approachrdquo ([8]) yel artiacuteculo ldquoGraph theoryrdquo ([11]) de la WikipediaHaskell es un lenguaje de programacioacuten funcional desarrollado en los uacuteltimos antildeos
por la comunidad de programadores con la intencioacuten de usarlo como instrumentopara la ensentildeanza de programacioacuten funcional La motivacioacuten de este desarrollo eshacer el anaacutelisis y disentildeo de programas maacutes simple y permitir que los algoritmos seanfaacutecilmente adaptables a otros lenguajes de programacioacuten funcionales
En comparacioacuten con otros lenguajes de programacioacuten imperativos la sintaxis deHaskell permite definir funciones de forma maacutes clara y compacta En Haskell las fun-ciones se consideran valores al mismo nivel que los tipos enteros o cadenas en cual-quier lenguaje Por ello al igual que es habitual que en todos los lenguajes una funcioacutenreciba datos de entrada (de tipo entero flotante cadena etc) y devuelva datos (de losmismos tipos) en los lenguajes funcionales una funcioacuten puede recibir como dato deentrada una funcioacuten y devolver otra funcioacuten como salida que puede ser construida apartir de sus entradas y por operaciones entre funciones como la composicioacuten Estacapacidad nos proporciona meacutetodos maacutes potentes para construir y combinar los di-versos moacutedulos de los que se compone un programa Por ejemplo emulando la formade operar sobre funciones que habitualmente se usa en matemaacuteticas
La matemaacutetica discreta consiste en el estudio de las propiedades de los conjuntosfinitos o infinitos numerables lo que hace posible su directa implementacioacuten compu-tacional En particular la asignatura ldquoMatemaacutetica Discretardquo del grado se centra enestudiar propiedades y algoritmos de la combinatoria y la teoriacutea de grafos A lo largodel trabajo se implementaraacuten en Haskell definiciones y algoritmos con los que ya seha tenido una primera aproximacioacuten teoacuterica durante el grado
Los dos primeros capiacutetulos del trabajo sientan la base que permitiraacute en los dos si-guientes una aproximacioacuten a la teoriacutea de grafos En el primero se hace una introduc-cioacuten a la teoriacutea de conjuntos y se dan dos posibles representaciones de conjuntos con
11
12 Iacutendice general
las que trabajar en Haskell En el segundo se presentan los conceptos de ldquorelacioacutenrdquo yde ldquofuncioacutenrdquo que al igual que los conjuntos son necesarios para definir aplicacionesde los grafos Su redaccioacuten sigue la liacutenea de la primera parte de la asignatura ldquoAacutelgebraBaacutesicardquo del grado
En el tercer capiacutetulo del trabajo se hace una introduccioacuten a la teoriacutea de grafos Enprimer lugar se dan una representacioacuten con la que trabajar en Haskell y un generadorde grafos que permitiraacute comprobar propiedades con QuickCheck Seguidamente sepresenta una galeriacutea de grafos conocidos que se utilizaraacuten como ejemplos para lasdefiniciones y los algoritmos de las secciones siguientes Las primeras seraacuten algunasdeficiones baacutesicas y despueacutes se trataraacuten los conceptos de ldquomorfismosrdquo ldquocaminosrdquo yldquoconectividadrdquo en grafos
Por uacuteltimo en el cuarto capiacutetulo se da una representacioacuten de los grafos a traveacutesde su matriz de adyacencia Se implementaraacuten algunos de los resultados que JavierFranco Galviacuten expuso en su Trabajo Fin de Grado Aspectos algebraicos en teoriacutea de grafosy se comprueba que concuerdan con el desarrollo hecho en el capiacutetulo anterior
Cabe destacar el trabajo con los diferentes sistemas y programas que se han utiliza-do a lo largo del proyecto
Ubuntu como sistema operativoel editor de textos Emacs que ha permitido el uso de Haskell literario para la redaccioacutendel trabajoel paquete de produccioacuten de graacuteficos vectoriales Tikz de LATEX mediante el que seha dado la representacioacuten graacutefica de los ejemplos de grafosGitHub como sistema remoto de control de versionesy DocTest como sistema de validacioacuten de moacutedulosSe va a hacer una breve introduccioacuten los sistemas maacutes destacados
Ubuntu
Ubuntu es un sistema operativo creado a partir de GNULinux con la intencioacuten dehacer una versioacuten de este maacutes sencilla de manejar y que permitiera acceso al soft-ware libre para todo el mundo por igual La primera distribuioacuten oficial de Ubuntufue la versioacuten 410 y tuvo lugar en 2004 Desde entonces el proyecto ha captadola atencioacuten de miles de entusiastas del software libre que han querido unirse a lacomunidad UbuntuSoftware libre significa que los usuarios tienen la libertad de ejecutar copiar distri-buir estudiar modificar y mejorar el software Es una cuestioacuten de libertad no deprecio Para entender el concepto debe pensarse en laquolibreraquo como en laquolibertad deexpresioacutenraquo
Iacutendice general 13
Maacutes precisamente software libre significa que los usuarios de un programa tienenlas cuatro libertades esencialesbull La libertad de ejecutar el programa como lo desee con cualquier propoacutesito (liber-
tad 0)bull La libertad de estudiar el funcionamiento del programa y adaptarlo a sus necesi-
dades (libertad 1) El acceso al coacutedigo fuente es un prerrequisito para estobull La libertad de redistribuir copias para ayudar a los demaacutes (libertad 2)bull La libertad de mejorar el programa y de publicar las mejoras de modo que toda la
comunidad se beneficie (libertad 3) El acceso al coacutedigo fuente es un prerrequisitopara esto
Debido a la evolucioacuten de la tecnologiacutea y del uso de la red estas libertades son ahoraauacuten maacutes importantes que en el pasadoLo que diferencia a Ubuntu de otros sistemas ofrecidos por Linux es que los equiposcomercial y comunitario colaboran juntos en el desarrollo de un uacutenico proyecto Lasnovedades y avances estaacuten libremente a disposicioacuten de todos los usuarios y sonvoluntarios quienes se hacen cargo de los elementos maacutes criacuteticos del trabajoEn la paacutegina web de Ubuntu 1 se puede obtener maacutes informacioacuten acerca del siste-ma y en la paacutegina web de GNU 2 se puede encontrar maacutes informacioacuten acerca delsoftware libre
Haskell literario con Emacs
Haskell es un lenguaje de programacioacuten puramente funcional basado en lambdacalculus 3 Se caracteriza por sus programas concisos un potente sistema de tiposel trabajo con listas funciones recursivas y de orden superior y por tener evaluacioacutenperezosaTener que escribir coacutedigos largos y complicados hace la tarea del programador muycostosa Los lenguajes de programacioacuten funcional como Haskell lo intentan hacenmaacutes sencillo Aunque no se esteacute en la posicioacuten de usar Haskell en un proyecto de-terminado aprender su razonamiento puede ayudar a mejorar en cualquier otrolenguajeA la hora de elaborar la memoria de un proyecto en el que se estaacute utilizando Haskellla posibilidad de escribir coacutedigo y texto en un formato de calidad otorga globali-dad al trabajo El editor Emacs de GNU permite en particular trabajar en paralelocon Haskell y con Latex El trabajar con Haskell literario ha ayudado a detectar ysolventar errores maacutes raacutepido asiacute como a dar una estructura consolidada al trabajo
1httpswwwubuntucom2httpswwwgnuorg3httpsenwikipediaorgwikiLambda_calculus
14 Iacutendice general
En la paacutegina web del Departamento de Computacioacuten 4 se puede encontrar maacutesinformacioacuten acerca de Haskell y Emacs
GitHub
GitHub es una plataforma de desarrollo colaborativo que permite alojar proyectosusando el control de versiones de Git El trabajo con un sistema como este hacemucho maacutes faacutecil el trabajo en grupo pues cada individuo puede trabajar desde suordenador propio en paralelo a los demaacutes y remotamente ir actualizando el proyectosin perder la posibilidad de restaurarlo a una versioacuten anteriorEn particular GitHub ha sido una excelente herramienta de control de este TrabajoFin de Grado pues los tutores han podido seguir en cada momento el trabajo rea-lizado detectar faacutecilmente los errores y hacer modificaciones directamente sobre eldocumentoEl compantildeero Eduardo Paluzo Hidalgo hace en su Trabajo Fin de Grado una pe-quentildea introduccioacuten al uso de Github y a la instalacioacuten de magit en una distribucioacutenUbuntu muy recomendable para todos aquellos (especialmente los maacutes principian-tes) que tengan intereacutes en trabajar con este sistemaSe puede encontrar maacutes informacioacuten acerca de esta plataforma en la paacutegina web deGit 5
DocTest
DocTest para Haskell es un programa de verificacioacuten dinaacutemica de ejemplos Si se si-gue un determinado formato a la hora de escribir los ejemplos para las funciones deun documento en Haskell Doctest se encarga de comprobar que los ejemplos seancorrectos Estas validaciones han resultado claves en la realizacioacuten del trabajo puesalgunas definiciones han sido modificadas de forma casi continua y este proyectoespecialmente se basa en lo anterior para poder seguir construyendoSu uso es muy sencillo una vez instalado el correspondiente paquete y escrito losejemplos en el formato requerido solo hay que ejecutar el programa desde la consoladando como argumento el fichero que se desea validarSe puede enontrar maacutes informaioacuten acerca del programa y de coacutemo descargarlo ensu repositorio de GitHub 6
4httpwwwcsuses~jalonsocursosi1m-16temastema-1html5httpsgit-scmcom6httpsgithubcomsoldoctest
Capiacutetulo 1
Conjuntos
El concepto de conjunto aparece en todos los campos de las Matemaacuteticas pero iquestqueacutedebe entenderse por eacutel La Teoriacutea de conjuntos fue introducida por Georg Cantor(1845-1917) desde 1869 Cantor ejercioacute como profesor en la Universidad de Halley entre 1879 y 1884 publicoacute una serie de seis artiacuteculos en el Mathematische Annalenen los que hizo una introduccioacuten baacutesica a la teoriacutea de conjuntos En su Beitraumlge zurBegruumlndung der transfiniten Mengenlehre Cantor dio la siguiente definicioacuten de con-junto
Figura 11 Fragmento del texto traducido al ingleacutes en el que Cantor da la definicioacuten de conjunto
laquoDebemos entender por ldquoconjuntordquo (Menge) cualquier coleccioacuten vista co-mo un todo (Zusammenfassung zu einem Ganzen) M de objetos separa-dos y bien definidos m de nuestra intuicioacuten o pensamiento Estos objetosson los ldquoelementosrdquo de Mraquo
Felix Hausdorff en 1914 dice laquoun conjunto es una reunioacuten de cosas que constitu-yen una totalidad es decir una nueva cosaraquo y antildeade laquoesto puede difiacutecilmente seruna definicioacuten pero sirve como demostracioacuten expresiva del concepto de conjunto atraveacutes de conjuntos sencillos como el conjunto de habitantes de una ciudad o el deaacutetomos de Hidroacutegeno del SolraquoUn conjunto asiacute definido no tiene que estar compuesto necesariamente de elementoshomogeacuteneos y ademaacutes da lugar a cuestiones filosoacuteficas como si podemos llamar
15
16 Capiacutetulo 1 Conjuntos
conjunto a aquel que no posee ninguacuten elemento Matemaacuteticamente conviene aceptarsolo elementos que compartan alguna propiedad y definir el conjunto vaciacuteo comoaquel que no tiene elemento algunoEl gran meacuterito de Cantor fue considerar conjuntos transfinitos (que tiene infinitoselementos) concepto inaudito hasta avanzado el siglo XIX hablar del cardinal de unconjunto como el nuacutemero de sus elementos y hablar de conjuntos equivalentes cuan-do puede establecerse una biyeccioacuten entre ellos ideas ya apuntadas por Bolzanoquien se centroacute demasiado en el aspecto filosoacutefico sin llegar a formalizar sus ideas
A lo largo de la seccioacuten haremos una pequentildea introduccioacuten a la Teoriacutea de Conjun-tos presentando formalmente sus conceptos maacutes importantes A la hora de elaborarel contenido se han utilizado los siguientes recursos bibliograacuteficosbull el primer tema de la asignatura ldquoAacutelgebra baacutesicardquo ([6])bull los temas de la asignatura ldquoInformaacuteticardquo ([1])bull el artiacuteculo de la Wikipedia ldquoSet (mathematics)rdquo ([10] ylowast el artiacuteculo ldquoEl regalo de Cantorrdquo ([5])
11 El TAD de los conjuntos
En la presente seccioacuten se definen las operaciones baacutesicas necesarias para trabajarcon conjuntos en un lenguaje funcional En nuestro caso el lenguaje que utilizare-mos seraacute Haskell Daremos la signatura del Tipo Abstracto de Dato (TAD) de losconjuntos y daremos algunos ejemplos de posibles representaciones de conjuntoscon las que podriacuteamos trabajarA continuacioacuten presentamos las operaciones definidas en el TAD de los conjuntos
vacio Conj a
inserta Eq a =gt a -gt Conj a -gt Conj a
elimina Eq a =gt a -gt Conj a -gt Conj a
pertenece Eq a =gt Conj a -gt a -gt Bool
esVacio Conj a -gt Bool
minimoElemento Ord a =gt Conj a -gt a
dondebull (vacio) es el conjunto vaciacuteobull (inserta x c) es el conjunto obtenido antildeadiendo el elemento x al conjunto cbull (elimina x c) es el conjunto obtenido eliminando el elemento x del conjunto cbull (pertenece x c) se verifica si x pertenece al conjunto cbull (esVacio c) se verifica si c no tiene ninguacuten elementobull (minimoElemento c) devuelve el miacutenimo elemento del conjunto c
12 Representaciones de conjuntos 17
Hemos de tener en cuenta que a la hora de crear un nuevo tipo de dato con el querepresentar a los conjuntos este debe ser compatible con la entidad matemaacutetica querepresenta
Estas son algunas de las posibles representaciones con las que podriacuteamos trabajarcon conjuntos en Haskellbull En primer lugar podemos trabajar con la libreriacutea DataSet en este caso la imple-
mentacioacuten del tipo de dato Set estaacute basado en aacuterboles binarios balanceadosbull Por otra parte podemos definir un nuevo tipo Cj xs con el que trabajar con con-
juntos como listas no ordenadas con duplicados como listas no ordenadas sinduplicados o como listas ordenadas sin duplicadosbull Otra opcioacuten seriacutea trabajar directamente con conjuntos como listas para ello de-
bemos ignorar las repeticiones y el orden con vista a la igualdad de conjuntosbull Los conjuntos que soacutelo contienen nuacutemeros (de tipo Int) entre 0 y nminus 1 se pueden
representar como nuacutemeros binarios con n bits donde el bit i(0 le i lt n) es 1 syssel nuacutemero i pertenece al conjunto
Nota 111 Las funciones que aparecen en la especificacioacuten del TAD no dependende la representacioacuten que elijamos
12 Representaciones de conjuntos
121 Conjuntos como listas ordenadas sin repeticioacuten
En el moacutedulo ConjuntosConListasOrdenadasSinRepeticion se definen las funcio-nes del TAD de los conjuntos dando su representacioacuten como listas ordenadas sinrepeticioacuten
module ConjuntosConListasOrdenadasSinRepeticion
( Conj
vacio
inserta
listaAConjunto
elimina
pertenece
esVacio
minimoElemento
sinRepetidos
esUnitario
esSubconjunto
conjuntosIguales
esSubconjuntoPropio
complementario
18 Capiacutetulo 1 Conjuntos
cardinal
unionConjuntos
unionGeneral
interseccion
productoCartesiano
combinaciones
variacionesR
) where
En las definiciones del presente moacutedulo se usaraacuten algunas funciones de la libreriacuteaDataList
Vamos a definir un nuevo tipo de dato (Conj a) que representa a los conjuntoscomo listas ordenadas sin repeticioacuten
type Conj a = [a]
Las funciones baacutesicas que definiremos a partir de este tipo coincidiraacuten con las indi-cadas en el TAD de los conjuntosbull (vacio) es el conjunto vaciacuteo
-- | Ejemplo
-- gtgtgt vacio
-- []
vacio Conj a
vacio = []
bull (inserta x c) es el conjunto obtenido antildeadiendo el elemento x al conjunto c
-- | Ejemplo
-- gtgtgt inserta 5 vacio
-- [5]
-- gtgtgt foldr inserta vacio [2211242]
-- [124]
inserta Ord a =gt a -gt Conj a -gt Conj a
inserta x [] = [x]
inserta x ys
| pertenece ys x = ys
| otherwise = insert x ys
bull (listaAConjunto xs) devuelve el conjunto cuyos elementos son los de la lista xs
-- | Ejemplo
-- gtgtgt listaAConjunto [2211242]
-- [124]
listaAConjunto Ord a =gt [a] -gt Conj a
listaAConjunto = sort nub
bull (esVacio c) se verifica si c es el conjunto vaciacuteo
12 Representaciones de conjuntos 19
-- | Ejemplos
-- gtgtgt esVacio (listaAConjunto [25137532190])
-- False
-- gtgtgt esVacio vacio
-- True
esVacio Conj a -gt Bool
esVacio = null
bull (pertenece x c) se verifica si x es un elemento del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt pertenece c1 3
-- True
-- gtgtgt pertenece c1 4
-- False
pertenece Ord a =gt Conj a -gt a -gt Bool
pertenece ys x =
x == head (dropWhile (ltx) ys)
bull (elimina x c) es el conjunto obtenido eliminando el elemento x del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt elimina 3 c1
-- [012579]
-- gtgtgt elimina 4 c1
-- [0123579]
elimina Ord a =gt a -gt Conj a -gt Conj a
elimina x ys = us ++ dropWhile (==x) vs
where (usvs) = span (ltx) ys
bull (minimoElemento c) devuelve el miacutenimo elemento del conjunto c
-- | Ejemplos
-- gtgtgt minimoElemento (listaAConjunto [25137532190])
-- 0
-- gtgtgt minimoElemento (listaAConjunto ([ae] ++ [AE]))
-- A
minimoElemento Ord a =gt Conj a -gt a
minimoElemento = head
122 Definicioacuten de conjunto
Nota 121 Al trabajar con la representacioacuten de conjuntos como listas en Haskellhemos de cuidar que los ejemplos con los que trabajemos no tengan elementos re-petidos La funcioacuten (sinRepetidos xs) se verifica si la lista xs no tiene ninguacuten ele-mento repetido
20 Capiacutetulo 1 Conjuntos
-- | Ejemplos
-- gtgtgt sinRepetidos []
-- True
-- gtgtgt sinRepetidos [1231]
-- False
sinRepetidos Eq a =gt [a] -gt Bool
sinRepetidos xs = nub xs == xs
Los conjuntos pueden definirse de manera expliacutecita citando todos sus elementosentre llaves de manera impliacutecita dando una o varias caracteriacutesticas que determi-nen si un objeto dado estaacute o no en el conjunto Por ejemplo los conjuntos 1 2 3 4y x isinN|1 le x le 4 son el mismo definido de forma explicita e impliacutecita respecti-vamente
Nota 122 La definicioacuten impliacutecita es necesaria cuando el conjunto en cuestioacuten tieneuna cantidad infinita de elementos En general los conjuntos se notaraacuten con letrasmayuacutesculas A B y los elementos con letras minuacutesculas a b
Cuando trabajamos con conjuntos concretos siempre existe un contexto donde esosconjuntos existen Por ejemplo si A = minus1 1 2 3 4 5 y B = x|x isin Nes par elcontexto donde podemos considerar A y B es el conjunto de los nuacutemeros enterosZ En general a este conjunto se le denomina conjunto universal De una forma algomaacutes precisa podemos dar la siguiente definicioacuten
Definicioacuten 121 El conjunto universal que notaremos por U es un conjunto del queson subconjuntos todos los posibles conjuntos que originan el problema que tratamos
123 Subconjuntos
Definicioacuten 122 Dados dos conjuntos A y B si todo elemento de A es a su vez elementode B diremos que A es un subconjunto de B y lo notaremos A sube B En caso contrario senotaraacute A 6sube B
La funcioacuten (esSubconjunto c1 c2) se verifica si c1 es un subconjunto de c2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
-- gtgtgt c1 `esSubconjunto` c2
-- True
-- gtgtgt c1 `esSubconjunto` vacio
-- False
-- gtgtgt vacio `esSubconjunto` c2
12 Representaciones de conjuntos 21
-- True
-- gtgtgt c3 `esSubconjunto` c4
-- True
-- gtgtgt c2 `esSubconjunto` c1
-- False
esSubconjunto Ord a =gt Conj a -gt Conj a -gt Bool
esSubconjunto [] _ = True
esSubconjunto (xxs) ys =
x == head vs ampamp esSubconjunto xs (tail vs)
where (usvs) = span (ltx) ys
124 Igualdad de conjuntos
Definicioacuten 123 Dados dos conjuntos A y B diremos que son iguales si tienen los mismoselementos es decir si se verifica que A sube B y B sube A Lo notaremos A = B
La funcioacuten (conjuntosIguales c1 c2) se verifica si los conjuntos xs y ys son igua-les
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
-- gtgtgt let c5 = listaAConjunto [4444442]
-- gtgtgt conjuntosIguales c1 c2
-- False
-- gtgtgt conjuntosIguales c3 c4
-- True
-- gtgtgt conjuntosIguales c1 c5
-- True
conjuntosIguales Ord a =gt Conj a -gt Conj a -gt Bool
conjuntosIguales = (==)
125 Subconjuntos propios
Definicioacuten 124 Los subconjuntos de A distintos del empty y del mismo A se denominansubconjuntos propios de A
La funcioacuten (esSubconjuntoPropio c1 c2) se verifica si c1 es un subconjunto pro-pio de c2
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt esSubconjuntoPropio u u
22 Capiacutetulo 1 Conjuntos
-- False
-- gtgtgt esSubconjuntoPropio c1 u
-- True
esSubconjuntoPropio Ord a =gt Conj a -gt Conj a -gt Bool
esSubconjuntoPropio c1 c2 =
not (null c1) ampamp esSubconjunto c1 c2 ampamp c1 = c2
126 Complementario de un conjunto
Definicioacuten 125 Dado un conjunto A se define el complementario de A que notaremospor A como
A = x|x isin U x 6isin A
La funcioacuten (complementario u c) devuelve el complementario del conjunto c y enel universo u
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt let c2 = listaAConjunto [14689]
-- gtgtgt complementario u c1
-- [14689]
-- gtgtgt complementario u u
-- []
-- gtgtgt complementario u vacio
-- [123456789]
-- gtgtgt complementario u c2
-- [2357]
complementario Ord a =gt Conj a -gt Conj a -gt Conj a
complementario [] _ = []
complementario xs [] = xs
complementario (xxs) (yys)
| x lt y = x complementario xs (yys)
| otherwise = complementario xs ys
127 Cardinal de un conjunto
Definicioacuten 126 Dado un conjunto finito A denominaremos cardinal de A al nuacutemero deelementos que tiene y lo notaremos |A|
La funcioacuten (cardinal xs) devuelve el cardinal del conjunto xs
-- | Ejemplos
-- gtgtgt cardinal vacio
-- 0
-- gtgtgt cardinal (listaAConjunto [110])
12 Representaciones de conjuntos 23
-- 10
-- gtgtgt cardinal (listaAConjunto chocolate)
-- 7
cardinal Ord a =gt Conj a -gt Int
cardinal = length
128 Conjunto unitario
Definicioacuten 127 Un conjunto con un uacutenico elemento se denomina unitario
Nota 123 Notemos que si X = x es un conjunto unitario debemos distinguirentre el conjunto X y el elemento x
La funcioacuten (esUnitario c) se verifica si el conjunto c es unitario
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto (take 10 (repeat 5))
-- gtgtgt let c2 = listaAConjunto valverde
-- gtgtgt let c3 = listaAConjunto coco
-- gtgtgt esUnitario c1
-- True
-- gtgtgt esUnitario c2
-- False
-- gtgtgt esUnitario c2
-- False
esUnitario Ord a =gt Conj a -gt Bool
esUnitario c =
c == take 1 c
129 Unioacuten de conjuntos
Definicioacuten 128 Dados dos conjuntos A y B se define la unioacuten de A y B notado A cup Bcomo el conjunto formado por aquellos elementos que pertenecen al menos a uno de los dosconjuntos A oacute B es decir
A cup B = x | x isin A or x isin B
La funcioacuten (unionConjuntos c1 c2) devuelve la unioacuten de los conjuntos xs y ys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [139]
-- gtgtgt let c2 = listaAConjunto [249]
-- gtgtgt unionConjuntos c1 c2
-- [123456789]
unionConjuntos Ord a =gt Conj a -gt Conj a -gt Conj a
unionConjuntos [] [] = []
24 Capiacutetulo 1 Conjuntos
unionConjuntos [] ys = ys
unionConjuntos xs [] = xs
unionConjuntos (xxs) (yys)
| x lt y = x unionConjuntos xs (yys)
| x == y = x unionConjuntos xs ys
| otherwise = y unionConjuntos (xxs) ys
Definicioacuten 129 Dada una familia de conjuntos Ai con i isin I se define la unioacuten ge-neral de los conjuntos Ai notado
⋃iisinI Ai como el conjunto formado por aquellos elementos
que pertenecen al menos a uno de los conjuntos de la familia es decir
⋃iisinI
Ai = x | x isin Ai foralli isin I
La funcioacuten (unionGeneral xss) devuelve la unioacuten general de la familia de conjun-tos de la lista xss
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1415]
-- gtgtgt let c2 = listaAConjunto [2515]
-- gtgtgt let c3 = listaAConjunto [3615]
-- gtgtgt unionGeneral [c1c2c3]
-- [123456789101112131415]
unionGeneral Ord a =gt [Conj a] -gt Conj a
unionGeneral = foldr unionConjuntos vacio
1210 Interseccioacuten de conjuntos
Definicioacuten 1210 Dados dos conjuntos A y B se define la interseccioacuten de A y B notadoA cap B como el conjunto formado por aquellos elementos que pertenecen a cada uno de losdos conjuntos A y B es decir
A cap B = x | x isin A and x isin B
La funcioacuten (interseccion c1 c2) devuelve la interseccioacuten de los conjuntos c1 yc2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1320]
-- gtgtgt let c2 = listaAConjunto [2420]
-- gtgtgt let c3 = listaAConjunto [2430]
-- gtgtgt let c4 = listaAConjunto [4830]
-- gtgtgt interseccion c1 c2
-- []
-- gtgtgt interseccion c3 c4
12 Representaciones de conjuntos 25
-- [481216202428]
interseccion Ord a =gt Conj a -gt Conj a -gt Conj a
interseccion (xxs) (yys)
| x lt y = interseccion xs (yys)
| x gt y = interseccion (xxs) ys
| otherwise = x interseccion xs ys
interseccion _ _ = []
1211 Producto cartesiano
Definicioacuten 1211 El producto cartesiano 1 de dos conjuntos A y B es una operacioacutensobre ellos que resulta en un nuevo conjunto Atimes B que contiene a todos los pares ordenadostales que la primera componente pertenece a A y la segunda pertenece a B es decir
Atimes B = (a b) | a isin A b isin B
La funcioacuten (productoCartesiano c1 c2) devuelve el producto cartesiano de xs eys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [31]
-- gtgtgt let c2 = listaAConjunto [247]
-- gtgtgt productoCartesiano c1 c2
-- [(12)(14)(17)(32)(34)(37)]
-- gtgtgt productoCartesiano c2 c1
-- [(21)(23)(41)(43)(71)(73)]
productoCartesiano (Ord a Ord b) =gt Conj a -gt Conj b -gt Conj (ab)
productoCartesiano xs ys=
listaAConjunto [(xy) | x lt- xs y lt- ys]
1212 Combinaciones
Definicioacuten 1212 Las combinaciones de un conjunto S tomados en grupos de n son todoslos subconjuntos de S con n elementos
La funcioacuten (combinaciones n xs) devuelve las combinaciones de los elementos dexs en listas de n elementos
-- | Ejemplos
-- gtgtgt combinaciones 3 [ad]
-- [abcabdacdbcd]
-- gtgtgt combinaciones 2 [248]
-- [[24][26][28][46][48][68]]
1httpsenwikipediaorgwikiCartesian_product
26 Capiacutetulo 1 Conjuntos
combinaciones Integer -gt [a] -gt [[a]]
combinaciones 0 _ = [[]]
combinaciones _ [] = []
combinaciones k (xxs) =
[xys | ys lt- combinaciones (k-1) xs] ++ combinaciones k xs
1213 Variaciones con repeticioacuten
Definicioacuten 1213 Las variaciones con repeticioacuten de m elementos tomados en grupos den es el nuacutemero de diferentes nndashtuplas de un conjunto de m elementos
La funcioacuten (variacionesR n xs) devuelve las variaciones con con repeticioacuten de loselementos de xs en listas de n elementos
-- | Ejemplos
-- gtgtgt variacionesR 3 [ab]
-- [aaaaababaabbbaababbbabbb]
-- gtgtgt variacionesR 2 [235]
-- [[22][23][25][32][33][35][52][53][55]]
variacionesR Int -gt [a] -gt [[a]]
variacionesR _ [] = [[]]
variacionesR 0 _ = [[]]
variacionesR k us =
[uvs | u lt- us vs lt- variacionesR (k-1) us]
1214 Conjuntos como listas sin repeticioacuten
En el moacutedulo ConjuntosConListas se definen las funciones del TAD de los conjun-tos dando su representacioacuten como listas sin elementos repetidos
module ConjuntosConListas
( Conj
vacio
inserta
listaAConjunto
elimina
pertenece
esVacio
minimoElemento
sinRepetidos
esUnitario
esSubconjunto
conjuntosIguales
esSubconjuntoPropio
complementario
cardinal
12 Representaciones de conjuntos 27
unionConjuntos
unionGeneral
interseccion
productoCartesiano
combinaciones
variacionesR
) where
En las definiciones del presente moacutedulo se usaraacuten algunas funciones de la libreriacuteaDataList
Vamos a definir un nuevo tipo de dato (Conj a) que representa a los conjuntoscomo listas sin elementos repetidos
type Conj a = [a]
Las funciones baacutesicas que definiremos a partir de este tipo coincidiraacuten con las indi-cadas en el TAD de los conjuntosbull (vacio) es el conjunto vaciacuteo
-- | Ejemplo
-- gtgtgt vacio
-- []
vacio Conj a
vacio = []
bull (inserta x c) es el conjunto obtenido antildeadiendo el elemento x al conjunto c
-- | Ejemplo
-- gtgtgt inserta 5 vacio
-- [5]
-- gtgtgt foldr inserta vacio [2211242]
-- [142]
inserta Eq a =gt a -gt Conj a -gt Conj a
inserta x [] = [x]
inserta x ys | elem x ys = ys
| otherwise = xys
bull (listaAConjunto xs) devuelve el conjunto cuyos elementos son los de la lista xs
-- | Ejemplo
-- gtgtgt listaAConjunto [2211242]
-- [214]
listaAConjunto Eq a =gt [a] -gt Conj a
listaAConjunto = nub
bull (esVacio c) se verifica si c es el conjunto vaciacuteo
-- | Ejemplos
-- gtgtgt esVacio (listaAConjunto [25137532190])
-- False
28 Capiacutetulo 1 Conjuntos
-- gtgtgt esVacio vacio
-- True
esVacio Conj a -gt Bool
esVacio = null
bull (pertenece x c) se verifica si x es un elemento del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt pertenece 3 c1
-- True
-- gtgtgt pertenece 4 c1
-- False
pertenece Eq a =gt a -gt Conj a -gt Bool
pertenece = elem
bull (elimina x c) es el conjunto obtenido eliminando el elemento x del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt elimina 3 c1
-- [251790]
-- gtgtgt elimina 4 c1
-- [2513790]
elimina Eq a =gt a -gt Conj a -gt Conj a
elimina = delete
bull (minimoElemento c) devuelve el miacutenimo elemento del conjunto c
-- | Ejemplos
-- gtgtgt minimoElemento (listaAConjunto [25137532190])
-- 0
-- gtgtgt minimoElemento (listaAConjunto ([ae] ++ [AE]))
-- A
minimoElemento Ord a =gt Conj a -gt a
minimoElemento = minimum
1215 Definicioacuten de conjunto
Definicioacuten 1214 Llamaremos conjunto a una coleccioacuten de objetos que llamaremos ele-mentos distintos entre siacute y que comparten una propiedad Para que un conjunto esteacute biendefinido debe ser posible discernir si un objeto arbitrario estaacute o no en eacutel
Si el elemento a pertenece al conjunto A escribiremos a isin A En caso contrarioescribiremos a 6isin A
Nota 124 En Haskell para poder discernir si un objeto arbitrario pertenece a unconjunto se necesita que su tipo pertenezca a la clase Eq
12 Representaciones de conjuntos 29
Nota 125 Al trabajar con la representacioacuten de conjuntos como listas en Haskellhemos de cuidar que los ejemplos con los que trabajemos no tengan elementos re-petidos La funcioacuten (sinRepetidos xs) se verifica si la lista xs no tiene ninguacuten ele-mento repetido
-- | Ejemplos
-- gtgtgt sinRepetidos []
-- True
-- gtgtgt sinRepetidos [1231]
-- False
sinRepetidos Eq a =gt [a] -gt Bool
sinRepetidos xs = nub xs == xs
Los conjuntos pueden definirse de manera expliacutecita citando todos sus elementosentre llaves de manera impliacutecita dando una o varias caracteriacutesticas que determi-nen si un objeto dado estaacute o no en el conjunto Por ejemplo los conjuntos 1 2 3 4y x isinN|1 le x le 4 son el mismo definido de forma explicita e impliacutecita respecti-vamente
Nota 126 La definicioacuten impliacutecita es necesaria cuando el conjunto en cuestioacuten tieneuna cantidad infinita de elementos En general los conjuntos se notaraacuten con letrasmayuacutesculas A B y los elementos con letras minuacutesculas a b
Cuando trabajamos con conjuntos concretos siempre existe un contexto donde esosconjuntos existen Por ejemplo si A = minus1 1 2 3 4 5 y B = x|x isin Nes par elcontexto donde podemos considerar A y B es el conjunto de los nuacutemeros enterosZ En general a este conjunto se le denomina conjunto universal De una forma algomaacutes precisa podemos dar la siguiente definicioacuten
Definicioacuten 1215 El conjunto universal que notaremos por U es un conjunto del queson subconjuntos todos los posibles conjuntos que originan el problema que tratamos
1216 Subconjuntos
Definicioacuten 1216 Dados dos conjuntos A y B si todo elemento de A es a su vez elementode B diremos que A es un subconjunto de B y lo notaremos A sube B En caso contrario senotaraacute A 6sube B
La funcioacuten (esSubconjunto c1 c2) se verifica si c1 es un subconjunto de c2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
30 Capiacutetulo 1 Conjuntos
-- gtgtgt c1 `esSubconjunto` c2
-- True
-- gtgtgt c1 `esSubconjunto` vacio
-- False
-- gtgtgt vacio `esSubconjunto` c2
-- True
-- gtgtgt c3 `esSubconjunto` c4
-- True
-- gtgtgt c2 `esSubconjunto` c1
-- False
esSubconjunto Eq a =gt [a] -gt [a] -gt Bool
esSubconjunto c1 c2 = all (`elem` c2) c1
1217 Igualdad de conjuntos
Definicioacuten 1217 Dados dos conjuntos A y B diremos que son iguales si tienen losmismos elementos es decir si se verifica que A sube B y B sube A Lo notaremos A = B
La funcioacuten (conjuntosIguales c1 c2) se verifica si los conjuntos xs y ys son igua-les
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
-- gtgtgt let c5 = listaAConjunto [4444442]
-- gtgtgt conjuntosIguales c1 c2
-- False
-- gtgtgt conjuntosIguales c3 c4
-- True
-- gtgtgt conjuntosIguales c1 c5
-- True
conjuntosIguales Eq a =gt [a] -gt [a] -gt Bool
conjuntosIguales c1 c2 =
esSubconjunto c1 c2 ampamp esSubconjunto c2 c1
1218 Subconjuntos propios
Definicioacuten 1218 Los subconjuntos de A distintos del empty y del mismo A se denominansubconjuntos propios de A
La funcioacuten (esSubconjuntoPropio c1 c2) se verifica si c1 es un subconjunto pro-pio de c2
12 Representaciones de conjuntos 31
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt esSubconjuntoPropio u u
-- False
-- gtgtgt esSubconjuntoPropio c1 u
-- True
esSubconjuntoPropio Eq a =gt [a] -gt [a] -gt Bool
esSubconjuntoPropio c1 c2
| null c1 = False
| conjuntosIguales c1 c2 = False
| otherwise = esSubconjunto c1 c2
1219 Complementario de un conjunto
Definicioacuten 1219 Dado un conjunto A se define el complementario de A que notaremospor A como
A = x|x isin U x 6isin A
La funcioacuten (complementario u c) devuelve el complementario del conjunto c y enel universo u
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt let c2 = listaAConjunto [14689]
-- gtgtgt complementario u c1
-- [14689]
-- gtgtgt complementario u u
-- []
-- gtgtgt complementario u vacio
-- [123456789]
-- gtgtgt complementario u c2
-- [2357]
complementario Eq a =gt [a] -gt [a] -gt [a]
complementario = ()
1220 Cardinal de un conjunto
Definicioacuten 1220 Dado un conjunto finito A denominaremos cardinal de A al nuacutemerode elementos que tiene y lo notaremos |A|
La funcioacuten (cardinal xs) devuelve el cardinal del conjunto xs
32 Capiacutetulo 1 Conjuntos
-- | Ejemplos
-- gtgtgt cardinal vacio
-- 0
-- gtgtgt cardinal (listaAConjunto [110])
-- 10
-- gtgtgt cardinal (listaAConjunto chocolate)
-- 7
cardinal [a] -gt Int
cardinal = length
1221 Conjunto unitario
Definicioacuten 1221 Un conjunto con un uacutenico elemento se denomina unitario
Nota 127 Notemos que si X = x es un conjunto unitario debemos distinguirentre el conjunto X y el elemento x
La funcioacuten (esUnitario c) se verifica si el conjunto c es unitario
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto (take 10 (repeat 5))
-- gtgtgt let c2 = listaAConjunto valverde
-- gtgtgt let c3 = listaAConjunto coco
-- gtgtgt esUnitario c1
-- True
-- gtgtgt esUnitario c2
-- False
-- gtgtgt esUnitario c2
-- False
esUnitario Eq a =gt [a] -gt Bool
esUnitario c = c == take 1 c
1222 Unioacuten de conjuntos
Definicioacuten 1222 Dados dos conjuntos A y B se define la unioacuten de A y B notado A cup Bcomo el conjunto formado por aquellos elementos que pertenecen al menos a uno de los dosconjuntos A oacute B es decir
A cup B = x | x isin A or x isin B
La funcioacuten (unionConjuntos c1 c2) devuelve la unioacuten de los conjuntos xs y ys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [139]
-- gtgtgt let c2 = listaAConjunto [249]
12 Representaciones de conjuntos 33
-- gtgtgt unionConjuntos c1 c2
-- [135792468]
unionConjuntos Eq a =gt [a] -gt [a] -gt [a]
unionConjuntos = union
Definicioacuten 1223 Dada una familia de conjuntos Ai con i isin I se define la unioacuten ge-neral de los conjuntos Ai notado
⋃iisinI Ai como el conjunto formado por aquellos elementos
que pertenecen al menos a uno de los conjuntos de la familia es decir
⋃iisinI
Ai = x | x isin Ai foralli isin I
La funcioacuten (unionGeneral xss) devuelve la unioacuten general de la familia de conjun-tos de la lista xss
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1415]
-- gtgtgt let c2 = listaAConjunto [2515]
-- gtgtgt let c3 = listaAConjunto [3615]
-- gtgtgt unionGeneral [c1c2c3]
-- [147101325811143691215]
unionGeneral Eq a =gt [[a]] -gt [a]
unionGeneral = foldr unionConjuntos []
1223 Interseccioacuten de conjuntos
Definicioacuten 1224 Dados dos conjuntos A y B se define la interseccioacuten de A y B notadoA cap B como el conjunto formado por aquellos elementos que pertenecen a cada uno de losdos conjuntos A y B es decir
A cap B = x | x isin A and x isin B
La funcioacuten (interseccion c1 c2) devuelve la interseccioacuten de los conjuntos c1 yc2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1320]
-- gtgtgt let c2 = listaAConjunto [2420]
-- gtgtgt let c3 = listaAConjunto [2430]
-- gtgtgt let c4 = listaAConjunto [4830]
-- gtgtgt interseccion c1 c2
-- []
-- gtgtgt interseccion c3 c4
-- [481216202428]
34 Capiacutetulo 1 Conjuntos
interseccion Eq a =gt [a] -gt [a] -gt [a]
interseccion = intersect
1224 Producto cartesiano
Definicioacuten 1225 El producto cartesiano 2 de dos conjuntos A y B es una operacioacutensobre ellos que resulta en un nuevo conjunto Atimes B que contiene a todos los pares ordenadostales que la primera componente pertenece a A y la segunda pertenece a B es decir
Atimes B = (a b) | a isin A b isin B
La funcioacuten (productoCartesiano c1 c2) devuelve el producto cartesiano de xs eys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [31]
-- gtgtgt let c2 = listaAConjunto [247]
-- gtgtgt productoCartesiano c1 c2
-- [(32)(34)(37)(12)(14)(17)]
-- gtgtgt productoCartesiano c2 c1
-- [(23)(21)(43)(41)(73)(71)]
productoCartesiano [a] -gt [b] -gt [(ab)]
productoCartesiano xs ys = [ (xy) | x lt- xs y lt- ys]
1225 Combinaciones
Definicioacuten 1226 Las combinaciones de un conjunto S tomados en grupos de n son todoslos subconjuntos de S con n elementos
La funcioacuten (combinaciones n xs) devuelve las combinaciones de los elementos dexs en listas de n elementos
-- | Ejemplos
-- gtgtgt combinaciones 3 [ad]
-- [abcabdacdbcd]
-- gtgtgt combinaciones 2 [248]
-- [[24][26][28][46][48][68]]
combinaciones Integer -gt [a] -gt [[a]]
combinaciones 0 _ = [[]]
combinaciones _ [] = []
combinaciones k (xxs) =
[xys | ys lt- combinaciones (k-1) xs] ++ combinaciones k xs
2httpsenwikipediaorgwikiCartesian_product
13 Eleccioacuten de la representacioacuten de conjuntos 35
1226 Variaciones con repeticioacuten
Definicioacuten 1227 Las variaciones con repeticioacuten de m elementos tomados en grupos den es el nuacutemero de diferentes nndashtuplas de un conjunto de m elementos
La funcioacuten (variacionesR n xs) devuelve las variaciones con con repeticioacuten de loselementos de xs en listas de n elementos
-- | Ejemplos
-- gtgtgt variacionesR 3 [ab]
-- [aaaaababaabbbaababbbabbb]
-- gtgtgt variacionesR 2 [235]
-- [[22][23][25][32][33][35][52][53][55]]
variacionesR Int -gt [a] -gt [[a]]
variacionesR _ [] = [[]]
variacionesR 0 _ = [[]]
variacionesR k us =
[uvs | u lt- us vs lt- variacionesR (k-1) us]
13 Eleccioacuten de la representacioacuten de conjuntos
Nota 131 En el moacutedulo Conjuntos se elige la representacioacuten de conjunto con la quese trabajaraacute
-- Seleccionar para trabajar con los conjuntos como listas sin
-- elementos repetidos
module Conjuntos
(module ConjuntosConListas)
where
import ConjuntosConListas
-- Seleccionar para trabajar con los conjuntos como listas ordenadas
-- sin elementos repetidos
-- module Conjuntos
-- (module ConjuntosConListasOrdenadasSinRepeticion)
-- where
-- import ConjuntosConListasOrdenadasSinRepeticion
36 Capiacutetulo 1 Conjuntos
Capiacutetulo 2
Relaciones y funciones
21 Relaciones
Las relaciones que existen entre personas nuacutemeros conjuntos y muchas otras enti-dades pueden formalizarse en la idea de relacioacuten binaria En esta seccioacuten se define ydesarrolla este concepto particularizando en el caso de las relaciones homogeacuteneasy en el de las funciones
211 Relacioacuten binaria
Definicioacuten 211 Una relacioacuten binaria 1 (o correspondencia) entre dos conjuntos A yB es un subconjunto del producto cartesiano Atimes B
La funcioacuten (esRelacion xs ys r) se verifica si r es una relacioacuten binaria de xs enys Por ejemplo
-- | Ejemplos
-- gtgtgt esRelacion [31] [247] [(12)(34)]
-- True
-- gtgtgt esRelacion [31] [247] [(12)(31)]
-- False
esRelacion (Ord a Ord b) =gt [a] -gt [b] -gt [(ab)] -gt Bool
esRelacion xs ys r =
r `esSubconjunto` productoCartesiano xs ys
212 Imagen por una relacioacuten
Definicioacuten 212 Si R es una relacioacuten binaria la imagen del elemento x en la relacioacuten Res el conjunto de los valores correspondientes a x en R
1httpsenwikipediaorgwikiBinary_relation
37
38 Capiacutetulo 2 Relaciones y funciones
La funcioacuten (imagenRelacion r x) es la imagen de x en la relacioacuten r
-- | Ejemplos
-- gtgtgt imagenRelacion [(13)(25)(14)] 1
-- [34]
-- gtgtgt imagenRelacion [(13)(25)(14)] 2
-- [5]
-- gtgtgt imagenRelacion [(13)(25)(14)] 3
-- []
imagenRelacion (Ord a Ord b) =gt [(ab)] -gt a -gt [b]
imagenRelacion r x =
nub [y | (zy) lt- r z == x]
213 Dominio de una relacioacuten
Definicioacuten 213 Dada una relacioacuten binaria R su dominio es el conjunto que contiene atodos los valores que se toman en la relacioacuten R
La funcioacuten (dominio r) devuelve el dominio de la relacioacuten r
-- | Ejemplo
-- gtgtgt dominio [(32)(51)(34)]
-- [35]
dominio Ord a =gt [(ab)] -gt [a]
dominio r = listaAConjunto (map fst r)
214 Rango de una relacioacuten
Definicioacuten 214 El rango de una relacioacuten binaria R es el conjunto de las imaacutegenes demediante R
La funcioacuten (rango r) devuelve el rango de la relacioacuten binaria r
-- | Ejemplo
-- gtgtgt rango [(32)(52)(34)]
-- [24]
rango Ord b =gt [(ab)] -gt [b]
rango r = listaAConjunto (map snd r)
215 Antiimagen por una relacioacuten
Definicioacuten 215 La antiimagen del elemento y por una relacioacuten r es el conjunto de loselementos cuya imagen es y
La (antiImagenRelacion r y) es la antiimagen del elemento y en la relacioacuten bina-ria r
22 Relaciones homogeacuteneas 39
-- | Ejemplo
-- gtgtgt antiImagenRelacion [(13)(23)(74)] 3
-- [12]
antiImagenRelacion (Ord a Ord b) =gt [(ab)] -gt b -gt [a]
antiImagenRelacion r y =
nub [x | (xz) lt- r z == y]
216 Relacioacuten funcional
Definicioacuten 216 Dada una relacioacuten binaria R se dice funcional si todos los elementos desu dominio tienen una uacutenica imagen en R
La funcioacuten (esFuncional r) se verifica si la relacioacuten r es funcional
-- | Ejemplos
-- gtgtgt esFuncional [(32)(51)(79)]
-- True
-- gtgtgt esFuncional [(32)(51)(34)]
-- False
-- gtgtgt esFuncional [(32)(51)(32)]
-- True
esFuncional (Ord a Ord b) =gt [(ab)] -gt Bool
esFuncional r =
and [esUnitario (imagenRelacion r x) | x lt- dominio r]
22 Relaciones homogeacuteneas
Para elaborar la presente seccioacuten se han consultado los apuntes de ldquoAacutelgebra baacutesicardquo([6]) asignatura del primer curso del Grado en Matemaacuteticas
Definicioacuten 221 Una relacioacuten binaria entre dos conjuntos A y B se dice que es homogeacute-nea si los conjuntos son iguales es decir si A = B Si el par (x y) isin AA estaacute en la relacioacutenhomogeacutenea R diremos que x estaacute Rndashrelacionado con y o relacionado con y por R Esto senotaraacute frecuentemente xRy (noacutetese que el orden es importante)
La funcioacuten (esRelacionHomogenea xs r) se verifica si r es una relacioacuten binaria ho-mogeacutenea en el conjunto xs
-- | Ejemplos
-- gtgtgt esRelacionHomogenea [14] [(12)(24)(34)(41)]
-- True
-- gtgtgt esRelacionHomogenea [14] [(12)(25)(34)(41)]
-- False
-- gtgtgt esRelacionHomogenea [14] [(12)(34)(41)]
40 Capiacutetulo 2 Relaciones y funciones
-- True
esRelacionHomogenea Ord a =gt [a] -gt [(aa)] -gt Bool
esRelacionHomogenea xs = esRelacion xs xs
Nota 221 El segundo argumento que recibe la funcioacuten ha de ser una lista de parescon ambas componentes del mismo tipo
La funcioacuten (estaRelacionado r x y) se verifica si x estaacute relacionado con y en larelacioacuten homogeacutenea r
-- | Ejemplos
-- gtgtgt estaRelacionado [(13)(25)(46)] 2 5
-- True
-- gtgtgt estaRelacionado [(13)(25)(46)] 2 3
-- False
estaRelacionado Ord a =gt [(aa)] -gt a -gt a -gt Bool
estaRelacionado r x y = (xy) `elem` r
221 Relaciones reflexivas
Definicioacuten 222 Sea R una relacioacuten binaria homogeacutenea en el conjunto A Diremos que Res reflexiva cuando todos los elementos de A estaacuten relacionados por R consigo mismos esdecir cuando forallx isin A se tiene que xRx
La funcioacuten (esReflexiva xs r) se verifica si la relacioacuten r en xs es reflexiva
-- | Ejemplos
-- gtgtgt esReflexiva [12] [(11)(12)(22)]
-- True
-- gtgtgt esReflexiva [12] [(11)(12)]
-- False
esReflexiva Ord a =gt [a] -gt [(aa)] -gt Bool
esReflexiva xs r = zip xs xs `esSubconjunto` r
Nota 222 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xSylarrrarr xminus y es parbull xTylarrrarr x divide a yson relaciones binarias homogeacuteneas reflexivas
222 Relaciones simeacutetricas
Definicioacuten 223 Diremos que una relacioacuten homogeacutenea R es simeacutetrica cuando
forall(x y) isin R minusrarr (y x) isin R
22 Relaciones homogeacuteneas 41
La funcioacuten (esSimetrica r) se verifica si la relacioacuten r es simeacutetrica
-- | Ejemplos
-- gtgtgt esSimetrica [(11)(12)(21)]
-- True
-- gtgtgt esSimetrica [(11)(12)(22)]
-- False
esSimetrica Ord a =gt [(aa)] -gt Bool
esSimetrica r =
listaAConjunto [(yx) | (xy) lt- r] `esSubconjunto` r
Nota 223 En el conjunto N la relacioacuten caracterizada por xSy larrrarr xminus y es par esuna relacioacuten binaria homogeacutenea simeacutetrica
223 Relaciones antisimeacutetricas
Definicioacuten 224 Sea R una relacioacuten binaria homogeacutenea en el conjunto A Diremos que Res antisimeacutetrica cuando
forall(x y)[(x y) isin R and (y x) isin R minusrarr x = y
La funcioacuten (esAntisimetrica r) se verifica si la relacioacuten r es antisimeacutetrica
-- | Ejemplos
-- gtgtgt esAntisimetrica [(12)(31)]
-- True
-- gtgtgt esAntisimetrica [(12)(21)]
-- False
esAntisimetrica Ord a =gt [(aa)] -gt Bool
esAntisimetrica r =
and [x == y | (xy) lt- r (yx) `elem` r]
Nota 224 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xTylarrrarr x divide a ybull xRylarrrarr x lt yson relaciones binarias homogeacuteneas antisimeacutetricas
224 Relaciones transitivas
Definicioacuten 225 Sea R una relacioacuten binaria homogeacutenea en el conjunto A Diremos que Res transitiva cuando forall(x y) (y z) isin R se tiene que xRy e yRz minusrarr xRz
La funcioacuten (esTransitiva r) se verifica si la relacioacuten r es transitiva
42 Capiacutetulo 2 Relaciones y funciones
-- | Ejemplos
-- gtgtgt esTransitiva [(12)(13)(23)]
-- True
-- gtgtgt esTransitiva [(12)(23)]
-- False
esTransitiva Ord a =gt [(aa)] -gt Bool
esTransitiva r =
listaAConjunto [(xz) | (xy) lt- r (wz) lt- r y == w]
`esSubconjunto` r
Nota 225 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xSylarrrarr xminus y es parbull xTylarrrarr x divide a ybull xRylarrrarr x lt yson relaciones binarias homogeacuteneas transitivas
225 Relaciones de equivalencia
Definicioacuten 226 Las relaciones homogeacuteneas que son a la vez reflexivas simeacutetricas y tran-sitivas se denominan relaciones de equivalencia
La funcioacuten (esRelacionEquivalencia xs r) se verifica si r es una relacioacuten de equi-valencia en xs-- | Ejemplos
-- gtgtgt esRelacionEquivalencia [13] [(11)(12)(21)(22)(33)]
-- True
-- gtgtgt esRelacionEquivalencia [13] [(12)(21)(22)(33)]
-- False
-- gtgtgt esRelacionEquivalencia [13] [(11)(12)(22)(33)]
-- False
esRelacionEquivalencia Ord a =gt [a] -gt [(aa)] -gt Bool
esRelacionEquivalencia xs r =
esReflexiva xs r ampamp
esSimetrica r ampamp
esTransitiva r
Nota 226 En el conjunto N la relacioacuten caracterizada por xSy larrrarr xminus y es par esuna relacioacuten de equivalencia
226 Relaciones de orden
Definicioacuten 227 Las relaciones homogeacuteneas que son a la vez reflexivas antisimeacutetricas ytransitivas se denominan relaciones de orden
23 Funciones 43
La funcioacuten (esRelacionOrden xs r) se verifica si r es una relacioacuten de orden en xs
-- | Ejemplo
-- gtgtgt esRelacionOrden [13] [(11)(12)(13)(22)(23)(33)]
-- True
esRelacionOrden Ord a =gt [a] -gt [(aa)] -gt Bool
esRelacionOrden xs r =
esReflexiva xs r ampamp
esAntisimetrica r ampamp
esTransitiva r
Nota 227 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xTylarrrarr x divide a yson relaciones de orden
227 Clases de equivalencia
Definicioacuten 228 Si R es una relacioacuten de equivalencia en A denominamos clase de equi-valencia de un elemento x isin A al conjunto de todos los elementos de A relacionados con xes decir x = R(x) = y isin A|xRy donde la primera notacioacuten se usa si la relacioacuten con laque se estaacute tratando se sobreentiende y la segunda si no es asiacute
La funcioacuten (clasesEquivalencia xs r) devuelve las clases de la relacioacuten de equi-valencia r en xs
-- | Ejemplo
-- gtgtgt let r = [(xy) | x lt- [15] y lt- [15] even (x-y)]
-- gtgtgt clasesEquivalencia [15] r
-- [[135][24]]
clasesEquivalencia Ord a =gt [a] -gt [(aa)] -gt [[a]]
clasesEquivalencia _ [] = []
clasesEquivalencia [] _ = []
clasesEquivalencia (xxs) r = (xc) clasesEquivalencia (xs c) r
where c = filter (estaRelacionado r x) xs
23 Funciones
Definicioacuten 231 Dada una relacioacuten F entre A y B se diraacute que es una funcioacuten si es unarelacioacuten binaria es funcional y todos los elementos de A estaacuten en el dominio
La funcioacuten (esFuncion xs ys f) se verifica si f es una funcioacuten de xs en ys
-- | Ejemplos
-- gtgtgt esFuncion [13] [247] [(17)(32)]
44 Capiacutetulo 2 Relaciones y funciones
-- True
-- gtgtgt esFuncion [13] [247] [(17)]
-- False
-- gtgtgt esFuncion [13] [247] [(14)(17)(32)]
-- False
esFuncion (Ord a Ord b) =gt [a] -gt [b] -gt [(ab)] -gt Bool
esFuncion xs ys f =
esRelacion xs ys f ampamp
xs `esSubconjunto` dominio f ampamp
esFuncional f
Nota 231 A lo largo de la seccioacuten representaremos a las funciones como listas depares
type Funcion a b = [(ab)]
La funcioacuten (funciones xs ys) devuelve todas las posibles funciones del conjuntoxs en ys
-- | Ejemplos
-- gtgtgt pp $ funciones [12] [34]
-- [[(1 3)(2 3)][(1 3)(2 4)][(1 4)(2 3)]
-- [(1 4)(2 4)]]
-- gtgtgt pp $ funciones [12] [345]
-- [[(1 3)(2 3)][(1 3)(2 4)][(1 3)(2 5)]
-- [(1 4)(2 3)][(1 4)(2 4)][(1 4)(2 5)]
-- [(1 5)(2 3)][(1 5)(2 4)][(1 5)(2 5)]]
-- gtgtgt pp $ funciones [012] [34]
-- [[(0 3)(1 3)(2 3)][(0 3)(1 3)(2 4)]
-- [(0 3)(1 4)(2 3)][(0 3)(1 4)(2 4)]
-- [(0 4)(1 3)(2 3)][(0 4)(1 3)(2 4)]
-- [(0 4)(1 4)(2 3)][(0 4)(1 4)(2 4)]]
funciones [a] -gt [b] -gt [Funcion a b]
funciones xs ys =
[zip xs zs | zs lt- variacionesR (length xs) ys]
231 Imagen por una funcioacuten
Definicioacuten 232 Si f es una funcioacuten entre A y B y x es un elemento del conjunto A laimagen del elemento x por la funcioacuten f es el valor asociado a x por la funcioacuten f
La funcioacuten (imagen f x) es la imagen del elemento x en la funcioacuten f
-- | Ejemplos
-- gtgtgt imagen [(17)(32)] 1
-- 7
-- gtgtgt imagen [(17)(32)] 3
23 Funciones 45
-- 2
imagen (Ord a Ord b) =gt Funcion a b -gt a -gt b
imagen f x = head (imagenRelacion f x)
La funcioacuten (imagenConjunto f xs) es la imagen del conjunto xs en la funcioacuten f
-- | Ejemplos
-- gtgtgt imagenConjunto [(17)(32)(43)] [14]
-- [73]
-- gtgtgt imagenConjunto [(17)(32)] [31]
-- [27]
imagenConjunto (Ord a Ord b) =gt Funcion a b -gt [a] -gt [b]
imagenConjunto f xs = nub (map (imagen f) xs)
232 Funciones inyectivas
Definicioacuten 233 Diremos que una funcioacuten f entre dos conjuntos es inyectiva 2 si a ele-mentos distintos del dominio le corresponden elementos distintos de la imagen es decir siforalla b isin dominio( f ) tales que a 6= b f (a) 6= f (b)
La funcioacuten (esInyectiva fs) se verifica si la funcioacuten fs es inyectiva
-- | Ejemplos
-- gtgtgt esInyectiva [(14)(25)(36)]
-- True
-- gtgtgt esInyectiva [(14)(25)(34)]
-- False
-- gtgtgt esInyectiva [(14)(25)(36)(36)]
-- True
esInyectiva (Ord a Ord b) =gt Funcion a b -gt Bool
esInyectiva f =
all esUnitario [antiImagenRelacion f y | y lt- rango f]
233 Funciones sobreyectivas
Definicioacuten 234 Diremos que una funcioacuten f entre dos conjuntos A y B es sobreyectiva3 si todos los elementos de B son imagen de alguacuten elemento de A
La funcioacuten (esSobreyectiva xs ys f) se verifica si la funcioacuten f es sobreyectiva Ala hora de definirla estamos contando con que f es una funcioacuten entre xs y ys
-- | Ejemplos
-- gtgtgt esSobreyectiva [123] [456] [(14)(25)(36)]
2httpsenwikipediaorgwikiInjective_function3httpsenwikipediaorgwikiSurjective_function
46 Capiacutetulo 2 Relaciones y funciones
-- True
-- gtgtgt esSobreyectiva [123] [456] [(14)(25)(34)]
-- False
-- gtgtgt esSobreyectiva [123] [456] [(14)(24)(36)(36)]
-- False
esSobreyectiva (Ord aOrd b) =gt [a] -gt [b] -gt Funcion a b -gt Bool
esSobreyectiva _ ys f = ys `esSubconjunto` rango f
234 Funciones biyectivas
Definicioacuten 235 Diremos que una funcioacuten f entre dos conjuntos A y B es biyectiva 4 sicada elementos de B es imagen de un uacutenico elemento de A
La funcioacuten (esBiyectiva xs ys f) se verifica si la funcioacuten f es biyectiva
-- | Ejemplos
-- gtgtgt esBiyectiva [123] [456] [(14)(25)(36)(36)]
-- True
-- gtgtgt esBiyectiva [123] [456] [(14)(25)(34)]
-- False
-- gtgtgt esBiyectiva [123] [4567] [(14)(25)(36)]
-- False
esBiyectiva (Ord a Ord b) =gt [a] -gt [b] -gt Funcion a b -gt Bool
esBiyectiva xs ys f =
esInyectiva f ampamp esSobreyectiva xs ys f
La funciones biyecciones1 xs ys y biyecciones2 xs ys devuelven la lista de to-das las biyecciones entre los conjuntos xs y ys La primera lo hace filtrando las fun-ciones entre los conjuntos que son biyectivas y la segunda lo hace construyendouacutenicamente las funciones biyectivas entre los conjuntos con el consecuente ahorrocomputacional
ghcigt length (biyecciones1 [17] [ag])
5040
(1675 secs 4146744104 bytes)
ghcigt length (biyecciones2 [17] [ag])
5040
(002 secs 0 bytes)
ghcigt length (biyecciones1 [16] [ag])
0
(253 secs 592625824 bytes)
ghcigt length (biyecciones2 [16] [ag])
0
(001 secs 0 bytes)
4httpsenwikipediaorgwikiBijective_function
23 Funciones 47
biyecciones1 (Ord a Ord b) =gt [a] -gt [b] -gt [Funcion a b]
biyecciones1 xs ys =
filter (esBiyectiva xs ys) (funciones xs ys)
biyecciones2 (Ord a Ord b) =gt [a] -gt [b] -gt [Funcion a b]
biyecciones2 xs ys
| length xs = length ys = []
| otherwise = [zip xs zs | zs lt- permutations ys]
Nota 232 En lo que sigue trabajaremos con la funcioacuten biyecciones2 asiacute que laredefiniremos como biyecciones
biyecciones (Ord a Ord b) =gt [a] -gt [b] -gt [Funcion a b]
biyecciones = biyecciones2
235 Inversa de una funcioacuten
Definicioacuten 236 Si f es una funcioacuten biyectiva entre los conjuntos A y B definimos lafuncioacuten inversa 5 como la funcioacuten que a cada elemento de B le hace corresponder el elementode A del que es imagen en B
El valor de (inversa f) es la funcioacuten inversa de f
-- | Ejemplos
-- gtgtgt inversa [(14)(25)(36)]
-- [(41)(52)(63)]
-- gtgtgt sort (inversa [(1f)(2m)(3a)])
-- [(a3)(f1)(m2)]
inversa (Ord a Ord b) =gt Funcion a b -gt Funcion b a
inversa f = listaAConjunto [(yx) | (xy) lt- f]
Nota 233 Para considerar la inversa de una funcioacuten esta tiene que ser biyectivaLuego (inversa f) asigna a cada elemento del conjunto imagen (que en este casocoincide con la imagen) uno y solo uno del conjunto de salida
La funcioacuten (imagenInversa f y) devuelve el elemento del conjunto de salida de lafuncioacuten f tal que su imagen es y
-- | Ejemplos
-- gtgtgt imagenInversa [(14)(25)(36)] 5
-- 2
-- gtgtgt imagenInversa [(1f)(2m)(3a)] a
-- 3
imagenInversa (Ord a Ord b) =gt Funcion a b -gt b -gt a
imagenInversa f = imagen (inversa f)
5httpsenwikipediaorgwikiInverse_function
48 Capiacutetulo 2 Relaciones y funciones
Capiacutetulo 3
Introduccioacuten a la teoriacutea de grafos
Se dice que la Teoriacutea de Grafos tiene su origen en 1736 cuando Euler dio una so-lucioacuten al problema (hasta entonces no resuelto) de los siete puentes de Koumlnigsbergiquestexiste un camino que atraviese cada uno de los puentes exactamente una vezPara probar que no era posible Euler sustituyoacute cada regioacuten por un nodo y cadapuente por una arista creando el primer grafo que fuera modelo de un problemamatemaacutetico
Figura 31 Dibujo de los puentes de Koumlnigsberg
A
B
C
D
b
c
a
d
f
e
g
Figura 32 Modelo de los puentes de Koumlnigsberg
Desde entonces se ha ido desarrollando esta metodologiacutea hasta convertise en los uacutel-timos antildeos en una herramienta importante en aacutereas del conocimiento muy variadascomo por ejemplo la Investigacioacuten Operativa la Computacioacuten la Ingenieriacutea Eleacutec-trica la Geografiacutea y la Quiacutemica Es por ello que ademaacutes se ha erigido como unanueva disciplina matemaacutetica que generalmente asociada a las ramas de Topologiacuteay AacutelgebraLa utilidad de los grafos se basa en su gran poder de abstraccioacuten y una representa-cioacuten muy clara de cualquier relacioacuten lo que facilita enormemente tanto la fase demodelado como la de resolucioacuten de cualquier problema Gracias a la Teoriacutea de Gra-fos se han desarrollado una gran variedad de algoritmos y meacutetodos de decisioacuten quepodemos implementar a traveacutes de lenguajes funcionales y permiten automatizar laresolucioacuten de muchos problemas a menudo tediosos de resolver a mano
49
50 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
31 Definicioacuten de grafo
En primer lugar vamos a introducir terminologiacutea baacutesica en el desarrollo de la Teoriacuteade Grafos
Definicioacuten 311 Un grafo G es un par (V A) donde V es el conjunto cuyos elementosllamamos veacutertices (o nodos) y A es un conjunto cuyos elementos llamamos aristas
Definicioacuten 312 Una arista de un grafo G = (V A) es un conjunto de dos elementosde V Es decir para dos veacutertices v vprime de G (v vprime) y (vprime v) representa la misma arista
Definicioacuten 313 Dado un grafo G = (V A) diremos que un veacutertice v isin V es adyacentea vprime isin V si (vprime v) isin A
Definicioacuten 314 Si en un grafo dirigido se permiten aristas repetidas lo llamaremos mul-tigrafo Si no se permiten lo llamaremos grafo regular
Nota 311 Denotaremos por |V| al nuacutemero de veacutertices y por |A| al nuacutemero de aristasdel grafo (V A)
Ejemplo 312 Sea G = (V A) un grafo con V = a b c d y A = (a b) (a c) (b d)(d d) En este grafo los veacutertices a d son adyacentes a b
a
b
c
d
32 El TAD de los grafos
En esta seccioacuten nos planteamos la tarea de implementar las definiciones presenta-das anteriormente en un lenguaje funcional En nuestro caso el lenguaje que utili-zaremos seraacute Haskell Definiremos el Tipo Abstracto de Dato (TAD) de los grafos ydaremos algunos ejemplos de posibles representaciones de grafos con las que po-dremos trabajarSi consideramos un grafo finito cualquiera G = (V A) podemos ordenar el conjun-to de los veacutertices y representarlo como V = v1 vn con n = |V|En primer lugar necesitaremos crear un tipo (Grafo) cuya definicioacuten sea compatiblecon la entidad matemaacutetica que representa y que nos permita definir las operacionesque necesitamos para trabajar con los grafos Estas operaciones son
32 El TAD de los grafos 51
creaGrafo -- [a] -gt [(aa)] -gt Grafo a
vertices -- Grafo a -gt [a]
adyacentes -- Grafo a -gt a -gt [a]
aristaEn -- (aa) -gt Grafo a -gt Bool
aristas -- Grafo a -gt [(aa)]
dondebull (creaGrafo vs as) es un grafo tal que el conjunto de sus veacutertices es vs y el de
sus aristas es asbull (vertices g) es la lista de todos los veacutertices del grafo gbull (adyacentes g v) es la lista de los veacutertices adyacentes al veacutertice v en el grafo gbull (aristaEn a g) se verifica si a es una arista del grafo gbull (aristas g) es la lista de las aristas del grafo g
Nota 321 Las funciones que aparecen en la especificacioacuten del TAD no dependende la representacioacuten que elijamos
Ejemplo 322 Veamos un ejemplo de creacioacuten de grafo y su representacioacuten graacutefica
creaGrafo [15] [(12)(13)(15)(24)
(25)(34)(35)(45)]
1
2
34
5
321 Grafos como listas de aristas
En el moacutedulo GrafoConListaDeAristas se definen las funciones del TAD de losgrafos dando su representacioacuten como conjuntos de aristas es decir representandoa un grafo como dos conjuntos la primera seraacute la lista ordenada de los veacutertices y lasegunda la lista ordenada de las aristas (en ambas listas se excluye la posibilidad derepeticiones)
Nota 323 Las ventajas de usar arrays frente a usar listas es que los array tienenacceso constante (O(1)) a sus elementos mientras que las listas tienen acceso lineal(O(n)) y que la actualizacioacuten de un elemento en un array no supone espacio extraSin embargo los arrays son representaciones muy riacutegidas cualquier modificacioacutenen su estructura como cambiar su tamantildeo supone un gran coste computacionalpues se tendriacutea que crear de nuevo el array y ademaacutes sus iacutendices deben pertenecer
52 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
a la clase de los objetos indexables (Ix) luego perdemos mucha flexibilidad en larepresentacioacuten
- LANGUAGE DeriveGeneric -
module GrafoConListaDeAristas
( Grafo
creaGrafo -- [a] -gt [(aa)] -gt Grafo a
vertices -- Grafo a -gt [a]
adyacentes -- Grafo a -gt a -gt [a]
aristaEn -- (aa) -gt Grafo a -gt Bool
aristas -- Grafo a -gt [(aa)]
) where
En las definiciones del presente moacutedulo se usaraacuten las funciones nub y sort de lalibreriacutea DataList
Vamos a definir un nuevo tipo de dato (Grafo a) que representaraacute un grafo a partirde la lista de sus veacutertices (donde los veacutertices son de tipo a) y de aristas (que son paresde veacutertices)
data Grafo a = G [a] [(aa)]
deriving (Eq Show Generic)
instance (Out a) =gt Out (Grafo a)
Las funciones baacutesicas que definiremos a partir de este tipo coincidiraacuten con las indi-cadas en el TAD de los grafosbull (creaGrafo vs as) es el grafo cuyo conjunto de veacutertices es cs y el de sus aristas
es as-- | Ejemplo
-- gtgtgt creaGrafo [15] [(12)(14)(15)(23)(25)(34)(35)]
-- G [12345] [(12)(14)(15)(23)(25)(34)(35)]
creaGrafo Ord a =gt [a] -gt [(aa)] -gt Grafo a
creaGrafo vs as =
G (sort vs) (nub (sort [parOrdenado a | a lt- as]))
parOrdenado Ord a =gt (aa) -gt (aa)
parOrdenado (xy) | x lt= y = (xy)
| otherwise = (yx)
Ejemplo 324 ejGrafo es el grafo
32 El TAD de los grafos 53
1
2
3
4
5
Los ejemplos usaraacuten el siguiente grafo
ejGrafo Grafo Int
ejGrafo = creaGrafo [15]
[(12)(14)(15)(23)(25)(34)(35)(45)]
bull (vertices g) es la lista de los veacutertices del grafo g
-- | Ejemplo
-- gtgtgt vertices ejGrafo
-- [12345]
vertices Grafo a -gt [a]
vertices (G vs _) = vs
bull (adyacentes g v) es la lista de los veacutertices adyacentes al veacutertice v en el grafo g
-- | Ejemplos
-- gtgtgt adyacentes ejGrafo 4
-- [135]
-- gtgtgt adyacentes ejGrafo 3
-- [245]
adyacentes Eq a =gt Grafo a -gt a -gt [a]
adyacentes (G _ as) v =
[u | (ux) lt- as x == v] `union` [u | (xu) lt- as x == v]
bull (aristaEn a g) se verifica si a es una arista del grafo g
-- | Ejemplos
-- gtgtgt (51) `aristaEn` ejGrafo
-- True
-- gtgtgt (31) `aristaEn` ejGrafo
-- False
aristaEn Ord a =gt (aa) -gt Grafo a -gt Bool
aristaEn a (G _ as) = parOrdenado a `elem` as
bull (aristas g) es la lista de las aristas del grafo g
-- | Ejemplo
-- gtgtgt aristas ejGrafo
-- [(12)(14)(15)(23)(25)(34)(35)(45)]
aristas Grafo a -gt [(aa)]
aristas (G _ as) = as
54 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
33 Generador de grafos
En esta seccioacuten presentaremos el generador de grafos que nos permitiraacute generargrafos como listas de aristas arbitrariamente y usarlos como ejemplos o para com-probar propiedadesPara aprender a controlar el tamantildeo de los grafos generados he consultado las si-guientes fuentes QuickCheck A Lightweight Tool for Random Testing of Haskell Programs 1
([3]) Property Testing using QuickCheck 2 ([9])(generaGrafos n) es un generador de grafos de hasta n veacutertices Por ejemplo
ghcigt sample (generaGrafo 5)
G [12] []
G [1] [(11)]
G [] []
G [1234] [(22)]
G [123] [(11)(12)(13)(22)]
G [12345] [(12)(14)(15)(22)(23)(24)(33)(34)(44)(45)]
G [1] []
G [123] [(12)(22)(33)]
G [1234] [(11)(14)(23)(24)(33)(34)(44)]
G [12] []
G [123] [(11)(12)(22)(33)]
ghcigt sample (generaGrafo 2)
G [12] [(12)(22)]
G [12] [(11)]
G [12] [(11)(12)]
G [] []
G [1] [(11)]
G [1] []
G [1] []
G [] []
G [] []
G [] []
G [1] [(11)]
generaGrafo Int -gt Gen (Grafo Int)
generaGrafo s = do
let m = s `mod` 11
n lt- choose (0m)
as lt- sublistOf [(xy) | x lt- [1n] y lt- [xn]]
return (creaGrafo [1n] as)
1httpswwweecsnorthwesternedu~robbycourses395-495-2009-fallquickpdf2httpswwwdccfcuppt~pbvaulastapfslidesquickcheckhtml
34 Ejemplos de grafos 55
Nota 331 Los grafos estaacuten contenidos en la clase de los objetos generables aleato-riamente
instance Arbitrary (Grafo Int) where
arbitrary = sized generaGrafo
En el siguiente ejemplo se pueden observar algunos grafos generados
ghcigt sample (arbitrary Gen (Grafo Int))
G [] []
G [1] [(11)]
G [12] [(11)(12)]
G [1] [(11)]
G [12345678] [(14)(17)(22)(23)(25)(28)(35)
(36)(38)(44)(46)(47)(48)(56)(66)(67)(78)]
G [12345] [(11)(12)(14)(15)(24)(25)(34)(55)]
G [] []
G [] []
G [123] [(11)(22)(23)]
G [1234] [(11)(12)(14)(22)(33)]
G [1234567] [(11)(15)(16)(17)(22)(24)(25)
(26)(27)(33)(35)(46)(47)(55)(57)(66)(77)]
34 Ejemplos de grafos
El objetivo de esta seccioacuten es reunir una coleccioacuten de grafos lo suficientemente ex-tensa y variada como para poder utilizarla como recurso a la hora de comprobar laspropiedades y definiciones de funciones que implementaremos maacutes adelanteEn el proceso de recopilacioacuten de ejemplos se ha trabajado con diversas fuentesbull los apuntes de la asignatura ldquoMatemaacutetica discretardquo ([4])bull los temas de la asignatura ldquoInformaacuteticardquo ([1]) ybull el artiacuteculo ldquoGraph theoryrdquo ([11]) de la Wikipedia
Nota 341 Se utilizaraacute la representacioacuten de los grafos como listas de aristas
341 Grafo nulo
Definicioacuten 341 Un grafo nulo es un grafo que no tiene ni veacutertices ni aristas
La funcioacuten (grafoNulo) devuelve un grafo nulo
grafoNulo Ord a =gt Grafo a
grafoNulo = creaGrafo [] []
La funcioacuten (esGrafoNulo g) se verifica si g es un grafo nulo
56 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- | Ejemplos
-- gtgtgt esGrafoNulo grafoNulo
-- True
-- gtgtgt esGrafoNulo (creaGrafo [] [(12)])
-- False
-- gtgtgt esGrafoNulo (creaGrafo [12] [(12)])
-- False
esGrafoNulo Grafo a -gt Bool
esGrafoNulo g =
null (vertices g) ampamp null (aristas g)
342 Grafo ciclo
Definicioacuten 342 Un ciclo 3 de orden n C(n) es un grafo no dirigido y no ponderadocuyo conjunto de veacutertices viene dado por V = 1 n y el de las aristas por A = (0 1)(1 2) (nminus 2 nminus 1) (nminus 1 0)
La funcioacuten (grafoCiclo n) nos genera el ciclo de orden n
1
23
45
-- | Ejemplos
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
grafoCiclo Int -gt Grafo Int
grafoCiclo 0 = grafoNulo
grafoCiclo 1 = creaGrafo [1] []
grafoCiclo n = creaGrafo [1n]
([(uu+1) | u lt- [1n-1]] ++ [(n1)])
343 Grafo de la amistad
Definicioacuten 343 Un grafo de la amistad 4 de orden n es un grafo con 2n + 1 veacuterticesy 3n aristas formado uniendo n copias del ciclo C3 por un veacutertice comuacuten Lo denotamos porFn3httpseswikipediaorgwikiGrafo_completo4httpseswikipediaorgwikiGrafo_de_la_amistad
34 Ejemplos de grafos 57
La funcioacuten (grafoAmistad n) genera el grafo de la amistad de orden n Por ejemplo
1
2
34
5
1
2
3
4
5
6
7
-- | Ejemplos
-- gtgtgt pp $ grafoAmistad 2
-- G [12345]
-- [(1 2)(1 3)(1 4)(1 5)(2 3)(4 5)]
-- gtgtgt pp $ grafoAmistad 3
-- G [1234567]
-- [(1 2)(1 3)(1 4)(1 5)(1 6)(1 7)(2 3)
-- (4 5)(6 7)]
grafoAmistad Int -gt Grafo Int
grafoAmistad n =
creaGrafo [12n+1]
([(1a) | a lt- [22n+1]] ++
[(ab) | (ab) lt-zip [242n] [352n+1]])
344 Grafo completo
Definicioacuten 344 El grafo completo 5 de orden n K(n) es un grafo no dirigido cuyoconjunto de veacutertices viene dado por V = 1 n y tiene una arista entre cada par deveacutertices distintos
La funcioacuten (completo n) nos genera el grafo completo de orden n Por ejemplo
5httpseswikipediaorgwikiGrafo_completo
58 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
1
2
3
4
-- | Ejemplo
-- gtgtgt completo 4
-- G [1234] [(12)(13)(14)(23)(24)(34)]
completo Int -gt Grafo Int
completo n =
creaGrafo [1n]
[(ab) | a lt- [1n] b lt- [1a-1]]
345 Grafo bipartito
Definicioacuten 345 Un grafo bipartito 6 es un grafo G = (V A) verificando que elconjunto de sus veacutertices se puede dividir en dos subconjuntos disjuntos V1 V2 tales queV1 cupV2 = V de manera que forallu1 u2 isin V1[(u1 u2) 6isin A] y forallv1 v2 isin V2[(v1 v2) 6isin A]Un grafo bipartito completo 7 seraacute entonces un grafo bipartito G = (V1 cup V2 A) en elque todos los veacutertices de una particioacuten estaacuten conectados a los de la otra Si n = |V1| m =
|V2| denotamos al grafo bipartito G = (V1 cupV2 A) por Knm
La funcioacuten (bipartitoCompleto n m) nos genera el grafo bipartito Knm Por ejem-plo
1 2
3 4 5
-- | Ejemplo
-- gtgtgt bipartitoCompleto 2 3
-- G [12345] [(13)(14)(15)(23)(24)(25)]
bipartitoCompleto Int -gt Int -gt Grafo Int
bipartitoCompleto n m =
creaGrafo [1n+m]
[(ab) | a lt- [1n] b lt- [n+1n+m]]
6httpseswikipediaorgwikiGrafo_bipartito7httpseswikipediaorgwikiGrafo_bipartito_completo
34 Ejemplos de grafos 59
La funcioacuten (conjuntosVerticesDisjuntos g) devuelve Nothing si el grafo g no esbipartito y Just(xsys) si lo es donde xs ys es una particioacuten disjunta de los veacuterticesde g
-- | Ejemplo
-- gtgtgt conjuntosVerticesDisjuntos (bipartitoCompleto 3 4)
-- Just ([321][7654])
-- gtgtgt conjuntosVerticesDisjuntos (grafoCiclo 5)
-- Nothing
-- gtgtgt conjuntosVerticesDisjuntos (grafoCiclo 6)
-- Just ([531][642])
conjuntosVerticesDisjuntos Ord a =gt Grafo a -gt Maybe ([a][a])
conjuntosVerticesDisjuntos g
| null (vertices g) = Just ([][])
| otherwise = aux (vertices g) [] [] [] []
where u = union
a = adyacentes g
d xs x = xs [x]
aux [] _ _ r b = if (null (intersect r b))
then (Just (rb))
else Nothing
aux (vvs) [] [] [] [] = aux vs (a v) [v] [v] []
aux (vvs) [] c r b
| null (a v) = aux vs [] (vc) (vr) b
| null ((a v) c) =
if (or [elem u r | u lt- (a v)])
then (if (or [elem u b | u lt- (a v)])
then Nothing
else (aux vs [] (vc) r (vb)))
else (aux vs [] (vc) (vr) b)
| otherwise =
if (or [elem u r | u lt- (a v)])
then (if (or [elem u b | u lt- (a v)])
then Nothing
else (aux vs ((a v) c) (vc) r (vb)))
else (aux vs ((a v) c) (vc) (vr) b)
aux vs (qqs) c r b
| null ((a q) c) =
if (or [elem u r | u lt- (a q)])
then (if (or [elem u b | u lt- (a q)])
then Nothing
else (aux (d vs q) qs (qc) r (qb)))
else (aux (d vs q) qs (qc) (qr) b)
| otherwise =
if (or [elem u r | u lt- (a q)])
then (if (or [elem u b | u lt- (a q)])
then Nothing
else (aux (d vs q) (u ((a q) c) qs)
60 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
(qc) r (qb)))
else (aux (d vs q) (u ((a q) c) qs)
(qc) (qr) b)
La funcioacuten (esBipartito g) se verifica si el grafo g es bipartito
-- | Ejemplo
-- gtgtgt esBipartito (bipartitoCompleto 3 4)
-- True
-- gtgtgt esBipartito (grafoCiclo 5)
-- False
-- gtgtgt esBipartito (grafoCiclo 6)
-- True
esBipartito Ord a =gt Grafo a -gt Bool
esBipartito g = isJust (conjuntosVerticesDisjuntos g)
346 Grafo estrella
Definicioacuten 346 Una estrella 8 de orden n es el grafo bipartito completo K1n Denota-remos a una estrella de orden n por Sn Una estrella con 3 aristas se conoce en ingleacutes comoclaw (garra o garfio)
La funcioacuten (grafoEstrella n) crea un grafo circulante a partir de su orden n
2
34
56
1
-- | Ejemplo
-- gtgtgt grafoEstrella 5
-- G [123456] [(12)(13)(14)(15)(16)]
grafoEstrella Int -gt Grafo Int
grafoEstrella = bipartitoCompleto 1
347 Grafo rueda
Definicioacuten 347 Un grafo rueda 9 de orden n es un grafo no dirigido y no ponderado conn veacutertices que se forma conectando un uacutenico veacutertice a todos los veacutertices de un ciclo Cnminus1 Lodenotaremos por Wn8httpsenwikipediaorgwikiStar_(graph_theory))9httpseswikipediaorgwikiGrafo_rueda
34 Ejemplos de grafos 61
La funcioacuten (grafoRueda n) crea un grafo rueda a partir de su orden n
2
34
56
1
-- | Ejemplo
-- gtgtgt pp $ grafoRueda 6
-- G [123456]
-- [(1 2)(1 3)(1 4)(1 5)(1 6)(2 3)(2 6)
-- (3 4)(4 5)(5 6)]
grafoRueda Int -gt Grafo Int
grafoRueda n =
creaGrafo [1n]
([(1a) | a lt- [2n]] ++
[(ab) | (ab) lt- zip (2[2n-1]) (3n[4n])])
348 Grafo circulante
Definicioacuten 348 Un grafo circulante 10 de orden n ge 3 y saltos s1 sk es un grafono dirigido y no ponderado G = (1 n A) en el que cada nodo foralli isin V es adyacente alos 2k nodos iplusmn s1 iplusmn sk mod n Lo denotaremos por Cirs1sk
n
La funcioacuten (grafoCirculante n ss) crea un grafo circulante a partir de su orden n
y de la lista de sus saltos ss Por ejemplo
2
34
5
6 1
-- | Ejemplo
-- gtgtgt pp $ grafoCirculante 6 [12]
-- G [123456]
-- [(1 2)(1 3)(1 5)(1 6)(2 3)(2 4)(2 6)
-- (3 4)(3 5)(4 5)(4 6)(5 6)]
grafoCirculante Int -gt [Int] -gt Grafo Int
grafoCirculante n ss =
10httpsenwikipediaorgwikiCirculant_graph
62 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
creaGrafo [1n]
[(ab) | a lt- [1n]
b lt- sort (auxCir a ss n)
a lt b]
where auxCir v ss1 k =
concat [[fun (v+s) k fun (v-s) k] | s lt- ss1]
fun a b = if mod a b == 0 then b else mod a b
349 Grafo de Petersen generalizado
El grafo de Petersen generalizado 11 que denotaremos GPnk (con n ge 3 y 1 le k le(nminus 1)2) es un grafo formado por un grafo circulante Cirn
k en el interior rodeadopor un ciclo Cn al que estaacute conectado por una arista saliendo de cada veacutertice deforma que se creen n poliacutegonos regulares El grafo GPnk tiene 2n veacutertices y 3n aristasLa funcioacuten (grafoPetersenGen n k) devuelve el grafo de Petersen generalizadoGPnk
1
2
3
4
5
6
7
8
-- | Ejemplo
-- gtgtgt pp $ grafoPetersenGen 4 2
-- G [12345678]
-- [(1 3)(1 5)(2 4)(2 6)(3 7)(4 8)(5 6)
-- (5 8)(6 7)(7 8)]
grafoPetersenGen Int -gt Int -gt Grafo Int
grafoPetersenGen n k =
creaGrafo [12n]
(filter p (aristas (grafoCirculante n [k])) ++
[(xx+n) | x lt- [1n]] ++
(n+1n+2) (n+12n) [(xx+1) | x lt- [n+22n-1]])
where p (ab) = a lt b
11httpsenwikipediaorgwikiGeneralized_Petersen_graph
34 Ejemplos de grafos 63
3410 Otros grafos importantes
Grafo de Thomson
Definicioacuten 349 El grafo bipartito completo K33 es conocido como el grafo de Thomsony como veremos maacutes adelante seraacute clave a la hora de analizar propiedades topoloacutegicas de losgrafos
1 2 3
4 5 6
La funcioacuten (grafoThomson) genera el grafo de Thomson
-- | Ejemplo
-- gtgtgt pp $ grafoThomson
-- G [123456]
-- [(1 4)(1 5)(1 6)(2 4)(2 5)(2 6)(3 4)
-- (3 5)(3 6)]
grafoThomson Grafo Int
grafoThomson = bipartitoCompleto 3 3
Grafo de Heawood
El grafo de Heawood 12 es un grafo no dirigido regular con 14 veacutertices y 21 aris-tas Todos sus veacutertices son incidentes a exactamente 3 aristas es decir es un grafocuacutebico Tiene importantes propiedades geomeacutetricas y topoloacutegicas
1
2
3
45
6
7
8
9
10
11 12
13
14
12httpsenwikipediaorgwikiHeawood_graph
64 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten grafoHeawood genera el grafo de Heawood
-- | Ejemplo
-- gtgtgt pp $ grafoHeawood
-- G [1234567891011121314]
-- [(1 2)(1 6)(1 14)(2 3)(2 11)(3 4)(3 8)
-- (4 5)(4 13)(5 6)(5 10)(6 7)(7 8)(7 12)
-- (8 9)(9 10)(9 14)(10 11)(11 12)(12 13)
-- (13 14)]
grafoHeawood Grafo Int
grafoHeawood =
creaGrafo [114]
(aristas (grafoCiclo 14) ++
zip [1 23 4 5 7 9]
[611813101214])
Grafo de McGee
El grafo de McGee 13 es un grafo no dirigido cuacutebico con 24 veacutertices y 36 aristasTiene importantes propiedades geomeacutetricas y topoloacutegicas
1
2
3
45
6789
10
11
12
13
14
15
1617
18 19 2021
22
23
24
La funcioacuten grafoMcGee genera el grafo de McGee
-- | Ejemplo
-- gtgtgt pp $ grafoMcGee
-- G [12345678910111213141516171819
-- 2021222324]
-- [(1 2)(1 13)(1 24)(2 3)(2 9)(3 4)(3 20)
13httpsenwikipediaorgwikiMcGee_graph
34 Ejemplos de grafos 65
-- (4 5)(4 16)(5 6)(5 12)(6 7)(6 23)(7 8)
-- (7 19)(8 9)(8 15)(9 10)(10 11)(10 22)
-- (11 12)(11 18)(12 13)(13 14)(14 15)
-- (14 21)(15 16)(16 17)(17 18)(17 24)
-- (18 19)(19 20)(20 21)(21 22)(22 23)
-- (23 24)]
grafoMcGee Grafo Int
grafoMcGee =
creaGrafo [124]
(aristas (grafoCiclo 24) ++
zip [ 12 3 4 5 6 7 810111417]
[13920161223191522182124])
Grafo TuttendashCoxeter
El grafo TuttendashCoxeter 14 es un grafo no dirigido cuacutebico con 30 veacutertices y 45 aristasTiene importantes propiedades geomeacutetricas y topoloacutegicas
1
2
3
4
56
7891011
12
13
14
15
16
17
18
19
2021
22 23 24 2526
27
28
29
30
La funcioacuten grafoTutteCoxeter genera el grafo TuttendashCoxeter
-- | Ejemplo
-- gtgtgt pp $ grafoTutteCoxeter
-- G [12345678910111213141516171819
-- 2021222324252627282930]
14httpsenwikipediaorgwikiTutteT1textendashCoxeter_graph
66 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- [(1 2)(1 18)(1 30)(2 3)(2 23)(3 4)
-- (3 10)(4 5)(4 27)(5 6)(5 14)(6 7)(6 19)
-- (7 8)(7 24)(8 9)(8 29)(9 10)(9 16)
-- (10 11)(11 12)(11 20)(12 13)(12 25)
-- (13 14)(13 30)(14 15)(15 16)(15 22)
-- (16 17)(17 18)(17 26)(18 19)(19 20)
-- (20 21)(21 22)(21 28)(22 23)(23 24)
-- (24 25)(25 26)(26 27)(27 28)(28 29)
-- (29 30)]
grafoTutteCoxeter Grafo Int
grafoTutteCoxeter =
creaGrafo [130]
(aristas (grafoCiclo 30) ++
zip [ 1 2 3 4 5 6 7 8 9111213151721]
[182310271419242916202530222628])
Grafo de Petersen
El grafo de Petersen 15 se define como el grafo de Petersen generalizado GP52 esdecir es un grafo cuacutebico formado por los veacutertices de un pentaacutegono conectados alos veacutertices de una estrella de cinco puntas en la que cada nodo es adyacente a losnodos que estaacuten a un salto 2 de eacutel Es usado como ejemplo y como contraejemplo enmuchos problemas de la Teoriacutea de grafos
6
7
8 9
101
2
3 4
5
La funcioacuten grafoPetersen devuelve el grafo de Petersen
-- | Ejemplo
-- gtgtgt pp $ grafoPetersen
-- G [12345678910]
-- [(1 3)(1 4)(1 6)(2 4)(2 5)(2 7)(3 5)
-- (3 8)(4 9)(5 10)(6 7)(6 10)(7 8)(8 9)
-- (9 10)]
grafoPetersen Grafo Int
grafoPetersen = grafoPetersenGen 5 2
15httpsenwikipediaorgwikiPetersen_graph
35 Definiciones y propiedades 67
Grafo de MoeumlbiusndashCantor
El grafo de MoeumlbiusndashCantor 16 se define como el grafo de Petersen generalizadoGP83 es decir es un grafo cuacutebico formado por los veacutertices de un octoacutegono conecta-dos a los veacutertices de una estrella de ocho puntas en la que cada nodo es adyacente alos nodos que estaacuten a un salto 3 de eacutel Al igual que el grafo de Petersen tiene impor-tantes propiedades que lo hacen ser ejemplo y contraejemplo de muchos problemasde la Teoriacutea de Grafos
9
10
11
12
13
14
15
16
1
23
4
5
67
8
La funcioacuten grafoMoebiusCantor genera el grafo de MoeumlbiusndashCantor
-- | Ejemplo
-- gtgtgt pp $ grafoMoebiusCantor
-- G [12345678910111213141516]
-- [(1 4)(1 6)(1 9)(2 5)(2 7)(2 10)(3 6)
-- (3 8)(3 11)(4 7)(4 12)(5 8)(5 13)(6 14)
-- (7 15)(8 16)(9 10)(9 16)(10 11)(11 12)
-- (12 13)(13 14)(14 15)(15 16)]
grafoMoebiusCantor Grafo Int
grafoMoebiusCantor = grafoPetersenGen 8 3
35 Definiciones y propiedades
Una vez construida una pequentildea fuente de ejemplos estamos en condiciones deimplementar las definiciones sobre grafos en Haskell y ver que funcionan correc-tamente Ademaacutes comprobaremos que se cumplen las propiedades baacutesicas que sehan presentado en el tema Introduccioacuten a la teoriacutea de grafos de ldquoMatemaacutetica discretardquo([4])
16httpsenwikipediaorgwikiMoeumlbius-Kantor_graph
68 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Nota 351 Se utilizaraacute el tipo abstracto de grafos presentados en la seccioacuten 32 y seutilizaraacuten las librerias DataList y TestQuickCheck
351 Definiciones de grafos
Definicioacuten 351 El orden de un grafo G = (V A) se define como su nuacutemero de veacuterticesLo denotaremos por |V(G)|
La funcioacuten (orden g) devuelve el orden del grafo g
-- | Ejemplos
-- gtgtgt orden (grafoCiclo 4)
-- 4
-- gtgtgt orden (grafoEstrella 4)
-- 5
orden Grafo a -gt Int
orden = length vertices
Definicioacuten 352 El tamantildeo de un grafo G = (V A) se define como su nuacutemero de aristasLo denotaremos por |A(G)|
La funcioacuten (tamantildeo g) devuelve el orden del grafo g
-- | Ejemplos
-- gtgtgt tamantildeo (grafoCiclo 4)
-- 4
-- gtgtgt tamantildeo grafoPetersen
-- 15
tamantildeo Grafo a -gt Int
tamantildeo = length aristas
Definicioacuten 353 Diremos que dos aristas a aprime son incidentes si tienen interseccioacuten novaciacutea es decir si tienen alguacuten veacutertice en comuacuten
La funcioacuten (sonIncidentes a a) se verifica si las aristas a y a son incidentes
-- | Ejemplos
-- gtgtgt sonIncidentes (12) (24)
-- True
-- gtgtgt sonIncidentes (12) (34)
-- False
sonIncidentes Eq a =gt (aa) -gt (aa) -gt Bool
sonIncidentes (u1u2) (v1v2) =
or [u1 == v1 u1 == v2 u2 == v1 u2 == v2]
Definicioacuten 354 Diremos que una arista de un grafo G es un lazo si va de un veacutertice ensiacute mismo
35 Definiciones y propiedades 69
La funcioacuten (lazos g) devuelve los lazos del grafo g
-- | Ejemplos
-- gtgtgt lazos (creaGrafo [12] [(11)(12)(22)])
-- [(11)(22)]
-- gtgtgt lazos (grafoCiclo 5)
-- []
lazos Eq a =gt Grafo a -gt [(aa)]
lazos g = [(uv) | (uv) lt- aristas g u == v]
La funcioacuten (esLazo a) se verifica si la arista a es un lazo
-- | Ejemplos
-- gtgtgt esLazo (44)
-- True
-- gtgtgt esLazo (12)
-- False
esLazo Eq a =gt (aa) -gt Bool
esLazo (uv) = u == v
Definicioacuten 355 Dado un grafo G = (V A) fijado un veacutertice v isin V al conjunto deveacutertices que son adyacentes a v lo llamaremos entorno de v y lo denotaremos por N(v) =u isin V|(u v) isin A
La funcioacuten (entorno g v) devuelve el entorno del veacutertice v en el grafo g
-- | Ejemplo
-- gtgtgt entorno (creaGrafo [15] [(12)(13)(23)]) 2
-- [13]
entorno Eq a =gt Grafo a -gt a -gt [a]
entorno = adyacentes
Definicioacuten 356 Sea G = (V A) un grafo El grado (o valencia) de v isin V es grad(v) =|N(v)|
La funcioacuten (grado g v) devuelve el grado del veacutertice v en el grafo g
-- | Ejemplos
-- gtgtgt grado (creaGrafo [15] [(12)(13)(23)]) 2
-- 2
-- gtgtgt grado (grafoEstrella 5) 1
-- 5
grado Eq a =gt Grafo a -gt a -gt Int
grado g v = length (entorno g v)
Definicioacuten 357 Un veacutertice v de un grafo es aislado si su grado es 0
La funcioacuten (esAislado g v) se verifica si el veacutertice v es aislado en el grafo g
70 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- | Ejemplos
-- gtgtgt esAislado (creaGrafo [15] [(12)(13)(23)]) 4
-- True
-- gtgtgt esAislado (creaGrafo [15] [(12)(13)(23)]) 3
-- False
esAislado Eq a =gt Grafo a -gt a -gt Bool
esAislado g v = grado g v == 0
Definicioacuten 358 Un grafo es regular si todos sus veacutertices tienen el mismo grado
La funcioacuten (esRegular g) se verifica si el grafo g es regular
-- | Ejemplos
-- gtgtgt esRegular (creaGrafo [13] [(12)(13)(23)])
-- True
-- gtgtgt esRegular (creaGrafo [14] [(12)(13)(24)])
-- False
esRegular Eq a =gt Grafo a -gt Bool
esRegular g = all (==x) xs
where (xxs) = [grado g v | v lt- vertices g]
Definicioacuten 359 Dado un grafo G = (V A) llamamos valencia miacutenima o grado miacuteni-mo de G al valor δ(G) = mıngrad(v)|v isin V
La funcioacuten (valenciaMin g) devuelve la valencia miacutenima del grafo g
-- | Ejemplo
-- gtgtgt valenciaMin (creaGrafo [14] [(12)(13)(24)])
-- 1
valenciaMin Ord a =gt Grafo a -gt Int
valenciaMin g = minimum [grado g v | v lt- vertices g]
Definicioacuten 3510 Dado un grafo G = (V A) llamamos valencia maacutexima o gradomaacuteximo de G al valor δ(G) = maxgrad(v)|v isin V
La funcioacuten (valenciaMax g) devuelve la valencia maacutexima del grafo g
-- | Ejemplo
-- gtgtgt valenciaMax (creaGrafo [14] [(12)(13)(24)])
-- 2
valenciaMax Ord a =gt Grafo a -gt Int
valenciaMax g = maximum [grado g v | v lt- vertices g]
Definicioacuten 3511 Se dice que un grafo es simple si no contiene lazos ni aristas repetidas
La funcioacuten (esSimple g) se verifica si g es un grafo simple
35 Definiciones y propiedades 71
-- | Ejemplos
-- gtgtgt esSimple (creaGrafo [13] [(12)(13)(23)])
-- True
-- gtgtgt esSimple (creaGrafo [13] [(11)(12)(23)])
-- False
esSimple Ord a =gt Grafo a -gt Bool
esSimple g =
and [not ((xx) `aristaEn` g) | x lt- vertices g]
Definicioacuten 3512 Sea G un grafo Llamamos secuencia de grados de G a la lista degrados de sus veacutertices La secuencia se suele presentar en orden decreciente d1 ge d2 gemiddot middot middot ge dn
La funcioacuten (secuenciaGrados g) devuelve la secuencia de los grados del grafo g enorden decreciente
-- | Ejemplo
-- gtgtgt secuenciaGrados (creaGrafo [15] [(12)(13)(14)(24)])
-- [32210]
secuenciaGrados Eq a =gt Grafo a -gt [Int]
secuenciaGrados g = sortBy (flip compare) [grado g v | v lt- vertices g]
Nota 352 iquestQueacute listas de n nuacutemeros enteros son secuencias de grafos de n veacuterticesbull Si sumn
i=1 di es impar no hay ningunobull Si sumn
i=1 di es par entonces siempre hay un grafo con esa secuencia de grados (aun-que no necesariamente simple)
Definicioacuten 3513 Una secuencia graacutefica es una lista de nuacutemero enteros no negativos quees la secuencia de grados para alguacuten grafo simple
La funcioacuten (secuenciaGrafica ss) se verifica si existe alguacuten grafo con la secuenciade grados ss
-- | Ejemplos
-- gtgtgt secuenciaGrafica [32210]
-- True
-- gtgtgt secuenciaGrafica [3222]
-- False
secuenciaGrafica [Int] -gt Bool
secuenciaGrafica ss = even (sum ss) ampamp all p ss
where p s = s gt= 0 ampamp s lt= length ss
Definicioacuten 3514 Dado un grafo G = (V A) diremos que Gprime = (Vprime Aprime) es un subgrafode G si Vprime sube V y Aprime sube A
72 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (esSubgrafo g g) se verifica si g es un subgrafo de g
-- |Ejemplos
-- gtgtgt esSubgrafo (bipartitoCompleto 3 2) (bipartitoCompleto 3 3)
-- True
-- gtgtgt esSubgrafo (grafoEstrella 4) (grafoEstrella 5)
-- True
-- gtgtgt esSubgrafo (completo 5) (completo 4)
-- False
-- gtgtgt esSubgrafo (completo 3) (completo 4)
-- True
esSubgrafo Ord a =gt Grafo a -gt Grafo a -gt Bool
esSubgrafo g g =
vertices g `esSubconjunto` vertices g ampamp
aristas g `esSubconjunto` aristas g
Definicioacuten 3515 Si Gprime = (Vprime Aprime) es un subgrafo de G = (V A) tal que Vprime = Vdiremos que Gprime es un subgrafo maximal grafo recubridor o grafo de expansioacuten (eningleacutes spanning grah) de G
La funcioacuten (esSubgrafoMax g g) se verifica si g es un subgrafo maximal de g
-- | Ejemplos
-- gtgtgt esSubgrafoMax (grafoRueda 3) (grafoRueda 4)
-- False
-- gtgtgt esSubgrafoMax (grafoCiclo 4) (grafoRueda 4)
-- True
-- gtgtgt esSubgrafoMax (creaGrafo [13] [(12)]) (grafoCiclo 3)
-- True
-- gtgtgt esSubgrafoMax (creaGrafo [12] [(12)]) (grafoCiclo 3)
-- False
esSubgrafoMax Ord a =gt Grafo a -gt Grafo a -gt Bool
esSubgrafoMax g g =
g `esSubgrafo` g ampamp conjuntosIguales (vertices g) (vertices g)
Definicioacuten 3516 Sean Gprime = (Vprime Aprime) G = (V A) dos grafos si Vprime sub V o Aprime sub A sedice que Gprime es un subgrafo propio de G y se denota por Gprime sub G
La funcioacuten (esSubgrafoPropio g g) se verifica si g es un subgrafo propio de g
-- | Ejemplos
-- gtgtgt esSubgrafoPropio (grafoRueda 3) (grafoRueda 4)
-- True
-- gtgtgt esSubgrafoPropio (grafoRueda 4) (grafoCiclo 5)
-- False
-- gtgtgt esSubgrafoPropio (creaGrafo [13] [(12)]) (grafoCiclo 3)
-- True
-- gtgtgt esSubgrafoPropio (creaGrafo [12] [(12)]) (grafoCiclo 3)
35 Definiciones y propiedades 73
-- True
esSubgrafoPropio Ord a =gt Grafo a -gt Grafo a -gt Bool
esSubgrafoPropio g g =
esSubgrafo g g ampamp
(not (conjuntosIguales (vertices g) (vertices g)) ||
not (conjuntosIguales (aristas g) (aristas g)))
352 Propiedades de grafos
Teorema 3517 (Lema del apretoacuten de manos) En todo grafo simple el nuacutemero de veacuterticesde grado impar es par o cero
Vamos a comprobar que se verifica el lema del apretoacuten de manos utilizando la fun-cioacuten prop_LemaApretonDeManos
ghcigt quickCheck prop_LemaApretonDeManos
+++ OK passed 100 tests
prop_LemaApretonDeManos Grafo Int -gt Bool
prop_LemaApretonDeManos g =
even (length (filter odd [grado g v | v lt- vertices g]))
where g = creaGrafo (vertices g)
[(xy) | (xy) lt- aristas g x = y]
Teorema 3518 (HavelndashHakimi) Si n gt 1 y D = [d1 dn] es una lista de enterosentonces D es secuencia graacutefica si y soacutelo si la secuencia Dprime obtenida borrando el mayorelemento dmax y restando 1 a los siguientes dmax elementos maacutes grandes es graacutefica
Vamos a comprobar que se verifica el teorema de HavelndashHakimi utilizando la fun-cioacuten prop_HavelHakimi
ghcigt quickCheck prop_HavelHakimi
+++ OK passed 100 tests
prop_HavelHakimi [Int] -gt Bool
prop_HavelHakimi [] = True
prop_HavelHakimi (sss) =
not (secuenciaGrafica (sss) ampamp not (esVacio ss)) ||
secuenciaGrafica (map (x -gt x-1) (take s ss) ++ drop s ss)
353 Operaciones y propiedades sobre grafos
Eliminacioacuten de una arista
Definicioacuten 3519 Sea G = (V A) un grafo y sea (u v) isin A Definimos el grafo G (u v) como el subgrafo de G Gprime = (Vprime Aprime) con Vprime = V y Aprime = A (u v) Esta
74 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
operacioacuten se denomina eliminar una arista
La funcioacuten (eliminaArista g a) elimina la arista a del grafo g
-- | Ejemplos
-- gtgtgt eliminaArista (creaGrafo [14] [(12)(14)(24)]) (14)
-- G [1234] [(12)(24)]
-- gtgtgt eliminaArista (creaGrafo [14] [(12)(14)(24)]) (41)
-- G [1234] [(12)(24)]
-- gtgtgt eliminaArista (creaGrafo [14] [(12)(14)(24)]) (43)
-- G [1234] [(12)(14)(24)]
eliminaArista Ord a =gt Grafo a -gt (aa) -gt Grafo a
eliminaArista g (ab) =
creaGrafo (vertices g)
(aristas g [(ab)(ba)])
La funcioacuten (eliminaLazos g) devuelve un nuevo grafo obtenido a partir del grafog eliminando todas las aristas que fueran lazos
-- | Ejemplos
-- gtgtgt eliminaLazos (creaGrafo [12] [(11)(12)(22)])
-- G [12] [(12)]
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
-- gtgtgt eliminaLazos (grafoCiclo 5)
-- G [12345] [(12)(15)(23)(34)(45)]
eliminaLazos Ord a =gt Grafo a -gt Grafo a
eliminaLazos g = creaGrafo (vertices g)
[(xy) | (xy) lt- aristas g x = y]
Eliminacioacuten un veacutertice
Definicioacuten 3520 Sea G = (V A) un grafo y sea v isin V Definimos el grafo G v como elsubgrafo de G Gprime = (Vprime Aprime) con Vprime = V v y Aprime = A a isin A|v es un extremo de aEsta operacioacuten se denomina eliminar un veacutertice
La funcioacuten (eliminaVertice g v) elimina el veacutertice v del grafo g
-- | Ejemplos
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(24)]) 1
-- G [234] [(24)]
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(24)]) 4
-- G [123] [(12)]
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(24)]) 3
-- G [124] [(12)(14)(24)]
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(13)]) 1
-- G [234] []
eliminaVertice Ord a =gt Grafo a -gt a -gt Grafo a
35 Definiciones y propiedades 75
eliminaVertice g v =
creaGrafo (vertices g [v])
(as [(ab) | (ab) lt- as a == v || b == v])
where as = aristas g
Suma de aristas
Definicioacuten 3521 Sea G = (V A) un grafo y sean u v isin V tales que (u v) (v u) 6isin ADefinimos el grafo G + (u v) como el grafo Gprime = (V A cup (u v)) Esta operacioacuten sedenomina suma de una arista
La funcioacuten (sumaArista g a) suma la arista a al grafo g
-- | Ejemplos
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
-- gtgtgt sumaArista (grafoCiclo 5) (13)
-- G [12345] [(12)(13)(15)(23)(34)(45)]
sumaArista Ord a =gt Grafo a -gt (aa) -gt Grafo a
sumaArista g a =
creaGrafo (vertices g) (a aristas g)
Suma de veacutertices
Definicioacuten 3522 Sea G = (V A) un grafo y sea v 6isin V Definimos el grafo G + v comoel grafo Gprime = (Vprime Aprime) donde Vprime = V cup v Aprime = Acup (u v)|u isin V Esta operacioacuten sedenomina suma de un veacutertice
La funcioacuten (sumaVertice g a) suma el veacutertice a al grafo g
-- | Ejemplo
-- gtgtgt grafoCiclo 3
-- G [123] [(12)(13)(23)]
-- gtgtgt sumaVertice (grafoCiclo 3) 4
-- G [1234] [(12)(13)(14)(23)(24)(34)]
sumaVertice Ord a =gt Grafo a -gt a -gt Grafo a
sumaVertice g v =
creaGrafo (v vs) (aristas g ++ [(uv) | u lt- vs])
where vs = vertices g
Propiedad de los grafos completos
Proposicioacuten 3523 La familia de grafos completos Kn verifica que Kn = Knminus1 + n
Vamos a ver que se cumple la propiedad utilizando la funcioacuten prop_completos
76 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
ghcigt quickCheck prop_completos
+++ OK passed 100 tests
prop_completos Int -gt Property
prop_completos n = n gt= 2 ==gt
completo n == sumaVertice (completo (n-1)) n
A partir de esta propiedad se puede dar una definicioacuten alternativa de la funcioacuten(completo n) que devuelve el grafo completo Kn La nueva funcioacuten seraacute (completo2n)
completo2 Int -gt Grafo Int
completo2 0 = grafoNulo
completo2 n = sumaVertice (completo2 (n-1)) n
Vamos a comprobar la equivalencia de ambas deficiones
ghcigt prop_EquiCompleto
True
prop_EquiCompleto Bool
prop_EquiCompleto = and [completo n == completo2 n | n lt- [050]]
Vamos a ver cuaacutel de las definiciones es maacutes eficiente
ghcigt tamantildeo (completo 100)
4950
(117 secs 0 bytes)
ghcigt tamantildeo (completo2 100)
4950
(1549 secs 61756056 bytes)
La funcioacuten (completo n) es maacutes eficiente asiacute que seraacute la que seguiremos utilizando
Suma de grafos
Definicioacuten 3524 Sean G = (V A) Gprime = (Vprime A) dos grafos Definimos el grafo sumade G y Gprime como el grafo G + Gprime = (V cup Vprime A cup Aprime cup (u v)|u isin V v isin Vprime) Estaoperacioacuten se denomina suma de grafos
La funcioacuten (sumaGrafos g g) suma los grafos g y g
-- | Ejemplo
-- gtgtgt let g1 = creaGrafo [13] [(11)(13)(23)]
-- gtgtgt let g2 = creaGrafo [46] [(46)(56)]
-- gtgtgt pp $ sumaGrafos g1 g2
-- G [123456]
-- [(1 1)(1 3)(1 4)(1 5)(1 6)(2 3)(2 4)
-- (2 5)(2 6)(3 4)(3 5)(3 6)(4 6)(5 6)]
sumaGrafos Ord a =gt Grafo a -gt Grafo a -gt Grafo a
35 Definiciones y propiedades 77
sumaGrafos g1 g2 =
creaGrafo (vs1 `union` vs2)
(aristas g1 `union`
aristas g2 `union`
[(uv) | u lt- vs1 v lt- vs2])
where vs1 = vertices g1
vs2 = vertices g2
Unioacuten de grafos
Definicioacuten 3525 Sean G = (V A) Gprime = (Vprime A) dos grafos Definimos el grafo unioacutende G y Gprime como el grafo G cup H = (V cupVprime A cup Aprime) Esta operacioacuten se denomina unioacuten degrafos
La funcioacuten (unionGrafos g g) une los grafos g y g Por ejemplo
-- | Ejemplo
-- gtgtgt let g1 = creaGrafo [13] [(11)(13)(23)]
-- gtgtgt let g2 = creaGrafo [46] [(46)(56)]
-- gtgtgt unionGrafos g1 g2
-- G [123456] [(11)(13)(23)(46)(56)]
unionGrafos Ord a =gt Grafo a -gt Grafo a -gt Grafo a
unionGrafos g1 g2 =
creaGrafo (vertices g1 `union` vertices g2)
(aristas g1 `union` aristas g2)
Grafo complementario
Definicioacuten 3526 Dado un grafo G = (V A) se define el grafo complementario de Gcomo G = (V A) donde A = (u v)|u v isin V (u v) 6isin A
La funcioacuten (grafoComplementario g) devuelve el grafo complementario de g
-- | Ejemplo
-- gtgtgt grafoComplementario (creaGrafo [13] [(11)(13)(23)])
-- G [123] [(12)(22)(33)]
grafoComplementario Ord a =gt Grafo a -gt Grafo a
grafoComplementario g =
creaGrafo vs
[(uv)| u lt- vs v lt- vs u lt= v not ((uv) `aristaEn` g)]
where vs = vertices g
Definicioacuten 3527 Dado un grafo diremos que es completo si su complementario sin lazosno tiene aristas
La funcioacuten (esCompleto g) se verifica si el grafo g es completo
78 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- Ejemplos
-- gtgtgt esCompleto (completo 4)
-- True
-- gtgtgt esCompleto (grafoCiclo 5)
-- False
esCompleto Ord a =gt Grafo a -gt Bool
esCompleto g =
tamantildeo (eliminaLazos (grafoComplementario g)) == 0
36 Morfismos de grafos
Llegados a este punto es importante resaltar que un grafo se define como una en-tidad matemaacutetica abstracta es evidente que lo importante de un grafo no son losnombres de sus veacutertices ni su representacioacuten graacutefica La propiedad que caracterizaa un grafo es la forma en que sus veacutertices estaacuten unidos por las aristasA priori los siguientes grafos pueden parecer distintos
a
bc
de
1
23
45
Sin embargo ambos grafos son grafos de cinco veacutertices que tienen las mismas rela-ciones de vecindad entre sus nodos En esta seccioacuten estudiaremos estas relacionesque establecen las aristas entre los veacutertices de un grafo y presentaremos algoritmosque nos permitan identificar cuaacutendo dos grafos se pueden relacionar mediante apli-caciones entre sus veacutertices cumpliendo ciertas caracteriacutesicas
361 Morfismos
Definicioacuten 361 Si f es una funcioacuten entre dos grafos G = (V A) y Gprime = (Vprime Aprime)diremos que conserva la adyacencia si forallu v isin V se verifica que si (u v) isin A entonces( f (u) f (v)) isin Aprime
La funcioacuten (conservaAdyacencia g h f) se verifica si la funcioacuten f entre los grafosg y h conserva las adyacencias
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [14] [(12)(23)(34)]
-- gtgtgt let g2 = creaGrafo [14] [(12)(23)(24)]
-- gtgtgt let g3 = creaGrafo [4610] [(48)(68)(810)]
36 Morfismos de grafos 79
-- gtgtgt conservaAdyacencia g1 g3 [(14)(26)(38)(410)]
-- False
-- gtgtgt conservaAdyacencia g2 g3 [(14)(28)(36)(410)]
-- True
conservaAdyacencia (Ord a Ord b) =gt
Grafo a -gt Grafo b -gt Funcion a b -gt Bool
conservaAdyacencia g h f =
and [(imagen f ximagen f y) `aristaEn` h | (xy) lt- aristas g]
Definicioacuten 362 Dados dos grafos simples G = (V A) y Gprime = (Vprime Aprime) un morfismoentre G y Gprime es una funcioacuten φ V rarr Vprime que conserva las adyacencias
La funcioacuten (esMorfismo g h vvs) se verifica si la funcioacuten representada por vvs esun morfismo entre los grafos g y h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(12)(32)]
-- gtgtgt let g2 = creaGrafo [456] [(46)(56)]
-- gtgtgt esMorfismo g1 g2 [(14)(26)(35)]
-- True
-- gtgtgt esMorfismo g1 g2 [(14)(25)(36)]
-- False
-- gtgtgt esMorfismo g1 g2 [(14)(26)(35)(79)]
-- False
esMorfismo (Ord aOrd b) =gt Grafo a -gt Grafo b -gt
Funcion a b -gt Bool
esMorfismo g1 g2 f =
esFuncion (vertices g1) (vertices g2) f ampamp
conservaAdyacencia g1 g2 f
La funcioacuten (morfismos g h) devuelve todos los posibles morfismos entre los grafosg y h
-- | Ejemplos
-- gtgtgt grafoCiclo 3
-- G [123] [(12)(13)(23)]
-- gtgtgt let g = creaGrafo [46] [(44)(66)]
-- gtgtgt morfismos (grafoCiclo 3) g
-- [[(14)(24)(34)][(16)(26)(36)]]
-- gtgtgt morfismos g (grafoCiclo 3)
-- []
morfismos (Ord a Ord b) =gt Grafo a -gt Grafo b -gt [[(ab)]]
morfismos g h =
[f | f lt- funciones (vertices g) (vertices h)
conservaAdyacencia g h f]
80 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
362 Complejidad del problema de homomorfismo de grafos
En general en computacioacuten un problema algoriacutetmico consta de un conjunto I detodas las posibles entradas para el problema llamado el conjunto de instancias y deuna pregunta Q sobre esas instancias Resolver uno de estos problemas consiste endesarrollar un algoritmo cuya entrada es una instancia del problema y cuya salidaes una respuesta a la pregunta del problemaDecimos que un problema es de decisioacuten cuando las posibles respuestas a la pre-gunta son ldquosiacuterdquo o ldquonordquo Un ejemplo de problema de este tipo seriacutea dados dos grafosdecidir si estos son homomorfos o noA la hora de implementar un algoritmo que deacute solucioacuten al problema que estemosconsiderando es importante tener en cuenta el nuacutemero de pasos que efectuacutea hastaencontrar una respuesta Un algoritmo de tiempo polinomial se define como aquelcon funcioacuten de complejidad temporal en O(p(n)) para alguna funcioacuten polinoacutemicap donde n denota el tamantildeo de la entrada Cualquier algoritmo cuya funcioacuten decomplejidad temporal no pueda ser acotada de esta manera se denomina algoritmode tiempo exponencialLa mayoriacutea de los algoritmos de tiempo exponencial son simples variaciones de unabuacutesqueda exhaustiva mientras que los algoritmos de tiempo polinomial usualmen-te se obtienen mediante un anaacutelisis maacutes profundo de la estructura del problema Enla Teoriacutea de la complejidad computacional existe el consenso de que un problemano estaacute ldquobien resueltordquo hasta que se conozca un algoritmo de tiempo polinomialque lo resuelva Por tanto nos referiremos a un problema como ldquointratablerdquo si estan difiacutecil que no existe algoritmo de tiempo polinomial capaz de resolverloLos problemas de decisioacuten para los que existen algoritmos polinomiales consti-tuyen la clase P y son llamados polinomiales Un problema de decisioacuten es no-determiniacutestico polinomial cuando cualquier instancia que produce respuesta ldquosiacuterdquoposee una comprobacioacuten de correctitud (tambieacuten llamada certificado) verificable entiempo polinomia en el tamantildeo de la instancia Estos problemas de decisioacuten se di-ce que pertenecen a la clase NP Claramente P sube NP Sin embargo no se sabe siesta inclusioacuten es estricta uno de los principales problemas abiertos en Teoriacutea de lacomputacioacuten es saber si P 6= NPUna reduccioacuten es una transformacioacuten de un problema en otro problema Intuitiva-mente un problema Q puede ser reducido a otro problema Qprime si cualquier instanciadel problema Q puede ser ldquofaacutecilmenterdquo expresada como una instancia del problemaQprime y cuya solucioacuten proporcione una solucioacuten para la instancia de QLas reducciones en tiempo polinomial nos dotan de elementos para probar de unamanera formal que un problema es al menos tan difiacutecil que otro con una dife-rencia de un factor polinomial Estas son esenciales para definir a los problemas
36 Morfismos de grafos 81
NP-completos ademaacutes de ayudar a comprender los mismosLa clase de los problemas NP-completos contiene a los problemas maacutes difiacuteciles enNP en el sentido de que son los que esteacuten maacutes lejos de estar en P Debido a que elproblema P = NP no ha sido resuelto el hecho de reducir un problema B a otroproblema A indicariacutea que no se conoce solucioacuten en tiempo polinomial para A Estoes debido a que una solucioacuten en tiempo polinomial para A tendriacutea como conse-cuencia la existencia de una solucioacuten polinomial para B De manera similar debidoa que todos los problemas NP pueden ser reducidos a este conjunto encontrar unproblema NP-completo que pueda ser resuelto en un tiempo polinomial significariacuteaque P = NPEl problema de decidir si dos grafos son homomorfos es un problema de decisioacutenNP-completo La NP-completitud del problema se demuestra mediante la reduccioacutende este problema al problema de la clique 17En el proceso de recopilacioacuten de imformacioacuten acerca de la Teoriacutea de la complejidadse ha trabajado con dos fuentesbull la tesis de licenciatura de Pablo Burzyn ldquoComplejidad computacional en proble-
mas de modificacioacuten de aristas en grafosrdquo ([2]) ybull el artiacuteculo ldquoTeoriacutea de la complejidad computacionalrdquo ([12]) de la Wikipedia
363 Isomorfismos
Definicioacuten 363 Dados dos grafos simples G = (V A) y Gprime = (Vprime Aprime) un isomorfis-mo entre G y Gprime es un morfismo biyectivo cuyo inverso es morfismo entre Gprime y G
La funcioacuten (esIsomorfismo g h f) se verifica si la aplicacioacuten f es un isomorfismoentre los grafos g y h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt esIsomorfismo g1 g2 [(12)(24)(36)]
-- True
-- gtgtgt esIsomorfismo g1 g2 [(12)(22)(36)]
-- False
esIsomorfismo (Ord aOrd b) =gt
Grafo a -gt Grafo b -gt Funcion a b -gt Bool
esIsomorfismo g h f =
esBiyectiva vs1 vs2 f ampamp
esMorfismo g h f ampamp
esMorfismo h g (inversa f)
where vs1 = vertices g
vs2 = vertices h
17httpseswikipediaorgwikiProblema_de_la_clique
82 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (isomorfismos1 g h) devuelve todos los isomorfismos posibles entrelos grafos g y h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfismos1 g1 g2
-- [[(12)(24)(36)]]
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfismos1 g3 g4
-- []
-- gtgtgt let g5 = creaGrafo [123] [(11)(22)(33)]
-- gtgtgt let g6 = creaGrafo [246] [(22)(44)(66)]
-- gtgtgt pp $ isomorfismos1 g5 g6
-- [[(1 2)(2 4)(3 6)][(1 4)(2 2)(3 6)]
-- [(1 6)(2 4)(3 2)][(1 4)(2 6)(3 2)]
-- [(1 6)(2 2)(3 4)][(1 2)(2 6)(3 4)]]
isomorfismos1 (Ord aOrd b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos1 g h =
[f | f lt- biyecciones vs1 vs2
conservaAdyacencia g h f
conservaAdyacencia h g (inversa f)]
where vs1 = vertices g
vs2 = vertices h
Definicioacuten 364 Dos grafos G y H se dicen isomorfos si existe alguacuten isomorfismo entreellos
La funcioacuten isomorfos1 g h se verifica si los grafos g y h son isomorfos
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfos1 g1 g2
-- True
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfos1 g3 g4
-- False
isomorfos1 (Ord aOrd b) =gt Grafo a -gt Grafo b -gt Bool
isomorfos1 g = not null isomorfismos1 g
Nota 361 Al tener Haskell una evaluacioacuten perezosa la funcioacuten (isomorfos g h)
no necesita generar todos los isomorfismos entre los grafos g y h
Definicioacuten 365 Sea G = (V A) un grafo Un invariante por isomorfismos de G esuna propiedad de G que tiene el mismo valor para todos los grafos que son isomorfos a eacutel
36 Morfismos de grafos 83
esInvariantePorIsomorfismos
Eq a =gt (Grafo Int -gt a) -gt Grafo Int -gt Grafo Int -gt Bool
esInvariantePorIsomorfismos p g h =
isomorfos g h --gt (p g == p h)
where (--gt) = (lt=)
Teorema 366 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un iso-morfismo Entonces se verifica que |V(G)| = |V(Gprime)| es decir el orden de un grafo es uninvariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos orden)
+++ OK passed 100 tests
Teorema 367 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces se verifica que |A(G)| = |A(Gprime)| es decir el tamantildeo de un grafo es uninvariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos tamantildeo)
+++ OK passed 100 tests
Teorema 368 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces tienen la misma secuencia de grados es decir la secuencia de grados de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos secuenciaGrados)
+++ OK passed 100 tests
A partir de las propiedades que hemos demostrado de los isomorfismos vamos adar otra definicioacuten equivalente de las funciones (isomorfismos1 g h) y (isomorfos1
g h)
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfismos2 g1 g2
-- [[(12)(24)(36)]]
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfismos2 g3 g4
-- []
-- gtgtgt let g5 = creaGrafo [123] [(11)(22)(33)]
84 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- gtgtgt let g6 = creaGrafo [246] [(22)(44)(66)]
-- gtgtgt pp $ isomorfismos2 g5 g6
-- [[(1 2)(2 4)(3 6)][(1 4)(2 2)(3 6)]
-- [(1 6)(2 4)(3 2)][(1 4)(2 6)(3 2)]
-- [(1 6)(2 2)(3 4)][(1 2)(2 6)(3 4)]]
isomorfismos2 (Ord a Ord b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos2 g h
| orden g = orden h = []
| tamantildeo g = tamantildeo h = []
| secuenciaGrados g = secuenciaGrados h = []
| otherwise = [f | f lt- biyecciones vs1 vs2
conservaAdyacencia g h f]
where vs1 = vertices g
vs2 = vertices h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfos2 g1 g2
-- True
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfos2 g3 g4
-- False
isomorfos2 (Ord a Ord b) =gt Grafo a -gt Grafo b -gt Bool
isomorfos2 g =
not null isomorfismos2 g
isomorfismos3 (Ord a Ord b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos3 g h
| orden g = orden h = []
| tamantildeo g = tamantildeo h = []
| secuenciaGrados g = secuenciaGrados h = []
| otherwise = filter (conservaAdyacencia g h) (posibles g h)
verticesPorGrados g =
[filter (p n) (vertices g) | n lt- nub (secuenciaGrados g)]
where p m v = grado g v == m
aux1 [] _ = []
aux1 (xsxss) (ysyss) = (map (zip xs) (permutations ys))aux1 xss yss
aux2 [] = []
aux2 (xss[]) = xss
aux2 (xssyss[]) = [xs ++ ys | xs lt- xss ys lt- yss]
aux2 (xssyssxsss) =
aux2 ([xs ++ ys | xs lt- xss ys lt- yss]xsss)
36 Morfismos de grafos 85
posibles g h =
aux2 (aux1 (verticesPorGrados g) (verticesPorGrados h))
Vamos a comparar la eficiencia entre ambas definiciones
Nota 362 La nueva definicioacuten de (isomorfismos3 g h) es la maacutes eficiente con gra-fos poco regulares sin embargo cuando todos los veacutertices tienen el mismo grado(isomorfismos2 g h) sigue siendo mejor opcioacuten (aunque no hay mucha diferenciaen el coste computacional)ghcigt let n = 6 in (length (isomorfismos1 (completo n) (completo n)))
720
(018 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos2 (completo n) (completo n)))
720
(018 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos3 (completo n) (completo n)))
720
(018 secs 26123800 bytes)
ghcigt let n = 6 in (length (isomorfismos1 (grafoCiclo n) (grafoCiclo n)))
12
(004 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos2 (grafoCiclo n) (grafoCiclo n)))
12
(004 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos3 (grafoCiclo n) (grafoCiclo n)))
12
(004 secs 0 bytes)
ghcigt length (isomorfismos1 (grafoCiclo 6) (completo 7))
0
(000 secs 0 bytes)
ghcigt length (isomorfismos2 (grafoCiclo 6) (completo 7))
0
(001 secs 0 bytes)
ghcigt length (isomorfismos3 (grafoCiclo 6) (completo 7))
0
(000 secs 0 bytes)
ghcigt isomorfos1 (completo 10) (grafoCiclo 10)
False
(5190 secs 12841861176 bytes)
ghcigt isomorfos2 (completo 10) (grafoCiclo 10)
False
(000 secs 0 bytes)
ghcigt isomorfos3 (completo 10) (grafoCiclo 10)
False
86 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
(000 secs 0 bytes)
ghcigt isomorfos1 (grafoCiclo 10) (grafoRueda 10)
False
(7390 secs 16433969976 bytes)
ghcigt isomorfos2 (grafoCiclo 100) (grafoRueda 100)
False
(000 secs 0 bytes)
ghcigt isomorfos3 (grafoCiclo 100) (grafoRueda 100)
False
(000 secs 0 bytes)
ghcigt length (isomorfismos2 (grafoRueda 10) (grafoRueda 10))
18
(10112 secs 23237139992 bytes)
ghcigt length (isomorfismos3 (grafoRueda 10) (grafoRueda 10))
18
(4467 secs 9021442440 bytes)
Nota 363 Cuando los grafos son isomorfos comprobar que tienen el mismo nuacuteme-ro de veacutertices el mismo nuacutemero de aristas y la misma secuencia graacutefica no requieremucho tiempo ni espacio dando lugar a costes muy similares entre los dos paresde definiciones Sin embargo cuando los grafos tienen el mismo nuacutemero de veacuterticesy fallan en alguna de las demaacutes propiedades el resultado es muy costoso para laprimera definicioacuten mientras que es inmediato con la segundaA partir de ahora utilizaremos la funcioacuten isomorfismos2 para calcular los isomor-fismos entre dos grafos y la funcioacuten isomorfos para determinar si dos grafos sonisomorfos de modo que las renombraremos por isomorfismos y isomorfismos res-pectivamente
isomorfismos (Ord aOrd b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos = isomorfismos2
isomorfos (Ord aOrd b) =gt Grafo a -gt Grafo b -gt Bool
isomorfos = isomorfos2
364 Automorfismos
Definicioacuten 369 Dado un grafo simple G = (V A) un automorfismo de G es un iso-morfismo de G en siacute mismo
La funcioacuten (esAutomorfismo g f) se verifica si la aplicacioacuten f es un automorfismode g
-- | Ejemplos
-- gtgtgt let g = creaGrafo [123] [(12)(13)]
37 Caminos en grafos 87
-- gtgtgt esAutomorfismo g [(11)(23)(32)]
-- True
-- gtgtgt esAutomorfismo g [(12)(23)(31)]
-- False
esAutomorfismo Ord a =gt Grafo a -gt Funcion a a -gt Bool
esAutomorfismo g = esIsomorfismo g g
La funcioacuten (automorfismos g) devuelve la lista de todos los posibles automorfis-mos en g
-- | Ejemplo
-- gtgtgt automorfismos (creaGrafo [123] [(12)(13)])
-- [[(11)(22)(33)][(11)(23)(32)]]
automorfismos Ord a =gt Grafo a -gt [Funcion a a]
automorfismos g = isomorfismos1 g g
Nota 364 Cuando trabajamos con automorfismos es mejor utilizar en su defini-cioacuten la funcioacuten isomorfismos1 en vez de isomorfismos2 pues ser isomorfos es unarelacioacuten reflexiva es decir un grafo siempre es isomorfo a siacute mismo
37 Caminos en grafos
Una de las aplicaciones de la teoriacutea de grafos es la determinacioacuten de trayectos o re-corridos en una red de transporte o de distribucioacuten de productos Asiacute si cada veacuterticerepresenta un punto de intereacutes y cada arista representa una conexioacuten entre dos pun-tos usando grafos como modelos podemos simplificar el problema de encontrar laruta maacutes ventajosa en cada caso
371 Definicioacuten de camino
Definicioacuten 371 Sea G = (V A) un grafo simple y sean u v isin V dos veacutertices Uncamino entre u y v es una sucesioacuten de veacutertices de G u = v0 v1 v2 vkminus1 vk = vdonde foralli isin 0 kminus 1 (vi vi+1) isin A
La funcioacuten (esCamino g c) se verifica si la sucesioacuten de veacutertices c es un camino enel grafo g
-- | Ejemplo
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
-- gtgtgt esCamino (grafoCiclo 5) [123451]
-- True
-- gtgtgt esCamino (grafoCiclo 5) [124531]
-- False
88 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
esCamino Ord a =gt Grafo a -gt [a] -gt Bool
esCamino g c = all (`aristaEn` g) (zip c (tail c))
La funcioacuten (aristasCamino c) devuelve la lista de las aristas recorridas en el ca-mino c
-- | Ejemplos
-- gtgtgt aristasCamino [123]
-- [(12)(23)]
-- gtgtgt aristasCamino [1231]
-- [(12)(23)(13)]
-- gtgtgt aristasCamino [1232]
-- [(12)(23)(23)]
aristasCamino Ord a =gt [a] -gt [(aa)]
aristasCamino c =
map parOrdenado (zip c (tail c))
where parOrdenado (uv) | u lt= v = (uv)
| otherwise = (vu)
La funcioacuten (verticesCamino c) devuelve la lista de las vertices recorridas en elcamino c
-- | Ejemplo
-- gtgtgt verticesCamino [1231]
-- [123]
verticesCamino Ord a =gt [a] -gt [a]
verticesCamino c = nub c
Definicioacuten 372 Se llama longitud de un camino al nuacutemero de veces que se atraviesa unaarista en dicho camino
La funcioacuten (longitudCamino c) devuelve la longitud del camino c
-- | Ejemplo
-- gtgtgt longitudCamino [427]
-- 2
longitudCamino [a] -gt Int
longitudCamino c = length c - 1
La funcioacuten (todosCaminos g u v k) devuelve todos los caminos entre los veacuterticesu y v en el grafo g que tienen longitud k
-- | Ejemplo
-- gtgtgt todosCaminos (creaGrafo [12] [(12)]) 1 2 3
-- [[1212]]
-- gtgtgt todosCaminos (bipartitoCompleto 2 3) 1 3 3
-- [[1313][1323][1413][1423][1513][1523]]
todosCaminos Ord a =gt Grafo a -gt a -gt a -gt Int -gt [[a]]
todosCaminos g u v 0 = if u == v ampamp elem u (vertices g)
37 Caminos en grafos 89
then [[u]]
else []
todosCaminos g u v 1 = if aristaEn (uv) g
then [[uv]]
else []
todosCaminos g u v k =
filter p [uvs | n lt- [1k-1] w lt- a u vs lt- tC w v n]
where p xs = longitudCamino xs == k
a = adyacentes g
tC = todosCaminos g
La funcioacuten (numeroCaminosDeLongitud g u v k) es el nuacutemero de caminos de lon-gitud k uniendo los veacutertices u y v en el grafo g
-- | Ejemplos
-- gtgtgt numeroCaminosDeLongitud (completo 7) 1 4 5
-- 1111
-- gtgtgt numeroCaminosDeLongitud grafoPetersen 1 4 3
-- 5
numeroCaminosDeLongitud Ord a =gt Grafo a -gt a -gt a -gt Int -gt Int
numeroCaminosDeLongitud g u v = length todosCaminos g u v
372 Recorridos
Definicioacuten 373 Sea G = (V A) un grafo y sean u v isin V Un camino entre u y v queno repite aristas (quizaacutes veacutertices) se llama recorrido
La funcioacuten (esRecorrido g c) se verifica si el camino c es un recorrido en el grafog
-- | Ejemplo
-- gtgtgt esRecorrido (grafoCiclo 4) [214]
-- True
-- gtgtgt esRecorrido (grafoCiclo 4) [2141]
-- False
-- gtgtgt esRecorrido (grafoCiclo 4) [213]
-- False
esRecorrido Ord a =gt Grafo a -gt [a] -gt Bool
esRecorrido g c =
esCamino g c ampamp sinRepetidos (aristasCamino c)
373 Caminos simples
Definicioacuten 374 Un camino que no repite veacutertices (y por tanto tampoco aristas) se llamacamino simple
90 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (esCaminoSimple g c) se verifica si el camino c es un camino simple enel grafo g
-- | Ejemplos
-- gtgtgt esCaminoSimple (creaGrafo [12] [(11)(12)]) [112]
-- False
-- gtgtgt esCaminoSimple (grafoCiclo 4) [214]
-- True
-- gtgtgt esCaminoSimple (grafoCiclo 4) [14321]
-- True
-- gtgtgt esCaminoSimple (grafoCiclo 4) [43212]
-- False
esCaminoSimple Ord a =gt Grafo a -gt [a] -gt Bool
esCaminoSimple g [] = True
esCaminoSimple g vs =
esRecorrido g vs ampamp noRepiteVertices vs
where noRepiteVertices (xxs)
| sinRepetidos (xxs) = True
| x == last xs ampamp sinRepetidos xs = True
| otherwise = False
La funcioacuten (todosArcosBP g u v) devuelve una lista con todos los caminos simplesposibles en el grafo g entre los veacutertices u y v utilizando una algoritmo de buacutesquedaen profundidad sobre el grafo g Este algoritmo recorre el grafo de izquierda a dere-cha y de forma al visitar un nodo explora todos los caminos que pueden continuarpor eacutel antes de pasar al siquiente
-- | Ejemplos
-- gtgtgt grafoCiclo 4
-- G [1234] [(12)(14)(23)(34)]
-- gtgtgt todosArcosBP (grafoCiclo 4) 1 4
-- [[14][1234]]
-- gtgtgt todosArcosBP (grafoCiclo 4) 4 1
-- [[4321][41]]
-- gtgtgt todosArcosBP (creaGrafo [14] [(12)(34)]) 1 4
-- []
-- gtgtgt todosArcosBP (creaGrafo [12] [(11)(12)]) 1 1
-- [[1]]
todosArcosBP Ord a =gt Grafo a -gt a -gt a -gt [[a]]
todosArcosBP g x y = aux [[y]]
where aux [] = []
aux ([]zss) = aux zss
aux ((zzs)zss)
| z == x = (zzs) aux zss
| otherwise =
aux ([vzzs | v lt- adyacentes g z zs] ++ zss)
g = eliminaLazos g
eliminaLazos h = creaGrafo (vertices h)
37 Caminos en grafos 91
[(xy) | (xy) lt- aristas h x = y]
La funcioacuten (todosArcosBA g u v) devuelve una lista con todos los caminos simplesposibles en el grafo g entre los veacutertices u y v utilizando una algoritmo de buacutesquedaen anchura sobre el grafo g Este algoritmo recorre el grafo por niveles de formaque el primer camino de la lista es de longitud miacutenima
-- | Ejemplos
-- gtgtgt grafoCiclo 4
-- G [1234] [(12)(14)(23)(34)]
-- gtgtgt todosArcosBA (grafoCiclo 4) 1 4
-- [[14][1234]]
-- gtgtgt todosArcosBA (grafoCiclo 4) 4 1
-- [[41][4321]]
-- gtgtgt todosArcosBA (creaGrafo [14] [(12)(34)]) 1 4
-- []
-- gtgtgt todosArcosBA (creaGrafo [12] [(11)(12)]) 1 1
-- [[1]]
todosArcosBA Ord a =gt Grafo a -gt a -gt a -gt [[a]]
todosArcosBA g x y = aux [[y]]
where aux [] = []
aux ([]zss) = aux zss
aux ((zzs)zss)
| z == x = (zzs) aux zss
| otherwise =
aux (zss ++ [vzzs | v lt- adyacentes g z zs])
g = eliminaLazos g
Vamos a comprobar con QuickCheck que el primer elemento de la lista que de-vuelve la funcioacuten (todosArcosBA g u v) es de longitud miacutenima Para ello vamos autilizar la funcioacuten (parDeVertices g) que es un generador de pares de veacutertices delgrafo no nulo g Por ejemplo
ghcigt sample (parDeVertices (creaGrafo [19] []))
(39)
(93)
(74)
(43)
(28)
(72)
(84)
(53)
(72)
(31)
(72)
92 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
parDeVertices Grafo Int -gt Gen (IntInt)
parDeVertices g = do
x lt- elements vs
y lt- elements vs
return (xy)
where vs = vertices g
La propiedad es
prop_todosArcosBA Grafo Int -gt Property
prop_todosArcosBA g =
not (esGrafoNulo g) ==gt
forAll (parDeVertices g)
((xy) -gt let zss = todosArcosBA g x y
in null zss || longitudCamino (head zss) ==
minimum (map longitudCamino zss))
La comprobacioacuten es
ghcigt quickCheck prop_todosArcosBA
+++ OK passed 100 tests
Veamos que la funcioacuten (todosArcosBP g u v) no verifica la propiedad
ghcigt quickCheck prop_todosArcosBP
Failed Falsifiable (after 6 tests)
G [12345] [(12)(14)(15)(22)(23)(24)(44)(45)(55)]
(52)
prop_todosArcosBP Grafo Int -gt Property
prop_todosArcosBP g =
not (esGrafoNulo g) ==gt
forAll (parDeVertices g)
((xy) -gt let zss = todosArcosBP g x y
in null zss || longitudCamino (head zss) ==
minimum (map longitudCamino zss))
La funcioacuten (numeroArcosDeLongitud g u v k) devuelve el nuacutemero de caminos en-tre los veacutertices u y v en el grafo g que tienen longitud k
-- | Ejemplos
-- gtgtgt numeroArcosDeLongitud (completo 6) 1 3 4
-- 24
-- gtgtgt numeroArcosDeLongitud grafoPetersen 1 3 4
-- 4
numeroArcosDeLongitud Ord a =gt Grafo a -gt a -gt a -gt Int -gt Int
numeroArcosDeLongitud g u v k =
length (filter p (todosArcosBA g u v))
where p vs = longitudCamino vs == k
37 Caminos en grafos 93
374 Conexioacuten
Definicioacuten 375 Dado un grafo G = (V A) sean u v isin V Si existe alguacuten camino entreu y v en el grafo G diremos que estaacuten conectados y lo denotamos por u v
La funcioacuten (estanConectados g u v) se verifica si los veacutertices u y v estaacuten conecta-dos en el grafo g
-- | Ejemplos
-- gtgtgt estanConectados (creaGrafo [14] [(12)(24)]) 1 4
-- True
-- gtgtgt estanConectados (creaGrafo [14] [(12)(34)]) 1 4
-- False
estanConectados Ord a =gt Grafo a -gt a -gt a -gt Bool
estanConectados g u v
| esGrafoNulo g = False
| otherwise = not (null (todosArcosBA g u v))
Nota 371 La funcioacuten (estanConectados g u v) no necesita calcular todos los ca-minos entre u y v Puesto que Haskell utiliza por defecto evaluacioacuten perezosa siexiste alguacuten camino entre los dos veacutertices basta calcular el primero para saber quela lista de todos los caminos no es vaciacutea
375 Distancia
Definicioacuten 376 Se define la distancia entre u y v en el grafo G como la longitud delcamino maacutes corto que los une Si u y v no estaacuten conectados decimos que la distancia esinfinita
La funcioacuten (distancia g u v) devuelve la distancia entre los veacutertices u y v en elgrafo g En caso de que los veacutertices no esteacuten conectados devuelve el valor Nothing
-- | Ejemplos
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 1
-- Just 0
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 2
-- Just 1
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 3
-- Just 2
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 4
-- Nothing
distancia Ord a =gt Grafo a -gt a -gt a -gt Maybe Int
distancia g u v
| estanConectados g u v =
Just (longitudCamino (head (todosArcosBA g u v)))
| otherwise = Nothing
94 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Definicioacuten 377 Dado G = (V A) un grafo sean u v isin V Un camino entre u y v cuyalongitud coincide con la distancia entre los veacutertices se llama geodeacutesica entre u y v
La funcioacuten (esGeodesica g c) se verifica si el camino c es una geodeacutesica entre susextremos en el grafo g
-- | Ejemplos
-- gtgtgt let g = creaGrafo [14] [(12)(13)(23)(34)]
-- gtgtgt esGeodesica g [134]
-- True
-- gtgtgt esGeodesica g [1234]
-- False
esGeodesica Ord a =gt Grafo a -gt [a] -gt Bool
esGeodesica g c =
esCamino g c ampamp
longitudCamino c == fromJust (distancia g u v)
where u = head c
v = last c
Nota 372 No hace falta imponer en la definicioacuten de la funcioacuten que el camino seaun recorrido pues el camino de miacutenima longitud entre dos veacutertices es siempre unrecorrido
376 Caminos cerrados
Definicioacuten 378 Un camino en un grafo G se dice cerrado si sus extremos son igualesDiremos que un camino cerrado de longitud tres es un triaacutengulo
La funcioacuten (esCerrado g c) se verifica si el camino c es cerrado en el grafo g
-- | Ejemplos
-- gtgtgt let g = creaGrafo [14] [(12)(13)(23)(34)]
-- gtgtgt esCerrado g [1231]
-- True
-- gtgtgt esCerrado g [123]
-- False
-- gtgtgt esCerrado g [1241]
-- False
esCerrado (Ord a) =gt Grafo a -gt [a] -gt Bool
esCerrado _ [] = False
esCerrado g (vc) =
esCamino g c ampamp v == last c
La funcioacuten (triangulos g v) devuelve la lista de todos los triaacutengulos que pasanpor el veacutertice v en el grafo g
-- | Ejemplos
-- gtgtgt triangulos (completo 4) 3
37 Caminos en grafos 95
-- [[3123][3143][3213][3243][3413][3423]]
-- gtgtgt triangulos (grafoCiclo 6) 1
-- []
triangulos Ord a =gt Grafo a -gt a -gt [[a]]
triangulos g u = todosCaminos g u u 3
377 Circuitos
Definicioacuten 379 Un recorrido en un grafo G se dice circuito si sus extremos son iguales
La funcioacuten (esCircuito g c) se verifica si la sucesioacuten de veacutertices c es un circuitoen el grafo g
-- | Ejemplos
-- gtgtgt grafoCiclo 4
-- G [1234] [(12)(14)(23)(34)]
-- gtgtgt esCircuito (grafoCiclo 4) [12341]
-- True
-- gtgtgt esCircuito (grafoCiclo 4) [1234]
-- False
-- gtgtgt esCircuito (grafoCiclo 4) [1234141]
-- False
esCircuito (Ord a) =gt Grafo a -gt [a] -gt Bool
esCircuito g c =
esRecorrido g c ampamp esCerrado g c
378 Ciclos
Definicioacuten 3710 Un camino simple en un grafo G se dice que es un ciclo si sus extremosson iguales
La funcioacuten (esCiclo g c) se verifica si el camino c es un ciclo en el grafo g
-- | Ejemplos
-- gtgtgt esCiclo (grafoCiclo 4) [121]
-- False
-- gtgtgt esCiclo (grafoCiclo 4) [12341]
-- True
-- gtgtgt esCiclo (grafoCiclo 4) [1234]
-- False
-- gtgtgt esCiclo (grafoCiclo 4) [1234141]
-- False
esCiclo (Ord a) =gt Grafo a -gt [a] -gt Bool
esCiclo g c =
esCaminoSimple g c ampamp esCerrado g c
96 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (todosCiclos g v) devuelve todos los ciclos en el grafo g que pasan porel veacutertice v
-- | Ejemplos
-- gtgtgt todosCiclos (grafoCiclo 4) 3
-- [[34123][32143]]
-- gtgtgt todosCiclos (completo 3) 2
-- [[2312][2132]]
-- gtgtgt todosCiclos (creaGrafo [123] [(11)(12)(13)(23)]) 1
-- [[1][1321][1231]]
-- gtgtgt todosCiclos (creaGrafo [12] [(12)(22)(23)]) 2
-- [[2]]
todosCiclos Ord a =gt Grafo a -gt a -gt [[a]]
todosCiclos g x =
map f (filter p (concat [todosArcosBA g x u | u lt- a x]))
where p c = longitudCamino c = 1
f c | longitudCamino c == 0 = c
| otherwise = c ++ [x]
a = adyacentes g
Nota 373 El algoritmo utilizado en la definicioacuten de (todosCiclos g) es el de buacutes-queda en anchura Este algoritmo recorre el grafo por niveles de forma que el pri-mer camino de la lista es de longitud miacutenima
379 Grafos aciacuteclicos
Definicioacuten 3711 Diremos que un grafo G = (V A) es aciacuteclico si no contiene ninguacutenciclo es decir si forallv isin V no existe ninguacuten camino simple que comience y termine en v
La funcioacuten (esAciclico g) se verifica si el grafo g es aciacuteclico
-- | Ejemplo
-- gtgtgt esAciclico (creaGrafo [14] [(12)(24)])
-- True
-- gtgtgt esAciclico (grafoCiclo 5)
-- False
-- gtgtgt esAciclico (grafoEstrella 6)
-- True
esAciclico Ord a =gt Grafo a -gt Bool
esAciclico g =
and [null (todosCiclos g x) | x lt- vertices g]
38 Conectividad de los grafos 97
38 Conectividad de los grafos
381 Estar conectados por un camino
Teorema 381 Dado un grafo G la relacioacuten u sim v (estar conectados por un camino) es unarelacioacuten de equivalencia
La funcioacuten (estarConectadosCamino g) devuelve la relacioacuten entre los veacutertices delgrafo g de estar conectados por un camino en eacutel
-- | Ejemplo
-- gtgtgt estarConectadosCamino (creaGrafo [14] [(12)(24)])
-- [(11)(12)(14)(21)(22)(24)(33)(41)(42)(44)]
estarConectadosCamino Ord a =gt Grafo a -gt [(aa)]
estarConectadosCamino g =
[(uv) | u lt- vs v lt- vs estanConectados g u v]
where vs = vertices g
A continuacioacuten comprobaremos el resultado con QuickCheck
ghcigt quickCheck prop_conectadosRelEqui
+++ OK passed 100 tests
prop_conectadosRelEqui Grafo Int -gt Bool
prop_conectadosRelEqui g =
esRelacionEquivalencia (vertices g) (estarConectadosCamino g)
382 Componentes conexas de un grafo
Definicioacuten 382 Las clases de equivalencia obtenidas por la relacioacuten sim estar conectadospor un camino en un grafo G inducen subgrafos en G los veacutertices y todas las aristas de loscaminos que los conectan que reciben el nombre de componentes conexas por caminosde G
La funcioacuten (componentesConexas1 g) devuelve las componentes conexas por cami-nos del grafo g
-- | Ejemplos
-- gtgtgt componentesConexas (creaGrafo [15] [(12)(23)])
-- [[123][4][5]]
-- gtgtgt componentesConexas (creaGrafo [15] [(12)(23)(45)])
-- [[123][45]]
-- gtgtgt componentesConexas (creaGrafo [13] [(12)(23)])
-- [[123]]
componentesConexas1 Ord a =gt Grafo a -gt [[a]]
componentesConexas1 g =
clasesEquivalencia (vertices g) (estarConectadosCamino g)
98 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Vamos a definir dos nuevas funciones una que compruebe si el grafo es nulo o com-pleto pues en dichos casos las componentes seraacuten el conjunto vaciacuteo y el conjuntodel conjunto de veacutertices respectivamente y otra con un algoritmo algo maacutes comple-jo
componentesConexas2 Ord a =gt Grafo a -gt [[a]]
componentesConexas2 g
| esGrafoNulo g = []
| esCompleto g = [vertices g]
| otherwise =
clasesEquivalencia (vertices g) (estarConectadosCamino g)
componentesConexas3 Ord a =gt Grafo a -gt [[a]]
componentesConexas3 g = aux (vertices g) [] []
where aux [] [] [] = []
aux [] xs ys = [xs]
aux (vvs) [] [] =
aux (vs (a v)) (i v (a v)) (a v)
aux vs xs ys | null ((ug [a v | v lt- ys]) xs) =
xs aux vs [] []
| otherwise =
aux (vs ug [a v | v lt- ys])
(u xs (ug [a v | v lt- ys]))
(ug [a v | v lt- ys] ys)
a = adyacentes g
i = inserta
ug = unionGeneral
u = unionConjuntos
La comprobacioacuten con QuickCheck de la equivalencia de las definiciones es
ghcigt quickCheck prop_EquiComponentesConexas
+++ OK passed 100 tests
ghcigt quickCheck prop_EquiComponentesConexas2
+++ OK passed 100 tests
prop_EquiComponentesConexas Grafo Int -gt Bool
prop_EquiComponentesConexas g =
componentesConexas1 g == componentesConexas2 g
prop_EquiComponentesConexas2 Grafo Int -gt Bool
prop_EquiComponentesConexas2 g =
componentesConexas1 g == componentesConexas3 g
Comparemos ahora la eficiencia de las definiciones
ghcigt componentesConexas1 grafoNulo
[]
(003 secs 0 bytes)
38 Conectividad de los grafos 99
ghcigt componentesConexas2 grafoNulo
[]
(001 secs 0 bytes)
ghcigt componentesConexas3 grafoNulo
[]
(001 secs 0 bytes)
ghcigt length (componentesConexas1 (completo 50))
1
(023 secs 0 bytes)
ghcigt length (componentesConexas2 (completo 50))
1
(016 secs 0 bytes)
ghcigt length (componentesConexas3 (completo 50))
1
(008 secs 0 bytes)
ghcigt length (componentesConexas1 (completo 100))
1
(217 secs 205079912 bytes)
ghcigt length (componentesConexas2 (completo 100))
1
(285 secs 0 bytes)
ghcigt length (componentesConexas3 (completo 100))
1
(119 secs 0 bytes)
ghcigt length (componentesConexas1 (completo 150))
1
(1295 secs 742916792 bytes)
ghcigt length (componentesConexas2 (completo 150))
1
(2048 secs 0 bytes)
ghcigt length (componentesConexas3 (completo 150))
1
(964 secs 0 bytes)
Con grafos completos de gran tamantildeo Haskell tarda maacutes tiempo en comprobar quees completo que en calcular directamente sus clases de equivalencia y para grafosnulos apenas hay diferencia en el coste entre la primera y la segunda definicioacuten Porotra parte la tercera definicioacuten es la maacutes eficiente en todos los casos y seraacute por tantola que utilizaremos a lo largo del trabajo
componentesConexas Ord a =gt Grafo a -gt [[a]]
componentesConexas = componentesConexas3
La funcioacuten (numeroComponentes g) devuelve el nuacutemero de componentes conexasdel grafo g
-- Ejemplos
-- gtgtgt numeroComponentes (creaGrafo [15] [(12)(23)(45)])
100 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- 2
-- gtgtgt numeroComponentes (creaGrafo [14] [(12)(22)(34)])
-- 2
numeroComponentes Ord a =gt Grafo a -gt Int
numeroComponentes g
| null (aristas g) = orden g
| otherwise = length (componentesConexas g)
Nota 381 Hemos comprobado para la definicioacuten anterior que comprobar si un gra-fo es completo es muy costoso luego no conviene antildeadirlo como patroacuten
383 Grafos conexos
Definicioacuten 383 Dado un grafo diremos que es conexo si la relacioacuten tiene una uacutenica clasede equivalencia en eacutel es decir si el grafo tiene una uacutenica componente conexa
La funcioacuten (esConexo g) se verifica si el grafo g es conexo
-- Ejemplos
-- gtgtgt esConexo (creaGrafo [13] [(12)(23)])
-- True
-- gtgtgt esConexo (creaGrafo [15] [(12)(23)(45)])
-- False
esConexo Ord a =gt Grafo a -gt Bool
esConexo g = length (componentesConexas g) == 1
esConexo2 Ord a =gt Grafo a -gt Bool
esConexo2 g
| esGrafoNulo g = False
| esUnitario (vertices g) = True
| otherwise = aux (vertices g) [] []
where aux [] [] [] = False
aux [] xs _ = True
aux (vvs) [] [] | null vs = True
| null (a v) = False
| otherwise =
aux (vs a v) (i v (a v)) (a v)
aux vs xs ys | null ((ug [a v | v lt- xs]) xs) = False
| otherwise =
aux (vs (ug [a v | v lt- xs]))
(u (ug [a v | v lt- xs]) xs)
((ug [a v | v lt- xs]) xs)
a = adyacentes g
ug = unionGeneral
i = inserta
u = unionConjuntos
38 Conectividad de los grafos 101
La comprobacioacuten de la equivalencia de las definiciones con QuickCheck es
ghcigt quickCheck prop_EquiEsConexo
+++ OK passed 100 tests
prop_EquiEsConexo Grafo Int -gt Bool
prop_EquiEsConexo g =
esConexo g == esConexo2 g
Vamos a comparar ahora su eficiencia
ghcigt let g1 = grafoCiclo 100
(000 secs 0 bytes)
ghcigt let g = creaGrafo (vertices g1) (aristas g1 [(23)(9899)])
(000 secs 0 bytes)
ghcigt esConexo g
False
(117 secs 151632168 bytes)
ghcigt esConexo2 g
False
(001 secs 0 bytes)
ghcigt esConexo (grafoCiclo 500)
True
(7341 secs 10448270712 bytes)
ghcigt esConexo2 (grafoCiclo 500)
True
(18939 secs 18468849096 bytes)
ghcigt esConexo (grafoCiclo 500)
True
(7341 secs 10448270712 bytes)
ghcigt esConexo2 (grafoCiclo 500)
True
(18939 secs 18468849096 bytes)
En principio no nos proporciona ninguna ventaja la segunda definicioacuten asiacute que tra-bajaremos con la primera que hemos dado ya que es mucho maacutes sencilla
Teorema 384 Sea G un grafo G = (V A) es conexo si y solamente si forallu v isin V existe uncamino entre u y v
Vamos a comprobar el resultado con QuickCheck
ghcigt quickCheck prop_caracterizaGrafoConexo
+++ OK passed 100 tests
prop_caracterizaGrafoConexo Grafo Int -gt Property
prop_caracterizaGrafoConexo g =
not (esGrafoNulo g) ==gt
esConexo g == and [estanConectados g u v
| u lt- vertices g v lt- vertices g]
102 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
384 Excentricidad
Definicioacuten 385 Sean G = (V A) un grafo y v isin V Se define la excentricidad de v comoel maacuteximo de las distancias entre v y el resto de veacutertices de G La denotaremos por e(v)
La funcioacuten (excentricidad g v) devuelve la excentricidad del veacutertice v en el grafog
-- | Ejemplos
-- gtgtgt let g = creaGrafo [13] [(12)(23)(33)]
-- gtgtgt excentricidad g 1
-- Just 2
-- gtgtgt excentricidad g 2
-- Just 1
-- gtgtgt excentricidad (creaGrafo [13] [(12)(33)]) 1
-- Nothing
excentricidad Ord a =gt Grafo a -gt a -gt Maybe Int
excentricidad g u
| esGrafoNulo g = Nothing
| orden g == 1 = Just 0
| Nothing `elem` distancias = Nothing
| otherwise = maximum distancias
where distancias = [distancia g u v | v lt- vertices g [u]]
La funcioacuten (excentricidades g) devuelve la lista ordenada de las excentricidadesde los veacutertices del grafo g
-- | Ejemplos
-- gtgtgt excentricidades (creaGrafo [13] [(12)(23)(33)])
-- [Just 1Just 2Just 2]
-- gtgtgt excentricidades (creaGrafo [13] [(12)(33)])
-- [NothingNothingNothing]
excentricidades Ord a =gt Grafo a -gt [Maybe Int]
excentricidades g = sort (map (excentricidad g) (vertices g))
385 Diaacutemetro
Definicioacuten 386 Sea G = (V A) un grafo Se define el diaacutemetro de G como el maacuteximo delas distancias entre los veacutertices en V Lo denotaremos por d(G)
La funcioacuten (diametro g) devuelve el diaacutemetro del grafo g
-- | Ejemplos
-- gtgtgt diametro (creaGrafo [13] [(12)(23)(33)])
-- Just 2
-- gtgtgt diametro (creaGrafo [13] [(12)(33)])
-- Nothing
diametro Ord a =gt Grafo a -gt Maybe Int
38 Conectividad de los grafos 103
diametro g
| esGrafoNulo g = Nothing
| Nothing `elem` distancias = Nothing
| otherwise = maximum distancias
where vs = vertices g
distancias = [distancia g u v | u lt- vs v lt- vs u lt= v]
386 Radio
Definicioacuten 387 Sean G = (V A) un grafo y v isin V Se define el radio de G como elmiacutenimo de las excentricidades de sus veacutertices Lo denotaremos por r(G)
La funcioacuten (radio g) devuelve el radio del grafo g
-- | Ejemplos
-- gtgtgt radio (creaGrafo [13] [(12)(23)(33)])
-- Just 1
-- gtgtgt radio (creaGrafo [13] [(12)(33)])
-- Nothing
radio Ord a =gt Grafo a -gt Maybe Int
radio g
| esGrafoNulo g = Nothing
| Nothing `elem` ds = Nothing
| otherwise = minimum ds
where ds = [excentricidad g v | v lt- vertices g]
387 Centro
Definicioacuten 388 Sean G = (V A) un grafo Llamamos centro del grafo G al conjunto deveacutertices de excentricidad miacutenima A estos veacutertices se les denomina veacutertices centrales
La funcioacuten (centro g) devuelve el centro del grafo g Por ejemplo
-- | Ejemplos
-- gtgtgt centro (creaGrafo [13] [(12)(23)(33)])
-- [2]
-- gtgtgt centro (creaGrafo [13] [(12)(13)(23)])
-- [123]
-- gtgtgt centro (creaGrafo [13] [(12)(33)])
-- [123]
centro Ord a =gt Grafo a -gt [a]
centro g = [v | v lt- vertices g excentricidad g v == r]
where r = radio g
104 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
388 Grosor
Definicioacuten 389 Sean G = (V A) un grafo Se llama grosor o cintura del grafo G almiacutenimo de las longitudes de los ciclos de G Si el grafo no posee ciclos (es decir es un grafoaciacuteclico) se dice que su cintura es infinita
La funcioacuten (grosor g) devuelve el grosor del grafo g
-- | Ejemplos
-- gtgtgt grosor (creaGrafo [123] [(12)(23)])
-- Nothing
-- gtgtgt grosor (creaGrafo [123] [(11)(12)(23)(34)])
-- Just 0
-- gtgtgt grosor grafoPetersen
-- Just 5
-- gtgtgt grosor grafoMoebiusCantor
-- Just 6
-- gtgtgt grosor grafoHeawood
-- Just 6
-- gtgtgt grosor grafoMcGee
-- Just 7
-- gtgtgt grosor grafoTutteCoxeter
-- Just 8
grosor Ord a =gt Grafo a -gt Maybe Int
grosor g
| esAciclico g = Nothing
| otherwise = Just (minimum [longitudCamino (head yss)
| x lt- vertices g
let yss = todosCiclos g x
not (null yss)])
Propiedades del grosor de los grafos
Teorema 3810 El grosor del grafo ciclo de orden n Cn es infin si n lt 3 y 3 en caso contrario
La propiedad se expresa por
prop_grosor_grafoCiclo Int -gt Bool
prop_grosor_grafoCiclo n =
grosor (grafoCiclo n) == if n lt 3
then Nothing
else Just n
Su comprobacioacuten para n le 30 es
ghcigt all prop_grosor_grafoCiclo [130]
True
Teorema 3811 El grosor del grafo amistad de orden n es 3 para todo n
38 Conectividad de los grafos 105
prop_grosor_grafoAmistad Int -gt Bool
prop_grosor_grafoAmistad n =
grosor (grafoAmistad n) == Just 3
Su comprobacioacuten para n le 30 es
ghcigt all prop_grosor_grafoAmistad [130]
True
Teorema 3812 El grosor del grafo completo de orden n Kn es infin si n lt 3 y 3 en casocontrario
La propiedad se expresa por
prop_grosor_completo Int -gt Bool
prop_grosor_completo n =
grosor (completo n) == if n lt 3
then Nothing
else Just 3
Su comprobacioacuten para n le 30 es
ghcigt all prop_grosor_completo [130]
True
Teorema 3813 El grosor del grafo bipartito completo de orden Kmn es infin si m = 1 oacuten = 1 y es 4 en caso contrario y 3 en caso contrario
La propiedad se expresa por
prop_grosor_bipartitoCompleto Int -gt Int -gt Bool
prop_grosor_bipartitoCompleto m n =
grosor (bipartitoCompleto m n) == if m == 1 || n == 1
then Nothing
else Just 4
Su comprobacioacuten para 1 le m le n le 15 es
ghcigt and [prop_grosor_bipartitoCompleto m n | m lt- [115] n lt- [m15]]
True
Teorema 3814 El grosor del grafo rueda de orden n Wn es infin si n lt 3 y 3 en caso contrario
La propiedad se expresa por
prop_grosor_grafoRueda Int -gt Bool
prop_grosor_grafoRueda n =
grosor (grafoRueda n) == if n lt 3
then Nothing
else Just 3
106 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Su comprobacioacuten para 1 le n le 30 es
ghcigt all prop_grosor_grafoRueda [130]
True
389 Propiedades e invariantes por isomorfismos
Teorema 3815 Sean G = (V A) y Gprime = (Vprime Aprime) grafos isomorfos con φ V rarr Vprime unisomorfismo Entonces dados u v isin V u sim v si y solamente si φ(u) sim φ(v)
La comprobacioacuten del teorema con QuickCheck es
ghcigt quickCheck prop_ConexionIsomorfismo1
+++ OK passed 100 tests
prop_ConexionIsomorfismo1 Grafo Int -gt Grafo Int -gt Bool
prop_ConexionIsomorfismo1 g h =
not (isomorfos g h) ||
and [ec g u v == ec h (imagen phi u) (imagen phi v)
| u lt- vs
v lt- vs
phi lt- isomorfismos g h]
where vs = vertices g
ec = estanConectados
Teorema 3816 Sean G = (V A) y Gprime = (Vprime Aprime) grafos isomorfos con φ V rarr Vprime unisomorfismo Entonces φ lleva cada componente conexa de G en una componente conexa deGprime
La comprobacioacuten del teorema con QuickCheck es
ghcigt quickCheck prop_ConexionIsomorfismo2
+++ OK passed 100 tests
prop_ConexionIsomorfismo2 Grafo Int -gt Grafo Int -gt Bool
prop_ConexionIsomorfismo2 g h =
not(isomorfos g h) ||
and [conjuntosIguales cch (aux f) | f lt- isomorfismos g h]
where cch = componentesConexas h
ccg = componentesConexas g
aux f = map (sort imagenConjunto f) ccg
Teorema 3817 Sean G = (V A) y Gprime = (Vprime Aprime) grafos isomorfos con φ V rarr Vprime unisomorfismo Entonces G y Gprime tienen el mismo nuacutemero de componentes conexas
La comprobacioacuten del teorema con QuickCheck es
38 Conectividad de los grafos 107
ghcigt quickCheck prop_ConexionIsomorfismo3
+++ OK passed 100 tests
prop_ConexionIsomorfismo3 Grafo Int -gt Grafo Int -gt Bool
prop_ConexionIsomorfismo3 g h =
not (isomorfos g h) ||
numeroComponentes g == numeroComponentes h
Teorema 3818 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que el diaacutemetro de G es igual al diaacutemetro de Gprime es decir el diaacutemetrode un grafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos diametro)
+++ OK passed 100 tests
Teorema 3819 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces se verifica que el radio de G es igual al radio de Gprime es decir el radio de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos radio)
+++ OK passed 100 tests
Teorema 3820 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que el grosor de G es igual al grosor de Gprime es decir el grosor de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos grosor)
+++ OK passed 100 tests
Teorema 3821 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que el centro de G es igual al centro de Gprime es decir el centro de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos centro)
+++ OK passed 100 tests
Teorema 3822 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces se verifica que el nuacutemero de componentes conexas de G es igual al nuacutemerode las de Gprime es decir el nuacutemero de componentes conexas de un grafo es un invariante porisomorfismos
108 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos numeroComponentes)
+++ OK passed 100 tests
Teorema 3823 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que los valores que toman las excentricidades de los veacutertices G esigual al de los veacutertices de Gprime es decir el conjunto de valores que toman las excentricidadesde los veacutertices es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos excentricidades)
+++ OK passed 100 tests
Capiacutetulo 4
Matrices asociadas a grafos
En este capiacutetulo se definiraacuten algunas representaciones de grafos como matrices secomprobaraacuten sus propiedades y volveremos a definir algunos conceptos del capiacutetu-lo 3 ahora utilizando matricesPara elaborar el contenido del capiacutetulo utilizareacute el segundo tema del trabajo fin degrado de Fco Javier Franco Galviacuten Aspectos algebraicos en teoriacutea de grafos ([7]) En eltrabajo el autor introduce los conceptos de matriz de adyacencia matriz de incidenciay otras matrices asociadas a grafos
41 Generador de grafos simples
En esta seccioacuten presentaremos el generador de grafos que nos permitiraacute generargrafos simples como listas de aristas arbitrariamente y usarlos como ejemplos opara comprobar propiedades en la seccioacuten de matrices asociadas a grafos(grafoSimple) es un generador de grafos simples de hasta 10 veacutertices Por ejemplo
ghcigt sample grafoSimple
G [12345678] [(14)(15)(16)(17)(18)(23)
(24)(25)(27)(35)(37)(45)(46)(56)(67)]
G [123456789] [(14)(18)(23)(25)(29)
(34)(35)(36)(38)(39)(46)(48)(49)
(58)(59)(69)(78)]
G [123456] [(12)(13)(24)(25)(26)(35)(56)]
G [1234567] [(12)(13)(14)(24)(25)(26)
(36)(45)(46)(67)]
G [1234] [(13)(14)(23)(34)]
G [123] [(23)]
G [12] [(12)]
G [123456] [(16)(24)(26)(35)(36)(56)]
G [123456789] [(12)(14)(15)(16)(17)(24)
(34)(37)(38)(39)(45)(47)(49)(56)(57)
(58)(59)(67)(69)(78)(79)]
109
110 Capiacutetulo 4 Matrices asociadas a grafos
G [123456789] [(13)(14)(15)(16)(23)(24)
(29)(35)(39)(45)(47)(48)(49)(57)(58)
(59)(67)(68)(69)(79)]
G [1] []
grafoSimple Gen (Grafo Int)
grafoSimple = do
n lt- choose (010)
as lt- sublistOf [(xy) | x lt- [1n] y lt- [x+1n]]
return (creaGrafo [1n] as)
42 Matrices de adyacencia
421 Definicioacuten y propiedades
Usaremos la funcioacuten (imprimeMatriz p) para imprimir por pantalla la matriz p conuna fila por liacutenea
-- | Ejemplo
-- gtgtgt imprimeMatriz (fromLists [[134][357][479]])
-- [134]
-- [357]
-- [479]
imprimeMatriz Show a =gt Matrix a -gt IO ()
imprimeMatriz p =
mapM_ print (toLists p)
Definicioacuten 421 Sea G = (V A) un grafo simple con V = v1 vn Se define sumatriz de adyacencia como Antimesn = (aij) donde el elemento aij toma el valor 1 si existealguna arista en A uniendo los veacutertices vi y vj y 0 en caso contrario
Nota 421 La matriz de adyacencia depende del etiquetado del grafo
La funcioacuten (matrizAdyacencia g) es la matriz de adyacencia del grafo g
-- | Ejemplo
-- gtgtgt imprimeMatriz (matrizAdyacencia (grafoCiclo 4))
-- [0101]
-- [1010]
-- [0101]
-- [1010]
-- gtgtgt imprimeMatriz (matrizAdyacencia (completo 4))
-- [0111]
-- [1011]
-- [1101]
-- [1110]
42 Matrices de adyacencia 111
matrizAdyacencia Grafo Int -gt Matrix Int
matrizAdyacencia g = matrix n n f
where n = orden g
f (ij) | (ij) `aristaEn` g = 1
| otherwise = 0
422 Propiedades baacutesicas de las matrices
La funcioacuten (esSimetrica p) se verifica si la matriz p es simeacutetrica
-- ejemplo
-- gtgtgt esSimetrica (fromLists [[134][357][479]])
-- True
-- gtgtgt esSimetrica (fromLists [[134][357][497]])
-- False
esSimetrica Eq a =gt Matrix a -gt Bool
esSimetrica p =
transpose p == p
La funcioacuten (potencia p n) devuelvela potencia nndasheacutesima de la matriz cuadrada p
-- Ejemplo
-- gtgtgt potencia (fromLists [[134][357][479]]) 3
-- ( 408 735 975 )
-- ( 735 1323 1755 )
-- ( 975 1755 2328 )
potencia Num a =gt Matrix a -gt Int -gt Matrix a
potencia p 1 = p
potencia p n = if (odd n)
then (m p (potencia (m p p) (div (n-1) 2)))
else (potencia (m p p) (div (n-1) 2))
where m = multStd2
423 Propiedades de las matrices de adyacencia
Teorema 422 Para todo n la matriz de adyacencia del grafo ciclo de orden n Cn es simeacute-trica
ghcigt all prop_simetricaAdyacenciaCompleto [130]
True
prop_simetricaAdyacenciaCompleto Int -gt Bool
prop_simetricaAdyacenciaCompleto n =
esSimetrica (matrizAdyacencia (completo n))
La funcioacuten (tamantildeoM g) devuelve el tamantildeo del grafo simple g calculado usandosu matriz de adyacencia
112 Capiacutetulo 4 Matrices asociadas a grafos
-- | Ejemplos
-- gtgtgt tamantildeoM (grafoCiclo 4)
-- 4
-- gtgtgt tamantildeoM grafoPetersen
-- 15
tamantildeoM Grafo Int -gt Int
tamantildeoM g = sum (toList (matrizAdyacencia g)) `div` 2
Teorema 423 El tamantildeo de un grafo simple es la mitad de la suma de los elementos de sumatriz de adyacencia
La comprobacioacuten del teorema con QuickCheck es
ghcigt quickCheck prop_tamantildeoMatriz
+++ OK passed 100 tests
prop_tamantildeoMatriz Property
prop_tamantildeoMatriz =
forAll grafoSimple
(g -gt tamantildeo g == tamantildeoM g)
Teorema 424 Si un grafo G = (V A) tiene un veacutertice aislado vi tanto la fila como lacolumna indasheacutesima de su matriz de adyacencia estaraacuten formadas por ceros
esAisladoM Grafo Int -gt Int -gt Bool
esAisladoM g v = if (all (==0)
(((toLists (ma g)) (v-1))
++((toLists (t (ma g))) (v-1))))
then True
else False
where ma = matrizAdyacencia
t = transpose
La comprobacioacuten del teorema es
ghcigt quickCheck prop_esAisladoMatriz
+++ OK passed 100 tests
prop_esAisladoMatriz Property
prop_esAisladoMatriz =
forAll grafoSimple
(g -gt and [esAislado g v == esAisladoM g v
| v lt- vertices g])
Teorema 425 Sea un grafo G = (V A) simple no dirigido con V = v1 vn Lasuma de los elementos de la fila (o columna) indasheacutesima de su matriz de adyacencia coincide conel grado del veacutertice vi Es decir
42 Matrices de adyacencia 113
δ(vi) =n
sumj=1
aij =n
sumj=1
aji
gradoM Grafo Int -gt Int -gt Int
gradoM g v = sum ((toLists (ma g)) (v-1))
where ma = matrizAdyacencia
La comprobacioacuten del teorema es
ghcigt quickCheck prop_gradoMatriz
+++ OK passed 100 tests
prop_gradoMatriz Property
prop_gradoMatriz =
forAll grafoSimple
(g -gt and [grado g v == gradoM g v | v lt- vertices g])
Teorema 426 Sea G = (V A) un grafo bipartito de conjuntos de veacutertices disjuntosV1 = v1 vk y V2 = vk+1 vn tal que V = V1 cup V2 y soacutelo existen aristasque conectan veacutertices de V1 con veacutertices de V2 Entonces con este etiquetado de V la matrizde adyacencia de G tiene la forma
A =
(θ BBt θ
)
prop_BipartitoMatriz Grafo Int -gt Property
prop_BipartitoMatriz g =
esBipartito g ==gt
all (==0) [ getElem u v m | [uv] lt- (f (fromJust p))]
where f (xsys) = filter p (subsequences xs ++ subsequences ys)
where p zs = length zs == 2
p = conjuntosVerticesDisjuntos g
m = matrizAdyacencia g
424 Caminos y arcos
En esta seccioacuten se presentaraacute la informacioacuten que contiene la matriz de adyacenciade un grafo en relacioacuten a los caminos que se encuentran en eacutel
Teorema 427 Sea G = (V A) un grafo con V = v1 vn y matriz de adyacenciaA = (aij) Entonces forallk ge 0 el elemento (i j) de Ak que denotaremos por ak
ij es elnuacutemero de caminos de longitud k desde el veacutertice vi al veacutertice vj
114 Capiacutetulo 4 Matrices asociadas a grafos
numeroCaminosDeLongitudM Grafo Int -gt Int -gt Int -gt Int -gt Int
numeroCaminosDeLongitudM g u v k = getElem u v mk
where ma = matrizAdyacencia g
n = orden g
mk = foldr (multStd2) (identity n) (take k (repeat ma))
La comprobacioacuten del teorema para k le 6 es
ghcigt quickCheck prop_numeroCaminosMatriz
+++ OK passed 100 tests
prop_numeroCaminosMatriz Grafo Int -gt Gen Bool
prop_numeroCaminosMatriz g = do
k lt- choose (06)
let vs = vertices g
return (and [ numeroCaminosDeLongitud g u v k ==
numeroCaminosDeLongitudM g u v k
|(uv) lt- productoCartesiano vs vs u lt v])
De este teorema se deducen las siguientes propiedades
Teorema 428 Sea G un grafo simple Siguiendo la notacioacuten del teorema anterior se tieneque1 a(2)ii = δ(vi)
2 a(3)ii es el nuacutemero de triaacutengulos que contienen al veacutertice vi
gradoCaminosM Grafo Int -gt Int -gt Int
gradoCaminosM g v = getElem v v m2
where m = matrizAdyacencia g
m2 = multStd2 m m
numeroTriangulosM Grafo Int -gt Int -gt Int
numeroTriangulosM g v = getElem v v (potencia m 3)
where m = matrizAdyacencia g
La comprobacioacuten con QuickCheck es
ghcigt quickCheck prop_GradoCaminosMatriz
+++ OK passed 100 tests
ghcigt quickCheck prop_TriangulosMatriz
+++ OK passed 100 tests
prop_GradoCaminosMatriz Grafo Int -gt Bool
prop_GradoCaminosMatriz g =
and [ grado g v == gradoCaminosM g v | v lt- vertices g]
42 Matrices de adyacencia 115
prop_TriangulosMatriz Property
prop_TriangulosMatriz =
forAll grafoSimple
(g -gt and [length (triangulos g v) ==
numeroTriangulosM g v | v lt- vertices g])
116 Capiacutetulo 4 Matrices asociadas a grafos
Capiacutetulo 5
Apeacutendices
51 Sistemas utilizados
El desarrollo de mi Trabajo de Fin de Grado requeriacutea de una infraestructura teacutecnicaque he tenido que trabajar antes de comenzar a desarrollar el contenido A conti-nuacioacuten voy a nombrar y comentar los sistemas y paquetes que he utilizado a lolargo del proyectobull Ubuntu como sistema operativo El primer paso fue instalar Ubuntu en mi orde-
nador portaacutetil personal Para ello seguiacute las recomendaciones de mi compantildeeroEduardo Paluzo quien ya lo habiacutea hecho antesPrimero me descargueacute la imagen del sistema Ubuntu 1604 LTS (para procesadorde 64 bits) desde la paacutegina de descargas de Ubuntu 1 y tambieacuten la herramientaLinuxLive USB Creator 2 que transformariacutea mi pendrive en una unidad USB Boo-teable cargada con la imagen de Ubuntu Una vez tuve la unidad USB preparadaprocediacute a instalar el nuevo sistema apagueacute el dispositivo y al encenderlo entreacuteen el Boot Menu de la BIOS del portaacutetil para arrancar desde el Pendrive en vez dehacerlo desde el disco duro Automaacuteticamente comenzoacute la instalacioacuten de Ubuntuy solo tuve que seguir las instrucciones del asistente para montar Ubuntu mante-niendo ademaacutes Windows 10 que era el sistema operativo con el que habiacutea estadotrabajando hasta ese momentoEl resultado fue un poco agridulce pues la instalacioacuten de Ubuntu se habiacutea reali-zado con eacutexito sin embargo al intentar arrancar Windows desde la nueva GRUBme daba un error al cargar la imagen del sistema Despueacutes de buscar el error queme apareciacutea en varios foros encontreacute una solucioacuten a mi problema deshabiliteacute elSecurity Boot desde la BIOS y pude volver a arrancar Windows 10 con normali-dad
1httpwwwubuntucomdownloaddesktop2httpwwwlinuxliveusbcom
117
118 Capiacutetulo 5 Apeacutendices
bull LATEX como sistema de composicioacuten de textos La distribucioacuten de LATEXTex Livecomo la mayoriacutea de software que he utilizado la descargueacute utilizando el Gestorde Paquetes Synaptic Anteriormente soacutelo habiacutea utilizado TexMaker como editorde LATEX asiacute que fue el primero que descargueacute Maacutes tarde mi tutor Joseacute Antoniome sugirioacute que mejor descargara el paquete AUCTex pues me permitiriacutea trabajarcon archivos TEX desde el editor Emacs asiacute lo hice y es el que he utilizado pararedactar el trabajo Ademaacutes de los que me recomendaba el gestor solo he tenidoque descargarme el paquete spanish de babel para poder componer el trabajo puesel paquete Tikz que he utilizado para representar los grafos veniacutea incluido en lassugerencias de Synapticbull Haskell como lenguaje de programacioacuten Ya habiacutea trabajado anteriormente con
este lenguaje en el grado y sabiacutea que soacutelo teniacutea que descargarme la plataforma deHaskell y podriacutea trabajar con el editor Emacs Seguiacute las indicaciones que se dan alos estudiantes de primer curso en la paacutegina del Dpto de Ciencias de la Compu-tacioacuten e Inteligencia Artificial 3 y me descargueacute los paquetes haskell-platform yhaskell-mode desde el Gestor de Paquetes Synaptic La versioacuten de la plataforma deHaskell con la que he trabajado es la 2014200debian2 y la del compilador GHC la7103-7bull Dropbox como sistema de almacenamiento compartido Ya habiacutea trabajado con
Dropbox en el pasado asiacute que crear una carpeta compartida con mis tutores nofue ninguacuten problema sin embargo al estar Dropbox sujeto a software no libre nome resultoacute tan sencillo instalarlo en mi nuevo sistema En primer lugar intenteacutehacerlo directamente desde Ubuntu Software que intentoacute instalar Dropbox Nauti-lus y abrioacute dos instalaciones en paralelo Se quedoacute colgado el ordenador asiacute quemateacute los procesos de instalacioacuten activos reinicieacute el sistema y me descargueacute direc-tamente el paquete de instalacioacuten desde la paacutegina de descargas de Dropbox 4 y loejecuteacute desde la terminalbull Git como sistema remoto de control de versiones Era la primera vez que trabaja-
ba con Git y me costoacute bastante adaptarme Mi tutor Joseacute Antonio y mi compantildeeroEduardo Paluzo me ayudaron mucho e hicieron el proceso de adaptacioacuten muchomaacutes aacutegil El manual que Eduardo ha redactado y presenta en su Trabajo Fin deGrado me ha sido muy uacutetil es una pequentildea guiacutea que cualquier interesado en elempleo de Git puede utilizar como introduccioacuten La instalacioacuten no resultoacute com-plicada a traveacutes del Gestor de Paquetes Synaptic me descargueacute el paquete elpa-magity todos los demaacutes paquetes necesarios para trabajar con Git en mi portaacutetil usandoel editor Emacs Eduardo me ayudoacute a crear el repositorio MDenHaskell en la plata-forma GitHub y clonarlo en mi ordenador personal Dicho repositorio contiene el
3httpwwwcsuses~jalonsocursosi1m-15sistemasphp4httpswwwdropboxcomesinstallos=lnx
52 Mapa de decisiones de disentildeo en conjuntos 119
total del trabajo y se almacena de forma puacuteblica La versioacuten de Magit que utilizoes la 250-2
52 Mapa de decisiones de disentildeo en conjuntos
Una vez comenzado el trabajo y habiendo hecho ya varias secciones acerca de laTeoriacutea de Grafos se puso de manifiesto la conveniencia de crear nuevos capiacutetulosintroduciendo conceptos de la Teoriacutea de Conjuntos y las relaciones que se puedenpresentar entre sus elementosHaskell tiene una libreriacutea especiacutefica para conjuntos DataSet sin embargo no estan intuitiva ni tan eficiente como la de listas (DataList) A lo largo del proyecto hecreado un moacutedulo que permite trabajar con conjuntos utilizando tanto su represen-tacioacuten como listas ordenadas sin elementos repetidos como su representacioacuten comolistas sin elementos repetidos Dicho moacutedulo se llama Conjuntos y lo presento en elprimer capiacutetulo del Trabajo
53 Mapa de decisiones de disentildeo en grafos
Al comienzo del proyecto la idea era que las primeras representaciones con lasque trabajara fueran las de grafos como vectores de adyacencia y grafos como matricesde adyacencia que se utilizan en Informaacutetica en el primer curso del Grado con lasque ya habiacutea trabajado y estaba familiarizadaLas definiciones de Informaacutetica estaacuten pensadas para grafos ponderados (dirigidoso no seguacuten se eligiera) mientras que en Matemaacutetica Discreta apenas se usan grafosdirigidos o ponderados por tanto el primer cambio en la representacioacuten utilizadafue simplificar las definiciones de modo que solo trabajaacuteramos con grafos no diri-gidos y no ponderados pero manteniendo las estructuras vectorial y matricial quemanteniacutean la eficienciaLas representaciones que utilizan arrays en Haskell son muy restrictivas pues soloadmiten vectores y matrices que se puedan indexar lo que hace muy complicadostodos los algoritmos que impliquen alguacuten cambio en los veacutertices de los grafos yademaacutes no permite trabajar con todos los tipos de veacutertices que pudieacuteramos desearDecidimos volver a cambiar la representacioacuten y esta vez nos decantamos por larepresentacioacuten de grafos como listas de aristas perdiendo en eficiencia pero ganandomucho en flexibilidad de escrituraPor uacuteltimo mis tutores sugirieron dar una representacioacuten de los grafos mediantesus matrices de adyacencia y comprobar la equivalencia de las definiciones que yahabiacutea hecho en otros moacutedulos con las dadas para esta representacioacuten Para ello he
120 Capiacutetulo 5 Apeacutendices
trabajado con la libreriacutea DataMatrix de Haskell
Bibliografiacutea
[1] J Alonso Temas de programacioacuten funcional Technical report Univ de Sevilla2015
[2] P Burzyn Complejidad computacional en problemas de modificacioacuten de aris-tas en grafos Technical report Univ de Buenos Aires
[3] K Claessen and J Hughes QuickCheckA Lightweight Tool for Random Tes-ting of Haskell Programs Technical report Chalmers University of Technology2000
[4] M Caacuterdenas Matemaacutetica discreta Technical report Univ de Sevilla 2015
[5] D de Matemaacuteticas El regalo de Cantor Technical report IES Matarrantildea deValderrobres 2009
[6] D de Aacutelgebra Aacutelgebra Baacutesica tema 1 Conjuntos Technical report Univ deSevilla 2015
[7] F Franco Aspectos algebraicos en Teoriacutea de Grafos Technical report Univ deSevilla 2016
[8] F Rabhi and G Lapalme Algorithms A functional programming approachAddison-Wesley Longman Publishing Co Inc Boston MA USA 1st edition1999
[9] P Vasconcelos Property Testing using QuickCheck Technical report Univer-sidade do Porto 2016
[10] Wikipedia Set (mathematics) Technical report Wikipedia La Enciclopedialibre 2016
[11] Wikipedia AnexoGaleriacutea de grafos Technical report Wikipedia La Enciclo-pedia libre 2016
[12] Wikipedia Teoriacutea de la complejidad computacional Technical report Wikipe-dia La Enciclopedia libre 2017
121
Iacutendice alfabeacutetico
Grafo 18 52adyacentes 53antiImagenRelacion 38aristaEn 53aristasCamino 88aristas 53automorfismos 87bipartitoCompleto 58biyecciones 47cardinal 22 31centro 103clasesEquivalencia 43combinaciones 25 34complementario 22 31completo 58componentesConexas1 97componentesConexas2 98componentesConexas3 98conjuntosIguales 30conjuntosIguales 21conjuntosVerticesDisjuntos 59conservaAdyacencia 78creaGrafo 52diametro 102distancia 93dominio 38eliminaArista 74eliminaLazos 74eliminaVertice 74elimina 19 28entorno 69esAisladoM 112
esAislado 69esAntisimetrica 41esAutomorfismo 86esBipartito 60esCamino 87esCerrado 94esCircuito 95esCompleto 77esConexo 100esFuncional 39esFuncion 43esGeodesica 94esInyectiva 45esIsomorfismo 81esLazo 69esReflexiva 40esRegular 70esRelacionEquivalencia 42esRelacionHomogenea 39esRelacionOrden 43esRelacion 37esSimetrica 41 111esSimple 70esSobreyectiva 45 46esSubconjuntoPropio 21 30esSubconjunto 20 29esSubgrafoMax 72esSubgrafoPropio 72esSubgrafo 72esTransitiva 41esUnitario 23 32esVacio 18 27
122
Iacutendice alfabeacutetico 123
estaRelacionado 40estanConectados 93excentricidades 102excentricidad 102funciones 44generaGrafo 54gradoM 113 114grado 69grafoAmistad 57grafoCiclo 56grafoCirculante 61grafoComplementario 77grafoEstrella 60grafoHeawood 64grafoMcGee 64grafoMoebiusCantor 67grafoNulo 55grafoPetersenGen 62grafoPetersen 66grafoRueda 61grafoSimple 110grafoThomson 63grafoTutteCoxeter 65grosor 104imagenConjunto 45imagenInversa 47imagenRelacion 38imagen 44imprimeMatriz 110inserta 18 27interseccion 33interseccion 24inversa 47isomorfismos 82isomorfos 82longitudCamino 88matrizAdyacencia 110minimoElemento 19 28morfismos 79
numeroArcosDeLongitud 92numeroCaminosDeLongitud 89numeroCaminosDeLongitugM 113numeroComponentesConexas 99numeroTriangulosM 114orden 68parDeVertices 91pertenece 19 28potencia 111productoCartesiano 34productoCartesiano 25prop_HavelHakimi 73prop_LemaApretonDeManos 73prop_completos 76prop_BipartitoMatriz 113prop_ConectadosRelEqui 97prop_ConexionIsomorfismo1 106prop_ConexionIsomorfismo2 106prop_ConexionIsomorfismo3 107prop_GradoMatriz 114prop_TriangulosMatriz 114prop_esAisladoMatriz 112prop_gradoMatriz 113prop_numeroCaminosMatriz 114prop_simetricaAdyacenciaCompleto 111prop_tamantildeoMatriz 112prop_todosArcosBA 92radio 103rango 38secuenciaGrados 71secuenciaGrafica 71sinRepetidos 19 29sonIncidentes 68sumaArista 75sumaGrafos 76 77sumaVertice 75tamantildeoM 111tamantildeo 68todosArcosBA 91
124 Iacutendice alfabeacutetico
todosArcos 90todosCaminos 88todosCiclos 96triangulos 94unionConjuntos 23 32unionGeneral 24 33vacio 18 27valenciaMax 70valenciaMin 70variaciones 26 35verticesCamino 88vertices 53
Iacutendice general 5
344 Grafo completo 57345 Grafo bipartito 58346 Grafo estrella 60347 Grafo rueda 60348 Grafo circulante 61349 Grafo de Petersen generalizado 623410 Otros grafos importantes 63
35 Definiciones y propiedades 67351 Definiciones de grafos 68352 Propiedades de grafos 73353 Operaciones y propiedades sobre grafos 73
36 Morfismos de grafos 78361 Morfismos 78362 Complejidad del problema de homomorfismo de grafos 80363 Isomorfismos 81364 Automorfismos 86
37 Caminos en grafos 87371 Definicioacuten de camino 87372 Recorridos 89373 Caminos simples 89374 Conexioacuten 93375 Distancia 93376 Caminos cerrados 94377 Circuitos 95378 Ciclos 95379 Grafos aciacuteclicos 96
38 Conectividad de los grafos 97381 Estar conectados por un camino 97382 Componentes conexas de un grafo 97383 Grafos conexos 100384 Excentricidad 102385 Diaacutemetro 102386 Radio 103387 Centro 103388 Grosor 104389 Propiedades e invariantes por isomorfismos 106
6 Iacutendice general
4 Matrices asociadas a grafos 109
41 Generador de grafos simples 109
42 Matrices de adyacencia 110421 Definicioacuten y propiedades 110422 Propiedades baacutesicas de las matrices 111423 Propiedades de las matrices de adyacencia 111424 Caminos y arcos 113
5 Apeacutendices 117
51 Sistemas utilizados 117
52 Mapa de decisiones de disentildeo en conjuntos 119
53 Mapa de decisiones de disentildeo en grafos 119
Bibliografiacutea 121
Indice de definiciones 121
Agradecimientos
Quisiera agradecer a todas las personas que me han apoyado y prestado sus co-nocimientos a lo largo de estos cuatro antildeos del grado Gracias a ellos el esfuerzo hamerecido la pena
En primer lugar me gustariacutea destacar a Mariacutea Joseacute Hidalgo Doblado y Joseacute An-tonio Alonso Jimeacutenez mi tutores en este Trabajo de Fin de Grado Les agradezco detodo corazoacuten la constancia y la atencioacuten que me han brindado a pesar de las dificul-tades que supone realizar el proyecto durante un curso en el que estoy disfrutandola oportunidad de la movilidad internacional Erasmus Son para miacute un referente y unclaro ejemplo de lo que se puede conseguir con esfuerzo y trabajo en equipo
Seguidamente expresar mi gratitud al resto de profesores y trabajadores de la Uni-versidad de Sevilla especialmente a aquellos que se esfuerzan por mejorar la institu-cioacuten diacutea a diacutea
Quiero agradecer tambieacuten este trabajo a mi familia en especial a mis padres que meapoyaron desde el principio cuando tomeacute la decisioacuten de cambiar de carrera y siemprehan intentado brindarnos a mi hermana y a miacute con lo mejor
Finalmente a mis amigos y compantildeeros que han hecho de esta primera etapa uni-versitaria un capiacutetulo de mi vida lleno de bonitos recuerdos En especial a Pedro conquien he tenido la suerte de compartir todo
Muchas gracias a todos
7
8 Iacutendice general
Abstract
Discrete mathematics is characterized as the branch of mathematics dealing withfinite and numerable sets Concepts and notations from discrete mathematics are use-ful in studying and describing objects and real-life problems In particular the graphtheory has numerous applications in logistics
Throughout this project some of the knowlegde adquired from the course ldquoMa-temaacutetica Discretardquo will be given a computational implementation The code will bewritten in Haskell language and a free version of it will be available in GitHub underthe name MDenHaskell The work will focus on the graph theory and will provide so-me examples and algorithms in order to give an introduction of it and how it can beimplemented in Haskell
At first two chapters will be presented as a gentle reminder of basic concepts rela-ted to the set theory and the relations that can be established among them The thirdchapter will introduce the main topic graph theory with different representationsdefinitions and examples on graphs It will go through aspects such as morphismconnectivity and paths in graphs Finally some properties and advantages of workingwith adjacency matrices will be presented in the fourth chapter
This project leaves the door open for the community of programmers to continueand improve it It can be used as a self-learning tool as well as to make calculationsthat by hand would be tedious
9
10 Iacutendice general
Introduccioacuten
El objetivo del trabajo es la implementacioacuten de algoritmos de matemaacutetica discretaen Haskell Los puntos de partida son
los temas de la asignatura ldquoMatemaacutetica discretardquo ([4])los temas de la asignatura ldquoInformaacuteticardquo ([1])el capiacutetulo 7 del libro ldquoAlgorithms A functional programming approachrdquo ([8]) yel artiacuteculo ldquoGraph theoryrdquo ([11]) de la WikipediaHaskell es un lenguaje de programacioacuten funcional desarrollado en los uacuteltimos antildeos
por la comunidad de programadores con la intencioacuten de usarlo como instrumentopara la ensentildeanza de programacioacuten funcional La motivacioacuten de este desarrollo eshacer el anaacutelisis y disentildeo de programas maacutes simple y permitir que los algoritmos seanfaacutecilmente adaptables a otros lenguajes de programacioacuten funcionales
En comparacioacuten con otros lenguajes de programacioacuten imperativos la sintaxis deHaskell permite definir funciones de forma maacutes clara y compacta En Haskell las fun-ciones se consideran valores al mismo nivel que los tipos enteros o cadenas en cual-quier lenguaje Por ello al igual que es habitual que en todos los lenguajes una funcioacutenreciba datos de entrada (de tipo entero flotante cadena etc) y devuelva datos (de losmismos tipos) en los lenguajes funcionales una funcioacuten puede recibir como dato deentrada una funcioacuten y devolver otra funcioacuten como salida que puede ser construida apartir de sus entradas y por operaciones entre funciones como la composicioacuten Estacapacidad nos proporciona meacutetodos maacutes potentes para construir y combinar los di-versos moacutedulos de los que se compone un programa Por ejemplo emulando la formade operar sobre funciones que habitualmente se usa en matemaacuteticas
La matemaacutetica discreta consiste en el estudio de las propiedades de los conjuntosfinitos o infinitos numerables lo que hace posible su directa implementacioacuten compu-tacional En particular la asignatura ldquoMatemaacutetica Discretardquo del grado se centra enestudiar propiedades y algoritmos de la combinatoria y la teoriacutea de grafos A lo largodel trabajo se implementaraacuten en Haskell definiciones y algoritmos con los que ya seha tenido una primera aproximacioacuten teoacuterica durante el grado
Los dos primeros capiacutetulos del trabajo sientan la base que permitiraacute en los dos si-guientes una aproximacioacuten a la teoriacutea de grafos En el primero se hace una introduc-cioacuten a la teoriacutea de conjuntos y se dan dos posibles representaciones de conjuntos con
11
12 Iacutendice general
las que trabajar en Haskell En el segundo se presentan los conceptos de ldquorelacioacutenrdquo yde ldquofuncioacutenrdquo que al igual que los conjuntos son necesarios para definir aplicacionesde los grafos Su redaccioacuten sigue la liacutenea de la primera parte de la asignatura ldquoAacutelgebraBaacutesicardquo del grado
En el tercer capiacutetulo del trabajo se hace una introduccioacuten a la teoriacutea de grafos Enprimer lugar se dan una representacioacuten con la que trabajar en Haskell y un generadorde grafos que permitiraacute comprobar propiedades con QuickCheck Seguidamente sepresenta una galeriacutea de grafos conocidos que se utilizaraacuten como ejemplos para lasdefiniciones y los algoritmos de las secciones siguientes Las primeras seraacuten algunasdeficiones baacutesicas y despueacutes se trataraacuten los conceptos de ldquomorfismosrdquo ldquocaminosrdquo yldquoconectividadrdquo en grafos
Por uacuteltimo en el cuarto capiacutetulo se da una representacioacuten de los grafos a traveacutesde su matriz de adyacencia Se implementaraacuten algunos de los resultados que JavierFranco Galviacuten expuso en su Trabajo Fin de Grado Aspectos algebraicos en teoriacutea de grafosy se comprueba que concuerdan con el desarrollo hecho en el capiacutetulo anterior
Cabe destacar el trabajo con los diferentes sistemas y programas que se han utiliza-do a lo largo del proyecto
Ubuntu como sistema operativoel editor de textos Emacs que ha permitido el uso de Haskell literario para la redaccioacutendel trabajoel paquete de produccioacuten de graacuteficos vectoriales Tikz de LATEX mediante el que seha dado la representacioacuten graacutefica de los ejemplos de grafosGitHub como sistema remoto de control de versionesy DocTest como sistema de validacioacuten de moacutedulosSe va a hacer una breve introduccioacuten los sistemas maacutes destacados
Ubuntu
Ubuntu es un sistema operativo creado a partir de GNULinux con la intencioacuten dehacer una versioacuten de este maacutes sencilla de manejar y que permitiera acceso al soft-ware libre para todo el mundo por igual La primera distribuioacuten oficial de Ubuntufue la versioacuten 410 y tuvo lugar en 2004 Desde entonces el proyecto ha captadola atencioacuten de miles de entusiastas del software libre que han querido unirse a lacomunidad UbuntuSoftware libre significa que los usuarios tienen la libertad de ejecutar copiar distri-buir estudiar modificar y mejorar el software Es una cuestioacuten de libertad no deprecio Para entender el concepto debe pensarse en laquolibreraquo como en laquolibertad deexpresioacutenraquo
Iacutendice general 13
Maacutes precisamente software libre significa que los usuarios de un programa tienenlas cuatro libertades esencialesbull La libertad de ejecutar el programa como lo desee con cualquier propoacutesito (liber-
tad 0)bull La libertad de estudiar el funcionamiento del programa y adaptarlo a sus necesi-
dades (libertad 1) El acceso al coacutedigo fuente es un prerrequisito para estobull La libertad de redistribuir copias para ayudar a los demaacutes (libertad 2)bull La libertad de mejorar el programa y de publicar las mejoras de modo que toda la
comunidad se beneficie (libertad 3) El acceso al coacutedigo fuente es un prerrequisitopara esto
Debido a la evolucioacuten de la tecnologiacutea y del uso de la red estas libertades son ahoraauacuten maacutes importantes que en el pasadoLo que diferencia a Ubuntu de otros sistemas ofrecidos por Linux es que los equiposcomercial y comunitario colaboran juntos en el desarrollo de un uacutenico proyecto Lasnovedades y avances estaacuten libremente a disposicioacuten de todos los usuarios y sonvoluntarios quienes se hacen cargo de los elementos maacutes criacuteticos del trabajoEn la paacutegina web de Ubuntu 1 se puede obtener maacutes informacioacuten acerca del siste-ma y en la paacutegina web de GNU 2 se puede encontrar maacutes informacioacuten acerca delsoftware libre
Haskell literario con Emacs
Haskell es un lenguaje de programacioacuten puramente funcional basado en lambdacalculus 3 Se caracteriza por sus programas concisos un potente sistema de tiposel trabajo con listas funciones recursivas y de orden superior y por tener evaluacioacutenperezosaTener que escribir coacutedigos largos y complicados hace la tarea del programador muycostosa Los lenguajes de programacioacuten funcional como Haskell lo intentan hacenmaacutes sencillo Aunque no se esteacute en la posicioacuten de usar Haskell en un proyecto de-terminado aprender su razonamiento puede ayudar a mejorar en cualquier otrolenguajeA la hora de elaborar la memoria de un proyecto en el que se estaacute utilizando Haskellla posibilidad de escribir coacutedigo y texto en un formato de calidad otorga globali-dad al trabajo El editor Emacs de GNU permite en particular trabajar en paralelocon Haskell y con Latex El trabajar con Haskell literario ha ayudado a detectar ysolventar errores maacutes raacutepido asiacute como a dar una estructura consolidada al trabajo
1httpswwwubuntucom2httpswwwgnuorg3httpsenwikipediaorgwikiLambda_calculus
14 Iacutendice general
En la paacutegina web del Departamento de Computacioacuten 4 se puede encontrar maacutesinformacioacuten acerca de Haskell y Emacs
GitHub
GitHub es una plataforma de desarrollo colaborativo que permite alojar proyectosusando el control de versiones de Git El trabajo con un sistema como este hacemucho maacutes faacutecil el trabajo en grupo pues cada individuo puede trabajar desde suordenador propio en paralelo a los demaacutes y remotamente ir actualizando el proyectosin perder la posibilidad de restaurarlo a una versioacuten anteriorEn particular GitHub ha sido una excelente herramienta de control de este TrabajoFin de Grado pues los tutores han podido seguir en cada momento el trabajo rea-lizado detectar faacutecilmente los errores y hacer modificaciones directamente sobre eldocumentoEl compantildeero Eduardo Paluzo Hidalgo hace en su Trabajo Fin de Grado una pe-quentildea introduccioacuten al uso de Github y a la instalacioacuten de magit en una distribucioacutenUbuntu muy recomendable para todos aquellos (especialmente los maacutes principian-tes) que tengan intereacutes en trabajar con este sistemaSe puede encontrar maacutes informacioacuten acerca de esta plataforma en la paacutegina web deGit 5
DocTest
DocTest para Haskell es un programa de verificacioacuten dinaacutemica de ejemplos Si se si-gue un determinado formato a la hora de escribir los ejemplos para las funciones deun documento en Haskell Doctest se encarga de comprobar que los ejemplos seancorrectos Estas validaciones han resultado claves en la realizacioacuten del trabajo puesalgunas definiciones han sido modificadas de forma casi continua y este proyectoespecialmente se basa en lo anterior para poder seguir construyendoSu uso es muy sencillo una vez instalado el correspondiente paquete y escrito losejemplos en el formato requerido solo hay que ejecutar el programa desde la consoladando como argumento el fichero que se desea validarSe puede enontrar maacutes informaioacuten acerca del programa y de coacutemo descargarlo ensu repositorio de GitHub 6
4httpwwwcsuses~jalonsocursosi1m-16temastema-1html5httpsgit-scmcom6httpsgithubcomsoldoctest
Capiacutetulo 1
Conjuntos
El concepto de conjunto aparece en todos los campos de las Matemaacuteticas pero iquestqueacutedebe entenderse por eacutel La Teoriacutea de conjuntos fue introducida por Georg Cantor(1845-1917) desde 1869 Cantor ejercioacute como profesor en la Universidad de Halley entre 1879 y 1884 publicoacute una serie de seis artiacuteculos en el Mathematische Annalenen los que hizo una introduccioacuten baacutesica a la teoriacutea de conjuntos En su Beitraumlge zurBegruumlndung der transfiniten Mengenlehre Cantor dio la siguiente definicioacuten de con-junto
Figura 11 Fragmento del texto traducido al ingleacutes en el que Cantor da la definicioacuten de conjunto
laquoDebemos entender por ldquoconjuntordquo (Menge) cualquier coleccioacuten vista co-mo un todo (Zusammenfassung zu einem Ganzen) M de objetos separa-dos y bien definidos m de nuestra intuicioacuten o pensamiento Estos objetosson los ldquoelementosrdquo de Mraquo
Felix Hausdorff en 1914 dice laquoun conjunto es una reunioacuten de cosas que constitu-yen una totalidad es decir una nueva cosaraquo y antildeade laquoesto puede difiacutecilmente seruna definicioacuten pero sirve como demostracioacuten expresiva del concepto de conjunto atraveacutes de conjuntos sencillos como el conjunto de habitantes de una ciudad o el deaacutetomos de Hidroacutegeno del SolraquoUn conjunto asiacute definido no tiene que estar compuesto necesariamente de elementoshomogeacuteneos y ademaacutes da lugar a cuestiones filosoacuteficas como si podemos llamar
15
16 Capiacutetulo 1 Conjuntos
conjunto a aquel que no posee ninguacuten elemento Matemaacuteticamente conviene aceptarsolo elementos que compartan alguna propiedad y definir el conjunto vaciacuteo comoaquel que no tiene elemento algunoEl gran meacuterito de Cantor fue considerar conjuntos transfinitos (que tiene infinitoselementos) concepto inaudito hasta avanzado el siglo XIX hablar del cardinal de unconjunto como el nuacutemero de sus elementos y hablar de conjuntos equivalentes cuan-do puede establecerse una biyeccioacuten entre ellos ideas ya apuntadas por Bolzanoquien se centroacute demasiado en el aspecto filosoacutefico sin llegar a formalizar sus ideas
A lo largo de la seccioacuten haremos una pequentildea introduccioacuten a la Teoriacutea de Conjun-tos presentando formalmente sus conceptos maacutes importantes A la hora de elaborarel contenido se han utilizado los siguientes recursos bibliograacuteficosbull el primer tema de la asignatura ldquoAacutelgebra baacutesicardquo ([6])bull los temas de la asignatura ldquoInformaacuteticardquo ([1])bull el artiacuteculo de la Wikipedia ldquoSet (mathematics)rdquo ([10] ylowast el artiacuteculo ldquoEl regalo de Cantorrdquo ([5])
11 El TAD de los conjuntos
En la presente seccioacuten se definen las operaciones baacutesicas necesarias para trabajarcon conjuntos en un lenguaje funcional En nuestro caso el lenguaje que utilizare-mos seraacute Haskell Daremos la signatura del Tipo Abstracto de Dato (TAD) de losconjuntos y daremos algunos ejemplos de posibles representaciones de conjuntoscon las que podriacuteamos trabajarA continuacioacuten presentamos las operaciones definidas en el TAD de los conjuntos
vacio Conj a
inserta Eq a =gt a -gt Conj a -gt Conj a
elimina Eq a =gt a -gt Conj a -gt Conj a
pertenece Eq a =gt Conj a -gt a -gt Bool
esVacio Conj a -gt Bool
minimoElemento Ord a =gt Conj a -gt a
dondebull (vacio) es el conjunto vaciacuteobull (inserta x c) es el conjunto obtenido antildeadiendo el elemento x al conjunto cbull (elimina x c) es el conjunto obtenido eliminando el elemento x del conjunto cbull (pertenece x c) se verifica si x pertenece al conjunto cbull (esVacio c) se verifica si c no tiene ninguacuten elementobull (minimoElemento c) devuelve el miacutenimo elemento del conjunto c
12 Representaciones de conjuntos 17
Hemos de tener en cuenta que a la hora de crear un nuevo tipo de dato con el querepresentar a los conjuntos este debe ser compatible con la entidad matemaacutetica querepresenta
Estas son algunas de las posibles representaciones con las que podriacuteamos trabajarcon conjuntos en Haskellbull En primer lugar podemos trabajar con la libreriacutea DataSet en este caso la imple-
mentacioacuten del tipo de dato Set estaacute basado en aacuterboles binarios balanceadosbull Por otra parte podemos definir un nuevo tipo Cj xs con el que trabajar con con-
juntos como listas no ordenadas con duplicados como listas no ordenadas sinduplicados o como listas ordenadas sin duplicadosbull Otra opcioacuten seriacutea trabajar directamente con conjuntos como listas para ello de-
bemos ignorar las repeticiones y el orden con vista a la igualdad de conjuntosbull Los conjuntos que soacutelo contienen nuacutemeros (de tipo Int) entre 0 y nminus 1 se pueden
representar como nuacutemeros binarios con n bits donde el bit i(0 le i lt n) es 1 syssel nuacutemero i pertenece al conjunto
Nota 111 Las funciones que aparecen en la especificacioacuten del TAD no dependende la representacioacuten que elijamos
12 Representaciones de conjuntos
121 Conjuntos como listas ordenadas sin repeticioacuten
En el moacutedulo ConjuntosConListasOrdenadasSinRepeticion se definen las funcio-nes del TAD de los conjuntos dando su representacioacuten como listas ordenadas sinrepeticioacuten
module ConjuntosConListasOrdenadasSinRepeticion
( Conj
vacio
inserta
listaAConjunto
elimina
pertenece
esVacio
minimoElemento
sinRepetidos
esUnitario
esSubconjunto
conjuntosIguales
esSubconjuntoPropio
complementario
18 Capiacutetulo 1 Conjuntos
cardinal
unionConjuntos
unionGeneral
interseccion
productoCartesiano
combinaciones
variacionesR
) where
En las definiciones del presente moacutedulo se usaraacuten algunas funciones de la libreriacuteaDataList
Vamos a definir un nuevo tipo de dato (Conj a) que representa a los conjuntoscomo listas ordenadas sin repeticioacuten
type Conj a = [a]
Las funciones baacutesicas que definiremos a partir de este tipo coincidiraacuten con las indi-cadas en el TAD de los conjuntosbull (vacio) es el conjunto vaciacuteo
-- | Ejemplo
-- gtgtgt vacio
-- []
vacio Conj a
vacio = []
bull (inserta x c) es el conjunto obtenido antildeadiendo el elemento x al conjunto c
-- | Ejemplo
-- gtgtgt inserta 5 vacio
-- [5]
-- gtgtgt foldr inserta vacio [2211242]
-- [124]
inserta Ord a =gt a -gt Conj a -gt Conj a
inserta x [] = [x]
inserta x ys
| pertenece ys x = ys
| otherwise = insert x ys
bull (listaAConjunto xs) devuelve el conjunto cuyos elementos son los de la lista xs
-- | Ejemplo
-- gtgtgt listaAConjunto [2211242]
-- [124]
listaAConjunto Ord a =gt [a] -gt Conj a
listaAConjunto = sort nub
bull (esVacio c) se verifica si c es el conjunto vaciacuteo
12 Representaciones de conjuntos 19
-- | Ejemplos
-- gtgtgt esVacio (listaAConjunto [25137532190])
-- False
-- gtgtgt esVacio vacio
-- True
esVacio Conj a -gt Bool
esVacio = null
bull (pertenece x c) se verifica si x es un elemento del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt pertenece c1 3
-- True
-- gtgtgt pertenece c1 4
-- False
pertenece Ord a =gt Conj a -gt a -gt Bool
pertenece ys x =
x == head (dropWhile (ltx) ys)
bull (elimina x c) es el conjunto obtenido eliminando el elemento x del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt elimina 3 c1
-- [012579]
-- gtgtgt elimina 4 c1
-- [0123579]
elimina Ord a =gt a -gt Conj a -gt Conj a
elimina x ys = us ++ dropWhile (==x) vs
where (usvs) = span (ltx) ys
bull (minimoElemento c) devuelve el miacutenimo elemento del conjunto c
-- | Ejemplos
-- gtgtgt minimoElemento (listaAConjunto [25137532190])
-- 0
-- gtgtgt minimoElemento (listaAConjunto ([ae] ++ [AE]))
-- A
minimoElemento Ord a =gt Conj a -gt a
minimoElemento = head
122 Definicioacuten de conjunto
Nota 121 Al trabajar con la representacioacuten de conjuntos como listas en Haskellhemos de cuidar que los ejemplos con los que trabajemos no tengan elementos re-petidos La funcioacuten (sinRepetidos xs) se verifica si la lista xs no tiene ninguacuten ele-mento repetido
20 Capiacutetulo 1 Conjuntos
-- | Ejemplos
-- gtgtgt sinRepetidos []
-- True
-- gtgtgt sinRepetidos [1231]
-- False
sinRepetidos Eq a =gt [a] -gt Bool
sinRepetidos xs = nub xs == xs
Los conjuntos pueden definirse de manera expliacutecita citando todos sus elementosentre llaves de manera impliacutecita dando una o varias caracteriacutesticas que determi-nen si un objeto dado estaacute o no en el conjunto Por ejemplo los conjuntos 1 2 3 4y x isinN|1 le x le 4 son el mismo definido de forma explicita e impliacutecita respecti-vamente
Nota 122 La definicioacuten impliacutecita es necesaria cuando el conjunto en cuestioacuten tieneuna cantidad infinita de elementos En general los conjuntos se notaraacuten con letrasmayuacutesculas A B y los elementos con letras minuacutesculas a b
Cuando trabajamos con conjuntos concretos siempre existe un contexto donde esosconjuntos existen Por ejemplo si A = minus1 1 2 3 4 5 y B = x|x isin Nes par elcontexto donde podemos considerar A y B es el conjunto de los nuacutemeros enterosZ En general a este conjunto se le denomina conjunto universal De una forma algomaacutes precisa podemos dar la siguiente definicioacuten
Definicioacuten 121 El conjunto universal que notaremos por U es un conjunto del queson subconjuntos todos los posibles conjuntos que originan el problema que tratamos
123 Subconjuntos
Definicioacuten 122 Dados dos conjuntos A y B si todo elemento de A es a su vez elementode B diremos que A es un subconjunto de B y lo notaremos A sube B En caso contrario senotaraacute A 6sube B
La funcioacuten (esSubconjunto c1 c2) se verifica si c1 es un subconjunto de c2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
-- gtgtgt c1 `esSubconjunto` c2
-- True
-- gtgtgt c1 `esSubconjunto` vacio
-- False
-- gtgtgt vacio `esSubconjunto` c2
12 Representaciones de conjuntos 21
-- True
-- gtgtgt c3 `esSubconjunto` c4
-- True
-- gtgtgt c2 `esSubconjunto` c1
-- False
esSubconjunto Ord a =gt Conj a -gt Conj a -gt Bool
esSubconjunto [] _ = True
esSubconjunto (xxs) ys =
x == head vs ampamp esSubconjunto xs (tail vs)
where (usvs) = span (ltx) ys
124 Igualdad de conjuntos
Definicioacuten 123 Dados dos conjuntos A y B diremos que son iguales si tienen los mismoselementos es decir si se verifica que A sube B y B sube A Lo notaremos A = B
La funcioacuten (conjuntosIguales c1 c2) se verifica si los conjuntos xs y ys son igua-les
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
-- gtgtgt let c5 = listaAConjunto [4444442]
-- gtgtgt conjuntosIguales c1 c2
-- False
-- gtgtgt conjuntosIguales c3 c4
-- True
-- gtgtgt conjuntosIguales c1 c5
-- True
conjuntosIguales Ord a =gt Conj a -gt Conj a -gt Bool
conjuntosIguales = (==)
125 Subconjuntos propios
Definicioacuten 124 Los subconjuntos de A distintos del empty y del mismo A se denominansubconjuntos propios de A
La funcioacuten (esSubconjuntoPropio c1 c2) se verifica si c1 es un subconjunto pro-pio de c2
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt esSubconjuntoPropio u u
22 Capiacutetulo 1 Conjuntos
-- False
-- gtgtgt esSubconjuntoPropio c1 u
-- True
esSubconjuntoPropio Ord a =gt Conj a -gt Conj a -gt Bool
esSubconjuntoPropio c1 c2 =
not (null c1) ampamp esSubconjunto c1 c2 ampamp c1 = c2
126 Complementario de un conjunto
Definicioacuten 125 Dado un conjunto A se define el complementario de A que notaremospor A como
A = x|x isin U x 6isin A
La funcioacuten (complementario u c) devuelve el complementario del conjunto c y enel universo u
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt let c2 = listaAConjunto [14689]
-- gtgtgt complementario u c1
-- [14689]
-- gtgtgt complementario u u
-- []
-- gtgtgt complementario u vacio
-- [123456789]
-- gtgtgt complementario u c2
-- [2357]
complementario Ord a =gt Conj a -gt Conj a -gt Conj a
complementario [] _ = []
complementario xs [] = xs
complementario (xxs) (yys)
| x lt y = x complementario xs (yys)
| otherwise = complementario xs ys
127 Cardinal de un conjunto
Definicioacuten 126 Dado un conjunto finito A denominaremos cardinal de A al nuacutemero deelementos que tiene y lo notaremos |A|
La funcioacuten (cardinal xs) devuelve el cardinal del conjunto xs
-- | Ejemplos
-- gtgtgt cardinal vacio
-- 0
-- gtgtgt cardinal (listaAConjunto [110])
12 Representaciones de conjuntos 23
-- 10
-- gtgtgt cardinal (listaAConjunto chocolate)
-- 7
cardinal Ord a =gt Conj a -gt Int
cardinal = length
128 Conjunto unitario
Definicioacuten 127 Un conjunto con un uacutenico elemento se denomina unitario
Nota 123 Notemos que si X = x es un conjunto unitario debemos distinguirentre el conjunto X y el elemento x
La funcioacuten (esUnitario c) se verifica si el conjunto c es unitario
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto (take 10 (repeat 5))
-- gtgtgt let c2 = listaAConjunto valverde
-- gtgtgt let c3 = listaAConjunto coco
-- gtgtgt esUnitario c1
-- True
-- gtgtgt esUnitario c2
-- False
-- gtgtgt esUnitario c2
-- False
esUnitario Ord a =gt Conj a -gt Bool
esUnitario c =
c == take 1 c
129 Unioacuten de conjuntos
Definicioacuten 128 Dados dos conjuntos A y B se define la unioacuten de A y B notado A cup Bcomo el conjunto formado por aquellos elementos que pertenecen al menos a uno de los dosconjuntos A oacute B es decir
A cup B = x | x isin A or x isin B
La funcioacuten (unionConjuntos c1 c2) devuelve la unioacuten de los conjuntos xs y ys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [139]
-- gtgtgt let c2 = listaAConjunto [249]
-- gtgtgt unionConjuntos c1 c2
-- [123456789]
unionConjuntos Ord a =gt Conj a -gt Conj a -gt Conj a
unionConjuntos [] [] = []
24 Capiacutetulo 1 Conjuntos
unionConjuntos [] ys = ys
unionConjuntos xs [] = xs
unionConjuntos (xxs) (yys)
| x lt y = x unionConjuntos xs (yys)
| x == y = x unionConjuntos xs ys
| otherwise = y unionConjuntos (xxs) ys
Definicioacuten 129 Dada una familia de conjuntos Ai con i isin I se define la unioacuten ge-neral de los conjuntos Ai notado
⋃iisinI Ai como el conjunto formado por aquellos elementos
que pertenecen al menos a uno de los conjuntos de la familia es decir
⋃iisinI
Ai = x | x isin Ai foralli isin I
La funcioacuten (unionGeneral xss) devuelve la unioacuten general de la familia de conjun-tos de la lista xss
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1415]
-- gtgtgt let c2 = listaAConjunto [2515]
-- gtgtgt let c3 = listaAConjunto [3615]
-- gtgtgt unionGeneral [c1c2c3]
-- [123456789101112131415]
unionGeneral Ord a =gt [Conj a] -gt Conj a
unionGeneral = foldr unionConjuntos vacio
1210 Interseccioacuten de conjuntos
Definicioacuten 1210 Dados dos conjuntos A y B se define la interseccioacuten de A y B notadoA cap B como el conjunto formado por aquellos elementos que pertenecen a cada uno de losdos conjuntos A y B es decir
A cap B = x | x isin A and x isin B
La funcioacuten (interseccion c1 c2) devuelve la interseccioacuten de los conjuntos c1 yc2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1320]
-- gtgtgt let c2 = listaAConjunto [2420]
-- gtgtgt let c3 = listaAConjunto [2430]
-- gtgtgt let c4 = listaAConjunto [4830]
-- gtgtgt interseccion c1 c2
-- []
-- gtgtgt interseccion c3 c4
12 Representaciones de conjuntos 25
-- [481216202428]
interseccion Ord a =gt Conj a -gt Conj a -gt Conj a
interseccion (xxs) (yys)
| x lt y = interseccion xs (yys)
| x gt y = interseccion (xxs) ys
| otherwise = x interseccion xs ys
interseccion _ _ = []
1211 Producto cartesiano
Definicioacuten 1211 El producto cartesiano 1 de dos conjuntos A y B es una operacioacutensobre ellos que resulta en un nuevo conjunto Atimes B que contiene a todos los pares ordenadostales que la primera componente pertenece a A y la segunda pertenece a B es decir
Atimes B = (a b) | a isin A b isin B
La funcioacuten (productoCartesiano c1 c2) devuelve el producto cartesiano de xs eys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [31]
-- gtgtgt let c2 = listaAConjunto [247]
-- gtgtgt productoCartesiano c1 c2
-- [(12)(14)(17)(32)(34)(37)]
-- gtgtgt productoCartesiano c2 c1
-- [(21)(23)(41)(43)(71)(73)]
productoCartesiano (Ord a Ord b) =gt Conj a -gt Conj b -gt Conj (ab)
productoCartesiano xs ys=
listaAConjunto [(xy) | x lt- xs y lt- ys]
1212 Combinaciones
Definicioacuten 1212 Las combinaciones de un conjunto S tomados en grupos de n son todoslos subconjuntos de S con n elementos
La funcioacuten (combinaciones n xs) devuelve las combinaciones de los elementos dexs en listas de n elementos
-- | Ejemplos
-- gtgtgt combinaciones 3 [ad]
-- [abcabdacdbcd]
-- gtgtgt combinaciones 2 [248]
-- [[24][26][28][46][48][68]]
1httpsenwikipediaorgwikiCartesian_product
26 Capiacutetulo 1 Conjuntos
combinaciones Integer -gt [a] -gt [[a]]
combinaciones 0 _ = [[]]
combinaciones _ [] = []
combinaciones k (xxs) =
[xys | ys lt- combinaciones (k-1) xs] ++ combinaciones k xs
1213 Variaciones con repeticioacuten
Definicioacuten 1213 Las variaciones con repeticioacuten de m elementos tomados en grupos den es el nuacutemero de diferentes nndashtuplas de un conjunto de m elementos
La funcioacuten (variacionesR n xs) devuelve las variaciones con con repeticioacuten de loselementos de xs en listas de n elementos
-- | Ejemplos
-- gtgtgt variacionesR 3 [ab]
-- [aaaaababaabbbaababbbabbb]
-- gtgtgt variacionesR 2 [235]
-- [[22][23][25][32][33][35][52][53][55]]
variacionesR Int -gt [a] -gt [[a]]
variacionesR _ [] = [[]]
variacionesR 0 _ = [[]]
variacionesR k us =
[uvs | u lt- us vs lt- variacionesR (k-1) us]
1214 Conjuntos como listas sin repeticioacuten
En el moacutedulo ConjuntosConListas se definen las funciones del TAD de los conjun-tos dando su representacioacuten como listas sin elementos repetidos
module ConjuntosConListas
( Conj
vacio
inserta
listaAConjunto
elimina
pertenece
esVacio
minimoElemento
sinRepetidos
esUnitario
esSubconjunto
conjuntosIguales
esSubconjuntoPropio
complementario
cardinal
12 Representaciones de conjuntos 27
unionConjuntos
unionGeneral
interseccion
productoCartesiano
combinaciones
variacionesR
) where
En las definiciones del presente moacutedulo se usaraacuten algunas funciones de la libreriacuteaDataList
Vamos a definir un nuevo tipo de dato (Conj a) que representa a los conjuntoscomo listas sin elementos repetidos
type Conj a = [a]
Las funciones baacutesicas que definiremos a partir de este tipo coincidiraacuten con las indi-cadas en el TAD de los conjuntosbull (vacio) es el conjunto vaciacuteo
-- | Ejemplo
-- gtgtgt vacio
-- []
vacio Conj a
vacio = []
bull (inserta x c) es el conjunto obtenido antildeadiendo el elemento x al conjunto c
-- | Ejemplo
-- gtgtgt inserta 5 vacio
-- [5]
-- gtgtgt foldr inserta vacio [2211242]
-- [142]
inserta Eq a =gt a -gt Conj a -gt Conj a
inserta x [] = [x]
inserta x ys | elem x ys = ys
| otherwise = xys
bull (listaAConjunto xs) devuelve el conjunto cuyos elementos son los de la lista xs
-- | Ejemplo
-- gtgtgt listaAConjunto [2211242]
-- [214]
listaAConjunto Eq a =gt [a] -gt Conj a
listaAConjunto = nub
bull (esVacio c) se verifica si c es el conjunto vaciacuteo
-- | Ejemplos
-- gtgtgt esVacio (listaAConjunto [25137532190])
-- False
28 Capiacutetulo 1 Conjuntos
-- gtgtgt esVacio vacio
-- True
esVacio Conj a -gt Bool
esVacio = null
bull (pertenece x c) se verifica si x es un elemento del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt pertenece 3 c1
-- True
-- gtgtgt pertenece 4 c1
-- False
pertenece Eq a =gt a -gt Conj a -gt Bool
pertenece = elem
bull (elimina x c) es el conjunto obtenido eliminando el elemento x del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt elimina 3 c1
-- [251790]
-- gtgtgt elimina 4 c1
-- [2513790]
elimina Eq a =gt a -gt Conj a -gt Conj a
elimina = delete
bull (minimoElemento c) devuelve el miacutenimo elemento del conjunto c
-- | Ejemplos
-- gtgtgt minimoElemento (listaAConjunto [25137532190])
-- 0
-- gtgtgt minimoElemento (listaAConjunto ([ae] ++ [AE]))
-- A
minimoElemento Ord a =gt Conj a -gt a
minimoElemento = minimum
1215 Definicioacuten de conjunto
Definicioacuten 1214 Llamaremos conjunto a una coleccioacuten de objetos que llamaremos ele-mentos distintos entre siacute y que comparten una propiedad Para que un conjunto esteacute biendefinido debe ser posible discernir si un objeto arbitrario estaacute o no en eacutel
Si el elemento a pertenece al conjunto A escribiremos a isin A En caso contrarioescribiremos a 6isin A
Nota 124 En Haskell para poder discernir si un objeto arbitrario pertenece a unconjunto se necesita que su tipo pertenezca a la clase Eq
12 Representaciones de conjuntos 29
Nota 125 Al trabajar con la representacioacuten de conjuntos como listas en Haskellhemos de cuidar que los ejemplos con los que trabajemos no tengan elementos re-petidos La funcioacuten (sinRepetidos xs) se verifica si la lista xs no tiene ninguacuten ele-mento repetido
-- | Ejemplos
-- gtgtgt sinRepetidos []
-- True
-- gtgtgt sinRepetidos [1231]
-- False
sinRepetidos Eq a =gt [a] -gt Bool
sinRepetidos xs = nub xs == xs
Los conjuntos pueden definirse de manera expliacutecita citando todos sus elementosentre llaves de manera impliacutecita dando una o varias caracteriacutesticas que determi-nen si un objeto dado estaacute o no en el conjunto Por ejemplo los conjuntos 1 2 3 4y x isinN|1 le x le 4 son el mismo definido de forma explicita e impliacutecita respecti-vamente
Nota 126 La definicioacuten impliacutecita es necesaria cuando el conjunto en cuestioacuten tieneuna cantidad infinita de elementos En general los conjuntos se notaraacuten con letrasmayuacutesculas A B y los elementos con letras minuacutesculas a b
Cuando trabajamos con conjuntos concretos siempre existe un contexto donde esosconjuntos existen Por ejemplo si A = minus1 1 2 3 4 5 y B = x|x isin Nes par elcontexto donde podemos considerar A y B es el conjunto de los nuacutemeros enterosZ En general a este conjunto se le denomina conjunto universal De una forma algomaacutes precisa podemos dar la siguiente definicioacuten
Definicioacuten 1215 El conjunto universal que notaremos por U es un conjunto del queson subconjuntos todos los posibles conjuntos que originan el problema que tratamos
1216 Subconjuntos
Definicioacuten 1216 Dados dos conjuntos A y B si todo elemento de A es a su vez elementode B diremos que A es un subconjunto de B y lo notaremos A sube B En caso contrario senotaraacute A 6sube B
La funcioacuten (esSubconjunto c1 c2) se verifica si c1 es un subconjunto de c2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
30 Capiacutetulo 1 Conjuntos
-- gtgtgt c1 `esSubconjunto` c2
-- True
-- gtgtgt c1 `esSubconjunto` vacio
-- False
-- gtgtgt vacio `esSubconjunto` c2
-- True
-- gtgtgt c3 `esSubconjunto` c4
-- True
-- gtgtgt c2 `esSubconjunto` c1
-- False
esSubconjunto Eq a =gt [a] -gt [a] -gt Bool
esSubconjunto c1 c2 = all (`elem` c2) c1
1217 Igualdad de conjuntos
Definicioacuten 1217 Dados dos conjuntos A y B diremos que son iguales si tienen losmismos elementos es decir si se verifica que A sube B y B sube A Lo notaremos A = B
La funcioacuten (conjuntosIguales c1 c2) se verifica si los conjuntos xs y ys son igua-les
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
-- gtgtgt let c5 = listaAConjunto [4444442]
-- gtgtgt conjuntosIguales c1 c2
-- False
-- gtgtgt conjuntosIguales c3 c4
-- True
-- gtgtgt conjuntosIguales c1 c5
-- True
conjuntosIguales Eq a =gt [a] -gt [a] -gt Bool
conjuntosIguales c1 c2 =
esSubconjunto c1 c2 ampamp esSubconjunto c2 c1
1218 Subconjuntos propios
Definicioacuten 1218 Los subconjuntos de A distintos del empty y del mismo A se denominansubconjuntos propios de A
La funcioacuten (esSubconjuntoPropio c1 c2) se verifica si c1 es un subconjunto pro-pio de c2
12 Representaciones de conjuntos 31
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt esSubconjuntoPropio u u
-- False
-- gtgtgt esSubconjuntoPropio c1 u
-- True
esSubconjuntoPropio Eq a =gt [a] -gt [a] -gt Bool
esSubconjuntoPropio c1 c2
| null c1 = False
| conjuntosIguales c1 c2 = False
| otherwise = esSubconjunto c1 c2
1219 Complementario de un conjunto
Definicioacuten 1219 Dado un conjunto A se define el complementario de A que notaremospor A como
A = x|x isin U x 6isin A
La funcioacuten (complementario u c) devuelve el complementario del conjunto c y enel universo u
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt let c2 = listaAConjunto [14689]
-- gtgtgt complementario u c1
-- [14689]
-- gtgtgt complementario u u
-- []
-- gtgtgt complementario u vacio
-- [123456789]
-- gtgtgt complementario u c2
-- [2357]
complementario Eq a =gt [a] -gt [a] -gt [a]
complementario = ()
1220 Cardinal de un conjunto
Definicioacuten 1220 Dado un conjunto finito A denominaremos cardinal de A al nuacutemerode elementos que tiene y lo notaremos |A|
La funcioacuten (cardinal xs) devuelve el cardinal del conjunto xs
32 Capiacutetulo 1 Conjuntos
-- | Ejemplos
-- gtgtgt cardinal vacio
-- 0
-- gtgtgt cardinal (listaAConjunto [110])
-- 10
-- gtgtgt cardinal (listaAConjunto chocolate)
-- 7
cardinal [a] -gt Int
cardinal = length
1221 Conjunto unitario
Definicioacuten 1221 Un conjunto con un uacutenico elemento se denomina unitario
Nota 127 Notemos que si X = x es un conjunto unitario debemos distinguirentre el conjunto X y el elemento x
La funcioacuten (esUnitario c) se verifica si el conjunto c es unitario
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto (take 10 (repeat 5))
-- gtgtgt let c2 = listaAConjunto valverde
-- gtgtgt let c3 = listaAConjunto coco
-- gtgtgt esUnitario c1
-- True
-- gtgtgt esUnitario c2
-- False
-- gtgtgt esUnitario c2
-- False
esUnitario Eq a =gt [a] -gt Bool
esUnitario c = c == take 1 c
1222 Unioacuten de conjuntos
Definicioacuten 1222 Dados dos conjuntos A y B se define la unioacuten de A y B notado A cup Bcomo el conjunto formado por aquellos elementos que pertenecen al menos a uno de los dosconjuntos A oacute B es decir
A cup B = x | x isin A or x isin B
La funcioacuten (unionConjuntos c1 c2) devuelve la unioacuten de los conjuntos xs y ys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [139]
-- gtgtgt let c2 = listaAConjunto [249]
12 Representaciones de conjuntos 33
-- gtgtgt unionConjuntos c1 c2
-- [135792468]
unionConjuntos Eq a =gt [a] -gt [a] -gt [a]
unionConjuntos = union
Definicioacuten 1223 Dada una familia de conjuntos Ai con i isin I se define la unioacuten ge-neral de los conjuntos Ai notado
⋃iisinI Ai como el conjunto formado por aquellos elementos
que pertenecen al menos a uno de los conjuntos de la familia es decir
⋃iisinI
Ai = x | x isin Ai foralli isin I
La funcioacuten (unionGeneral xss) devuelve la unioacuten general de la familia de conjun-tos de la lista xss
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1415]
-- gtgtgt let c2 = listaAConjunto [2515]
-- gtgtgt let c3 = listaAConjunto [3615]
-- gtgtgt unionGeneral [c1c2c3]
-- [147101325811143691215]
unionGeneral Eq a =gt [[a]] -gt [a]
unionGeneral = foldr unionConjuntos []
1223 Interseccioacuten de conjuntos
Definicioacuten 1224 Dados dos conjuntos A y B se define la interseccioacuten de A y B notadoA cap B como el conjunto formado por aquellos elementos que pertenecen a cada uno de losdos conjuntos A y B es decir
A cap B = x | x isin A and x isin B
La funcioacuten (interseccion c1 c2) devuelve la interseccioacuten de los conjuntos c1 yc2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1320]
-- gtgtgt let c2 = listaAConjunto [2420]
-- gtgtgt let c3 = listaAConjunto [2430]
-- gtgtgt let c4 = listaAConjunto [4830]
-- gtgtgt interseccion c1 c2
-- []
-- gtgtgt interseccion c3 c4
-- [481216202428]
34 Capiacutetulo 1 Conjuntos
interseccion Eq a =gt [a] -gt [a] -gt [a]
interseccion = intersect
1224 Producto cartesiano
Definicioacuten 1225 El producto cartesiano 2 de dos conjuntos A y B es una operacioacutensobre ellos que resulta en un nuevo conjunto Atimes B que contiene a todos los pares ordenadostales que la primera componente pertenece a A y la segunda pertenece a B es decir
Atimes B = (a b) | a isin A b isin B
La funcioacuten (productoCartesiano c1 c2) devuelve el producto cartesiano de xs eys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [31]
-- gtgtgt let c2 = listaAConjunto [247]
-- gtgtgt productoCartesiano c1 c2
-- [(32)(34)(37)(12)(14)(17)]
-- gtgtgt productoCartesiano c2 c1
-- [(23)(21)(43)(41)(73)(71)]
productoCartesiano [a] -gt [b] -gt [(ab)]
productoCartesiano xs ys = [ (xy) | x lt- xs y lt- ys]
1225 Combinaciones
Definicioacuten 1226 Las combinaciones de un conjunto S tomados en grupos de n son todoslos subconjuntos de S con n elementos
La funcioacuten (combinaciones n xs) devuelve las combinaciones de los elementos dexs en listas de n elementos
-- | Ejemplos
-- gtgtgt combinaciones 3 [ad]
-- [abcabdacdbcd]
-- gtgtgt combinaciones 2 [248]
-- [[24][26][28][46][48][68]]
combinaciones Integer -gt [a] -gt [[a]]
combinaciones 0 _ = [[]]
combinaciones _ [] = []
combinaciones k (xxs) =
[xys | ys lt- combinaciones (k-1) xs] ++ combinaciones k xs
2httpsenwikipediaorgwikiCartesian_product
13 Eleccioacuten de la representacioacuten de conjuntos 35
1226 Variaciones con repeticioacuten
Definicioacuten 1227 Las variaciones con repeticioacuten de m elementos tomados en grupos den es el nuacutemero de diferentes nndashtuplas de un conjunto de m elementos
La funcioacuten (variacionesR n xs) devuelve las variaciones con con repeticioacuten de loselementos de xs en listas de n elementos
-- | Ejemplos
-- gtgtgt variacionesR 3 [ab]
-- [aaaaababaabbbaababbbabbb]
-- gtgtgt variacionesR 2 [235]
-- [[22][23][25][32][33][35][52][53][55]]
variacionesR Int -gt [a] -gt [[a]]
variacionesR _ [] = [[]]
variacionesR 0 _ = [[]]
variacionesR k us =
[uvs | u lt- us vs lt- variacionesR (k-1) us]
13 Eleccioacuten de la representacioacuten de conjuntos
Nota 131 En el moacutedulo Conjuntos se elige la representacioacuten de conjunto con la quese trabajaraacute
-- Seleccionar para trabajar con los conjuntos como listas sin
-- elementos repetidos
module Conjuntos
(module ConjuntosConListas)
where
import ConjuntosConListas
-- Seleccionar para trabajar con los conjuntos como listas ordenadas
-- sin elementos repetidos
-- module Conjuntos
-- (module ConjuntosConListasOrdenadasSinRepeticion)
-- where
-- import ConjuntosConListasOrdenadasSinRepeticion
36 Capiacutetulo 1 Conjuntos
Capiacutetulo 2
Relaciones y funciones
21 Relaciones
Las relaciones que existen entre personas nuacutemeros conjuntos y muchas otras enti-dades pueden formalizarse en la idea de relacioacuten binaria En esta seccioacuten se define ydesarrolla este concepto particularizando en el caso de las relaciones homogeacuteneasy en el de las funciones
211 Relacioacuten binaria
Definicioacuten 211 Una relacioacuten binaria 1 (o correspondencia) entre dos conjuntos A yB es un subconjunto del producto cartesiano Atimes B
La funcioacuten (esRelacion xs ys r) se verifica si r es una relacioacuten binaria de xs enys Por ejemplo
-- | Ejemplos
-- gtgtgt esRelacion [31] [247] [(12)(34)]
-- True
-- gtgtgt esRelacion [31] [247] [(12)(31)]
-- False
esRelacion (Ord a Ord b) =gt [a] -gt [b] -gt [(ab)] -gt Bool
esRelacion xs ys r =
r `esSubconjunto` productoCartesiano xs ys
212 Imagen por una relacioacuten
Definicioacuten 212 Si R es una relacioacuten binaria la imagen del elemento x en la relacioacuten Res el conjunto de los valores correspondientes a x en R
1httpsenwikipediaorgwikiBinary_relation
37
38 Capiacutetulo 2 Relaciones y funciones
La funcioacuten (imagenRelacion r x) es la imagen de x en la relacioacuten r
-- | Ejemplos
-- gtgtgt imagenRelacion [(13)(25)(14)] 1
-- [34]
-- gtgtgt imagenRelacion [(13)(25)(14)] 2
-- [5]
-- gtgtgt imagenRelacion [(13)(25)(14)] 3
-- []
imagenRelacion (Ord a Ord b) =gt [(ab)] -gt a -gt [b]
imagenRelacion r x =
nub [y | (zy) lt- r z == x]
213 Dominio de una relacioacuten
Definicioacuten 213 Dada una relacioacuten binaria R su dominio es el conjunto que contiene atodos los valores que se toman en la relacioacuten R
La funcioacuten (dominio r) devuelve el dominio de la relacioacuten r
-- | Ejemplo
-- gtgtgt dominio [(32)(51)(34)]
-- [35]
dominio Ord a =gt [(ab)] -gt [a]
dominio r = listaAConjunto (map fst r)
214 Rango de una relacioacuten
Definicioacuten 214 El rango de una relacioacuten binaria R es el conjunto de las imaacutegenes demediante R
La funcioacuten (rango r) devuelve el rango de la relacioacuten binaria r
-- | Ejemplo
-- gtgtgt rango [(32)(52)(34)]
-- [24]
rango Ord b =gt [(ab)] -gt [b]
rango r = listaAConjunto (map snd r)
215 Antiimagen por una relacioacuten
Definicioacuten 215 La antiimagen del elemento y por una relacioacuten r es el conjunto de loselementos cuya imagen es y
La (antiImagenRelacion r y) es la antiimagen del elemento y en la relacioacuten bina-ria r
22 Relaciones homogeacuteneas 39
-- | Ejemplo
-- gtgtgt antiImagenRelacion [(13)(23)(74)] 3
-- [12]
antiImagenRelacion (Ord a Ord b) =gt [(ab)] -gt b -gt [a]
antiImagenRelacion r y =
nub [x | (xz) lt- r z == y]
216 Relacioacuten funcional
Definicioacuten 216 Dada una relacioacuten binaria R se dice funcional si todos los elementos desu dominio tienen una uacutenica imagen en R
La funcioacuten (esFuncional r) se verifica si la relacioacuten r es funcional
-- | Ejemplos
-- gtgtgt esFuncional [(32)(51)(79)]
-- True
-- gtgtgt esFuncional [(32)(51)(34)]
-- False
-- gtgtgt esFuncional [(32)(51)(32)]
-- True
esFuncional (Ord a Ord b) =gt [(ab)] -gt Bool
esFuncional r =
and [esUnitario (imagenRelacion r x) | x lt- dominio r]
22 Relaciones homogeacuteneas
Para elaborar la presente seccioacuten se han consultado los apuntes de ldquoAacutelgebra baacutesicardquo([6]) asignatura del primer curso del Grado en Matemaacuteticas
Definicioacuten 221 Una relacioacuten binaria entre dos conjuntos A y B se dice que es homogeacute-nea si los conjuntos son iguales es decir si A = B Si el par (x y) isin AA estaacute en la relacioacutenhomogeacutenea R diremos que x estaacute Rndashrelacionado con y o relacionado con y por R Esto senotaraacute frecuentemente xRy (noacutetese que el orden es importante)
La funcioacuten (esRelacionHomogenea xs r) se verifica si r es una relacioacuten binaria ho-mogeacutenea en el conjunto xs
-- | Ejemplos
-- gtgtgt esRelacionHomogenea [14] [(12)(24)(34)(41)]
-- True
-- gtgtgt esRelacionHomogenea [14] [(12)(25)(34)(41)]
-- False
-- gtgtgt esRelacionHomogenea [14] [(12)(34)(41)]
40 Capiacutetulo 2 Relaciones y funciones
-- True
esRelacionHomogenea Ord a =gt [a] -gt [(aa)] -gt Bool
esRelacionHomogenea xs = esRelacion xs xs
Nota 221 El segundo argumento que recibe la funcioacuten ha de ser una lista de parescon ambas componentes del mismo tipo
La funcioacuten (estaRelacionado r x y) se verifica si x estaacute relacionado con y en larelacioacuten homogeacutenea r
-- | Ejemplos
-- gtgtgt estaRelacionado [(13)(25)(46)] 2 5
-- True
-- gtgtgt estaRelacionado [(13)(25)(46)] 2 3
-- False
estaRelacionado Ord a =gt [(aa)] -gt a -gt a -gt Bool
estaRelacionado r x y = (xy) `elem` r
221 Relaciones reflexivas
Definicioacuten 222 Sea R una relacioacuten binaria homogeacutenea en el conjunto A Diremos que Res reflexiva cuando todos los elementos de A estaacuten relacionados por R consigo mismos esdecir cuando forallx isin A se tiene que xRx
La funcioacuten (esReflexiva xs r) se verifica si la relacioacuten r en xs es reflexiva
-- | Ejemplos
-- gtgtgt esReflexiva [12] [(11)(12)(22)]
-- True
-- gtgtgt esReflexiva [12] [(11)(12)]
-- False
esReflexiva Ord a =gt [a] -gt [(aa)] -gt Bool
esReflexiva xs r = zip xs xs `esSubconjunto` r
Nota 222 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xSylarrrarr xminus y es parbull xTylarrrarr x divide a yson relaciones binarias homogeacuteneas reflexivas
222 Relaciones simeacutetricas
Definicioacuten 223 Diremos que una relacioacuten homogeacutenea R es simeacutetrica cuando
forall(x y) isin R minusrarr (y x) isin R
22 Relaciones homogeacuteneas 41
La funcioacuten (esSimetrica r) se verifica si la relacioacuten r es simeacutetrica
-- | Ejemplos
-- gtgtgt esSimetrica [(11)(12)(21)]
-- True
-- gtgtgt esSimetrica [(11)(12)(22)]
-- False
esSimetrica Ord a =gt [(aa)] -gt Bool
esSimetrica r =
listaAConjunto [(yx) | (xy) lt- r] `esSubconjunto` r
Nota 223 En el conjunto N la relacioacuten caracterizada por xSy larrrarr xminus y es par esuna relacioacuten binaria homogeacutenea simeacutetrica
223 Relaciones antisimeacutetricas
Definicioacuten 224 Sea R una relacioacuten binaria homogeacutenea en el conjunto A Diremos que Res antisimeacutetrica cuando
forall(x y)[(x y) isin R and (y x) isin R minusrarr x = y
La funcioacuten (esAntisimetrica r) se verifica si la relacioacuten r es antisimeacutetrica
-- | Ejemplos
-- gtgtgt esAntisimetrica [(12)(31)]
-- True
-- gtgtgt esAntisimetrica [(12)(21)]
-- False
esAntisimetrica Ord a =gt [(aa)] -gt Bool
esAntisimetrica r =
and [x == y | (xy) lt- r (yx) `elem` r]
Nota 224 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xTylarrrarr x divide a ybull xRylarrrarr x lt yson relaciones binarias homogeacuteneas antisimeacutetricas
224 Relaciones transitivas
Definicioacuten 225 Sea R una relacioacuten binaria homogeacutenea en el conjunto A Diremos que Res transitiva cuando forall(x y) (y z) isin R se tiene que xRy e yRz minusrarr xRz
La funcioacuten (esTransitiva r) se verifica si la relacioacuten r es transitiva
42 Capiacutetulo 2 Relaciones y funciones
-- | Ejemplos
-- gtgtgt esTransitiva [(12)(13)(23)]
-- True
-- gtgtgt esTransitiva [(12)(23)]
-- False
esTransitiva Ord a =gt [(aa)] -gt Bool
esTransitiva r =
listaAConjunto [(xz) | (xy) lt- r (wz) lt- r y == w]
`esSubconjunto` r
Nota 225 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xSylarrrarr xminus y es parbull xTylarrrarr x divide a ybull xRylarrrarr x lt yson relaciones binarias homogeacuteneas transitivas
225 Relaciones de equivalencia
Definicioacuten 226 Las relaciones homogeacuteneas que son a la vez reflexivas simeacutetricas y tran-sitivas se denominan relaciones de equivalencia
La funcioacuten (esRelacionEquivalencia xs r) se verifica si r es una relacioacuten de equi-valencia en xs-- | Ejemplos
-- gtgtgt esRelacionEquivalencia [13] [(11)(12)(21)(22)(33)]
-- True
-- gtgtgt esRelacionEquivalencia [13] [(12)(21)(22)(33)]
-- False
-- gtgtgt esRelacionEquivalencia [13] [(11)(12)(22)(33)]
-- False
esRelacionEquivalencia Ord a =gt [a] -gt [(aa)] -gt Bool
esRelacionEquivalencia xs r =
esReflexiva xs r ampamp
esSimetrica r ampamp
esTransitiva r
Nota 226 En el conjunto N la relacioacuten caracterizada por xSy larrrarr xminus y es par esuna relacioacuten de equivalencia
226 Relaciones de orden
Definicioacuten 227 Las relaciones homogeacuteneas que son a la vez reflexivas antisimeacutetricas ytransitivas se denominan relaciones de orden
23 Funciones 43
La funcioacuten (esRelacionOrden xs r) se verifica si r es una relacioacuten de orden en xs
-- | Ejemplo
-- gtgtgt esRelacionOrden [13] [(11)(12)(13)(22)(23)(33)]
-- True
esRelacionOrden Ord a =gt [a] -gt [(aa)] -gt Bool
esRelacionOrden xs r =
esReflexiva xs r ampamp
esAntisimetrica r ampamp
esTransitiva r
Nota 227 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xTylarrrarr x divide a yson relaciones de orden
227 Clases de equivalencia
Definicioacuten 228 Si R es una relacioacuten de equivalencia en A denominamos clase de equi-valencia de un elemento x isin A al conjunto de todos los elementos de A relacionados con xes decir x = R(x) = y isin A|xRy donde la primera notacioacuten se usa si la relacioacuten con laque se estaacute tratando se sobreentiende y la segunda si no es asiacute
La funcioacuten (clasesEquivalencia xs r) devuelve las clases de la relacioacuten de equi-valencia r en xs
-- | Ejemplo
-- gtgtgt let r = [(xy) | x lt- [15] y lt- [15] even (x-y)]
-- gtgtgt clasesEquivalencia [15] r
-- [[135][24]]
clasesEquivalencia Ord a =gt [a] -gt [(aa)] -gt [[a]]
clasesEquivalencia _ [] = []
clasesEquivalencia [] _ = []
clasesEquivalencia (xxs) r = (xc) clasesEquivalencia (xs c) r
where c = filter (estaRelacionado r x) xs
23 Funciones
Definicioacuten 231 Dada una relacioacuten F entre A y B se diraacute que es una funcioacuten si es unarelacioacuten binaria es funcional y todos los elementos de A estaacuten en el dominio
La funcioacuten (esFuncion xs ys f) se verifica si f es una funcioacuten de xs en ys
-- | Ejemplos
-- gtgtgt esFuncion [13] [247] [(17)(32)]
44 Capiacutetulo 2 Relaciones y funciones
-- True
-- gtgtgt esFuncion [13] [247] [(17)]
-- False
-- gtgtgt esFuncion [13] [247] [(14)(17)(32)]
-- False
esFuncion (Ord a Ord b) =gt [a] -gt [b] -gt [(ab)] -gt Bool
esFuncion xs ys f =
esRelacion xs ys f ampamp
xs `esSubconjunto` dominio f ampamp
esFuncional f
Nota 231 A lo largo de la seccioacuten representaremos a las funciones como listas depares
type Funcion a b = [(ab)]
La funcioacuten (funciones xs ys) devuelve todas las posibles funciones del conjuntoxs en ys
-- | Ejemplos
-- gtgtgt pp $ funciones [12] [34]
-- [[(1 3)(2 3)][(1 3)(2 4)][(1 4)(2 3)]
-- [(1 4)(2 4)]]
-- gtgtgt pp $ funciones [12] [345]
-- [[(1 3)(2 3)][(1 3)(2 4)][(1 3)(2 5)]
-- [(1 4)(2 3)][(1 4)(2 4)][(1 4)(2 5)]
-- [(1 5)(2 3)][(1 5)(2 4)][(1 5)(2 5)]]
-- gtgtgt pp $ funciones [012] [34]
-- [[(0 3)(1 3)(2 3)][(0 3)(1 3)(2 4)]
-- [(0 3)(1 4)(2 3)][(0 3)(1 4)(2 4)]
-- [(0 4)(1 3)(2 3)][(0 4)(1 3)(2 4)]
-- [(0 4)(1 4)(2 3)][(0 4)(1 4)(2 4)]]
funciones [a] -gt [b] -gt [Funcion a b]
funciones xs ys =
[zip xs zs | zs lt- variacionesR (length xs) ys]
231 Imagen por una funcioacuten
Definicioacuten 232 Si f es una funcioacuten entre A y B y x es un elemento del conjunto A laimagen del elemento x por la funcioacuten f es el valor asociado a x por la funcioacuten f
La funcioacuten (imagen f x) es la imagen del elemento x en la funcioacuten f
-- | Ejemplos
-- gtgtgt imagen [(17)(32)] 1
-- 7
-- gtgtgt imagen [(17)(32)] 3
23 Funciones 45
-- 2
imagen (Ord a Ord b) =gt Funcion a b -gt a -gt b
imagen f x = head (imagenRelacion f x)
La funcioacuten (imagenConjunto f xs) es la imagen del conjunto xs en la funcioacuten f
-- | Ejemplos
-- gtgtgt imagenConjunto [(17)(32)(43)] [14]
-- [73]
-- gtgtgt imagenConjunto [(17)(32)] [31]
-- [27]
imagenConjunto (Ord a Ord b) =gt Funcion a b -gt [a] -gt [b]
imagenConjunto f xs = nub (map (imagen f) xs)
232 Funciones inyectivas
Definicioacuten 233 Diremos que una funcioacuten f entre dos conjuntos es inyectiva 2 si a ele-mentos distintos del dominio le corresponden elementos distintos de la imagen es decir siforalla b isin dominio( f ) tales que a 6= b f (a) 6= f (b)
La funcioacuten (esInyectiva fs) se verifica si la funcioacuten fs es inyectiva
-- | Ejemplos
-- gtgtgt esInyectiva [(14)(25)(36)]
-- True
-- gtgtgt esInyectiva [(14)(25)(34)]
-- False
-- gtgtgt esInyectiva [(14)(25)(36)(36)]
-- True
esInyectiva (Ord a Ord b) =gt Funcion a b -gt Bool
esInyectiva f =
all esUnitario [antiImagenRelacion f y | y lt- rango f]
233 Funciones sobreyectivas
Definicioacuten 234 Diremos que una funcioacuten f entre dos conjuntos A y B es sobreyectiva3 si todos los elementos de B son imagen de alguacuten elemento de A
La funcioacuten (esSobreyectiva xs ys f) se verifica si la funcioacuten f es sobreyectiva Ala hora de definirla estamos contando con que f es una funcioacuten entre xs y ys
-- | Ejemplos
-- gtgtgt esSobreyectiva [123] [456] [(14)(25)(36)]
2httpsenwikipediaorgwikiInjective_function3httpsenwikipediaorgwikiSurjective_function
46 Capiacutetulo 2 Relaciones y funciones
-- True
-- gtgtgt esSobreyectiva [123] [456] [(14)(25)(34)]
-- False
-- gtgtgt esSobreyectiva [123] [456] [(14)(24)(36)(36)]
-- False
esSobreyectiva (Ord aOrd b) =gt [a] -gt [b] -gt Funcion a b -gt Bool
esSobreyectiva _ ys f = ys `esSubconjunto` rango f
234 Funciones biyectivas
Definicioacuten 235 Diremos que una funcioacuten f entre dos conjuntos A y B es biyectiva 4 sicada elementos de B es imagen de un uacutenico elemento de A
La funcioacuten (esBiyectiva xs ys f) se verifica si la funcioacuten f es biyectiva
-- | Ejemplos
-- gtgtgt esBiyectiva [123] [456] [(14)(25)(36)(36)]
-- True
-- gtgtgt esBiyectiva [123] [456] [(14)(25)(34)]
-- False
-- gtgtgt esBiyectiva [123] [4567] [(14)(25)(36)]
-- False
esBiyectiva (Ord a Ord b) =gt [a] -gt [b] -gt Funcion a b -gt Bool
esBiyectiva xs ys f =
esInyectiva f ampamp esSobreyectiva xs ys f
La funciones biyecciones1 xs ys y biyecciones2 xs ys devuelven la lista de to-das las biyecciones entre los conjuntos xs y ys La primera lo hace filtrando las fun-ciones entre los conjuntos que son biyectivas y la segunda lo hace construyendouacutenicamente las funciones biyectivas entre los conjuntos con el consecuente ahorrocomputacional
ghcigt length (biyecciones1 [17] [ag])
5040
(1675 secs 4146744104 bytes)
ghcigt length (biyecciones2 [17] [ag])
5040
(002 secs 0 bytes)
ghcigt length (biyecciones1 [16] [ag])
0
(253 secs 592625824 bytes)
ghcigt length (biyecciones2 [16] [ag])
0
(001 secs 0 bytes)
4httpsenwikipediaorgwikiBijective_function
23 Funciones 47
biyecciones1 (Ord a Ord b) =gt [a] -gt [b] -gt [Funcion a b]
biyecciones1 xs ys =
filter (esBiyectiva xs ys) (funciones xs ys)
biyecciones2 (Ord a Ord b) =gt [a] -gt [b] -gt [Funcion a b]
biyecciones2 xs ys
| length xs = length ys = []
| otherwise = [zip xs zs | zs lt- permutations ys]
Nota 232 En lo que sigue trabajaremos con la funcioacuten biyecciones2 asiacute que laredefiniremos como biyecciones
biyecciones (Ord a Ord b) =gt [a] -gt [b] -gt [Funcion a b]
biyecciones = biyecciones2
235 Inversa de una funcioacuten
Definicioacuten 236 Si f es una funcioacuten biyectiva entre los conjuntos A y B definimos lafuncioacuten inversa 5 como la funcioacuten que a cada elemento de B le hace corresponder el elementode A del que es imagen en B
El valor de (inversa f) es la funcioacuten inversa de f
-- | Ejemplos
-- gtgtgt inversa [(14)(25)(36)]
-- [(41)(52)(63)]
-- gtgtgt sort (inversa [(1f)(2m)(3a)])
-- [(a3)(f1)(m2)]
inversa (Ord a Ord b) =gt Funcion a b -gt Funcion b a
inversa f = listaAConjunto [(yx) | (xy) lt- f]
Nota 233 Para considerar la inversa de una funcioacuten esta tiene que ser biyectivaLuego (inversa f) asigna a cada elemento del conjunto imagen (que en este casocoincide con la imagen) uno y solo uno del conjunto de salida
La funcioacuten (imagenInversa f y) devuelve el elemento del conjunto de salida de lafuncioacuten f tal que su imagen es y
-- | Ejemplos
-- gtgtgt imagenInversa [(14)(25)(36)] 5
-- 2
-- gtgtgt imagenInversa [(1f)(2m)(3a)] a
-- 3
imagenInversa (Ord a Ord b) =gt Funcion a b -gt b -gt a
imagenInversa f = imagen (inversa f)
5httpsenwikipediaorgwikiInverse_function
48 Capiacutetulo 2 Relaciones y funciones
Capiacutetulo 3
Introduccioacuten a la teoriacutea de grafos
Se dice que la Teoriacutea de Grafos tiene su origen en 1736 cuando Euler dio una so-lucioacuten al problema (hasta entonces no resuelto) de los siete puentes de Koumlnigsbergiquestexiste un camino que atraviese cada uno de los puentes exactamente una vezPara probar que no era posible Euler sustituyoacute cada regioacuten por un nodo y cadapuente por una arista creando el primer grafo que fuera modelo de un problemamatemaacutetico
Figura 31 Dibujo de los puentes de Koumlnigsberg
A
B
C
D
b
c
a
d
f
e
g
Figura 32 Modelo de los puentes de Koumlnigsberg
Desde entonces se ha ido desarrollando esta metodologiacutea hasta convertise en los uacutel-timos antildeos en una herramienta importante en aacutereas del conocimiento muy variadascomo por ejemplo la Investigacioacuten Operativa la Computacioacuten la Ingenieriacutea Eleacutec-trica la Geografiacutea y la Quiacutemica Es por ello que ademaacutes se ha erigido como unanueva disciplina matemaacutetica que generalmente asociada a las ramas de Topologiacuteay AacutelgebraLa utilidad de los grafos se basa en su gran poder de abstraccioacuten y una representa-cioacuten muy clara de cualquier relacioacuten lo que facilita enormemente tanto la fase demodelado como la de resolucioacuten de cualquier problema Gracias a la Teoriacutea de Gra-fos se han desarrollado una gran variedad de algoritmos y meacutetodos de decisioacuten quepodemos implementar a traveacutes de lenguajes funcionales y permiten automatizar laresolucioacuten de muchos problemas a menudo tediosos de resolver a mano
49
50 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
31 Definicioacuten de grafo
En primer lugar vamos a introducir terminologiacutea baacutesica en el desarrollo de la Teoriacuteade Grafos
Definicioacuten 311 Un grafo G es un par (V A) donde V es el conjunto cuyos elementosllamamos veacutertices (o nodos) y A es un conjunto cuyos elementos llamamos aristas
Definicioacuten 312 Una arista de un grafo G = (V A) es un conjunto de dos elementosde V Es decir para dos veacutertices v vprime de G (v vprime) y (vprime v) representa la misma arista
Definicioacuten 313 Dado un grafo G = (V A) diremos que un veacutertice v isin V es adyacentea vprime isin V si (vprime v) isin A
Definicioacuten 314 Si en un grafo dirigido se permiten aristas repetidas lo llamaremos mul-tigrafo Si no se permiten lo llamaremos grafo regular
Nota 311 Denotaremos por |V| al nuacutemero de veacutertices y por |A| al nuacutemero de aristasdel grafo (V A)
Ejemplo 312 Sea G = (V A) un grafo con V = a b c d y A = (a b) (a c) (b d)(d d) En este grafo los veacutertices a d son adyacentes a b
a
b
c
d
32 El TAD de los grafos
En esta seccioacuten nos planteamos la tarea de implementar las definiciones presenta-das anteriormente en un lenguaje funcional En nuestro caso el lenguaje que utili-zaremos seraacute Haskell Definiremos el Tipo Abstracto de Dato (TAD) de los grafos ydaremos algunos ejemplos de posibles representaciones de grafos con las que po-dremos trabajarSi consideramos un grafo finito cualquiera G = (V A) podemos ordenar el conjun-to de los veacutertices y representarlo como V = v1 vn con n = |V|En primer lugar necesitaremos crear un tipo (Grafo) cuya definicioacuten sea compatiblecon la entidad matemaacutetica que representa y que nos permita definir las operacionesque necesitamos para trabajar con los grafos Estas operaciones son
32 El TAD de los grafos 51
creaGrafo -- [a] -gt [(aa)] -gt Grafo a
vertices -- Grafo a -gt [a]
adyacentes -- Grafo a -gt a -gt [a]
aristaEn -- (aa) -gt Grafo a -gt Bool
aristas -- Grafo a -gt [(aa)]
dondebull (creaGrafo vs as) es un grafo tal que el conjunto de sus veacutertices es vs y el de
sus aristas es asbull (vertices g) es la lista de todos los veacutertices del grafo gbull (adyacentes g v) es la lista de los veacutertices adyacentes al veacutertice v en el grafo gbull (aristaEn a g) se verifica si a es una arista del grafo gbull (aristas g) es la lista de las aristas del grafo g
Nota 321 Las funciones que aparecen en la especificacioacuten del TAD no dependende la representacioacuten que elijamos
Ejemplo 322 Veamos un ejemplo de creacioacuten de grafo y su representacioacuten graacutefica
creaGrafo [15] [(12)(13)(15)(24)
(25)(34)(35)(45)]
1
2
34
5
321 Grafos como listas de aristas
En el moacutedulo GrafoConListaDeAristas se definen las funciones del TAD de losgrafos dando su representacioacuten como conjuntos de aristas es decir representandoa un grafo como dos conjuntos la primera seraacute la lista ordenada de los veacutertices y lasegunda la lista ordenada de las aristas (en ambas listas se excluye la posibilidad derepeticiones)
Nota 323 Las ventajas de usar arrays frente a usar listas es que los array tienenacceso constante (O(1)) a sus elementos mientras que las listas tienen acceso lineal(O(n)) y que la actualizacioacuten de un elemento en un array no supone espacio extraSin embargo los arrays son representaciones muy riacutegidas cualquier modificacioacutenen su estructura como cambiar su tamantildeo supone un gran coste computacionalpues se tendriacutea que crear de nuevo el array y ademaacutes sus iacutendices deben pertenecer
52 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
a la clase de los objetos indexables (Ix) luego perdemos mucha flexibilidad en larepresentacioacuten
- LANGUAGE DeriveGeneric -
module GrafoConListaDeAristas
( Grafo
creaGrafo -- [a] -gt [(aa)] -gt Grafo a
vertices -- Grafo a -gt [a]
adyacentes -- Grafo a -gt a -gt [a]
aristaEn -- (aa) -gt Grafo a -gt Bool
aristas -- Grafo a -gt [(aa)]
) where
En las definiciones del presente moacutedulo se usaraacuten las funciones nub y sort de lalibreriacutea DataList
Vamos a definir un nuevo tipo de dato (Grafo a) que representaraacute un grafo a partirde la lista de sus veacutertices (donde los veacutertices son de tipo a) y de aristas (que son paresde veacutertices)
data Grafo a = G [a] [(aa)]
deriving (Eq Show Generic)
instance (Out a) =gt Out (Grafo a)
Las funciones baacutesicas que definiremos a partir de este tipo coincidiraacuten con las indi-cadas en el TAD de los grafosbull (creaGrafo vs as) es el grafo cuyo conjunto de veacutertices es cs y el de sus aristas
es as-- | Ejemplo
-- gtgtgt creaGrafo [15] [(12)(14)(15)(23)(25)(34)(35)]
-- G [12345] [(12)(14)(15)(23)(25)(34)(35)]
creaGrafo Ord a =gt [a] -gt [(aa)] -gt Grafo a
creaGrafo vs as =
G (sort vs) (nub (sort [parOrdenado a | a lt- as]))
parOrdenado Ord a =gt (aa) -gt (aa)
parOrdenado (xy) | x lt= y = (xy)
| otherwise = (yx)
Ejemplo 324 ejGrafo es el grafo
32 El TAD de los grafos 53
1
2
3
4
5
Los ejemplos usaraacuten el siguiente grafo
ejGrafo Grafo Int
ejGrafo = creaGrafo [15]
[(12)(14)(15)(23)(25)(34)(35)(45)]
bull (vertices g) es la lista de los veacutertices del grafo g
-- | Ejemplo
-- gtgtgt vertices ejGrafo
-- [12345]
vertices Grafo a -gt [a]
vertices (G vs _) = vs
bull (adyacentes g v) es la lista de los veacutertices adyacentes al veacutertice v en el grafo g
-- | Ejemplos
-- gtgtgt adyacentes ejGrafo 4
-- [135]
-- gtgtgt adyacentes ejGrafo 3
-- [245]
adyacentes Eq a =gt Grafo a -gt a -gt [a]
adyacentes (G _ as) v =
[u | (ux) lt- as x == v] `union` [u | (xu) lt- as x == v]
bull (aristaEn a g) se verifica si a es una arista del grafo g
-- | Ejemplos
-- gtgtgt (51) `aristaEn` ejGrafo
-- True
-- gtgtgt (31) `aristaEn` ejGrafo
-- False
aristaEn Ord a =gt (aa) -gt Grafo a -gt Bool
aristaEn a (G _ as) = parOrdenado a `elem` as
bull (aristas g) es la lista de las aristas del grafo g
-- | Ejemplo
-- gtgtgt aristas ejGrafo
-- [(12)(14)(15)(23)(25)(34)(35)(45)]
aristas Grafo a -gt [(aa)]
aristas (G _ as) = as
54 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
33 Generador de grafos
En esta seccioacuten presentaremos el generador de grafos que nos permitiraacute generargrafos como listas de aristas arbitrariamente y usarlos como ejemplos o para com-probar propiedadesPara aprender a controlar el tamantildeo de los grafos generados he consultado las si-guientes fuentes QuickCheck A Lightweight Tool for Random Testing of Haskell Programs 1
([3]) Property Testing using QuickCheck 2 ([9])(generaGrafos n) es un generador de grafos de hasta n veacutertices Por ejemplo
ghcigt sample (generaGrafo 5)
G [12] []
G [1] [(11)]
G [] []
G [1234] [(22)]
G [123] [(11)(12)(13)(22)]
G [12345] [(12)(14)(15)(22)(23)(24)(33)(34)(44)(45)]
G [1] []
G [123] [(12)(22)(33)]
G [1234] [(11)(14)(23)(24)(33)(34)(44)]
G [12] []
G [123] [(11)(12)(22)(33)]
ghcigt sample (generaGrafo 2)
G [12] [(12)(22)]
G [12] [(11)]
G [12] [(11)(12)]
G [] []
G [1] [(11)]
G [1] []
G [1] []
G [] []
G [] []
G [] []
G [1] [(11)]
generaGrafo Int -gt Gen (Grafo Int)
generaGrafo s = do
let m = s `mod` 11
n lt- choose (0m)
as lt- sublistOf [(xy) | x lt- [1n] y lt- [xn]]
return (creaGrafo [1n] as)
1httpswwweecsnorthwesternedu~robbycourses395-495-2009-fallquickpdf2httpswwwdccfcuppt~pbvaulastapfslidesquickcheckhtml
34 Ejemplos de grafos 55
Nota 331 Los grafos estaacuten contenidos en la clase de los objetos generables aleato-riamente
instance Arbitrary (Grafo Int) where
arbitrary = sized generaGrafo
En el siguiente ejemplo se pueden observar algunos grafos generados
ghcigt sample (arbitrary Gen (Grafo Int))
G [] []
G [1] [(11)]
G [12] [(11)(12)]
G [1] [(11)]
G [12345678] [(14)(17)(22)(23)(25)(28)(35)
(36)(38)(44)(46)(47)(48)(56)(66)(67)(78)]
G [12345] [(11)(12)(14)(15)(24)(25)(34)(55)]
G [] []
G [] []
G [123] [(11)(22)(23)]
G [1234] [(11)(12)(14)(22)(33)]
G [1234567] [(11)(15)(16)(17)(22)(24)(25)
(26)(27)(33)(35)(46)(47)(55)(57)(66)(77)]
34 Ejemplos de grafos
El objetivo de esta seccioacuten es reunir una coleccioacuten de grafos lo suficientemente ex-tensa y variada como para poder utilizarla como recurso a la hora de comprobar laspropiedades y definiciones de funciones que implementaremos maacutes adelanteEn el proceso de recopilacioacuten de ejemplos se ha trabajado con diversas fuentesbull los apuntes de la asignatura ldquoMatemaacutetica discretardquo ([4])bull los temas de la asignatura ldquoInformaacuteticardquo ([1]) ybull el artiacuteculo ldquoGraph theoryrdquo ([11]) de la Wikipedia
Nota 341 Se utilizaraacute la representacioacuten de los grafos como listas de aristas
341 Grafo nulo
Definicioacuten 341 Un grafo nulo es un grafo que no tiene ni veacutertices ni aristas
La funcioacuten (grafoNulo) devuelve un grafo nulo
grafoNulo Ord a =gt Grafo a
grafoNulo = creaGrafo [] []
La funcioacuten (esGrafoNulo g) se verifica si g es un grafo nulo
56 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- | Ejemplos
-- gtgtgt esGrafoNulo grafoNulo
-- True
-- gtgtgt esGrafoNulo (creaGrafo [] [(12)])
-- False
-- gtgtgt esGrafoNulo (creaGrafo [12] [(12)])
-- False
esGrafoNulo Grafo a -gt Bool
esGrafoNulo g =
null (vertices g) ampamp null (aristas g)
342 Grafo ciclo
Definicioacuten 342 Un ciclo 3 de orden n C(n) es un grafo no dirigido y no ponderadocuyo conjunto de veacutertices viene dado por V = 1 n y el de las aristas por A = (0 1)(1 2) (nminus 2 nminus 1) (nminus 1 0)
La funcioacuten (grafoCiclo n) nos genera el ciclo de orden n
1
23
45
-- | Ejemplos
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
grafoCiclo Int -gt Grafo Int
grafoCiclo 0 = grafoNulo
grafoCiclo 1 = creaGrafo [1] []
grafoCiclo n = creaGrafo [1n]
([(uu+1) | u lt- [1n-1]] ++ [(n1)])
343 Grafo de la amistad
Definicioacuten 343 Un grafo de la amistad 4 de orden n es un grafo con 2n + 1 veacuterticesy 3n aristas formado uniendo n copias del ciclo C3 por un veacutertice comuacuten Lo denotamos porFn3httpseswikipediaorgwikiGrafo_completo4httpseswikipediaorgwikiGrafo_de_la_amistad
34 Ejemplos de grafos 57
La funcioacuten (grafoAmistad n) genera el grafo de la amistad de orden n Por ejemplo
1
2
34
5
1
2
3
4
5
6
7
-- | Ejemplos
-- gtgtgt pp $ grafoAmistad 2
-- G [12345]
-- [(1 2)(1 3)(1 4)(1 5)(2 3)(4 5)]
-- gtgtgt pp $ grafoAmistad 3
-- G [1234567]
-- [(1 2)(1 3)(1 4)(1 5)(1 6)(1 7)(2 3)
-- (4 5)(6 7)]
grafoAmistad Int -gt Grafo Int
grafoAmistad n =
creaGrafo [12n+1]
([(1a) | a lt- [22n+1]] ++
[(ab) | (ab) lt-zip [242n] [352n+1]])
344 Grafo completo
Definicioacuten 344 El grafo completo 5 de orden n K(n) es un grafo no dirigido cuyoconjunto de veacutertices viene dado por V = 1 n y tiene una arista entre cada par deveacutertices distintos
La funcioacuten (completo n) nos genera el grafo completo de orden n Por ejemplo
5httpseswikipediaorgwikiGrafo_completo
58 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
1
2
3
4
-- | Ejemplo
-- gtgtgt completo 4
-- G [1234] [(12)(13)(14)(23)(24)(34)]
completo Int -gt Grafo Int
completo n =
creaGrafo [1n]
[(ab) | a lt- [1n] b lt- [1a-1]]
345 Grafo bipartito
Definicioacuten 345 Un grafo bipartito 6 es un grafo G = (V A) verificando que elconjunto de sus veacutertices se puede dividir en dos subconjuntos disjuntos V1 V2 tales queV1 cupV2 = V de manera que forallu1 u2 isin V1[(u1 u2) 6isin A] y forallv1 v2 isin V2[(v1 v2) 6isin A]Un grafo bipartito completo 7 seraacute entonces un grafo bipartito G = (V1 cup V2 A) en elque todos los veacutertices de una particioacuten estaacuten conectados a los de la otra Si n = |V1| m =
|V2| denotamos al grafo bipartito G = (V1 cupV2 A) por Knm
La funcioacuten (bipartitoCompleto n m) nos genera el grafo bipartito Knm Por ejem-plo
1 2
3 4 5
-- | Ejemplo
-- gtgtgt bipartitoCompleto 2 3
-- G [12345] [(13)(14)(15)(23)(24)(25)]
bipartitoCompleto Int -gt Int -gt Grafo Int
bipartitoCompleto n m =
creaGrafo [1n+m]
[(ab) | a lt- [1n] b lt- [n+1n+m]]
6httpseswikipediaorgwikiGrafo_bipartito7httpseswikipediaorgwikiGrafo_bipartito_completo
34 Ejemplos de grafos 59
La funcioacuten (conjuntosVerticesDisjuntos g) devuelve Nothing si el grafo g no esbipartito y Just(xsys) si lo es donde xs ys es una particioacuten disjunta de los veacuterticesde g
-- | Ejemplo
-- gtgtgt conjuntosVerticesDisjuntos (bipartitoCompleto 3 4)
-- Just ([321][7654])
-- gtgtgt conjuntosVerticesDisjuntos (grafoCiclo 5)
-- Nothing
-- gtgtgt conjuntosVerticesDisjuntos (grafoCiclo 6)
-- Just ([531][642])
conjuntosVerticesDisjuntos Ord a =gt Grafo a -gt Maybe ([a][a])
conjuntosVerticesDisjuntos g
| null (vertices g) = Just ([][])
| otherwise = aux (vertices g) [] [] [] []
where u = union
a = adyacentes g
d xs x = xs [x]
aux [] _ _ r b = if (null (intersect r b))
then (Just (rb))
else Nothing
aux (vvs) [] [] [] [] = aux vs (a v) [v] [v] []
aux (vvs) [] c r b
| null (a v) = aux vs [] (vc) (vr) b
| null ((a v) c) =
if (or [elem u r | u lt- (a v)])
then (if (or [elem u b | u lt- (a v)])
then Nothing
else (aux vs [] (vc) r (vb)))
else (aux vs [] (vc) (vr) b)
| otherwise =
if (or [elem u r | u lt- (a v)])
then (if (or [elem u b | u lt- (a v)])
then Nothing
else (aux vs ((a v) c) (vc) r (vb)))
else (aux vs ((a v) c) (vc) (vr) b)
aux vs (qqs) c r b
| null ((a q) c) =
if (or [elem u r | u lt- (a q)])
then (if (or [elem u b | u lt- (a q)])
then Nothing
else (aux (d vs q) qs (qc) r (qb)))
else (aux (d vs q) qs (qc) (qr) b)
| otherwise =
if (or [elem u r | u lt- (a q)])
then (if (or [elem u b | u lt- (a q)])
then Nothing
else (aux (d vs q) (u ((a q) c) qs)
60 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
(qc) r (qb)))
else (aux (d vs q) (u ((a q) c) qs)
(qc) (qr) b)
La funcioacuten (esBipartito g) se verifica si el grafo g es bipartito
-- | Ejemplo
-- gtgtgt esBipartito (bipartitoCompleto 3 4)
-- True
-- gtgtgt esBipartito (grafoCiclo 5)
-- False
-- gtgtgt esBipartito (grafoCiclo 6)
-- True
esBipartito Ord a =gt Grafo a -gt Bool
esBipartito g = isJust (conjuntosVerticesDisjuntos g)
346 Grafo estrella
Definicioacuten 346 Una estrella 8 de orden n es el grafo bipartito completo K1n Denota-remos a una estrella de orden n por Sn Una estrella con 3 aristas se conoce en ingleacutes comoclaw (garra o garfio)
La funcioacuten (grafoEstrella n) crea un grafo circulante a partir de su orden n
2
34
56
1
-- | Ejemplo
-- gtgtgt grafoEstrella 5
-- G [123456] [(12)(13)(14)(15)(16)]
grafoEstrella Int -gt Grafo Int
grafoEstrella = bipartitoCompleto 1
347 Grafo rueda
Definicioacuten 347 Un grafo rueda 9 de orden n es un grafo no dirigido y no ponderado conn veacutertices que se forma conectando un uacutenico veacutertice a todos los veacutertices de un ciclo Cnminus1 Lodenotaremos por Wn8httpsenwikipediaorgwikiStar_(graph_theory))9httpseswikipediaorgwikiGrafo_rueda
34 Ejemplos de grafos 61
La funcioacuten (grafoRueda n) crea un grafo rueda a partir de su orden n
2
34
56
1
-- | Ejemplo
-- gtgtgt pp $ grafoRueda 6
-- G [123456]
-- [(1 2)(1 3)(1 4)(1 5)(1 6)(2 3)(2 6)
-- (3 4)(4 5)(5 6)]
grafoRueda Int -gt Grafo Int
grafoRueda n =
creaGrafo [1n]
([(1a) | a lt- [2n]] ++
[(ab) | (ab) lt- zip (2[2n-1]) (3n[4n])])
348 Grafo circulante
Definicioacuten 348 Un grafo circulante 10 de orden n ge 3 y saltos s1 sk es un grafono dirigido y no ponderado G = (1 n A) en el que cada nodo foralli isin V es adyacente alos 2k nodos iplusmn s1 iplusmn sk mod n Lo denotaremos por Cirs1sk
n
La funcioacuten (grafoCirculante n ss) crea un grafo circulante a partir de su orden n
y de la lista de sus saltos ss Por ejemplo
2
34
5
6 1
-- | Ejemplo
-- gtgtgt pp $ grafoCirculante 6 [12]
-- G [123456]
-- [(1 2)(1 3)(1 5)(1 6)(2 3)(2 4)(2 6)
-- (3 4)(3 5)(4 5)(4 6)(5 6)]
grafoCirculante Int -gt [Int] -gt Grafo Int
grafoCirculante n ss =
10httpsenwikipediaorgwikiCirculant_graph
62 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
creaGrafo [1n]
[(ab) | a lt- [1n]
b lt- sort (auxCir a ss n)
a lt b]
where auxCir v ss1 k =
concat [[fun (v+s) k fun (v-s) k] | s lt- ss1]
fun a b = if mod a b == 0 then b else mod a b
349 Grafo de Petersen generalizado
El grafo de Petersen generalizado 11 que denotaremos GPnk (con n ge 3 y 1 le k le(nminus 1)2) es un grafo formado por un grafo circulante Cirn
k en el interior rodeadopor un ciclo Cn al que estaacute conectado por una arista saliendo de cada veacutertice deforma que se creen n poliacutegonos regulares El grafo GPnk tiene 2n veacutertices y 3n aristasLa funcioacuten (grafoPetersenGen n k) devuelve el grafo de Petersen generalizadoGPnk
1
2
3
4
5
6
7
8
-- | Ejemplo
-- gtgtgt pp $ grafoPetersenGen 4 2
-- G [12345678]
-- [(1 3)(1 5)(2 4)(2 6)(3 7)(4 8)(5 6)
-- (5 8)(6 7)(7 8)]
grafoPetersenGen Int -gt Int -gt Grafo Int
grafoPetersenGen n k =
creaGrafo [12n]
(filter p (aristas (grafoCirculante n [k])) ++
[(xx+n) | x lt- [1n]] ++
(n+1n+2) (n+12n) [(xx+1) | x lt- [n+22n-1]])
where p (ab) = a lt b
11httpsenwikipediaorgwikiGeneralized_Petersen_graph
34 Ejemplos de grafos 63
3410 Otros grafos importantes
Grafo de Thomson
Definicioacuten 349 El grafo bipartito completo K33 es conocido como el grafo de Thomsony como veremos maacutes adelante seraacute clave a la hora de analizar propiedades topoloacutegicas de losgrafos
1 2 3
4 5 6
La funcioacuten (grafoThomson) genera el grafo de Thomson
-- | Ejemplo
-- gtgtgt pp $ grafoThomson
-- G [123456]
-- [(1 4)(1 5)(1 6)(2 4)(2 5)(2 6)(3 4)
-- (3 5)(3 6)]
grafoThomson Grafo Int
grafoThomson = bipartitoCompleto 3 3
Grafo de Heawood
El grafo de Heawood 12 es un grafo no dirigido regular con 14 veacutertices y 21 aris-tas Todos sus veacutertices son incidentes a exactamente 3 aristas es decir es un grafocuacutebico Tiene importantes propiedades geomeacutetricas y topoloacutegicas
1
2
3
45
6
7
8
9
10
11 12
13
14
12httpsenwikipediaorgwikiHeawood_graph
64 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten grafoHeawood genera el grafo de Heawood
-- | Ejemplo
-- gtgtgt pp $ grafoHeawood
-- G [1234567891011121314]
-- [(1 2)(1 6)(1 14)(2 3)(2 11)(3 4)(3 8)
-- (4 5)(4 13)(5 6)(5 10)(6 7)(7 8)(7 12)
-- (8 9)(9 10)(9 14)(10 11)(11 12)(12 13)
-- (13 14)]
grafoHeawood Grafo Int
grafoHeawood =
creaGrafo [114]
(aristas (grafoCiclo 14) ++
zip [1 23 4 5 7 9]
[611813101214])
Grafo de McGee
El grafo de McGee 13 es un grafo no dirigido cuacutebico con 24 veacutertices y 36 aristasTiene importantes propiedades geomeacutetricas y topoloacutegicas
1
2
3
45
6789
10
11
12
13
14
15
1617
18 19 2021
22
23
24
La funcioacuten grafoMcGee genera el grafo de McGee
-- | Ejemplo
-- gtgtgt pp $ grafoMcGee
-- G [12345678910111213141516171819
-- 2021222324]
-- [(1 2)(1 13)(1 24)(2 3)(2 9)(3 4)(3 20)
13httpsenwikipediaorgwikiMcGee_graph
34 Ejemplos de grafos 65
-- (4 5)(4 16)(5 6)(5 12)(6 7)(6 23)(7 8)
-- (7 19)(8 9)(8 15)(9 10)(10 11)(10 22)
-- (11 12)(11 18)(12 13)(13 14)(14 15)
-- (14 21)(15 16)(16 17)(17 18)(17 24)
-- (18 19)(19 20)(20 21)(21 22)(22 23)
-- (23 24)]
grafoMcGee Grafo Int
grafoMcGee =
creaGrafo [124]
(aristas (grafoCiclo 24) ++
zip [ 12 3 4 5 6 7 810111417]
[13920161223191522182124])
Grafo TuttendashCoxeter
El grafo TuttendashCoxeter 14 es un grafo no dirigido cuacutebico con 30 veacutertices y 45 aristasTiene importantes propiedades geomeacutetricas y topoloacutegicas
1
2
3
4
56
7891011
12
13
14
15
16
17
18
19
2021
22 23 24 2526
27
28
29
30
La funcioacuten grafoTutteCoxeter genera el grafo TuttendashCoxeter
-- | Ejemplo
-- gtgtgt pp $ grafoTutteCoxeter
-- G [12345678910111213141516171819
-- 2021222324252627282930]
14httpsenwikipediaorgwikiTutteT1textendashCoxeter_graph
66 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- [(1 2)(1 18)(1 30)(2 3)(2 23)(3 4)
-- (3 10)(4 5)(4 27)(5 6)(5 14)(6 7)(6 19)
-- (7 8)(7 24)(8 9)(8 29)(9 10)(9 16)
-- (10 11)(11 12)(11 20)(12 13)(12 25)
-- (13 14)(13 30)(14 15)(15 16)(15 22)
-- (16 17)(17 18)(17 26)(18 19)(19 20)
-- (20 21)(21 22)(21 28)(22 23)(23 24)
-- (24 25)(25 26)(26 27)(27 28)(28 29)
-- (29 30)]
grafoTutteCoxeter Grafo Int
grafoTutteCoxeter =
creaGrafo [130]
(aristas (grafoCiclo 30) ++
zip [ 1 2 3 4 5 6 7 8 9111213151721]
[182310271419242916202530222628])
Grafo de Petersen
El grafo de Petersen 15 se define como el grafo de Petersen generalizado GP52 esdecir es un grafo cuacutebico formado por los veacutertices de un pentaacutegono conectados alos veacutertices de una estrella de cinco puntas en la que cada nodo es adyacente a losnodos que estaacuten a un salto 2 de eacutel Es usado como ejemplo y como contraejemplo enmuchos problemas de la Teoriacutea de grafos
6
7
8 9
101
2
3 4
5
La funcioacuten grafoPetersen devuelve el grafo de Petersen
-- | Ejemplo
-- gtgtgt pp $ grafoPetersen
-- G [12345678910]
-- [(1 3)(1 4)(1 6)(2 4)(2 5)(2 7)(3 5)
-- (3 8)(4 9)(5 10)(6 7)(6 10)(7 8)(8 9)
-- (9 10)]
grafoPetersen Grafo Int
grafoPetersen = grafoPetersenGen 5 2
15httpsenwikipediaorgwikiPetersen_graph
35 Definiciones y propiedades 67
Grafo de MoeumlbiusndashCantor
El grafo de MoeumlbiusndashCantor 16 se define como el grafo de Petersen generalizadoGP83 es decir es un grafo cuacutebico formado por los veacutertices de un octoacutegono conecta-dos a los veacutertices de una estrella de ocho puntas en la que cada nodo es adyacente alos nodos que estaacuten a un salto 3 de eacutel Al igual que el grafo de Petersen tiene impor-tantes propiedades que lo hacen ser ejemplo y contraejemplo de muchos problemasde la Teoriacutea de Grafos
9
10
11
12
13
14
15
16
1
23
4
5
67
8
La funcioacuten grafoMoebiusCantor genera el grafo de MoeumlbiusndashCantor
-- | Ejemplo
-- gtgtgt pp $ grafoMoebiusCantor
-- G [12345678910111213141516]
-- [(1 4)(1 6)(1 9)(2 5)(2 7)(2 10)(3 6)
-- (3 8)(3 11)(4 7)(4 12)(5 8)(5 13)(6 14)
-- (7 15)(8 16)(9 10)(9 16)(10 11)(11 12)
-- (12 13)(13 14)(14 15)(15 16)]
grafoMoebiusCantor Grafo Int
grafoMoebiusCantor = grafoPetersenGen 8 3
35 Definiciones y propiedades
Una vez construida una pequentildea fuente de ejemplos estamos en condiciones deimplementar las definiciones sobre grafos en Haskell y ver que funcionan correc-tamente Ademaacutes comprobaremos que se cumplen las propiedades baacutesicas que sehan presentado en el tema Introduccioacuten a la teoriacutea de grafos de ldquoMatemaacutetica discretardquo([4])
16httpsenwikipediaorgwikiMoeumlbius-Kantor_graph
68 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Nota 351 Se utilizaraacute el tipo abstracto de grafos presentados en la seccioacuten 32 y seutilizaraacuten las librerias DataList y TestQuickCheck
351 Definiciones de grafos
Definicioacuten 351 El orden de un grafo G = (V A) se define como su nuacutemero de veacuterticesLo denotaremos por |V(G)|
La funcioacuten (orden g) devuelve el orden del grafo g
-- | Ejemplos
-- gtgtgt orden (grafoCiclo 4)
-- 4
-- gtgtgt orden (grafoEstrella 4)
-- 5
orden Grafo a -gt Int
orden = length vertices
Definicioacuten 352 El tamantildeo de un grafo G = (V A) se define como su nuacutemero de aristasLo denotaremos por |A(G)|
La funcioacuten (tamantildeo g) devuelve el orden del grafo g
-- | Ejemplos
-- gtgtgt tamantildeo (grafoCiclo 4)
-- 4
-- gtgtgt tamantildeo grafoPetersen
-- 15
tamantildeo Grafo a -gt Int
tamantildeo = length aristas
Definicioacuten 353 Diremos que dos aristas a aprime son incidentes si tienen interseccioacuten novaciacutea es decir si tienen alguacuten veacutertice en comuacuten
La funcioacuten (sonIncidentes a a) se verifica si las aristas a y a son incidentes
-- | Ejemplos
-- gtgtgt sonIncidentes (12) (24)
-- True
-- gtgtgt sonIncidentes (12) (34)
-- False
sonIncidentes Eq a =gt (aa) -gt (aa) -gt Bool
sonIncidentes (u1u2) (v1v2) =
or [u1 == v1 u1 == v2 u2 == v1 u2 == v2]
Definicioacuten 354 Diremos que una arista de un grafo G es un lazo si va de un veacutertice ensiacute mismo
35 Definiciones y propiedades 69
La funcioacuten (lazos g) devuelve los lazos del grafo g
-- | Ejemplos
-- gtgtgt lazos (creaGrafo [12] [(11)(12)(22)])
-- [(11)(22)]
-- gtgtgt lazos (grafoCiclo 5)
-- []
lazos Eq a =gt Grafo a -gt [(aa)]
lazos g = [(uv) | (uv) lt- aristas g u == v]
La funcioacuten (esLazo a) se verifica si la arista a es un lazo
-- | Ejemplos
-- gtgtgt esLazo (44)
-- True
-- gtgtgt esLazo (12)
-- False
esLazo Eq a =gt (aa) -gt Bool
esLazo (uv) = u == v
Definicioacuten 355 Dado un grafo G = (V A) fijado un veacutertice v isin V al conjunto deveacutertices que son adyacentes a v lo llamaremos entorno de v y lo denotaremos por N(v) =u isin V|(u v) isin A
La funcioacuten (entorno g v) devuelve el entorno del veacutertice v en el grafo g
-- | Ejemplo
-- gtgtgt entorno (creaGrafo [15] [(12)(13)(23)]) 2
-- [13]
entorno Eq a =gt Grafo a -gt a -gt [a]
entorno = adyacentes
Definicioacuten 356 Sea G = (V A) un grafo El grado (o valencia) de v isin V es grad(v) =|N(v)|
La funcioacuten (grado g v) devuelve el grado del veacutertice v en el grafo g
-- | Ejemplos
-- gtgtgt grado (creaGrafo [15] [(12)(13)(23)]) 2
-- 2
-- gtgtgt grado (grafoEstrella 5) 1
-- 5
grado Eq a =gt Grafo a -gt a -gt Int
grado g v = length (entorno g v)
Definicioacuten 357 Un veacutertice v de un grafo es aislado si su grado es 0
La funcioacuten (esAislado g v) se verifica si el veacutertice v es aislado en el grafo g
70 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- | Ejemplos
-- gtgtgt esAislado (creaGrafo [15] [(12)(13)(23)]) 4
-- True
-- gtgtgt esAislado (creaGrafo [15] [(12)(13)(23)]) 3
-- False
esAislado Eq a =gt Grafo a -gt a -gt Bool
esAislado g v = grado g v == 0
Definicioacuten 358 Un grafo es regular si todos sus veacutertices tienen el mismo grado
La funcioacuten (esRegular g) se verifica si el grafo g es regular
-- | Ejemplos
-- gtgtgt esRegular (creaGrafo [13] [(12)(13)(23)])
-- True
-- gtgtgt esRegular (creaGrafo [14] [(12)(13)(24)])
-- False
esRegular Eq a =gt Grafo a -gt Bool
esRegular g = all (==x) xs
where (xxs) = [grado g v | v lt- vertices g]
Definicioacuten 359 Dado un grafo G = (V A) llamamos valencia miacutenima o grado miacuteni-mo de G al valor δ(G) = mıngrad(v)|v isin V
La funcioacuten (valenciaMin g) devuelve la valencia miacutenima del grafo g
-- | Ejemplo
-- gtgtgt valenciaMin (creaGrafo [14] [(12)(13)(24)])
-- 1
valenciaMin Ord a =gt Grafo a -gt Int
valenciaMin g = minimum [grado g v | v lt- vertices g]
Definicioacuten 3510 Dado un grafo G = (V A) llamamos valencia maacutexima o gradomaacuteximo de G al valor δ(G) = maxgrad(v)|v isin V
La funcioacuten (valenciaMax g) devuelve la valencia maacutexima del grafo g
-- | Ejemplo
-- gtgtgt valenciaMax (creaGrafo [14] [(12)(13)(24)])
-- 2
valenciaMax Ord a =gt Grafo a -gt Int
valenciaMax g = maximum [grado g v | v lt- vertices g]
Definicioacuten 3511 Se dice que un grafo es simple si no contiene lazos ni aristas repetidas
La funcioacuten (esSimple g) se verifica si g es un grafo simple
35 Definiciones y propiedades 71
-- | Ejemplos
-- gtgtgt esSimple (creaGrafo [13] [(12)(13)(23)])
-- True
-- gtgtgt esSimple (creaGrafo [13] [(11)(12)(23)])
-- False
esSimple Ord a =gt Grafo a -gt Bool
esSimple g =
and [not ((xx) `aristaEn` g) | x lt- vertices g]
Definicioacuten 3512 Sea G un grafo Llamamos secuencia de grados de G a la lista degrados de sus veacutertices La secuencia se suele presentar en orden decreciente d1 ge d2 gemiddot middot middot ge dn
La funcioacuten (secuenciaGrados g) devuelve la secuencia de los grados del grafo g enorden decreciente
-- | Ejemplo
-- gtgtgt secuenciaGrados (creaGrafo [15] [(12)(13)(14)(24)])
-- [32210]
secuenciaGrados Eq a =gt Grafo a -gt [Int]
secuenciaGrados g = sortBy (flip compare) [grado g v | v lt- vertices g]
Nota 352 iquestQueacute listas de n nuacutemeros enteros son secuencias de grafos de n veacuterticesbull Si sumn
i=1 di es impar no hay ningunobull Si sumn
i=1 di es par entonces siempre hay un grafo con esa secuencia de grados (aun-que no necesariamente simple)
Definicioacuten 3513 Una secuencia graacutefica es una lista de nuacutemero enteros no negativos quees la secuencia de grados para alguacuten grafo simple
La funcioacuten (secuenciaGrafica ss) se verifica si existe alguacuten grafo con la secuenciade grados ss
-- | Ejemplos
-- gtgtgt secuenciaGrafica [32210]
-- True
-- gtgtgt secuenciaGrafica [3222]
-- False
secuenciaGrafica [Int] -gt Bool
secuenciaGrafica ss = even (sum ss) ampamp all p ss
where p s = s gt= 0 ampamp s lt= length ss
Definicioacuten 3514 Dado un grafo G = (V A) diremos que Gprime = (Vprime Aprime) es un subgrafode G si Vprime sube V y Aprime sube A
72 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (esSubgrafo g g) se verifica si g es un subgrafo de g
-- |Ejemplos
-- gtgtgt esSubgrafo (bipartitoCompleto 3 2) (bipartitoCompleto 3 3)
-- True
-- gtgtgt esSubgrafo (grafoEstrella 4) (grafoEstrella 5)
-- True
-- gtgtgt esSubgrafo (completo 5) (completo 4)
-- False
-- gtgtgt esSubgrafo (completo 3) (completo 4)
-- True
esSubgrafo Ord a =gt Grafo a -gt Grafo a -gt Bool
esSubgrafo g g =
vertices g `esSubconjunto` vertices g ampamp
aristas g `esSubconjunto` aristas g
Definicioacuten 3515 Si Gprime = (Vprime Aprime) es un subgrafo de G = (V A) tal que Vprime = Vdiremos que Gprime es un subgrafo maximal grafo recubridor o grafo de expansioacuten (eningleacutes spanning grah) de G
La funcioacuten (esSubgrafoMax g g) se verifica si g es un subgrafo maximal de g
-- | Ejemplos
-- gtgtgt esSubgrafoMax (grafoRueda 3) (grafoRueda 4)
-- False
-- gtgtgt esSubgrafoMax (grafoCiclo 4) (grafoRueda 4)
-- True
-- gtgtgt esSubgrafoMax (creaGrafo [13] [(12)]) (grafoCiclo 3)
-- True
-- gtgtgt esSubgrafoMax (creaGrafo [12] [(12)]) (grafoCiclo 3)
-- False
esSubgrafoMax Ord a =gt Grafo a -gt Grafo a -gt Bool
esSubgrafoMax g g =
g `esSubgrafo` g ampamp conjuntosIguales (vertices g) (vertices g)
Definicioacuten 3516 Sean Gprime = (Vprime Aprime) G = (V A) dos grafos si Vprime sub V o Aprime sub A sedice que Gprime es un subgrafo propio de G y se denota por Gprime sub G
La funcioacuten (esSubgrafoPropio g g) se verifica si g es un subgrafo propio de g
-- | Ejemplos
-- gtgtgt esSubgrafoPropio (grafoRueda 3) (grafoRueda 4)
-- True
-- gtgtgt esSubgrafoPropio (grafoRueda 4) (grafoCiclo 5)
-- False
-- gtgtgt esSubgrafoPropio (creaGrafo [13] [(12)]) (grafoCiclo 3)
-- True
-- gtgtgt esSubgrafoPropio (creaGrafo [12] [(12)]) (grafoCiclo 3)
35 Definiciones y propiedades 73
-- True
esSubgrafoPropio Ord a =gt Grafo a -gt Grafo a -gt Bool
esSubgrafoPropio g g =
esSubgrafo g g ampamp
(not (conjuntosIguales (vertices g) (vertices g)) ||
not (conjuntosIguales (aristas g) (aristas g)))
352 Propiedades de grafos
Teorema 3517 (Lema del apretoacuten de manos) En todo grafo simple el nuacutemero de veacuterticesde grado impar es par o cero
Vamos a comprobar que se verifica el lema del apretoacuten de manos utilizando la fun-cioacuten prop_LemaApretonDeManos
ghcigt quickCheck prop_LemaApretonDeManos
+++ OK passed 100 tests
prop_LemaApretonDeManos Grafo Int -gt Bool
prop_LemaApretonDeManos g =
even (length (filter odd [grado g v | v lt- vertices g]))
where g = creaGrafo (vertices g)
[(xy) | (xy) lt- aristas g x = y]
Teorema 3518 (HavelndashHakimi) Si n gt 1 y D = [d1 dn] es una lista de enterosentonces D es secuencia graacutefica si y soacutelo si la secuencia Dprime obtenida borrando el mayorelemento dmax y restando 1 a los siguientes dmax elementos maacutes grandes es graacutefica
Vamos a comprobar que se verifica el teorema de HavelndashHakimi utilizando la fun-cioacuten prop_HavelHakimi
ghcigt quickCheck prop_HavelHakimi
+++ OK passed 100 tests
prop_HavelHakimi [Int] -gt Bool
prop_HavelHakimi [] = True
prop_HavelHakimi (sss) =
not (secuenciaGrafica (sss) ampamp not (esVacio ss)) ||
secuenciaGrafica (map (x -gt x-1) (take s ss) ++ drop s ss)
353 Operaciones y propiedades sobre grafos
Eliminacioacuten de una arista
Definicioacuten 3519 Sea G = (V A) un grafo y sea (u v) isin A Definimos el grafo G (u v) como el subgrafo de G Gprime = (Vprime Aprime) con Vprime = V y Aprime = A (u v) Esta
74 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
operacioacuten se denomina eliminar una arista
La funcioacuten (eliminaArista g a) elimina la arista a del grafo g
-- | Ejemplos
-- gtgtgt eliminaArista (creaGrafo [14] [(12)(14)(24)]) (14)
-- G [1234] [(12)(24)]
-- gtgtgt eliminaArista (creaGrafo [14] [(12)(14)(24)]) (41)
-- G [1234] [(12)(24)]
-- gtgtgt eliminaArista (creaGrafo [14] [(12)(14)(24)]) (43)
-- G [1234] [(12)(14)(24)]
eliminaArista Ord a =gt Grafo a -gt (aa) -gt Grafo a
eliminaArista g (ab) =
creaGrafo (vertices g)
(aristas g [(ab)(ba)])
La funcioacuten (eliminaLazos g) devuelve un nuevo grafo obtenido a partir del grafog eliminando todas las aristas que fueran lazos
-- | Ejemplos
-- gtgtgt eliminaLazos (creaGrafo [12] [(11)(12)(22)])
-- G [12] [(12)]
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
-- gtgtgt eliminaLazos (grafoCiclo 5)
-- G [12345] [(12)(15)(23)(34)(45)]
eliminaLazos Ord a =gt Grafo a -gt Grafo a
eliminaLazos g = creaGrafo (vertices g)
[(xy) | (xy) lt- aristas g x = y]
Eliminacioacuten un veacutertice
Definicioacuten 3520 Sea G = (V A) un grafo y sea v isin V Definimos el grafo G v como elsubgrafo de G Gprime = (Vprime Aprime) con Vprime = V v y Aprime = A a isin A|v es un extremo de aEsta operacioacuten se denomina eliminar un veacutertice
La funcioacuten (eliminaVertice g v) elimina el veacutertice v del grafo g
-- | Ejemplos
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(24)]) 1
-- G [234] [(24)]
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(24)]) 4
-- G [123] [(12)]
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(24)]) 3
-- G [124] [(12)(14)(24)]
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(13)]) 1
-- G [234] []
eliminaVertice Ord a =gt Grafo a -gt a -gt Grafo a
35 Definiciones y propiedades 75
eliminaVertice g v =
creaGrafo (vertices g [v])
(as [(ab) | (ab) lt- as a == v || b == v])
where as = aristas g
Suma de aristas
Definicioacuten 3521 Sea G = (V A) un grafo y sean u v isin V tales que (u v) (v u) 6isin ADefinimos el grafo G + (u v) como el grafo Gprime = (V A cup (u v)) Esta operacioacuten sedenomina suma de una arista
La funcioacuten (sumaArista g a) suma la arista a al grafo g
-- | Ejemplos
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
-- gtgtgt sumaArista (grafoCiclo 5) (13)
-- G [12345] [(12)(13)(15)(23)(34)(45)]
sumaArista Ord a =gt Grafo a -gt (aa) -gt Grafo a
sumaArista g a =
creaGrafo (vertices g) (a aristas g)
Suma de veacutertices
Definicioacuten 3522 Sea G = (V A) un grafo y sea v 6isin V Definimos el grafo G + v comoel grafo Gprime = (Vprime Aprime) donde Vprime = V cup v Aprime = Acup (u v)|u isin V Esta operacioacuten sedenomina suma de un veacutertice
La funcioacuten (sumaVertice g a) suma el veacutertice a al grafo g
-- | Ejemplo
-- gtgtgt grafoCiclo 3
-- G [123] [(12)(13)(23)]
-- gtgtgt sumaVertice (grafoCiclo 3) 4
-- G [1234] [(12)(13)(14)(23)(24)(34)]
sumaVertice Ord a =gt Grafo a -gt a -gt Grafo a
sumaVertice g v =
creaGrafo (v vs) (aristas g ++ [(uv) | u lt- vs])
where vs = vertices g
Propiedad de los grafos completos
Proposicioacuten 3523 La familia de grafos completos Kn verifica que Kn = Knminus1 + n
Vamos a ver que se cumple la propiedad utilizando la funcioacuten prop_completos
76 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
ghcigt quickCheck prop_completos
+++ OK passed 100 tests
prop_completos Int -gt Property
prop_completos n = n gt= 2 ==gt
completo n == sumaVertice (completo (n-1)) n
A partir de esta propiedad se puede dar una definicioacuten alternativa de la funcioacuten(completo n) que devuelve el grafo completo Kn La nueva funcioacuten seraacute (completo2n)
completo2 Int -gt Grafo Int
completo2 0 = grafoNulo
completo2 n = sumaVertice (completo2 (n-1)) n
Vamos a comprobar la equivalencia de ambas deficiones
ghcigt prop_EquiCompleto
True
prop_EquiCompleto Bool
prop_EquiCompleto = and [completo n == completo2 n | n lt- [050]]
Vamos a ver cuaacutel de las definiciones es maacutes eficiente
ghcigt tamantildeo (completo 100)
4950
(117 secs 0 bytes)
ghcigt tamantildeo (completo2 100)
4950
(1549 secs 61756056 bytes)
La funcioacuten (completo n) es maacutes eficiente asiacute que seraacute la que seguiremos utilizando
Suma de grafos
Definicioacuten 3524 Sean G = (V A) Gprime = (Vprime A) dos grafos Definimos el grafo sumade G y Gprime como el grafo G + Gprime = (V cup Vprime A cup Aprime cup (u v)|u isin V v isin Vprime) Estaoperacioacuten se denomina suma de grafos
La funcioacuten (sumaGrafos g g) suma los grafos g y g
-- | Ejemplo
-- gtgtgt let g1 = creaGrafo [13] [(11)(13)(23)]
-- gtgtgt let g2 = creaGrafo [46] [(46)(56)]
-- gtgtgt pp $ sumaGrafos g1 g2
-- G [123456]
-- [(1 1)(1 3)(1 4)(1 5)(1 6)(2 3)(2 4)
-- (2 5)(2 6)(3 4)(3 5)(3 6)(4 6)(5 6)]
sumaGrafos Ord a =gt Grafo a -gt Grafo a -gt Grafo a
35 Definiciones y propiedades 77
sumaGrafos g1 g2 =
creaGrafo (vs1 `union` vs2)
(aristas g1 `union`
aristas g2 `union`
[(uv) | u lt- vs1 v lt- vs2])
where vs1 = vertices g1
vs2 = vertices g2
Unioacuten de grafos
Definicioacuten 3525 Sean G = (V A) Gprime = (Vprime A) dos grafos Definimos el grafo unioacutende G y Gprime como el grafo G cup H = (V cupVprime A cup Aprime) Esta operacioacuten se denomina unioacuten degrafos
La funcioacuten (unionGrafos g g) une los grafos g y g Por ejemplo
-- | Ejemplo
-- gtgtgt let g1 = creaGrafo [13] [(11)(13)(23)]
-- gtgtgt let g2 = creaGrafo [46] [(46)(56)]
-- gtgtgt unionGrafos g1 g2
-- G [123456] [(11)(13)(23)(46)(56)]
unionGrafos Ord a =gt Grafo a -gt Grafo a -gt Grafo a
unionGrafos g1 g2 =
creaGrafo (vertices g1 `union` vertices g2)
(aristas g1 `union` aristas g2)
Grafo complementario
Definicioacuten 3526 Dado un grafo G = (V A) se define el grafo complementario de Gcomo G = (V A) donde A = (u v)|u v isin V (u v) 6isin A
La funcioacuten (grafoComplementario g) devuelve el grafo complementario de g
-- | Ejemplo
-- gtgtgt grafoComplementario (creaGrafo [13] [(11)(13)(23)])
-- G [123] [(12)(22)(33)]
grafoComplementario Ord a =gt Grafo a -gt Grafo a
grafoComplementario g =
creaGrafo vs
[(uv)| u lt- vs v lt- vs u lt= v not ((uv) `aristaEn` g)]
where vs = vertices g
Definicioacuten 3527 Dado un grafo diremos que es completo si su complementario sin lazosno tiene aristas
La funcioacuten (esCompleto g) se verifica si el grafo g es completo
78 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- Ejemplos
-- gtgtgt esCompleto (completo 4)
-- True
-- gtgtgt esCompleto (grafoCiclo 5)
-- False
esCompleto Ord a =gt Grafo a -gt Bool
esCompleto g =
tamantildeo (eliminaLazos (grafoComplementario g)) == 0
36 Morfismos de grafos
Llegados a este punto es importante resaltar que un grafo se define como una en-tidad matemaacutetica abstracta es evidente que lo importante de un grafo no son losnombres de sus veacutertices ni su representacioacuten graacutefica La propiedad que caracterizaa un grafo es la forma en que sus veacutertices estaacuten unidos por las aristasA priori los siguientes grafos pueden parecer distintos
a
bc
de
1
23
45
Sin embargo ambos grafos son grafos de cinco veacutertices que tienen las mismas rela-ciones de vecindad entre sus nodos En esta seccioacuten estudiaremos estas relacionesque establecen las aristas entre los veacutertices de un grafo y presentaremos algoritmosque nos permitan identificar cuaacutendo dos grafos se pueden relacionar mediante apli-caciones entre sus veacutertices cumpliendo ciertas caracteriacutesicas
361 Morfismos
Definicioacuten 361 Si f es una funcioacuten entre dos grafos G = (V A) y Gprime = (Vprime Aprime)diremos que conserva la adyacencia si forallu v isin V se verifica que si (u v) isin A entonces( f (u) f (v)) isin Aprime
La funcioacuten (conservaAdyacencia g h f) se verifica si la funcioacuten f entre los grafosg y h conserva las adyacencias
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [14] [(12)(23)(34)]
-- gtgtgt let g2 = creaGrafo [14] [(12)(23)(24)]
-- gtgtgt let g3 = creaGrafo [4610] [(48)(68)(810)]
36 Morfismos de grafos 79
-- gtgtgt conservaAdyacencia g1 g3 [(14)(26)(38)(410)]
-- False
-- gtgtgt conservaAdyacencia g2 g3 [(14)(28)(36)(410)]
-- True
conservaAdyacencia (Ord a Ord b) =gt
Grafo a -gt Grafo b -gt Funcion a b -gt Bool
conservaAdyacencia g h f =
and [(imagen f ximagen f y) `aristaEn` h | (xy) lt- aristas g]
Definicioacuten 362 Dados dos grafos simples G = (V A) y Gprime = (Vprime Aprime) un morfismoentre G y Gprime es una funcioacuten φ V rarr Vprime que conserva las adyacencias
La funcioacuten (esMorfismo g h vvs) se verifica si la funcioacuten representada por vvs esun morfismo entre los grafos g y h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(12)(32)]
-- gtgtgt let g2 = creaGrafo [456] [(46)(56)]
-- gtgtgt esMorfismo g1 g2 [(14)(26)(35)]
-- True
-- gtgtgt esMorfismo g1 g2 [(14)(25)(36)]
-- False
-- gtgtgt esMorfismo g1 g2 [(14)(26)(35)(79)]
-- False
esMorfismo (Ord aOrd b) =gt Grafo a -gt Grafo b -gt
Funcion a b -gt Bool
esMorfismo g1 g2 f =
esFuncion (vertices g1) (vertices g2) f ampamp
conservaAdyacencia g1 g2 f
La funcioacuten (morfismos g h) devuelve todos los posibles morfismos entre los grafosg y h
-- | Ejemplos
-- gtgtgt grafoCiclo 3
-- G [123] [(12)(13)(23)]
-- gtgtgt let g = creaGrafo [46] [(44)(66)]
-- gtgtgt morfismos (grafoCiclo 3) g
-- [[(14)(24)(34)][(16)(26)(36)]]
-- gtgtgt morfismos g (grafoCiclo 3)
-- []
morfismos (Ord a Ord b) =gt Grafo a -gt Grafo b -gt [[(ab)]]
morfismos g h =
[f | f lt- funciones (vertices g) (vertices h)
conservaAdyacencia g h f]
80 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
362 Complejidad del problema de homomorfismo de grafos
En general en computacioacuten un problema algoriacutetmico consta de un conjunto I detodas las posibles entradas para el problema llamado el conjunto de instancias y deuna pregunta Q sobre esas instancias Resolver uno de estos problemas consiste endesarrollar un algoritmo cuya entrada es una instancia del problema y cuya salidaes una respuesta a la pregunta del problemaDecimos que un problema es de decisioacuten cuando las posibles respuestas a la pre-gunta son ldquosiacuterdquo o ldquonordquo Un ejemplo de problema de este tipo seriacutea dados dos grafosdecidir si estos son homomorfos o noA la hora de implementar un algoritmo que deacute solucioacuten al problema que estemosconsiderando es importante tener en cuenta el nuacutemero de pasos que efectuacutea hastaencontrar una respuesta Un algoritmo de tiempo polinomial se define como aquelcon funcioacuten de complejidad temporal en O(p(n)) para alguna funcioacuten polinoacutemicap donde n denota el tamantildeo de la entrada Cualquier algoritmo cuya funcioacuten decomplejidad temporal no pueda ser acotada de esta manera se denomina algoritmode tiempo exponencialLa mayoriacutea de los algoritmos de tiempo exponencial son simples variaciones de unabuacutesqueda exhaustiva mientras que los algoritmos de tiempo polinomial usualmen-te se obtienen mediante un anaacutelisis maacutes profundo de la estructura del problema Enla Teoriacutea de la complejidad computacional existe el consenso de que un problemano estaacute ldquobien resueltordquo hasta que se conozca un algoritmo de tiempo polinomialque lo resuelva Por tanto nos referiremos a un problema como ldquointratablerdquo si estan difiacutecil que no existe algoritmo de tiempo polinomial capaz de resolverloLos problemas de decisioacuten para los que existen algoritmos polinomiales consti-tuyen la clase P y son llamados polinomiales Un problema de decisioacuten es no-determiniacutestico polinomial cuando cualquier instancia que produce respuesta ldquosiacuterdquoposee una comprobacioacuten de correctitud (tambieacuten llamada certificado) verificable entiempo polinomia en el tamantildeo de la instancia Estos problemas de decisioacuten se di-ce que pertenecen a la clase NP Claramente P sube NP Sin embargo no se sabe siesta inclusioacuten es estricta uno de los principales problemas abiertos en Teoriacutea de lacomputacioacuten es saber si P 6= NPUna reduccioacuten es una transformacioacuten de un problema en otro problema Intuitiva-mente un problema Q puede ser reducido a otro problema Qprime si cualquier instanciadel problema Q puede ser ldquofaacutecilmenterdquo expresada como una instancia del problemaQprime y cuya solucioacuten proporcione una solucioacuten para la instancia de QLas reducciones en tiempo polinomial nos dotan de elementos para probar de unamanera formal que un problema es al menos tan difiacutecil que otro con una dife-rencia de un factor polinomial Estas son esenciales para definir a los problemas
36 Morfismos de grafos 81
NP-completos ademaacutes de ayudar a comprender los mismosLa clase de los problemas NP-completos contiene a los problemas maacutes difiacuteciles enNP en el sentido de que son los que esteacuten maacutes lejos de estar en P Debido a que elproblema P = NP no ha sido resuelto el hecho de reducir un problema B a otroproblema A indicariacutea que no se conoce solucioacuten en tiempo polinomial para A Estoes debido a que una solucioacuten en tiempo polinomial para A tendriacutea como conse-cuencia la existencia de una solucioacuten polinomial para B De manera similar debidoa que todos los problemas NP pueden ser reducidos a este conjunto encontrar unproblema NP-completo que pueda ser resuelto en un tiempo polinomial significariacuteaque P = NPEl problema de decidir si dos grafos son homomorfos es un problema de decisioacutenNP-completo La NP-completitud del problema se demuestra mediante la reduccioacutende este problema al problema de la clique 17En el proceso de recopilacioacuten de imformacioacuten acerca de la Teoriacutea de la complejidadse ha trabajado con dos fuentesbull la tesis de licenciatura de Pablo Burzyn ldquoComplejidad computacional en proble-
mas de modificacioacuten de aristas en grafosrdquo ([2]) ybull el artiacuteculo ldquoTeoriacutea de la complejidad computacionalrdquo ([12]) de la Wikipedia
363 Isomorfismos
Definicioacuten 363 Dados dos grafos simples G = (V A) y Gprime = (Vprime Aprime) un isomorfis-mo entre G y Gprime es un morfismo biyectivo cuyo inverso es morfismo entre Gprime y G
La funcioacuten (esIsomorfismo g h f) se verifica si la aplicacioacuten f es un isomorfismoentre los grafos g y h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt esIsomorfismo g1 g2 [(12)(24)(36)]
-- True
-- gtgtgt esIsomorfismo g1 g2 [(12)(22)(36)]
-- False
esIsomorfismo (Ord aOrd b) =gt
Grafo a -gt Grafo b -gt Funcion a b -gt Bool
esIsomorfismo g h f =
esBiyectiva vs1 vs2 f ampamp
esMorfismo g h f ampamp
esMorfismo h g (inversa f)
where vs1 = vertices g
vs2 = vertices h
17httpseswikipediaorgwikiProblema_de_la_clique
82 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (isomorfismos1 g h) devuelve todos los isomorfismos posibles entrelos grafos g y h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfismos1 g1 g2
-- [[(12)(24)(36)]]
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfismos1 g3 g4
-- []
-- gtgtgt let g5 = creaGrafo [123] [(11)(22)(33)]
-- gtgtgt let g6 = creaGrafo [246] [(22)(44)(66)]
-- gtgtgt pp $ isomorfismos1 g5 g6
-- [[(1 2)(2 4)(3 6)][(1 4)(2 2)(3 6)]
-- [(1 6)(2 4)(3 2)][(1 4)(2 6)(3 2)]
-- [(1 6)(2 2)(3 4)][(1 2)(2 6)(3 4)]]
isomorfismos1 (Ord aOrd b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos1 g h =
[f | f lt- biyecciones vs1 vs2
conservaAdyacencia g h f
conservaAdyacencia h g (inversa f)]
where vs1 = vertices g
vs2 = vertices h
Definicioacuten 364 Dos grafos G y H se dicen isomorfos si existe alguacuten isomorfismo entreellos
La funcioacuten isomorfos1 g h se verifica si los grafos g y h son isomorfos
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfos1 g1 g2
-- True
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfos1 g3 g4
-- False
isomorfos1 (Ord aOrd b) =gt Grafo a -gt Grafo b -gt Bool
isomorfos1 g = not null isomorfismos1 g
Nota 361 Al tener Haskell una evaluacioacuten perezosa la funcioacuten (isomorfos g h)
no necesita generar todos los isomorfismos entre los grafos g y h
Definicioacuten 365 Sea G = (V A) un grafo Un invariante por isomorfismos de G esuna propiedad de G que tiene el mismo valor para todos los grafos que son isomorfos a eacutel
36 Morfismos de grafos 83
esInvariantePorIsomorfismos
Eq a =gt (Grafo Int -gt a) -gt Grafo Int -gt Grafo Int -gt Bool
esInvariantePorIsomorfismos p g h =
isomorfos g h --gt (p g == p h)
where (--gt) = (lt=)
Teorema 366 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un iso-morfismo Entonces se verifica que |V(G)| = |V(Gprime)| es decir el orden de un grafo es uninvariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos orden)
+++ OK passed 100 tests
Teorema 367 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces se verifica que |A(G)| = |A(Gprime)| es decir el tamantildeo de un grafo es uninvariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos tamantildeo)
+++ OK passed 100 tests
Teorema 368 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces tienen la misma secuencia de grados es decir la secuencia de grados de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos secuenciaGrados)
+++ OK passed 100 tests
A partir de las propiedades que hemos demostrado de los isomorfismos vamos adar otra definicioacuten equivalente de las funciones (isomorfismos1 g h) y (isomorfos1
g h)
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfismos2 g1 g2
-- [[(12)(24)(36)]]
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfismos2 g3 g4
-- []
-- gtgtgt let g5 = creaGrafo [123] [(11)(22)(33)]
84 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- gtgtgt let g6 = creaGrafo [246] [(22)(44)(66)]
-- gtgtgt pp $ isomorfismos2 g5 g6
-- [[(1 2)(2 4)(3 6)][(1 4)(2 2)(3 6)]
-- [(1 6)(2 4)(3 2)][(1 4)(2 6)(3 2)]
-- [(1 6)(2 2)(3 4)][(1 2)(2 6)(3 4)]]
isomorfismos2 (Ord a Ord b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos2 g h
| orden g = orden h = []
| tamantildeo g = tamantildeo h = []
| secuenciaGrados g = secuenciaGrados h = []
| otherwise = [f | f lt- biyecciones vs1 vs2
conservaAdyacencia g h f]
where vs1 = vertices g
vs2 = vertices h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfos2 g1 g2
-- True
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfos2 g3 g4
-- False
isomorfos2 (Ord a Ord b) =gt Grafo a -gt Grafo b -gt Bool
isomorfos2 g =
not null isomorfismos2 g
isomorfismos3 (Ord a Ord b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos3 g h
| orden g = orden h = []
| tamantildeo g = tamantildeo h = []
| secuenciaGrados g = secuenciaGrados h = []
| otherwise = filter (conservaAdyacencia g h) (posibles g h)
verticesPorGrados g =
[filter (p n) (vertices g) | n lt- nub (secuenciaGrados g)]
where p m v = grado g v == m
aux1 [] _ = []
aux1 (xsxss) (ysyss) = (map (zip xs) (permutations ys))aux1 xss yss
aux2 [] = []
aux2 (xss[]) = xss
aux2 (xssyss[]) = [xs ++ ys | xs lt- xss ys lt- yss]
aux2 (xssyssxsss) =
aux2 ([xs ++ ys | xs lt- xss ys lt- yss]xsss)
36 Morfismos de grafos 85
posibles g h =
aux2 (aux1 (verticesPorGrados g) (verticesPorGrados h))
Vamos a comparar la eficiencia entre ambas definiciones
Nota 362 La nueva definicioacuten de (isomorfismos3 g h) es la maacutes eficiente con gra-fos poco regulares sin embargo cuando todos los veacutertices tienen el mismo grado(isomorfismos2 g h) sigue siendo mejor opcioacuten (aunque no hay mucha diferenciaen el coste computacional)ghcigt let n = 6 in (length (isomorfismos1 (completo n) (completo n)))
720
(018 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos2 (completo n) (completo n)))
720
(018 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos3 (completo n) (completo n)))
720
(018 secs 26123800 bytes)
ghcigt let n = 6 in (length (isomorfismos1 (grafoCiclo n) (grafoCiclo n)))
12
(004 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos2 (grafoCiclo n) (grafoCiclo n)))
12
(004 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos3 (grafoCiclo n) (grafoCiclo n)))
12
(004 secs 0 bytes)
ghcigt length (isomorfismos1 (grafoCiclo 6) (completo 7))
0
(000 secs 0 bytes)
ghcigt length (isomorfismos2 (grafoCiclo 6) (completo 7))
0
(001 secs 0 bytes)
ghcigt length (isomorfismos3 (grafoCiclo 6) (completo 7))
0
(000 secs 0 bytes)
ghcigt isomorfos1 (completo 10) (grafoCiclo 10)
False
(5190 secs 12841861176 bytes)
ghcigt isomorfos2 (completo 10) (grafoCiclo 10)
False
(000 secs 0 bytes)
ghcigt isomorfos3 (completo 10) (grafoCiclo 10)
False
86 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
(000 secs 0 bytes)
ghcigt isomorfos1 (grafoCiclo 10) (grafoRueda 10)
False
(7390 secs 16433969976 bytes)
ghcigt isomorfos2 (grafoCiclo 100) (grafoRueda 100)
False
(000 secs 0 bytes)
ghcigt isomorfos3 (grafoCiclo 100) (grafoRueda 100)
False
(000 secs 0 bytes)
ghcigt length (isomorfismos2 (grafoRueda 10) (grafoRueda 10))
18
(10112 secs 23237139992 bytes)
ghcigt length (isomorfismos3 (grafoRueda 10) (grafoRueda 10))
18
(4467 secs 9021442440 bytes)
Nota 363 Cuando los grafos son isomorfos comprobar que tienen el mismo nuacuteme-ro de veacutertices el mismo nuacutemero de aristas y la misma secuencia graacutefica no requieremucho tiempo ni espacio dando lugar a costes muy similares entre los dos paresde definiciones Sin embargo cuando los grafos tienen el mismo nuacutemero de veacuterticesy fallan en alguna de las demaacutes propiedades el resultado es muy costoso para laprimera definicioacuten mientras que es inmediato con la segundaA partir de ahora utilizaremos la funcioacuten isomorfismos2 para calcular los isomor-fismos entre dos grafos y la funcioacuten isomorfos para determinar si dos grafos sonisomorfos de modo que las renombraremos por isomorfismos y isomorfismos res-pectivamente
isomorfismos (Ord aOrd b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos = isomorfismos2
isomorfos (Ord aOrd b) =gt Grafo a -gt Grafo b -gt Bool
isomorfos = isomorfos2
364 Automorfismos
Definicioacuten 369 Dado un grafo simple G = (V A) un automorfismo de G es un iso-morfismo de G en siacute mismo
La funcioacuten (esAutomorfismo g f) se verifica si la aplicacioacuten f es un automorfismode g
-- | Ejemplos
-- gtgtgt let g = creaGrafo [123] [(12)(13)]
37 Caminos en grafos 87
-- gtgtgt esAutomorfismo g [(11)(23)(32)]
-- True
-- gtgtgt esAutomorfismo g [(12)(23)(31)]
-- False
esAutomorfismo Ord a =gt Grafo a -gt Funcion a a -gt Bool
esAutomorfismo g = esIsomorfismo g g
La funcioacuten (automorfismos g) devuelve la lista de todos los posibles automorfis-mos en g
-- | Ejemplo
-- gtgtgt automorfismos (creaGrafo [123] [(12)(13)])
-- [[(11)(22)(33)][(11)(23)(32)]]
automorfismos Ord a =gt Grafo a -gt [Funcion a a]
automorfismos g = isomorfismos1 g g
Nota 364 Cuando trabajamos con automorfismos es mejor utilizar en su defini-cioacuten la funcioacuten isomorfismos1 en vez de isomorfismos2 pues ser isomorfos es unarelacioacuten reflexiva es decir un grafo siempre es isomorfo a siacute mismo
37 Caminos en grafos
Una de las aplicaciones de la teoriacutea de grafos es la determinacioacuten de trayectos o re-corridos en una red de transporte o de distribucioacuten de productos Asiacute si cada veacuterticerepresenta un punto de intereacutes y cada arista representa una conexioacuten entre dos pun-tos usando grafos como modelos podemos simplificar el problema de encontrar laruta maacutes ventajosa en cada caso
371 Definicioacuten de camino
Definicioacuten 371 Sea G = (V A) un grafo simple y sean u v isin V dos veacutertices Uncamino entre u y v es una sucesioacuten de veacutertices de G u = v0 v1 v2 vkminus1 vk = vdonde foralli isin 0 kminus 1 (vi vi+1) isin A
La funcioacuten (esCamino g c) se verifica si la sucesioacuten de veacutertices c es un camino enel grafo g
-- | Ejemplo
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
-- gtgtgt esCamino (grafoCiclo 5) [123451]
-- True
-- gtgtgt esCamino (grafoCiclo 5) [124531]
-- False
88 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
esCamino Ord a =gt Grafo a -gt [a] -gt Bool
esCamino g c = all (`aristaEn` g) (zip c (tail c))
La funcioacuten (aristasCamino c) devuelve la lista de las aristas recorridas en el ca-mino c
-- | Ejemplos
-- gtgtgt aristasCamino [123]
-- [(12)(23)]
-- gtgtgt aristasCamino [1231]
-- [(12)(23)(13)]
-- gtgtgt aristasCamino [1232]
-- [(12)(23)(23)]
aristasCamino Ord a =gt [a] -gt [(aa)]
aristasCamino c =
map parOrdenado (zip c (tail c))
where parOrdenado (uv) | u lt= v = (uv)
| otherwise = (vu)
La funcioacuten (verticesCamino c) devuelve la lista de las vertices recorridas en elcamino c
-- | Ejemplo
-- gtgtgt verticesCamino [1231]
-- [123]
verticesCamino Ord a =gt [a] -gt [a]
verticesCamino c = nub c
Definicioacuten 372 Se llama longitud de un camino al nuacutemero de veces que se atraviesa unaarista en dicho camino
La funcioacuten (longitudCamino c) devuelve la longitud del camino c
-- | Ejemplo
-- gtgtgt longitudCamino [427]
-- 2
longitudCamino [a] -gt Int
longitudCamino c = length c - 1
La funcioacuten (todosCaminos g u v k) devuelve todos los caminos entre los veacuterticesu y v en el grafo g que tienen longitud k
-- | Ejemplo
-- gtgtgt todosCaminos (creaGrafo [12] [(12)]) 1 2 3
-- [[1212]]
-- gtgtgt todosCaminos (bipartitoCompleto 2 3) 1 3 3
-- [[1313][1323][1413][1423][1513][1523]]
todosCaminos Ord a =gt Grafo a -gt a -gt a -gt Int -gt [[a]]
todosCaminos g u v 0 = if u == v ampamp elem u (vertices g)
37 Caminos en grafos 89
then [[u]]
else []
todosCaminos g u v 1 = if aristaEn (uv) g
then [[uv]]
else []
todosCaminos g u v k =
filter p [uvs | n lt- [1k-1] w lt- a u vs lt- tC w v n]
where p xs = longitudCamino xs == k
a = adyacentes g
tC = todosCaminos g
La funcioacuten (numeroCaminosDeLongitud g u v k) es el nuacutemero de caminos de lon-gitud k uniendo los veacutertices u y v en el grafo g
-- | Ejemplos
-- gtgtgt numeroCaminosDeLongitud (completo 7) 1 4 5
-- 1111
-- gtgtgt numeroCaminosDeLongitud grafoPetersen 1 4 3
-- 5
numeroCaminosDeLongitud Ord a =gt Grafo a -gt a -gt a -gt Int -gt Int
numeroCaminosDeLongitud g u v = length todosCaminos g u v
372 Recorridos
Definicioacuten 373 Sea G = (V A) un grafo y sean u v isin V Un camino entre u y v queno repite aristas (quizaacutes veacutertices) se llama recorrido
La funcioacuten (esRecorrido g c) se verifica si el camino c es un recorrido en el grafog
-- | Ejemplo
-- gtgtgt esRecorrido (grafoCiclo 4) [214]
-- True
-- gtgtgt esRecorrido (grafoCiclo 4) [2141]
-- False
-- gtgtgt esRecorrido (grafoCiclo 4) [213]
-- False
esRecorrido Ord a =gt Grafo a -gt [a] -gt Bool
esRecorrido g c =
esCamino g c ampamp sinRepetidos (aristasCamino c)
373 Caminos simples
Definicioacuten 374 Un camino que no repite veacutertices (y por tanto tampoco aristas) se llamacamino simple
90 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (esCaminoSimple g c) se verifica si el camino c es un camino simple enel grafo g
-- | Ejemplos
-- gtgtgt esCaminoSimple (creaGrafo [12] [(11)(12)]) [112]
-- False
-- gtgtgt esCaminoSimple (grafoCiclo 4) [214]
-- True
-- gtgtgt esCaminoSimple (grafoCiclo 4) [14321]
-- True
-- gtgtgt esCaminoSimple (grafoCiclo 4) [43212]
-- False
esCaminoSimple Ord a =gt Grafo a -gt [a] -gt Bool
esCaminoSimple g [] = True
esCaminoSimple g vs =
esRecorrido g vs ampamp noRepiteVertices vs
where noRepiteVertices (xxs)
| sinRepetidos (xxs) = True
| x == last xs ampamp sinRepetidos xs = True
| otherwise = False
La funcioacuten (todosArcosBP g u v) devuelve una lista con todos los caminos simplesposibles en el grafo g entre los veacutertices u y v utilizando una algoritmo de buacutesquedaen profundidad sobre el grafo g Este algoritmo recorre el grafo de izquierda a dere-cha y de forma al visitar un nodo explora todos los caminos que pueden continuarpor eacutel antes de pasar al siquiente
-- | Ejemplos
-- gtgtgt grafoCiclo 4
-- G [1234] [(12)(14)(23)(34)]
-- gtgtgt todosArcosBP (grafoCiclo 4) 1 4
-- [[14][1234]]
-- gtgtgt todosArcosBP (grafoCiclo 4) 4 1
-- [[4321][41]]
-- gtgtgt todosArcosBP (creaGrafo [14] [(12)(34)]) 1 4
-- []
-- gtgtgt todosArcosBP (creaGrafo [12] [(11)(12)]) 1 1
-- [[1]]
todosArcosBP Ord a =gt Grafo a -gt a -gt a -gt [[a]]
todosArcosBP g x y = aux [[y]]
where aux [] = []
aux ([]zss) = aux zss
aux ((zzs)zss)
| z == x = (zzs) aux zss
| otherwise =
aux ([vzzs | v lt- adyacentes g z zs] ++ zss)
g = eliminaLazos g
eliminaLazos h = creaGrafo (vertices h)
37 Caminos en grafos 91
[(xy) | (xy) lt- aristas h x = y]
La funcioacuten (todosArcosBA g u v) devuelve una lista con todos los caminos simplesposibles en el grafo g entre los veacutertices u y v utilizando una algoritmo de buacutesquedaen anchura sobre el grafo g Este algoritmo recorre el grafo por niveles de formaque el primer camino de la lista es de longitud miacutenima
-- | Ejemplos
-- gtgtgt grafoCiclo 4
-- G [1234] [(12)(14)(23)(34)]
-- gtgtgt todosArcosBA (grafoCiclo 4) 1 4
-- [[14][1234]]
-- gtgtgt todosArcosBA (grafoCiclo 4) 4 1
-- [[41][4321]]
-- gtgtgt todosArcosBA (creaGrafo [14] [(12)(34)]) 1 4
-- []
-- gtgtgt todosArcosBA (creaGrafo [12] [(11)(12)]) 1 1
-- [[1]]
todosArcosBA Ord a =gt Grafo a -gt a -gt a -gt [[a]]
todosArcosBA g x y = aux [[y]]
where aux [] = []
aux ([]zss) = aux zss
aux ((zzs)zss)
| z == x = (zzs) aux zss
| otherwise =
aux (zss ++ [vzzs | v lt- adyacentes g z zs])
g = eliminaLazos g
Vamos a comprobar con QuickCheck que el primer elemento de la lista que de-vuelve la funcioacuten (todosArcosBA g u v) es de longitud miacutenima Para ello vamos autilizar la funcioacuten (parDeVertices g) que es un generador de pares de veacutertices delgrafo no nulo g Por ejemplo
ghcigt sample (parDeVertices (creaGrafo [19] []))
(39)
(93)
(74)
(43)
(28)
(72)
(84)
(53)
(72)
(31)
(72)
92 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
parDeVertices Grafo Int -gt Gen (IntInt)
parDeVertices g = do
x lt- elements vs
y lt- elements vs
return (xy)
where vs = vertices g
La propiedad es
prop_todosArcosBA Grafo Int -gt Property
prop_todosArcosBA g =
not (esGrafoNulo g) ==gt
forAll (parDeVertices g)
((xy) -gt let zss = todosArcosBA g x y
in null zss || longitudCamino (head zss) ==
minimum (map longitudCamino zss))
La comprobacioacuten es
ghcigt quickCheck prop_todosArcosBA
+++ OK passed 100 tests
Veamos que la funcioacuten (todosArcosBP g u v) no verifica la propiedad
ghcigt quickCheck prop_todosArcosBP
Failed Falsifiable (after 6 tests)
G [12345] [(12)(14)(15)(22)(23)(24)(44)(45)(55)]
(52)
prop_todosArcosBP Grafo Int -gt Property
prop_todosArcosBP g =
not (esGrafoNulo g) ==gt
forAll (parDeVertices g)
((xy) -gt let zss = todosArcosBP g x y
in null zss || longitudCamino (head zss) ==
minimum (map longitudCamino zss))
La funcioacuten (numeroArcosDeLongitud g u v k) devuelve el nuacutemero de caminos en-tre los veacutertices u y v en el grafo g que tienen longitud k
-- | Ejemplos
-- gtgtgt numeroArcosDeLongitud (completo 6) 1 3 4
-- 24
-- gtgtgt numeroArcosDeLongitud grafoPetersen 1 3 4
-- 4
numeroArcosDeLongitud Ord a =gt Grafo a -gt a -gt a -gt Int -gt Int
numeroArcosDeLongitud g u v k =
length (filter p (todosArcosBA g u v))
where p vs = longitudCamino vs == k
37 Caminos en grafos 93
374 Conexioacuten
Definicioacuten 375 Dado un grafo G = (V A) sean u v isin V Si existe alguacuten camino entreu y v en el grafo G diremos que estaacuten conectados y lo denotamos por u v
La funcioacuten (estanConectados g u v) se verifica si los veacutertices u y v estaacuten conecta-dos en el grafo g
-- | Ejemplos
-- gtgtgt estanConectados (creaGrafo [14] [(12)(24)]) 1 4
-- True
-- gtgtgt estanConectados (creaGrafo [14] [(12)(34)]) 1 4
-- False
estanConectados Ord a =gt Grafo a -gt a -gt a -gt Bool
estanConectados g u v
| esGrafoNulo g = False
| otherwise = not (null (todosArcosBA g u v))
Nota 371 La funcioacuten (estanConectados g u v) no necesita calcular todos los ca-minos entre u y v Puesto que Haskell utiliza por defecto evaluacioacuten perezosa siexiste alguacuten camino entre los dos veacutertices basta calcular el primero para saber quela lista de todos los caminos no es vaciacutea
375 Distancia
Definicioacuten 376 Se define la distancia entre u y v en el grafo G como la longitud delcamino maacutes corto que los une Si u y v no estaacuten conectados decimos que la distancia esinfinita
La funcioacuten (distancia g u v) devuelve la distancia entre los veacutertices u y v en elgrafo g En caso de que los veacutertices no esteacuten conectados devuelve el valor Nothing
-- | Ejemplos
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 1
-- Just 0
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 2
-- Just 1
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 3
-- Just 2
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 4
-- Nothing
distancia Ord a =gt Grafo a -gt a -gt a -gt Maybe Int
distancia g u v
| estanConectados g u v =
Just (longitudCamino (head (todosArcosBA g u v)))
| otherwise = Nothing
94 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Definicioacuten 377 Dado G = (V A) un grafo sean u v isin V Un camino entre u y v cuyalongitud coincide con la distancia entre los veacutertices se llama geodeacutesica entre u y v
La funcioacuten (esGeodesica g c) se verifica si el camino c es una geodeacutesica entre susextremos en el grafo g
-- | Ejemplos
-- gtgtgt let g = creaGrafo [14] [(12)(13)(23)(34)]
-- gtgtgt esGeodesica g [134]
-- True
-- gtgtgt esGeodesica g [1234]
-- False
esGeodesica Ord a =gt Grafo a -gt [a] -gt Bool
esGeodesica g c =
esCamino g c ampamp
longitudCamino c == fromJust (distancia g u v)
where u = head c
v = last c
Nota 372 No hace falta imponer en la definicioacuten de la funcioacuten que el camino seaun recorrido pues el camino de miacutenima longitud entre dos veacutertices es siempre unrecorrido
376 Caminos cerrados
Definicioacuten 378 Un camino en un grafo G se dice cerrado si sus extremos son igualesDiremos que un camino cerrado de longitud tres es un triaacutengulo
La funcioacuten (esCerrado g c) se verifica si el camino c es cerrado en el grafo g
-- | Ejemplos
-- gtgtgt let g = creaGrafo [14] [(12)(13)(23)(34)]
-- gtgtgt esCerrado g [1231]
-- True
-- gtgtgt esCerrado g [123]
-- False
-- gtgtgt esCerrado g [1241]
-- False
esCerrado (Ord a) =gt Grafo a -gt [a] -gt Bool
esCerrado _ [] = False
esCerrado g (vc) =
esCamino g c ampamp v == last c
La funcioacuten (triangulos g v) devuelve la lista de todos los triaacutengulos que pasanpor el veacutertice v en el grafo g
-- | Ejemplos
-- gtgtgt triangulos (completo 4) 3
37 Caminos en grafos 95
-- [[3123][3143][3213][3243][3413][3423]]
-- gtgtgt triangulos (grafoCiclo 6) 1
-- []
triangulos Ord a =gt Grafo a -gt a -gt [[a]]
triangulos g u = todosCaminos g u u 3
377 Circuitos
Definicioacuten 379 Un recorrido en un grafo G se dice circuito si sus extremos son iguales
La funcioacuten (esCircuito g c) se verifica si la sucesioacuten de veacutertices c es un circuitoen el grafo g
-- | Ejemplos
-- gtgtgt grafoCiclo 4
-- G [1234] [(12)(14)(23)(34)]
-- gtgtgt esCircuito (grafoCiclo 4) [12341]
-- True
-- gtgtgt esCircuito (grafoCiclo 4) [1234]
-- False
-- gtgtgt esCircuito (grafoCiclo 4) [1234141]
-- False
esCircuito (Ord a) =gt Grafo a -gt [a] -gt Bool
esCircuito g c =
esRecorrido g c ampamp esCerrado g c
378 Ciclos
Definicioacuten 3710 Un camino simple en un grafo G se dice que es un ciclo si sus extremosson iguales
La funcioacuten (esCiclo g c) se verifica si el camino c es un ciclo en el grafo g
-- | Ejemplos
-- gtgtgt esCiclo (grafoCiclo 4) [121]
-- False
-- gtgtgt esCiclo (grafoCiclo 4) [12341]
-- True
-- gtgtgt esCiclo (grafoCiclo 4) [1234]
-- False
-- gtgtgt esCiclo (grafoCiclo 4) [1234141]
-- False
esCiclo (Ord a) =gt Grafo a -gt [a] -gt Bool
esCiclo g c =
esCaminoSimple g c ampamp esCerrado g c
96 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (todosCiclos g v) devuelve todos los ciclos en el grafo g que pasan porel veacutertice v
-- | Ejemplos
-- gtgtgt todosCiclos (grafoCiclo 4) 3
-- [[34123][32143]]
-- gtgtgt todosCiclos (completo 3) 2
-- [[2312][2132]]
-- gtgtgt todosCiclos (creaGrafo [123] [(11)(12)(13)(23)]) 1
-- [[1][1321][1231]]
-- gtgtgt todosCiclos (creaGrafo [12] [(12)(22)(23)]) 2
-- [[2]]
todosCiclos Ord a =gt Grafo a -gt a -gt [[a]]
todosCiclos g x =
map f (filter p (concat [todosArcosBA g x u | u lt- a x]))
where p c = longitudCamino c = 1
f c | longitudCamino c == 0 = c
| otherwise = c ++ [x]
a = adyacentes g
Nota 373 El algoritmo utilizado en la definicioacuten de (todosCiclos g) es el de buacutes-queda en anchura Este algoritmo recorre el grafo por niveles de forma que el pri-mer camino de la lista es de longitud miacutenima
379 Grafos aciacuteclicos
Definicioacuten 3711 Diremos que un grafo G = (V A) es aciacuteclico si no contiene ninguacutenciclo es decir si forallv isin V no existe ninguacuten camino simple que comience y termine en v
La funcioacuten (esAciclico g) se verifica si el grafo g es aciacuteclico
-- | Ejemplo
-- gtgtgt esAciclico (creaGrafo [14] [(12)(24)])
-- True
-- gtgtgt esAciclico (grafoCiclo 5)
-- False
-- gtgtgt esAciclico (grafoEstrella 6)
-- True
esAciclico Ord a =gt Grafo a -gt Bool
esAciclico g =
and [null (todosCiclos g x) | x lt- vertices g]
38 Conectividad de los grafos 97
38 Conectividad de los grafos
381 Estar conectados por un camino
Teorema 381 Dado un grafo G la relacioacuten u sim v (estar conectados por un camino) es unarelacioacuten de equivalencia
La funcioacuten (estarConectadosCamino g) devuelve la relacioacuten entre los veacutertices delgrafo g de estar conectados por un camino en eacutel
-- | Ejemplo
-- gtgtgt estarConectadosCamino (creaGrafo [14] [(12)(24)])
-- [(11)(12)(14)(21)(22)(24)(33)(41)(42)(44)]
estarConectadosCamino Ord a =gt Grafo a -gt [(aa)]
estarConectadosCamino g =
[(uv) | u lt- vs v lt- vs estanConectados g u v]
where vs = vertices g
A continuacioacuten comprobaremos el resultado con QuickCheck
ghcigt quickCheck prop_conectadosRelEqui
+++ OK passed 100 tests
prop_conectadosRelEqui Grafo Int -gt Bool
prop_conectadosRelEqui g =
esRelacionEquivalencia (vertices g) (estarConectadosCamino g)
382 Componentes conexas de un grafo
Definicioacuten 382 Las clases de equivalencia obtenidas por la relacioacuten sim estar conectadospor un camino en un grafo G inducen subgrafos en G los veacutertices y todas las aristas de loscaminos que los conectan que reciben el nombre de componentes conexas por caminosde G
La funcioacuten (componentesConexas1 g) devuelve las componentes conexas por cami-nos del grafo g
-- | Ejemplos
-- gtgtgt componentesConexas (creaGrafo [15] [(12)(23)])
-- [[123][4][5]]
-- gtgtgt componentesConexas (creaGrafo [15] [(12)(23)(45)])
-- [[123][45]]
-- gtgtgt componentesConexas (creaGrafo [13] [(12)(23)])
-- [[123]]
componentesConexas1 Ord a =gt Grafo a -gt [[a]]
componentesConexas1 g =
clasesEquivalencia (vertices g) (estarConectadosCamino g)
98 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Vamos a definir dos nuevas funciones una que compruebe si el grafo es nulo o com-pleto pues en dichos casos las componentes seraacuten el conjunto vaciacuteo y el conjuntodel conjunto de veacutertices respectivamente y otra con un algoritmo algo maacutes comple-jo
componentesConexas2 Ord a =gt Grafo a -gt [[a]]
componentesConexas2 g
| esGrafoNulo g = []
| esCompleto g = [vertices g]
| otherwise =
clasesEquivalencia (vertices g) (estarConectadosCamino g)
componentesConexas3 Ord a =gt Grafo a -gt [[a]]
componentesConexas3 g = aux (vertices g) [] []
where aux [] [] [] = []
aux [] xs ys = [xs]
aux (vvs) [] [] =
aux (vs (a v)) (i v (a v)) (a v)
aux vs xs ys | null ((ug [a v | v lt- ys]) xs) =
xs aux vs [] []
| otherwise =
aux (vs ug [a v | v lt- ys])
(u xs (ug [a v | v lt- ys]))
(ug [a v | v lt- ys] ys)
a = adyacentes g
i = inserta
ug = unionGeneral
u = unionConjuntos
La comprobacioacuten con QuickCheck de la equivalencia de las definiciones es
ghcigt quickCheck prop_EquiComponentesConexas
+++ OK passed 100 tests
ghcigt quickCheck prop_EquiComponentesConexas2
+++ OK passed 100 tests
prop_EquiComponentesConexas Grafo Int -gt Bool
prop_EquiComponentesConexas g =
componentesConexas1 g == componentesConexas2 g
prop_EquiComponentesConexas2 Grafo Int -gt Bool
prop_EquiComponentesConexas2 g =
componentesConexas1 g == componentesConexas3 g
Comparemos ahora la eficiencia de las definiciones
ghcigt componentesConexas1 grafoNulo
[]
(003 secs 0 bytes)
38 Conectividad de los grafos 99
ghcigt componentesConexas2 grafoNulo
[]
(001 secs 0 bytes)
ghcigt componentesConexas3 grafoNulo
[]
(001 secs 0 bytes)
ghcigt length (componentesConexas1 (completo 50))
1
(023 secs 0 bytes)
ghcigt length (componentesConexas2 (completo 50))
1
(016 secs 0 bytes)
ghcigt length (componentesConexas3 (completo 50))
1
(008 secs 0 bytes)
ghcigt length (componentesConexas1 (completo 100))
1
(217 secs 205079912 bytes)
ghcigt length (componentesConexas2 (completo 100))
1
(285 secs 0 bytes)
ghcigt length (componentesConexas3 (completo 100))
1
(119 secs 0 bytes)
ghcigt length (componentesConexas1 (completo 150))
1
(1295 secs 742916792 bytes)
ghcigt length (componentesConexas2 (completo 150))
1
(2048 secs 0 bytes)
ghcigt length (componentesConexas3 (completo 150))
1
(964 secs 0 bytes)
Con grafos completos de gran tamantildeo Haskell tarda maacutes tiempo en comprobar quees completo que en calcular directamente sus clases de equivalencia y para grafosnulos apenas hay diferencia en el coste entre la primera y la segunda definicioacuten Porotra parte la tercera definicioacuten es la maacutes eficiente en todos los casos y seraacute por tantola que utilizaremos a lo largo del trabajo
componentesConexas Ord a =gt Grafo a -gt [[a]]
componentesConexas = componentesConexas3
La funcioacuten (numeroComponentes g) devuelve el nuacutemero de componentes conexasdel grafo g
-- Ejemplos
-- gtgtgt numeroComponentes (creaGrafo [15] [(12)(23)(45)])
100 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- 2
-- gtgtgt numeroComponentes (creaGrafo [14] [(12)(22)(34)])
-- 2
numeroComponentes Ord a =gt Grafo a -gt Int
numeroComponentes g
| null (aristas g) = orden g
| otherwise = length (componentesConexas g)
Nota 381 Hemos comprobado para la definicioacuten anterior que comprobar si un gra-fo es completo es muy costoso luego no conviene antildeadirlo como patroacuten
383 Grafos conexos
Definicioacuten 383 Dado un grafo diremos que es conexo si la relacioacuten tiene una uacutenica clasede equivalencia en eacutel es decir si el grafo tiene una uacutenica componente conexa
La funcioacuten (esConexo g) se verifica si el grafo g es conexo
-- Ejemplos
-- gtgtgt esConexo (creaGrafo [13] [(12)(23)])
-- True
-- gtgtgt esConexo (creaGrafo [15] [(12)(23)(45)])
-- False
esConexo Ord a =gt Grafo a -gt Bool
esConexo g = length (componentesConexas g) == 1
esConexo2 Ord a =gt Grafo a -gt Bool
esConexo2 g
| esGrafoNulo g = False
| esUnitario (vertices g) = True
| otherwise = aux (vertices g) [] []
where aux [] [] [] = False
aux [] xs _ = True
aux (vvs) [] [] | null vs = True
| null (a v) = False
| otherwise =
aux (vs a v) (i v (a v)) (a v)
aux vs xs ys | null ((ug [a v | v lt- xs]) xs) = False
| otherwise =
aux (vs (ug [a v | v lt- xs]))
(u (ug [a v | v lt- xs]) xs)
((ug [a v | v lt- xs]) xs)
a = adyacentes g
ug = unionGeneral
i = inserta
u = unionConjuntos
38 Conectividad de los grafos 101
La comprobacioacuten de la equivalencia de las definiciones con QuickCheck es
ghcigt quickCheck prop_EquiEsConexo
+++ OK passed 100 tests
prop_EquiEsConexo Grafo Int -gt Bool
prop_EquiEsConexo g =
esConexo g == esConexo2 g
Vamos a comparar ahora su eficiencia
ghcigt let g1 = grafoCiclo 100
(000 secs 0 bytes)
ghcigt let g = creaGrafo (vertices g1) (aristas g1 [(23)(9899)])
(000 secs 0 bytes)
ghcigt esConexo g
False
(117 secs 151632168 bytes)
ghcigt esConexo2 g
False
(001 secs 0 bytes)
ghcigt esConexo (grafoCiclo 500)
True
(7341 secs 10448270712 bytes)
ghcigt esConexo2 (grafoCiclo 500)
True
(18939 secs 18468849096 bytes)
ghcigt esConexo (grafoCiclo 500)
True
(7341 secs 10448270712 bytes)
ghcigt esConexo2 (grafoCiclo 500)
True
(18939 secs 18468849096 bytes)
En principio no nos proporciona ninguna ventaja la segunda definicioacuten asiacute que tra-bajaremos con la primera que hemos dado ya que es mucho maacutes sencilla
Teorema 384 Sea G un grafo G = (V A) es conexo si y solamente si forallu v isin V existe uncamino entre u y v
Vamos a comprobar el resultado con QuickCheck
ghcigt quickCheck prop_caracterizaGrafoConexo
+++ OK passed 100 tests
prop_caracterizaGrafoConexo Grafo Int -gt Property
prop_caracterizaGrafoConexo g =
not (esGrafoNulo g) ==gt
esConexo g == and [estanConectados g u v
| u lt- vertices g v lt- vertices g]
102 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
384 Excentricidad
Definicioacuten 385 Sean G = (V A) un grafo y v isin V Se define la excentricidad de v comoel maacuteximo de las distancias entre v y el resto de veacutertices de G La denotaremos por e(v)
La funcioacuten (excentricidad g v) devuelve la excentricidad del veacutertice v en el grafog
-- | Ejemplos
-- gtgtgt let g = creaGrafo [13] [(12)(23)(33)]
-- gtgtgt excentricidad g 1
-- Just 2
-- gtgtgt excentricidad g 2
-- Just 1
-- gtgtgt excentricidad (creaGrafo [13] [(12)(33)]) 1
-- Nothing
excentricidad Ord a =gt Grafo a -gt a -gt Maybe Int
excentricidad g u
| esGrafoNulo g = Nothing
| orden g == 1 = Just 0
| Nothing `elem` distancias = Nothing
| otherwise = maximum distancias
where distancias = [distancia g u v | v lt- vertices g [u]]
La funcioacuten (excentricidades g) devuelve la lista ordenada de las excentricidadesde los veacutertices del grafo g
-- | Ejemplos
-- gtgtgt excentricidades (creaGrafo [13] [(12)(23)(33)])
-- [Just 1Just 2Just 2]
-- gtgtgt excentricidades (creaGrafo [13] [(12)(33)])
-- [NothingNothingNothing]
excentricidades Ord a =gt Grafo a -gt [Maybe Int]
excentricidades g = sort (map (excentricidad g) (vertices g))
385 Diaacutemetro
Definicioacuten 386 Sea G = (V A) un grafo Se define el diaacutemetro de G como el maacuteximo delas distancias entre los veacutertices en V Lo denotaremos por d(G)
La funcioacuten (diametro g) devuelve el diaacutemetro del grafo g
-- | Ejemplos
-- gtgtgt diametro (creaGrafo [13] [(12)(23)(33)])
-- Just 2
-- gtgtgt diametro (creaGrafo [13] [(12)(33)])
-- Nothing
diametro Ord a =gt Grafo a -gt Maybe Int
38 Conectividad de los grafos 103
diametro g
| esGrafoNulo g = Nothing
| Nothing `elem` distancias = Nothing
| otherwise = maximum distancias
where vs = vertices g
distancias = [distancia g u v | u lt- vs v lt- vs u lt= v]
386 Radio
Definicioacuten 387 Sean G = (V A) un grafo y v isin V Se define el radio de G como elmiacutenimo de las excentricidades de sus veacutertices Lo denotaremos por r(G)
La funcioacuten (radio g) devuelve el radio del grafo g
-- | Ejemplos
-- gtgtgt radio (creaGrafo [13] [(12)(23)(33)])
-- Just 1
-- gtgtgt radio (creaGrafo [13] [(12)(33)])
-- Nothing
radio Ord a =gt Grafo a -gt Maybe Int
radio g
| esGrafoNulo g = Nothing
| Nothing `elem` ds = Nothing
| otherwise = minimum ds
where ds = [excentricidad g v | v lt- vertices g]
387 Centro
Definicioacuten 388 Sean G = (V A) un grafo Llamamos centro del grafo G al conjunto deveacutertices de excentricidad miacutenima A estos veacutertices se les denomina veacutertices centrales
La funcioacuten (centro g) devuelve el centro del grafo g Por ejemplo
-- | Ejemplos
-- gtgtgt centro (creaGrafo [13] [(12)(23)(33)])
-- [2]
-- gtgtgt centro (creaGrafo [13] [(12)(13)(23)])
-- [123]
-- gtgtgt centro (creaGrafo [13] [(12)(33)])
-- [123]
centro Ord a =gt Grafo a -gt [a]
centro g = [v | v lt- vertices g excentricidad g v == r]
where r = radio g
104 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
388 Grosor
Definicioacuten 389 Sean G = (V A) un grafo Se llama grosor o cintura del grafo G almiacutenimo de las longitudes de los ciclos de G Si el grafo no posee ciclos (es decir es un grafoaciacuteclico) se dice que su cintura es infinita
La funcioacuten (grosor g) devuelve el grosor del grafo g
-- | Ejemplos
-- gtgtgt grosor (creaGrafo [123] [(12)(23)])
-- Nothing
-- gtgtgt grosor (creaGrafo [123] [(11)(12)(23)(34)])
-- Just 0
-- gtgtgt grosor grafoPetersen
-- Just 5
-- gtgtgt grosor grafoMoebiusCantor
-- Just 6
-- gtgtgt grosor grafoHeawood
-- Just 6
-- gtgtgt grosor grafoMcGee
-- Just 7
-- gtgtgt grosor grafoTutteCoxeter
-- Just 8
grosor Ord a =gt Grafo a -gt Maybe Int
grosor g
| esAciclico g = Nothing
| otherwise = Just (minimum [longitudCamino (head yss)
| x lt- vertices g
let yss = todosCiclos g x
not (null yss)])
Propiedades del grosor de los grafos
Teorema 3810 El grosor del grafo ciclo de orden n Cn es infin si n lt 3 y 3 en caso contrario
La propiedad se expresa por
prop_grosor_grafoCiclo Int -gt Bool
prop_grosor_grafoCiclo n =
grosor (grafoCiclo n) == if n lt 3
then Nothing
else Just n
Su comprobacioacuten para n le 30 es
ghcigt all prop_grosor_grafoCiclo [130]
True
Teorema 3811 El grosor del grafo amistad de orden n es 3 para todo n
38 Conectividad de los grafos 105
prop_grosor_grafoAmistad Int -gt Bool
prop_grosor_grafoAmistad n =
grosor (grafoAmistad n) == Just 3
Su comprobacioacuten para n le 30 es
ghcigt all prop_grosor_grafoAmistad [130]
True
Teorema 3812 El grosor del grafo completo de orden n Kn es infin si n lt 3 y 3 en casocontrario
La propiedad se expresa por
prop_grosor_completo Int -gt Bool
prop_grosor_completo n =
grosor (completo n) == if n lt 3
then Nothing
else Just 3
Su comprobacioacuten para n le 30 es
ghcigt all prop_grosor_completo [130]
True
Teorema 3813 El grosor del grafo bipartito completo de orden Kmn es infin si m = 1 oacuten = 1 y es 4 en caso contrario y 3 en caso contrario
La propiedad se expresa por
prop_grosor_bipartitoCompleto Int -gt Int -gt Bool
prop_grosor_bipartitoCompleto m n =
grosor (bipartitoCompleto m n) == if m == 1 || n == 1
then Nothing
else Just 4
Su comprobacioacuten para 1 le m le n le 15 es
ghcigt and [prop_grosor_bipartitoCompleto m n | m lt- [115] n lt- [m15]]
True
Teorema 3814 El grosor del grafo rueda de orden n Wn es infin si n lt 3 y 3 en caso contrario
La propiedad se expresa por
prop_grosor_grafoRueda Int -gt Bool
prop_grosor_grafoRueda n =
grosor (grafoRueda n) == if n lt 3
then Nothing
else Just 3
106 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Su comprobacioacuten para 1 le n le 30 es
ghcigt all prop_grosor_grafoRueda [130]
True
389 Propiedades e invariantes por isomorfismos
Teorema 3815 Sean G = (V A) y Gprime = (Vprime Aprime) grafos isomorfos con φ V rarr Vprime unisomorfismo Entonces dados u v isin V u sim v si y solamente si φ(u) sim φ(v)
La comprobacioacuten del teorema con QuickCheck es
ghcigt quickCheck prop_ConexionIsomorfismo1
+++ OK passed 100 tests
prop_ConexionIsomorfismo1 Grafo Int -gt Grafo Int -gt Bool
prop_ConexionIsomorfismo1 g h =
not (isomorfos g h) ||
and [ec g u v == ec h (imagen phi u) (imagen phi v)
| u lt- vs
v lt- vs
phi lt- isomorfismos g h]
where vs = vertices g
ec = estanConectados
Teorema 3816 Sean G = (V A) y Gprime = (Vprime Aprime) grafos isomorfos con φ V rarr Vprime unisomorfismo Entonces φ lleva cada componente conexa de G en una componente conexa deGprime
La comprobacioacuten del teorema con QuickCheck es
ghcigt quickCheck prop_ConexionIsomorfismo2
+++ OK passed 100 tests
prop_ConexionIsomorfismo2 Grafo Int -gt Grafo Int -gt Bool
prop_ConexionIsomorfismo2 g h =
not(isomorfos g h) ||
and [conjuntosIguales cch (aux f) | f lt- isomorfismos g h]
where cch = componentesConexas h
ccg = componentesConexas g
aux f = map (sort imagenConjunto f) ccg
Teorema 3817 Sean G = (V A) y Gprime = (Vprime Aprime) grafos isomorfos con φ V rarr Vprime unisomorfismo Entonces G y Gprime tienen el mismo nuacutemero de componentes conexas
La comprobacioacuten del teorema con QuickCheck es
38 Conectividad de los grafos 107
ghcigt quickCheck prop_ConexionIsomorfismo3
+++ OK passed 100 tests
prop_ConexionIsomorfismo3 Grafo Int -gt Grafo Int -gt Bool
prop_ConexionIsomorfismo3 g h =
not (isomorfos g h) ||
numeroComponentes g == numeroComponentes h
Teorema 3818 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que el diaacutemetro de G es igual al diaacutemetro de Gprime es decir el diaacutemetrode un grafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos diametro)
+++ OK passed 100 tests
Teorema 3819 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces se verifica que el radio de G es igual al radio de Gprime es decir el radio de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos radio)
+++ OK passed 100 tests
Teorema 3820 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que el grosor de G es igual al grosor de Gprime es decir el grosor de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos grosor)
+++ OK passed 100 tests
Teorema 3821 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que el centro de G es igual al centro de Gprime es decir el centro de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos centro)
+++ OK passed 100 tests
Teorema 3822 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces se verifica que el nuacutemero de componentes conexas de G es igual al nuacutemerode las de Gprime es decir el nuacutemero de componentes conexas de un grafo es un invariante porisomorfismos
108 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos numeroComponentes)
+++ OK passed 100 tests
Teorema 3823 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que los valores que toman las excentricidades de los veacutertices G esigual al de los veacutertices de Gprime es decir el conjunto de valores que toman las excentricidadesde los veacutertices es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos excentricidades)
+++ OK passed 100 tests
Capiacutetulo 4
Matrices asociadas a grafos
En este capiacutetulo se definiraacuten algunas representaciones de grafos como matrices secomprobaraacuten sus propiedades y volveremos a definir algunos conceptos del capiacutetu-lo 3 ahora utilizando matricesPara elaborar el contenido del capiacutetulo utilizareacute el segundo tema del trabajo fin degrado de Fco Javier Franco Galviacuten Aspectos algebraicos en teoriacutea de grafos ([7]) En eltrabajo el autor introduce los conceptos de matriz de adyacencia matriz de incidenciay otras matrices asociadas a grafos
41 Generador de grafos simples
En esta seccioacuten presentaremos el generador de grafos que nos permitiraacute generargrafos simples como listas de aristas arbitrariamente y usarlos como ejemplos opara comprobar propiedades en la seccioacuten de matrices asociadas a grafos(grafoSimple) es un generador de grafos simples de hasta 10 veacutertices Por ejemplo
ghcigt sample grafoSimple
G [12345678] [(14)(15)(16)(17)(18)(23)
(24)(25)(27)(35)(37)(45)(46)(56)(67)]
G [123456789] [(14)(18)(23)(25)(29)
(34)(35)(36)(38)(39)(46)(48)(49)
(58)(59)(69)(78)]
G [123456] [(12)(13)(24)(25)(26)(35)(56)]
G [1234567] [(12)(13)(14)(24)(25)(26)
(36)(45)(46)(67)]
G [1234] [(13)(14)(23)(34)]
G [123] [(23)]
G [12] [(12)]
G [123456] [(16)(24)(26)(35)(36)(56)]
G [123456789] [(12)(14)(15)(16)(17)(24)
(34)(37)(38)(39)(45)(47)(49)(56)(57)
(58)(59)(67)(69)(78)(79)]
109
110 Capiacutetulo 4 Matrices asociadas a grafos
G [123456789] [(13)(14)(15)(16)(23)(24)
(29)(35)(39)(45)(47)(48)(49)(57)(58)
(59)(67)(68)(69)(79)]
G [1] []
grafoSimple Gen (Grafo Int)
grafoSimple = do
n lt- choose (010)
as lt- sublistOf [(xy) | x lt- [1n] y lt- [x+1n]]
return (creaGrafo [1n] as)
42 Matrices de adyacencia
421 Definicioacuten y propiedades
Usaremos la funcioacuten (imprimeMatriz p) para imprimir por pantalla la matriz p conuna fila por liacutenea
-- | Ejemplo
-- gtgtgt imprimeMatriz (fromLists [[134][357][479]])
-- [134]
-- [357]
-- [479]
imprimeMatriz Show a =gt Matrix a -gt IO ()
imprimeMatriz p =
mapM_ print (toLists p)
Definicioacuten 421 Sea G = (V A) un grafo simple con V = v1 vn Se define sumatriz de adyacencia como Antimesn = (aij) donde el elemento aij toma el valor 1 si existealguna arista en A uniendo los veacutertices vi y vj y 0 en caso contrario
Nota 421 La matriz de adyacencia depende del etiquetado del grafo
La funcioacuten (matrizAdyacencia g) es la matriz de adyacencia del grafo g
-- | Ejemplo
-- gtgtgt imprimeMatriz (matrizAdyacencia (grafoCiclo 4))
-- [0101]
-- [1010]
-- [0101]
-- [1010]
-- gtgtgt imprimeMatriz (matrizAdyacencia (completo 4))
-- [0111]
-- [1011]
-- [1101]
-- [1110]
42 Matrices de adyacencia 111
matrizAdyacencia Grafo Int -gt Matrix Int
matrizAdyacencia g = matrix n n f
where n = orden g
f (ij) | (ij) `aristaEn` g = 1
| otherwise = 0
422 Propiedades baacutesicas de las matrices
La funcioacuten (esSimetrica p) se verifica si la matriz p es simeacutetrica
-- ejemplo
-- gtgtgt esSimetrica (fromLists [[134][357][479]])
-- True
-- gtgtgt esSimetrica (fromLists [[134][357][497]])
-- False
esSimetrica Eq a =gt Matrix a -gt Bool
esSimetrica p =
transpose p == p
La funcioacuten (potencia p n) devuelvela potencia nndasheacutesima de la matriz cuadrada p
-- Ejemplo
-- gtgtgt potencia (fromLists [[134][357][479]]) 3
-- ( 408 735 975 )
-- ( 735 1323 1755 )
-- ( 975 1755 2328 )
potencia Num a =gt Matrix a -gt Int -gt Matrix a
potencia p 1 = p
potencia p n = if (odd n)
then (m p (potencia (m p p) (div (n-1) 2)))
else (potencia (m p p) (div (n-1) 2))
where m = multStd2
423 Propiedades de las matrices de adyacencia
Teorema 422 Para todo n la matriz de adyacencia del grafo ciclo de orden n Cn es simeacute-trica
ghcigt all prop_simetricaAdyacenciaCompleto [130]
True
prop_simetricaAdyacenciaCompleto Int -gt Bool
prop_simetricaAdyacenciaCompleto n =
esSimetrica (matrizAdyacencia (completo n))
La funcioacuten (tamantildeoM g) devuelve el tamantildeo del grafo simple g calculado usandosu matriz de adyacencia
112 Capiacutetulo 4 Matrices asociadas a grafos
-- | Ejemplos
-- gtgtgt tamantildeoM (grafoCiclo 4)
-- 4
-- gtgtgt tamantildeoM grafoPetersen
-- 15
tamantildeoM Grafo Int -gt Int
tamantildeoM g = sum (toList (matrizAdyacencia g)) `div` 2
Teorema 423 El tamantildeo de un grafo simple es la mitad de la suma de los elementos de sumatriz de adyacencia
La comprobacioacuten del teorema con QuickCheck es
ghcigt quickCheck prop_tamantildeoMatriz
+++ OK passed 100 tests
prop_tamantildeoMatriz Property
prop_tamantildeoMatriz =
forAll grafoSimple
(g -gt tamantildeo g == tamantildeoM g)
Teorema 424 Si un grafo G = (V A) tiene un veacutertice aislado vi tanto la fila como lacolumna indasheacutesima de su matriz de adyacencia estaraacuten formadas por ceros
esAisladoM Grafo Int -gt Int -gt Bool
esAisladoM g v = if (all (==0)
(((toLists (ma g)) (v-1))
++((toLists (t (ma g))) (v-1))))
then True
else False
where ma = matrizAdyacencia
t = transpose
La comprobacioacuten del teorema es
ghcigt quickCheck prop_esAisladoMatriz
+++ OK passed 100 tests
prop_esAisladoMatriz Property
prop_esAisladoMatriz =
forAll grafoSimple
(g -gt and [esAislado g v == esAisladoM g v
| v lt- vertices g])
Teorema 425 Sea un grafo G = (V A) simple no dirigido con V = v1 vn Lasuma de los elementos de la fila (o columna) indasheacutesima de su matriz de adyacencia coincide conel grado del veacutertice vi Es decir
42 Matrices de adyacencia 113
δ(vi) =n
sumj=1
aij =n
sumj=1
aji
gradoM Grafo Int -gt Int -gt Int
gradoM g v = sum ((toLists (ma g)) (v-1))
where ma = matrizAdyacencia
La comprobacioacuten del teorema es
ghcigt quickCheck prop_gradoMatriz
+++ OK passed 100 tests
prop_gradoMatriz Property
prop_gradoMatriz =
forAll grafoSimple
(g -gt and [grado g v == gradoM g v | v lt- vertices g])
Teorema 426 Sea G = (V A) un grafo bipartito de conjuntos de veacutertices disjuntosV1 = v1 vk y V2 = vk+1 vn tal que V = V1 cup V2 y soacutelo existen aristasque conectan veacutertices de V1 con veacutertices de V2 Entonces con este etiquetado de V la matrizde adyacencia de G tiene la forma
A =
(θ BBt θ
)
prop_BipartitoMatriz Grafo Int -gt Property
prop_BipartitoMatriz g =
esBipartito g ==gt
all (==0) [ getElem u v m | [uv] lt- (f (fromJust p))]
where f (xsys) = filter p (subsequences xs ++ subsequences ys)
where p zs = length zs == 2
p = conjuntosVerticesDisjuntos g
m = matrizAdyacencia g
424 Caminos y arcos
En esta seccioacuten se presentaraacute la informacioacuten que contiene la matriz de adyacenciade un grafo en relacioacuten a los caminos que se encuentran en eacutel
Teorema 427 Sea G = (V A) un grafo con V = v1 vn y matriz de adyacenciaA = (aij) Entonces forallk ge 0 el elemento (i j) de Ak que denotaremos por ak
ij es elnuacutemero de caminos de longitud k desde el veacutertice vi al veacutertice vj
114 Capiacutetulo 4 Matrices asociadas a grafos
numeroCaminosDeLongitudM Grafo Int -gt Int -gt Int -gt Int -gt Int
numeroCaminosDeLongitudM g u v k = getElem u v mk
where ma = matrizAdyacencia g
n = orden g
mk = foldr (multStd2) (identity n) (take k (repeat ma))
La comprobacioacuten del teorema para k le 6 es
ghcigt quickCheck prop_numeroCaminosMatriz
+++ OK passed 100 tests
prop_numeroCaminosMatriz Grafo Int -gt Gen Bool
prop_numeroCaminosMatriz g = do
k lt- choose (06)
let vs = vertices g
return (and [ numeroCaminosDeLongitud g u v k ==
numeroCaminosDeLongitudM g u v k
|(uv) lt- productoCartesiano vs vs u lt v])
De este teorema se deducen las siguientes propiedades
Teorema 428 Sea G un grafo simple Siguiendo la notacioacuten del teorema anterior se tieneque1 a(2)ii = δ(vi)
2 a(3)ii es el nuacutemero de triaacutengulos que contienen al veacutertice vi
gradoCaminosM Grafo Int -gt Int -gt Int
gradoCaminosM g v = getElem v v m2
where m = matrizAdyacencia g
m2 = multStd2 m m
numeroTriangulosM Grafo Int -gt Int -gt Int
numeroTriangulosM g v = getElem v v (potencia m 3)
where m = matrizAdyacencia g
La comprobacioacuten con QuickCheck es
ghcigt quickCheck prop_GradoCaminosMatriz
+++ OK passed 100 tests
ghcigt quickCheck prop_TriangulosMatriz
+++ OK passed 100 tests
prop_GradoCaminosMatriz Grafo Int -gt Bool
prop_GradoCaminosMatriz g =
and [ grado g v == gradoCaminosM g v | v lt- vertices g]
42 Matrices de adyacencia 115
prop_TriangulosMatriz Property
prop_TriangulosMatriz =
forAll grafoSimple
(g -gt and [length (triangulos g v) ==
numeroTriangulosM g v | v lt- vertices g])
116 Capiacutetulo 4 Matrices asociadas a grafos
Capiacutetulo 5
Apeacutendices
51 Sistemas utilizados
El desarrollo de mi Trabajo de Fin de Grado requeriacutea de una infraestructura teacutecnicaque he tenido que trabajar antes de comenzar a desarrollar el contenido A conti-nuacioacuten voy a nombrar y comentar los sistemas y paquetes que he utilizado a lolargo del proyectobull Ubuntu como sistema operativo El primer paso fue instalar Ubuntu en mi orde-
nador portaacutetil personal Para ello seguiacute las recomendaciones de mi compantildeeroEduardo Paluzo quien ya lo habiacutea hecho antesPrimero me descargueacute la imagen del sistema Ubuntu 1604 LTS (para procesadorde 64 bits) desde la paacutegina de descargas de Ubuntu 1 y tambieacuten la herramientaLinuxLive USB Creator 2 que transformariacutea mi pendrive en una unidad USB Boo-teable cargada con la imagen de Ubuntu Una vez tuve la unidad USB preparadaprocediacute a instalar el nuevo sistema apagueacute el dispositivo y al encenderlo entreacuteen el Boot Menu de la BIOS del portaacutetil para arrancar desde el Pendrive en vez dehacerlo desde el disco duro Automaacuteticamente comenzoacute la instalacioacuten de Ubuntuy solo tuve que seguir las instrucciones del asistente para montar Ubuntu mante-niendo ademaacutes Windows 10 que era el sistema operativo con el que habiacutea estadotrabajando hasta ese momentoEl resultado fue un poco agridulce pues la instalacioacuten de Ubuntu se habiacutea reali-zado con eacutexito sin embargo al intentar arrancar Windows desde la nueva GRUBme daba un error al cargar la imagen del sistema Despueacutes de buscar el error queme apareciacutea en varios foros encontreacute una solucioacuten a mi problema deshabiliteacute elSecurity Boot desde la BIOS y pude volver a arrancar Windows 10 con normali-dad
1httpwwwubuntucomdownloaddesktop2httpwwwlinuxliveusbcom
117
118 Capiacutetulo 5 Apeacutendices
bull LATEX como sistema de composicioacuten de textos La distribucioacuten de LATEXTex Livecomo la mayoriacutea de software que he utilizado la descargueacute utilizando el Gestorde Paquetes Synaptic Anteriormente soacutelo habiacutea utilizado TexMaker como editorde LATEX asiacute que fue el primero que descargueacute Maacutes tarde mi tutor Joseacute Antoniome sugirioacute que mejor descargara el paquete AUCTex pues me permitiriacutea trabajarcon archivos TEX desde el editor Emacs asiacute lo hice y es el que he utilizado pararedactar el trabajo Ademaacutes de los que me recomendaba el gestor solo he tenidoque descargarme el paquete spanish de babel para poder componer el trabajo puesel paquete Tikz que he utilizado para representar los grafos veniacutea incluido en lassugerencias de Synapticbull Haskell como lenguaje de programacioacuten Ya habiacutea trabajado anteriormente con
este lenguaje en el grado y sabiacutea que soacutelo teniacutea que descargarme la plataforma deHaskell y podriacutea trabajar con el editor Emacs Seguiacute las indicaciones que se dan alos estudiantes de primer curso en la paacutegina del Dpto de Ciencias de la Compu-tacioacuten e Inteligencia Artificial 3 y me descargueacute los paquetes haskell-platform yhaskell-mode desde el Gestor de Paquetes Synaptic La versioacuten de la plataforma deHaskell con la que he trabajado es la 2014200debian2 y la del compilador GHC la7103-7bull Dropbox como sistema de almacenamiento compartido Ya habiacutea trabajado con
Dropbox en el pasado asiacute que crear una carpeta compartida con mis tutores nofue ninguacuten problema sin embargo al estar Dropbox sujeto a software no libre nome resultoacute tan sencillo instalarlo en mi nuevo sistema En primer lugar intenteacutehacerlo directamente desde Ubuntu Software que intentoacute instalar Dropbox Nauti-lus y abrioacute dos instalaciones en paralelo Se quedoacute colgado el ordenador asiacute quemateacute los procesos de instalacioacuten activos reinicieacute el sistema y me descargueacute direc-tamente el paquete de instalacioacuten desde la paacutegina de descargas de Dropbox 4 y loejecuteacute desde la terminalbull Git como sistema remoto de control de versiones Era la primera vez que trabaja-
ba con Git y me costoacute bastante adaptarme Mi tutor Joseacute Antonio y mi compantildeeroEduardo Paluzo me ayudaron mucho e hicieron el proceso de adaptacioacuten muchomaacutes aacutegil El manual que Eduardo ha redactado y presenta en su Trabajo Fin deGrado me ha sido muy uacutetil es una pequentildea guiacutea que cualquier interesado en elempleo de Git puede utilizar como introduccioacuten La instalacioacuten no resultoacute com-plicada a traveacutes del Gestor de Paquetes Synaptic me descargueacute el paquete elpa-magity todos los demaacutes paquetes necesarios para trabajar con Git en mi portaacutetil usandoel editor Emacs Eduardo me ayudoacute a crear el repositorio MDenHaskell en la plata-forma GitHub y clonarlo en mi ordenador personal Dicho repositorio contiene el
3httpwwwcsuses~jalonsocursosi1m-15sistemasphp4httpswwwdropboxcomesinstallos=lnx
52 Mapa de decisiones de disentildeo en conjuntos 119
total del trabajo y se almacena de forma puacuteblica La versioacuten de Magit que utilizoes la 250-2
52 Mapa de decisiones de disentildeo en conjuntos
Una vez comenzado el trabajo y habiendo hecho ya varias secciones acerca de laTeoriacutea de Grafos se puso de manifiesto la conveniencia de crear nuevos capiacutetulosintroduciendo conceptos de la Teoriacutea de Conjuntos y las relaciones que se puedenpresentar entre sus elementosHaskell tiene una libreriacutea especiacutefica para conjuntos DataSet sin embargo no estan intuitiva ni tan eficiente como la de listas (DataList) A lo largo del proyecto hecreado un moacutedulo que permite trabajar con conjuntos utilizando tanto su represen-tacioacuten como listas ordenadas sin elementos repetidos como su representacioacuten comolistas sin elementos repetidos Dicho moacutedulo se llama Conjuntos y lo presento en elprimer capiacutetulo del Trabajo
53 Mapa de decisiones de disentildeo en grafos
Al comienzo del proyecto la idea era que las primeras representaciones con lasque trabajara fueran las de grafos como vectores de adyacencia y grafos como matricesde adyacencia que se utilizan en Informaacutetica en el primer curso del Grado con lasque ya habiacutea trabajado y estaba familiarizadaLas definiciones de Informaacutetica estaacuten pensadas para grafos ponderados (dirigidoso no seguacuten se eligiera) mientras que en Matemaacutetica Discreta apenas se usan grafosdirigidos o ponderados por tanto el primer cambio en la representacioacuten utilizadafue simplificar las definiciones de modo que solo trabajaacuteramos con grafos no diri-gidos y no ponderados pero manteniendo las estructuras vectorial y matricial quemanteniacutean la eficienciaLas representaciones que utilizan arrays en Haskell son muy restrictivas pues soloadmiten vectores y matrices que se puedan indexar lo que hace muy complicadostodos los algoritmos que impliquen alguacuten cambio en los veacutertices de los grafos yademaacutes no permite trabajar con todos los tipos de veacutertices que pudieacuteramos desearDecidimos volver a cambiar la representacioacuten y esta vez nos decantamos por larepresentacioacuten de grafos como listas de aristas perdiendo en eficiencia pero ganandomucho en flexibilidad de escrituraPor uacuteltimo mis tutores sugirieron dar una representacioacuten de los grafos mediantesus matrices de adyacencia y comprobar la equivalencia de las definiciones que yahabiacutea hecho en otros moacutedulos con las dadas para esta representacioacuten Para ello he
120 Capiacutetulo 5 Apeacutendices
trabajado con la libreriacutea DataMatrix de Haskell
Bibliografiacutea
[1] J Alonso Temas de programacioacuten funcional Technical report Univ de Sevilla2015
[2] P Burzyn Complejidad computacional en problemas de modificacioacuten de aris-tas en grafos Technical report Univ de Buenos Aires
[3] K Claessen and J Hughes QuickCheckA Lightweight Tool for Random Tes-ting of Haskell Programs Technical report Chalmers University of Technology2000
[4] M Caacuterdenas Matemaacutetica discreta Technical report Univ de Sevilla 2015
[5] D de Matemaacuteticas El regalo de Cantor Technical report IES Matarrantildea deValderrobres 2009
[6] D de Aacutelgebra Aacutelgebra Baacutesica tema 1 Conjuntos Technical report Univ deSevilla 2015
[7] F Franco Aspectos algebraicos en Teoriacutea de Grafos Technical report Univ deSevilla 2016
[8] F Rabhi and G Lapalme Algorithms A functional programming approachAddison-Wesley Longman Publishing Co Inc Boston MA USA 1st edition1999
[9] P Vasconcelos Property Testing using QuickCheck Technical report Univer-sidade do Porto 2016
[10] Wikipedia Set (mathematics) Technical report Wikipedia La Enciclopedialibre 2016
[11] Wikipedia AnexoGaleriacutea de grafos Technical report Wikipedia La Enciclo-pedia libre 2016
[12] Wikipedia Teoriacutea de la complejidad computacional Technical report Wikipe-dia La Enciclopedia libre 2017
121
Iacutendice alfabeacutetico
Grafo 18 52adyacentes 53antiImagenRelacion 38aristaEn 53aristasCamino 88aristas 53automorfismos 87bipartitoCompleto 58biyecciones 47cardinal 22 31centro 103clasesEquivalencia 43combinaciones 25 34complementario 22 31completo 58componentesConexas1 97componentesConexas2 98componentesConexas3 98conjuntosIguales 30conjuntosIguales 21conjuntosVerticesDisjuntos 59conservaAdyacencia 78creaGrafo 52diametro 102distancia 93dominio 38eliminaArista 74eliminaLazos 74eliminaVertice 74elimina 19 28entorno 69esAisladoM 112
esAislado 69esAntisimetrica 41esAutomorfismo 86esBipartito 60esCamino 87esCerrado 94esCircuito 95esCompleto 77esConexo 100esFuncional 39esFuncion 43esGeodesica 94esInyectiva 45esIsomorfismo 81esLazo 69esReflexiva 40esRegular 70esRelacionEquivalencia 42esRelacionHomogenea 39esRelacionOrden 43esRelacion 37esSimetrica 41 111esSimple 70esSobreyectiva 45 46esSubconjuntoPropio 21 30esSubconjunto 20 29esSubgrafoMax 72esSubgrafoPropio 72esSubgrafo 72esTransitiva 41esUnitario 23 32esVacio 18 27
122
Iacutendice alfabeacutetico 123
estaRelacionado 40estanConectados 93excentricidades 102excentricidad 102funciones 44generaGrafo 54gradoM 113 114grado 69grafoAmistad 57grafoCiclo 56grafoCirculante 61grafoComplementario 77grafoEstrella 60grafoHeawood 64grafoMcGee 64grafoMoebiusCantor 67grafoNulo 55grafoPetersenGen 62grafoPetersen 66grafoRueda 61grafoSimple 110grafoThomson 63grafoTutteCoxeter 65grosor 104imagenConjunto 45imagenInversa 47imagenRelacion 38imagen 44imprimeMatriz 110inserta 18 27interseccion 33interseccion 24inversa 47isomorfismos 82isomorfos 82longitudCamino 88matrizAdyacencia 110minimoElemento 19 28morfismos 79
numeroArcosDeLongitud 92numeroCaminosDeLongitud 89numeroCaminosDeLongitugM 113numeroComponentesConexas 99numeroTriangulosM 114orden 68parDeVertices 91pertenece 19 28potencia 111productoCartesiano 34productoCartesiano 25prop_HavelHakimi 73prop_LemaApretonDeManos 73prop_completos 76prop_BipartitoMatriz 113prop_ConectadosRelEqui 97prop_ConexionIsomorfismo1 106prop_ConexionIsomorfismo2 106prop_ConexionIsomorfismo3 107prop_GradoMatriz 114prop_TriangulosMatriz 114prop_esAisladoMatriz 112prop_gradoMatriz 113prop_numeroCaminosMatriz 114prop_simetricaAdyacenciaCompleto 111prop_tamantildeoMatriz 112prop_todosArcosBA 92radio 103rango 38secuenciaGrados 71secuenciaGrafica 71sinRepetidos 19 29sonIncidentes 68sumaArista 75sumaGrafos 76 77sumaVertice 75tamantildeoM 111tamantildeo 68todosArcosBA 91
124 Iacutendice alfabeacutetico
todosArcos 90todosCaminos 88todosCiclos 96triangulos 94unionConjuntos 23 32unionGeneral 24 33vacio 18 27valenciaMax 70valenciaMin 70variaciones 26 35verticesCamino 88vertices 53
6 Iacutendice general
4 Matrices asociadas a grafos 109
41 Generador de grafos simples 109
42 Matrices de adyacencia 110421 Definicioacuten y propiedades 110422 Propiedades baacutesicas de las matrices 111423 Propiedades de las matrices de adyacencia 111424 Caminos y arcos 113
5 Apeacutendices 117
51 Sistemas utilizados 117
52 Mapa de decisiones de disentildeo en conjuntos 119
53 Mapa de decisiones de disentildeo en grafos 119
Bibliografiacutea 121
Indice de definiciones 121
Agradecimientos
Quisiera agradecer a todas las personas que me han apoyado y prestado sus co-nocimientos a lo largo de estos cuatro antildeos del grado Gracias a ellos el esfuerzo hamerecido la pena
En primer lugar me gustariacutea destacar a Mariacutea Joseacute Hidalgo Doblado y Joseacute An-tonio Alonso Jimeacutenez mi tutores en este Trabajo de Fin de Grado Les agradezco detodo corazoacuten la constancia y la atencioacuten que me han brindado a pesar de las dificul-tades que supone realizar el proyecto durante un curso en el que estoy disfrutandola oportunidad de la movilidad internacional Erasmus Son para miacute un referente y unclaro ejemplo de lo que se puede conseguir con esfuerzo y trabajo en equipo
Seguidamente expresar mi gratitud al resto de profesores y trabajadores de la Uni-versidad de Sevilla especialmente a aquellos que se esfuerzan por mejorar la institu-cioacuten diacutea a diacutea
Quiero agradecer tambieacuten este trabajo a mi familia en especial a mis padres que meapoyaron desde el principio cuando tomeacute la decisioacuten de cambiar de carrera y siemprehan intentado brindarnos a mi hermana y a miacute con lo mejor
Finalmente a mis amigos y compantildeeros que han hecho de esta primera etapa uni-versitaria un capiacutetulo de mi vida lleno de bonitos recuerdos En especial a Pedro conquien he tenido la suerte de compartir todo
Muchas gracias a todos
7
8 Iacutendice general
Abstract
Discrete mathematics is characterized as the branch of mathematics dealing withfinite and numerable sets Concepts and notations from discrete mathematics are use-ful in studying and describing objects and real-life problems In particular the graphtheory has numerous applications in logistics
Throughout this project some of the knowlegde adquired from the course ldquoMa-temaacutetica Discretardquo will be given a computational implementation The code will bewritten in Haskell language and a free version of it will be available in GitHub underthe name MDenHaskell The work will focus on the graph theory and will provide so-me examples and algorithms in order to give an introduction of it and how it can beimplemented in Haskell
At first two chapters will be presented as a gentle reminder of basic concepts rela-ted to the set theory and the relations that can be established among them The thirdchapter will introduce the main topic graph theory with different representationsdefinitions and examples on graphs It will go through aspects such as morphismconnectivity and paths in graphs Finally some properties and advantages of workingwith adjacency matrices will be presented in the fourth chapter
This project leaves the door open for the community of programmers to continueand improve it It can be used as a self-learning tool as well as to make calculationsthat by hand would be tedious
9
10 Iacutendice general
Introduccioacuten
El objetivo del trabajo es la implementacioacuten de algoritmos de matemaacutetica discretaen Haskell Los puntos de partida son
los temas de la asignatura ldquoMatemaacutetica discretardquo ([4])los temas de la asignatura ldquoInformaacuteticardquo ([1])el capiacutetulo 7 del libro ldquoAlgorithms A functional programming approachrdquo ([8]) yel artiacuteculo ldquoGraph theoryrdquo ([11]) de la WikipediaHaskell es un lenguaje de programacioacuten funcional desarrollado en los uacuteltimos antildeos
por la comunidad de programadores con la intencioacuten de usarlo como instrumentopara la ensentildeanza de programacioacuten funcional La motivacioacuten de este desarrollo eshacer el anaacutelisis y disentildeo de programas maacutes simple y permitir que los algoritmos seanfaacutecilmente adaptables a otros lenguajes de programacioacuten funcionales
En comparacioacuten con otros lenguajes de programacioacuten imperativos la sintaxis deHaskell permite definir funciones de forma maacutes clara y compacta En Haskell las fun-ciones se consideran valores al mismo nivel que los tipos enteros o cadenas en cual-quier lenguaje Por ello al igual que es habitual que en todos los lenguajes una funcioacutenreciba datos de entrada (de tipo entero flotante cadena etc) y devuelva datos (de losmismos tipos) en los lenguajes funcionales una funcioacuten puede recibir como dato deentrada una funcioacuten y devolver otra funcioacuten como salida que puede ser construida apartir de sus entradas y por operaciones entre funciones como la composicioacuten Estacapacidad nos proporciona meacutetodos maacutes potentes para construir y combinar los di-versos moacutedulos de los que se compone un programa Por ejemplo emulando la formade operar sobre funciones que habitualmente se usa en matemaacuteticas
La matemaacutetica discreta consiste en el estudio de las propiedades de los conjuntosfinitos o infinitos numerables lo que hace posible su directa implementacioacuten compu-tacional En particular la asignatura ldquoMatemaacutetica Discretardquo del grado se centra enestudiar propiedades y algoritmos de la combinatoria y la teoriacutea de grafos A lo largodel trabajo se implementaraacuten en Haskell definiciones y algoritmos con los que ya seha tenido una primera aproximacioacuten teoacuterica durante el grado
Los dos primeros capiacutetulos del trabajo sientan la base que permitiraacute en los dos si-guientes una aproximacioacuten a la teoriacutea de grafos En el primero se hace una introduc-cioacuten a la teoriacutea de conjuntos y se dan dos posibles representaciones de conjuntos con
11
12 Iacutendice general
las que trabajar en Haskell En el segundo se presentan los conceptos de ldquorelacioacutenrdquo yde ldquofuncioacutenrdquo que al igual que los conjuntos son necesarios para definir aplicacionesde los grafos Su redaccioacuten sigue la liacutenea de la primera parte de la asignatura ldquoAacutelgebraBaacutesicardquo del grado
En el tercer capiacutetulo del trabajo se hace una introduccioacuten a la teoriacutea de grafos Enprimer lugar se dan una representacioacuten con la que trabajar en Haskell y un generadorde grafos que permitiraacute comprobar propiedades con QuickCheck Seguidamente sepresenta una galeriacutea de grafos conocidos que se utilizaraacuten como ejemplos para lasdefiniciones y los algoritmos de las secciones siguientes Las primeras seraacuten algunasdeficiones baacutesicas y despueacutes se trataraacuten los conceptos de ldquomorfismosrdquo ldquocaminosrdquo yldquoconectividadrdquo en grafos
Por uacuteltimo en el cuarto capiacutetulo se da una representacioacuten de los grafos a traveacutesde su matriz de adyacencia Se implementaraacuten algunos de los resultados que JavierFranco Galviacuten expuso en su Trabajo Fin de Grado Aspectos algebraicos en teoriacutea de grafosy se comprueba que concuerdan con el desarrollo hecho en el capiacutetulo anterior
Cabe destacar el trabajo con los diferentes sistemas y programas que se han utiliza-do a lo largo del proyecto
Ubuntu como sistema operativoel editor de textos Emacs que ha permitido el uso de Haskell literario para la redaccioacutendel trabajoel paquete de produccioacuten de graacuteficos vectoriales Tikz de LATEX mediante el que seha dado la representacioacuten graacutefica de los ejemplos de grafosGitHub como sistema remoto de control de versionesy DocTest como sistema de validacioacuten de moacutedulosSe va a hacer una breve introduccioacuten los sistemas maacutes destacados
Ubuntu
Ubuntu es un sistema operativo creado a partir de GNULinux con la intencioacuten dehacer una versioacuten de este maacutes sencilla de manejar y que permitiera acceso al soft-ware libre para todo el mundo por igual La primera distribuioacuten oficial de Ubuntufue la versioacuten 410 y tuvo lugar en 2004 Desde entonces el proyecto ha captadola atencioacuten de miles de entusiastas del software libre que han querido unirse a lacomunidad UbuntuSoftware libre significa que los usuarios tienen la libertad de ejecutar copiar distri-buir estudiar modificar y mejorar el software Es una cuestioacuten de libertad no deprecio Para entender el concepto debe pensarse en laquolibreraquo como en laquolibertad deexpresioacutenraquo
Iacutendice general 13
Maacutes precisamente software libre significa que los usuarios de un programa tienenlas cuatro libertades esencialesbull La libertad de ejecutar el programa como lo desee con cualquier propoacutesito (liber-
tad 0)bull La libertad de estudiar el funcionamiento del programa y adaptarlo a sus necesi-
dades (libertad 1) El acceso al coacutedigo fuente es un prerrequisito para estobull La libertad de redistribuir copias para ayudar a los demaacutes (libertad 2)bull La libertad de mejorar el programa y de publicar las mejoras de modo que toda la
comunidad se beneficie (libertad 3) El acceso al coacutedigo fuente es un prerrequisitopara esto
Debido a la evolucioacuten de la tecnologiacutea y del uso de la red estas libertades son ahoraauacuten maacutes importantes que en el pasadoLo que diferencia a Ubuntu de otros sistemas ofrecidos por Linux es que los equiposcomercial y comunitario colaboran juntos en el desarrollo de un uacutenico proyecto Lasnovedades y avances estaacuten libremente a disposicioacuten de todos los usuarios y sonvoluntarios quienes se hacen cargo de los elementos maacutes criacuteticos del trabajoEn la paacutegina web de Ubuntu 1 se puede obtener maacutes informacioacuten acerca del siste-ma y en la paacutegina web de GNU 2 se puede encontrar maacutes informacioacuten acerca delsoftware libre
Haskell literario con Emacs
Haskell es un lenguaje de programacioacuten puramente funcional basado en lambdacalculus 3 Se caracteriza por sus programas concisos un potente sistema de tiposel trabajo con listas funciones recursivas y de orden superior y por tener evaluacioacutenperezosaTener que escribir coacutedigos largos y complicados hace la tarea del programador muycostosa Los lenguajes de programacioacuten funcional como Haskell lo intentan hacenmaacutes sencillo Aunque no se esteacute en la posicioacuten de usar Haskell en un proyecto de-terminado aprender su razonamiento puede ayudar a mejorar en cualquier otrolenguajeA la hora de elaborar la memoria de un proyecto en el que se estaacute utilizando Haskellla posibilidad de escribir coacutedigo y texto en un formato de calidad otorga globali-dad al trabajo El editor Emacs de GNU permite en particular trabajar en paralelocon Haskell y con Latex El trabajar con Haskell literario ha ayudado a detectar ysolventar errores maacutes raacutepido asiacute como a dar una estructura consolidada al trabajo
1httpswwwubuntucom2httpswwwgnuorg3httpsenwikipediaorgwikiLambda_calculus
14 Iacutendice general
En la paacutegina web del Departamento de Computacioacuten 4 se puede encontrar maacutesinformacioacuten acerca de Haskell y Emacs
GitHub
GitHub es una plataforma de desarrollo colaborativo que permite alojar proyectosusando el control de versiones de Git El trabajo con un sistema como este hacemucho maacutes faacutecil el trabajo en grupo pues cada individuo puede trabajar desde suordenador propio en paralelo a los demaacutes y remotamente ir actualizando el proyectosin perder la posibilidad de restaurarlo a una versioacuten anteriorEn particular GitHub ha sido una excelente herramienta de control de este TrabajoFin de Grado pues los tutores han podido seguir en cada momento el trabajo rea-lizado detectar faacutecilmente los errores y hacer modificaciones directamente sobre eldocumentoEl compantildeero Eduardo Paluzo Hidalgo hace en su Trabajo Fin de Grado una pe-quentildea introduccioacuten al uso de Github y a la instalacioacuten de magit en una distribucioacutenUbuntu muy recomendable para todos aquellos (especialmente los maacutes principian-tes) que tengan intereacutes en trabajar con este sistemaSe puede encontrar maacutes informacioacuten acerca de esta plataforma en la paacutegina web deGit 5
DocTest
DocTest para Haskell es un programa de verificacioacuten dinaacutemica de ejemplos Si se si-gue un determinado formato a la hora de escribir los ejemplos para las funciones deun documento en Haskell Doctest se encarga de comprobar que los ejemplos seancorrectos Estas validaciones han resultado claves en la realizacioacuten del trabajo puesalgunas definiciones han sido modificadas de forma casi continua y este proyectoespecialmente se basa en lo anterior para poder seguir construyendoSu uso es muy sencillo una vez instalado el correspondiente paquete y escrito losejemplos en el formato requerido solo hay que ejecutar el programa desde la consoladando como argumento el fichero que se desea validarSe puede enontrar maacutes informaioacuten acerca del programa y de coacutemo descargarlo ensu repositorio de GitHub 6
4httpwwwcsuses~jalonsocursosi1m-16temastema-1html5httpsgit-scmcom6httpsgithubcomsoldoctest
Capiacutetulo 1
Conjuntos
El concepto de conjunto aparece en todos los campos de las Matemaacuteticas pero iquestqueacutedebe entenderse por eacutel La Teoriacutea de conjuntos fue introducida por Georg Cantor(1845-1917) desde 1869 Cantor ejercioacute como profesor en la Universidad de Halley entre 1879 y 1884 publicoacute una serie de seis artiacuteculos en el Mathematische Annalenen los que hizo una introduccioacuten baacutesica a la teoriacutea de conjuntos En su Beitraumlge zurBegruumlndung der transfiniten Mengenlehre Cantor dio la siguiente definicioacuten de con-junto
Figura 11 Fragmento del texto traducido al ingleacutes en el que Cantor da la definicioacuten de conjunto
laquoDebemos entender por ldquoconjuntordquo (Menge) cualquier coleccioacuten vista co-mo un todo (Zusammenfassung zu einem Ganzen) M de objetos separa-dos y bien definidos m de nuestra intuicioacuten o pensamiento Estos objetosson los ldquoelementosrdquo de Mraquo
Felix Hausdorff en 1914 dice laquoun conjunto es una reunioacuten de cosas que constitu-yen una totalidad es decir una nueva cosaraquo y antildeade laquoesto puede difiacutecilmente seruna definicioacuten pero sirve como demostracioacuten expresiva del concepto de conjunto atraveacutes de conjuntos sencillos como el conjunto de habitantes de una ciudad o el deaacutetomos de Hidroacutegeno del SolraquoUn conjunto asiacute definido no tiene que estar compuesto necesariamente de elementoshomogeacuteneos y ademaacutes da lugar a cuestiones filosoacuteficas como si podemos llamar
15
16 Capiacutetulo 1 Conjuntos
conjunto a aquel que no posee ninguacuten elemento Matemaacuteticamente conviene aceptarsolo elementos que compartan alguna propiedad y definir el conjunto vaciacuteo comoaquel que no tiene elemento algunoEl gran meacuterito de Cantor fue considerar conjuntos transfinitos (que tiene infinitoselementos) concepto inaudito hasta avanzado el siglo XIX hablar del cardinal de unconjunto como el nuacutemero de sus elementos y hablar de conjuntos equivalentes cuan-do puede establecerse una biyeccioacuten entre ellos ideas ya apuntadas por Bolzanoquien se centroacute demasiado en el aspecto filosoacutefico sin llegar a formalizar sus ideas
A lo largo de la seccioacuten haremos una pequentildea introduccioacuten a la Teoriacutea de Conjun-tos presentando formalmente sus conceptos maacutes importantes A la hora de elaborarel contenido se han utilizado los siguientes recursos bibliograacuteficosbull el primer tema de la asignatura ldquoAacutelgebra baacutesicardquo ([6])bull los temas de la asignatura ldquoInformaacuteticardquo ([1])bull el artiacuteculo de la Wikipedia ldquoSet (mathematics)rdquo ([10] ylowast el artiacuteculo ldquoEl regalo de Cantorrdquo ([5])
11 El TAD de los conjuntos
En la presente seccioacuten se definen las operaciones baacutesicas necesarias para trabajarcon conjuntos en un lenguaje funcional En nuestro caso el lenguaje que utilizare-mos seraacute Haskell Daremos la signatura del Tipo Abstracto de Dato (TAD) de losconjuntos y daremos algunos ejemplos de posibles representaciones de conjuntoscon las que podriacuteamos trabajarA continuacioacuten presentamos las operaciones definidas en el TAD de los conjuntos
vacio Conj a
inserta Eq a =gt a -gt Conj a -gt Conj a
elimina Eq a =gt a -gt Conj a -gt Conj a
pertenece Eq a =gt Conj a -gt a -gt Bool
esVacio Conj a -gt Bool
minimoElemento Ord a =gt Conj a -gt a
dondebull (vacio) es el conjunto vaciacuteobull (inserta x c) es el conjunto obtenido antildeadiendo el elemento x al conjunto cbull (elimina x c) es el conjunto obtenido eliminando el elemento x del conjunto cbull (pertenece x c) se verifica si x pertenece al conjunto cbull (esVacio c) se verifica si c no tiene ninguacuten elementobull (minimoElemento c) devuelve el miacutenimo elemento del conjunto c
12 Representaciones de conjuntos 17
Hemos de tener en cuenta que a la hora de crear un nuevo tipo de dato con el querepresentar a los conjuntos este debe ser compatible con la entidad matemaacutetica querepresenta
Estas son algunas de las posibles representaciones con las que podriacuteamos trabajarcon conjuntos en Haskellbull En primer lugar podemos trabajar con la libreriacutea DataSet en este caso la imple-
mentacioacuten del tipo de dato Set estaacute basado en aacuterboles binarios balanceadosbull Por otra parte podemos definir un nuevo tipo Cj xs con el que trabajar con con-
juntos como listas no ordenadas con duplicados como listas no ordenadas sinduplicados o como listas ordenadas sin duplicadosbull Otra opcioacuten seriacutea trabajar directamente con conjuntos como listas para ello de-
bemos ignorar las repeticiones y el orden con vista a la igualdad de conjuntosbull Los conjuntos que soacutelo contienen nuacutemeros (de tipo Int) entre 0 y nminus 1 se pueden
representar como nuacutemeros binarios con n bits donde el bit i(0 le i lt n) es 1 syssel nuacutemero i pertenece al conjunto
Nota 111 Las funciones que aparecen en la especificacioacuten del TAD no dependende la representacioacuten que elijamos
12 Representaciones de conjuntos
121 Conjuntos como listas ordenadas sin repeticioacuten
En el moacutedulo ConjuntosConListasOrdenadasSinRepeticion se definen las funcio-nes del TAD de los conjuntos dando su representacioacuten como listas ordenadas sinrepeticioacuten
module ConjuntosConListasOrdenadasSinRepeticion
( Conj
vacio
inserta
listaAConjunto
elimina
pertenece
esVacio
minimoElemento
sinRepetidos
esUnitario
esSubconjunto
conjuntosIguales
esSubconjuntoPropio
complementario
18 Capiacutetulo 1 Conjuntos
cardinal
unionConjuntos
unionGeneral
interseccion
productoCartesiano
combinaciones
variacionesR
) where
En las definiciones del presente moacutedulo se usaraacuten algunas funciones de la libreriacuteaDataList
Vamos a definir un nuevo tipo de dato (Conj a) que representa a los conjuntoscomo listas ordenadas sin repeticioacuten
type Conj a = [a]
Las funciones baacutesicas que definiremos a partir de este tipo coincidiraacuten con las indi-cadas en el TAD de los conjuntosbull (vacio) es el conjunto vaciacuteo
-- | Ejemplo
-- gtgtgt vacio
-- []
vacio Conj a
vacio = []
bull (inserta x c) es el conjunto obtenido antildeadiendo el elemento x al conjunto c
-- | Ejemplo
-- gtgtgt inserta 5 vacio
-- [5]
-- gtgtgt foldr inserta vacio [2211242]
-- [124]
inserta Ord a =gt a -gt Conj a -gt Conj a
inserta x [] = [x]
inserta x ys
| pertenece ys x = ys
| otherwise = insert x ys
bull (listaAConjunto xs) devuelve el conjunto cuyos elementos son los de la lista xs
-- | Ejemplo
-- gtgtgt listaAConjunto [2211242]
-- [124]
listaAConjunto Ord a =gt [a] -gt Conj a
listaAConjunto = sort nub
bull (esVacio c) se verifica si c es el conjunto vaciacuteo
12 Representaciones de conjuntos 19
-- | Ejemplos
-- gtgtgt esVacio (listaAConjunto [25137532190])
-- False
-- gtgtgt esVacio vacio
-- True
esVacio Conj a -gt Bool
esVacio = null
bull (pertenece x c) se verifica si x es un elemento del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt pertenece c1 3
-- True
-- gtgtgt pertenece c1 4
-- False
pertenece Ord a =gt Conj a -gt a -gt Bool
pertenece ys x =
x == head (dropWhile (ltx) ys)
bull (elimina x c) es el conjunto obtenido eliminando el elemento x del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt elimina 3 c1
-- [012579]
-- gtgtgt elimina 4 c1
-- [0123579]
elimina Ord a =gt a -gt Conj a -gt Conj a
elimina x ys = us ++ dropWhile (==x) vs
where (usvs) = span (ltx) ys
bull (minimoElemento c) devuelve el miacutenimo elemento del conjunto c
-- | Ejemplos
-- gtgtgt minimoElemento (listaAConjunto [25137532190])
-- 0
-- gtgtgt minimoElemento (listaAConjunto ([ae] ++ [AE]))
-- A
minimoElemento Ord a =gt Conj a -gt a
minimoElemento = head
122 Definicioacuten de conjunto
Nota 121 Al trabajar con la representacioacuten de conjuntos como listas en Haskellhemos de cuidar que los ejemplos con los que trabajemos no tengan elementos re-petidos La funcioacuten (sinRepetidos xs) se verifica si la lista xs no tiene ninguacuten ele-mento repetido
20 Capiacutetulo 1 Conjuntos
-- | Ejemplos
-- gtgtgt sinRepetidos []
-- True
-- gtgtgt sinRepetidos [1231]
-- False
sinRepetidos Eq a =gt [a] -gt Bool
sinRepetidos xs = nub xs == xs
Los conjuntos pueden definirse de manera expliacutecita citando todos sus elementosentre llaves de manera impliacutecita dando una o varias caracteriacutesticas que determi-nen si un objeto dado estaacute o no en el conjunto Por ejemplo los conjuntos 1 2 3 4y x isinN|1 le x le 4 son el mismo definido de forma explicita e impliacutecita respecti-vamente
Nota 122 La definicioacuten impliacutecita es necesaria cuando el conjunto en cuestioacuten tieneuna cantidad infinita de elementos En general los conjuntos se notaraacuten con letrasmayuacutesculas A B y los elementos con letras minuacutesculas a b
Cuando trabajamos con conjuntos concretos siempre existe un contexto donde esosconjuntos existen Por ejemplo si A = minus1 1 2 3 4 5 y B = x|x isin Nes par elcontexto donde podemos considerar A y B es el conjunto de los nuacutemeros enterosZ En general a este conjunto se le denomina conjunto universal De una forma algomaacutes precisa podemos dar la siguiente definicioacuten
Definicioacuten 121 El conjunto universal que notaremos por U es un conjunto del queson subconjuntos todos los posibles conjuntos que originan el problema que tratamos
123 Subconjuntos
Definicioacuten 122 Dados dos conjuntos A y B si todo elemento de A es a su vez elementode B diremos que A es un subconjunto de B y lo notaremos A sube B En caso contrario senotaraacute A 6sube B
La funcioacuten (esSubconjunto c1 c2) se verifica si c1 es un subconjunto de c2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
-- gtgtgt c1 `esSubconjunto` c2
-- True
-- gtgtgt c1 `esSubconjunto` vacio
-- False
-- gtgtgt vacio `esSubconjunto` c2
12 Representaciones de conjuntos 21
-- True
-- gtgtgt c3 `esSubconjunto` c4
-- True
-- gtgtgt c2 `esSubconjunto` c1
-- False
esSubconjunto Ord a =gt Conj a -gt Conj a -gt Bool
esSubconjunto [] _ = True
esSubconjunto (xxs) ys =
x == head vs ampamp esSubconjunto xs (tail vs)
where (usvs) = span (ltx) ys
124 Igualdad de conjuntos
Definicioacuten 123 Dados dos conjuntos A y B diremos que son iguales si tienen los mismoselementos es decir si se verifica que A sube B y B sube A Lo notaremos A = B
La funcioacuten (conjuntosIguales c1 c2) se verifica si los conjuntos xs y ys son igua-les
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
-- gtgtgt let c5 = listaAConjunto [4444442]
-- gtgtgt conjuntosIguales c1 c2
-- False
-- gtgtgt conjuntosIguales c3 c4
-- True
-- gtgtgt conjuntosIguales c1 c5
-- True
conjuntosIguales Ord a =gt Conj a -gt Conj a -gt Bool
conjuntosIguales = (==)
125 Subconjuntos propios
Definicioacuten 124 Los subconjuntos de A distintos del empty y del mismo A se denominansubconjuntos propios de A
La funcioacuten (esSubconjuntoPropio c1 c2) se verifica si c1 es un subconjunto pro-pio de c2
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt esSubconjuntoPropio u u
22 Capiacutetulo 1 Conjuntos
-- False
-- gtgtgt esSubconjuntoPropio c1 u
-- True
esSubconjuntoPropio Ord a =gt Conj a -gt Conj a -gt Bool
esSubconjuntoPropio c1 c2 =
not (null c1) ampamp esSubconjunto c1 c2 ampamp c1 = c2
126 Complementario de un conjunto
Definicioacuten 125 Dado un conjunto A se define el complementario de A que notaremospor A como
A = x|x isin U x 6isin A
La funcioacuten (complementario u c) devuelve el complementario del conjunto c y enel universo u
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt let c2 = listaAConjunto [14689]
-- gtgtgt complementario u c1
-- [14689]
-- gtgtgt complementario u u
-- []
-- gtgtgt complementario u vacio
-- [123456789]
-- gtgtgt complementario u c2
-- [2357]
complementario Ord a =gt Conj a -gt Conj a -gt Conj a
complementario [] _ = []
complementario xs [] = xs
complementario (xxs) (yys)
| x lt y = x complementario xs (yys)
| otherwise = complementario xs ys
127 Cardinal de un conjunto
Definicioacuten 126 Dado un conjunto finito A denominaremos cardinal de A al nuacutemero deelementos que tiene y lo notaremos |A|
La funcioacuten (cardinal xs) devuelve el cardinal del conjunto xs
-- | Ejemplos
-- gtgtgt cardinal vacio
-- 0
-- gtgtgt cardinal (listaAConjunto [110])
12 Representaciones de conjuntos 23
-- 10
-- gtgtgt cardinal (listaAConjunto chocolate)
-- 7
cardinal Ord a =gt Conj a -gt Int
cardinal = length
128 Conjunto unitario
Definicioacuten 127 Un conjunto con un uacutenico elemento se denomina unitario
Nota 123 Notemos que si X = x es un conjunto unitario debemos distinguirentre el conjunto X y el elemento x
La funcioacuten (esUnitario c) se verifica si el conjunto c es unitario
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto (take 10 (repeat 5))
-- gtgtgt let c2 = listaAConjunto valverde
-- gtgtgt let c3 = listaAConjunto coco
-- gtgtgt esUnitario c1
-- True
-- gtgtgt esUnitario c2
-- False
-- gtgtgt esUnitario c2
-- False
esUnitario Ord a =gt Conj a -gt Bool
esUnitario c =
c == take 1 c
129 Unioacuten de conjuntos
Definicioacuten 128 Dados dos conjuntos A y B se define la unioacuten de A y B notado A cup Bcomo el conjunto formado por aquellos elementos que pertenecen al menos a uno de los dosconjuntos A oacute B es decir
A cup B = x | x isin A or x isin B
La funcioacuten (unionConjuntos c1 c2) devuelve la unioacuten de los conjuntos xs y ys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [139]
-- gtgtgt let c2 = listaAConjunto [249]
-- gtgtgt unionConjuntos c1 c2
-- [123456789]
unionConjuntos Ord a =gt Conj a -gt Conj a -gt Conj a
unionConjuntos [] [] = []
24 Capiacutetulo 1 Conjuntos
unionConjuntos [] ys = ys
unionConjuntos xs [] = xs
unionConjuntos (xxs) (yys)
| x lt y = x unionConjuntos xs (yys)
| x == y = x unionConjuntos xs ys
| otherwise = y unionConjuntos (xxs) ys
Definicioacuten 129 Dada una familia de conjuntos Ai con i isin I se define la unioacuten ge-neral de los conjuntos Ai notado
⋃iisinI Ai como el conjunto formado por aquellos elementos
que pertenecen al menos a uno de los conjuntos de la familia es decir
⋃iisinI
Ai = x | x isin Ai foralli isin I
La funcioacuten (unionGeneral xss) devuelve la unioacuten general de la familia de conjun-tos de la lista xss
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1415]
-- gtgtgt let c2 = listaAConjunto [2515]
-- gtgtgt let c3 = listaAConjunto [3615]
-- gtgtgt unionGeneral [c1c2c3]
-- [123456789101112131415]
unionGeneral Ord a =gt [Conj a] -gt Conj a
unionGeneral = foldr unionConjuntos vacio
1210 Interseccioacuten de conjuntos
Definicioacuten 1210 Dados dos conjuntos A y B se define la interseccioacuten de A y B notadoA cap B como el conjunto formado por aquellos elementos que pertenecen a cada uno de losdos conjuntos A y B es decir
A cap B = x | x isin A and x isin B
La funcioacuten (interseccion c1 c2) devuelve la interseccioacuten de los conjuntos c1 yc2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1320]
-- gtgtgt let c2 = listaAConjunto [2420]
-- gtgtgt let c3 = listaAConjunto [2430]
-- gtgtgt let c4 = listaAConjunto [4830]
-- gtgtgt interseccion c1 c2
-- []
-- gtgtgt interseccion c3 c4
12 Representaciones de conjuntos 25
-- [481216202428]
interseccion Ord a =gt Conj a -gt Conj a -gt Conj a
interseccion (xxs) (yys)
| x lt y = interseccion xs (yys)
| x gt y = interseccion (xxs) ys
| otherwise = x interseccion xs ys
interseccion _ _ = []
1211 Producto cartesiano
Definicioacuten 1211 El producto cartesiano 1 de dos conjuntos A y B es una operacioacutensobre ellos que resulta en un nuevo conjunto Atimes B que contiene a todos los pares ordenadostales que la primera componente pertenece a A y la segunda pertenece a B es decir
Atimes B = (a b) | a isin A b isin B
La funcioacuten (productoCartesiano c1 c2) devuelve el producto cartesiano de xs eys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [31]
-- gtgtgt let c2 = listaAConjunto [247]
-- gtgtgt productoCartesiano c1 c2
-- [(12)(14)(17)(32)(34)(37)]
-- gtgtgt productoCartesiano c2 c1
-- [(21)(23)(41)(43)(71)(73)]
productoCartesiano (Ord a Ord b) =gt Conj a -gt Conj b -gt Conj (ab)
productoCartesiano xs ys=
listaAConjunto [(xy) | x lt- xs y lt- ys]
1212 Combinaciones
Definicioacuten 1212 Las combinaciones de un conjunto S tomados en grupos de n son todoslos subconjuntos de S con n elementos
La funcioacuten (combinaciones n xs) devuelve las combinaciones de los elementos dexs en listas de n elementos
-- | Ejemplos
-- gtgtgt combinaciones 3 [ad]
-- [abcabdacdbcd]
-- gtgtgt combinaciones 2 [248]
-- [[24][26][28][46][48][68]]
1httpsenwikipediaorgwikiCartesian_product
26 Capiacutetulo 1 Conjuntos
combinaciones Integer -gt [a] -gt [[a]]
combinaciones 0 _ = [[]]
combinaciones _ [] = []
combinaciones k (xxs) =
[xys | ys lt- combinaciones (k-1) xs] ++ combinaciones k xs
1213 Variaciones con repeticioacuten
Definicioacuten 1213 Las variaciones con repeticioacuten de m elementos tomados en grupos den es el nuacutemero de diferentes nndashtuplas de un conjunto de m elementos
La funcioacuten (variacionesR n xs) devuelve las variaciones con con repeticioacuten de loselementos de xs en listas de n elementos
-- | Ejemplos
-- gtgtgt variacionesR 3 [ab]
-- [aaaaababaabbbaababbbabbb]
-- gtgtgt variacionesR 2 [235]
-- [[22][23][25][32][33][35][52][53][55]]
variacionesR Int -gt [a] -gt [[a]]
variacionesR _ [] = [[]]
variacionesR 0 _ = [[]]
variacionesR k us =
[uvs | u lt- us vs lt- variacionesR (k-1) us]
1214 Conjuntos como listas sin repeticioacuten
En el moacutedulo ConjuntosConListas se definen las funciones del TAD de los conjun-tos dando su representacioacuten como listas sin elementos repetidos
module ConjuntosConListas
( Conj
vacio
inserta
listaAConjunto
elimina
pertenece
esVacio
minimoElemento
sinRepetidos
esUnitario
esSubconjunto
conjuntosIguales
esSubconjuntoPropio
complementario
cardinal
12 Representaciones de conjuntos 27
unionConjuntos
unionGeneral
interseccion
productoCartesiano
combinaciones
variacionesR
) where
En las definiciones del presente moacutedulo se usaraacuten algunas funciones de la libreriacuteaDataList
Vamos a definir un nuevo tipo de dato (Conj a) que representa a los conjuntoscomo listas sin elementos repetidos
type Conj a = [a]
Las funciones baacutesicas que definiremos a partir de este tipo coincidiraacuten con las indi-cadas en el TAD de los conjuntosbull (vacio) es el conjunto vaciacuteo
-- | Ejemplo
-- gtgtgt vacio
-- []
vacio Conj a
vacio = []
bull (inserta x c) es el conjunto obtenido antildeadiendo el elemento x al conjunto c
-- | Ejemplo
-- gtgtgt inserta 5 vacio
-- [5]
-- gtgtgt foldr inserta vacio [2211242]
-- [142]
inserta Eq a =gt a -gt Conj a -gt Conj a
inserta x [] = [x]
inserta x ys | elem x ys = ys
| otherwise = xys
bull (listaAConjunto xs) devuelve el conjunto cuyos elementos son los de la lista xs
-- | Ejemplo
-- gtgtgt listaAConjunto [2211242]
-- [214]
listaAConjunto Eq a =gt [a] -gt Conj a
listaAConjunto = nub
bull (esVacio c) se verifica si c es el conjunto vaciacuteo
-- | Ejemplos
-- gtgtgt esVacio (listaAConjunto [25137532190])
-- False
28 Capiacutetulo 1 Conjuntos
-- gtgtgt esVacio vacio
-- True
esVacio Conj a -gt Bool
esVacio = null
bull (pertenece x c) se verifica si x es un elemento del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt pertenece 3 c1
-- True
-- gtgtgt pertenece 4 c1
-- False
pertenece Eq a =gt a -gt Conj a -gt Bool
pertenece = elem
bull (elimina x c) es el conjunto obtenido eliminando el elemento x del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt elimina 3 c1
-- [251790]
-- gtgtgt elimina 4 c1
-- [2513790]
elimina Eq a =gt a -gt Conj a -gt Conj a
elimina = delete
bull (minimoElemento c) devuelve el miacutenimo elemento del conjunto c
-- | Ejemplos
-- gtgtgt minimoElemento (listaAConjunto [25137532190])
-- 0
-- gtgtgt minimoElemento (listaAConjunto ([ae] ++ [AE]))
-- A
minimoElemento Ord a =gt Conj a -gt a
minimoElemento = minimum
1215 Definicioacuten de conjunto
Definicioacuten 1214 Llamaremos conjunto a una coleccioacuten de objetos que llamaremos ele-mentos distintos entre siacute y que comparten una propiedad Para que un conjunto esteacute biendefinido debe ser posible discernir si un objeto arbitrario estaacute o no en eacutel
Si el elemento a pertenece al conjunto A escribiremos a isin A En caso contrarioescribiremos a 6isin A
Nota 124 En Haskell para poder discernir si un objeto arbitrario pertenece a unconjunto se necesita que su tipo pertenezca a la clase Eq
12 Representaciones de conjuntos 29
Nota 125 Al trabajar con la representacioacuten de conjuntos como listas en Haskellhemos de cuidar que los ejemplos con los que trabajemos no tengan elementos re-petidos La funcioacuten (sinRepetidos xs) se verifica si la lista xs no tiene ninguacuten ele-mento repetido
-- | Ejemplos
-- gtgtgt sinRepetidos []
-- True
-- gtgtgt sinRepetidos [1231]
-- False
sinRepetidos Eq a =gt [a] -gt Bool
sinRepetidos xs = nub xs == xs
Los conjuntos pueden definirse de manera expliacutecita citando todos sus elementosentre llaves de manera impliacutecita dando una o varias caracteriacutesticas que determi-nen si un objeto dado estaacute o no en el conjunto Por ejemplo los conjuntos 1 2 3 4y x isinN|1 le x le 4 son el mismo definido de forma explicita e impliacutecita respecti-vamente
Nota 126 La definicioacuten impliacutecita es necesaria cuando el conjunto en cuestioacuten tieneuna cantidad infinita de elementos En general los conjuntos se notaraacuten con letrasmayuacutesculas A B y los elementos con letras minuacutesculas a b
Cuando trabajamos con conjuntos concretos siempre existe un contexto donde esosconjuntos existen Por ejemplo si A = minus1 1 2 3 4 5 y B = x|x isin Nes par elcontexto donde podemos considerar A y B es el conjunto de los nuacutemeros enterosZ En general a este conjunto se le denomina conjunto universal De una forma algomaacutes precisa podemos dar la siguiente definicioacuten
Definicioacuten 1215 El conjunto universal que notaremos por U es un conjunto del queson subconjuntos todos los posibles conjuntos que originan el problema que tratamos
1216 Subconjuntos
Definicioacuten 1216 Dados dos conjuntos A y B si todo elemento de A es a su vez elementode B diremos que A es un subconjunto de B y lo notaremos A sube B En caso contrario senotaraacute A 6sube B
La funcioacuten (esSubconjunto c1 c2) se verifica si c1 es un subconjunto de c2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
30 Capiacutetulo 1 Conjuntos
-- gtgtgt c1 `esSubconjunto` c2
-- True
-- gtgtgt c1 `esSubconjunto` vacio
-- False
-- gtgtgt vacio `esSubconjunto` c2
-- True
-- gtgtgt c3 `esSubconjunto` c4
-- True
-- gtgtgt c2 `esSubconjunto` c1
-- False
esSubconjunto Eq a =gt [a] -gt [a] -gt Bool
esSubconjunto c1 c2 = all (`elem` c2) c1
1217 Igualdad de conjuntos
Definicioacuten 1217 Dados dos conjuntos A y B diremos que son iguales si tienen losmismos elementos es decir si se verifica que A sube B y B sube A Lo notaremos A = B
La funcioacuten (conjuntosIguales c1 c2) se verifica si los conjuntos xs y ys son igua-les
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
-- gtgtgt let c5 = listaAConjunto [4444442]
-- gtgtgt conjuntosIguales c1 c2
-- False
-- gtgtgt conjuntosIguales c3 c4
-- True
-- gtgtgt conjuntosIguales c1 c5
-- True
conjuntosIguales Eq a =gt [a] -gt [a] -gt Bool
conjuntosIguales c1 c2 =
esSubconjunto c1 c2 ampamp esSubconjunto c2 c1
1218 Subconjuntos propios
Definicioacuten 1218 Los subconjuntos de A distintos del empty y del mismo A se denominansubconjuntos propios de A
La funcioacuten (esSubconjuntoPropio c1 c2) se verifica si c1 es un subconjunto pro-pio de c2
12 Representaciones de conjuntos 31
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt esSubconjuntoPropio u u
-- False
-- gtgtgt esSubconjuntoPropio c1 u
-- True
esSubconjuntoPropio Eq a =gt [a] -gt [a] -gt Bool
esSubconjuntoPropio c1 c2
| null c1 = False
| conjuntosIguales c1 c2 = False
| otherwise = esSubconjunto c1 c2
1219 Complementario de un conjunto
Definicioacuten 1219 Dado un conjunto A se define el complementario de A que notaremospor A como
A = x|x isin U x 6isin A
La funcioacuten (complementario u c) devuelve el complementario del conjunto c y enel universo u
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt let c2 = listaAConjunto [14689]
-- gtgtgt complementario u c1
-- [14689]
-- gtgtgt complementario u u
-- []
-- gtgtgt complementario u vacio
-- [123456789]
-- gtgtgt complementario u c2
-- [2357]
complementario Eq a =gt [a] -gt [a] -gt [a]
complementario = ()
1220 Cardinal de un conjunto
Definicioacuten 1220 Dado un conjunto finito A denominaremos cardinal de A al nuacutemerode elementos que tiene y lo notaremos |A|
La funcioacuten (cardinal xs) devuelve el cardinal del conjunto xs
32 Capiacutetulo 1 Conjuntos
-- | Ejemplos
-- gtgtgt cardinal vacio
-- 0
-- gtgtgt cardinal (listaAConjunto [110])
-- 10
-- gtgtgt cardinal (listaAConjunto chocolate)
-- 7
cardinal [a] -gt Int
cardinal = length
1221 Conjunto unitario
Definicioacuten 1221 Un conjunto con un uacutenico elemento se denomina unitario
Nota 127 Notemos que si X = x es un conjunto unitario debemos distinguirentre el conjunto X y el elemento x
La funcioacuten (esUnitario c) se verifica si el conjunto c es unitario
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto (take 10 (repeat 5))
-- gtgtgt let c2 = listaAConjunto valverde
-- gtgtgt let c3 = listaAConjunto coco
-- gtgtgt esUnitario c1
-- True
-- gtgtgt esUnitario c2
-- False
-- gtgtgt esUnitario c2
-- False
esUnitario Eq a =gt [a] -gt Bool
esUnitario c = c == take 1 c
1222 Unioacuten de conjuntos
Definicioacuten 1222 Dados dos conjuntos A y B se define la unioacuten de A y B notado A cup Bcomo el conjunto formado por aquellos elementos que pertenecen al menos a uno de los dosconjuntos A oacute B es decir
A cup B = x | x isin A or x isin B
La funcioacuten (unionConjuntos c1 c2) devuelve la unioacuten de los conjuntos xs y ys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [139]
-- gtgtgt let c2 = listaAConjunto [249]
12 Representaciones de conjuntos 33
-- gtgtgt unionConjuntos c1 c2
-- [135792468]
unionConjuntos Eq a =gt [a] -gt [a] -gt [a]
unionConjuntos = union
Definicioacuten 1223 Dada una familia de conjuntos Ai con i isin I se define la unioacuten ge-neral de los conjuntos Ai notado
⋃iisinI Ai como el conjunto formado por aquellos elementos
que pertenecen al menos a uno de los conjuntos de la familia es decir
⋃iisinI
Ai = x | x isin Ai foralli isin I
La funcioacuten (unionGeneral xss) devuelve la unioacuten general de la familia de conjun-tos de la lista xss
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1415]
-- gtgtgt let c2 = listaAConjunto [2515]
-- gtgtgt let c3 = listaAConjunto [3615]
-- gtgtgt unionGeneral [c1c2c3]
-- [147101325811143691215]
unionGeneral Eq a =gt [[a]] -gt [a]
unionGeneral = foldr unionConjuntos []
1223 Interseccioacuten de conjuntos
Definicioacuten 1224 Dados dos conjuntos A y B se define la interseccioacuten de A y B notadoA cap B como el conjunto formado por aquellos elementos que pertenecen a cada uno de losdos conjuntos A y B es decir
A cap B = x | x isin A and x isin B
La funcioacuten (interseccion c1 c2) devuelve la interseccioacuten de los conjuntos c1 yc2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1320]
-- gtgtgt let c2 = listaAConjunto [2420]
-- gtgtgt let c3 = listaAConjunto [2430]
-- gtgtgt let c4 = listaAConjunto [4830]
-- gtgtgt interseccion c1 c2
-- []
-- gtgtgt interseccion c3 c4
-- [481216202428]
34 Capiacutetulo 1 Conjuntos
interseccion Eq a =gt [a] -gt [a] -gt [a]
interseccion = intersect
1224 Producto cartesiano
Definicioacuten 1225 El producto cartesiano 2 de dos conjuntos A y B es una operacioacutensobre ellos que resulta en un nuevo conjunto Atimes B que contiene a todos los pares ordenadostales que la primera componente pertenece a A y la segunda pertenece a B es decir
Atimes B = (a b) | a isin A b isin B
La funcioacuten (productoCartesiano c1 c2) devuelve el producto cartesiano de xs eys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [31]
-- gtgtgt let c2 = listaAConjunto [247]
-- gtgtgt productoCartesiano c1 c2
-- [(32)(34)(37)(12)(14)(17)]
-- gtgtgt productoCartesiano c2 c1
-- [(23)(21)(43)(41)(73)(71)]
productoCartesiano [a] -gt [b] -gt [(ab)]
productoCartesiano xs ys = [ (xy) | x lt- xs y lt- ys]
1225 Combinaciones
Definicioacuten 1226 Las combinaciones de un conjunto S tomados en grupos de n son todoslos subconjuntos de S con n elementos
La funcioacuten (combinaciones n xs) devuelve las combinaciones de los elementos dexs en listas de n elementos
-- | Ejemplos
-- gtgtgt combinaciones 3 [ad]
-- [abcabdacdbcd]
-- gtgtgt combinaciones 2 [248]
-- [[24][26][28][46][48][68]]
combinaciones Integer -gt [a] -gt [[a]]
combinaciones 0 _ = [[]]
combinaciones _ [] = []
combinaciones k (xxs) =
[xys | ys lt- combinaciones (k-1) xs] ++ combinaciones k xs
2httpsenwikipediaorgwikiCartesian_product
13 Eleccioacuten de la representacioacuten de conjuntos 35
1226 Variaciones con repeticioacuten
Definicioacuten 1227 Las variaciones con repeticioacuten de m elementos tomados en grupos den es el nuacutemero de diferentes nndashtuplas de un conjunto de m elementos
La funcioacuten (variacionesR n xs) devuelve las variaciones con con repeticioacuten de loselementos de xs en listas de n elementos
-- | Ejemplos
-- gtgtgt variacionesR 3 [ab]
-- [aaaaababaabbbaababbbabbb]
-- gtgtgt variacionesR 2 [235]
-- [[22][23][25][32][33][35][52][53][55]]
variacionesR Int -gt [a] -gt [[a]]
variacionesR _ [] = [[]]
variacionesR 0 _ = [[]]
variacionesR k us =
[uvs | u lt- us vs lt- variacionesR (k-1) us]
13 Eleccioacuten de la representacioacuten de conjuntos
Nota 131 En el moacutedulo Conjuntos se elige la representacioacuten de conjunto con la quese trabajaraacute
-- Seleccionar para trabajar con los conjuntos como listas sin
-- elementos repetidos
module Conjuntos
(module ConjuntosConListas)
where
import ConjuntosConListas
-- Seleccionar para trabajar con los conjuntos como listas ordenadas
-- sin elementos repetidos
-- module Conjuntos
-- (module ConjuntosConListasOrdenadasSinRepeticion)
-- where
-- import ConjuntosConListasOrdenadasSinRepeticion
36 Capiacutetulo 1 Conjuntos
Capiacutetulo 2
Relaciones y funciones
21 Relaciones
Las relaciones que existen entre personas nuacutemeros conjuntos y muchas otras enti-dades pueden formalizarse en la idea de relacioacuten binaria En esta seccioacuten se define ydesarrolla este concepto particularizando en el caso de las relaciones homogeacuteneasy en el de las funciones
211 Relacioacuten binaria
Definicioacuten 211 Una relacioacuten binaria 1 (o correspondencia) entre dos conjuntos A yB es un subconjunto del producto cartesiano Atimes B
La funcioacuten (esRelacion xs ys r) se verifica si r es una relacioacuten binaria de xs enys Por ejemplo
-- | Ejemplos
-- gtgtgt esRelacion [31] [247] [(12)(34)]
-- True
-- gtgtgt esRelacion [31] [247] [(12)(31)]
-- False
esRelacion (Ord a Ord b) =gt [a] -gt [b] -gt [(ab)] -gt Bool
esRelacion xs ys r =
r `esSubconjunto` productoCartesiano xs ys
212 Imagen por una relacioacuten
Definicioacuten 212 Si R es una relacioacuten binaria la imagen del elemento x en la relacioacuten Res el conjunto de los valores correspondientes a x en R
1httpsenwikipediaorgwikiBinary_relation
37
38 Capiacutetulo 2 Relaciones y funciones
La funcioacuten (imagenRelacion r x) es la imagen de x en la relacioacuten r
-- | Ejemplos
-- gtgtgt imagenRelacion [(13)(25)(14)] 1
-- [34]
-- gtgtgt imagenRelacion [(13)(25)(14)] 2
-- [5]
-- gtgtgt imagenRelacion [(13)(25)(14)] 3
-- []
imagenRelacion (Ord a Ord b) =gt [(ab)] -gt a -gt [b]
imagenRelacion r x =
nub [y | (zy) lt- r z == x]
213 Dominio de una relacioacuten
Definicioacuten 213 Dada una relacioacuten binaria R su dominio es el conjunto que contiene atodos los valores que se toman en la relacioacuten R
La funcioacuten (dominio r) devuelve el dominio de la relacioacuten r
-- | Ejemplo
-- gtgtgt dominio [(32)(51)(34)]
-- [35]
dominio Ord a =gt [(ab)] -gt [a]
dominio r = listaAConjunto (map fst r)
214 Rango de una relacioacuten
Definicioacuten 214 El rango de una relacioacuten binaria R es el conjunto de las imaacutegenes demediante R
La funcioacuten (rango r) devuelve el rango de la relacioacuten binaria r
-- | Ejemplo
-- gtgtgt rango [(32)(52)(34)]
-- [24]
rango Ord b =gt [(ab)] -gt [b]
rango r = listaAConjunto (map snd r)
215 Antiimagen por una relacioacuten
Definicioacuten 215 La antiimagen del elemento y por una relacioacuten r es el conjunto de loselementos cuya imagen es y
La (antiImagenRelacion r y) es la antiimagen del elemento y en la relacioacuten bina-ria r
22 Relaciones homogeacuteneas 39
-- | Ejemplo
-- gtgtgt antiImagenRelacion [(13)(23)(74)] 3
-- [12]
antiImagenRelacion (Ord a Ord b) =gt [(ab)] -gt b -gt [a]
antiImagenRelacion r y =
nub [x | (xz) lt- r z == y]
216 Relacioacuten funcional
Definicioacuten 216 Dada una relacioacuten binaria R se dice funcional si todos los elementos desu dominio tienen una uacutenica imagen en R
La funcioacuten (esFuncional r) se verifica si la relacioacuten r es funcional
-- | Ejemplos
-- gtgtgt esFuncional [(32)(51)(79)]
-- True
-- gtgtgt esFuncional [(32)(51)(34)]
-- False
-- gtgtgt esFuncional [(32)(51)(32)]
-- True
esFuncional (Ord a Ord b) =gt [(ab)] -gt Bool
esFuncional r =
and [esUnitario (imagenRelacion r x) | x lt- dominio r]
22 Relaciones homogeacuteneas
Para elaborar la presente seccioacuten se han consultado los apuntes de ldquoAacutelgebra baacutesicardquo([6]) asignatura del primer curso del Grado en Matemaacuteticas
Definicioacuten 221 Una relacioacuten binaria entre dos conjuntos A y B se dice que es homogeacute-nea si los conjuntos son iguales es decir si A = B Si el par (x y) isin AA estaacute en la relacioacutenhomogeacutenea R diremos que x estaacute Rndashrelacionado con y o relacionado con y por R Esto senotaraacute frecuentemente xRy (noacutetese que el orden es importante)
La funcioacuten (esRelacionHomogenea xs r) se verifica si r es una relacioacuten binaria ho-mogeacutenea en el conjunto xs
-- | Ejemplos
-- gtgtgt esRelacionHomogenea [14] [(12)(24)(34)(41)]
-- True
-- gtgtgt esRelacionHomogenea [14] [(12)(25)(34)(41)]
-- False
-- gtgtgt esRelacionHomogenea [14] [(12)(34)(41)]
40 Capiacutetulo 2 Relaciones y funciones
-- True
esRelacionHomogenea Ord a =gt [a] -gt [(aa)] -gt Bool
esRelacionHomogenea xs = esRelacion xs xs
Nota 221 El segundo argumento que recibe la funcioacuten ha de ser una lista de parescon ambas componentes del mismo tipo
La funcioacuten (estaRelacionado r x y) se verifica si x estaacute relacionado con y en larelacioacuten homogeacutenea r
-- | Ejemplos
-- gtgtgt estaRelacionado [(13)(25)(46)] 2 5
-- True
-- gtgtgt estaRelacionado [(13)(25)(46)] 2 3
-- False
estaRelacionado Ord a =gt [(aa)] -gt a -gt a -gt Bool
estaRelacionado r x y = (xy) `elem` r
221 Relaciones reflexivas
Definicioacuten 222 Sea R una relacioacuten binaria homogeacutenea en el conjunto A Diremos que Res reflexiva cuando todos los elementos de A estaacuten relacionados por R consigo mismos esdecir cuando forallx isin A se tiene que xRx
La funcioacuten (esReflexiva xs r) se verifica si la relacioacuten r en xs es reflexiva
-- | Ejemplos
-- gtgtgt esReflexiva [12] [(11)(12)(22)]
-- True
-- gtgtgt esReflexiva [12] [(11)(12)]
-- False
esReflexiva Ord a =gt [a] -gt [(aa)] -gt Bool
esReflexiva xs r = zip xs xs `esSubconjunto` r
Nota 222 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xSylarrrarr xminus y es parbull xTylarrrarr x divide a yson relaciones binarias homogeacuteneas reflexivas
222 Relaciones simeacutetricas
Definicioacuten 223 Diremos que una relacioacuten homogeacutenea R es simeacutetrica cuando
forall(x y) isin R minusrarr (y x) isin R
22 Relaciones homogeacuteneas 41
La funcioacuten (esSimetrica r) se verifica si la relacioacuten r es simeacutetrica
-- | Ejemplos
-- gtgtgt esSimetrica [(11)(12)(21)]
-- True
-- gtgtgt esSimetrica [(11)(12)(22)]
-- False
esSimetrica Ord a =gt [(aa)] -gt Bool
esSimetrica r =
listaAConjunto [(yx) | (xy) lt- r] `esSubconjunto` r
Nota 223 En el conjunto N la relacioacuten caracterizada por xSy larrrarr xminus y es par esuna relacioacuten binaria homogeacutenea simeacutetrica
223 Relaciones antisimeacutetricas
Definicioacuten 224 Sea R una relacioacuten binaria homogeacutenea en el conjunto A Diremos que Res antisimeacutetrica cuando
forall(x y)[(x y) isin R and (y x) isin R minusrarr x = y
La funcioacuten (esAntisimetrica r) se verifica si la relacioacuten r es antisimeacutetrica
-- | Ejemplos
-- gtgtgt esAntisimetrica [(12)(31)]
-- True
-- gtgtgt esAntisimetrica [(12)(21)]
-- False
esAntisimetrica Ord a =gt [(aa)] -gt Bool
esAntisimetrica r =
and [x == y | (xy) lt- r (yx) `elem` r]
Nota 224 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xTylarrrarr x divide a ybull xRylarrrarr x lt yson relaciones binarias homogeacuteneas antisimeacutetricas
224 Relaciones transitivas
Definicioacuten 225 Sea R una relacioacuten binaria homogeacutenea en el conjunto A Diremos que Res transitiva cuando forall(x y) (y z) isin R se tiene que xRy e yRz minusrarr xRz
La funcioacuten (esTransitiva r) se verifica si la relacioacuten r es transitiva
42 Capiacutetulo 2 Relaciones y funciones
-- | Ejemplos
-- gtgtgt esTransitiva [(12)(13)(23)]
-- True
-- gtgtgt esTransitiva [(12)(23)]
-- False
esTransitiva Ord a =gt [(aa)] -gt Bool
esTransitiva r =
listaAConjunto [(xz) | (xy) lt- r (wz) lt- r y == w]
`esSubconjunto` r
Nota 225 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xSylarrrarr xminus y es parbull xTylarrrarr x divide a ybull xRylarrrarr x lt yson relaciones binarias homogeacuteneas transitivas
225 Relaciones de equivalencia
Definicioacuten 226 Las relaciones homogeacuteneas que son a la vez reflexivas simeacutetricas y tran-sitivas se denominan relaciones de equivalencia
La funcioacuten (esRelacionEquivalencia xs r) se verifica si r es una relacioacuten de equi-valencia en xs-- | Ejemplos
-- gtgtgt esRelacionEquivalencia [13] [(11)(12)(21)(22)(33)]
-- True
-- gtgtgt esRelacionEquivalencia [13] [(12)(21)(22)(33)]
-- False
-- gtgtgt esRelacionEquivalencia [13] [(11)(12)(22)(33)]
-- False
esRelacionEquivalencia Ord a =gt [a] -gt [(aa)] -gt Bool
esRelacionEquivalencia xs r =
esReflexiva xs r ampamp
esSimetrica r ampamp
esTransitiva r
Nota 226 En el conjunto N la relacioacuten caracterizada por xSy larrrarr xminus y es par esuna relacioacuten de equivalencia
226 Relaciones de orden
Definicioacuten 227 Las relaciones homogeacuteneas que son a la vez reflexivas antisimeacutetricas ytransitivas se denominan relaciones de orden
23 Funciones 43
La funcioacuten (esRelacionOrden xs r) se verifica si r es una relacioacuten de orden en xs
-- | Ejemplo
-- gtgtgt esRelacionOrden [13] [(11)(12)(13)(22)(23)(33)]
-- True
esRelacionOrden Ord a =gt [a] -gt [(aa)] -gt Bool
esRelacionOrden xs r =
esReflexiva xs r ampamp
esAntisimetrica r ampamp
esTransitiva r
Nota 227 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xTylarrrarr x divide a yson relaciones de orden
227 Clases de equivalencia
Definicioacuten 228 Si R es una relacioacuten de equivalencia en A denominamos clase de equi-valencia de un elemento x isin A al conjunto de todos los elementos de A relacionados con xes decir x = R(x) = y isin A|xRy donde la primera notacioacuten se usa si la relacioacuten con laque se estaacute tratando se sobreentiende y la segunda si no es asiacute
La funcioacuten (clasesEquivalencia xs r) devuelve las clases de la relacioacuten de equi-valencia r en xs
-- | Ejemplo
-- gtgtgt let r = [(xy) | x lt- [15] y lt- [15] even (x-y)]
-- gtgtgt clasesEquivalencia [15] r
-- [[135][24]]
clasesEquivalencia Ord a =gt [a] -gt [(aa)] -gt [[a]]
clasesEquivalencia _ [] = []
clasesEquivalencia [] _ = []
clasesEquivalencia (xxs) r = (xc) clasesEquivalencia (xs c) r
where c = filter (estaRelacionado r x) xs
23 Funciones
Definicioacuten 231 Dada una relacioacuten F entre A y B se diraacute que es una funcioacuten si es unarelacioacuten binaria es funcional y todos los elementos de A estaacuten en el dominio
La funcioacuten (esFuncion xs ys f) se verifica si f es una funcioacuten de xs en ys
-- | Ejemplos
-- gtgtgt esFuncion [13] [247] [(17)(32)]
44 Capiacutetulo 2 Relaciones y funciones
-- True
-- gtgtgt esFuncion [13] [247] [(17)]
-- False
-- gtgtgt esFuncion [13] [247] [(14)(17)(32)]
-- False
esFuncion (Ord a Ord b) =gt [a] -gt [b] -gt [(ab)] -gt Bool
esFuncion xs ys f =
esRelacion xs ys f ampamp
xs `esSubconjunto` dominio f ampamp
esFuncional f
Nota 231 A lo largo de la seccioacuten representaremos a las funciones como listas depares
type Funcion a b = [(ab)]
La funcioacuten (funciones xs ys) devuelve todas las posibles funciones del conjuntoxs en ys
-- | Ejemplos
-- gtgtgt pp $ funciones [12] [34]
-- [[(1 3)(2 3)][(1 3)(2 4)][(1 4)(2 3)]
-- [(1 4)(2 4)]]
-- gtgtgt pp $ funciones [12] [345]
-- [[(1 3)(2 3)][(1 3)(2 4)][(1 3)(2 5)]
-- [(1 4)(2 3)][(1 4)(2 4)][(1 4)(2 5)]
-- [(1 5)(2 3)][(1 5)(2 4)][(1 5)(2 5)]]
-- gtgtgt pp $ funciones [012] [34]
-- [[(0 3)(1 3)(2 3)][(0 3)(1 3)(2 4)]
-- [(0 3)(1 4)(2 3)][(0 3)(1 4)(2 4)]
-- [(0 4)(1 3)(2 3)][(0 4)(1 3)(2 4)]
-- [(0 4)(1 4)(2 3)][(0 4)(1 4)(2 4)]]
funciones [a] -gt [b] -gt [Funcion a b]
funciones xs ys =
[zip xs zs | zs lt- variacionesR (length xs) ys]
231 Imagen por una funcioacuten
Definicioacuten 232 Si f es una funcioacuten entre A y B y x es un elemento del conjunto A laimagen del elemento x por la funcioacuten f es el valor asociado a x por la funcioacuten f
La funcioacuten (imagen f x) es la imagen del elemento x en la funcioacuten f
-- | Ejemplos
-- gtgtgt imagen [(17)(32)] 1
-- 7
-- gtgtgt imagen [(17)(32)] 3
23 Funciones 45
-- 2
imagen (Ord a Ord b) =gt Funcion a b -gt a -gt b
imagen f x = head (imagenRelacion f x)
La funcioacuten (imagenConjunto f xs) es la imagen del conjunto xs en la funcioacuten f
-- | Ejemplos
-- gtgtgt imagenConjunto [(17)(32)(43)] [14]
-- [73]
-- gtgtgt imagenConjunto [(17)(32)] [31]
-- [27]
imagenConjunto (Ord a Ord b) =gt Funcion a b -gt [a] -gt [b]
imagenConjunto f xs = nub (map (imagen f) xs)
232 Funciones inyectivas
Definicioacuten 233 Diremos que una funcioacuten f entre dos conjuntos es inyectiva 2 si a ele-mentos distintos del dominio le corresponden elementos distintos de la imagen es decir siforalla b isin dominio( f ) tales que a 6= b f (a) 6= f (b)
La funcioacuten (esInyectiva fs) se verifica si la funcioacuten fs es inyectiva
-- | Ejemplos
-- gtgtgt esInyectiva [(14)(25)(36)]
-- True
-- gtgtgt esInyectiva [(14)(25)(34)]
-- False
-- gtgtgt esInyectiva [(14)(25)(36)(36)]
-- True
esInyectiva (Ord a Ord b) =gt Funcion a b -gt Bool
esInyectiva f =
all esUnitario [antiImagenRelacion f y | y lt- rango f]
233 Funciones sobreyectivas
Definicioacuten 234 Diremos que una funcioacuten f entre dos conjuntos A y B es sobreyectiva3 si todos los elementos de B son imagen de alguacuten elemento de A
La funcioacuten (esSobreyectiva xs ys f) se verifica si la funcioacuten f es sobreyectiva Ala hora de definirla estamos contando con que f es una funcioacuten entre xs y ys
-- | Ejemplos
-- gtgtgt esSobreyectiva [123] [456] [(14)(25)(36)]
2httpsenwikipediaorgwikiInjective_function3httpsenwikipediaorgwikiSurjective_function
46 Capiacutetulo 2 Relaciones y funciones
-- True
-- gtgtgt esSobreyectiva [123] [456] [(14)(25)(34)]
-- False
-- gtgtgt esSobreyectiva [123] [456] [(14)(24)(36)(36)]
-- False
esSobreyectiva (Ord aOrd b) =gt [a] -gt [b] -gt Funcion a b -gt Bool
esSobreyectiva _ ys f = ys `esSubconjunto` rango f
234 Funciones biyectivas
Definicioacuten 235 Diremos que una funcioacuten f entre dos conjuntos A y B es biyectiva 4 sicada elementos de B es imagen de un uacutenico elemento de A
La funcioacuten (esBiyectiva xs ys f) se verifica si la funcioacuten f es biyectiva
-- | Ejemplos
-- gtgtgt esBiyectiva [123] [456] [(14)(25)(36)(36)]
-- True
-- gtgtgt esBiyectiva [123] [456] [(14)(25)(34)]
-- False
-- gtgtgt esBiyectiva [123] [4567] [(14)(25)(36)]
-- False
esBiyectiva (Ord a Ord b) =gt [a] -gt [b] -gt Funcion a b -gt Bool
esBiyectiva xs ys f =
esInyectiva f ampamp esSobreyectiva xs ys f
La funciones biyecciones1 xs ys y biyecciones2 xs ys devuelven la lista de to-das las biyecciones entre los conjuntos xs y ys La primera lo hace filtrando las fun-ciones entre los conjuntos que son biyectivas y la segunda lo hace construyendouacutenicamente las funciones biyectivas entre los conjuntos con el consecuente ahorrocomputacional
ghcigt length (biyecciones1 [17] [ag])
5040
(1675 secs 4146744104 bytes)
ghcigt length (biyecciones2 [17] [ag])
5040
(002 secs 0 bytes)
ghcigt length (biyecciones1 [16] [ag])
0
(253 secs 592625824 bytes)
ghcigt length (biyecciones2 [16] [ag])
0
(001 secs 0 bytes)
4httpsenwikipediaorgwikiBijective_function
23 Funciones 47
biyecciones1 (Ord a Ord b) =gt [a] -gt [b] -gt [Funcion a b]
biyecciones1 xs ys =
filter (esBiyectiva xs ys) (funciones xs ys)
biyecciones2 (Ord a Ord b) =gt [a] -gt [b] -gt [Funcion a b]
biyecciones2 xs ys
| length xs = length ys = []
| otherwise = [zip xs zs | zs lt- permutations ys]
Nota 232 En lo que sigue trabajaremos con la funcioacuten biyecciones2 asiacute que laredefiniremos como biyecciones
biyecciones (Ord a Ord b) =gt [a] -gt [b] -gt [Funcion a b]
biyecciones = biyecciones2
235 Inversa de una funcioacuten
Definicioacuten 236 Si f es una funcioacuten biyectiva entre los conjuntos A y B definimos lafuncioacuten inversa 5 como la funcioacuten que a cada elemento de B le hace corresponder el elementode A del que es imagen en B
El valor de (inversa f) es la funcioacuten inversa de f
-- | Ejemplos
-- gtgtgt inversa [(14)(25)(36)]
-- [(41)(52)(63)]
-- gtgtgt sort (inversa [(1f)(2m)(3a)])
-- [(a3)(f1)(m2)]
inversa (Ord a Ord b) =gt Funcion a b -gt Funcion b a
inversa f = listaAConjunto [(yx) | (xy) lt- f]
Nota 233 Para considerar la inversa de una funcioacuten esta tiene que ser biyectivaLuego (inversa f) asigna a cada elemento del conjunto imagen (que en este casocoincide con la imagen) uno y solo uno del conjunto de salida
La funcioacuten (imagenInversa f y) devuelve el elemento del conjunto de salida de lafuncioacuten f tal que su imagen es y
-- | Ejemplos
-- gtgtgt imagenInversa [(14)(25)(36)] 5
-- 2
-- gtgtgt imagenInversa [(1f)(2m)(3a)] a
-- 3
imagenInversa (Ord a Ord b) =gt Funcion a b -gt b -gt a
imagenInversa f = imagen (inversa f)
5httpsenwikipediaorgwikiInverse_function
48 Capiacutetulo 2 Relaciones y funciones
Capiacutetulo 3
Introduccioacuten a la teoriacutea de grafos
Se dice que la Teoriacutea de Grafos tiene su origen en 1736 cuando Euler dio una so-lucioacuten al problema (hasta entonces no resuelto) de los siete puentes de Koumlnigsbergiquestexiste un camino que atraviese cada uno de los puentes exactamente una vezPara probar que no era posible Euler sustituyoacute cada regioacuten por un nodo y cadapuente por una arista creando el primer grafo que fuera modelo de un problemamatemaacutetico
Figura 31 Dibujo de los puentes de Koumlnigsberg
A
B
C
D
b
c
a
d
f
e
g
Figura 32 Modelo de los puentes de Koumlnigsberg
Desde entonces se ha ido desarrollando esta metodologiacutea hasta convertise en los uacutel-timos antildeos en una herramienta importante en aacutereas del conocimiento muy variadascomo por ejemplo la Investigacioacuten Operativa la Computacioacuten la Ingenieriacutea Eleacutec-trica la Geografiacutea y la Quiacutemica Es por ello que ademaacutes se ha erigido como unanueva disciplina matemaacutetica que generalmente asociada a las ramas de Topologiacuteay AacutelgebraLa utilidad de los grafos se basa en su gran poder de abstraccioacuten y una representa-cioacuten muy clara de cualquier relacioacuten lo que facilita enormemente tanto la fase demodelado como la de resolucioacuten de cualquier problema Gracias a la Teoriacutea de Gra-fos se han desarrollado una gran variedad de algoritmos y meacutetodos de decisioacuten quepodemos implementar a traveacutes de lenguajes funcionales y permiten automatizar laresolucioacuten de muchos problemas a menudo tediosos de resolver a mano
49
50 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
31 Definicioacuten de grafo
En primer lugar vamos a introducir terminologiacutea baacutesica en el desarrollo de la Teoriacuteade Grafos
Definicioacuten 311 Un grafo G es un par (V A) donde V es el conjunto cuyos elementosllamamos veacutertices (o nodos) y A es un conjunto cuyos elementos llamamos aristas
Definicioacuten 312 Una arista de un grafo G = (V A) es un conjunto de dos elementosde V Es decir para dos veacutertices v vprime de G (v vprime) y (vprime v) representa la misma arista
Definicioacuten 313 Dado un grafo G = (V A) diremos que un veacutertice v isin V es adyacentea vprime isin V si (vprime v) isin A
Definicioacuten 314 Si en un grafo dirigido se permiten aristas repetidas lo llamaremos mul-tigrafo Si no se permiten lo llamaremos grafo regular
Nota 311 Denotaremos por |V| al nuacutemero de veacutertices y por |A| al nuacutemero de aristasdel grafo (V A)
Ejemplo 312 Sea G = (V A) un grafo con V = a b c d y A = (a b) (a c) (b d)(d d) En este grafo los veacutertices a d son adyacentes a b
a
b
c
d
32 El TAD de los grafos
En esta seccioacuten nos planteamos la tarea de implementar las definiciones presenta-das anteriormente en un lenguaje funcional En nuestro caso el lenguaje que utili-zaremos seraacute Haskell Definiremos el Tipo Abstracto de Dato (TAD) de los grafos ydaremos algunos ejemplos de posibles representaciones de grafos con las que po-dremos trabajarSi consideramos un grafo finito cualquiera G = (V A) podemos ordenar el conjun-to de los veacutertices y representarlo como V = v1 vn con n = |V|En primer lugar necesitaremos crear un tipo (Grafo) cuya definicioacuten sea compatiblecon la entidad matemaacutetica que representa y que nos permita definir las operacionesque necesitamos para trabajar con los grafos Estas operaciones son
32 El TAD de los grafos 51
creaGrafo -- [a] -gt [(aa)] -gt Grafo a
vertices -- Grafo a -gt [a]
adyacentes -- Grafo a -gt a -gt [a]
aristaEn -- (aa) -gt Grafo a -gt Bool
aristas -- Grafo a -gt [(aa)]
dondebull (creaGrafo vs as) es un grafo tal que el conjunto de sus veacutertices es vs y el de
sus aristas es asbull (vertices g) es la lista de todos los veacutertices del grafo gbull (adyacentes g v) es la lista de los veacutertices adyacentes al veacutertice v en el grafo gbull (aristaEn a g) se verifica si a es una arista del grafo gbull (aristas g) es la lista de las aristas del grafo g
Nota 321 Las funciones que aparecen en la especificacioacuten del TAD no dependende la representacioacuten que elijamos
Ejemplo 322 Veamos un ejemplo de creacioacuten de grafo y su representacioacuten graacutefica
creaGrafo [15] [(12)(13)(15)(24)
(25)(34)(35)(45)]
1
2
34
5
321 Grafos como listas de aristas
En el moacutedulo GrafoConListaDeAristas se definen las funciones del TAD de losgrafos dando su representacioacuten como conjuntos de aristas es decir representandoa un grafo como dos conjuntos la primera seraacute la lista ordenada de los veacutertices y lasegunda la lista ordenada de las aristas (en ambas listas se excluye la posibilidad derepeticiones)
Nota 323 Las ventajas de usar arrays frente a usar listas es que los array tienenacceso constante (O(1)) a sus elementos mientras que las listas tienen acceso lineal(O(n)) y que la actualizacioacuten de un elemento en un array no supone espacio extraSin embargo los arrays son representaciones muy riacutegidas cualquier modificacioacutenen su estructura como cambiar su tamantildeo supone un gran coste computacionalpues se tendriacutea que crear de nuevo el array y ademaacutes sus iacutendices deben pertenecer
52 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
a la clase de los objetos indexables (Ix) luego perdemos mucha flexibilidad en larepresentacioacuten
- LANGUAGE DeriveGeneric -
module GrafoConListaDeAristas
( Grafo
creaGrafo -- [a] -gt [(aa)] -gt Grafo a
vertices -- Grafo a -gt [a]
adyacentes -- Grafo a -gt a -gt [a]
aristaEn -- (aa) -gt Grafo a -gt Bool
aristas -- Grafo a -gt [(aa)]
) where
En las definiciones del presente moacutedulo se usaraacuten las funciones nub y sort de lalibreriacutea DataList
Vamos a definir un nuevo tipo de dato (Grafo a) que representaraacute un grafo a partirde la lista de sus veacutertices (donde los veacutertices son de tipo a) y de aristas (que son paresde veacutertices)
data Grafo a = G [a] [(aa)]
deriving (Eq Show Generic)
instance (Out a) =gt Out (Grafo a)
Las funciones baacutesicas que definiremos a partir de este tipo coincidiraacuten con las indi-cadas en el TAD de los grafosbull (creaGrafo vs as) es el grafo cuyo conjunto de veacutertices es cs y el de sus aristas
es as-- | Ejemplo
-- gtgtgt creaGrafo [15] [(12)(14)(15)(23)(25)(34)(35)]
-- G [12345] [(12)(14)(15)(23)(25)(34)(35)]
creaGrafo Ord a =gt [a] -gt [(aa)] -gt Grafo a
creaGrafo vs as =
G (sort vs) (nub (sort [parOrdenado a | a lt- as]))
parOrdenado Ord a =gt (aa) -gt (aa)
parOrdenado (xy) | x lt= y = (xy)
| otherwise = (yx)
Ejemplo 324 ejGrafo es el grafo
32 El TAD de los grafos 53
1
2
3
4
5
Los ejemplos usaraacuten el siguiente grafo
ejGrafo Grafo Int
ejGrafo = creaGrafo [15]
[(12)(14)(15)(23)(25)(34)(35)(45)]
bull (vertices g) es la lista de los veacutertices del grafo g
-- | Ejemplo
-- gtgtgt vertices ejGrafo
-- [12345]
vertices Grafo a -gt [a]
vertices (G vs _) = vs
bull (adyacentes g v) es la lista de los veacutertices adyacentes al veacutertice v en el grafo g
-- | Ejemplos
-- gtgtgt adyacentes ejGrafo 4
-- [135]
-- gtgtgt adyacentes ejGrafo 3
-- [245]
adyacentes Eq a =gt Grafo a -gt a -gt [a]
adyacentes (G _ as) v =
[u | (ux) lt- as x == v] `union` [u | (xu) lt- as x == v]
bull (aristaEn a g) se verifica si a es una arista del grafo g
-- | Ejemplos
-- gtgtgt (51) `aristaEn` ejGrafo
-- True
-- gtgtgt (31) `aristaEn` ejGrafo
-- False
aristaEn Ord a =gt (aa) -gt Grafo a -gt Bool
aristaEn a (G _ as) = parOrdenado a `elem` as
bull (aristas g) es la lista de las aristas del grafo g
-- | Ejemplo
-- gtgtgt aristas ejGrafo
-- [(12)(14)(15)(23)(25)(34)(35)(45)]
aristas Grafo a -gt [(aa)]
aristas (G _ as) = as
54 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
33 Generador de grafos
En esta seccioacuten presentaremos el generador de grafos que nos permitiraacute generargrafos como listas de aristas arbitrariamente y usarlos como ejemplos o para com-probar propiedadesPara aprender a controlar el tamantildeo de los grafos generados he consultado las si-guientes fuentes QuickCheck A Lightweight Tool for Random Testing of Haskell Programs 1
([3]) Property Testing using QuickCheck 2 ([9])(generaGrafos n) es un generador de grafos de hasta n veacutertices Por ejemplo
ghcigt sample (generaGrafo 5)
G [12] []
G [1] [(11)]
G [] []
G [1234] [(22)]
G [123] [(11)(12)(13)(22)]
G [12345] [(12)(14)(15)(22)(23)(24)(33)(34)(44)(45)]
G [1] []
G [123] [(12)(22)(33)]
G [1234] [(11)(14)(23)(24)(33)(34)(44)]
G [12] []
G [123] [(11)(12)(22)(33)]
ghcigt sample (generaGrafo 2)
G [12] [(12)(22)]
G [12] [(11)]
G [12] [(11)(12)]
G [] []
G [1] [(11)]
G [1] []
G [1] []
G [] []
G [] []
G [] []
G [1] [(11)]
generaGrafo Int -gt Gen (Grafo Int)
generaGrafo s = do
let m = s `mod` 11
n lt- choose (0m)
as lt- sublistOf [(xy) | x lt- [1n] y lt- [xn]]
return (creaGrafo [1n] as)
1httpswwweecsnorthwesternedu~robbycourses395-495-2009-fallquickpdf2httpswwwdccfcuppt~pbvaulastapfslidesquickcheckhtml
34 Ejemplos de grafos 55
Nota 331 Los grafos estaacuten contenidos en la clase de los objetos generables aleato-riamente
instance Arbitrary (Grafo Int) where
arbitrary = sized generaGrafo
En el siguiente ejemplo se pueden observar algunos grafos generados
ghcigt sample (arbitrary Gen (Grafo Int))
G [] []
G [1] [(11)]
G [12] [(11)(12)]
G [1] [(11)]
G [12345678] [(14)(17)(22)(23)(25)(28)(35)
(36)(38)(44)(46)(47)(48)(56)(66)(67)(78)]
G [12345] [(11)(12)(14)(15)(24)(25)(34)(55)]
G [] []
G [] []
G [123] [(11)(22)(23)]
G [1234] [(11)(12)(14)(22)(33)]
G [1234567] [(11)(15)(16)(17)(22)(24)(25)
(26)(27)(33)(35)(46)(47)(55)(57)(66)(77)]
34 Ejemplos de grafos
El objetivo de esta seccioacuten es reunir una coleccioacuten de grafos lo suficientemente ex-tensa y variada como para poder utilizarla como recurso a la hora de comprobar laspropiedades y definiciones de funciones que implementaremos maacutes adelanteEn el proceso de recopilacioacuten de ejemplos se ha trabajado con diversas fuentesbull los apuntes de la asignatura ldquoMatemaacutetica discretardquo ([4])bull los temas de la asignatura ldquoInformaacuteticardquo ([1]) ybull el artiacuteculo ldquoGraph theoryrdquo ([11]) de la Wikipedia
Nota 341 Se utilizaraacute la representacioacuten de los grafos como listas de aristas
341 Grafo nulo
Definicioacuten 341 Un grafo nulo es un grafo que no tiene ni veacutertices ni aristas
La funcioacuten (grafoNulo) devuelve un grafo nulo
grafoNulo Ord a =gt Grafo a
grafoNulo = creaGrafo [] []
La funcioacuten (esGrafoNulo g) se verifica si g es un grafo nulo
56 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- | Ejemplos
-- gtgtgt esGrafoNulo grafoNulo
-- True
-- gtgtgt esGrafoNulo (creaGrafo [] [(12)])
-- False
-- gtgtgt esGrafoNulo (creaGrafo [12] [(12)])
-- False
esGrafoNulo Grafo a -gt Bool
esGrafoNulo g =
null (vertices g) ampamp null (aristas g)
342 Grafo ciclo
Definicioacuten 342 Un ciclo 3 de orden n C(n) es un grafo no dirigido y no ponderadocuyo conjunto de veacutertices viene dado por V = 1 n y el de las aristas por A = (0 1)(1 2) (nminus 2 nminus 1) (nminus 1 0)
La funcioacuten (grafoCiclo n) nos genera el ciclo de orden n
1
23
45
-- | Ejemplos
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
grafoCiclo Int -gt Grafo Int
grafoCiclo 0 = grafoNulo
grafoCiclo 1 = creaGrafo [1] []
grafoCiclo n = creaGrafo [1n]
([(uu+1) | u lt- [1n-1]] ++ [(n1)])
343 Grafo de la amistad
Definicioacuten 343 Un grafo de la amistad 4 de orden n es un grafo con 2n + 1 veacuterticesy 3n aristas formado uniendo n copias del ciclo C3 por un veacutertice comuacuten Lo denotamos porFn3httpseswikipediaorgwikiGrafo_completo4httpseswikipediaorgwikiGrafo_de_la_amistad
34 Ejemplos de grafos 57
La funcioacuten (grafoAmistad n) genera el grafo de la amistad de orden n Por ejemplo
1
2
34
5
1
2
3
4
5
6
7
-- | Ejemplos
-- gtgtgt pp $ grafoAmistad 2
-- G [12345]
-- [(1 2)(1 3)(1 4)(1 5)(2 3)(4 5)]
-- gtgtgt pp $ grafoAmistad 3
-- G [1234567]
-- [(1 2)(1 3)(1 4)(1 5)(1 6)(1 7)(2 3)
-- (4 5)(6 7)]
grafoAmistad Int -gt Grafo Int
grafoAmistad n =
creaGrafo [12n+1]
([(1a) | a lt- [22n+1]] ++
[(ab) | (ab) lt-zip [242n] [352n+1]])
344 Grafo completo
Definicioacuten 344 El grafo completo 5 de orden n K(n) es un grafo no dirigido cuyoconjunto de veacutertices viene dado por V = 1 n y tiene una arista entre cada par deveacutertices distintos
La funcioacuten (completo n) nos genera el grafo completo de orden n Por ejemplo
5httpseswikipediaorgwikiGrafo_completo
58 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
1
2
3
4
-- | Ejemplo
-- gtgtgt completo 4
-- G [1234] [(12)(13)(14)(23)(24)(34)]
completo Int -gt Grafo Int
completo n =
creaGrafo [1n]
[(ab) | a lt- [1n] b lt- [1a-1]]
345 Grafo bipartito
Definicioacuten 345 Un grafo bipartito 6 es un grafo G = (V A) verificando que elconjunto de sus veacutertices se puede dividir en dos subconjuntos disjuntos V1 V2 tales queV1 cupV2 = V de manera que forallu1 u2 isin V1[(u1 u2) 6isin A] y forallv1 v2 isin V2[(v1 v2) 6isin A]Un grafo bipartito completo 7 seraacute entonces un grafo bipartito G = (V1 cup V2 A) en elque todos los veacutertices de una particioacuten estaacuten conectados a los de la otra Si n = |V1| m =
|V2| denotamos al grafo bipartito G = (V1 cupV2 A) por Knm
La funcioacuten (bipartitoCompleto n m) nos genera el grafo bipartito Knm Por ejem-plo
1 2
3 4 5
-- | Ejemplo
-- gtgtgt bipartitoCompleto 2 3
-- G [12345] [(13)(14)(15)(23)(24)(25)]
bipartitoCompleto Int -gt Int -gt Grafo Int
bipartitoCompleto n m =
creaGrafo [1n+m]
[(ab) | a lt- [1n] b lt- [n+1n+m]]
6httpseswikipediaorgwikiGrafo_bipartito7httpseswikipediaorgwikiGrafo_bipartito_completo
34 Ejemplos de grafos 59
La funcioacuten (conjuntosVerticesDisjuntos g) devuelve Nothing si el grafo g no esbipartito y Just(xsys) si lo es donde xs ys es una particioacuten disjunta de los veacuterticesde g
-- | Ejemplo
-- gtgtgt conjuntosVerticesDisjuntos (bipartitoCompleto 3 4)
-- Just ([321][7654])
-- gtgtgt conjuntosVerticesDisjuntos (grafoCiclo 5)
-- Nothing
-- gtgtgt conjuntosVerticesDisjuntos (grafoCiclo 6)
-- Just ([531][642])
conjuntosVerticesDisjuntos Ord a =gt Grafo a -gt Maybe ([a][a])
conjuntosVerticesDisjuntos g
| null (vertices g) = Just ([][])
| otherwise = aux (vertices g) [] [] [] []
where u = union
a = adyacentes g
d xs x = xs [x]
aux [] _ _ r b = if (null (intersect r b))
then (Just (rb))
else Nothing
aux (vvs) [] [] [] [] = aux vs (a v) [v] [v] []
aux (vvs) [] c r b
| null (a v) = aux vs [] (vc) (vr) b
| null ((a v) c) =
if (or [elem u r | u lt- (a v)])
then (if (or [elem u b | u lt- (a v)])
then Nothing
else (aux vs [] (vc) r (vb)))
else (aux vs [] (vc) (vr) b)
| otherwise =
if (or [elem u r | u lt- (a v)])
then (if (or [elem u b | u lt- (a v)])
then Nothing
else (aux vs ((a v) c) (vc) r (vb)))
else (aux vs ((a v) c) (vc) (vr) b)
aux vs (qqs) c r b
| null ((a q) c) =
if (or [elem u r | u lt- (a q)])
then (if (or [elem u b | u lt- (a q)])
then Nothing
else (aux (d vs q) qs (qc) r (qb)))
else (aux (d vs q) qs (qc) (qr) b)
| otherwise =
if (or [elem u r | u lt- (a q)])
then (if (or [elem u b | u lt- (a q)])
then Nothing
else (aux (d vs q) (u ((a q) c) qs)
60 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
(qc) r (qb)))
else (aux (d vs q) (u ((a q) c) qs)
(qc) (qr) b)
La funcioacuten (esBipartito g) se verifica si el grafo g es bipartito
-- | Ejemplo
-- gtgtgt esBipartito (bipartitoCompleto 3 4)
-- True
-- gtgtgt esBipartito (grafoCiclo 5)
-- False
-- gtgtgt esBipartito (grafoCiclo 6)
-- True
esBipartito Ord a =gt Grafo a -gt Bool
esBipartito g = isJust (conjuntosVerticesDisjuntos g)
346 Grafo estrella
Definicioacuten 346 Una estrella 8 de orden n es el grafo bipartito completo K1n Denota-remos a una estrella de orden n por Sn Una estrella con 3 aristas se conoce en ingleacutes comoclaw (garra o garfio)
La funcioacuten (grafoEstrella n) crea un grafo circulante a partir de su orden n
2
34
56
1
-- | Ejemplo
-- gtgtgt grafoEstrella 5
-- G [123456] [(12)(13)(14)(15)(16)]
grafoEstrella Int -gt Grafo Int
grafoEstrella = bipartitoCompleto 1
347 Grafo rueda
Definicioacuten 347 Un grafo rueda 9 de orden n es un grafo no dirigido y no ponderado conn veacutertices que se forma conectando un uacutenico veacutertice a todos los veacutertices de un ciclo Cnminus1 Lodenotaremos por Wn8httpsenwikipediaorgwikiStar_(graph_theory))9httpseswikipediaorgwikiGrafo_rueda
34 Ejemplos de grafos 61
La funcioacuten (grafoRueda n) crea un grafo rueda a partir de su orden n
2
34
56
1
-- | Ejemplo
-- gtgtgt pp $ grafoRueda 6
-- G [123456]
-- [(1 2)(1 3)(1 4)(1 5)(1 6)(2 3)(2 6)
-- (3 4)(4 5)(5 6)]
grafoRueda Int -gt Grafo Int
grafoRueda n =
creaGrafo [1n]
([(1a) | a lt- [2n]] ++
[(ab) | (ab) lt- zip (2[2n-1]) (3n[4n])])
348 Grafo circulante
Definicioacuten 348 Un grafo circulante 10 de orden n ge 3 y saltos s1 sk es un grafono dirigido y no ponderado G = (1 n A) en el que cada nodo foralli isin V es adyacente alos 2k nodos iplusmn s1 iplusmn sk mod n Lo denotaremos por Cirs1sk
n
La funcioacuten (grafoCirculante n ss) crea un grafo circulante a partir de su orden n
y de la lista de sus saltos ss Por ejemplo
2
34
5
6 1
-- | Ejemplo
-- gtgtgt pp $ grafoCirculante 6 [12]
-- G [123456]
-- [(1 2)(1 3)(1 5)(1 6)(2 3)(2 4)(2 6)
-- (3 4)(3 5)(4 5)(4 6)(5 6)]
grafoCirculante Int -gt [Int] -gt Grafo Int
grafoCirculante n ss =
10httpsenwikipediaorgwikiCirculant_graph
62 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
creaGrafo [1n]
[(ab) | a lt- [1n]
b lt- sort (auxCir a ss n)
a lt b]
where auxCir v ss1 k =
concat [[fun (v+s) k fun (v-s) k] | s lt- ss1]
fun a b = if mod a b == 0 then b else mod a b
349 Grafo de Petersen generalizado
El grafo de Petersen generalizado 11 que denotaremos GPnk (con n ge 3 y 1 le k le(nminus 1)2) es un grafo formado por un grafo circulante Cirn
k en el interior rodeadopor un ciclo Cn al que estaacute conectado por una arista saliendo de cada veacutertice deforma que se creen n poliacutegonos regulares El grafo GPnk tiene 2n veacutertices y 3n aristasLa funcioacuten (grafoPetersenGen n k) devuelve el grafo de Petersen generalizadoGPnk
1
2
3
4
5
6
7
8
-- | Ejemplo
-- gtgtgt pp $ grafoPetersenGen 4 2
-- G [12345678]
-- [(1 3)(1 5)(2 4)(2 6)(3 7)(4 8)(5 6)
-- (5 8)(6 7)(7 8)]
grafoPetersenGen Int -gt Int -gt Grafo Int
grafoPetersenGen n k =
creaGrafo [12n]
(filter p (aristas (grafoCirculante n [k])) ++
[(xx+n) | x lt- [1n]] ++
(n+1n+2) (n+12n) [(xx+1) | x lt- [n+22n-1]])
where p (ab) = a lt b
11httpsenwikipediaorgwikiGeneralized_Petersen_graph
34 Ejemplos de grafos 63
3410 Otros grafos importantes
Grafo de Thomson
Definicioacuten 349 El grafo bipartito completo K33 es conocido como el grafo de Thomsony como veremos maacutes adelante seraacute clave a la hora de analizar propiedades topoloacutegicas de losgrafos
1 2 3
4 5 6
La funcioacuten (grafoThomson) genera el grafo de Thomson
-- | Ejemplo
-- gtgtgt pp $ grafoThomson
-- G [123456]
-- [(1 4)(1 5)(1 6)(2 4)(2 5)(2 6)(3 4)
-- (3 5)(3 6)]
grafoThomson Grafo Int
grafoThomson = bipartitoCompleto 3 3
Grafo de Heawood
El grafo de Heawood 12 es un grafo no dirigido regular con 14 veacutertices y 21 aris-tas Todos sus veacutertices son incidentes a exactamente 3 aristas es decir es un grafocuacutebico Tiene importantes propiedades geomeacutetricas y topoloacutegicas
1
2
3
45
6
7
8
9
10
11 12
13
14
12httpsenwikipediaorgwikiHeawood_graph
64 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten grafoHeawood genera el grafo de Heawood
-- | Ejemplo
-- gtgtgt pp $ grafoHeawood
-- G [1234567891011121314]
-- [(1 2)(1 6)(1 14)(2 3)(2 11)(3 4)(3 8)
-- (4 5)(4 13)(5 6)(5 10)(6 7)(7 8)(7 12)
-- (8 9)(9 10)(9 14)(10 11)(11 12)(12 13)
-- (13 14)]
grafoHeawood Grafo Int
grafoHeawood =
creaGrafo [114]
(aristas (grafoCiclo 14) ++
zip [1 23 4 5 7 9]
[611813101214])
Grafo de McGee
El grafo de McGee 13 es un grafo no dirigido cuacutebico con 24 veacutertices y 36 aristasTiene importantes propiedades geomeacutetricas y topoloacutegicas
1
2
3
45
6789
10
11
12
13
14
15
1617
18 19 2021
22
23
24
La funcioacuten grafoMcGee genera el grafo de McGee
-- | Ejemplo
-- gtgtgt pp $ grafoMcGee
-- G [12345678910111213141516171819
-- 2021222324]
-- [(1 2)(1 13)(1 24)(2 3)(2 9)(3 4)(3 20)
13httpsenwikipediaorgwikiMcGee_graph
34 Ejemplos de grafos 65
-- (4 5)(4 16)(5 6)(5 12)(6 7)(6 23)(7 8)
-- (7 19)(8 9)(8 15)(9 10)(10 11)(10 22)
-- (11 12)(11 18)(12 13)(13 14)(14 15)
-- (14 21)(15 16)(16 17)(17 18)(17 24)
-- (18 19)(19 20)(20 21)(21 22)(22 23)
-- (23 24)]
grafoMcGee Grafo Int
grafoMcGee =
creaGrafo [124]
(aristas (grafoCiclo 24) ++
zip [ 12 3 4 5 6 7 810111417]
[13920161223191522182124])
Grafo TuttendashCoxeter
El grafo TuttendashCoxeter 14 es un grafo no dirigido cuacutebico con 30 veacutertices y 45 aristasTiene importantes propiedades geomeacutetricas y topoloacutegicas
1
2
3
4
56
7891011
12
13
14
15
16
17
18
19
2021
22 23 24 2526
27
28
29
30
La funcioacuten grafoTutteCoxeter genera el grafo TuttendashCoxeter
-- | Ejemplo
-- gtgtgt pp $ grafoTutteCoxeter
-- G [12345678910111213141516171819
-- 2021222324252627282930]
14httpsenwikipediaorgwikiTutteT1textendashCoxeter_graph
66 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- [(1 2)(1 18)(1 30)(2 3)(2 23)(3 4)
-- (3 10)(4 5)(4 27)(5 6)(5 14)(6 7)(6 19)
-- (7 8)(7 24)(8 9)(8 29)(9 10)(9 16)
-- (10 11)(11 12)(11 20)(12 13)(12 25)
-- (13 14)(13 30)(14 15)(15 16)(15 22)
-- (16 17)(17 18)(17 26)(18 19)(19 20)
-- (20 21)(21 22)(21 28)(22 23)(23 24)
-- (24 25)(25 26)(26 27)(27 28)(28 29)
-- (29 30)]
grafoTutteCoxeter Grafo Int
grafoTutteCoxeter =
creaGrafo [130]
(aristas (grafoCiclo 30) ++
zip [ 1 2 3 4 5 6 7 8 9111213151721]
[182310271419242916202530222628])
Grafo de Petersen
El grafo de Petersen 15 se define como el grafo de Petersen generalizado GP52 esdecir es un grafo cuacutebico formado por los veacutertices de un pentaacutegono conectados alos veacutertices de una estrella de cinco puntas en la que cada nodo es adyacente a losnodos que estaacuten a un salto 2 de eacutel Es usado como ejemplo y como contraejemplo enmuchos problemas de la Teoriacutea de grafos
6
7
8 9
101
2
3 4
5
La funcioacuten grafoPetersen devuelve el grafo de Petersen
-- | Ejemplo
-- gtgtgt pp $ grafoPetersen
-- G [12345678910]
-- [(1 3)(1 4)(1 6)(2 4)(2 5)(2 7)(3 5)
-- (3 8)(4 9)(5 10)(6 7)(6 10)(7 8)(8 9)
-- (9 10)]
grafoPetersen Grafo Int
grafoPetersen = grafoPetersenGen 5 2
15httpsenwikipediaorgwikiPetersen_graph
35 Definiciones y propiedades 67
Grafo de MoeumlbiusndashCantor
El grafo de MoeumlbiusndashCantor 16 se define como el grafo de Petersen generalizadoGP83 es decir es un grafo cuacutebico formado por los veacutertices de un octoacutegono conecta-dos a los veacutertices de una estrella de ocho puntas en la que cada nodo es adyacente alos nodos que estaacuten a un salto 3 de eacutel Al igual que el grafo de Petersen tiene impor-tantes propiedades que lo hacen ser ejemplo y contraejemplo de muchos problemasde la Teoriacutea de Grafos
9
10
11
12
13
14
15
16
1
23
4
5
67
8
La funcioacuten grafoMoebiusCantor genera el grafo de MoeumlbiusndashCantor
-- | Ejemplo
-- gtgtgt pp $ grafoMoebiusCantor
-- G [12345678910111213141516]
-- [(1 4)(1 6)(1 9)(2 5)(2 7)(2 10)(3 6)
-- (3 8)(3 11)(4 7)(4 12)(5 8)(5 13)(6 14)
-- (7 15)(8 16)(9 10)(9 16)(10 11)(11 12)
-- (12 13)(13 14)(14 15)(15 16)]
grafoMoebiusCantor Grafo Int
grafoMoebiusCantor = grafoPetersenGen 8 3
35 Definiciones y propiedades
Una vez construida una pequentildea fuente de ejemplos estamos en condiciones deimplementar las definiciones sobre grafos en Haskell y ver que funcionan correc-tamente Ademaacutes comprobaremos que se cumplen las propiedades baacutesicas que sehan presentado en el tema Introduccioacuten a la teoriacutea de grafos de ldquoMatemaacutetica discretardquo([4])
16httpsenwikipediaorgwikiMoeumlbius-Kantor_graph
68 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Nota 351 Se utilizaraacute el tipo abstracto de grafos presentados en la seccioacuten 32 y seutilizaraacuten las librerias DataList y TestQuickCheck
351 Definiciones de grafos
Definicioacuten 351 El orden de un grafo G = (V A) se define como su nuacutemero de veacuterticesLo denotaremos por |V(G)|
La funcioacuten (orden g) devuelve el orden del grafo g
-- | Ejemplos
-- gtgtgt orden (grafoCiclo 4)
-- 4
-- gtgtgt orden (grafoEstrella 4)
-- 5
orden Grafo a -gt Int
orden = length vertices
Definicioacuten 352 El tamantildeo de un grafo G = (V A) se define como su nuacutemero de aristasLo denotaremos por |A(G)|
La funcioacuten (tamantildeo g) devuelve el orden del grafo g
-- | Ejemplos
-- gtgtgt tamantildeo (grafoCiclo 4)
-- 4
-- gtgtgt tamantildeo grafoPetersen
-- 15
tamantildeo Grafo a -gt Int
tamantildeo = length aristas
Definicioacuten 353 Diremos que dos aristas a aprime son incidentes si tienen interseccioacuten novaciacutea es decir si tienen alguacuten veacutertice en comuacuten
La funcioacuten (sonIncidentes a a) se verifica si las aristas a y a son incidentes
-- | Ejemplos
-- gtgtgt sonIncidentes (12) (24)
-- True
-- gtgtgt sonIncidentes (12) (34)
-- False
sonIncidentes Eq a =gt (aa) -gt (aa) -gt Bool
sonIncidentes (u1u2) (v1v2) =
or [u1 == v1 u1 == v2 u2 == v1 u2 == v2]
Definicioacuten 354 Diremos que una arista de un grafo G es un lazo si va de un veacutertice ensiacute mismo
35 Definiciones y propiedades 69
La funcioacuten (lazos g) devuelve los lazos del grafo g
-- | Ejemplos
-- gtgtgt lazos (creaGrafo [12] [(11)(12)(22)])
-- [(11)(22)]
-- gtgtgt lazos (grafoCiclo 5)
-- []
lazos Eq a =gt Grafo a -gt [(aa)]
lazos g = [(uv) | (uv) lt- aristas g u == v]
La funcioacuten (esLazo a) se verifica si la arista a es un lazo
-- | Ejemplos
-- gtgtgt esLazo (44)
-- True
-- gtgtgt esLazo (12)
-- False
esLazo Eq a =gt (aa) -gt Bool
esLazo (uv) = u == v
Definicioacuten 355 Dado un grafo G = (V A) fijado un veacutertice v isin V al conjunto deveacutertices que son adyacentes a v lo llamaremos entorno de v y lo denotaremos por N(v) =u isin V|(u v) isin A
La funcioacuten (entorno g v) devuelve el entorno del veacutertice v en el grafo g
-- | Ejemplo
-- gtgtgt entorno (creaGrafo [15] [(12)(13)(23)]) 2
-- [13]
entorno Eq a =gt Grafo a -gt a -gt [a]
entorno = adyacentes
Definicioacuten 356 Sea G = (V A) un grafo El grado (o valencia) de v isin V es grad(v) =|N(v)|
La funcioacuten (grado g v) devuelve el grado del veacutertice v en el grafo g
-- | Ejemplos
-- gtgtgt grado (creaGrafo [15] [(12)(13)(23)]) 2
-- 2
-- gtgtgt grado (grafoEstrella 5) 1
-- 5
grado Eq a =gt Grafo a -gt a -gt Int
grado g v = length (entorno g v)
Definicioacuten 357 Un veacutertice v de un grafo es aislado si su grado es 0
La funcioacuten (esAislado g v) se verifica si el veacutertice v es aislado en el grafo g
70 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- | Ejemplos
-- gtgtgt esAislado (creaGrafo [15] [(12)(13)(23)]) 4
-- True
-- gtgtgt esAislado (creaGrafo [15] [(12)(13)(23)]) 3
-- False
esAislado Eq a =gt Grafo a -gt a -gt Bool
esAislado g v = grado g v == 0
Definicioacuten 358 Un grafo es regular si todos sus veacutertices tienen el mismo grado
La funcioacuten (esRegular g) se verifica si el grafo g es regular
-- | Ejemplos
-- gtgtgt esRegular (creaGrafo [13] [(12)(13)(23)])
-- True
-- gtgtgt esRegular (creaGrafo [14] [(12)(13)(24)])
-- False
esRegular Eq a =gt Grafo a -gt Bool
esRegular g = all (==x) xs
where (xxs) = [grado g v | v lt- vertices g]
Definicioacuten 359 Dado un grafo G = (V A) llamamos valencia miacutenima o grado miacuteni-mo de G al valor δ(G) = mıngrad(v)|v isin V
La funcioacuten (valenciaMin g) devuelve la valencia miacutenima del grafo g
-- | Ejemplo
-- gtgtgt valenciaMin (creaGrafo [14] [(12)(13)(24)])
-- 1
valenciaMin Ord a =gt Grafo a -gt Int
valenciaMin g = minimum [grado g v | v lt- vertices g]
Definicioacuten 3510 Dado un grafo G = (V A) llamamos valencia maacutexima o gradomaacuteximo de G al valor δ(G) = maxgrad(v)|v isin V
La funcioacuten (valenciaMax g) devuelve la valencia maacutexima del grafo g
-- | Ejemplo
-- gtgtgt valenciaMax (creaGrafo [14] [(12)(13)(24)])
-- 2
valenciaMax Ord a =gt Grafo a -gt Int
valenciaMax g = maximum [grado g v | v lt- vertices g]
Definicioacuten 3511 Se dice que un grafo es simple si no contiene lazos ni aristas repetidas
La funcioacuten (esSimple g) se verifica si g es un grafo simple
35 Definiciones y propiedades 71
-- | Ejemplos
-- gtgtgt esSimple (creaGrafo [13] [(12)(13)(23)])
-- True
-- gtgtgt esSimple (creaGrafo [13] [(11)(12)(23)])
-- False
esSimple Ord a =gt Grafo a -gt Bool
esSimple g =
and [not ((xx) `aristaEn` g) | x lt- vertices g]
Definicioacuten 3512 Sea G un grafo Llamamos secuencia de grados de G a la lista degrados de sus veacutertices La secuencia se suele presentar en orden decreciente d1 ge d2 gemiddot middot middot ge dn
La funcioacuten (secuenciaGrados g) devuelve la secuencia de los grados del grafo g enorden decreciente
-- | Ejemplo
-- gtgtgt secuenciaGrados (creaGrafo [15] [(12)(13)(14)(24)])
-- [32210]
secuenciaGrados Eq a =gt Grafo a -gt [Int]
secuenciaGrados g = sortBy (flip compare) [grado g v | v lt- vertices g]
Nota 352 iquestQueacute listas de n nuacutemeros enteros son secuencias de grafos de n veacuterticesbull Si sumn
i=1 di es impar no hay ningunobull Si sumn
i=1 di es par entonces siempre hay un grafo con esa secuencia de grados (aun-que no necesariamente simple)
Definicioacuten 3513 Una secuencia graacutefica es una lista de nuacutemero enteros no negativos quees la secuencia de grados para alguacuten grafo simple
La funcioacuten (secuenciaGrafica ss) se verifica si existe alguacuten grafo con la secuenciade grados ss
-- | Ejemplos
-- gtgtgt secuenciaGrafica [32210]
-- True
-- gtgtgt secuenciaGrafica [3222]
-- False
secuenciaGrafica [Int] -gt Bool
secuenciaGrafica ss = even (sum ss) ampamp all p ss
where p s = s gt= 0 ampamp s lt= length ss
Definicioacuten 3514 Dado un grafo G = (V A) diremos que Gprime = (Vprime Aprime) es un subgrafode G si Vprime sube V y Aprime sube A
72 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (esSubgrafo g g) se verifica si g es un subgrafo de g
-- |Ejemplos
-- gtgtgt esSubgrafo (bipartitoCompleto 3 2) (bipartitoCompleto 3 3)
-- True
-- gtgtgt esSubgrafo (grafoEstrella 4) (grafoEstrella 5)
-- True
-- gtgtgt esSubgrafo (completo 5) (completo 4)
-- False
-- gtgtgt esSubgrafo (completo 3) (completo 4)
-- True
esSubgrafo Ord a =gt Grafo a -gt Grafo a -gt Bool
esSubgrafo g g =
vertices g `esSubconjunto` vertices g ampamp
aristas g `esSubconjunto` aristas g
Definicioacuten 3515 Si Gprime = (Vprime Aprime) es un subgrafo de G = (V A) tal que Vprime = Vdiremos que Gprime es un subgrafo maximal grafo recubridor o grafo de expansioacuten (eningleacutes spanning grah) de G
La funcioacuten (esSubgrafoMax g g) se verifica si g es un subgrafo maximal de g
-- | Ejemplos
-- gtgtgt esSubgrafoMax (grafoRueda 3) (grafoRueda 4)
-- False
-- gtgtgt esSubgrafoMax (grafoCiclo 4) (grafoRueda 4)
-- True
-- gtgtgt esSubgrafoMax (creaGrafo [13] [(12)]) (grafoCiclo 3)
-- True
-- gtgtgt esSubgrafoMax (creaGrafo [12] [(12)]) (grafoCiclo 3)
-- False
esSubgrafoMax Ord a =gt Grafo a -gt Grafo a -gt Bool
esSubgrafoMax g g =
g `esSubgrafo` g ampamp conjuntosIguales (vertices g) (vertices g)
Definicioacuten 3516 Sean Gprime = (Vprime Aprime) G = (V A) dos grafos si Vprime sub V o Aprime sub A sedice que Gprime es un subgrafo propio de G y se denota por Gprime sub G
La funcioacuten (esSubgrafoPropio g g) se verifica si g es un subgrafo propio de g
-- | Ejemplos
-- gtgtgt esSubgrafoPropio (grafoRueda 3) (grafoRueda 4)
-- True
-- gtgtgt esSubgrafoPropio (grafoRueda 4) (grafoCiclo 5)
-- False
-- gtgtgt esSubgrafoPropio (creaGrafo [13] [(12)]) (grafoCiclo 3)
-- True
-- gtgtgt esSubgrafoPropio (creaGrafo [12] [(12)]) (grafoCiclo 3)
35 Definiciones y propiedades 73
-- True
esSubgrafoPropio Ord a =gt Grafo a -gt Grafo a -gt Bool
esSubgrafoPropio g g =
esSubgrafo g g ampamp
(not (conjuntosIguales (vertices g) (vertices g)) ||
not (conjuntosIguales (aristas g) (aristas g)))
352 Propiedades de grafos
Teorema 3517 (Lema del apretoacuten de manos) En todo grafo simple el nuacutemero de veacuterticesde grado impar es par o cero
Vamos a comprobar que se verifica el lema del apretoacuten de manos utilizando la fun-cioacuten prop_LemaApretonDeManos
ghcigt quickCheck prop_LemaApretonDeManos
+++ OK passed 100 tests
prop_LemaApretonDeManos Grafo Int -gt Bool
prop_LemaApretonDeManos g =
even (length (filter odd [grado g v | v lt- vertices g]))
where g = creaGrafo (vertices g)
[(xy) | (xy) lt- aristas g x = y]
Teorema 3518 (HavelndashHakimi) Si n gt 1 y D = [d1 dn] es una lista de enterosentonces D es secuencia graacutefica si y soacutelo si la secuencia Dprime obtenida borrando el mayorelemento dmax y restando 1 a los siguientes dmax elementos maacutes grandes es graacutefica
Vamos a comprobar que se verifica el teorema de HavelndashHakimi utilizando la fun-cioacuten prop_HavelHakimi
ghcigt quickCheck prop_HavelHakimi
+++ OK passed 100 tests
prop_HavelHakimi [Int] -gt Bool
prop_HavelHakimi [] = True
prop_HavelHakimi (sss) =
not (secuenciaGrafica (sss) ampamp not (esVacio ss)) ||
secuenciaGrafica (map (x -gt x-1) (take s ss) ++ drop s ss)
353 Operaciones y propiedades sobre grafos
Eliminacioacuten de una arista
Definicioacuten 3519 Sea G = (V A) un grafo y sea (u v) isin A Definimos el grafo G (u v) como el subgrafo de G Gprime = (Vprime Aprime) con Vprime = V y Aprime = A (u v) Esta
74 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
operacioacuten se denomina eliminar una arista
La funcioacuten (eliminaArista g a) elimina la arista a del grafo g
-- | Ejemplos
-- gtgtgt eliminaArista (creaGrafo [14] [(12)(14)(24)]) (14)
-- G [1234] [(12)(24)]
-- gtgtgt eliminaArista (creaGrafo [14] [(12)(14)(24)]) (41)
-- G [1234] [(12)(24)]
-- gtgtgt eliminaArista (creaGrafo [14] [(12)(14)(24)]) (43)
-- G [1234] [(12)(14)(24)]
eliminaArista Ord a =gt Grafo a -gt (aa) -gt Grafo a
eliminaArista g (ab) =
creaGrafo (vertices g)
(aristas g [(ab)(ba)])
La funcioacuten (eliminaLazos g) devuelve un nuevo grafo obtenido a partir del grafog eliminando todas las aristas que fueran lazos
-- | Ejemplos
-- gtgtgt eliminaLazos (creaGrafo [12] [(11)(12)(22)])
-- G [12] [(12)]
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
-- gtgtgt eliminaLazos (grafoCiclo 5)
-- G [12345] [(12)(15)(23)(34)(45)]
eliminaLazos Ord a =gt Grafo a -gt Grafo a
eliminaLazos g = creaGrafo (vertices g)
[(xy) | (xy) lt- aristas g x = y]
Eliminacioacuten un veacutertice
Definicioacuten 3520 Sea G = (V A) un grafo y sea v isin V Definimos el grafo G v como elsubgrafo de G Gprime = (Vprime Aprime) con Vprime = V v y Aprime = A a isin A|v es un extremo de aEsta operacioacuten se denomina eliminar un veacutertice
La funcioacuten (eliminaVertice g v) elimina el veacutertice v del grafo g
-- | Ejemplos
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(24)]) 1
-- G [234] [(24)]
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(24)]) 4
-- G [123] [(12)]
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(24)]) 3
-- G [124] [(12)(14)(24)]
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(13)]) 1
-- G [234] []
eliminaVertice Ord a =gt Grafo a -gt a -gt Grafo a
35 Definiciones y propiedades 75
eliminaVertice g v =
creaGrafo (vertices g [v])
(as [(ab) | (ab) lt- as a == v || b == v])
where as = aristas g
Suma de aristas
Definicioacuten 3521 Sea G = (V A) un grafo y sean u v isin V tales que (u v) (v u) 6isin ADefinimos el grafo G + (u v) como el grafo Gprime = (V A cup (u v)) Esta operacioacuten sedenomina suma de una arista
La funcioacuten (sumaArista g a) suma la arista a al grafo g
-- | Ejemplos
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
-- gtgtgt sumaArista (grafoCiclo 5) (13)
-- G [12345] [(12)(13)(15)(23)(34)(45)]
sumaArista Ord a =gt Grafo a -gt (aa) -gt Grafo a
sumaArista g a =
creaGrafo (vertices g) (a aristas g)
Suma de veacutertices
Definicioacuten 3522 Sea G = (V A) un grafo y sea v 6isin V Definimos el grafo G + v comoel grafo Gprime = (Vprime Aprime) donde Vprime = V cup v Aprime = Acup (u v)|u isin V Esta operacioacuten sedenomina suma de un veacutertice
La funcioacuten (sumaVertice g a) suma el veacutertice a al grafo g
-- | Ejemplo
-- gtgtgt grafoCiclo 3
-- G [123] [(12)(13)(23)]
-- gtgtgt sumaVertice (grafoCiclo 3) 4
-- G [1234] [(12)(13)(14)(23)(24)(34)]
sumaVertice Ord a =gt Grafo a -gt a -gt Grafo a
sumaVertice g v =
creaGrafo (v vs) (aristas g ++ [(uv) | u lt- vs])
where vs = vertices g
Propiedad de los grafos completos
Proposicioacuten 3523 La familia de grafos completos Kn verifica que Kn = Knminus1 + n
Vamos a ver que se cumple la propiedad utilizando la funcioacuten prop_completos
76 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
ghcigt quickCheck prop_completos
+++ OK passed 100 tests
prop_completos Int -gt Property
prop_completos n = n gt= 2 ==gt
completo n == sumaVertice (completo (n-1)) n
A partir de esta propiedad se puede dar una definicioacuten alternativa de la funcioacuten(completo n) que devuelve el grafo completo Kn La nueva funcioacuten seraacute (completo2n)
completo2 Int -gt Grafo Int
completo2 0 = grafoNulo
completo2 n = sumaVertice (completo2 (n-1)) n
Vamos a comprobar la equivalencia de ambas deficiones
ghcigt prop_EquiCompleto
True
prop_EquiCompleto Bool
prop_EquiCompleto = and [completo n == completo2 n | n lt- [050]]
Vamos a ver cuaacutel de las definiciones es maacutes eficiente
ghcigt tamantildeo (completo 100)
4950
(117 secs 0 bytes)
ghcigt tamantildeo (completo2 100)
4950
(1549 secs 61756056 bytes)
La funcioacuten (completo n) es maacutes eficiente asiacute que seraacute la que seguiremos utilizando
Suma de grafos
Definicioacuten 3524 Sean G = (V A) Gprime = (Vprime A) dos grafos Definimos el grafo sumade G y Gprime como el grafo G + Gprime = (V cup Vprime A cup Aprime cup (u v)|u isin V v isin Vprime) Estaoperacioacuten se denomina suma de grafos
La funcioacuten (sumaGrafos g g) suma los grafos g y g
-- | Ejemplo
-- gtgtgt let g1 = creaGrafo [13] [(11)(13)(23)]
-- gtgtgt let g2 = creaGrafo [46] [(46)(56)]
-- gtgtgt pp $ sumaGrafos g1 g2
-- G [123456]
-- [(1 1)(1 3)(1 4)(1 5)(1 6)(2 3)(2 4)
-- (2 5)(2 6)(3 4)(3 5)(3 6)(4 6)(5 6)]
sumaGrafos Ord a =gt Grafo a -gt Grafo a -gt Grafo a
35 Definiciones y propiedades 77
sumaGrafos g1 g2 =
creaGrafo (vs1 `union` vs2)
(aristas g1 `union`
aristas g2 `union`
[(uv) | u lt- vs1 v lt- vs2])
where vs1 = vertices g1
vs2 = vertices g2
Unioacuten de grafos
Definicioacuten 3525 Sean G = (V A) Gprime = (Vprime A) dos grafos Definimos el grafo unioacutende G y Gprime como el grafo G cup H = (V cupVprime A cup Aprime) Esta operacioacuten se denomina unioacuten degrafos
La funcioacuten (unionGrafos g g) une los grafos g y g Por ejemplo
-- | Ejemplo
-- gtgtgt let g1 = creaGrafo [13] [(11)(13)(23)]
-- gtgtgt let g2 = creaGrafo [46] [(46)(56)]
-- gtgtgt unionGrafos g1 g2
-- G [123456] [(11)(13)(23)(46)(56)]
unionGrafos Ord a =gt Grafo a -gt Grafo a -gt Grafo a
unionGrafos g1 g2 =
creaGrafo (vertices g1 `union` vertices g2)
(aristas g1 `union` aristas g2)
Grafo complementario
Definicioacuten 3526 Dado un grafo G = (V A) se define el grafo complementario de Gcomo G = (V A) donde A = (u v)|u v isin V (u v) 6isin A
La funcioacuten (grafoComplementario g) devuelve el grafo complementario de g
-- | Ejemplo
-- gtgtgt grafoComplementario (creaGrafo [13] [(11)(13)(23)])
-- G [123] [(12)(22)(33)]
grafoComplementario Ord a =gt Grafo a -gt Grafo a
grafoComplementario g =
creaGrafo vs
[(uv)| u lt- vs v lt- vs u lt= v not ((uv) `aristaEn` g)]
where vs = vertices g
Definicioacuten 3527 Dado un grafo diremos que es completo si su complementario sin lazosno tiene aristas
La funcioacuten (esCompleto g) se verifica si el grafo g es completo
78 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- Ejemplos
-- gtgtgt esCompleto (completo 4)
-- True
-- gtgtgt esCompleto (grafoCiclo 5)
-- False
esCompleto Ord a =gt Grafo a -gt Bool
esCompleto g =
tamantildeo (eliminaLazos (grafoComplementario g)) == 0
36 Morfismos de grafos
Llegados a este punto es importante resaltar que un grafo se define como una en-tidad matemaacutetica abstracta es evidente que lo importante de un grafo no son losnombres de sus veacutertices ni su representacioacuten graacutefica La propiedad que caracterizaa un grafo es la forma en que sus veacutertices estaacuten unidos por las aristasA priori los siguientes grafos pueden parecer distintos
a
bc
de
1
23
45
Sin embargo ambos grafos son grafos de cinco veacutertices que tienen las mismas rela-ciones de vecindad entre sus nodos En esta seccioacuten estudiaremos estas relacionesque establecen las aristas entre los veacutertices de un grafo y presentaremos algoritmosque nos permitan identificar cuaacutendo dos grafos se pueden relacionar mediante apli-caciones entre sus veacutertices cumpliendo ciertas caracteriacutesicas
361 Morfismos
Definicioacuten 361 Si f es una funcioacuten entre dos grafos G = (V A) y Gprime = (Vprime Aprime)diremos que conserva la adyacencia si forallu v isin V se verifica que si (u v) isin A entonces( f (u) f (v)) isin Aprime
La funcioacuten (conservaAdyacencia g h f) se verifica si la funcioacuten f entre los grafosg y h conserva las adyacencias
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [14] [(12)(23)(34)]
-- gtgtgt let g2 = creaGrafo [14] [(12)(23)(24)]
-- gtgtgt let g3 = creaGrafo [4610] [(48)(68)(810)]
36 Morfismos de grafos 79
-- gtgtgt conservaAdyacencia g1 g3 [(14)(26)(38)(410)]
-- False
-- gtgtgt conservaAdyacencia g2 g3 [(14)(28)(36)(410)]
-- True
conservaAdyacencia (Ord a Ord b) =gt
Grafo a -gt Grafo b -gt Funcion a b -gt Bool
conservaAdyacencia g h f =
and [(imagen f ximagen f y) `aristaEn` h | (xy) lt- aristas g]
Definicioacuten 362 Dados dos grafos simples G = (V A) y Gprime = (Vprime Aprime) un morfismoentre G y Gprime es una funcioacuten φ V rarr Vprime que conserva las adyacencias
La funcioacuten (esMorfismo g h vvs) se verifica si la funcioacuten representada por vvs esun morfismo entre los grafos g y h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(12)(32)]
-- gtgtgt let g2 = creaGrafo [456] [(46)(56)]
-- gtgtgt esMorfismo g1 g2 [(14)(26)(35)]
-- True
-- gtgtgt esMorfismo g1 g2 [(14)(25)(36)]
-- False
-- gtgtgt esMorfismo g1 g2 [(14)(26)(35)(79)]
-- False
esMorfismo (Ord aOrd b) =gt Grafo a -gt Grafo b -gt
Funcion a b -gt Bool
esMorfismo g1 g2 f =
esFuncion (vertices g1) (vertices g2) f ampamp
conservaAdyacencia g1 g2 f
La funcioacuten (morfismos g h) devuelve todos los posibles morfismos entre los grafosg y h
-- | Ejemplos
-- gtgtgt grafoCiclo 3
-- G [123] [(12)(13)(23)]
-- gtgtgt let g = creaGrafo [46] [(44)(66)]
-- gtgtgt morfismos (grafoCiclo 3) g
-- [[(14)(24)(34)][(16)(26)(36)]]
-- gtgtgt morfismos g (grafoCiclo 3)
-- []
morfismos (Ord a Ord b) =gt Grafo a -gt Grafo b -gt [[(ab)]]
morfismos g h =
[f | f lt- funciones (vertices g) (vertices h)
conservaAdyacencia g h f]
80 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
362 Complejidad del problema de homomorfismo de grafos
En general en computacioacuten un problema algoriacutetmico consta de un conjunto I detodas las posibles entradas para el problema llamado el conjunto de instancias y deuna pregunta Q sobre esas instancias Resolver uno de estos problemas consiste endesarrollar un algoritmo cuya entrada es una instancia del problema y cuya salidaes una respuesta a la pregunta del problemaDecimos que un problema es de decisioacuten cuando las posibles respuestas a la pre-gunta son ldquosiacuterdquo o ldquonordquo Un ejemplo de problema de este tipo seriacutea dados dos grafosdecidir si estos son homomorfos o noA la hora de implementar un algoritmo que deacute solucioacuten al problema que estemosconsiderando es importante tener en cuenta el nuacutemero de pasos que efectuacutea hastaencontrar una respuesta Un algoritmo de tiempo polinomial se define como aquelcon funcioacuten de complejidad temporal en O(p(n)) para alguna funcioacuten polinoacutemicap donde n denota el tamantildeo de la entrada Cualquier algoritmo cuya funcioacuten decomplejidad temporal no pueda ser acotada de esta manera se denomina algoritmode tiempo exponencialLa mayoriacutea de los algoritmos de tiempo exponencial son simples variaciones de unabuacutesqueda exhaustiva mientras que los algoritmos de tiempo polinomial usualmen-te se obtienen mediante un anaacutelisis maacutes profundo de la estructura del problema Enla Teoriacutea de la complejidad computacional existe el consenso de que un problemano estaacute ldquobien resueltordquo hasta que se conozca un algoritmo de tiempo polinomialque lo resuelva Por tanto nos referiremos a un problema como ldquointratablerdquo si estan difiacutecil que no existe algoritmo de tiempo polinomial capaz de resolverloLos problemas de decisioacuten para los que existen algoritmos polinomiales consti-tuyen la clase P y son llamados polinomiales Un problema de decisioacuten es no-determiniacutestico polinomial cuando cualquier instancia que produce respuesta ldquosiacuterdquoposee una comprobacioacuten de correctitud (tambieacuten llamada certificado) verificable entiempo polinomia en el tamantildeo de la instancia Estos problemas de decisioacuten se di-ce que pertenecen a la clase NP Claramente P sube NP Sin embargo no se sabe siesta inclusioacuten es estricta uno de los principales problemas abiertos en Teoriacutea de lacomputacioacuten es saber si P 6= NPUna reduccioacuten es una transformacioacuten de un problema en otro problema Intuitiva-mente un problema Q puede ser reducido a otro problema Qprime si cualquier instanciadel problema Q puede ser ldquofaacutecilmenterdquo expresada como una instancia del problemaQprime y cuya solucioacuten proporcione una solucioacuten para la instancia de QLas reducciones en tiempo polinomial nos dotan de elementos para probar de unamanera formal que un problema es al menos tan difiacutecil que otro con una dife-rencia de un factor polinomial Estas son esenciales para definir a los problemas
36 Morfismos de grafos 81
NP-completos ademaacutes de ayudar a comprender los mismosLa clase de los problemas NP-completos contiene a los problemas maacutes difiacuteciles enNP en el sentido de que son los que esteacuten maacutes lejos de estar en P Debido a que elproblema P = NP no ha sido resuelto el hecho de reducir un problema B a otroproblema A indicariacutea que no se conoce solucioacuten en tiempo polinomial para A Estoes debido a que una solucioacuten en tiempo polinomial para A tendriacutea como conse-cuencia la existencia de una solucioacuten polinomial para B De manera similar debidoa que todos los problemas NP pueden ser reducidos a este conjunto encontrar unproblema NP-completo que pueda ser resuelto en un tiempo polinomial significariacuteaque P = NPEl problema de decidir si dos grafos son homomorfos es un problema de decisioacutenNP-completo La NP-completitud del problema se demuestra mediante la reduccioacutende este problema al problema de la clique 17En el proceso de recopilacioacuten de imformacioacuten acerca de la Teoriacutea de la complejidadse ha trabajado con dos fuentesbull la tesis de licenciatura de Pablo Burzyn ldquoComplejidad computacional en proble-
mas de modificacioacuten de aristas en grafosrdquo ([2]) ybull el artiacuteculo ldquoTeoriacutea de la complejidad computacionalrdquo ([12]) de la Wikipedia
363 Isomorfismos
Definicioacuten 363 Dados dos grafos simples G = (V A) y Gprime = (Vprime Aprime) un isomorfis-mo entre G y Gprime es un morfismo biyectivo cuyo inverso es morfismo entre Gprime y G
La funcioacuten (esIsomorfismo g h f) se verifica si la aplicacioacuten f es un isomorfismoentre los grafos g y h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt esIsomorfismo g1 g2 [(12)(24)(36)]
-- True
-- gtgtgt esIsomorfismo g1 g2 [(12)(22)(36)]
-- False
esIsomorfismo (Ord aOrd b) =gt
Grafo a -gt Grafo b -gt Funcion a b -gt Bool
esIsomorfismo g h f =
esBiyectiva vs1 vs2 f ampamp
esMorfismo g h f ampamp
esMorfismo h g (inversa f)
where vs1 = vertices g
vs2 = vertices h
17httpseswikipediaorgwikiProblema_de_la_clique
82 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (isomorfismos1 g h) devuelve todos los isomorfismos posibles entrelos grafos g y h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfismos1 g1 g2
-- [[(12)(24)(36)]]
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfismos1 g3 g4
-- []
-- gtgtgt let g5 = creaGrafo [123] [(11)(22)(33)]
-- gtgtgt let g6 = creaGrafo [246] [(22)(44)(66)]
-- gtgtgt pp $ isomorfismos1 g5 g6
-- [[(1 2)(2 4)(3 6)][(1 4)(2 2)(3 6)]
-- [(1 6)(2 4)(3 2)][(1 4)(2 6)(3 2)]
-- [(1 6)(2 2)(3 4)][(1 2)(2 6)(3 4)]]
isomorfismos1 (Ord aOrd b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos1 g h =
[f | f lt- biyecciones vs1 vs2
conservaAdyacencia g h f
conservaAdyacencia h g (inversa f)]
where vs1 = vertices g
vs2 = vertices h
Definicioacuten 364 Dos grafos G y H se dicen isomorfos si existe alguacuten isomorfismo entreellos
La funcioacuten isomorfos1 g h se verifica si los grafos g y h son isomorfos
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfos1 g1 g2
-- True
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfos1 g3 g4
-- False
isomorfos1 (Ord aOrd b) =gt Grafo a -gt Grafo b -gt Bool
isomorfos1 g = not null isomorfismos1 g
Nota 361 Al tener Haskell una evaluacioacuten perezosa la funcioacuten (isomorfos g h)
no necesita generar todos los isomorfismos entre los grafos g y h
Definicioacuten 365 Sea G = (V A) un grafo Un invariante por isomorfismos de G esuna propiedad de G que tiene el mismo valor para todos los grafos que son isomorfos a eacutel
36 Morfismos de grafos 83
esInvariantePorIsomorfismos
Eq a =gt (Grafo Int -gt a) -gt Grafo Int -gt Grafo Int -gt Bool
esInvariantePorIsomorfismos p g h =
isomorfos g h --gt (p g == p h)
where (--gt) = (lt=)
Teorema 366 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un iso-morfismo Entonces se verifica que |V(G)| = |V(Gprime)| es decir el orden de un grafo es uninvariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos orden)
+++ OK passed 100 tests
Teorema 367 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces se verifica que |A(G)| = |A(Gprime)| es decir el tamantildeo de un grafo es uninvariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos tamantildeo)
+++ OK passed 100 tests
Teorema 368 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces tienen la misma secuencia de grados es decir la secuencia de grados de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos secuenciaGrados)
+++ OK passed 100 tests
A partir de las propiedades que hemos demostrado de los isomorfismos vamos adar otra definicioacuten equivalente de las funciones (isomorfismos1 g h) y (isomorfos1
g h)
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfismos2 g1 g2
-- [[(12)(24)(36)]]
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfismos2 g3 g4
-- []
-- gtgtgt let g5 = creaGrafo [123] [(11)(22)(33)]
84 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- gtgtgt let g6 = creaGrafo [246] [(22)(44)(66)]
-- gtgtgt pp $ isomorfismos2 g5 g6
-- [[(1 2)(2 4)(3 6)][(1 4)(2 2)(3 6)]
-- [(1 6)(2 4)(3 2)][(1 4)(2 6)(3 2)]
-- [(1 6)(2 2)(3 4)][(1 2)(2 6)(3 4)]]
isomorfismos2 (Ord a Ord b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos2 g h
| orden g = orden h = []
| tamantildeo g = tamantildeo h = []
| secuenciaGrados g = secuenciaGrados h = []
| otherwise = [f | f lt- biyecciones vs1 vs2
conservaAdyacencia g h f]
where vs1 = vertices g
vs2 = vertices h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfos2 g1 g2
-- True
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfos2 g3 g4
-- False
isomorfos2 (Ord a Ord b) =gt Grafo a -gt Grafo b -gt Bool
isomorfos2 g =
not null isomorfismos2 g
isomorfismos3 (Ord a Ord b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos3 g h
| orden g = orden h = []
| tamantildeo g = tamantildeo h = []
| secuenciaGrados g = secuenciaGrados h = []
| otherwise = filter (conservaAdyacencia g h) (posibles g h)
verticesPorGrados g =
[filter (p n) (vertices g) | n lt- nub (secuenciaGrados g)]
where p m v = grado g v == m
aux1 [] _ = []
aux1 (xsxss) (ysyss) = (map (zip xs) (permutations ys))aux1 xss yss
aux2 [] = []
aux2 (xss[]) = xss
aux2 (xssyss[]) = [xs ++ ys | xs lt- xss ys lt- yss]
aux2 (xssyssxsss) =
aux2 ([xs ++ ys | xs lt- xss ys lt- yss]xsss)
36 Morfismos de grafos 85
posibles g h =
aux2 (aux1 (verticesPorGrados g) (verticesPorGrados h))
Vamos a comparar la eficiencia entre ambas definiciones
Nota 362 La nueva definicioacuten de (isomorfismos3 g h) es la maacutes eficiente con gra-fos poco regulares sin embargo cuando todos los veacutertices tienen el mismo grado(isomorfismos2 g h) sigue siendo mejor opcioacuten (aunque no hay mucha diferenciaen el coste computacional)ghcigt let n = 6 in (length (isomorfismos1 (completo n) (completo n)))
720
(018 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos2 (completo n) (completo n)))
720
(018 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos3 (completo n) (completo n)))
720
(018 secs 26123800 bytes)
ghcigt let n = 6 in (length (isomorfismos1 (grafoCiclo n) (grafoCiclo n)))
12
(004 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos2 (grafoCiclo n) (grafoCiclo n)))
12
(004 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos3 (grafoCiclo n) (grafoCiclo n)))
12
(004 secs 0 bytes)
ghcigt length (isomorfismos1 (grafoCiclo 6) (completo 7))
0
(000 secs 0 bytes)
ghcigt length (isomorfismos2 (grafoCiclo 6) (completo 7))
0
(001 secs 0 bytes)
ghcigt length (isomorfismos3 (grafoCiclo 6) (completo 7))
0
(000 secs 0 bytes)
ghcigt isomorfos1 (completo 10) (grafoCiclo 10)
False
(5190 secs 12841861176 bytes)
ghcigt isomorfos2 (completo 10) (grafoCiclo 10)
False
(000 secs 0 bytes)
ghcigt isomorfos3 (completo 10) (grafoCiclo 10)
False
86 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
(000 secs 0 bytes)
ghcigt isomorfos1 (grafoCiclo 10) (grafoRueda 10)
False
(7390 secs 16433969976 bytes)
ghcigt isomorfos2 (grafoCiclo 100) (grafoRueda 100)
False
(000 secs 0 bytes)
ghcigt isomorfos3 (grafoCiclo 100) (grafoRueda 100)
False
(000 secs 0 bytes)
ghcigt length (isomorfismos2 (grafoRueda 10) (grafoRueda 10))
18
(10112 secs 23237139992 bytes)
ghcigt length (isomorfismos3 (grafoRueda 10) (grafoRueda 10))
18
(4467 secs 9021442440 bytes)
Nota 363 Cuando los grafos son isomorfos comprobar que tienen el mismo nuacuteme-ro de veacutertices el mismo nuacutemero de aristas y la misma secuencia graacutefica no requieremucho tiempo ni espacio dando lugar a costes muy similares entre los dos paresde definiciones Sin embargo cuando los grafos tienen el mismo nuacutemero de veacuterticesy fallan en alguna de las demaacutes propiedades el resultado es muy costoso para laprimera definicioacuten mientras que es inmediato con la segundaA partir de ahora utilizaremos la funcioacuten isomorfismos2 para calcular los isomor-fismos entre dos grafos y la funcioacuten isomorfos para determinar si dos grafos sonisomorfos de modo que las renombraremos por isomorfismos y isomorfismos res-pectivamente
isomorfismos (Ord aOrd b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos = isomorfismos2
isomorfos (Ord aOrd b) =gt Grafo a -gt Grafo b -gt Bool
isomorfos = isomorfos2
364 Automorfismos
Definicioacuten 369 Dado un grafo simple G = (V A) un automorfismo de G es un iso-morfismo de G en siacute mismo
La funcioacuten (esAutomorfismo g f) se verifica si la aplicacioacuten f es un automorfismode g
-- | Ejemplos
-- gtgtgt let g = creaGrafo [123] [(12)(13)]
37 Caminos en grafos 87
-- gtgtgt esAutomorfismo g [(11)(23)(32)]
-- True
-- gtgtgt esAutomorfismo g [(12)(23)(31)]
-- False
esAutomorfismo Ord a =gt Grafo a -gt Funcion a a -gt Bool
esAutomorfismo g = esIsomorfismo g g
La funcioacuten (automorfismos g) devuelve la lista de todos los posibles automorfis-mos en g
-- | Ejemplo
-- gtgtgt automorfismos (creaGrafo [123] [(12)(13)])
-- [[(11)(22)(33)][(11)(23)(32)]]
automorfismos Ord a =gt Grafo a -gt [Funcion a a]
automorfismos g = isomorfismos1 g g
Nota 364 Cuando trabajamos con automorfismos es mejor utilizar en su defini-cioacuten la funcioacuten isomorfismos1 en vez de isomorfismos2 pues ser isomorfos es unarelacioacuten reflexiva es decir un grafo siempre es isomorfo a siacute mismo
37 Caminos en grafos
Una de las aplicaciones de la teoriacutea de grafos es la determinacioacuten de trayectos o re-corridos en una red de transporte o de distribucioacuten de productos Asiacute si cada veacuterticerepresenta un punto de intereacutes y cada arista representa una conexioacuten entre dos pun-tos usando grafos como modelos podemos simplificar el problema de encontrar laruta maacutes ventajosa en cada caso
371 Definicioacuten de camino
Definicioacuten 371 Sea G = (V A) un grafo simple y sean u v isin V dos veacutertices Uncamino entre u y v es una sucesioacuten de veacutertices de G u = v0 v1 v2 vkminus1 vk = vdonde foralli isin 0 kminus 1 (vi vi+1) isin A
La funcioacuten (esCamino g c) se verifica si la sucesioacuten de veacutertices c es un camino enel grafo g
-- | Ejemplo
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
-- gtgtgt esCamino (grafoCiclo 5) [123451]
-- True
-- gtgtgt esCamino (grafoCiclo 5) [124531]
-- False
88 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
esCamino Ord a =gt Grafo a -gt [a] -gt Bool
esCamino g c = all (`aristaEn` g) (zip c (tail c))
La funcioacuten (aristasCamino c) devuelve la lista de las aristas recorridas en el ca-mino c
-- | Ejemplos
-- gtgtgt aristasCamino [123]
-- [(12)(23)]
-- gtgtgt aristasCamino [1231]
-- [(12)(23)(13)]
-- gtgtgt aristasCamino [1232]
-- [(12)(23)(23)]
aristasCamino Ord a =gt [a] -gt [(aa)]
aristasCamino c =
map parOrdenado (zip c (tail c))
where parOrdenado (uv) | u lt= v = (uv)
| otherwise = (vu)
La funcioacuten (verticesCamino c) devuelve la lista de las vertices recorridas en elcamino c
-- | Ejemplo
-- gtgtgt verticesCamino [1231]
-- [123]
verticesCamino Ord a =gt [a] -gt [a]
verticesCamino c = nub c
Definicioacuten 372 Se llama longitud de un camino al nuacutemero de veces que se atraviesa unaarista en dicho camino
La funcioacuten (longitudCamino c) devuelve la longitud del camino c
-- | Ejemplo
-- gtgtgt longitudCamino [427]
-- 2
longitudCamino [a] -gt Int
longitudCamino c = length c - 1
La funcioacuten (todosCaminos g u v k) devuelve todos los caminos entre los veacuterticesu y v en el grafo g que tienen longitud k
-- | Ejemplo
-- gtgtgt todosCaminos (creaGrafo [12] [(12)]) 1 2 3
-- [[1212]]
-- gtgtgt todosCaminos (bipartitoCompleto 2 3) 1 3 3
-- [[1313][1323][1413][1423][1513][1523]]
todosCaminos Ord a =gt Grafo a -gt a -gt a -gt Int -gt [[a]]
todosCaminos g u v 0 = if u == v ampamp elem u (vertices g)
37 Caminos en grafos 89
then [[u]]
else []
todosCaminos g u v 1 = if aristaEn (uv) g
then [[uv]]
else []
todosCaminos g u v k =
filter p [uvs | n lt- [1k-1] w lt- a u vs lt- tC w v n]
where p xs = longitudCamino xs == k
a = adyacentes g
tC = todosCaminos g
La funcioacuten (numeroCaminosDeLongitud g u v k) es el nuacutemero de caminos de lon-gitud k uniendo los veacutertices u y v en el grafo g
-- | Ejemplos
-- gtgtgt numeroCaminosDeLongitud (completo 7) 1 4 5
-- 1111
-- gtgtgt numeroCaminosDeLongitud grafoPetersen 1 4 3
-- 5
numeroCaminosDeLongitud Ord a =gt Grafo a -gt a -gt a -gt Int -gt Int
numeroCaminosDeLongitud g u v = length todosCaminos g u v
372 Recorridos
Definicioacuten 373 Sea G = (V A) un grafo y sean u v isin V Un camino entre u y v queno repite aristas (quizaacutes veacutertices) se llama recorrido
La funcioacuten (esRecorrido g c) se verifica si el camino c es un recorrido en el grafog
-- | Ejemplo
-- gtgtgt esRecorrido (grafoCiclo 4) [214]
-- True
-- gtgtgt esRecorrido (grafoCiclo 4) [2141]
-- False
-- gtgtgt esRecorrido (grafoCiclo 4) [213]
-- False
esRecorrido Ord a =gt Grafo a -gt [a] -gt Bool
esRecorrido g c =
esCamino g c ampamp sinRepetidos (aristasCamino c)
373 Caminos simples
Definicioacuten 374 Un camino que no repite veacutertices (y por tanto tampoco aristas) se llamacamino simple
90 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (esCaminoSimple g c) se verifica si el camino c es un camino simple enel grafo g
-- | Ejemplos
-- gtgtgt esCaminoSimple (creaGrafo [12] [(11)(12)]) [112]
-- False
-- gtgtgt esCaminoSimple (grafoCiclo 4) [214]
-- True
-- gtgtgt esCaminoSimple (grafoCiclo 4) [14321]
-- True
-- gtgtgt esCaminoSimple (grafoCiclo 4) [43212]
-- False
esCaminoSimple Ord a =gt Grafo a -gt [a] -gt Bool
esCaminoSimple g [] = True
esCaminoSimple g vs =
esRecorrido g vs ampamp noRepiteVertices vs
where noRepiteVertices (xxs)
| sinRepetidos (xxs) = True
| x == last xs ampamp sinRepetidos xs = True
| otherwise = False
La funcioacuten (todosArcosBP g u v) devuelve una lista con todos los caminos simplesposibles en el grafo g entre los veacutertices u y v utilizando una algoritmo de buacutesquedaen profundidad sobre el grafo g Este algoritmo recorre el grafo de izquierda a dere-cha y de forma al visitar un nodo explora todos los caminos que pueden continuarpor eacutel antes de pasar al siquiente
-- | Ejemplos
-- gtgtgt grafoCiclo 4
-- G [1234] [(12)(14)(23)(34)]
-- gtgtgt todosArcosBP (grafoCiclo 4) 1 4
-- [[14][1234]]
-- gtgtgt todosArcosBP (grafoCiclo 4) 4 1
-- [[4321][41]]
-- gtgtgt todosArcosBP (creaGrafo [14] [(12)(34)]) 1 4
-- []
-- gtgtgt todosArcosBP (creaGrafo [12] [(11)(12)]) 1 1
-- [[1]]
todosArcosBP Ord a =gt Grafo a -gt a -gt a -gt [[a]]
todosArcosBP g x y = aux [[y]]
where aux [] = []
aux ([]zss) = aux zss
aux ((zzs)zss)
| z == x = (zzs) aux zss
| otherwise =
aux ([vzzs | v lt- adyacentes g z zs] ++ zss)
g = eliminaLazos g
eliminaLazos h = creaGrafo (vertices h)
37 Caminos en grafos 91
[(xy) | (xy) lt- aristas h x = y]
La funcioacuten (todosArcosBA g u v) devuelve una lista con todos los caminos simplesposibles en el grafo g entre los veacutertices u y v utilizando una algoritmo de buacutesquedaen anchura sobre el grafo g Este algoritmo recorre el grafo por niveles de formaque el primer camino de la lista es de longitud miacutenima
-- | Ejemplos
-- gtgtgt grafoCiclo 4
-- G [1234] [(12)(14)(23)(34)]
-- gtgtgt todosArcosBA (grafoCiclo 4) 1 4
-- [[14][1234]]
-- gtgtgt todosArcosBA (grafoCiclo 4) 4 1
-- [[41][4321]]
-- gtgtgt todosArcosBA (creaGrafo [14] [(12)(34)]) 1 4
-- []
-- gtgtgt todosArcosBA (creaGrafo [12] [(11)(12)]) 1 1
-- [[1]]
todosArcosBA Ord a =gt Grafo a -gt a -gt a -gt [[a]]
todosArcosBA g x y = aux [[y]]
where aux [] = []
aux ([]zss) = aux zss
aux ((zzs)zss)
| z == x = (zzs) aux zss
| otherwise =
aux (zss ++ [vzzs | v lt- adyacentes g z zs])
g = eliminaLazos g
Vamos a comprobar con QuickCheck que el primer elemento de la lista que de-vuelve la funcioacuten (todosArcosBA g u v) es de longitud miacutenima Para ello vamos autilizar la funcioacuten (parDeVertices g) que es un generador de pares de veacutertices delgrafo no nulo g Por ejemplo
ghcigt sample (parDeVertices (creaGrafo [19] []))
(39)
(93)
(74)
(43)
(28)
(72)
(84)
(53)
(72)
(31)
(72)
92 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
parDeVertices Grafo Int -gt Gen (IntInt)
parDeVertices g = do
x lt- elements vs
y lt- elements vs
return (xy)
where vs = vertices g
La propiedad es
prop_todosArcosBA Grafo Int -gt Property
prop_todosArcosBA g =
not (esGrafoNulo g) ==gt
forAll (parDeVertices g)
((xy) -gt let zss = todosArcosBA g x y
in null zss || longitudCamino (head zss) ==
minimum (map longitudCamino zss))
La comprobacioacuten es
ghcigt quickCheck prop_todosArcosBA
+++ OK passed 100 tests
Veamos que la funcioacuten (todosArcosBP g u v) no verifica la propiedad
ghcigt quickCheck prop_todosArcosBP
Failed Falsifiable (after 6 tests)
G [12345] [(12)(14)(15)(22)(23)(24)(44)(45)(55)]
(52)
prop_todosArcosBP Grafo Int -gt Property
prop_todosArcosBP g =
not (esGrafoNulo g) ==gt
forAll (parDeVertices g)
((xy) -gt let zss = todosArcosBP g x y
in null zss || longitudCamino (head zss) ==
minimum (map longitudCamino zss))
La funcioacuten (numeroArcosDeLongitud g u v k) devuelve el nuacutemero de caminos en-tre los veacutertices u y v en el grafo g que tienen longitud k
-- | Ejemplos
-- gtgtgt numeroArcosDeLongitud (completo 6) 1 3 4
-- 24
-- gtgtgt numeroArcosDeLongitud grafoPetersen 1 3 4
-- 4
numeroArcosDeLongitud Ord a =gt Grafo a -gt a -gt a -gt Int -gt Int
numeroArcosDeLongitud g u v k =
length (filter p (todosArcosBA g u v))
where p vs = longitudCamino vs == k
37 Caminos en grafos 93
374 Conexioacuten
Definicioacuten 375 Dado un grafo G = (V A) sean u v isin V Si existe alguacuten camino entreu y v en el grafo G diremos que estaacuten conectados y lo denotamos por u v
La funcioacuten (estanConectados g u v) se verifica si los veacutertices u y v estaacuten conecta-dos en el grafo g
-- | Ejemplos
-- gtgtgt estanConectados (creaGrafo [14] [(12)(24)]) 1 4
-- True
-- gtgtgt estanConectados (creaGrafo [14] [(12)(34)]) 1 4
-- False
estanConectados Ord a =gt Grafo a -gt a -gt a -gt Bool
estanConectados g u v
| esGrafoNulo g = False
| otherwise = not (null (todosArcosBA g u v))
Nota 371 La funcioacuten (estanConectados g u v) no necesita calcular todos los ca-minos entre u y v Puesto que Haskell utiliza por defecto evaluacioacuten perezosa siexiste alguacuten camino entre los dos veacutertices basta calcular el primero para saber quela lista de todos los caminos no es vaciacutea
375 Distancia
Definicioacuten 376 Se define la distancia entre u y v en el grafo G como la longitud delcamino maacutes corto que los une Si u y v no estaacuten conectados decimos que la distancia esinfinita
La funcioacuten (distancia g u v) devuelve la distancia entre los veacutertices u y v en elgrafo g En caso de que los veacutertices no esteacuten conectados devuelve el valor Nothing
-- | Ejemplos
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 1
-- Just 0
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 2
-- Just 1
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 3
-- Just 2
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 4
-- Nothing
distancia Ord a =gt Grafo a -gt a -gt a -gt Maybe Int
distancia g u v
| estanConectados g u v =
Just (longitudCamino (head (todosArcosBA g u v)))
| otherwise = Nothing
94 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Definicioacuten 377 Dado G = (V A) un grafo sean u v isin V Un camino entre u y v cuyalongitud coincide con la distancia entre los veacutertices se llama geodeacutesica entre u y v
La funcioacuten (esGeodesica g c) se verifica si el camino c es una geodeacutesica entre susextremos en el grafo g
-- | Ejemplos
-- gtgtgt let g = creaGrafo [14] [(12)(13)(23)(34)]
-- gtgtgt esGeodesica g [134]
-- True
-- gtgtgt esGeodesica g [1234]
-- False
esGeodesica Ord a =gt Grafo a -gt [a] -gt Bool
esGeodesica g c =
esCamino g c ampamp
longitudCamino c == fromJust (distancia g u v)
where u = head c
v = last c
Nota 372 No hace falta imponer en la definicioacuten de la funcioacuten que el camino seaun recorrido pues el camino de miacutenima longitud entre dos veacutertices es siempre unrecorrido
376 Caminos cerrados
Definicioacuten 378 Un camino en un grafo G se dice cerrado si sus extremos son igualesDiremos que un camino cerrado de longitud tres es un triaacutengulo
La funcioacuten (esCerrado g c) se verifica si el camino c es cerrado en el grafo g
-- | Ejemplos
-- gtgtgt let g = creaGrafo [14] [(12)(13)(23)(34)]
-- gtgtgt esCerrado g [1231]
-- True
-- gtgtgt esCerrado g [123]
-- False
-- gtgtgt esCerrado g [1241]
-- False
esCerrado (Ord a) =gt Grafo a -gt [a] -gt Bool
esCerrado _ [] = False
esCerrado g (vc) =
esCamino g c ampamp v == last c
La funcioacuten (triangulos g v) devuelve la lista de todos los triaacutengulos que pasanpor el veacutertice v en el grafo g
-- | Ejemplos
-- gtgtgt triangulos (completo 4) 3
37 Caminos en grafos 95
-- [[3123][3143][3213][3243][3413][3423]]
-- gtgtgt triangulos (grafoCiclo 6) 1
-- []
triangulos Ord a =gt Grafo a -gt a -gt [[a]]
triangulos g u = todosCaminos g u u 3
377 Circuitos
Definicioacuten 379 Un recorrido en un grafo G se dice circuito si sus extremos son iguales
La funcioacuten (esCircuito g c) se verifica si la sucesioacuten de veacutertices c es un circuitoen el grafo g
-- | Ejemplos
-- gtgtgt grafoCiclo 4
-- G [1234] [(12)(14)(23)(34)]
-- gtgtgt esCircuito (grafoCiclo 4) [12341]
-- True
-- gtgtgt esCircuito (grafoCiclo 4) [1234]
-- False
-- gtgtgt esCircuito (grafoCiclo 4) [1234141]
-- False
esCircuito (Ord a) =gt Grafo a -gt [a] -gt Bool
esCircuito g c =
esRecorrido g c ampamp esCerrado g c
378 Ciclos
Definicioacuten 3710 Un camino simple en un grafo G se dice que es un ciclo si sus extremosson iguales
La funcioacuten (esCiclo g c) se verifica si el camino c es un ciclo en el grafo g
-- | Ejemplos
-- gtgtgt esCiclo (grafoCiclo 4) [121]
-- False
-- gtgtgt esCiclo (grafoCiclo 4) [12341]
-- True
-- gtgtgt esCiclo (grafoCiclo 4) [1234]
-- False
-- gtgtgt esCiclo (grafoCiclo 4) [1234141]
-- False
esCiclo (Ord a) =gt Grafo a -gt [a] -gt Bool
esCiclo g c =
esCaminoSimple g c ampamp esCerrado g c
96 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (todosCiclos g v) devuelve todos los ciclos en el grafo g que pasan porel veacutertice v
-- | Ejemplos
-- gtgtgt todosCiclos (grafoCiclo 4) 3
-- [[34123][32143]]
-- gtgtgt todosCiclos (completo 3) 2
-- [[2312][2132]]
-- gtgtgt todosCiclos (creaGrafo [123] [(11)(12)(13)(23)]) 1
-- [[1][1321][1231]]
-- gtgtgt todosCiclos (creaGrafo [12] [(12)(22)(23)]) 2
-- [[2]]
todosCiclos Ord a =gt Grafo a -gt a -gt [[a]]
todosCiclos g x =
map f (filter p (concat [todosArcosBA g x u | u lt- a x]))
where p c = longitudCamino c = 1
f c | longitudCamino c == 0 = c
| otherwise = c ++ [x]
a = adyacentes g
Nota 373 El algoritmo utilizado en la definicioacuten de (todosCiclos g) es el de buacutes-queda en anchura Este algoritmo recorre el grafo por niveles de forma que el pri-mer camino de la lista es de longitud miacutenima
379 Grafos aciacuteclicos
Definicioacuten 3711 Diremos que un grafo G = (V A) es aciacuteclico si no contiene ninguacutenciclo es decir si forallv isin V no existe ninguacuten camino simple que comience y termine en v
La funcioacuten (esAciclico g) se verifica si el grafo g es aciacuteclico
-- | Ejemplo
-- gtgtgt esAciclico (creaGrafo [14] [(12)(24)])
-- True
-- gtgtgt esAciclico (grafoCiclo 5)
-- False
-- gtgtgt esAciclico (grafoEstrella 6)
-- True
esAciclico Ord a =gt Grafo a -gt Bool
esAciclico g =
and [null (todosCiclos g x) | x lt- vertices g]
38 Conectividad de los grafos 97
38 Conectividad de los grafos
381 Estar conectados por un camino
Teorema 381 Dado un grafo G la relacioacuten u sim v (estar conectados por un camino) es unarelacioacuten de equivalencia
La funcioacuten (estarConectadosCamino g) devuelve la relacioacuten entre los veacutertices delgrafo g de estar conectados por un camino en eacutel
-- | Ejemplo
-- gtgtgt estarConectadosCamino (creaGrafo [14] [(12)(24)])
-- [(11)(12)(14)(21)(22)(24)(33)(41)(42)(44)]
estarConectadosCamino Ord a =gt Grafo a -gt [(aa)]
estarConectadosCamino g =
[(uv) | u lt- vs v lt- vs estanConectados g u v]
where vs = vertices g
A continuacioacuten comprobaremos el resultado con QuickCheck
ghcigt quickCheck prop_conectadosRelEqui
+++ OK passed 100 tests
prop_conectadosRelEqui Grafo Int -gt Bool
prop_conectadosRelEqui g =
esRelacionEquivalencia (vertices g) (estarConectadosCamino g)
382 Componentes conexas de un grafo
Definicioacuten 382 Las clases de equivalencia obtenidas por la relacioacuten sim estar conectadospor un camino en un grafo G inducen subgrafos en G los veacutertices y todas las aristas de loscaminos que los conectan que reciben el nombre de componentes conexas por caminosde G
La funcioacuten (componentesConexas1 g) devuelve las componentes conexas por cami-nos del grafo g
-- | Ejemplos
-- gtgtgt componentesConexas (creaGrafo [15] [(12)(23)])
-- [[123][4][5]]
-- gtgtgt componentesConexas (creaGrafo [15] [(12)(23)(45)])
-- [[123][45]]
-- gtgtgt componentesConexas (creaGrafo [13] [(12)(23)])
-- [[123]]
componentesConexas1 Ord a =gt Grafo a -gt [[a]]
componentesConexas1 g =
clasesEquivalencia (vertices g) (estarConectadosCamino g)
98 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Vamos a definir dos nuevas funciones una que compruebe si el grafo es nulo o com-pleto pues en dichos casos las componentes seraacuten el conjunto vaciacuteo y el conjuntodel conjunto de veacutertices respectivamente y otra con un algoritmo algo maacutes comple-jo
componentesConexas2 Ord a =gt Grafo a -gt [[a]]
componentesConexas2 g
| esGrafoNulo g = []
| esCompleto g = [vertices g]
| otherwise =
clasesEquivalencia (vertices g) (estarConectadosCamino g)
componentesConexas3 Ord a =gt Grafo a -gt [[a]]
componentesConexas3 g = aux (vertices g) [] []
where aux [] [] [] = []
aux [] xs ys = [xs]
aux (vvs) [] [] =
aux (vs (a v)) (i v (a v)) (a v)
aux vs xs ys | null ((ug [a v | v lt- ys]) xs) =
xs aux vs [] []
| otherwise =
aux (vs ug [a v | v lt- ys])
(u xs (ug [a v | v lt- ys]))
(ug [a v | v lt- ys] ys)
a = adyacentes g
i = inserta
ug = unionGeneral
u = unionConjuntos
La comprobacioacuten con QuickCheck de la equivalencia de las definiciones es
ghcigt quickCheck prop_EquiComponentesConexas
+++ OK passed 100 tests
ghcigt quickCheck prop_EquiComponentesConexas2
+++ OK passed 100 tests
prop_EquiComponentesConexas Grafo Int -gt Bool
prop_EquiComponentesConexas g =
componentesConexas1 g == componentesConexas2 g
prop_EquiComponentesConexas2 Grafo Int -gt Bool
prop_EquiComponentesConexas2 g =
componentesConexas1 g == componentesConexas3 g
Comparemos ahora la eficiencia de las definiciones
ghcigt componentesConexas1 grafoNulo
[]
(003 secs 0 bytes)
38 Conectividad de los grafos 99
ghcigt componentesConexas2 grafoNulo
[]
(001 secs 0 bytes)
ghcigt componentesConexas3 grafoNulo
[]
(001 secs 0 bytes)
ghcigt length (componentesConexas1 (completo 50))
1
(023 secs 0 bytes)
ghcigt length (componentesConexas2 (completo 50))
1
(016 secs 0 bytes)
ghcigt length (componentesConexas3 (completo 50))
1
(008 secs 0 bytes)
ghcigt length (componentesConexas1 (completo 100))
1
(217 secs 205079912 bytes)
ghcigt length (componentesConexas2 (completo 100))
1
(285 secs 0 bytes)
ghcigt length (componentesConexas3 (completo 100))
1
(119 secs 0 bytes)
ghcigt length (componentesConexas1 (completo 150))
1
(1295 secs 742916792 bytes)
ghcigt length (componentesConexas2 (completo 150))
1
(2048 secs 0 bytes)
ghcigt length (componentesConexas3 (completo 150))
1
(964 secs 0 bytes)
Con grafos completos de gran tamantildeo Haskell tarda maacutes tiempo en comprobar quees completo que en calcular directamente sus clases de equivalencia y para grafosnulos apenas hay diferencia en el coste entre la primera y la segunda definicioacuten Porotra parte la tercera definicioacuten es la maacutes eficiente en todos los casos y seraacute por tantola que utilizaremos a lo largo del trabajo
componentesConexas Ord a =gt Grafo a -gt [[a]]
componentesConexas = componentesConexas3
La funcioacuten (numeroComponentes g) devuelve el nuacutemero de componentes conexasdel grafo g
-- Ejemplos
-- gtgtgt numeroComponentes (creaGrafo [15] [(12)(23)(45)])
100 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- 2
-- gtgtgt numeroComponentes (creaGrafo [14] [(12)(22)(34)])
-- 2
numeroComponentes Ord a =gt Grafo a -gt Int
numeroComponentes g
| null (aristas g) = orden g
| otherwise = length (componentesConexas g)
Nota 381 Hemos comprobado para la definicioacuten anterior que comprobar si un gra-fo es completo es muy costoso luego no conviene antildeadirlo como patroacuten
383 Grafos conexos
Definicioacuten 383 Dado un grafo diremos que es conexo si la relacioacuten tiene una uacutenica clasede equivalencia en eacutel es decir si el grafo tiene una uacutenica componente conexa
La funcioacuten (esConexo g) se verifica si el grafo g es conexo
-- Ejemplos
-- gtgtgt esConexo (creaGrafo [13] [(12)(23)])
-- True
-- gtgtgt esConexo (creaGrafo [15] [(12)(23)(45)])
-- False
esConexo Ord a =gt Grafo a -gt Bool
esConexo g = length (componentesConexas g) == 1
esConexo2 Ord a =gt Grafo a -gt Bool
esConexo2 g
| esGrafoNulo g = False
| esUnitario (vertices g) = True
| otherwise = aux (vertices g) [] []
where aux [] [] [] = False
aux [] xs _ = True
aux (vvs) [] [] | null vs = True
| null (a v) = False
| otherwise =
aux (vs a v) (i v (a v)) (a v)
aux vs xs ys | null ((ug [a v | v lt- xs]) xs) = False
| otherwise =
aux (vs (ug [a v | v lt- xs]))
(u (ug [a v | v lt- xs]) xs)
((ug [a v | v lt- xs]) xs)
a = adyacentes g
ug = unionGeneral
i = inserta
u = unionConjuntos
38 Conectividad de los grafos 101
La comprobacioacuten de la equivalencia de las definiciones con QuickCheck es
ghcigt quickCheck prop_EquiEsConexo
+++ OK passed 100 tests
prop_EquiEsConexo Grafo Int -gt Bool
prop_EquiEsConexo g =
esConexo g == esConexo2 g
Vamos a comparar ahora su eficiencia
ghcigt let g1 = grafoCiclo 100
(000 secs 0 bytes)
ghcigt let g = creaGrafo (vertices g1) (aristas g1 [(23)(9899)])
(000 secs 0 bytes)
ghcigt esConexo g
False
(117 secs 151632168 bytes)
ghcigt esConexo2 g
False
(001 secs 0 bytes)
ghcigt esConexo (grafoCiclo 500)
True
(7341 secs 10448270712 bytes)
ghcigt esConexo2 (grafoCiclo 500)
True
(18939 secs 18468849096 bytes)
ghcigt esConexo (grafoCiclo 500)
True
(7341 secs 10448270712 bytes)
ghcigt esConexo2 (grafoCiclo 500)
True
(18939 secs 18468849096 bytes)
En principio no nos proporciona ninguna ventaja la segunda definicioacuten asiacute que tra-bajaremos con la primera que hemos dado ya que es mucho maacutes sencilla
Teorema 384 Sea G un grafo G = (V A) es conexo si y solamente si forallu v isin V existe uncamino entre u y v
Vamos a comprobar el resultado con QuickCheck
ghcigt quickCheck prop_caracterizaGrafoConexo
+++ OK passed 100 tests
prop_caracterizaGrafoConexo Grafo Int -gt Property
prop_caracterizaGrafoConexo g =
not (esGrafoNulo g) ==gt
esConexo g == and [estanConectados g u v
| u lt- vertices g v lt- vertices g]
102 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
384 Excentricidad
Definicioacuten 385 Sean G = (V A) un grafo y v isin V Se define la excentricidad de v comoel maacuteximo de las distancias entre v y el resto de veacutertices de G La denotaremos por e(v)
La funcioacuten (excentricidad g v) devuelve la excentricidad del veacutertice v en el grafog
-- | Ejemplos
-- gtgtgt let g = creaGrafo [13] [(12)(23)(33)]
-- gtgtgt excentricidad g 1
-- Just 2
-- gtgtgt excentricidad g 2
-- Just 1
-- gtgtgt excentricidad (creaGrafo [13] [(12)(33)]) 1
-- Nothing
excentricidad Ord a =gt Grafo a -gt a -gt Maybe Int
excentricidad g u
| esGrafoNulo g = Nothing
| orden g == 1 = Just 0
| Nothing `elem` distancias = Nothing
| otherwise = maximum distancias
where distancias = [distancia g u v | v lt- vertices g [u]]
La funcioacuten (excentricidades g) devuelve la lista ordenada de las excentricidadesde los veacutertices del grafo g
-- | Ejemplos
-- gtgtgt excentricidades (creaGrafo [13] [(12)(23)(33)])
-- [Just 1Just 2Just 2]
-- gtgtgt excentricidades (creaGrafo [13] [(12)(33)])
-- [NothingNothingNothing]
excentricidades Ord a =gt Grafo a -gt [Maybe Int]
excentricidades g = sort (map (excentricidad g) (vertices g))
385 Diaacutemetro
Definicioacuten 386 Sea G = (V A) un grafo Se define el diaacutemetro de G como el maacuteximo delas distancias entre los veacutertices en V Lo denotaremos por d(G)
La funcioacuten (diametro g) devuelve el diaacutemetro del grafo g
-- | Ejemplos
-- gtgtgt diametro (creaGrafo [13] [(12)(23)(33)])
-- Just 2
-- gtgtgt diametro (creaGrafo [13] [(12)(33)])
-- Nothing
diametro Ord a =gt Grafo a -gt Maybe Int
38 Conectividad de los grafos 103
diametro g
| esGrafoNulo g = Nothing
| Nothing `elem` distancias = Nothing
| otherwise = maximum distancias
where vs = vertices g
distancias = [distancia g u v | u lt- vs v lt- vs u lt= v]
386 Radio
Definicioacuten 387 Sean G = (V A) un grafo y v isin V Se define el radio de G como elmiacutenimo de las excentricidades de sus veacutertices Lo denotaremos por r(G)
La funcioacuten (radio g) devuelve el radio del grafo g
-- | Ejemplos
-- gtgtgt radio (creaGrafo [13] [(12)(23)(33)])
-- Just 1
-- gtgtgt radio (creaGrafo [13] [(12)(33)])
-- Nothing
radio Ord a =gt Grafo a -gt Maybe Int
radio g
| esGrafoNulo g = Nothing
| Nothing `elem` ds = Nothing
| otherwise = minimum ds
where ds = [excentricidad g v | v lt- vertices g]
387 Centro
Definicioacuten 388 Sean G = (V A) un grafo Llamamos centro del grafo G al conjunto deveacutertices de excentricidad miacutenima A estos veacutertices se les denomina veacutertices centrales
La funcioacuten (centro g) devuelve el centro del grafo g Por ejemplo
-- | Ejemplos
-- gtgtgt centro (creaGrafo [13] [(12)(23)(33)])
-- [2]
-- gtgtgt centro (creaGrafo [13] [(12)(13)(23)])
-- [123]
-- gtgtgt centro (creaGrafo [13] [(12)(33)])
-- [123]
centro Ord a =gt Grafo a -gt [a]
centro g = [v | v lt- vertices g excentricidad g v == r]
where r = radio g
104 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
388 Grosor
Definicioacuten 389 Sean G = (V A) un grafo Se llama grosor o cintura del grafo G almiacutenimo de las longitudes de los ciclos de G Si el grafo no posee ciclos (es decir es un grafoaciacuteclico) se dice que su cintura es infinita
La funcioacuten (grosor g) devuelve el grosor del grafo g
-- | Ejemplos
-- gtgtgt grosor (creaGrafo [123] [(12)(23)])
-- Nothing
-- gtgtgt grosor (creaGrafo [123] [(11)(12)(23)(34)])
-- Just 0
-- gtgtgt grosor grafoPetersen
-- Just 5
-- gtgtgt grosor grafoMoebiusCantor
-- Just 6
-- gtgtgt grosor grafoHeawood
-- Just 6
-- gtgtgt grosor grafoMcGee
-- Just 7
-- gtgtgt grosor grafoTutteCoxeter
-- Just 8
grosor Ord a =gt Grafo a -gt Maybe Int
grosor g
| esAciclico g = Nothing
| otherwise = Just (minimum [longitudCamino (head yss)
| x lt- vertices g
let yss = todosCiclos g x
not (null yss)])
Propiedades del grosor de los grafos
Teorema 3810 El grosor del grafo ciclo de orden n Cn es infin si n lt 3 y 3 en caso contrario
La propiedad se expresa por
prop_grosor_grafoCiclo Int -gt Bool
prop_grosor_grafoCiclo n =
grosor (grafoCiclo n) == if n lt 3
then Nothing
else Just n
Su comprobacioacuten para n le 30 es
ghcigt all prop_grosor_grafoCiclo [130]
True
Teorema 3811 El grosor del grafo amistad de orden n es 3 para todo n
38 Conectividad de los grafos 105
prop_grosor_grafoAmistad Int -gt Bool
prop_grosor_grafoAmistad n =
grosor (grafoAmistad n) == Just 3
Su comprobacioacuten para n le 30 es
ghcigt all prop_grosor_grafoAmistad [130]
True
Teorema 3812 El grosor del grafo completo de orden n Kn es infin si n lt 3 y 3 en casocontrario
La propiedad se expresa por
prop_grosor_completo Int -gt Bool
prop_grosor_completo n =
grosor (completo n) == if n lt 3
then Nothing
else Just 3
Su comprobacioacuten para n le 30 es
ghcigt all prop_grosor_completo [130]
True
Teorema 3813 El grosor del grafo bipartito completo de orden Kmn es infin si m = 1 oacuten = 1 y es 4 en caso contrario y 3 en caso contrario
La propiedad se expresa por
prop_grosor_bipartitoCompleto Int -gt Int -gt Bool
prop_grosor_bipartitoCompleto m n =
grosor (bipartitoCompleto m n) == if m == 1 || n == 1
then Nothing
else Just 4
Su comprobacioacuten para 1 le m le n le 15 es
ghcigt and [prop_grosor_bipartitoCompleto m n | m lt- [115] n lt- [m15]]
True
Teorema 3814 El grosor del grafo rueda de orden n Wn es infin si n lt 3 y 3 en caso contrario
La propiedad se expresa por
prop_grosor_grafoRueda Int -gt Bool
prop_grosor_grafoRueda n =
grosor (grafoRueda n) == if n lt 3
then Nothing
else Just 3
106 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Su comprobacioacuten para 1 le n le 30 es
ghcigt all prop_grosor_grafoRueda [130]
True
389 Propiedades e invariantes por isomorfismos
Teorema 3815 Sean G = (V A) y Gprime = (Vprime Aprime) grafos isomorfos con φ V rarr Vprime unisomorfismo Entonces dados u v isin V u sim v si y solamente si φ(u) sim φ(v)
La comprobacioacuten del teorema con QuickCheck es
ghcigt quickCheck prop_ConexionIsomorfismo1
+++ OK passed 100 tests
prop_ConexionIsomorfismo1 Grafo Int -gt Grafo Int -gt Bool
prop_ConexionIsomorfismo1 g h =
not (isomorfos g h) ||
and [ec g u v == ec h (imagen phi u) (imagen phi v)
| u lt- vs
v lt- vs
phi lt- isomorfismos g h]
where vs = vertices g
ec = estanConectados
Teorema 3816 Sean G = (V A) y Gprime = (Vprime Aprime) grafos isomorfos con φ V rarr Vprime unisomorfismo Entonces φ lleva cada componente conexa de G en una componente conexa deGprime
La comprobacioacuten del teorema con QuickCheck es
ghcigt quickCheck prop_ConexionIsomorfismo2
+++ OK passed 100 tests
prop_ConexionIsomorfismo2 Grafo Int -gt Grafo Int -gt Bool
prop_ConexionIsomorfismo2 g h =
not(isomorfos g h) ||
and [conjuntosIguales cch (aux f) | f lt- isomorfismos g h]
where cch = componentesConexas h
ccg = componentesConexas g
aux f = map (sort imagenConjunto f) ccg
Teorema 3817 Sean G = (V A) y Gprime = (Vprime Aprime) grafos isomorfos con φ V rarr Vprime unisomorfismo Entonces G y Gprime tienen el mismo nuacutemero de componentes conexas
La comprobacioacuten del teorema con QuickCheck es
38 Conectividad de los grafos 107
ghcigt quickCheck prop_ConexionIsomorfismo3
+++ OK passed 100 tests
prop_ConexionIsomorfismo3 Grafo Int -gt Grafo Int -gt Bool
prop_ConexionIsomorfismo3 g h =
not (isomorfos g h) ||
numeroComponentes g == numeroComponentes h
Teorema 3818 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que el diaacutemetro de G es igual al diaacutemetro de Gprime es decir el diaacutemetrode un grafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos diametro)
+++ OK passed 100 tests
Teorema 3819 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces se verifica que el radio de G es igual al radio de Gprime es decir el radio de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos radio)
+++ OK passed 100 tests
Teorema 3820 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que el grosor de G es igual al grosor de Gprime es decir el grosor de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos grosor)
+++ OK passed 100 tests
Teorema 3821 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que el centro de G es igual al centro de Gprime es decir el centro de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos centro)
+++ OK passed 100 tests
Teorema 3822 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces se verifica que el nuacutemero de componentes conexas de G es igual al nuacutemerode las de Gprime es decir el nuacutemero de componentes conexas de un grafo es un invariante porisomorfismos
108 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos numeroComponentes)
+++ OK passed 100 tests
Teorema 3823 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que los valores que toman las excentricidades de los veacutertices G esigual al de los veacutertices de Gprime es decir el conjunto de valores que toman las excentricidadesde los veacutertices es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos excentricidades)
+++ OK passed 100 tests
Capiacutetulo 4
Matrices asociadas a grafos
En este capiacutetulo se definiraacuten algunas representaciones de grafos como matrices secomprobaraacuten sus propiedades y volveremos a definir algunos conceptos del capiacutetu-lo 3 ahora utilizando matricesPara elaborar el contenido del capiacutetulo utilizareacute el segundo tema del trabajo fin degrado de Fco Javier Franco Galviacuten Aspectos algebraicos en teoriacutea de grafos ([7]) En eltrabajo el autor introduce los conceptos de matriz de adyacencia matriz de incidenciay otras matrices asociadas a grafos
41 Generador de grafos simples
En esta seccioacuten presentaremos el generador de grafos que nos permitiraacute generargrafos simples como listas de aristas arbitrariamente y usarlos como ejemplos opara comprobar propiedades en la seccioacuten de matrices asociadas a grafos(grafoSimple) es un generador de grafos simples de hasta 10 veacutertices Por ejemplo
ghcigt sample grafoSimple
G [12345678] [(14)(15)(16)(17)(18)(23)
(24)(25)(27)(35)(37)(45)(46)(56)(67)]
G [123456789] [(14)(18)(23)(25)(29)
(34)(35)(36)(38)(39)(46)(48)(49)
(58)(59)(69)(78)]
G [123456] [(12)(13)(24)(25)(26)(35)(56)]
G [1234567] [(12)(13)(14)(24)(25)(26)
(36)(45)(46)(67)]
G [1234] [(13)(14)(23)(34)]
G [123] [(23)]
G [12] [(12)]
G [123456] [(16)(24)(26)(35)(36)(56)]
G [123456789] [(12)(14)(15)(16)(17)(24)
(34)(37)(38)(39)(45)(47)(49)(56)(57)
(58)(59)(67)(69)(78)(79)]
109
110 Capiacutetulo 4 Matrices asociadas a grafos
G [123456789] [(13)(14)(15)(16)(23)(24)
(29)(35)(39)(45)(47)(48)(49)(57)(58)
(59)(67)(68)(69)(79)]
G [1] []
grafoSimple Gen (Grafo Int)
grafoSimple = do
n lt- choose (010)
as lt- sublistOf [(xy) | x lt- [1n] y lt- [x+1n]]
return (creaGrafo [1n] as)
42 Matrices de adyacencia
421 Definicioacuten y propiedades
Usaremos la funcioacuten (imprimeMatriz p) para imprimir por pantalla la matriz p conuna fila por liacutenea
-- | Ejemplo
-- gtgtgt imprimeMatriz (fromLists [[134][357][479]])
-- [134]
-- [357]
-- [479]
imprimeMatriz Show a =gt Matrix a -gt IO ()
imprimeMatriz p =
mapM_ print (toLists p)
Definicioacuten 421 Sea G = (V A) un grafo simple con V = v1 vn Se define sumatriz de adyacencia como Antimesn = (aij) donde el elemento aij toma el valor 1 si existealguna arista en A uniendo los veacutertices vi y vj y 0 en caso contrario
Nota 421 La matriz de adyacencia depende del etiquetado del grafo
La funcioacuten (matrizAdyacencia g) es la matriz de adyacencia del grafo g
-- | Ejemplo
-- gtgtgt imprimeMatriz (matrizAdyacencia (grafoCiclo 4))
-- [0101]
-- [1010]
-- [0101]
-- [1010]
-- gtgtgt imprimeMatriz (matrizAdyacencia (completo 4))
-- [0111]
-- [1011]
-- [1101]
-- [1110]
42 Matrices de adyacencia 111
matrizAdyacencia Grafo Int -gt Matrix Int
matrizAdyacencia g = matrix n n f
where n = orden g
f (ij) | (ij) `aristaEn` g = 1
| otherwise = 0
422 Propiedades baacutesicas de las matrices
La funcioacuten (esSimetrica p) se verifica si la matriz p es simeacutetrica
-- ejemplo
-- gtgtgt esSimetrica (fromLists [[134][357][479]])
-- True
-- gtgtgt esSimetrica (fromLists [[134][357][497]])
-- False
esSimetrica Eq a =gt Matrix a -gt Bool
esSimetrica p =
transpose p == p
La funcioacuten (potencia p n) devuelvela potencia nndasheacutesima de la matriz cuadrada p
-- Ejemplo
-- gtgtgt potencia (fromLists [[134][357][479]]) 3
-- ( 408 735 975 )
-- ( 735 1323 1755 )
-- ( 975 1755 2328 )
potencia Num a =gt Matrix a -gt Int -gt Matrix a
potencia p 1 = p
potencia p n = if (odd n)
then (m p (potencia (m p p) (div (n-1) 2)))
else (potencia (m p p) (div (n-1) 2))
where m = multStd2
423 Propiedades de las matrices de adyacencia
Teorema 422 Para todo n la matriz de adyacencia del grafo ciclo de orden n Cn es simeacute-trica
ghcigt all prop_simetricaAdyacenciaCompleto [130]
True
prop_simetricaAdyacenciaCompleto Int -gt Bool
prop_simetricaAdyacenciaCompleto n =
esSimetrica (matrizAdyacencia (completo n))
La funcioacuten (tamantildeoM g) devuelve el tamantildeo del grafo simple g calculado usandosu matriz de adyacencia
112 Capiacutetulo 4 Matrices asociadas a grafos
-- | Ejemplos
-- gtgtgt tamantildeoM (grafoCiclo 4)
-- 4
-- gtgtgt tamantildeoM grafoPetersen
-- 15
tamantildeoM Grafo Int -gt Int
tamantildeoM g = sum (toList (matrizAdyacencia g)) `div` 2
Teorema 423 El tamantildeo de un grafo simple es la mitad de la suma de los elementos de sumatriz de adyacencia
La comprobacioacuten del teorema con QuickCheck es
ghcigt quickCheck prop_tamantildeoMatriz
+++ OK passed 100 tests
prop_tamantildeoMatriz Property
prop_tamantildeoMatriz =
forAll grafoSimple
(g -gt tamantildeo g == tamantildeoM g)
Teorema 424 Si un grafo G = (V A) tiene un veacutertice aislado vi tanto la fila como lacolumna indasheacutesima de su matriz de adyacencia estaraacuten formadas por ceros
esAisladoM Grafo Int -gt Int -gt Bool
esAisladoM g v = if (all (==0)
(((toLists (ma g)) (v-1))
++((toLists (t (ma g))) (v-1))))
then True
else False
where ma = matrizAdyacencia
t = transpose
La comprobacioacuten del teorema es
ghcigt quickCheck prop_esAisladoMatriz
+++ OK passed 100 tests
prop_esAisladoMatriz Property
prop_esAisladoMatriz =
forAll grafoSimple
(g -gt and [esAislado g v == esAisladoM g v
| v lt- vertices g])
Teorema 425 Sea un grafo G = (V A) simple no dirigido con V = v1 vn Lasuma de los elementos de la fila (o columna) indasheacutesima de su matriz de adyacencia coincide conel grado del veacutertice vi Es decir
42 Matrices de adyacencia 113
δ(vi) =n
sumj=1
aij =n
sumj=1
aji
gradoM Grafo Int -gt Int -gt Int
gradoM g v = sum ((toLists (ma g)) (v-1))
where ma = matrizAdyacencia
La comprobacioacuten del teorema es
ghcigt quickCheck prop_gradoMatriz
+++ OK passed 100 tests
prop_gradoMatriz Property
prop_gradoMatriz =
forAll grafoSimple
(g -gt and [grado g v == gradoM g v | v lt- vertices g])
Teorema 426 Sea G = (V A) un grafo bipartito de conjuntos de veacutertices disjuntosV1 = v1 vk y V2 = vk+1 vn tal que V = V1 cup V2 y soacutelo existen aristasque conectan veacutertices de V1 con veacutertices de V2 Entonces con este etiquetado de V la matrizde adyacencia de G tiene la forma
A =
(θ BBt θ
)
prop_BipartitoMatriz Grafo Int -gt Property
prop_BipartitoMatriz g =
esBipartito g ==gt
all (==0) [ getElem u v m | [uv] lt- (f (fromJust p))]
where f (xsys) = filter p (subsequences xs ++ subsequences ys)
where p zs = length zs == 2
p = conjuntosVerticesDisjuntos g
m = matrizAdyacencia g
424 Caminos y arcos
En esta seccioacuten se presentaraacute la informacioacuten que contiene la matriz de adyacenciade un grafo en relacioacuten a los caminos que se encuentran en eacutel
Teorema 427 Sea G = (V A) un grafo con V = v1 vn y matriz de adyacenciaA = (aij) Entonces forallk ge 0 el elemento (i j) de Ak que denotaremos por ak
ij es elnuacutemero de caminos de longitud k desde el veacutertice vi al veacutertice vj
114 Capiacutetulo 4 Matrices asociadas a grafos
numeroCaminosDeLongitudM Grafo Int -gt Int -gt Int -gt Int -gt Int
numeroCaminosDeLongitudM g u v k = getElem u v mk
where ma = matrizAdyacencia g
n = orden g
mk = foldr (multStd2) (identity n) (take k (repeat ma))
La comprobacioacuten del teorema para k le 6 es
ghcigt quickCheck prop_numeroCaminosMatriz
+++ OK passed 100 tests
prop_numeroCaminosMatriz Grafo Int -gt Gen Bool
prop_numeroCaminosMatriz g = do
k lt- choose (06)
let vs = vertices g
return (and [ numeroCaminosDeLongitud g u v k ==
numeroCaminosDeLongitudM g u v k
|(uv) lt- productoCartesiano vs vs u lt v])
De este teorema se deducen las siguientes propiedades
Teorema 428 Sea G un grafo simple Siguiendo la notacioacuten del teorema anterior se tieneque1 a(2)ii = δ(vi)
2 a(3)ii es el nuacutemero de triaacutengulos que contienen al veacutertice vi
gradoCaminosM Grafo Int -gt Int -gt Int
gradoCaminosM g v = getElem v v m2
where m = matrizAdyacencia g
m2 = multStd2 m m
numeroTriangulosM Grafo Int -gt Int -gt Int
numeroTriangulosM g v = getElem v v (potencia m 3)
where m = matrizAdyacencia g
La comprobacioacuten con QuickCheck es
ghcigt quickCheck prop_GradoCaminosMatriz
+++ OK passed 100 tests
ghcigt quickCheck prop_TriangulosMatriz
+++ OK passed 100 tests
prop_GradoCaminosMatriz Grafo Int -gt Bool
prop_GradoCaminosMatriz g =
and [ grado g v == gradoCaminosM g v | v lt- vertices g]
42 Matrices de adyacencia 115
prop_TriangulosMatriz Property
prop_TriangulosMatriz =
forAll grafoSimple
(g -gt and [length (triangulos g v) ==
numeroTriangulosM g v | v lt- vertices g])
116 Capiacutetulo 4 Matrices asociadas a grafos
Capiacutetulo 5
Apeacutendices
51 Sistemas utilizados
El desarrollo de mi Trabajo de Fin de Grado requeriacutea de una infraestructura teacutecnicaque he tenido que trabajar antes de comenzar a desarrollar el contenido A conti-nuacioacuten voy a nombrar y comentar los sistemas y paquetes que he utilizado a lolargo del proyectobull Ubuntu como sistema operativo El primer paso fue instalar Ubuntu en mi orde-
nador portaacutetil personal Para ello seguiacute las recomendaciones de mi compantildeeroEduardo Paluzo quien ya lo habiacutea hecho antesPrimero me descargueacute la imagen del sistema Ubuntu 1604 LTS (para procesadorde 64 bits) desde la paacutegina de descargas de Ubuntu 1 y tambieacuten la herramientaLinuxLive USB Creator 2 que transformariacutea mi pendrive en una unidad USB Boo-teable cargada con la imagen de Ubuntu Una vez tuve la unidad USB preparadaprocediacute a instalar el nuevo sistema apagueacute el dispositivo y al encenderlo entreacuteen el Boot Menu de la BIOS del portaacutetil para arrancar desde el Pendrive en vez dehacerlo desde el disco duro Automaacuteticamente comenzoacute la instalacioacuten de Ubuntuy solo tuve que seguir las instrucciones del asistente para montar Ubuntu mante-niendo ademaacutes Windows 10 que era el sistema operativo con el que habiacutea estadotrabajando hasta ese momentoEl resultado fue un poco agridulce pues la instalacioacuten de Ubuntu se habiacutea reali-zado con eacutexito sin embargo al intentar arrancar Windows desde la nueva GRUBme daba un error al cargar la imagen del sistema Despueacutes de buscar el error queme apareciacutea en varios foros encontreacute una solucioacuten a mi problema deshabiliteacute elSecurity Boot desde la BIOS y pude volver a arrancar Windows 10 con normali-dad
1httpwwwubuntucomdownloaddesktop2httpwwwlinuxliveusbcom
117
118 Capiacutetulo 5 Apeacutendices
bull LATEX como sistema de composicioacuten de textos La distribucioacuten de LATEXTex Livecomo la mayoriacutea de software que he utilizado la descargueacute utilizando el Gestorde Paquetes Synaptic Anteriormente soacutelo habiacutea utilizado TexMaker como editorde LATEX asiacute que fue el primero que descargueacute Maacutes tarde mi tutor Joseacute Antoniome sugirioacute que mejor descargara el paquete AUCTex pues me permitiriacutea trabajarcon archivos TEX desde el editor Emacs asiacute lo hice y es el que he utilizado pararedactar el trabajo Ademaacutes de los que me recomendaba el gestor solo he tenidoque descargarme el paquete spanish de babel para poder componer el trabajo puesel paquete Tikz que he utilizado para representar los grafos veniacutea incluido en lassugerencias de Synapticbull Haskell como lenguaje de programacioacuten Ya habiacutea trabajado anteriormente con
este lenguaje en el grado y sabiacutea que soacutelo teniacutea que descargarme la plataforma deHaskell y podriacutea trabajar con el editor Emacs Seguiacute las indicaciones que se dan alos estudiantes de primer curso en la paacutegina del Dpto de Ciencias de la Compu-tacioacuten e Inteligencia Artificial 3 y me descargueacute los paquetes haskell-platform yhaskell-mode desde el Gestor de Paquetes Synaptic La versioacuten de la plataforma deHaskell con la que he trabajado es la 2014200debian2 y la del compilador GHC la7103-7bull Dropbox como sistema de almacenamiento compartido Ya habiacutea trabajado con
Dropbox en el pasado asiacute que crear una carpeta compartida con mis tutores nofue ninguacuten problema sin embargo al estar Dropbox sujeto a software no libre nome resultoacute tan sencillo instalarlo en mi nuevo sistema En primer lugar intenteacutehacerlo directamente desde Ubuntu Software que intentoacute instalar Dropbox Nauti-lus y abrioacute dos instalaciones en paralelo Se quedoacute colgado el ordenador asiacute quemateacute los procesos de instalacioacuten activos reinicieacute el sistema y me descargueacute direc-tamente el paquete de instalacioacuten desde la paacutegina de descargas de Dropbox 4 y loejecuteacute desde la terminalbull Git como sistema remoto de control de versiones Era la primera vez que trabaja-
ba con Git y me costoacute bastante adaptarme Mi tutor Joseacute Antonio y mi compantildeeroEduardo Paluzo me ayudaron mucho e hicieron el proceso de adaptacioacuten muchomaacutes aacutegil El manual que Eduardo ha redactado y presenta en su Trabajo Fin deGrado me ha sido muy uacutetil es una pequentildea guiacutea que cualquier interesado en elempleo de Git puede utilizar como introduccioacuten La instalacioacuten no resultoacute com-plicada a traveacutes del Gestor de Paquetes Synaptic me descargueacute el paquete elpa-magity todos los demaacutes paquetes necesarios para trabajar con Git en mi portaacutetil usandoel editor Emacs Eduardo me ayudoacute a crear el repositorio MDenHaskell en la plata-forma GitHub y clonarlo en mi ordenador personal Dicho repositorio contiene el
3httpwwwcsuses~jalonsocursosi1m-15sistemasphp4httpswwwdropboxcomesinstallos=lnx
52 Mapa de decisiones de disentildeo en conjuntos 119
total del trabajo y se almacena de forma puacuteblica La versioacuten de Magit que utilizoes la 250-2
52 Mapa de decisiones de disentildeo en conjuntos
Una vez comenzado el trabajo y habiendo hecho ya varias secciones acerca de laTeoriacutea de Grafos se puso de manifiesto la conveniencia de crear nuevos capiacutetulosintroduciendo conceptos de la Teoriacutea de Conjuntos y las relaciones que se puedenpresentar entre sus elementosHaskell tiene una libreriacutea especiacutefica para conjuntos DataSet sin embargo no estan intuitiva ni tan eficiente como la de listas (DataList) A lo largo del proyecto hecreado un moacutedulo que permite trabajar con conjuntos utilizando tanto su represen-tacioacuten como listas ordenadas sin elementos repetidos como su representacioacuten comolistas sin elementos repetidos Dicho moacutedulo se llama Conjuntos y lo presento en elprimer capiacutetulo del Trabajo
53 Mapa de decisiones de disentildeo en grafos
Al comienzo del proyecto la idea era que las primeras representaciones con lasque trabajara fueran las de grafos como vectores de adyacencia y grafos como matricesde adyacencia que se utilizan en Informaacutetica en el primer curso del Grado con lasque ya habiacutea trabajado y estaba familiarizadaLas definiciones de Informaacutetica estaacuten pensadas para grafos ponderados (dirigidoso no seguacuten se eligiera) mientras que en Matemaacutetica Discreta apenas se usan grafosdirigidos o ponderados por tanto el primer cambio en la representacioacuten utilizadafue simplificar las definiciones de modo que solo trabajaacuteramos con grafos no diri-gidos y no ponderados pero manteniendo las estructuras vectorial y matricial quemanteniacutean la eficienciaLas representaciones que utilizan arrays en Haskell son muy restrictivas pues soloadmiten vectores y matrices que se puedan indexar lo que hace muy complicadostodos los algoritmos que impliquen alguacuten cambio en los veacutertices de los grafos yademaacutes no permite trabajar con todos los tipos de veacutertices que pudieacuteramos desearDecidimos volver a cambiar la representacioacuten y esta vez nos decantamos por larepresentacioacuten de grafos como listas de aristas perdiendo en eficiencia pero ganandomucho en flexibilidad de escrituraPor uacuteltimo mis tutores sugirieron dar una representacioacuten de los grafos mediantesus matrices de adyacencia y comprobar la equivalencia de las definiciones que yahabiacutea hecho en otros moacutedulos con las dadas para esta representacioacuten Para ello he
120 Capiacutetulo 5 Apeacutendices
trabajado con la libreriacutea DataMatrix de Haskell
Bibliografiacutea
[1] J Alonso Temas de programacioacuten funcional Technical report Univ de Sevilla2015
[2] P Burzyn Complejidad computacional en problemas de modificacioacuten de aris-tas en grafos Technical report Univ de Buenos Aires
[3] K Claessen and J Hughes QuickCheckA Lightweight Tool for Random Tes-ting of Haskell Programs Technical report Chalmers University of Technology2000
[4] M Caacuterdenas Matemaacutetica discreta Technical report Univ de Sevilla 2015
[5] D de Matemaacuteticas El regalo de Cantor Technical report IES Matarrantildea deValderrobres 2009
[6] D de Aacutelgebra Aacutelgebra Baacutesica tema 1 Conjuntos Technical report Univ deSevilla 2015
[7] F Franco Aspectos algebraicos en Teoriacutea de Grafos Technical report Univ deSevilla 2016
[8] F Rabhi and G Lapalme Algorithms A functional programming approachAddison-Wesley Longman Publishing Co Inc Boston MA USA 1st edition1999
[9] P Vasconcelos Property Testing using QuickCheck Technical report Univer-sidade do Porto 2016
[10] Wikipedia Set (mathematics) Technical report Wikipedia La Enciclopedialibre 2016
[11] Wikipedia AnexoGaleriacutea de grafos Technical report Wikipedia La Enciclo-pedia libre 2016
[12] Wikipedia Teoriacutea de la complejidad computacional Technical report Wikipe-dia La Enciclopedia libre 2017
121
Iacutendice alfabeacutetico
Grafo 18 52adyacentes 53antiImagenRelacion 38aristaEn 53aristasCamino 88aristas 53automorfismos 87bipartitoCompleto 58biyecciones 47cardinal 22 31centro 103clasesEquivalencia 43combinaciones 25 34complementario 22 31completo 58componentesConexas1 97componentesConexas2 98componentesConexas3 98conjuntosIguales 30conjuntosIguales 21conjuntosVerticesDisjuntos 59conservaAdyacencia 78creaGrafo 52diametro 102distancia 93dominio 38eliminaArista 74eliminaLazos 74eliminaVertice 74elimina 19 28entorno 69esAisladoM 112
esAislado 69esAntisimetrica 41esAutomorfismo 86esBipartito 60esCamino 87esCerrado 94esCircuito 95esCompleto 77esConexo 100esFuncional 39esFuncion 43esGeodesica 94esInyectiva 45esIsomorfismo 81esLazo 69esReflexiva 40esRegular 70esRelacionEquivalencia 42esRelacionHomogenea 39esRelacionOrden 43esRelacion 37esSimetrica 41 111esSimple 70esSobreyectiva 45 46esSubconjuntoPropio 21 30esSubconjunto 20 29esSubgrafoMax 72esSubgrafoPropio 72esSubgrafo 72esTransitiva 41esUnitario 23 32esVacio 18 27
122
Iacutendice alfabeacutetico 123
estaRelacionado 40estanConectados 93excentricidades 102excentricidad 102funciones 44generaGrafo 54gradoM 113 114grado 69grafoAmistad 57grafoCiclo 56grafoCirculante 61grafoComplementario 77grafoEstrella 60grafoHeawood 64grafoMcGee 64grafoMoebiusCantor 67grafoNulo 55grafoPetersenGen 62grafoPetersen 66grafoRueda 61grafoSimple 110grafoThomson 63grafoTutteCoxeter 65grosor 104imagenConjunto 45imagenInversa 47imagenRelacion 38imagen 44imprimeMatriz 110inserta 18 27interseccion 33interseccion 24inversa 47isomorfismos 82isomorfos 82longitudCamino 88matrizAdyacencia 110minimoElemento 19 28morfismos 79
numeroArcosDeLongitud 92numeroCaminosDeLongitud 89numeroCaminosDeLongitugM 113numeroComponentesConexas 99numeroTriangulosM 114orden 68parDeVertices 91pertenece 19 28potencia 111productoCartesiano 34productoCartesiano 25prop_HavelHakimi 73prop_LemaApretonDeManos 73prop_completos 76prop_BipartitoMatriz 113prop_ConectadosRelEqui 97prop_ConexionIsomorfismo1 106prop_ConexionIsomorfismo2 106prop_ConexionIsomorfismo3 107prop_GradoMatriz 114prop_TriangulosMatriz 114prop_esAisladoMatriz 112prop_gradoMatriz 113prop_numeroCaminosMatriz 114prop_simetricaAdyacenciaCompleto 111prop_tamantildeoMatriz 112prop_todosArcosBA 92radio 103rango 38secuenciaGrados 71secuenciaGrafica 71sinRepetidos 19 29sonIncidentes 68sumaArista 75sumaGrafos 76 77sumaVertice 75tamantildeoM 111tamantildeo 68todosArcosBA 91
124 Iacutendice alfabeacutetico
todosArcos 90todosCaminos 88todosCiclos 96triangulos 94unionConjuntos 23 32unionGeneral 24 33vacio 18 27valenciaMax 70valenciaMin 70variaciones 26 35verticesCamino 88vertices 53
Agradecimientos
Quisiera agradecer a todas las personas que me han apoyado y prestado sus co-nocimientos a lo largo de estos cuatro antildeos del grado Gracias a ellos el esfuerzo hamerecido la pena
En primer lugar me gustariacutea destacar a Mariacutea Joseacute Hidalgo Doblado y Joseacute An-tonio Alonso Jimeacutenez mi tutores en este Trabajo de Fin de Grado Les agradezco detodo corazoacuten la constancia y la atencioacuten que me han brindado a pesar de las dificul-tades que supone realizar el proyecto durante un curso en el que estoy disfrutandola oportunidad de la movilidad internacional Erasmus Son para miacute un referente y unclaro ejemplo de lo que se puede conseguir con esfuerzo y trabajo en equipo
Seguidamente expresar mi gratitud al resto de profesores y trabajadores de la Uni-versidad de Sevilla especialmente a aquellos que se esfuerzan por mejorar la institu-cioacuten diacutea a diacutea
Quiero agradecer tambieacuten este trabajo a mi familia en especial a mis padres que meapoyaron desde el principio cuando tomeacute la decisioacuten de cambiar de carrera y siemprehan intentado brindarnos a mi hermana y a miacute con lo mejor
Finalmente a mis amigos y compantildeeros que han hecho de esta primera etapa uni-versitaria un capiacutetulo de mi vida lleno de bonitos recuerdos En especial a Pedro conquien he tenido la suerte de compartir todo
Muchas gracias a todos
7
8 Iacutendice general
Abstract
Discrete mathematics is characterized as the branch of mathematics dealing withfinite and numerable sets Concepts and notations from discrete mathematics are use-ful in studying and describing objects and real-life problems In particular the graphtheory has numerous applications in logistics
Throughout this project some of the knowlegde adquired from the course ldquoMa-temaacutetica Discretardquo will be given a computational implementation The code will bewritten in Haskell language and a free version of it will be available in GitHub underthe name MDenHaskell The work will focus on the graph theory and will provide so-me examples and algorithms in order to give an introduction of it and how it can beimplemented in Haskell
At first two chapters will be presented as a gentle reminder of basic concepts rela-ted to the set theory and the relations that can be established among them The thirdchapter will introduce the main topic graph theory with different representationsdefinitions and examples on graphs It will go through aspects such as morphismconnectivity and paths in graphs Finally some properties and advantages of workingwith adjacency matrices will be presented in the fourth chapter
This project leaves the door open for the community of programmers to continueand improve it It can be used as a self-learning tool as well as to make calculationsthat by hand would be tedious
9
10 Iacutendice general
Introduccioacuten
El objetivo del trabajo es la implementacioacuten de algoritmos de matemaacutetica discretaen Haskell Los puntos de partida son
los temas de la asignatura ldquoMatemaacutetica discretardquo ([4])los temas de la asignatura ldquoInformaacuteticardquo ([1])el capiacutetulo 7 del libro ldquoAlgorithms A functional programming approachrdquo ([8]) yel artiacuteculo ldquoGraph theoryrdquo ([11]) de la WikipediaHaskell es un lenguaje de programacioacuten funcional desarrollado en los uacuteltimos antildeos
por la comunidad de programadores con la intencioacuten de usarlo como instrumentopara la ensentildeanza de programacioacuten funcional La motivacioacuten de este desarrollo eshacer el anaacutelisis y disentildeo de programas maacutes simple y permitir que los algoritmos seanfaacutecilmente adaptables a otros lenguajes de programacioacuten funcionales
En comparacioacuten con otros lenguajes de programacioacuten imperativos la sintaxis deHaskell permite definir funciones de forma maacutes clara y compacta En Haskell las fun-ciones se consideran valores al mismo nivel que los tipos enteros o cadenas en cual-quier lenguaje Por ello al igual que es habitual que en todos los lenguajes una funcioacutenreciba datos de entrada (de tipo entero flotante cadena etc) y devuelva datos (de losmismos tipos) en los lenguajes funcionales una funcioacuten puede recibir como dato deentrada una funcioacuten y devolver otra funcioacuten como salida que puede ser construida apartir de sus entradas y por operaciones entre funciones como la composicioacuten Estacapacidad nos proporciona meacutetodos maacutes potentes para construir y combinar los di-versos moacutedulos de los que se compone un programa Por ejemplo emulando la formade operar sobre funciones que habitualmente se usa en matemaacuteticas
La matemaacutetica discreta consiste en el estudio de las propiedades de los conjuntosfinitos o infinitos numerables lo que hace posible su directa implementacioacuten compu-tacional En particular la asignatura ldquoMatemaacutetica Discretardquo del grado se centra enestudiar propiedades y algoritmos de la combinatoria y la teoriacutea de grafos A lo largodel trabajo se implementaraacuten en Haskell definiciones y algoritmos con los que ya seha tenido una primera aproximacioacuten teoacuterica durante el grado
Los dos primeros capiacutetulos del trabajo sientan la base que permitiraacute en los dos si-guientes una aproximacioacuten a la teoriacutea de grafos En el primero se hace una introduc-cioacuten a la teoriacutea de conjuntos y se dan dos posibles representaciones de conjuntos con
11
12 Iacutendice general
las que trabajar en Haskell En el segundo se presentan los conceptos de ldquorelacioacutenrdquo yde ldquofuncioacutenrdquo que al igual que los conjuntos son necesarios para definir aplicacionesde los grafos Su redaccioacuten sigue la liacutenea de la primera parte de la asignatura ldquoAacutelgebraBaacutesicardquo del grado
En el tercer capiacutetulo del trabajo se hace una introduccioacuten a la teoriacutea de grafos Enprimer lugar se dan una representacioacuten con la que trabajar en Haskell y un generadorde grafos que permitiraacute comprobar propiedades con QuickCheck Seguidamente sepresenta una galeriacutea de grafos conocidos que se utilizaraacuten como ejemplos para lasdefiniciones y los algoritmos de las secciones siguientes Las primeras seraacuten algunasdeficiones baacutesicas y despueacutes se trataraacuten los conceptos de ldquomorfismosrdquo ldquocaminosrdquo yldquoconectividadrdquo en grafos
Por uacuteltimo en el cuarto capiacutetulo se da una representacioacuten de los grafos a traveacutesde su matriz de adyacencia Se implementaraacuten algunos de los resultados que JavierFranco Galviacuten expuso en su Trabajo Fin de Grado Aspectos algebraicos en teoriacutea de grafosy se comprueba que concuerdan con el desarrollo hecho en el capiacutetulo anterior
Cabe destacar el trabajo con los diferentes sistemas y programas que se han utiliza-do a lo largo del proyecto
Ubuntu como sistema operativoel editor de textos Emacs que ha permitido el uso de Haskell literario para la redaccioacutendel trabajoel paquete de produccioacuten de graacuteficos vectoriales Tikz de LATEX mediante el que seha dado la representacioacuten graacutefica de los ejemplos de grafosGitHub como sistema remoto de control de versionesy DocTest como sistema de validacioacuten de moacutedulosSe va a hacer una breve introduccioacuten los sistemas maacutes destacados
Ubuntu
Ubuntu es un sistema operativo creado a partir de GNULinux con la intencioacuten dehacer una versioacuten de este maacutes sencilla de manejar y que permitiera acceso al soft-ware libre para todo el mundo por igual La primera distribuioacuten oficial de Ubuntufue la versioacuten 410 y tuvo lugar en 2004 Desde entonces el proyecto ha captadola atencioacuten de miles de entusiastas del software libre que han querido unirse a lacomunidad UbuntuSoftware libre significa que los usuarios tienen la libertad de ejecutar copiar distri-buir estudiar modificar y mejorar el software Es una cuestioacuten de libertad no deprecio Para entender el concepto debe pensarse en laquolibreraquo como en laquolibertad deexpresioacutenraquo
Iacutendice general 13
Maacutes precisamente software libre significa que los usuarios de un programa tienenlas cuatro libertades esencialesbull La libertad de ejecutar el programa como lo desee con cualquier propoacutesito (liber-
tad 0)bull La libertad de estudiar el funcionamiento del programa y adaptarlo a sus necesi-
dades (libertad 1) El acceso al coacutedigo fuente es un prerrequisito para estobull La libertad de redistribuir copias para ayudar a los demaacutes (libertad 2)bull La libertad de mejorar el programa y de publicar las mejoras de modo que toda la
comunidad se beneficie (libertad 3) El acceso al coacutedigo fuente es un prerrequisitopara esto
Debido a la evolucioacuten de la tecnologiacutea y del uso de la red estas libertades son ahoraauacuten maacutes importantes que en el pasadoLo que diferencia a Ubuntu de otros sistemas ofrecidos por Linux es que los equiposcomercial y comunitario colaboran juntos en el desarrollo de un uacutenico proyecto Lasnovedades y avances estaacuten libremente a disposicioacuten de todos los usuarios y sonvoluntarios quienes se hacen cargo de los elementos maacutes criacuteticos del trabajoEn la paacutegina web de Ubuntu 1 se puede obtener maacutes informacioacuten acerca del siste-ma y en la paacutegina web de GNU 2 se puede encontrar maacutes informacioacuten acerca delsoftware libre
Haskell literario con Emacs
Haskell es un lenguaje de programacioacuten puramente funcional basado en lambdacalculus 3 Se caracteriza por sus programas concisos un potente sistema de tiposel trabajo con listas funciones recursivas y de orden superior y por tener evaluacioacutenperezosaTener que escribir coacutedigos largos y complicados hace la tarea del programador muycostosa Los lenguajes de programacioacuten funcional como Haskell lo intentan hacenmaacutes sencillo Aunque no se esteacute en la posicioacuten de usar Haskell en un proyecto de-terminado aprender su razonamiento puede ayudar a mejorar en cualquier otrolenguajeA la hora de elaborar la memoria de un proyecto en el que se estaacute utilizando Haskellla posibilidad de escribir coacutedigo y texto en un formato de calidad otorga globali-dad al trabajo El editor Emacs de GNU permite en particular trabajar en paralelocon Haskell y con Latex El trabajar con Haskell literario ha ayudado a detectar ysolventar errores maacutes raacutepido asiacute como a dar una estructura consolidada al trabajo
1httpswwwubuntucom2httpswwwgnuorg3httpsenwikipediaorgwikiLambda_calculus
14 Iacutendice general
En la paacutegina web del Departamento de Computacioacuten 4 se puede encontrar maacutesinformacioacuten acerca de Haskell y Emacs
GitHub
GitHub es una plataforma de desarrollo colaborativo que permite alojar proyectosusando el control de versiones de Git El trabajo con un sistema como este hacemucho maacutes faacutecil el trabajo en grupo pues cada individuo puede trabajar desde suordenador propio en paralelo a los demaacutes y remotamente ir actualizando el proyectosin perder la posibilidad de restaurarlo a una versioacuten anteriorEn particular GitHub ha sido una excelente herramienta de control de este TrabajoFin de Grado pues los tutores han podido seguir en cada momento el trabajo rea-lizado detectar faacutecilmente los errores y hacer modificaciones directamente sobre eldocumentoEl compantildeero Eduardo Paluzo Hidalgo hace en su Trabajo Fin de Grado una pe-quentildea introduccioacuten al uso de Github y a la instalacioacuten de magit en una distribucioacutenUbuntu muy recomendable para todos aquellos (especialmente los maacutes principian-tes) que tengan intereacutes en trabajar con este sistemaSe puede encontrar maacutes informacioacuten acerca de esta plataforma en la paacutegina web deGit 5
DocTest
DocTest para Haskell es un programa de verificacioacuten dinaacutemica de ejemplos Si se si-gue un determinado formato a la hora de escribir los ejemplos para las funciones deun documento en Haskell Doctest se encarga de comprobar que los ejemplos seancorrectos Estas validaciones han resultado claves en la realizacioacuten del trabajo puesalgunas definiciones han sido modificadas de forma casi continua y este proyectoespecialmente se basa en lo anterior para poder seguir construyendoSu uso es muy sencillo una vez instalado el correspondiente paquete y escrito losejemplos en el formato requerido solo hay que ejecutar el programa desde la consoladando como argumento el fichero que se desea validarSe puede enontrar maacutes informaioacuten acerca del programa y de coacutemo descargarlo ensu repositorio de GitHub 6
4httpwwwcsuses~jalonsocursosi1m-16temastema-1html5httpsgit-scmcom6httpsgithubcomsoldoctest
Capiacutetulo 1
Conjuntos
El concepto de conjunto aparece en todos los campos de las Matemaacuteticas pero iquestqueacutedebe entenderse por eacutel La Teoriacutea de conjuntos fue introducida por Georg Cantor(1845-1917) desde 1869 Cantor ejercioacute como profesor en la Universidad de Halley entre 1879 y 1884 publicoacute una serie de seis artiacuteculos en el Mathematische Annalenen los que hizo una introduccioacuten baacutesica a la teoriacutea de conjuntos En su Beitraumlge zurBegruumlndung der transfiniten Mengenlehre Cantor dio la siguiente definicioacuten de con-junto
Figura 11 Fragmento del texto traducido al ingleacutes en el que Cantor da la definicioacuten de conjunto
laquoDebemos entender por ldquoconjuntordquo (Menge) cualquier coleccioacuten vista co-mo un todo (Zusammenfassung zu einem Ganzen) M de objetos separa-dos y bien definidos m de nuestra intuicioacuten o pensamiento Estos objetosson los ldquoelementosrdquo de Mraquo
Felix Hausdorff en 1914 dice laquoun conjunto es una reunioacuten de cosas que constitu-yen una totalidad es decir una nueva cosaraquo y antildeade laquoesto puede difiacutecilmente seruna definicioacuten pero sirve como demostracioacuten expresiva del concepto de conjunto atraveacutes de conjuntos sencillos como el conjunto de habitantes de una ciudad o el deaacutetomos de Hidroacutegeno del SolraquoUn conjunto asiacute definido no tiene que estar compuesto necesariamente de elementoshomogeacuteneos y ademaacutes da lugar a cuestiones filosoacuteficas como si podemos llamar
15
16 Capiacutetulo 1 Conjuntos
conjunto a aquel que no posee ninguacuten elemento Matemaacuteticamente conviene aceptarsolo elementos que compartan alguna propiedad y definir el conjunto vaciacuteo comoaquel que no tiene elemento algunoEl gran meacuterito de Cantor fue considerar conjuntos transfinitos (que tiene infinitoselementos) concepto inaudito hasta avanzado el siglo XIX hablar del cardinal de unconjunto como el nuacutemero de sus elementos y hablar de conjuntos equivalentes cuan-do puede establecerse una biyeccioacuten entre ellos ideas ya apuntadas por Bolzanoquien se centroacute demasiado en el aspecto filosoacutefico sin llegar a formalizar sus ideas
A lo largo de la seccioacuten haremos una pequentildea introduccioacuten a la Teoriacutea de Conjun-tos presentando formalmente sus conceptos maacutes importantes A la hora de elaborarel contenido se han utilizado los siguientes recursos bibliograacuteficosbull el primer tema de la asignatura ldquoAacutelgebra baacutesicardquo ([6])bull los temas de la asignatura ldquoInformaacuteticardquo ([1])bull el artiacuteculo de la Wikipedia ldquoSet (mathematics)rdquo ([10] ylowast el artiacuteculo ldquoEl regalo de Cantorrdquo ([5])
11 El TAD de los conjuntos
En la presente seccioacuten se definen las operaciones baacutesicas necesarias para trabajarcon conjuntos en un lenguaje funcional En nuestro caso el lenguaje que utilizare-mos seraacute Haskell Daremos la signatura del Tipo Abstracto de Dato (TAD) de losconjuntos y daremos algunos ejemplos de posibles representaciones de conjuntoscon las que podriacuteamos trabajarA continuacioacuten presentamos las operaciones definidas en el TAD de los conjuntos
vacio Conj a
inserta Eq a =gt a -gt Conj a -gt Conj a
elimina Eq a =gt a -gt Conj a -gt Conj a
pertenece Eq a =gt Conj a -gt a -gt Bool
esVacio Conj a -gt Bool
minimoElemento Ord a =gt Conj a -gt a
dondebull (vacio) es el conjunto vaciacuteobull (inserta x c) es el conjunto obtenido antildeadiendo el elemento x al conjunto cbull (elimina x c) es el conjunto obtenido eliminando el elemento x del conjunto cbull (pertenece x c) se verifica si x pertenece al conjunto cbull (esVacio c) se verifica si c no tiene ninguacuten elementobull (minimoElemento c) devuelve el miacutenimo elemento del conjunto c
12 Representaciones de conjuntos 17
Hemos de tener en cuenta que a la hora de crear un nuevo tipo de dato con el querepresentar a los conjuntos este debe ser compatible con la entidad matemaacutetica querepresenta
Estas son algunas de las posibles representaciones con las que podriacuteamos trabajarcon conjuntos en Haskellbull En primer lugar podemos trabajar con la libreriacutea DataSet en este caso la imple-
mentacioacuten del tipo de dato Set estaacute basado en aacuterboles binarios balanceadosbull Por otra parte podemos definir un nuevo tipo Cj xs con el que trabajar con con-
juntos como listas no ordenadas con duplicados como listas no ordenadas sinduplicados o como listas ordenadas sin duplicadosbull Otra opcioacuten seriacutea trabajar directamente con conjuntos como listas para ello de-
bemos ignorar las repeticiones y el orden con vista a la igualdad de conjuntosbull Los conjuntos que soacutelo contienen nuacutemeros (de tipo Int) entre 0 y nminus 1 se pueden
representar como nuacutemeros binarios con n bits donde el bit i(0 le i lt n) es 1 syssel nuacutemero i pertenece al conjunto
Nota 111 Las funciones que aparecen en la especificacioacuten del TAD no dependende la representacioacuten que elijamos
12 Representaciones de conjuntos
121 Conjuntos como listas ordenadas sin repeticioacuten
En el moacutedulo ConjuntosConListasOrdenadasSinRepeticion se definen las funcio-nes del TAD de los conjuntos dando su representacioacuten como listas ordenadas sinrepeticioacuten
module ConjuntosConListasOrdenadasSinRepeticion
( Conj
vacio
inserta
listaAConjunto
elimina
pertenece
esVacio
minimoElemento
sinRepetidos
esUnitario
esSubconjunto
conjuntosIguales
esSubconjuntoPropio
complementario
18 Capiacutetulo 1 Conjuntos
cardinal
unionConjuntos
unionGeneral
interseccion
productoCartesiano
combinaciones
variacionesR
) where
En las definiciones del presente moacutedulo se usaraacuten algunas funciones de la libreriacuteaDataList
Vamos a definir un nuevo tipo de dato (Conj a) que representa a los conjuntoscomo listas ordenadas sin repeticioacuten
type Conj a = [a]
Las funciones baacutesicas que definiremos a partir de este tipo coincidiraacuten con las indi-cadas en el TAD de los conjuntosbull (vacio) es el conjunto vaciacuteo
-- | Ejemplo
-- gtgtgt vacio
-- []
vacio Conj a
vacio = []
bull (inserta x c) es el conjunto obtenido antildeadiendo el elemento x al conjunto c
-- | Ejemplo
-- gtgtgt inserta 5 vacio
-- [5]
-- gtgtgt foldr inserta vacio [2211242]
-- [124]
inserta Ord a =gt a -gt Conj a -gt Conj a
inserta x [] = [x]
inserta x ys
| pertenece ys x = ys
| otherwise = insert x ys
bull (listaAConjunto xs) devuelve el conjunto cuyos elementos son los de la lista xs
-- | Ejemplo
-- gtgtgt listaAConjunto [2211242]
-- [124]
listaAConjunto Ord a =gt [a] -gt Conj a
listaAConjunto = sort nub
bull (esVacio c) se verifica si c es el conjunto vaciacuteo
12 Representaciones de conjuntos 19
-- | Ejemplos
-- gtgtgt esVacio (listaAConjunto [25137532190])
-- False
-- gtgtgt esVacio vacio
-- True
esVacio Conj a -gt Bool
esVacio = null
bull (pertenece x c) se verifica si x es un elemento del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt pertenece c1 3
-- True
-- gtgtgt pertenece c1 4
-- False
pertenece Ord a =gt Conj a -gt a -gt Bool
pertenece ys x =
x == head (dropWhile (ltx) ys)
bull (elimina x c) es el conjunto obtenido eliminando el elemento x del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt elimina 3 c1
-- [012579]
-- gtgtgt elimina 4 c1
-- [0123579]
elimina Ord a =gt a -gt Conj a -gt Conj a
elimina x ys = us ++ dropWhile (==x) vs
where (usvs) = span (ltx) ys
bull (minimoElemento c) devuelve el miacutenimo elemento del conjunto c
-- | Ejemplos
-- gtgtgt minimoElemento (listaAConjunto [25137532190])
-- 0
-- gtgtgt minimoElemento (listaAConjunto ([ae] ++ [AE]))
-- A
minimoElemento Ord a =gt Conj a -gt a
minimoElemento = head
122 Definicioacuten de conjunto
Nota 121 Al trabajar con la representacioacuten de conjuntos como listas en Haskellhemos de cuidar que los ejemplos con los que trabajemos no tengan elementos re-petidos La funcioacuten (sinRepetidos xs) se verifica si la lista xs no tiene ninguacuten ele-mento repetido
20 Capiacutetulo 1 Conjuntos
-- | Ejemplos
-- gtgtgt sinRepetidos []
-- True
-- gtgtgt sinRepetidos [1231]
-- False
sinRepetidos Eq a =gt [a] -gt Bool
sinRepetidos xs = nub xs == xs
Los conjuntos pueden definirse de manera expliacutecita citando todos sus elementosentre llaves de manera impliacutecita dando una o varias caracteriacutesticas que determi-nen si un objeto dado estaacute o no en el conjunto Por ejemplo los conjuntos 1 2 3 4y x isinN|1 le x le 4 son el mismo definido de forma explicita e impliacutecita respecti-vamente
Nota 122 La definicioacuten impliacutecita es necesaria cuando el conjunto en cuestioacuten tieneuna cantidad infinita de elementos En general los conjuntos se notaraacuten con letrasmayuacutesculas A B y los elementos con letras minuacutesculas a b
Cuando trabajamos con conjuntos concretos siempre existe un contexto donde esosconjuntos existen Por ejemplo si A = minus1 1 2 3 4 5 y B = x|x isin Nes par elcontexto donde podemos considerar A y B es el conjunto de los nuacutemeros enterosZ En general a este conjunto se le denomina conjunto universal De una forma algomaacutes precisa podemos dar la siguiente definicioacuten
Definicioacuten 121 El conjunto universal que notaremos por U es un conjunto del queson subconjuntos todos los posibles conjuntos que originan el problema que tratamos
123 Subconjuntos
Definicioacuten 122 Dados dos conjuntos A y B si todo elemento de A es a su vez elementode B diremos que A es un subconjunto de B y lo notaremos A sube B En caso contrario senotaraacute A 6sube B
La funcioacuten (esSubconjunto c1 c2) se verifica si c1 es un subconjunto de c2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
-- gtgtgt c1 `esSubconjunto` c2
-- True
-- gtgtgt c1 `esSubconjunto` vacio
-- False
-- gtgtgt vacio `esSubconjunto` c2
12 Representaciones de conjuntos 21
-- True
-- gtgtgt c3 `esSubconjunto` c4
-- True
-- gtgtgt c2 `esSubconjunto` c1
-- False
esSubconjunto Ord a =gt Conj a -gt Conj a -gt Bool
esSubconjunto [] _ = True
esSubconjunto (xxs) ys =
x == head vs ampamp esSubconjunto xs (tail vs)
where (usvs) = span (ltx) ys
124 Igualdad de conjuntos
Definicioacuten 123 Dados dos conjuntos A y B diremos que son iguales si tienen los mismoselementos es decir si se verifica que A sube B y B sube A Lo notaremos A = B
La funcioacuten (conjuntosIguales c1 c2) se verifica si los conjuntos xs y ys son igua-les
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
-- gtgtgt let c5 = listaAConjunto [4444442]
-- gtgtgt conjuntosIguales c1 c2
-- False
-- gtgtgt conjuntosIguales c3 c4
-- True
-- gtgtgt conjuntosIguales c1 c5
-- True
conjuntosIguales Ord a =gt Conj a -gt Conj a -gt Bool
conjuntosIguales = (==)
125 Subconjuntos propios
Definicioacuten 124 Los subconjuntos de A distintos del empty y del mismo A se denominansubconjuntos propios de A
La funcioacuten (esSubconjuntoPropio c1 c2) se verifica si c1 es un subconjunto pro-pio de c2
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt esSubconjuntoPropio u u
22 Capiacutetulo 1 Conjuntos
-- False
-- gtgtgt esSubconjuntoPropio c1 u
-- True
esSubconjuntoPropio Ord a =gt Conj a -gt Conj a -gt Bool
esSubconjuntoPropio c1 c2 =
not (null c1) ampamp esSubconjunto c1 c2 ampamp c1 = c2
126 Complementario de un conjunto
Definicioacuten 125 Dado un conjunto A se define el complementario de A que notaremospor A como
A = x|x isin U x 6isin A
La funcioacuten (complementario u c) devuelve el complementario del conjunto c y enel universo u
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt let c2 = listaAConjunto [14689]
-- gtgtgt complementario u c1
-- [14689]
-- gtgtgt complementario u u
-- []
-- gtgtgt complementario u vacio
-- [123456789]
-- gtgtgt complementario u c2
-- [2357]
complementario Ord a =gt Conj a -gt Conj a -gt Conj a
complementario [] _ = []
complementario xs [] = xs
complementario (xxs) (yys)
| x lt y = x complementario xs (yys)
| otherwise = complementario xs ys
127 Cardinal de un conjunto
Definicioacuten 126 Dado un conjunto finito A denominaremos cardinal de A al nuacutemero deelementos que tiene y lo notaremos |A|
La funcioacuten (cardinal xs) devuelve el cardinal del conjunto xs
-- | Ejemplos
-- gtgtgt cardinal vacio
-- 0
-- gtgtgt cardinal (listaAConjunto [110])
12 Representaciones de conjuntos 23
-- 10
-- gtgtgt cardinal (listaAConjunto chocolate)
-- 7
cardinal Ord a =gt Conj a -gt Int
cardinal = length
128 Conjunto unitario
Definicioacuten 127 Un conjunto con un uacutenico elemento se denomina unitario
Nota 123 Notemos que si X = x es un conjunto unitario debemos distinguirentre el conjunto X y el elemento x
La funcioacuten (esUnitario c) se verifica si el conjunto c es unitario
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto (take 10 (repeat 5))
-- gtgtgt let c2 = listaAConjunto valverde
-- gtgtgt let c3 = listaAConjunto coco
-- gtgtgt esUnitario c1
-- True
-- gtgtgt esUnitario c2
-- False
-- gtgtgt esUnitario c2
-- False
esUnitario Ord a =gt Conj a -gt Bool
esUnitario c =
c == take 1 c
129 Unioacuten de conjuntos
Definicioacuten 128 Dados dos conjuntos A y B se define la unioacuten de A y B notado A cup Bcomo el conjunto formado por aquellos elementos que pertenecen al menos a uno de los dosconjuntos A oacute B es decir
A cup B = x | x isin A or x isin B
La funcioacuten (unionConjuntos c1 c2) devuelve la unioacuten de los conjuntos xs y ys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [139]
-- gtgtgt let c2 = listaAConjunto [249]
-- gtgtgt unionConjuntos c1 c2
-- [123456789]
unionConjuntos Ord a =gt Conj a -gt Conj a -gt Conj a
unionConjuntos [] [] = []
24 Capiacutetulo 1 Conjuntos
unionConjuntos [] ys = ys
unionConjuntos xs [] = xs
unionConjuntos (xxs) (yys)
| x lt y = x unionConjuntos xs (yys)
| x == y = x unionConjuntos xs ys
| otherwise = y unionConjuntos (xxs) ys
Definicioacuten 129 Dada una familia de conjuntos Ai con i isin I se define la unioacuten ge-neral de los conjuntos Ai notado
⋃iisinI Ai como el conjunto formado por aquellos elementos
que pertenecen al menos a uno de los conjuntos de la familia es decir
⋃iisinI
Ai = x | x isin Ai foralli isin I
La funcioacuten (unionGeneral xss) devuelve la unioacuten general de la familia de conjun-tos de la lista xss
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1415]
-- gtgtgt let c2 = listaAConjunto [2515]
-- gtgtgt let c3 = listaAConjunto [3615]
-- gtgtgt unionGeneral [c1c2c3]
-- [123456789101112131415]
unionGeneral Ord a =gt [Conj a] -gt Conj a
unionGeneral = foldr unionConjuntos vacio
1210 Interseccioacuten de conjuntos
Definicioacuten 1210 Dados dos conjuntos A y B se define la interseccioacuten de A y B notadoA cap B como el conjunto formado por aquellos elementos que pertenecen a cada uno de losdos conjuntos A y B es decir
A cap B = x | x isin A and x isin B
La funcioacuten (interseccion c1 c2) devuelve la interseccioacuten de los conjuntos c1 yc2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1320]
-- gtgtgt let c2 = listaAConjunto [2420]
-- gtgtgt let c3 = listaAConjunto [2430]
-- gtgtgt let c4 = listaAConjunto [4830]
-- gtgtgt interseccion c1 c2
-- []
-- gtgtgt interseccion c3 c4
12 Representaciones de conjuntos 25
-- [481216202428]
interseccion Ord a =gt Conj a -gt Conj a -gt Conj a
interseccion (xxs) (yys)
| x lt y = interseccion xs (yys)
| x gt y = interseccion (xxs) ys
| otherwise = x interseccion xs ys
interseccion _ _ = []
1211 Producto cartesiano
Definicioacuten 1211 El producto cartesiano 1 de dos conjuntos A y B es una operacioacutensobre ellos que resulta en un nuevo conjunto Atimes B que contiene a todos los pares ordenadostales que la primera componente pertenece a A y la segunda pertenece a B es decir
Atimes B = (a b) | a isin A b isin B
La funcioacuten (productoCartesiano c1 c2) devuelve el producto cartesiano de xs eys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [31]
-- gtgtgt let c2 = listaAConjunto [247]
-- gtgtgt productoCartesiano c1 c2
-- [(12)(14)(17)(32)(34)(37)]
-- gtgtgt productoCartesiano c2 c1
-- [(21)(23)(41)(43)(71)(73)]
productoCartesiano (Ord a Ord b) =gt Conj a -gt Conj b -gt Conj (ab)
productoCartesiano xs ys=
listaAConjunto [(xy) | x lt- xs y lt- ys]
1212 Combinaciones
Definicioacuten 1212 Las combinaciones de un conjunto S tomados en grupos de n son todoslos subconjuntos de S con n elementos
La funcioacuten (combinaciones n xs) devuelve las combinaciones de los elementos dexs en listas de n elementos
-- | Ejemplos
-- gtgtgt combinaciones 3 [ad]
-- [abcabdacdbcd]
-- gtgtgt combinaciones 2 [248]
-- [[24][26][28][46][48][68]]
1httpsenwikipediaorgwikiCartesian_product
26 Capiacutetulo 1 Conjuntos
combinaciones Integer -gt [a] -gt [[a]]
combinaciones 0 _ = [[]]
combinaciones _ [] = []
combinaciones k (xxs) =
[xys | ys lt- combinaciones (k-1) xs] ++ combinaciones k xs
1213 Variaciones con repeticioacuten
Definicioacuten 1213 Las variaciones con repeticioacuten de m elementos tomados en grupos den es el nuacutemero de diferentes nndashtuplas de un conjunto de m elementos
La funcioacuten (variacionesR n xs) devuelve las variaciones con con repeticioacuten de loselementos de xs en listas de n elementos
-- | Ejemplos
-- gtgtgt variacionesR 3 [ab]
-- [aaaaababaabbbaababbbabbb]
-- gtgtgt variacionesR 2 [235]
-- [[22][23][25][32][33][35][52][53][55]]
variacionesR Int -gt [a] -gt [[a]]
variacionesR _ [] = [[]]
variacionesR 0 _ = [[]]
variacionesR k us =
[uvs | u lt- us vs lt- variacionesR (k-1) us]
1214 Conjuntos como listas sin repeticioacuten
En el moacutedulo ConjuntosConListas se definen las funciones del TAD de los conjun-tos dando su representacioacuten como listas sin elementos repetidos
module ConjuntosConListas
( Conj
vacio
inserta
listaAConjunto
elimina
pertenece
esVacio
minimoElemento
sinRepetidos
esUnitario
esSubconjunto
conjuntosIguales
esSubconjuntoPropio
complementario
cardinal
12 Representaciones de conjuntos 27
unionConjuntos
unionGeneral
interseccion
productoCartesiano
combinaciones
variacionesR
) where
En las definiciones del presente moacutedulo se usaraacuten algunas funciones de la libreriacuteaDataList
Vamos a definir un nuevo tipo de dato (Conj a) que representa a los conjuntoscomo listas sin elementos repetidos
type Conj a = [a]
Las funciones baacutesicas que definiremos a partir de este tipo coincidiraacuten con las indi-cadas en el TAD de los conjuntosbull (vacio) es el conjunto vaciacuteo
-- | Ejemplo
-- gtgtgt vacio
-- []
vacio Conj a
vacio = []
bull (inserta x c) es el conjunto obtenido antildeadiendo el elemento x al conjunto c
-- | Ejemplo
-- gtgtgt inserta 5 vacio
-- [5]
-- gtgtgt foldr inserta vacio [2211242]
-- [142]
inserta Eq a =gt a -gt Conj a -gt Conj a
inserta x [] = [x]
inserta x ys | elem x ys = ys
| otherwise = xys
bull (listaAConjunto xs) devuelve el conjunto cuyos elementos son los de la lista xs
-- | Ejemplo
-- gtgtgt listaAConjunto [2211242]
-- [214]
listaAConjunto Eq a =gt [a] -gt Conj a
listaAConjunto = nub
bull (esVacio c) se verifica si c es el conjunto vaciacuteo
-- | Ejemplos
-- gtgtgt esVacio (listaAConjunto [25137532190])
-- False
28 Capiacutetulo 1 Conjuntos
-- gtgtgt esVacio vacio
-- True
esVacio Conj a -gt Bool
esVacio = null
bull (pertenece x c) se verifica si x es un elemento del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt pertenece 3 c1
-- True
-- gtgtgt pertenece 4 c1
-- False
pertenece Eq a =gt a -gt Conj a -gt Bool
pertenece = elem
bull (elimina x c) es el conjunto obtenido eliminando el elemento x del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt elimina 3 c1
-- [251790]
-- gtgtgt elimina 4 c1
-- [2513790]
elimina Eq a =gt a -gt Conj a -gt Conj a
elimina = delete
bull (minimoElemento c) devuelve el miacutenimo elemento del conjunto c
-- | Ejemplos
-- gtgtgt minimoElemento (listaAConjunto [25137532190])
-- 0
-- gtgtgt minimoElemento (listaAConjunto ([ae] ++ [AE]))
-- A
minimoElemento Ord a =gt Conj a -gt a
minimoElemento = minimum
1215 Definicioacuten de conjunto
Definicioacuten 1214 Llamaremos conjunto a una coleccioacuten de objetos que llamaremos ele-mentos distintos entre siacute y que comparten una propiedad Para que un conjunto esteacute biendefinido debe ser posible discernir si un objeto arbitrario estaacute o no en eacutel
Si el elemento a pertenece al conjunto A escribiremos a isin A En caso contrarioescribiremos a 6isin A
Nota 124 En Haskell para poder discernir si un objeto arbitrario pertenece a unconjunto se necesita que su tipo pertenezca a la clase Eq
12 Representaciones de conjuntos 29
Nota 125 Al trabajar con la representacioacuten de conjuntos como listas en Haskellhemos de cuidar que los ejemplos con los que trabajemos no tengan elementos re-petidos La funcioacuten (sinRepetidos xs) se verifica si la lista xs no tiene ninguacuten ele-mento repetido
-- | Ejemplos
-- gtgtgt sinRepetidos []
-- True
-- gtgtgt sinRepetidos [1231]
-- False
sinRepetidos Eq a =gt [a] -gt Bool
sinRepetidos xs = nub xs == xs
Los conjuntos pueden definirse de manera expliacutecita citando todos sus elementosentre llaves de manera impliacutecita dando una o varias caracteriacutesticas que determi-nen si un objeto dado estaacute o no en el conjunto Por ejemplo los conjuntos 1 2 3 4y x isinN|1 le x le 4 son el mismo definido de forma explicita e impliacutecita respecti-vamente
Nota 126 La definicioacuten impliacutecita es necesaria cuando el conjunto en cuestioacuten tieneuna cantidad infinita de elementos En general los conjuntos se notaraacuten con letrasmayuacutesculas A B y los elementos con letras minuacutesculas a b
Cuando trabajamos con conjuntos concretos siempre existe un contexto donde esosconjuntos existen Por ejemplo si A = minus1 1 2 3 4 5 y B = x|x isin Nes par elcontexto donde podemos considerar A y B es el conjunto de los nuacutemeros enterosZ En general a este conjunto se le denomina conjunto universal De una forma algomaacutes precisa podemos dar la siguiente definicioacuten
Definicioacuten 1215 El conjunto universal que notaremos por U es un conjunto del queson subconjuntos todos los posibles conjuntos que originan el problema que tratamos
1216 Subconjuntos
Definicioacuten 1216 Dados dos conjuntos A y B si todo elemento de A es a su vez elementode B diremos que A es un subconjunto de B y lo notaremos A sube B En caso contrario senotaraacute A 6sube B
La funcioacuten (esSubconjunto c1 c2) se verifica si c1 es un subconjunto de c2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
30 Capiacutetulo 1 Conjuntos
-- gtgtgt c1 `esSubconjunto` c2
-- True
-- gtgtgt c1 `esSubconjunto` vacio
-- False
-- gtgtgt vacio `esSubconjunto` c2
-- True
-- gtgtgt c3 `esSubconjunto` c4
-- True
-- gtgtgt c2 `esSubconjunto` c1
-- False
esSubconjunto Eq a =gt [a] -gt [a] -gt Bool
esSubconjunto c1 c2 = all (`elem` c2) c1
1217 Igualdad de conjuntos
Definicioacuten 1217 Dados dos conjuntos A y B diremos que son iguales si tienen losmismos elementos es decir si se verifica que A sube B y B sube A Lo notaremos A = B
La funcioacuten (conjuntosIguales c1 c2) se verifica si los conjuntos xs y ys son igua-les
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
-- gtgtgt let c5 = listaAConjunto [4444442]
-- gtgtgt conjuntosIguales c1 c2
-- False
-- gtgtgt conjuntosIguales c3 c4
-- True
-- gtgtgt conjuntosIguales c1 c5
-- True
conjuntosIguales Eq a =gt [a] -gt [a] -gt Bool
conjuntosIguales c1 c2 =
esSubconjunto c1 c2 ampamp esSubconjunto c2 c1
1218 Subconjuntos propios
Definicioacuten 1218 Los subconjuntos de A distintos del empty y del mismo A se denominansubconjuntos propios de A
La funcioacuten (esSubconjuntoPropio c1 c2) se verifica si c1 es un subconjunto pro-pio de c2
12 Representaciones de conjuntos 31
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt esSubconjuntoPropio u u
-- False
-- gtgtgt esSubconjuntoPropio c1 u
-- True
esSubconjuntoPropio Eq a =gt [a] -gt [a] -gt Bool
esSubconjuntoPropio c1 c2
| null c1 = False
| conjuntosIguales c1 c2 = False
| otherwise = esSubconjunto c1 c2
1219 Complementario de un conjunto
Definicioacuten 1219 Dado un conjunto A se define el complementario de A que notaremospor A como
A = x|x isin U x 6isin A
La funcioacuten (complementario u c) devuelve el complementario del conjunto c y enel universo u
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt let c2 = listaAConjunto [14689]
-- gtgtgt complementario u c1
-- [14689]
-- gtgtgt complementario u u
-- []
-- gtgtgt complementario u vacio
-- [123456789]
-- gtgtgt complementario u c2
-- [2357]
complementario Eq a =gt [a] -gt [a] -gt [a]
complementario = ()
1220 Cardinal de un conjunto
Definicioacuten 1220 Dado un conjunto finito A denominaremos cardinal de A al nuacutemerode elementos que tiene y lo notaremos |A|
La funcioacuten (cardinal xs) devuelve el cardinal del conjunto xs
32 Capiacutetulo 1 Conjuntos
-- | Ejemplos
-- gtgtgt cardinal vacio
-- 0
-- gtgtgt cardinal (listaAConjunto [110])
-- 10
-- gtgtgt cardinal (listaAConjunto chocolate)
-- 7
cardinal [a] -gt Int
cardinal = length
1221 Conjunto unitario
Definicioacuten 1221 Un conjunto con un uacutenico elemento se denomina unitario
Nota 127 Notemos que si X = x es un conjunto unitario debemos distinguirentre el conjunto X y el elemento x
La funcioacuten (esUnitario c) se verifica si el conjunto c es unitario
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto (take 10 (repeat 5))
-- gtgtgt let c2 = listaAConjunto valverde
-- gtgtgt let c3 = listaAConjunto coco
-- gtgtgt esUnitario c1
-- True
-- gtgtgt esUnitario c2
-- False
-- gtgtgt esUnitario c2
-- False
esUnitario Eq a =gt [a] -gt Bool
esUnitario c = c == take 1 c
1222 Unioacuten de conjuntos
Definicioacuten 1222 Dados dos conjuntos A y B se define la unioacuten de A y B notado A cup Bcomo el conjunto formado por aquellos elementos que pertenecen al menos a uno de los dosconjuntos A oacute B es decir
A cup B = x | x isin A or x isin B
La funcioacuten (unionConjuntos c1 c2) devuelve la unioacuten de los conjuntos xs y ys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [139]
-- gtgtgt let c2 = listaAConjunto [249]
12 Representaciones de conjuntos 33
-- gtgtgt unionConjuntos c1 c2
-- [135792468]
unionConjuntos Eq a =gt [a] -gt [a] -gt [a]
unionConjuntos = union
Definicioacuten 1223 Dada una familia de conjuntos Ai con i isin I se define la unioacuten ge-neral de los conjuntos Ai notado
⋃iisinI Ai como el conjunto formado por aquellos elementos
que pertenecen al menos a uno de los conjuntos de la familia es decir
⋃iisinI
Ai = x | x isin Ai foralli isin I
La funcioacuten (unionGeneral xss) devuelve la unioacuten general de la familia de conjun-tos de la lista xss
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1415]
-- gtgtgt let c2 = listaAConjunto [2515]
-- gtgtgt let c3 = listaAConjunto [3615]
-- gtgtgt unionGeneral [c1c2c3]
-- [147101325811143691215]
unionGeneral Eq a =gt [[a]] -gt [a]
unionGeneral = foldr unionConjuntos []
1223 Interseccioacuten de conjuntos
Definicioacuten 1224 Dados dos conjuntos A y B se define la interseccioacuten de A y B notadoA cap B como el conjunto formado por aquellos elementos que pertenecen a cada uno de losdos conjuntos A y B es decir
A cap B = x | x isin A and x isin B
La funcioacuten (interseccion c1 c2) devuelve la interseccioacuten de los conjuntos c1 yc2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1320]
-- gtgtgt let c2 = listaAConjunto [2420]
-- gtgtgt let c3 = listaAConjunto [2430]
-- gtgtgt let c4 = listaAConjunto [4830]
-- gtgtgt interseccion c1 c2
-- []
-- gtgtgt interseccion c3 c4
-- [481216202428]
34 Capiacutetulo 1 Conjuntos
interseccion Eq a =gt [a] -gt [a] -gt [a]
interseccion = intersect
1224 Producto cartesiano
Definicioacuten 1225 El producto cartesiano 2 de dos conjuntos A y B es una operacioacutensobre ellos que resulta en un nuevo conjunto Atimes B que contiene a todos los pares ordenadostales que la primera componente pertenece a A y la segunda pertenece a B es decir
Atimes B = (a b) | a isin A b isin B
La funcioacuten (productoCartesiano c1 c2) devuelve el producto cartesiano de xs eys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [31]
-- gtgtgt let c2 = listaAConjunto [247]
-- gtgtgt productoCartesiano c1 c2
-- [(32)(34)(37)(12)(14)(17)]
-- gtgtgt productoCartesiano c2 c1
-- [(23)(21)(43)(41)(73)(71)]
productoCartesiano [a] -gt [b] -gt [(ab)]
productoCartesiano xs ys = [ (xy) | x lt- xs y lt- ys]
1225 Combinaciones
Definicioacuten 1226 Las combinaciones de un conjunto S tomados en grupos de n son todoslos subconjuntos de S con n elementos
La funcioacuten (combinaciones n xs) devuelve las combinaciones de los elementos dexs en listas de n elementos
-- | Ejemplos
-- gtgtgt combinaciones 3 [ad]
-- [abcabdacdbcd]
-- gtgtgt combinaciones 2 [248]
-- [[24][26][28][46][48][68]]
combinaciones Integer -gt [a] -gt [[a]]
combinaciones 0 _ = [[]]
combinaciones _ [] = []
combinaciones k (xxs) =
[xys | ys lt- combinaciones (k-1) xs] ++ combinaciones k xs
2httpsenwikipediaorgwikiCartesian_product
13 Eleccioacuten de la representacioacuten de conjuntos 35
1226 Variaciones con repeticioacuten
Definicioacuten 1227 Las variaciones con repeticioacuten de m elementos tomados en grupos den es el nuacutemero de diferentes nndashtuplas de un conjunto de m elementos
La funcioacuten (variacionesR n xs) devuelve las variaciones con con repeticioacuten de loselementos de xs en listas de n elementos
-- | Ejemplos
-- gtgtgt variacionesR 3 [ab]
-- [aaaaababaabbbaababbbabbb]
-- gtgtgt variacionesR 2 [235]
-- [[22][23][25][32][33][35][52][53][55]]
variacionesR Int -gt [a] -gt [[a]]
variacionesR _ [] = [[]]
variacionesR 0 _ = [[]]
variacionesR k us =
[uvs | u lt- us vs lt- variacionesR (k-1) us]
13 Eleccioacuten de la representacioacuten de conjuntos
Nota 131 En el moacutedulo Conjuntos se elige la representacioacuten de conjunto con la quese trabajaraacute
-- Seleccionar para trabajar con los conjuntos como listas sin
-- elementos repetidos
module Conjuntos
(module ConjuntosConListas)
where
import ConjuntosConListas
-- Seleccionar para trabajar con los conjuntos como listas ordenadas
-- sin elementos repetidos
-- module Conjuntos
-- (module ConjuntosConListasOrdenadasSinRepeticion)
-- where
-- import ConjuntosConListasOrdenadasSinRepeticion
36 Capiacutetulo 1 Conjuntos
Capiacutetulo 2
Relaciones y funciones
21 Relaciones
Las relaciones que existen entre personas nuacutemeros conjuntos y muchas otras enti-dades pueden formalizarse en la idea de relacioacuten binaria En esta seccioacuten se define ydesarrolla este concepto particularizando en el caso de las relaciones homogeacuteneasy en el de las funciones
211 Relacioacuten binaria
Definicioacuten 211 Una relacioacuten binaria 1 (o correspondencia) entre dos conjuntos A yB es un subconjunto del producto cartesiano Atimes B
La funcioacuten (esRelacion xs ys r) se verifica si r es una relacioacuten binaria de xs enys Por ejemplo
-- | Ejemplos
-- gtgtgt esRelacion [31] [247] [(12)(34)]
-- True
-- gtgtgt esRelacion [31] [247] [(12)(31)]
-- False
esRelacion (Ord a Ord b) =gt [a] -gt [b] -gt [(ab)] -gt Bool
esRelacion xs ys r =
r `esSubconjunto` productoCartesiano xs ys
212 Imagen por una relacioacuten
Definicioacuten 212 Si R es una relacioacuten binaria la imagen del elemento x en la relacioacuten Res el conjunto de los valores correspondientes a x en R
1httpsenwikipediaorgwikiBinary_relation
37
38 Capiacutetulo 2 Relaciones y funciones
La funcioacuten (imagenRelacion r x) es la imagen de x en la relacioacuten r
-- | Ejemplos
-- gtgtgt imagenRelacion [(13)(25)(14)] 1
-- [34]
-- gtgtgt imagenRelacion [(13)(25)(14)] 2
-- [5]
-- gtgtgt imagenRelacion [(13)(25)(14)] 3
-- []
imagenRelacion (Ord a Ord b) =gt [(ab)] -gt a -gt [b]
imagenRelacion r x =
nub [y | (zy) lt- r z == x]
213 Dominio de una relacioacuten
Definicioacuten 213 Dada una relacioacuten binaria R su dominio es el conjunto que contiene atodos los valores que se toman en la relacioacuten R
La funcioacuten (dominio r) devuelve el dominio de la relacioacuten r
-- | Ejemplo
-- gtgtgt dominio [(32)(51)(34)]
-- [35]
dominio Ord a =gt [(ab)] -gt [a]
dominio r = listaAConjunto (map fst r)
214 Rango de una relacioacuten
Definicioacuten 214 El rango de una relacioacuten binaria R es el conjunto de las imaacutegenes demediante R
La funcioacuten (rango r) devuelve el rango de la relacioacuten binaria r
-- | Ejemplo
-- gtgtgt rango [(32)(52)(34)]
-- [24]
rango Ord b =gt [(ab)] -gt [b]
rango r = listaAConjunto (map snd r)
215 Antiimagen por una relacioacuten
Definicioacuten 215 La antiimagen del elemento y por una relacioacuten r es el conjunto de loselementos cuya imagen es y
La (antiImagenRelacion r y) es la antiimagen del elemento y en la relacioacuten bina-ria r
22 Relaciones homogeacuteneas 39
-- | Ejemplo
-- gtgtgt antiImagenRelacion [(13)(23)(74)] 3
-- [12]
antiImagenRelacion (Ord a Ord b) =gt [(ab)] -gt b -gt [a]
antiImagenRelacion r y =
nub [x | (xz) lt- r z == y]
216 Relacioacuten funcional
Definicioacuten 216 Dada una relacioacuten binaria R se dice funcional si todos los elementos desu dominio tienen una uacutenica imagen en R
La funcioacuten (esFuncional r) se verifica si la relacioacuten r es funcional
-- | Ejemplos
-- gtgtgt esFuncional [(32)(51)(79)]
-- True
-- gtgtgt esFuncional [(32)(51)(34)]
-- False
-- gtgtgt esFuncional [(32)(51)(32)]
-- True
esFuncional (Ord a Ord b) =gt [(ab)] -gt Bool
esFuncional r =
and [esUnitario (imagenRelacion r x) | x lt- dominio r]
22 Relaciones homogeacuteneas
Para elaborar la presente seccioacuten se han consultado los apuntes de ldquoAacutelgebra baacutesicardquo([6]) asignatura del primer curso del Grado en Matemaacuteticas
Definicioacuten 221 Una relacioacuten binaria entre dos conjuntos A y B se dice que es homogeacute-nea si los conjuntos son iguales es decir si A = B Si el par (x y) isin AA estaacute en la relacioacutenhomogeacutenea R diremos que x estaacute Rndashrelacionado con y o relacionado con y por R Esto senotaraacute frecuentemente xRy (noacutetese que el orden es importante)
La funcioacuten (esRelacionHomogenea xs r) se verifica si r es una relacioacuten binaria ho-mogeacutenea en el conjunto xs
-- | Ejemplos
-- gtgtgt esRelacionHomogenea [14] [(12)(24)(34)(41)]
-- True
-- gtgtgt esRelacionHomogenea [14] [(12)(25)(34)(41)]
-- False
-- gtgtgt esRelacionHomogenea [14] [(12)(34)(41)]
40 Capiacutetulo 2 Relaciones y funciones
-- True
esRelacionHomogenea Ord a =gt [a] -gt [(aa)] -gt Bool
esRelacionHomogenea xs = esRelacion xs xs
Nota 221 El segundo argumento que recibe la funcioacuten ha de ser una lista de parescon ambas componentes del mismo tipo
La funcioacuten (estaRelacionado r x y) se verifica si x estaacute relacionado con y en larelacioacuten homogeacutenea r
-- | Ejemplos
-- gtgtgt estaRelacionado [(13)(25)(46)] 2 5
-- True
-- gtgtgt estaRelacionado [(13)(25)(46)] 2 3
-- False
estaRelacionado Ord a =gt [(aa)] -gt a -gt a -gt Bool
estaRelacionado r x y = (xy) `elem` r
221 Relaciones reflexivas
Definicioacuten 222 Sea R una relacioacuten binaria homogeacutenea en el conjunto A Diremos que Res reflexiva cuando todos los elementos de A estaacuten relacionados por R consigo mismos esdecir cuando forallx isin A se tiene que xRx
La funcioacuten (esReflexiva xs r) se verifica si la relacioacuten r en xs es reflexiva
-- | Ejemplos
-- gtgtgt esReflexiva [12] [(11)(12)(22)]
-- True
-- gtgtgt esReflexiva [12] [(11)(12)]
-- False
esReflexiva Ord a =gt [a] -gt [(aa)] -gt Bool
esReflexiva xs r = zip xs xs `esSubconjunto` r
Nota 222 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xSylarrrarr xminus y es parbull xTylarrrarr x divide a yson relaciones binarias homogeacuteneas reflexivas
222 Relaciones simeacutetricas
Definicioacuten 223 Diremos que una relacioacuten homogeacutenea R es simeacutetrica cuando
forall(x y) isin R minusrarr (y x) isin R
22 Relaciones homogeacuteneas 41
La funcioacuten (esSimetrica r) se verifica si la relacioacuten r es simeacutetrica
-- | Ejemplos
-- gtgtgt esSimetrica [(11)(12)(21)]
-- True
-- gtgtgt esSimetrica [(11)(12)(22)]
-- False
esSimetrica Ord a =gt [(aa)] -gt Bool
esSimetrica r =
listaAConjunto [(yx) | (xy) lt- r] `esSubconjunto` r
Nota 223 En el conjunto N la relacioacuten caracterizada por xSy larrrarr xminus y es par esuna relacioacuten binaria homogeacutenea simeacutetrica
223 Relaciones antisimeacutetricas
Definicioacuten 224 Sea R una relacioacuten binaria homogeacutenea en el conjunto A Diremos que Res antisimeacutetrica cuando
forall(x y)[(x y) isin R and (y x) isin R minusrarr x = y
La funcioacuten (esAntisimetrica r) se verifica si la relacioacuten r es antisimeacutetrica
-- | Ejemplos
-- gtgtgt esAntisimetrica [(12)(31)]
-- True
-- gtgtgt esAntisimetrica [(12)(21)]
-- False
esAntisimetrica Ord a =gt [(aa)] -gt Bool
esAntisimetrica r =
and [x == y | (xy) lt- r (yx) `elem` r]
Nota 224 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xTylarrrarr x divide a ybull xRylarrrarr x lt yson relaciones binarias homogeacuteneas antisimeacutetricas
224 Relaciones transitivas
Definicioacuten 225 Sea R una relacioacuten binaria homogeacutenea en el conjunto A Diremos que Res transitiva cuando forall(x y) (y z) isin R se tiene que xRy e yRz minusrarr xRz
La funcioacuten (esTransitiva r) se verifica si la relacioacuten r es transitiva
42 Capiacutetulo 2 Relaciones y funciones
-- | Ejemplos
-- gtgtgt esTransitiva [(12)(13)(23)]
-- True
-- gtgtgt esTransitiva [(12)(23)]
-- False
esTransitiva Ord a =gt [(aa)] -gt Bool
esTransitiva r =
listaAConjunto [(xz) | (xy) lt- r (wz) lt- r y == w]
`esSubconjunto` r
Nota 225 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xSylarrrarr xminus y es parbull xTylarrrarr x divide a ybull xRylarrrarr x lt yson relaciones binarias homogeacuteneas transitivas
225 Relaciones de equivalencia
Definicioacuten 226 Las relaciones homogeacuteneas que son a la vez reflexivas simeacutetricas y tran-sitivas se denominan relaciones de equivalencia
La funcioacuten (esRelacionEquivalencia xs r) se verifica si r es una relacioacuten de equi-valencia en xs-- | Ejemplos
-- gtgtgt esRelacionEquivalencia [13] [(11)(12)(21)(22)(33)]
-- True
-- gtgtgt esRelacionEquivalencia [13] [(12)(21)(22)(33)]
-- False
-- gtgtgt esRelacionEquivalencia [13] [(11)(12)(22)(33)]
-- False
esRelacionEquivalencia Ord a =gt [a] -gt [(aa)] -gt Bool
esRelacionEquivalencia xs r =
esReflexiva xs r ampamp
esSimetrica r ampamp
esTransitiva r
Nota 226 En el conjunto N la relacioacuten caracterizada por xSy larrrarr xminus y es par esuna relacioacuten de equivalencia
226 Relaciones de orden
Definicioacuten 227 Las relaciones homogeacuteneas que son a la vez reflexivas antisimeacutetricas ytransitivas se denominan relaciones de orden
23 Funciones 43
La funcioacuten (esRelacionOrden xs r) se verifica si r es una relacioacuten de orden en xs
-- | Ejemplo
-- gtgtgt esRelacionOrden [13] [(11)(12)(13)(22)(23)(33)]
-- True
esRelacionOrden Ord a =gt [a] -gt [(aa)] -gt Bool
esRelacionOrden xs r =
esReflexiva xs r ampamp
esAntisimetrica r ampamp
esTransitiva r
Nota 227 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xTylarrrarr x divide a yson relaciones de orden
227 Clases de equivalencia
Definicioacuten 228 Si R es una relacioacuten de equivalencia en A denominamos clase de equi-valencia de un elemento x isin A al conjunto de todos los elementos de A relacionados con xes decir x = R(x) = y isin A|xRy donde la primera notacioacuten se usa si la relacioacuten con laque se estaacute tratando se sobreentiende y la segunda si no es asiacute
La funcioacuten (clasesEquivalencia xs r) devuelve las clases de la relacioacuten de equi-valencia r en xs
-- | Ejemplo
-- gtgtgt let r = [(xy) | x lt- [15] y lt- [15] even (x-y)]
-- gtgtgt clasesEquivalencia [15] r
-- [[135][24]]
clasesEquivalencia Ord a =gt [a] -gt [(aa)] -gt [[a]]
clasesEquivalencia _ [] = []
clasesEquivalencia [] _ = []
clasesEquivalencia (xxs) r = (xc) clasesEquivalencia (xs c) r
where c = filter (estaRelacionado r x) xs
23 Funciones
Definicioacuten 231 Dada una relacioacuten F entre A y B se diraacute que es una funcioacuten si es unarelacioacuten binaria es funcional y todos los elementos de A estaacuten en el dominio
La funcioacuten (esFuncion xs ys f) se verifica si f es una funcioacuten de xs en ys
-- | Ejemplos
-- gtgtgt esFuncion [13] [247] [(17)(32)]
44 Capiacutetulo 2 Relaciones y funciones
-- True
-- gtgtgt esFuncion [13] [247] [(17)]
-- False
-- gtgtgt esFuncion [13] [247] [(14)(17)(32)]
-- False
esFuncion (Ord a Ord b) =gt [a] -gt [b] -gt [(ab)] -gt Bool
esFuncion xs ys f =
esRelacion xs ys f ampamp
xs `esSubconjunto` dominio f ampamp
esFuncional f
Nota 231 A lo largo de la seccioacuten representaremos a las funciones como listas depares
type Funcion a b = [(ab)]
La funcioacuten (funciones xs ys) devuelve todas las posibles funciones del conjuntoxs en ys
-- | Ejemplos
-- gtgtgt pp $ funciones [12] [34]
-- [[(1 3)(2 3)][(1 3)(2 4)][(1 4)(2 3)]
-- [(1 4)(2 4)]]
-- gtgtgt pp $ funciones [12] [345]
-- [[(1 3)(2 3)][(1 3)(2 4)][(1 3)(2 5)]
-- [(1 4)(2 3)][(1 4)(2 4)][(1 4)(2 5)]
-- [(1 5)(2 3)][(1 5)(2 4)][(1 5)(2 5)]]
-- gtgtgt pp $ funciones [012] [34]
-- [[(0 3)(1 3)(2 3)][(0 3)(1 3)(2 4)]
-- [(0 3)(1 4)(2 3)][(0 3)(1 4)(2 4)]
-- [(0 4)(1 3)(2 3)][(0 4)(1 3)(2 4)]
-- [(0 4)(1 4)(2 3)][(0 4)(1 4)(2 4)]]
funciones [a] -gt [b] -gt [Funcion a b]
funciones xs ys =
[zip xs zs | zs lt- variacionesR (length xs) ys]
231 Imagen por una funcioacuten
Definicioacuten 232 Si f es una funcioacuten entre A y B y x es un elemento del conjunto A laimagen del elemento x por la funcioacuten f es el valor asociado a x por la funcioacuten f
La funcioacuten (imagen f x) es la imagen del elemento x en la funcioacuten f
-- | Ejemplos
-- gtgtgt imagen [(17)(32)] 1
-- 7
-- gtgtgt imagen [(17)(32)] 3
23 Funciones 45
-- 2
imagen (Ord a Ord b) =gt Funcion a b -gt a -gt b
imagen f x = head (imagenRelacion f x)
La funcioacuten (imagenConjunto f xs) es la imagen del conjunto xs en la funcioacuten f
-- | Ejemplos
-- gtgtgt imagenConjunto [(17)(32)(43)] [14]
-- [73]
-- gtgtgt imagenConjunto [(17)(32)] [31]
-- [27]
imagenConjunto (Ord a Ord b) =gt Funcion a b -gt [a] -gt [b]
imagenConjunto f xs = nub (map (imagen f) xs)
232 Funciones inyectivas
Definicioacuten 233 Diremos que una funcioacuten f entre dos conjuntos es inyectiva 2 si a ele-mentos distintos del dominio le corresponden elementos distintos de la imagen es decir siforalla b isin dominio( f ) tales que a 6= b f (a) 6= f (b)
La funcioacuten (esInyectiva fs) se verifica si la funcioacuten fs es inyectiva
-- | Ejemplos
-- gtgtgt esInyectiva [(14)(25)(36)]
-- True
-- gtgtgt esInyectiva [(14)(25)(34)]
-- False
-- gtgtgt esInyectiva [(14)(25)(36)(36)]
-- True
esInyectiva (Ord a Ord b) =gt Funcion a b -gt Bool
esInyectiva f =
all esUnitario [antiImagenRelacion f y | y lt- rango f]
233 Funciones sobreyectivas
Definicioacuten 234 Diremos que una funcioacuten f entre dos conjuntos A y B es sobreyectiva3 si todos los elementos de B son imagen de alguacuten elemento de A
La funcioacuten (esSobreyectiva xs ys f) se verifica si la funcioacuten f es sobreyectiva Ala hora de definirla estamos contando con que f es una funcioacuten entre xs y ys
-- | Ejemplos
-- gtgtgt esSobreyectiva [123] [456] [(14)(25)(36)]
2httpsenwikipediaorgwikiInjective_function3httpsenwikipediaorgwikiSurjective_function
46 Capiacutetulo 2 Relaciones y funciones
-- True
-- gtgtgt esSobreyectiva [123] [456] [(14)(25)(34)]
-- False
-- gtgtgt esSobreyectiva [123] [456] [(14)(24)(36)(36)]
-- False
esSobreyectiva (Ord aOrd b) =gt [a] -gt [b] -gt Funcion a b -gt Bool
esSobreyectiva _ ys f = ys `esSubconjunto` rango f
234 Funciones biyectivas
Definicioacuten 235 Diremos que una funcioacuten f entre dos conjuntos A y B es biyectiva 4 sicada elementos de B es imagen de un uacutenico elemento de A
La funcioacuten (esBiyectiva xs ys f) se verifica si la funcioacuten f es biyectiva
-- | Ejemplos
-- gtgtgt esBiyectiva [123] [456] [(14)(25)(36)(36)]
-- True
-- gtgtgt esBiyectiva [123] [456] [(14)(25)(34)]
-- False
-- gtgtgt esBiyectiva [123] [4567] [(14)(25)(36)]
-- False
esBiyectiva (Ord a Ord b) =gt [a] -gt [b] -gt Funcion a b -gt Bool
esBiyectiva xs ys f =
esInyectiva f ampamp esSobreyectiva xs ys f
La funciones biyecciones1 xs ys y biyecciones2 xs ys devuelven la lista de to-das las biyecciones entre los conjuntos xs y ys La primera lo hace filtrando las fun-ciones entre los conjuntos que son biyectivas y la segunda lo hace construyendouacutenicamente las funciones biyectivas entre los conjuntos con el consecuente ahorrocomputacional
ghcigt length (biyecciones1 [17] [ag])
5040
(1675 secs 4146744104 bytes)
ghcigt length (biyecciones2 [17] [ag])
5040
(002 secs 0 bytes)
ghcigt length (biyecciones1 [16] [ag])
0
(253 secs 592625824 bytes)
ghcigt length (biyecciones2 [16] [ag])
0
(001 secs 0 bytes)
4httpsenwikipediaorgwikiBijective_function
23 Funciones 47
biyecciones1 (Ord a Ord b) =gt [a] -gt [b] -gt [Funcion a b]
biyecciones1 xs ys =
filter (esBiyectiva xs ys) (funciones xs ys)
biyecciones2 (Ord a Ord b) =gt [a] -gt [b] -gt [Funcion a b]
biyecciones2 xs ys
| length xs = length ys = []
| otherwise = [zip xs zs | zs lt- permutations ys]
Nota 232 En lo que sigue trabajaremos con la funcioacuten biyecciones2 asiacute que laredefiniremos como biyecciones
biyecciones (Ord a Ord b) =gt [a] -gt [b] -gt [Funcion a b]
biyecciones = biyecciones2
235 Inversa de una funcioacuten
Definicioacuten 236 Si f es una funcioacuten biyectiva entre los conjuntos A y B definimos lafuncioacuten inversa 5 como la funcioacuten que a cada elemento de B le hace corresponder el elementode A del que es imagen en B
El valor de (inversa f) es la funcioacuten inversa de f
-- | Ejemplos
-- gtgtgt inversa [(14)(25)(36)]
-- [(41)(52)(63)]
-- gtgtgt sort (inversa [(1f)(2m)(3a)])
-- [(a3)(f1)(m2)]
inversa (Ord a Ord b) =gt Funcion a b -gt Funcion b a
inversa f = listaAConjunto [(yx) | (xy) lt- f]
Nota 233 Para considerar la inversa de una funcioacuten esta tiene que ser biyectivaLuego (inversa f) asigna a cada elemento del conjunto imagen (que en este casocoincide con la imagen) uno y solo uno del conjunto de salida
La funcioacuten (imagenInversa f y) devuelve el elemento del conjunto de salida de lafuncioacuten f tal que su imagen es y
-- | Ejemplos
-- gtgtgt imagenInversa [(14)(25)(36)] 5
-- 2
-- gtgtgt imagenInversa [(1f)(2m)(3a)] a
-- 3
imagenInversa (Ord a Ord b) =gt Funcion a b -gt b -gt a
imagenInversa f = imagen (inversa f)
5httpsenwikipediaorgwikiInverse_function
48 Capiacutetulo 2 Relaciones y funciones
Capiacutetulo 3
Introduccioacuten a la teoriacutea de grafos
Se dice que la Teoriacutea de Grafos tiene su origen en 1736 cuando Euler dio una so-lucioacuten al problema (hasta entonces no resuelto) de los siete puentes de Koumlnigsbergiquestexiste un camino que atraviese cada uno de los puentes exactamente una vezPara probar que no era posible Euler sustituyoacute cada regioacuten por un nodo y cadapuente por una arista creando el primer grafo que fuera modelo de un problemamatemaacutetico
Figura 31 Dibujo de los puentes de Koumlnigsberg
A
B
C
D
b
c
a
d
f
e
g
Figura 32 Modelo de los puentes de Koumlnigsberg
Desde entonces se ha ido desarrollando esta metodologiacutea hasta convertise en los uacutel-timos antildeos en una herramienta importante en aacutereas del conocimiento muy variadascomo por ejemplo la Investigacioacuten Operativa la Computacioacuten la Ingenieriacutea Eleacutec-trica la Geografiacutea y la Quiacutemica Es por ello que ademaacutes se ha erigido como unanueva disciplina matemaacutetica que generalmente asociada a las ramas de Topologiacuteay AacutelgebraLa utilidad de los grafos se basa en su gran poder de abstraccioacuten y una representa-cioacuten muy clara de cualquier relacioacuten lo que facilita enormemente tanto la fase demodelado como la de resolucioacuten de cualquier problema Gracias a la Teoriacutea de Gra-fos se han desarrollado una gran variedad de algoritmos y meacutetodos de decisioacuten quepodemos implementar a traveacutes de lenguajes funcionales y permiten automatizar laresolucioacuten de muchos problemas a menudo tediosos de resolver a mano
49
50 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
31 Definicioacuten de grafo
En primer lugar vamos a introducir terminologiacutea baacutesica en el desarrollo de la Teoriacuteade Grafos
Definicioacuten 311 Un grafo G es un par (V A) donde V es el conjunto cuyos elementosllamamos veacutertices (o nodos) y A es un conjunto cuyos elementos llamamos aristas
Definicioacuten 312 Una arista de un grafo G = (V A) es un conjunto de dos elementosde V Es decir para dos veacutertices v vprime de G (v vprime) y (vprime v) representa la misma arista
Definicioacuten 313 Dado un grafo G = (V A) diremos que un veacutertice v isin V es adyacentea vprime isin V si (vprime v) isin A
Definicioacuten 314 Si en un grafo dirigido se permiten aristas repetidas lo llamaremos mul-tigrafo Si no se permiten lo llamaremos grafo regular
Nota 311 Denotaremos por |V| al nuacutemero de veacutertices y por |A| al nuacutemero de aristasdel grafo (V A)
Ejemplo 312 Sea G = (V A) un grafo con V = a b c d y A = (a b) (a c) (b d)(d d) En este grafo los veacutertices a d son adyacentes a b
a
b
c
d
32 El TAD de los grafos
En esta seccioacuten nos planteamos la tarea de implementar las definiciones presenta-das anteriormente en un lenguaje funcional En nuestro caso el lenguaje que utili-zaremos seraacute Haskell Definiremos el Tipo Abstracto de Dato (TAD) de los grafos ydaremos algunos ejemplos de posibles representaciones de grafos con las que po-dremos trabajarSi consideramos un grafo finito cualquiera G = (V A) podemos ordenar el conjun-to de los veacutertices y representarlo como V = v1 vn con n = |V|En primer lugar necesitaremos crear un tipo (Grafo) cuya definicioacuten sea compatiblecon la entidad matemaacutetica que representa y que nos permita definir las operacionesque necesitamos para trabajar con los grafos Estas operaciones son
32 El TAD de los grafos 51
creaGrafo -- [a] -gt [(aa)] -gt Grafo a
vertices -- Grafo a -gt [a]
adyacentes -- Grafo a -gt a -gt [a]
aristaEn -- (aa) -gt Grafo a -gt Bool
aristas -- Grafo a -gt [(aa)]
dondebull (creaGrafo vs as) es un grafo tal que el conjunto de sus veacutertices es vs y el de
sus aristas es asbull (vertices g) es la lista de todos los veacutertices del grafo gbull (adyacentes g v) es la lista de los veacutertices adyacentes al veacutertice v en el grafo gbull (aristaEn a g) se verifica si a es una arista del grafo gbull (aristas g) es la lista de las aristas del grafo g
Nota 321 Las funciones que aparecen en la especificacioacuten del TAD no dependende la representacioacuten que elijamos
Ejemplo 322 Veamos un ejemplo de creacioacuten de grafo y su representacioacuten graacutefica
creaGrafo [15] [(12)(13)(15)(24)
(25)(34)(35)(45)]
1
2
34
5
321 Grafos como listas de aristas
En el moacutedulo GrafoConListaDeAristas se definen las funciones del TAD de losgrafos dando su representacioacuten como conjuntos de aristas es decir representandoa un grafo como dos conjuntos la primera seraacute la lista ordenada de los veacutertices y lasegunda la lista ordenada de las aristas (en ambas listas se excluye la posibilidad derepeticiones)
Nota 323 Las ventajas de usar arrays frente a usar listas es que los array tienenacceso constante (O(1)) a sus elementos mientras que las listas tienen acceso lineal(O(n)) y que la actualizacioacuten de un elemento en un array no supone espacio extraSin embargo los arrays son representaciones muy riacutegidas cualquier modificacioacutenen su estructura como cambiar su tamantildeo supone un gran coste computacionalpues se tendriacutea que crear de nuevo el array y ademaacutes sus iacutendices deben pertenecer
52 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
a la clase de los objetos indexables (Ix) luego perdemos mucha flexibilidad en larepresentacioacuten
- LANGUAGE DeriveGeneric -
module GrafoConListaDeAristas
( Grafo
creaGrafo -- [a] -gt [(aa)] -gt Grafo a
vertices -- Grafo a -gt [a]
adyacentes -- Grafo a -gt a -gt [a]
aristaEn -- (aa) -gt Grafo a -gt Bool
aristas -- Grafo a -gt [(aa)]
) where
En las definiciones del presente moacutedulo se usaraacuten las funciones nub y sort de lalibreriacutea DataList
Vamos a definir un nuevo tipo de dato (Grafo a) que representaraacute un grafo a partirde la lista de sus veacutertices (donde los veacutertices son de tipo a) y de aristas (que son paresde veacutertices)
data Grafo a = G [a] [(aa)]
deriving (Eq Show Generic)
instance (Out a) =gt Out (Grafo a)
Las funciones baacutesicas que definiremos a partir de este tipo coincidiraacuten con las indi-cadas en el TAD de los grafosbull (creaGrafo vs as) es el grafo cuyo conjunto de veacutertices es cs y el de sus aristas
es as-- | Ejemplo
-- gtgtgt creaGrafo [15] [(12)(14)(15)(23)(25)(34)(35)]
-- G [12345] [(12)(14)(15)(23)(25)(34)(35)]
creaGrafo Ord a =gt [a] -gt [(aa)] -gt Grafo a
creaGrafo vs as =
G (sort vs) (nub (sort [parOrdenado a | a lt- as]))
parOrdenado Ord a =gt (aa) -gt (aa)
parOrdenado (xy) | x lt= y = (xy)
| otherwise = (yx)
Ejemplo 324 ejGrafo es el grafo
32 El TAD de los grafos 53
1
2
3
4
5
Los ejemplos usaraacuten el siguiente grafo
ejGrafo Grafo Int
ejGrafo = creaGrafo [15]
[(12)(14)(15)(23)(25)(34)(35)(45)]
bull (vertices g) es la lista de los veacutertices del grafo g
-- | Ejemplo
-- gtgtgt vertices ejGrafo
-- [12345]
vertices Grafo a -gt [a]
vertices (G vs _) = vs
bull (adyacentes g v) es la lista de los veacutertices adyacentes al veacutertice v en el grafo g
-- | Ejemplos
-- gtgtgt adyacentes ejGrafo 4
-- [135]
-- gtgtgt adyacentes ejGrafo 3
-- [245]
adyacentes Eq a =gt Grafo a -gt a -gt [a]
adyacentes (G _ as) v =
[u | (ux) lt- as x == v] `union` [u | (xu) lt- as x == v]
bull (aristaEn a g) se verifica si a es una arista del grafo g
-- | Ejemplos
-- gtgtgt (51) `aristaEn` ejGrafo
-- True
-- gtgtgt (31) `aristaEn` ejGrafo
-- False
aristaEn Ord a =gt (aa) -gt Grafo a -gt Bool
aristaEn a (G _ as) = parOrdenado a `elem` as
bull (aristas g) es la lista de las aristas del grafo g
-- | Ejemplo
-- gtgtgt aristas ejGrafo
-- [(12)(14)(15)(23)(25)(34)(35)(45)]
aristas Grafo a -gt [(aa)]
aristas (G _ as) = as
54 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
33 Generador de grafos
En esta seccioacuten presentaremos el generador de grafos que nos permitiraacute generargrafos como listas de aristas arbitrariamente y usarlos como ejemplos o para com-probar propiedadesPara aprender a controlar el tamantildeo de los grafos generados he consultado las si-guientes fuentes QuickCheck A Lightweight Tool for Random Testing of Haskell Programs 1
([3]) Property Testing using QuickCheck 2 ([9])(generaGrafos n) es un generador de grafos de hasta n veacutertices Por ejemplo
ghcigt sample (generaGrafo 5)
G [12] []
G [1] [(11)]
G [] []
G [1234] [(22)]
G [123] [(11)(12)(13)(22)]
G [12345] [(12)(14)(15)(22)(23)(24)(33)(34)(44)(45)]
G [1] []
G [123] [(12)(22)(33)]
G [1234] [(11)(14)(23)(24)(33)(34)(44)]
G [12] []
G [123] [(11)(12)(22)(33)]
ghcigt sample (generaGrafo 2)
G [12] [(12)(22)]
G [12] [(11)]
G [12] [(11)(12)]
G [] []
G [1] [(11)]
G [1] []
G [1] []
G [] []
G [] []
G [] []
G [1] [(11)]
generaGrafo Int -gt Gen (Grafo Int)
generaGrafo s = do
let m = s `mod` 11
n lt- choose (0m)
as lt- sublistOf [(xy) | x lt- [1n] y lt- [xn]]
return (creaGrafo [1n] as)
1httpswwweecsnorthwesternedu~robbycourses395-495-2009-fallquickpdf2httpswwwdccfcuppt~pbvaulastapfslidesquickcheckhtml
34 Ejemplos de grafos 55
Nota 331 Los grafos estaacuten contenidos en la clase de los objetos generables aleato-riamente
instance Arbitrary (Grafo Int) where
arbitrary = sized generaGrafo
En el siguiente ejemplo se pueden observar algunos grafos generados
ghcigt sample (arbitrary Gen (Grafo Int))
G [] []
G [1] [(11)]
G [12] [(11)(12)]
G [1] [(11)]
G [12345678] [(14)(17)(22)(23)(25)(28)(35)
(36)(38)(44)(46)(47)(48)(56)(66)(67)(78)]
G [12345] [(11)(12)(14)(15)(24)(25)(34)(55)]
G [] []
G [] []
G [123] [(11)(22)(23)]
G [1234] [(11)(12)(14)(22)(33)]
G [1234567] [(11)(15)(16)(17)(22)(24)(25)
(26)(27)(33)(35)(46)(47)(55)(57)(66)(77)]
34 Ejemplos de grafos
El objetivo de esta seccioacuten es reunir una coleccioacuten de grafos lo suficientemente ex-tensa y variada como para poder utilizarla como recurso a la hora de comprobar laspropiedades y definiciones de funciones que implementaremos maacutes adelanteEn el proceso de recopilacioacuten de ejemplos se ha trabajado con diversas fuentesbull los apuntes de la asignatura ldquoMatemaacutetica discretardquo ([4])bull los temas de la asignatura ldquoInformaacuteticardquo ([1]) ybull el artiacuteculo ldquoGraph theoryrdquo ([11]) de la Wikipedia
Nota 341 Se utilizaraacute la representacioacuten de los grafos como listas de aristas
341 Grafo nulo
Definicioacuten 341 Un grafo nulo es un grafo que no tiene ni veacutertices ni aristas
La funcioacuten (grafoNulo) devuelve un grafo nulo
grafoNulo Ord a =gt Grafo a
grafoNulo = creaGrafo [] []
La funcioacuten (esGrafoNulo g) se verifica si g es un grafo nulo
56 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- | Ejemplos
-- gtgtgt esGrafoNulo grafoNulo
-- True
-- gtgtgt esGrafoNulo (creaGrafo [] [(12)])
-- False
-- gtgtgt esGrafoNulo (creaGrafo [12] [(12)])
-- False
esGrafoNulo Grafo a -gt Bool
esGrafoNulo g =
null (vertices g) ampamp null (aristas g)
342 Grafo ciclo
Definicioacuten 342 Un ciclo 3 de orden n C(n) es un grafo no dirigido y no ponderadocuyo conjunto de veacutertices viene dado por V = 1 n y el de las aristas por A = (0 1)(1 2) (nminus 2 nminus 1) (nminus 1 0)
La funcioacuten (grafoCiclo n) nos genera el ciclo de orden n
1
23
45
-- | Ejemplos
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
grafoCiclo Int -gt Grafo Int
grafoCiclo 0 = grafoNulo
grafoCiclo 1 = creaGrafo [1] []
grafoCiclo n = creaGrafo [1n]
([(uu+1) | u lt- [1n-1]] ++ [(n1)])
343 Grafo de la amistad
Definicioacuten 343 Un grafo de la amistad 4 de orden n es un grafo con 2n + 1 veacuterticesy 3n aristas formado uniendo n copias del ciclo C3 por un veacutertice comuacuten Lo denotamos porFn3httpseswikipediaorgwikiGrafo_completo4httpseswikipediaorgwikiGrafo_de_la_amistad
34 Ejemplos de grafos 57
La funcioacuten (grafoAmistad n) genera el grafo de la amistad de orden n Por ejemplo
1
2
34
5
1
2
3
4
5
6
7
-- | Ejemplos
-- gtgtgt pp $ grafoAmistad 2
-- G [12345]
-- [(1 2)(1 3)(1 4)(1 5)(2 3)(4 5)]
-- gtgtgt pp $ grafoAmistad 3
-- G [1234567]
-- [(1 2)(1 3)(1 4)(1 5)(1 6)(1 7)(2 3)
-- (4 5)(6 7)]
grafoAmistad Int -gt Grafo Int
grafoAmistad n =
creaGrafo [12n+1]
([(1a) | a lt- [22n+1]] ++
[(ab) | (ab) lt-zip [242n] [352n+1]])
344 Grafo completo
Definicioacuten 344 El grafo completo 5 de orden n K(n) es un grafo no dirigido cuyoconjunto de veacutertices viene dado por V = 1 n y tiene una arista entre cada par deveacutertices distintos
La funcioacuten (completo n) nos genera el grafo completo de orden n Por ejemplo
5httpseswikipediaorgwikiGrafo_completo
58 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
1
2
3
4
-- | Ejemplo
-- gtgtgt completo 4
-- G [1234] [(12)(13)(14)(23)(24)(34)]
completo Int -gt Grafo Int
completo n =
creaGrafo [1n]
[(ab) | a lt- [1n] b lt- [1a-1]]
345 Grafo bipartito
Definicioacuten 345 Un grafo bipartito 6 es un grafo G = (V A) verificando que elconjunto de sus veacutertices se puede dividir en dos subconjuntos disjuntos V1 V2 tales queV1 cupV2 = V de manera que forallu1 u2 isin V1[(u1 u2) 6isin A] y forallv1 v2 isin V2[(v1 v2) 6isin A]Un grafo bipartito completo 7 seraacute entonces un grafo bipartito G = (V1 cup V2 A) en elque todos los veacutertices de una particioacuten estaacuten conectados a los de la otra Si n = |V1| m =
|V2| denotamos al grafo bipartito G = (V1 cupV2 A) por Knm
La funcioacuten (bipartitoCompleto n m) nos genera el grafo bipartito Knm Por ejem-plo
1 2
3 4 5
-- | Ejemplo
-- gtgtgt bipartitoCompleto 2 3
-- G [12345] [(13)(14)(15)(23)(24)(25)]
bipartitoCompleto Int -gt Int -gt Grafo Int
bipartitoCompleto n m =
creaGrafo [1n+m]
[(ab) | a lt- [1n] b lt- [n+1n+m]]
6httpseswikipediaorgwikiGrafo_bipartito7httpseswikipediaorgwikiGrafo_bipartito_completo
34 Ejemplos de grafos 59
La funcioacuten (conjuntosVerticesDisjuntos g) devuelve Nothing si el grafo g no esbipartito y Just(xsys) si lo es donde xs ys es una particioacuten disjunta de los veacuterticesde g
-- | Ejemplo
-- gtgtgt conjuntosVerticesDisjuntos (bipartitoCompleto 3 4)
-- Just ([321][7654])
-- gtgtgt conjuntosVerticesDisjuntos (grafoCiclo 5)
-- Nothing
-- gtgtgt conjuntosVerticesDisjuntos (grafoCiclo 6)
-- Just ([531][642])
conjuntosVerticesDisjuntos Ord a =gt Grafo a -gt Maybe ([a][a])
conjuntosVerticesDisjuntos g
| null (vertices g) = Just ([][])
| otherwise = aux (vertices g) [] [] [] []
where u = union
a = adyacentes g
d xs x = xs [x]
aux [] _ _ r b = if (null (intersect r b))
then (Just (rb))
else Nothing
aux (vvs) [] [] [] [] = aux vs (a v) [v] [v] []
aux (vvs) [] c r b
| null (a v) = aux vs [] (vc) (vr) b
| null ((a v) c) =
if (or [elem u r | u lt- (a v)])
then (if (or [elem u b | u lt- (a v)])
then Nothing
else (aux vs [] (vc) r (vb)))
else (aux vs [] (vc) (vr) b)
| otherwise =
if (or [elem u r | u lt- (a v)])
then (if (or [elem u b | u lt- (a v)])
then Nothing
else (aux vs ((a v) c) (vc) r (vb)))
else (aux vs ((a v) c) (vc) (vr) b)
aux vs (qqs) c r b
| null ((a q) c) =
if (or [elem u r | u lt- (a q)])
then (if (or [elem u b | u lt- (a q)])
then Nothing
else (aux (d vs q) qs (qc) r (qb)))
else (aux (d vs q) qs (qc) (qr) b)
| otherwise =
if (or [elem u r | u lt- (a q)])
then (if (or [elem u b | u lt- (a q)])
then Nothing
else (aux (d vs q) (u ((a q) c) qs)
60 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
(qc) r (qb)))
else (aux (d vs q) (u ((a q) c) qs)
(qc) (qr) b)
La funcioacuten (esBipartito g) se verifica si el grafo g es bipartito
-- | Ejemplo
-- gtgtgt esBipartito (bipartitoCompleto 3 4)
-- True
-- gtgtgt esBipartito (grafoCiclo 5)
-- False
-- gtgtgt esBipartito (grafoCiclo 6)
-- True
esBipartito Ord a =gt Grafo a -gt Bool
esBipartito g = isJust (conjuntosVerticesDisjuntos g)
346 Grafo estrella
Definicioacuten 346 Una estrella 8 de orden n es el grafo bipartito completo K1n Denota-remos a una estrella de orden n por Sn Una estrella con 3 aristas se conoce en ingleacutes comoclaw (garra o garfio)
La funcioacuten (grafoEstrella n) crea un grafo circulante a partir de su orden n
2
34
56
1
-- | Ejemplo
-- gtgtgt grafoEstrella 5
-- G [123456] [(12)(13)(14)(15)(16)]
grafoEstrella Int -gt Grafo Int
grafoEstrella = bipartitoCompleto 1
347 Grafo rueda
Definicioacuten 347 Un grafo rueda 9 de orden n es un grafo no dirigido y no ponderado conn veacutertices que se forma conectando un uacutenico veacutertice a todos los veacutertices de un ciclo Cnminus1 Lodenotaremos por Wn8httpsenwikipediaorgwikiStar_(graph_theory))9httpseswikipediaorgwikiGrafo_rueda
34 Ejemplos de grafos 61
La funcioacuten (grafoRueda n) crea un grafo rueda a partir de su orden n
2
34
56
1
-- | Ejemplo
-- gtgtgt pp $ grafoRueda 6
-- G [123456]
-- [(1 2)(1 3)(1 4)(1 5)(1 6)(2 3)(2 6)
-- (3 4)(4 5)(5 6)]
grafoRueda Int -gt Grafo Int
grafoRueda n =
creaGrafo [1n]
([(1a) | a lt- [2n]] ++
[(ab) | (ab) lt- zip (2[2n-1]) (3n[4n])])
348 Grafo circulante
Definicioacuten 348 Un grafo circulante 10 de orden n ge 3 y saltos s1 sk es un grafono dirigido y no ponderado G = (1 n A) en el que cada nodo foralli isin V es adyacente alos 2k nodos iplusmn s1 iplusmn sk mod n Lo denotaremos por Cirs1sk
n
La funcioacuten (grafoCirculante n ss) crea un grafo circulante a partir de su orden n
y de la lista de sus saltos ss Por ejemplo
2
34
5
6 1
-- | Ejemplo
-- gtgtgt pp $ grafoCirculante 6 [12]
-- G [123456]
-- [(1 2)(1 3)(1 5)(1 6)(2 3)(2 4)(2 6)
-- (3 4)(3 5)(4 5)(4 6)(5 6)]
grafoCirculante Int -gt [Int] -gt Grafo Int
grafoCirculante n ss =
10httpsenwikipediaorgwikiCirculant_graph
62 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
creaGrafo [1n]
[(ab) | a lt- [1n]
b lt- sort (auxCir a ss n)
a lt b]
where auxCir v ss1 k =
concat [[fun (v+s) k fun (v-s) k] | s lt- ss1]
fun a b = if mod a b == 0 then b else mod a b
349 Grafo de Petersen generalizado
El grafo de Petersen generalizado 11 que denotaremos GPnk (con n ge 3 y 1 le k le(nminus 1)2) es un grafo formado por un grafo circulante Cirn
k en el interior rodeadopor un ciclo Cn al que estaacute conectado por una arista saliendo de cada veacutertice deforma que se creen n poliacutegonos regulares El grafo GPnk tiene 2n veacutertices y 3n aristasLa funcioacuten (grafoPetersenGen n k) devuelve el grafo de Petersen generalizadoGPnk
1
2
3
4
5
6
7
8
-- | Ejemplo
-- gtgtgt pp $ grafoPetersenGen 4 2
-- G [12345678]
-- [(1 3)(1 5)(2 4)(2 6)(3 7)(4 8)(5 6)
-- (5 8)(6 7)(7 8)]
grafoPetersenGen Int -gt Int -gt Grafo Int
grafoPetersenGen n k =
creaGrafo [12n]
(filter p (aristas (grafoCirculante n [k])) ++
[(xx+n) | x lt- [1n]] ++
(n+1n+2) (n+12n) [(xx+1) | x lt- [n+22n-1]])
where p (ab) = a lt b
11httpsenwikipediaorgwikiGeneralized_Petersen_graph
34 Ejemplos de grafos 63
3410 Otros grafos importantes
Grafo de Thomson
Definicioacuten 349 El grafo bipartito completo K33 es conocido como el grafo de Thomsony como veremos maacutes adelante seraacute clave a la hora de analizar propiedades topoloacutegicas de losgrafos
1 2 3
4 5 6
La funcioacuten (grafoThomson) genera el grafo de Thomson
-- | Ejemplo
-- gtgtgt pp $ grafoThomson
-- G [123456]
-- [(1 4)(1 5)(1 6)(2 4)(2 5)(2 6)(3 4)
-- (3 5)(3 6)]
grafoThomson Grafo Int
grafoThomson = bipartitoCompleto 3 3
Grafo de Heawood
El grafo de Heawood 12 es un grafo no dirigido regular con 14 veacutertices y 21 aris-tas Todos sus veacutertices son incidentes a exactamente 3 aristas es decir es un grafocuacutebico Tiene importantes propiedades geomeacutetricas y topoloacutegicas
1
2
3
45
6
7
8
9
10
11 12
13
14
12httpsenwikipediaorgwikiHeawood_graph
64 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten grafoHeawood genera el grafo de Heawood
-- | Ejemplo
-- gtgtgt pp $ grafoHeawood
-- G [1234567891011121314]
-- [(1 2)(1 6)(1 14)(2 3)(2 11)(3 4)(3 8)
-- (4 5)(4 13)(5 6)(5 10)(6 7)(7 8)(7 12)
-- (8 9)(9 10)(9 14)(10 11)(11 12)(12 13)
-- (13 14)]
grafoHeawood Grafo Int
grafoHeawood =
creaGrafo [114]
(aristas (grafoCiclo 14) ++
zip [1 23 4 5 7 9]
[611813101214])
Grafo de McGee
El grafo de McGee 13 es un grafo no dirigido cuacutebico con 24 veacutertices y 36 aristasTiene importantes propiedades geomeacutetricas y topoloacutegicas
1
2
3
45
6789
10
11
12
13
14
15
1617
18 19 2021
22
23
24
La funcioacuten grafoMcGee genera el grafo de McGee
-- | Ejemplo
-- gtgtgt pp $ grafoMcGee
-- G [12345678910111213141516171819
-- 2021222324]
-- [(1 2)(1 13)(1 24)(2 3)(2 9)(3 4)(3 20)
13httpsenwikipediaorgwikiMcGee_graph
34 Ejemplos de grafos 65
-- (4 5)(4 16)(5 6)(5 12)(6 7)(6 23)(7 8)
-- (7 19)(8 9)(8 15)(9 10)(10 11)(10 22)
-- (11 12)(11 18)(12 13)(13 14)(14 15)
-- (14 21)(15 16)(16 17)(17 18)(17 24)
-- (18 19)(19 20)(20 21)(21 22)(22 23)
-- (23 24)]
grafoMcGee Grafo Int
grafoMcGee =
creaGrafo [124]
(aristas (grafoCiclo 24) ++
zip [ 12 3 4 5 6 7 810111417]
[13920161223191522182124])
Grafo TuttendashCoxeter
El grafo TuttendashCoxeter 14 es un grafo no dirigido cuacutebico con 30 veacutertices y 45 aristasTiene importantes propiedades geomeacutetricas y topoloacutegicas
1
2
3
4
56
7891011
12
13
14
15
16
17
18
19
2021
22 23 24 2526
27
28
29
30
La funcioacuten grafoTutteCoxeter genera el grafo TuttendashCoxeter
-- | Ejemplo
-- gtgtgt pp $ grafoTutteCoxeter
-- G [12345678910111213141516171819
-- 2021222324252627282930]
14httpsenwikipediaorgwikiTutteT1textendashCoxeter_graph
66 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- [(1 2)(1 18)(1 30)(2 3)(2 23)(3 4)
-- (3 10)(4 5)(4 27)(5 6)(5 14)(6 7)(6 19)
-- (7 8)(7 24)(8 9)(8 29)(9 10)(9 16)
-- (10 11)(11 12)(11 20)(12 13)(12 25)
-- (13 14)(13 30)(14 15)(15 16)(15 22)
-- (16 17)(17 18)(17 26)(18 19)(19 20)
-- (20 21)(21 22)(21 28)(22 23)(23 24)
-- (24 25)(25 26)(26 27)(27 28)(28 29)
-- (29 30)]
grafoTutteCoxeter Grafo Int
grafoTutteCoxeter =
creaGrafo [130]
(aristas (grafoCiclo 30) ++
zip [ 1 2 3 4 5 6 7 8 9111213151721]
[182310271419242916202530222628])
Grafo de Petersen
El grafo de Petersen 15 se define como el grafo de Petersen generalizado GP52 esdecir es un grafo cuacutebico formado por los veacutertices de un pentaacutegono conectados alos veacutertices de una estrella de cinco puntas en la que cada nodo es adyacente a losnodos que estaacuten a un salto 2 de eacutel Es usado como ejemplo y como contraejemplo enmuchos problemas de la Teoriacutea de grafos
6
7
8 9
101
2
3 4
5
La funcioacuten grafoPetersen devuelve el grafo de Petersen
-- | Ejemplo
-- gtgtgt pp $ grafoPetersen
-- G [12345678910]
-- [(1 3)(1 4)(1 6)(2 4)(2 5)(2 7)(3 5)
-- (3 8)(4 9)(5 10)(6 7)(6 10)(7 8)(8 9)
-- (9 10)]
grafoPetersen Grafo Int
grafoPetersen = grafoPetersenGen 5 2
15httpsenwikipediaorgwikiPetersen_graph
35 Definiciones y propiedades 67
Grafo de MoeumlbiusndashCantor
El grafo de MoeumlbiusndashCantor 16 se define como el grafo de Petersen generalizadoGP83 es decir es un grafo cuacutebico formado por los veacutertices de un octoacutegono conecta-dos a los veacutertices de una estrella de ocho puntas en la que cada nodo es adyacente alos nodos que estaacuten a un salto 3 de eacutel Al igual que el grafo de Petersen tiene impor-tantes propiedades que lo hacen ser ejemplo y contraejemplo de muchos problemasde la Teoriacutea de Grafos
9
10
11
12
13
14
15
16
1
23
4
5
67
8
La funcioacuten grafoMoebiusCantor genera el grafo de MoeumlbiusndashCantor
-- | Ejemplo
-- gtgtgt pp $ grafoMoebiusCantor
-- G [12345678910111213141516]
-- [(1 4)(1 6)(1 9)(2 5)(2 7)(2 10)(3 6)
-- (3 8)(3 11)(4 7)(4 12)(5 8)(5 13)(6 14)
-- (7 15)(8 16)(9 10)(9 16)(10 11)(11 12)
-- (12 13)(13 14)(14 15)(15 16)]
grafoMoebiusCantor Grafo Int
grafoMoebiusCantor = grafoPetersenGen 8 3
35 Definiciones y propiedades
Una vez construida una pequentildea fuente de ejemplos estamos en condiciones deimplementar las definiciones sobre grafos en Haskell y ver que funcionan correc-tamente Ademaacutes comprobaremos que se cumplen las propiedades baacutesicas que sehan presentado en el tema Introduccioacuten a la teoriacutea de grafos de ldquoMatemaacutetica discretardquo([4])
16httpsenwikipediaorgwikiMoeumlbius-Kantor_graph
68 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Nota 351 Se utilizaraacute el tipo abstracto de grafos presentados en la seccioacuten 32 y seutilizaraacuten las librerias DataList y TestQuickCheck
351 Definiciones de grafos
Definicioacuten 351 El orden de un grafo G = (V A) se define como su nuacutemero de veacuterticesLo denotaremos por |V(G)|
La funcioacuten (orden g) devuelve el orden del grafo g
-- | Ejemplos
-- gtgtgt orden (grafoCiclo 4)
-- 4
-- gtgtgt orden (grafoEstrella 4)
-- 5
orden Grafo a -gt Int
orden = length vertices
Definicioacuten 352 El tamantildeo de un grafo G = (V A) se define como su nuacutemero de aristasLo denotaremos por |A(G)|
La funcioacuten (tamantildeo g) devuelve el orden del grafo g
-- | Ejemplos
-- gtgtgt tamantildeo (grafoCiclo 4)
-- 4
-- gtgtgt tamantildeo grafoPetersen
-- 15
tamantildeo Grafo a -gt Int
tamantildeo = length aristas
Definicioacuten 353 Diremos que dos aristas a aprime son incidentes si tienen interseccioacuten novaciacutea es decir si tienen alguacuten veacutertice en comuacuten
La funcioacuten (sonIncidentes a a) se verifica si las aristas a y a son incidentes
-- | Ejemplos
-- gtgtgt sonIncidentes (12) (24)
-- True
-- gtgtgt sonIncidentes (12) (34)
-- False
sonIncidentes Eq a =gt (aa) -gt (aa) -gt Bool
sonIncidentes (u1u2) (v1v2) =
or [u1 == v1 u1 == v2 u2 == v1 u2 == v2]
Definicioacuten 354 Diremos que una arista de un grafo G es un lazo si va de un veacutertice ensiacute mismo
35 Definiciones y propiedades 69
La funcioacuten (lazos g) devuelve los lazos del grafo g
-- | Ejemplos
-- gtgtgt lazos (creaGrafo [12] [(11)(12)(22)])
-- [(11)(22)]
-- gtgtgt lazos (grafoCiclo 5)
-- []
lazos Eq a =gt Grafo a -gt [(aa)]
lazos g = [(uv) | (uv) lt- aristas g u == v]
La funcioacuten (esLazo a) se verifica si la arista a es un lazo
-- | Ejemplos
-- gtgtgt esLazo (44)
-- True
-- gtgtgt esLazo (12)
-- False
esLazo Eq a =gt (aa) -gt Bool
esLazo (uv) = u == v
Definicioacuten 355 Dado un grafo G = (V A) fijado un veacutertice v isin V al conjunto deveacutertices que son adyacentes a v lo llamaremos entorno de v y lo denotaremos por N(v) =u isin V|(u v) isin A
La funcioacuten (entorno g v) devuelve el entorno del veacutertice v en el grafo g
-- | Ejemplo
-- gtgtgt entorno (creaGrafo [15] [(12)(13)(23)]) 2
-- [13]
entorno Eq a =gt Grafo a -gt a -gt [a]
entorno = adyacentes
Definicioacuten 356 Sea G = (V A) un grafo El grado (o valencia) de v isin V es grad(v) =|N(v)|
La funcioacuten (grado g v) devuelve el grado del veacutertice v en el grafo g
-- | Ejemplos
-- gtgtgt grado (creaGrafo [15] [(12)(13)(23)]) 2
-- 2
-- gtgtgt grado (grafoEstrella 5) 1
-- 5
grado Eq a =gt Grafo a -gt a -gt Int
grado g v = length (entorno g v)
Definicioacuten 357 Un veacutertice v de un grafo es aislado si su grado es 0
La funcioacuten (esAislado g v) se verifica si el veacutertice v es aislado en el grafo g
70 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- | Ejemplos
-- gtgtgt esAislado (creaGrafo [15] [(12)(13)(23)]) 4
-- True
-- gtgtgt esAislado (creaGrafo [15] [(12)(13)(23)]) 3
-- False
esAislado Eq a =gt Grafo a -gt a -gt Bool
esAislado g v = grado g v == 0
Definicioacuten 358 Un grafo es regular si todos sus veacutertices tienen el mismo grado
La funcioacuten (esRegular g) se verifica si el grafo g es regular
-- | Ejemplos
-- gtgtgt esRegular (creaGrafo [13] [(12)(13)(23)])
-- True
-- gtgtgt esRegular (creaGrafo [14] [(12)(13)(24)])
-- False
esRegular Eq a =gt Grafo a -gt Bool
esRegular g = all (==x) xs
where (xxs) = [grado g v | v lt- vertices g]
Definicioacuten 359 Dado un grafo G = (V A) llamamos valencia miacutenima o grado miacuteni-mo de G al valor δ(G) = mıngrad(v)|v isin V
La funcioacuten (valenciaMin g) devuelve la valencia miacutenima del grafo g
-- | Ejemplo
-- gtgtgt valenciaMin (creaGrafo [14] [(12)(13)(24)])
-- 1
valenciaMin Ord a =gt Grafo a -gt Int
valenciaMin g = minimum [grado g v | v lt- vertices g]
Definicioacuten 3510 Dado un grafo G = (V A) llamamos valencia maacutexima o gradomaacuteximo de G al valor δ(G) = maxgrad(v)|v isin V
La funcioacuten (valenciaMax g) devuelve la valencia maacutexima del grafo g
-- | Ejemplo
-- gtgtgt valenciaMax (creaGrafo [14] [(12)(13)(24)])
-- 2
valenciaMax Ord a =gt Grafo a -gt Int
valenciaMax g = maximum [grado g v | v lt- vertices g]
Definicioacuten 3511 Se dice que un grafo es simple si no contiene lazos ni aristas repetidas
La funcioacuten (esSimple g) se verifica si g es un grafo simple
35 Definiciones y propiedades 71
-- | Ejemplos
-- gtgtgt esSimple (creaGrafo [13] [(12)(13)(23)])
-- True
-- gtgtgt esSimple (creaGrafo [13] [(11)(12)(23)])
-- False
esSimple Ord a =gt Grafo a -gt Bool
esSimple g =
and [not ((xx) `aristaEn` g) | x lt- vertices g]
Definicioacuten 3512 Sea G un grafo Llamamos secuencia de grados de G a la lista degrados de sus veacutertices La secuencia se suele presentar en orden decreciente d1 ge d2 gemiddot middot middot ge dn
La funcioacuten (secuenciaGrados g) devuelve la secuencia de los grados del grafo g enorden decreciente
-- | Ejemplo
-- gtgtgt secuenciaGrados (creaGrafo [15] [(12)(13)(14)(24)])
-- [32210]
secuenciaGrados Eq a =gt Grafo a -gt [Int]
secuenciaGrados g = sortBy (flip compare) [grado g v | v lt- vertices g]
Nota 352 iquestQueacute listas de n nuacutemeros enteros son secuencias de grafos de n veacuterticesbull Si sumn
i=1 di es impar no hay ningunobull Si sumn
i=1 di es par entonces siempre hay un grafo con esa secuencia de grados (aun-que no necesariamente simple)
Definicioacuten 3513 Una secuencia graacutefica es una lista de nuacutemero enteros no negativos quees la secuencia de grados para alguacuten grafo simple
La funcioacuten (secuenciaGrafica ss) se verifica si existe alguacuten grafo con la secuenciade grados ss
-- | Ejemplos
-- gtgtgt secuenciaGrafica [32210]
-- True
-- gtgtgt secuenciaGrafica [3222]
-- False
secuenciaGrafica [Int] -gt Bool
secuenciaGrafica ss = even (sum ss) ampamp all p ss
where p s = s gt= 0 ampamp s lt= length ss
Definicioacuten 3514 Dado un grafo G = (V A) diremos que Gprime = (Vprime Aprime) es un subgrafode G si Vprime sube V y Aprime sube A
72 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (esSubgrafo g g) se verifica si g es un subgrafo de g
-- |Ejemplos
-- gtgtgt esSubgrafo (bipartitoCompleto 3 2) (bipartitoCompleto 3 3)
-- True
-- gtgtgt esSubgrafo (grafoEstrella 4) (grafoEstrella 5)
-- True
-- gtgtgt esSubgrafo (completo 5) (completo 4)
-- False
-- gtgtgt esSubgrafo (completo 3) (completo 4)
-- True
esSubgrafo Ord a =gt Grafo a -gt Grafo a -gt Bool
esSubgrafo g g =
vertices g `esSubconjunto` vertices g ampamp
aristas g `esSubconjunto` aristas g
Definicioacuten 3515 Si Gprime = (Vprime Aprime) es un subgrafo de G = (V A) tal que Vprime = Vdiremos que Gprime es un subgrafo maximal grafo recubridor o grafo de expansioacuten (eningleacutes spanning grah) de G
La funcioacuten (esSubgrafoMax g g) se verifica si g es un subgrafo maximal de g
-- | Ejemplos
-- gtgtgt esSubgrafoMax (grafoRueda 3) (grafoRueda 4)
-- False
-- gtgtgt esSubgrafoMax (grafoCiclo 4) (grafoRueda 4)
-- True
-- gtgtgt esSubgrafoMax (creaGrafo [13] [(12)]) (grafoCiclo 3)
-- True
-- gtgtgt esSubgrafoMax (creaGrafo [12] [(12)]) (grafoCiclo 3)
-- False
esSubgrafoMax Ord a =gt Grafo a -gt Grafo a -gt Bool
esSubgrafoMax g g =
g `esSubgrafo` g ampamp conjuntosIguales (vertices g) (vertices g)
Definicioacuten 3516 Sean Gprime = (Vprime Aprime) G = (V A) dos grafos si Vprime sub V o Aprime sub A sedice que Gprime es un subgrafo propio de G y se denota por Gprime sub G
La funcioacuten (esSubgrafoPropio g g) se verifica si g es un subgrafo propio de g
-- | Ejemplos
-- gtgtgt esSubgrafoPropio (grafoRueda 3) (grafoRueda 4)
-- True
-- gtgtgt esSubgrafoPropio (grafoRueda 4) (grafoCiclo 5)
-- False
-- gtgtgt esSubgrafoPropio (creaGrafo [13] [(12)]) (grafoCiclo 3)
-- True
-- gtgtgt esSubgrafoPropio (creaGrafo [12] [(12)]) (grafoCiclo 3)
35 Definiciones y propiedades 73
-- True
esSubgrafoPropio Ord a =gt Grafo a -gt Grafo a -gt Bool
esSubgrafoPropio g g =
esSubgrafo g g ampamp
(not (conjuntosIguales (vertices g) (vertices g)) ||
not (conjuntosIguales (aristas g) (aristas g)))
352 Propiedades de grafos
Teorema 3517 (Lema del apretoacuten de manos) En todo grafo simple el nuacutemero de veacuterticesde grado impar es par o cero
Vamos a comprobar que se verifica el lema del apretoacuten de manos utilizando la fun-cioacuten prop_LemaApretonDeManos
ghcigt quickCheck prop_LemaApretonDeManos
+++ OK passed 100 tests
prop_LemaApretonDeManos Grafo Int -gt Bool
prop_LemaApretonDeManos g =
even (length (filter odd [grado g v | v lt- vertices g]))
where g = creaGrafo (vertices g)
[(xy) | (xy) lt- aristas g x = y]
Teorema 3518 (HavelndashHakimi) Si n gt 1 y D = [d1 dn] es una lista de enterosentonces D es secuencia graacutefica si y soacutelo si la secuencia Dprime obtenida borrando el mayorelemento dmax y restando 1 a los siguientes dmax elementos maacutes grandes es graacutefica
Vamos a comprobar que se verifica el teorema de HavelndashHakimi utilizando la fun-cioacuten prop_HavelHakimi
ghcigt quickCheck prop_HavelHakimi
+++ OK passed 100 tests
prop_HavelHakimi [Int] -gt Bool
prop_HavelHakimi [] = True
prop_HavelHakimi (sss) =
not (secuenciaGrafica (sss) ampamp not (esVacio ss)) ||
secuenciaGrafica (map (x -gt x-1) (take s ss) ++ drop s ss)
353 Operaciones y propiedades sobre grafos
Eliminacioacuten de una arista
Definicioacuten 3519 Sea G = (V A) un grafo y sea (u v) isin A Definimos el grafo G (u v) como el subgrafo de G Gprime = (Vprime Aprime) con Vprime = V y Aprime = A (u v) Esta
74 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
operacioacuten se denomina eliminar una arista
La funcioacuten (eliminaArista g a) elimina la arista a del grafo g
-- | Ejemplos
-- gtgtgt eliminaArista (creaGrafo [14] [(12)(14)(24)]) (14)
-- G [1234] [(12)(24)]
-- gtgtgt eliminaArista (creaGrafo [14] [(12)(14)(24)]) (41)
-- G [1234] [(12)(24)]
-- gtgtgt eliminaArista (creaGrafo [14] [(12)(14)(24)]) (43)
-- G [1234] [(12)(14)(24)]
eliminaArista Ord a =gt Grafo a -gt (aa) -gt Grafo a
eliminaArista g (ab) =
creaGrafo (vertices g)
(aristas g [(ab)(ba)])
La funcioacuten (eliminaLazos g) devuelve un nuevo grafo obtenido a partir del grafog eliminando todas las aristas que fueran lazos
-- | Ejemplos
-- gtgtgt eliminaLazos (creaGrafo [12] [(11)(12)(22)])
-- G [12] [(12)]
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
-- gtgtgt eliminaLazos (grafoCiclo 5)
-- G [12345] [(12)(15)(23)(34)(45)]
eliminaLazos Ord a =gt Grafo a -gt Grafo a
eliminaLazos g = creaGrafo (vertices g)
[(xy) | (xy) lt- aristas g x = y]
Eliminacioacuten un veacutertice
Definicioacuten 3520 Sea G = (V A) un grafo y sea v isin V Definimos el grafo G v como elsubgrafo de G Gprime = (Vprime Aprime) con Vprime = V v y Aprime = A a isin A|v es un extremo de aEsta operacioacuten se denomina eliminar un veacutertice
La funcioacuten (eliminaVertice g v) elimina el veacutertice v del grafo g
-- | Ejemplos
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(24)]) 1
-- G [234] [(24)]
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(24)]) 4
-- G [123] [(12)]
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(24)]) 3
-- G [124] [(12)(14)(24)]
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(13)]) 1
-- G [234] []
eliminaVertice Ord a =gt Grafo a -gt a -gt Grafo a
35 Definiciones y propiedades 75
eliminaVertice g v =
creaGrafo (vertices g [v])
(as [(ab) | (ab) lt- as a == v || b == v])
where as = aristas g
Suma de aristas
Definicioacuten 3521 Sea G = (V A) un grafo y sean u v isin V tales que (u v) (v u) 6isin ADefinimos el grafo G + (u v) como el grafo Gprime = (V A cup (u v)) Esta operacioacuten sedenomina suma de una arista
La funcioacuten (sumaArista g a) suma la arista a al grafo g
-- | Ejemplos
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
-- gtgtgt sumaArista (grafoCiclo 5) (13)
-- G [12345] [(12)(13)(15)(23)(34)(45)]
sumaArista Ord a =gt Grafo a -gt (aa) -gt Grafo a
sumaArista g a =
creaGrafo (vertices g) (a aristas g)
Suma de veacutertices
Definicioacuten 3522 Sea G = (V A) un grafo y sea v 6isin V Definimos el grafo G + v comoel grafo Gprime = (Vprime Aprime) donde Vprime = V cup v Aprime = Acup (u v)|u isin V Esta operacioacuten sedenomina suma de un veacutertice
La funcioacuten (sumaVertice g a) suma el veacutertice a al grafo g
-- | Ejemplo
-- gtgtgt grafoCiclo 3
-- G [123] [(12)(13)(23)]
-- gtgtgt sumaVertice (grafoCiclo 3) 4
-- G [1234] [(12)(13)(14)(23)(24)(34)]
sumaVertice Ord a =gt Grafo a -gt a -gt Grafo a
sumaVertice g v =
creaGrafo (v vs) (aristas g ++ [(uv) | u lt- vs])
where vs = vertices g
Propiedad de los grafos completos
Proposicioacuten 3523 La familia de grafos completos Kn verifica que Kn = Knminus1 + n
Vamos a ver que se cumple la propiedad utilizando la funcioacuten prop_completos
76 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
ghcigt quickCheck prop_completos
+++ OK passed 100 tests
prop_completos Int -gt Property
prop_completos n = n gt= 2 ==gt
completo n == sumaVertice (completo (n-1)) n
A partir de esta propiedad se puede dar una definicioacuten alternativa de la funcioacuten(completo n) que devuelve el grafo completo Kn La nueva funcioacuten seraacute (completo2n)
completo2 Int -gt Grafo Int
completo2 0 = grafoNulo
completo2 n = sumaVertice (completo2 (n-1)) n
Vamos a comprobar la equivalencia de ambas deficiones
ghcigt prop_EquiCompleto
True
prop_EquiCompleto Bool
prop_EquiCompleto = and [completo n == completo2 n | n lt- [050]]
Vamos a ver cuaacutel de las definiciones es maacutes eficiente
ghcigt tamantildeo (completo 100)
4950
(117 secs 0 bytes)
ghcigt tamantildeo (completo2 100)
4950
(1549 secs 61756056 bytes)
La funcioacuten (completo n) es maacutes eficiente asiacute que seraacute la que seguiremos utilizando
Suma de grafos
Definicioacuten 3524 Sean G = (V A) Gprime = (Vprime A) dos grafos Definimos el grafo sumade G y Gprime como el grafo G + Gprime = (V cup Vprime A cup Aprime cup (u v)|u isin V v isin Vprime) Estaoperacioacuten se denomina suma de grafos
La funcioacuten (sumaGrafos g g) suma los grafos g y g
-- | Ejemplo
-- gtgtgt let g1 = creaGrafo [13] [(11)(13)(23)]
-- gtgtgt let g2 = creaGrafo [46] [(46)(56)]
-- gtgtgt pp $ sumaGrafos g1 g2
-- G [123456]
-- [(1 1)(1 3)(1 4)(1 5)(1 6)(2 3)(2 4)
-- (2 5)(2 6)(3 4)(3 5)(3 6)(4 6)(5 6)]
sumaGrafos Ord a =gt Grafo a -gt Grafo a -gt Grafo a
35 Definiciones y propiedades 77
sumaGrafos g1 g2 =
creaGrafo (vs1 `union` vs2)
(aristas g1 `union`
aristas g2 `union`
[(uv) | u lt- vs1 v lt- vs2])
where vs1 = vertices g1
vs2 = vertices g2
Unioacuten de grafos
Definicioacuten 3525 Sean G = (V A) Gprime = (Vprime A) dos grafos Definimos el grafo unioacutende G y Gprime como el grafo G cup H = (V cupVprime A cup Aprime) Esta operacioacuten se denomina unioacuten degrafos
La funcioacuten (unionGrafos g g) une los grafos g y g Por ejemplo
-- | Ejemplo
-- gtgtgt let g1 = creaGrafo [13] [(11)(13)(23)]
-- gtgtgt let g2 = creaGrafo [46] [(46)(56)]
-- gtgtgt unionGrafos g1 g2
-- G [123456] [(11)(13)(23)(46)(56)]
unionGrafos Ord a =gt Grafo a -gt Grafo a -gt Grafo a
unionGrafos g1 g2 =
creaGrafo (vertices g1 `union` vertices g2)
(aristas g1 `union` aristas g2)
Grafo complementario
Definicioacuten 3526 Dado un grafo G = (V A) se define el grafo complementario de Gcomo G = (V A) donde A = (u v)|u v isin V (u v) 6isin A
La funcioacuten (grafoComplementario g) devuelve el grafo complementario de g
-- | Ejemplo
-- gtgtgt grafoComplementario (creaGrafo [13] [(11)(13)(23)])
-- G [123] [(12)(22)(33)]
grafoComplementario Ord a =gt Grafo a -gt Grafo a
grafoComplementario g =
creaGrafo vs
[(uv)| u lt- vs v lt- vs u lt= v not ((uv) `aristaEn` g)]
where vs = vertices g
Definicioacuten 3527 Dado un grafo diremos que es completo si su complementario sin lazosno tiene aristas
La funcioacuten (esCompleto g) se verifica si el grafo g es completo
78 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- Ejemplos
-- gtgtgt esCompleto (completo 4)
-- True
-- gtgtgt esCompleto (grafoCiclo 5)
-- False
esCompleto Ord a =gt Grafo a -gt Bool
esCompleto g =
tamantildeo (eliminaLazos (grafoComplementario g)) == 0
36 Morfismos de grafos
Llegados a este punto es importante resaltar que un grafo se define como una en-tidad matemaacutetica abstracta es evidente que lo importante de un grafo no son losnombres de sus veacutertices ni su representacioacuten graacutefica La propiedad que caracterizaa un grafo es la forma en que sus veacutertices estaacuten unidos por las aristasA priori los siguientes grafos pueden parecer distintos
a
bc
de
1
23
45
Sin embargo ambos grafos son grafos de cinco veacutertices que tienen las mismas rela-ciones de vecindad entre sus nodos En esta seccioacuten estudiaremos estas relacionesque establecen las aristas entre los veacutertices de un grafo y presentaremos algoritmosque nos permitan identificar cuaacutendo dos grafos se pueden relacionar mediante apli-caciones entre sus veacutertices cumpliendo ciertas caracteriacutesicas
361 Morfismos
Definicioacuten 361 Si f es una funcioacuten entre dos grafos G = (V A) y Gprime = (Vprime Aprime)diremos que conserva la adyacencia si forallu v isin V se verifica que si (u v) isin A entonces( f (u) f (v)) isin Aprime
La funcioacuten (conservaAdyacencia g h f) se verifica si la funcioacuten f entre los grafosg y h conserva las adyacencias
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [14] [(12)(23)(34)]
-- gtgtgt let g2 = creaGrafo [14] [(12)(23)(24)]
-- gtgtgt let g3 = creaGrafo [4610] [(48)(68)(810)]
36 Morfismos de grafos 79
-- gtgtgt conservaAdyacencia g1 g3 [(14)(26)(38)(410)]
-- False
-- gtgtgt conservaAdyacencia g2 g3 [(14)(28)(36)(410)]
-- True
conservaAdyacencia (Ord a Ord b) =gt
Grafo a -gt Grafo b -gt Funcion a b -gt Bool
conservaAdyacencia g h f =
and [(imagen f ximagen f y) `aristaEn` h | (xy) lt- aristas g]
Definicioacuten 362 Dados dos grafos simples G = (V A) y Gprime = (Vprime Aprime) un morfismoentre G y Gprime es una funcioacuten φ V rarr Vprime que conserva las adyacencias
La funcioacuten (esMorfismo g h vvs) se verifica si la funcioacuten representada por vvs esun morfismo entre los grafos g y h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(12)(32)]
-- gtgtgt let g2 = creaGrafo [456] [(46)(56)]
-- gtgtgt esMorfismo g1 g2 [(14)(26)(35)]
-- True
-- gtgtgt esMorfismo g1 g2 [(14)(25)(36)]
-- False
-- gtgtgt esMorfismo g1 g2 [(14)(26)(35)(79)]
-- False
esMorfismo (Ord aOrd b) =gt Grafo a -gt Grafo b -gt
Funcion a b -gt Bool
esMorfismo g1 g2 f =
esFuncion (vertices g1) (vertices g2) f ampamp
conservaAdyacencia g1 g2 f
La funcioacuten (morfismos g h) devuelve todos los posibles morfismos entre los grafosg y h
-- | Ejemplos
-- gtgtgt grafoCiclo 3
-- G [123] [(12)(13)(23)]
-- gtgtgt let g = creaGrafo [46] [(44)(66)]
-- gtgtgt morfismos (grafoCiclo 3) g
-- [[(14)(24)(34)][(16)(26)(36)]]
-- gtgtgt morfismos g (grafoCiclo 3)
-- []
morfismos (Ord a Ord b) =gt Grafo a -gt Grafo b -gt [[(ab)]]
morfismos g h =
[f | f lt- funciones (vertices g) (vertices h)
conservaAdyacencia g h f]
80 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
362 Complejidad del problema de homomorfismo de grafos
En general en computacioacuten un problema algoriacutetmico consta de un conjunto I detodas las posibles entradas para el problema llamado el conjunto de instancias y deuna pregunta Q sobre esas instancias Resolver uno de estos problemas consiste endesarrollar un algoritmo cuya entrada es una instancia del problema y cuya salidaes una respuesta a la pregunta del problemaDecimos que un problema es de decisioacuten cuando las posibles respuestas a la pre-gunta son ldquosiacuterdquo o ldquonordquo Un ejemplo de problema de este tipo seriacutea dados dos grafosdecidir si estos son homomorfos o noA la hora de implementar un algoritmo que deacute solucioacuten al problema que estemosconsiderando es importante tener en cuenta el nuacutemero de pasos que efectuacutea hastaencontrar una respuesta Un algoritmo de tiempo polinomial se define como aquelcon funcioacuten de complejidad temporal en O(p(n)) para alguna funcioacuten polinoacutemicap donde n denota el tamantildeo de la entrada Cualquier algoritmo cuya funcioacuten decomplejidad temporal no pueda ser acotada de esta manera se denomina algoritmode tiempo exponencialLa mayoriacutea de los algoritmos de tiempo exponencial son simples variaciones de unabuacutesqueda exhaustiva mientras que los algoritmos de tiempo polinomial usualmen-te se obtienen mediante un anaacutelisis maacutes profundo de la estructura del problema Enla Teoriacutea de la complejidad computacional existe el consenso de que un problemano estaacute ldquobien resueltordquo hasta que se conozca un algoritmo de tiempo polinomialque lo resuelva Por tanto nos referiremos a un problema como ldquointratablerdquo si estan difiacutecil que no existe algoritmo de tiempo polinomial capaz de resolverloLos problemas de decisioacuten para los que existen algoritmos polinomiales consti-tuyen la clase P y son llamados polinomiales Un problema de decisioacuten es no-determiniacutestico polinomial cuando cualquier instancia que produce respuesta ldquosiacuterdquoposee una comprobacioacuten de correctitud (tambieacuten llamada certificado) verificable entiempo polinomia en el tamantildeo de la instancia Estos problemas de decisioacuten se di-ce que pertenecen a la clase NP Claramente P sube NP Sin embargo no se sabe siesta inclusioacuten es estricta uno de los principales problemas abiertos en Teoriacutea de lacomputacioacuten es saber si P 6= NPUna reduccioacuten es una transformacioacuten de un problema en otro problema Intuitiva-mente un problema Q puede ser reducido a otro problema Qprime si cualquier instanciadel problema Q puede ser ldquofaacutecilmenterdquo expresada como una instancia del problemaQprime y cuya solucioacuten proporcione una solucioacuten para la instancia de QLas reducciones en tiempo polinomial nos dotan de elementos para probar de unamanera formal que un problema es al menos tan difiacutecil que otro con una dife-rencia de un factor polinomial Estas son esenciales para definir a los problemas
36 Morfismos de grafos 81
NP-completos ademaacutes de ayudar a comprender los mismosLa clase de los problemas NP-completos contiene a los problemas maacutes difiacuteciles enNP en el sentido de que son los que esteacuten maacutes lejos de estar en P Debido a que elproblema P = NP no ha sido resuelto el hecho de reducir un problema B a otroproblema A indicariacutea que no se conoce solucioacuten en tiempo polinomial para A Estoes debido a que una solucioacuten en tiempo polinomial para A tendriacutea como conse-cuencia la existencia de una solucioacuten polinomial para B De manera similar debidoa que todos los problemas NP pueden ser reducidos a este conjunto encontrar unproblema NP-completo que pueda ser resuelto en un tiempo polinomial significariacuteaque P = NPEl problema de decidir si dos grafos son homomorfos es un problema de decisioacutenNP-completo La NP-completitud del problema se demuestra mediante la reduccioacutende este problema al problema de la clique 17En el proceso de recopilacioacuten de imformacioacuten acerca de la Teoriacutea de la complejidadse ha trabajado con dos fuentesbull la tesis de licenciatura de Pablo Burzyn ldquoComplejidad computacional en proble-
mas de modificacioacuten de aristas en grafosrdquo ([2]) ybull el artiacuteculo ldquoTeoriacutea de la complejidad computacionalrdquo ([12]) de la Wikipedia
363 Isomorfismos
Definicioacuten 363 Dados dos grafos simples G = (V A) y Gprime = (Vprime Aprime) un isomorfis-mo entre G y Gprime es un morfismo biyectivo cuyo inverso es morfismo entre Gprime y G
La funcioacuten (esIsomorfismo g h f) se verifica si la aplicacioacuten f es un isomorfismoentre los grafos g y h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt esIsomorfismo g1 g2 [(12)(24)(36)]
-- True
-- gtgtgt esIsomorfismo g1 g2 [(12)(22)(36)]
-- False
esIsomorfismo (Ord aOrd b) =gt
Grafo a -gt Grafo b -gt Funcion a b -gt Bool
esIsomorfismo g h f =
esBiyectiva vs1 vs2 f ampamp
esMorfismo g h f ampamp
esMorfismo h g (inversa f)
where vs1 = vertices g
vs2 = vertices h
17httpseswikipediaorgwikiProblema_de_la_clique
82 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (isomorfismos1 g h) devuelve todos los isomorfismos posibles entrelos grafos g y h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfismos1 g1 g2
-- [[(12)(24)(36)]]
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfismos1 g3 g4
-- []
-- gtgtgt let g5 = creaGrafo [123] [(11)(22)(33)]
-- gtgtgt let g6 = creaGrafo [246] [(22)(44)(66)]
-- gtgtgt pp $ isomorfismos1 g5 g6
-- [[(1 2)(2 4)(3 6)][(1 4)(2 2)(3 6)]
-- [(1 6)(2 4)(3 2)][(1 4)(2 6)(3 2)]
-- [(1 6)(2 2)(3 4)][(1 2)(2 6)(3 4)]]
isomorfismos1 (Ord aOrd b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos1 g h =
[f | f lt- biyecciones vs1 vs2
conservaAdyacencia g h f
conservaAdyacencia h g (inversa f)]
where vs1 = vertices g
vs2 = vertices h
Definicioacuten 364 Dos grafos G y H se dicen isomorfos si existe alguacuten isomorfismo entreellos
La funcioacuten isomorfos1 g h se verifica si los grafos g y h son isomorfos
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfos1 g1 g2
-- True
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfos1 g3 g4
-- False
isomorfos1 (Ord aOrd b) =gt Grafo a -gt Grafo b -gt Bool
isomorfos1 g = not null isomorfismos1 g
Nota 361 Al tener Haskell una evaluacioacuten perezosa la funcioacuten (isomorfos g h)
no necesita generar todos los isomorfismos entre los grafos g y h
Definicioacuten 365 Sea G = (V A) un grafo Un invariante por isomorfismos de G esuna propiedad de G que tiene el mismo valor para todos los grafos que son isomorfos a eacutel
36 Morfismos de grafos 83
esInvariantePorIsomorfismos
Eq a =gt (Grafo Int -gt a) -gt Grafo Int -gt Grafo Int -gt Bool
esInvariantePorIsomorfismos p g h =
isomorfos g h --gt (p g == p h)
where (--gt) = (lt=)
Teorema 366 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un iso-morfismo Entonces se verifica que |V(G)| = |V(Gprime)| es decir el orden de un grafo es uninvariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos orden)
+++ OK passed 100 tests
Teorema 367 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces se verifica que |A(G)| = |A(Gprime)| es decir el tamantildeo de un grafo es uninvariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos tamantildeo)
+++ OK passed 100 tests
Teorema 368 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces tienen la misma secuencia de grados es decir la secuencia de grados de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos secuenciaGrados)
+++ OK passed 100 tests
A partir de las propiedades que hemos demostrado de los isomorfismos vamos adar otra definicioacuten equivalente de las funciones (isomorfismos1 g h) y (isomorfos1
g h)
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfismos2 g1 g2
-- [[(12)(24)(36)]]
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfismos2 g3 g4
-- []
-- gtgtgt let g5 = creaGrafo [123] [(11)(22)(33)]
84 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- gtgtgt let g6 = creaGrafo [246] [(22)(44)(66)]
-- gtgtgt pp $ isomorfismos2 g5 g6
-- [[(1 2)(2 4)(3 6)][(1 4)(2 2)(3 6)]
-- [(1 6)(2 4)(3 2)][(1 4)(2 6)(3 2)]
-- [(1 6)(2 2)(3 4)][(1 2)(2 6)(3 4)]]
isomorfismos2 (Ord a Ord b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos2 g h
| orden g = orden h = []
| tamantildeo g = tamantildeo h = []
| secuenciaGrados g = secuenciaGrados h = []
| otherwise = [f | f lt- biyecciones vs1 vs2
conservaAdyacencia g h f]
where vs1 = vertices g
vs2 = vertices h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfos2 g1 g2
-- True
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfos2 g3 g4
-- False
isomorfos2 (Ord a Ord b) =gt Grafo a -gt Grafo b -gt Bool
isomorfos2 g =
not null isomorfismos2 g
isomorfismos3 (Ord a Ord b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos3 g h
| orden g = orden h = []
| tamantildeo g = tamantildeo h = []
| secuenciaGrados g = secuenciaGrados h = []
| otherwise = filter (conservaAdyacencia g h) (posibles g h)
verticesPorGrados g =
[filter (p n) (vertices g) | n lt- nub (secuenciaGrados g)]
where p m v = grado g v == m
aux1 [] _ = []
aux1 (xsxss) (ysyss) = (map (zip xs) (permutations ys))aux1 xss yss
aux2 [] = []
aux2 (xss[]) = xss
aux2 (xssyss[]) = [xs ++ ys | xs lt- xss ys lt- yss]
aux2 (xssyssxsss) =
aux2 ([xs ++ ys | xs lt- xss ys lt- yss]xsss)
36 Morfismos de grafos 85
posibles g h =
aux2 (aux1 (verticesPorGrados g) (verticesPorGrados h))
Vamos a comparar la eficiencia entre ambas definiciones
Nota 362 La nueva definicioacuten de (isomorfismos3 g h) es la maacutes eficiente con gra-fos poco regulares sin embargo cuando todos los veacutertices tienen el mismo grado(isomorfismos2 g h) sigue siendo mejor opcioacuten (aunque no hay mucha diferenciaen el coste computacional)ghcigt let n = 6 in (length (isomorfismos1 (completo n) (completo n)))
720
(018 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos2 (completo n) (completo n)))
720
(018 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos3 (completo n) (completo n)))
720
(018 secs 26123800 bytes)
ghcigt let n = 6 in (length (isomorfismos1 (grafoCiclo n) (grafoCiclo n)))
12
(004 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos2 (grafoCiclo n) (grafoCiclo n)))
12
(004 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos3 (grafoCiclo n) (grafoCiclo n)))
12
(004 secs 0 bytes)
ghcigt length (isomorfismos1 (grafoCiclo 6) (completo 7))
0
(000 secs 0 bytes)
ghcigt length (isomorfismos2 (grafoCiclo 6) (completo 7))
0
(001 secs 0 bytes)
ghcigt length (isomorfismos3 (grafoCiclo 6) (completo 7))
0
(000 secs 0 bytes)
ghcigt isomorfos1 (completo 10) (grafoCiclo 10)
False
(5190 secs 12841861176 bytes)
ghcigt isomorfos2 (completo 10) (grafoCiclo 10)
False
(000 secs 0 bytes)
ghcigt isomorfos3 (completo 10) (grafoCiclo 10)
False
86 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
(000 secs 0 bytes)
ghcigt isomorfos1 (grafoCiclo 10) (grafoRueda 10)
False
(7390 secs 16433969976 bytes)
ghcigt isomorfos2 (grafoCiclo 100) (grafoRueda 100)
False
(000 secs 0 bytes)
ghcigt isomorfos3 (grafoCiclo 100) (grafoRueda 100)
False
(000 secs 0 bytes)
ghcigt length (isomorfismos2 (grafoRueda 10) (grafoRueda 10))
18
(10112 secs 23237139992 bytes)
ghcigt length (isomorfismos3 (grafoRueda 10) (grafoRueda 10))
18
(4467 secs 9021442440 bytes)
Nota 363 Cuando los grafos son isomorfos comprobar que tienen el mismo nuacuteme-ro de veacutertices el mismo nuacutemero de aristas y la misma secuencia graacutefica no requieremucho tiempo ni espacio dando lugar a costes muy similares entre los dos paresde definiciones Sin embargo cuando los grafos tienen el mismo nuacutemero de veacuterticesy fallan en alguna de las demaacutes propiedades el resultado es muy costoso para laprimera definicioacuten mientras que es inmediato con la segundaA partir de ahora utilizaremos la funcioacuten isomorfismos2 para calcular los isomor-fismos entre dos grafos y la funcioacuten isomorfos para determinar si dos grafos sonisomorfos de modo que las renombraremos por isomorfismos y isomorfismos res-pectivamente
isomorfismos (Ord aOrd b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos = isomorfismos2
isomorfos (Ord aOrd b) =gt Grafo a -gt Grafo b -gt Bool
isomorfos = isomorfos2
364 Automorfismos
Definicioacuten 369 Dado un grafo simple G = (V A) un automorfismo de G es un iso-morfismo de G en siacute mismo
La funcioacuten (esAutomorfismo g f) se verifica si la aplicacioacuten f es un automorfismode g
-- | Ejemplos
-- gtgtgt let g = creaGrafo [123] [(12)(13)]
37 Caminos en grafos 87
-- gtgtgt esAutomorfismo g [(11)(23)(32)]
-- True
-- gtgtgt esAutomorfismo g [(12)(23)(31)]
-- False
esAutomorfismo Ord a =gt Grafo a -gt Funcion a a -gt Bool
esAutomorfismo g = esIsomorfismo g g
La funcioacuten (automorfismos g) devuelve la lista de todos los posibles automorfis-mos en g
-- | Ejemplo
-- gtgtgt automorfismos (creaGrafo [123] [(12)(13)])
-- [[(11)(22)(33)][(11)(23)(32)]]
automorfismos Ord a =gt Grafo a -gt [Funcion a a]
automorfismos g = isomorfismos1 g g
Nota 364 Cuando trabajamos con automorfismos es mejor utilizar en su defini-cioacuten la funcioacuten isomorfismos1 en vez de isomorfismos2 pues ser isomorfos es unarelacioacuten reflexiva es decir un grafo siempre es isomorfo a siacute mismo
37 Caminos en grafos
Una de las aplicaciones de la teoriacutea de grafos es la determinacioacuten de trayectos o re-corridos en una red de transporte o de distribucioacuten de productos Asiacute si cada veacuterticerepresenta un punto de intereacutes y cada arista representa una conexioacuten entre dos pun-tos usando grafos como modelos podemos simplificar el problema de encontrar laruta maacutes ventajosa en cada caso
371 Definicioacuten de camino
Definicioacuten 371 Sea G = (V A) un grafo simple y sean u v isin V dos veacutertices Uncamino entre u y v es una sucesioacuten de veacutertices de G u = v0 v1 v2 vkminus1 vk = vdonde foralli isin 0 kminus 1 (vi vi+1) isin A
La funcioacuten (esCamino g c) se verifica si la sucesioacuten de veacutertices c es un camino enel grafo g
-- | Ejemplo
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
-- gtgtgt esCamino (grafoCiclo 5) [123451]
-- True
-- gtgtgt esCamino (grafoCiclo 5) [124531]
-- False
88 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
esCamino Ord a =gt Grafo a -gt [a] -gt Bool
esCamino g c = all (`aristaEn` g) (zip c (tail c))
La funcioacuten (aristasCamino c) devuelve la lista de las aristas recorridas en el ca-mino c
-- | Ejemplos
-- gtgtgt aristasCamino [123]
-- [(12)(23)]
-- gtgtgt aristasCamino [1231]
-- [(12)(23)(13)]
-- gtgtgt aristasCamino [1232]
-- [(12)(23)(23)]
aristasCamino Ord a =gt [a] -gt [(aa)]
aristasCamino c =
map parOrdenado (zip c (tail c))
where parOrdenado (uv) | u lt= v = (uv)
| otherwise = (vu)
La funcioacuten (verticesCamino c) devuelve la lista de las vertices recorridas en elcamino c
-- | Ejemplo
-- gtgtgt verticesCamino [1231]
-- [123]
verticesCamino Ord a =gt [a] -gt [a]
verticesCamino c = nub c
Definicioacuten 372 Se llama longitud de un camino al nuacutemero de veces que se atraviesa unaarista en dicho camino
La funcioacuten (longitudCamino c) devuelve la longitud del camino c
-- | Ejemplo
-- gtgtgt longitudCamino [427]
-- 2
longitudCamino [a] -gt Int
longitudCamino c = length c - 1
La funcioacuten (todosCaminos g u v k) devuelve todos los caminos entre los veacuterticesu y v en el grafo g que tienen longitud k
-- | Ejemplo
-- gtgtgt todosCaminos (creaGrafo [12] [(12)]) 1 2 3
-- [[1212]]
-- gtgtgt todosCaminos (bipartitoCompleto 2 3) 1 3 3
-- [[1313][1323][1413][1423][1513][1523]]
todosCaminos Ord a =gt Grafo a -gt a -gt a -gt Int -gt [[a]]
todosCaminos g u v 0 = if u == v ampamp elem u (vertices g)
37 Caminos en grafos 89
then [[u]]
else []
todosCaminos g u v 1 = if aristaEn (uv) g
then [[uv]]
else []
todosCaminos g u v k =
filter p [uvs | n lt- [1k-1] w lt- a u vs lt- tC w v n]
where p xs = longitudCamino xs == k
a = adyacentes g
tC = todosCaminos g
La funcioacuten (numeroCaminosDeLongitud g u v k) es el nuacutemero de caminos de lon-gitud k uniendo los veacutertices u y v en el grafo g
-- | Ejemplos
-- gtgtgt numeroCaminosDeLongitud (completo 7) 1 4 5
-- 1111
-- gtgtgt numeroCaminosDeLongitud grafoPetersen 1 4 3
-- 5
numeroCaminosDeLongitud Ord a =gt Grafo a -gt a -gt a -gt Int -gt Int
numeroCaminosDeLongitud g u v = length todosCaminos g u v
372 Recorridos
Definicioacuten 373 Sea G = (V A) un grafo y sean u v isin V Un camino entre u y v queno repite aristas (quizaacutes veacutertices) se llama recorrido
La funcioacuten (esRecorrido g c) se verifica si el camino c es un recorrido en el grafog
-- | Ejemplo
-- gtgtgt esRecorrido (grafoCiclo 4) [214]
-- True
-- gtgtgt esRecorrido (grafoCiclo 4) [2141]
-- False
-- gtgtgt esRecorrido (grafoCiclo 4) [213]
-- False
esRecorrido Ord a =gt Grafo a -gt [a] -gt Bool
esRecorrido g c =
esCamino g c ampamp sinRepetidos (aristasCamino c)
373 Caminos simples
Definicioacuten 374 Un camino que no repite veacutertices (y por tanto tampoco aristas) se llamacamino simple
90 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (esCaminoSimple g c) se verifica si el camino c es un camino simple enel grafo g
-- | Ejemplos
-- gtgtgt esCaminoSimple (creaGrafo [12] [(11)(12)]) [112]
-- False
-- gtgtgt esCaminoSimple (grafoCiclo 4) [214]
-- True
-- gtgtgt esCaminoSimple (grafoCiclo 4) [14321]
-- True
-- gtgtgt esCaminoSimple (grafoCiclo 4) [43212]
-- False
esCaminoSimple Ord a =gt Grafo a -gt [a] -gt Bool
esCaminoSimple g [] = True
esCaminoSimple g vs =
esRecorrido g vs ampamp noRepiteVertices vs
where noRepiteVertices (xxs)
| sinRepetidos (xxs) = True
| x == last xs ampamp sinRepetidos xs = True
| otherwise = False
La funcioacuten (todosArcosBP g u v) devuelve una lista con todos los caminos simplesposibles en el grafo g entre los veacutertices u y v utilizando una algoritmo de buacutesquedaen profundidad sobre el grafo g Este algoritmo recorre el grafo de izquierda a dere-cha y de forma al visitar un nodo explora todos los caminos que pueden continuarpor eacutel antes de pasar al siquiente
-- | Ejemplos
-- gtgtgt grafoCiclo 4
-- G [1234] [(12)(14)(23)(34)]
-- gtgtgt todosArcosBP (grafoCiclo 4) 1 4
-- [[14][1234]]
-- gtgtgt todosArcosBP (grafoCiclo 4) 4 1
-- [[4321][41]]
-- gtgtgt todosArcosBP (creaGrafo [14] [(12)(34)]) 1 4
-- []
-- gtgtgt todosArcosBP (creaGrafo [12] [(11)(12)]) 1 1
-- [[1]]
todosArcosBP Ord a =gt Grafo a -gt a -gt a -gt [[a]]
todosArcosBP g x y = aux [[y]]
where aux [] = []
aux ([]zss) = aux zss
aux ((zzs)zss)
| z == x = (zzs) aux zss
| otherwise =
aux ([vzzs | v lt- adyacentes g z zs] ++ zss)
g = eliminaLazos g
eliminaLazos h = creaGrafo (vertices h)
37 Caminos en grafos 91
[(xy) | (xy) lt- aristas h x = y]
La funcioacuten (todosArcosBA g u v) devuelve una lista con todos los caminos simplesposibles en el grafo g entre los veacutertices u y v utilizando una algoritmo de buacutesquedaen anchura sobre el grafo g Este algoritmo recorre el grafo por niveles de formaque el primer camino de la lista es de longitud miacutenima
-- | Ejemplos
-- gtgtgt grafoCiclo 4
-- G [1234] [(12)(14)(23)(34)]
-- gtgtgt todosArcosBA (grafoCiclo 4) 1 4
-- [[14][1234]]
-- gtgtgt todosArcosBA (grafoCiclo 4) 4 1
-- [[41][4321]]
-- gtgtgt todosArcosBA (creaGrafo [14] [(12)(34)]) 1 4
-- []
-- gtgtgt todosArcosBA (creaGrafo [12] [(11)(12)]) 1 1
-- [[1]]
todosArcosBA Ord a =gt Grafo a -gt a -gt a -gt [[a]]
todosArcosBA g x y = aux [[y]]
where aux [] = []
aux ([]zss) = aux zss
aux ((zzs)zss)
| z == x = (zzs) aux zss
| otherwise =
aux (zss ++ [vzzs | v lt- adyacentes g z zs])
g = eliminaLazos g
Vamos a comprobar con QuickCheck que el primer elemento de la lista que de-vuelve la funcioacuten (todosArcosBA g u v) es de longitud miacutenima Para ello vamos autilizar la funcioacuten (parDeVertices g) que es un generador de pares de veacutertices delgrafo no nulo g Por ejemplo
ghcigt sample (parDeVertices (creaGrafo [19] []))
(39)
(93)
(74)
(43)
(28)
(72)
(84)
(53)
(72)
(31)
(72)
92 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
parDeVertices Grafo Int -gt Gen (IntInt)
parDeVertices g = do
x lt- elements vs
y lt- elements vs
return (xy)
where vs = vertices g
La propiedad es
prop_todosArcosBA Grafo Int -gt Property
prop_todosArcosBA g =
not (esGrafoNulo g) ==gt
forAll (parDeVertices g)
((xy) -gt let zss = todosArcosBA g x y
in null zss || longitudCamino (head zss) ==
minimum (map longitudCamino zss))
La comprobacioacuten es
ghcigt quickCheck prop_todosArcosBA
+++ OK passed 100 tests
Veamos que la funcioacuten (todosArcosBP g u v) no verifica la propiedad
ghcigt quickCheck prop_todosArcosBP
Failed Falsifiable (after 6 tests)
G [12345] [(12)(14)(15)(22)(23)(24)(44)(45)(55)]
(52)
prop_todosArcosBP Grafo Int -gt Property
prop_todosArcosBP g =
not (esGrafoNulo g) ==gt
forAll (parDeVertices g)
((xy) -gt let zss = todosArcosBP g x y
in null zss || longitudCamino (head zss) ==
minimum (map longitudCamino zss))
La funcioacuten (numeroArcosDeLongitud g u v k) devuelve el nuacutemero de caminos en-tre los veacutertices u y v en el grafo g que tienen longitud k
-- | Ejemplos
-- gtgtgt numeroArcosDeLongitud (completo 6) 1 3 4
-- 24
-- gtgtgt numeroArcosDeLongitud grafoPetersen 1 3 4
-- 4
numeroArcosDeLongitud Ord a =gt Grafo a -gt a -gt a -gt Int -gt Int
numeroArcosDeLongitud g u v k =
length (filter p (todosArcosBA g u v))
where p vs = longitudCamino vs == k
37 Caminos en grafos 93
374 Conexioacuten
Definicioacuten 375 Dado un grafo G = (V A) sean u v isin V Si existe alguacuten camino entreu y v en el grafo G diremos que estaacuten conectados y lo denotamos por u v
La funcioacuten (estanConectados g u v) se verifica si los veacutertices u y v estaacuten conecta-dos en el grafo g
-- | Ejemplos
-- gtgtgt estanConectados (creaGrafo [14] [(12)(24)]) 1 4
-- True
-- gtgtgt estanConectados (creaGrafo [14] [(12)(34)]) 1 4
-- False
estanConectados Ord a =gt Grafo a -gt a -gt a -gt Bool
estanConectados g u v
| esGrafoNulo g = False
| otherwise = not (null (todosArcosBA g u v))
Nota 371 La funcioacuten (estanConectados g u v) no necesita calcular todos los ca-minos entre u y v Puesto que Haskell utiliza por defecto evaluacioacuten perezosa siexiste alguacuten camino entre los dos veacutertices basta calcular el primero para saber quela lista de todos los caminos no es vaciacutea
375 Distancia
Definicioacuten 376 Se define la distancia entre u y v en el grafo G como la longitud delcamino maacutes corto que los une Si u y v no estaacuten conectados decimos que la distancia esinfinita
La funcioacuten (distancia g u v) devuelve la distancia entre los veacutertices u y v en elgrafo g En caso de que los veacutertices no esteacuten conectados devuelve el valor Nothing
-- | Ejemplos
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 1
-- Just 0
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 2
-- Just 1
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 3
-- Just 2
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 4
-- Nothing
distancia Ord a =gt Grafo a -gt a -gt a -gt Maybe Int
distancia g u v
| estanConectados g u v =
Just (longitudCamino (head (todosArcosBA g u v)))
| otherwise = Nothing
94 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Definicioacuten 377 Dado G = (V A) un grafo sean u v isin V Un camino entre u y v cuyalongitud coincide con la distancia entre los veacutertices se llama geodeacutesica entre u y v
La funcioacuten (esGeodesica g c) se verifica si el camino c es una geodeacutesica entre susextremos en el grafo g
-- | Ejemplos
-- gtgtgt let g = creaGrafo [14] [(12)(13)(23)(34)]
-- gtgtgt esGeodesica g [134]
-- True
-- gtgtgt esGeodesica g [1234]
-- False
esGeodesica Ord a =gt Grafo a -gt [a] -gt Bool
esGeodesica g c =
esCamino g c ampamp
longitudCamino c == fromJust (distancia g u v)
where u = head c
v = last c
Nota 372 No hace falta imponer en la definicioacuten de la funcioacuten que el camino seaun recorrido pues el camino de miacutenima longitud entre dos veacutertices es siempre unrecorrido
376 Caminos cerrados
Definicioacuten 378 Un camino en un grafo G se dice cerrado si sus extremos son igualesDiremos que un camino cerrado de longitud tres es un triaacutengulo
La funcioacuten (esCerrado g c) se verifica si el camino c es cerrado en el grafo g
-- | Ejemplos
-- gtgtgt let g = creaGrafo [14] [(12)(13)(23)(34)]
-- gtgtgt esCerrado g [1231]
-- True
-- gtgtgt esCerrado g [123]
-- False
-- gtgtgt esCerrado g [1241]
-- False
esCerrado (Ord a) =gt Grafo a -gt [a] -gt Bool
esCerrado _ [] = False
esCerrado g (vc) =
esCamino g c ampamp v == last c
La funcioacuten (triangulos g v) devuelve la lista de todos los triaacutengulos que pasanpor el veacutertice v en el grafo g
-- | Ejemplos
-- gtgtgt triangulos (completo 4) 3
37 Caminos en grafos 95
-- [[3123][3143][3213][3243][3413][3423]]
-- gtgtgt triangulos (grafoCiclo 6) 1
-- []
triangulos Ord a =gt Grafo a -gt a -gt [[a]]
triangulos g u = todosCaminos g u u 3
377 Circuitos
Definicioacuten 379 Un recorrido en un grafo G se dice circuito si sus extremos son iguales
La funcioacuten (esCircuito g c) se verifica si la sucesioacuten de veacutertices c es un circuitoen el grafo g
-- | Ejemplos
-- gtgtgt grafoCiclo 4
-- G [1234] [(12)(14)(23)(34)]
-- gtgtgt esCircuito (grafoCiclo 4) [12341]
-- True
-- gtgtgt esCircuito (grafoCiclo 4) [1234]
-- False
-- gtgtgt esCircuito (grafoCiclo 4) [1234141]
-- False
esCircuito (Ord a) =gt Grafo a -gt [a] -gt Bool
esCircuito g c =
esRecorrido g c ampamp esCerrado g c
378 Ciclos
Definicioacuten 3710 Un camino simple en un grafo G se dice que es un ciclo si sus extremosson iguales
La funcioacuten (esCiclo g c) se verifica si el camino c es un ciclo en el grafo g
-- | Ejemplos
-- gtgtgt esCiclo (grafoCiclo 4) [121]
-- False
-- gtgtgt esCiclo (grafoCiclo 4) [12341]
-- True
-- gtgtgt esCiclo (grafoCiclo 4) [1234]
-- False
-- gtgtgt esCiclo (grafoCiclo 4) [1234141]
-- False
esCiclo (Ord a) =gt Grafo a -gt [a] -gt Bool
esCiclo g c =
esCaminoSimple g c ampamp esCerrado g c
96 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (todosCiclos g v) devuelve todos los ciclos en el grafo g que pasan porel veacutertice v
-- | Ejemplos
-- gtgtgt todosCiclos (grafoCiclo 4) 3
-- [[34123][32143]]
-- gtgtgt todosCiclos (completo 3) 2
-- [[2312][2132]]
-- gtgtgt todosCiclos (creaGrafo [123] [(11)(12)(13)(23)]) 1
-- [[1][1321][1231]]
-- gtgtgt todosCiclos (creaGrafo [12] [(12)(22)(23)]) 2
-- [[2]]
todosCiclos Ord a =gt Grafo a -gt a -gt [[a]]
todosCiclos g x =
map f (filter p (concat [todosArcosBA g x u | u lt- a x]))
where p c = longitudCamino c = 1
f c | longitudCamino c == 0 = c
| otherwise = c ++ [x]
a = adyacentes g
Nota 373 El algoritmo utilizado en la definicioacuten de (todosCiclos g) es el de buacutes-queda en anchura Este algoritmo recorre el grafo por niveles de forma que el pri-mer camino de la lista es de longitud miacutenima
379 Grafos aciacuteclicos
Definicioacuten 3711 Diremos que un grafo G = (V A) es aciacuteclico si no contiene ninguacutenciclo es decir si forallv isin V no existe ninguacuten camino simple que comience y termine en v
La funcioacuten (esAciclico g) se verifica si el grafo g es aciacuteclico
-- | Ejemplo
-- gtgtgt esAciclico (creaGrafo [14] [(12)(24)])
-- True
-- gtgtgt esAciclico (grafoCiclo 5)
-- False
-- gtgtgt esAciclico (grafoEstrella 6)
-- True
esAciclico Ord a =gt Grafo a -gt Bool
esAciclico g =
and [null (todosCiclos g x) | x lt- vertices g]
38 Conectividad de los grafos 97
38 Conectividad de los grafos
381 Estar conectados por un camino
Teorema 381 Dado un grafo G la relacioacuten u sim v (estar conectados por un camino) es unarelacioacuten de equivalencia
La funcioacuten (estarConectadosCamino g) devuelve la relacioacuten entre los veacutertices delgrafo g de estar conectados por un camino en eacutel
-- | Ejemplo
-- gtgtgt estarConectadosCamino (creaGrafo [14] [(12)(24)])
-- [(11)(12)(14)(21)(22)(24)(33)(41)(42)(44)]
estarConectadosCamino Ord a =gt Grafo a -gt [(aa)]
estarConectadosCamino g =
[(uv) | u lt- vs v lt- vs estanConectados g u v]
where vs = vertices g
A continuacioacuten comprobaremos el resultado con QuickCheck
ghcigt quickCheck prop_conectadosRelEqui
+++ OK passed 100 tests
prop_conectadosRelEqui Grafo Int -gt Bool
prop_conectadosRelEqui g =
esRelacionEquivalencia (vertices g) (estarConectadosCamino g)
382 Componentes conexas de un grafo
Definicioacuten 382 Las clases de equivalencia obtenidas por la relacioacuten sim estar conectadospor un camino en un grafo G inducen subgrafos en G los veacutertices y todas las aristas de loscaminos que los conectan que reciben el nombre de componentes conexas por caminosde G
La funcioacuten (componentesConexas1 g) devuelve las componentes conexas por cami-nos del grafo g
-- | Ejemplos
-- gtgtgt componentesConexas (creaGrafo [15] [(12)(23)])
-- [[123][4][5]]
-- gtgtgt componentesConexas (creaGrafo [15] [(12)(23)(45)])
-- [[123][45]]
-- gtgtgt componentesConexas (creaGrafo [13] [(12)(23)])
-- [[123]]
componentesConexas1 Ord a =gt Grafo a -gt [[a]]
componentesConexas1 g =
clasesEquivalencia (vertices g) (estarConectadosCamino g)
98 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Vamos a definir dos nuevas funciones una que compruebe si el grafo es nulo o com-pleto pues en dichos casos las componentes seraacuten el conjunto vaciacuteo y el conjuntodel conjunto de veacutertices respectivamente y otra con un algoritmo algo maacutes comple-jo
componentesConexas2 Ord a =gt Grafo a -gt [[a]]
componentesConexas2 g
| esGrafoNulo g = []
| esCompleto g = [vertices g]
| otherwise =
clasesEquivalencia (vertices g) (estarConectadosCamino g)
componentesConexas3 Ord a =gt Grafo a -gt [[a]]
componentesConexas3 g = aux (vertices g) [] []
where aux [] [] [] = []
aux [] xs ys = [xs]
aux (vvs) [] [] =
aux (vs (a v)) (i v (a v)) (a v)
aux vs xs ys | null ((ug [a v | v lt- ys]) xs) =
xs aux vs [] []
| otherwise =
aux (vs ug [a v | v lt- ys])
(u xs (ug [a v | v lt- ys]))
(ug [a v | v lt- ys] ys)
a = adyacentes g
i = inserta
ug = unionGeneral
u = unionConjuntos
La comprobacioacuten con QuickCheck de la equivalencia de las definiciones es
ghcigt quickCheck prop_EquiComponentesConexas
+++ OK passed 100 tests
ghcigt quickCheck prop_EquiComponentesConexas2
+++ OK passed 100 tests
prop_EquiComponentesConexas Grafo Int -gt Bool
prop_EquiComponentesConexas g =
componentesConexas1 g == componentesConexas2 g
prop_EquiComponentesConexas2 Grafo Int -gt Bool
prop_EquiComponentesConexas2 g =
componentesConexas1 g == componentesConexas3 g
Comparemos ahora la eficiencia de las definiciones
ghcigt componentesConexas1 grafoNulo
[]
(003 secs 0 bytes)
38 Conectividad de los grafos 99
ghcigt componentesConexas2 grafoNulo
[]
(001 secs 0 bytes)
ghcigt componentesConexas3 grafoNulo
[]
(001 secs 0 bytes)
ghcigt length (componentesConexas1 (completo 50))
1
(023 secs 0 bytes)
ghcigt length (componentesConexas2 (completo 50))
1
(016 secs 0 bytes)
ghcigt length (componentesConexas3 (completo 50))
1
(008 secs 0 bytes)
ghcigt length (componentesConexas1 (completo 100))
1
(217 secs 205079912 bytes)
ghcigt length (componentesConexas2 (completo 100))
1
(285 secs 0 bytes)
ghcigt length (componentesConexas3 (completo 100))
1
(119 secs 0 bytes)
ghcigt length (componentesConexas1 (completo 150))
1
(1295 secs 742916792 bytes)
ghcigt length (componentesConexas2 (completo 150))
1
(2048 secs 0 bytes)
ghcigt length (componentesConexas3 (completo 150))
1
(964 secs 0 bytes)
Con grafos completos de gran tamantildeo Haskell tarda maacutes tiempo en comprobar quees completo que en calcular directamente sus clases de equivalencia y para grafosnulos apenas hay diferencia en el coste entre la primera y la segunda definicioacuten Porotra parte la tercera definicioacuten es la maacutes eficiente en todos los casos y seraacute por tantola que utilizaremos a lo largo del trabajo
componentesConexas Ord a =gt Grafo a -gt [[a]]
componentesConexas = componentesConexas3
La funcioacuten (numeroComponentes g) devuelve el nuacutemero de componentes conexasdel grafo g
-- Ejemplos
-- gtgtgt numeroComponentes (creaGrafo [15] [(12)(23)(45)])
100 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- 2
-- gtgtgt numeroComponentes (creaGrafo [14] [(12)(22)(34)])
-- 2
numeroComponentes Ord a =gt Grafo a -gt Int
numeroComponentes g
| null (aristas g) = orden g
| otherwise = length (componentesConexas g)
Nota 381 Hemos comprobado para la definicioacuten anterior que comprobar si un gra-fo es completo es muy costoso luego no conviene antildeadirlo como patroacuten
383 Grafos conexos
Definicioacuten 383 Dado un grafo diremos que es conexo si la relacioacuten tiene una uacutenica clasede equivalencia en eacutel es decir si el grafo tiene una uacutenica componente conexa
La funcioacuten (esConexo g) se verifica si el grafo g es conexo
-- Ejemplos
-- gtgtgt esConexo (creaGrafo [13] [(12)(23)])
-- True
-- gtgtgt esConexo (creaGrafo [15] [(12)(23)(45)])
-- False
esConexo Ord a =gt Grafo a -gt Bool
esConexo g = length (componentesConexas g) == 1
esConexo2 Ord a =gt Grafo a -gt Bool
esConexo2 g
| esGrafoNulo g = False
| esUnitario (vertices g) = True
| otherwise = aux (vertices g) [] []
where aux [] [] [] = False
aux [] xs _ = True
aux (vvs) [] [] | null vs = True
| null (a v) = False
| otherwise =
aux (vs a v) (i v (a v)) (a v)
aux vs xs ys | null ((ug [a v | v lt- xs]) xs) = False
| otherwise =
aux (vs (ug [a v | v lt- xs]))
(u (ug [a v | v lt- xs]) xs)
((ug [a v | v lt- xs]) xs)
a = adyacentes g
ug = unionGeneral
i = inserta
u = unionConjuntos
38 Conectividad de los grafos 101
La comprobacioacuten de la equivalencia de las definiciones con QuickCheck es
ghcigt quickCheck prop_EquiEsConexo
+++ OK passed 100 tests
prop_EquiEsConexo Grafo Int -gt Bool
prop_EquiEsConexo g =
esConexo g == esConexo2 g
Vamos a comparar ahora su eficiencia
ghcigt let g1 = grafoCiclo 100
(000 secs 0 bytes)
ghcigt let g = creaGrafo (vertices g1) (aristas g1 [(23)(9899)])
(000 secs 0 bytes)
ghcigt esConexo g
False
(117 secs 151632168 bytes)
ghcigt esConexo2 g
False
(001 secs 0 bytes)
ghcigt esConexo (grafoCiclo 500)
True
(7341 secs 10448270712 bytes)
ghcigt esConexo2 (grafoCiclo 500)
True
(18939 secs 18468849096 bytes)
ghcigt esConexo (grafoCiclo 500)
True
(7341 secs 10448270712 bytes)
ghcigt esConexo2 (grafoCiclo 500)
True
(18939 secs 18468849096 bytes)
En principio no nos proporciona ninguna ventaja la segunda definicioacuten asiacute que tra-bajaremos con la primera que hemos dado ya que es mucho maacutes sencilla
Teorema 384 Sea G un grafo G = (V A) es conexo si y solamente si forallu v isin V existe uncamino entre u y v
Vamos a comprobar el resultado con QuickCheck
ghcigt quickCheck prop_caracterizaGrafoConexo
+++ OK passed 100 tests
prop_caracterizaGrafoConexo Grafo Int -gt Property
prop_caracterizaGrafoConexo g =
not (esGrafoNulo g) ==gt
esConexo g == and [estanConectados g u v
| u lt- vertices g v lt- vertices g]
102 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
384 Excentricidad
Definicioacuten 385 Sean G = (V A) un grafo y v isin V Se define la excentricidad de v comoel maacuteximo de las distancias entre v y el resto de veacutertices de G La denotaremos por e(v)
La funcioacuten (excentricidad g v) devuelve la excentricidad del veacutertice v en el grafog
-- | Ejemplos
-- gtgtgt let g = creaGrafo [13] [(12)(23)(33)]
-- gtgtgt excentricidad g 1
-- Just 2
-- gtgtgt excentricidad g 2
-- Just 1
-- gtgtgt excentricidad (creaGrafo [13] [(12)(33)]) 1
-- Nothing
excentricidad Ord a =gt Grafo a -gt a -gt Maybe Int
excentricidad g u
| esGrafoNulo g = Nothing
| orden g == 1 = Just 0
| Nothing `elem` distancias = Nothing
| otherwise = maximum distancias
where distancias = [distancia g u v | v lt- vertices g [u]]
La funcioacuten (excentricidades g) devuelve la lista ordenada de las excentricidadesde los veacutertices del grafo g
-- | Ejemplos
-- gtgtgt excentricidades (creaGrafo [13] [(12)(23)(33)])
-- [Just 1Just 2Just 2]
-- gtgtgt excentricidades (creaGrafo [13] [(12)(33)])
-- [NothingNothingNothing]
excentricidades Ord a =gt Grafo a -gt [Maybe Int]
excentricidades g = sort (map (excentricidad g) (vertices g))
385 Diaacutemetro
Definicioacuten 386 Sea G = (V A) un grafo Se define el diaacutemetro de G como el maacuteximo delas distancias entre los veacutertices en V Lo denotaremos por d(G)
La funcioacuten (diametro g) devuelve el diaacutemetro del grafo g
-- | Ejemplos
-- gtgtgt diametro (creaGrafo [13] [(12)(23)(33)])
-- Just 2
-- gtgtgt diametro (creaGrafo [13] [(12)(33)])
-- Nothing
diametro Ord a =gt Grafo a -gt Maybe Int
38 Conectividad de los grafos 103
diametro g
| esGrafoNulo g = Nothing
| Nothing `elem` distancias = Nothing
| otherwise = maximum distancias
where vs = vertices g
distancias = [distancia g u v | u lt- vs v lt- vs u lt= v]
386 Radio
Definicioacuten 387 Sean G = (V A) un grafo y v isin V Se define el radio de G como elmiacutenimo de las excentricidades de sus veacutertices Lo denotaremos por r(G)
La funcioacuten (radio g) devuelve el radio del grafo g
-- | Ejemplos
-- gtgtgt radio (creaGrafo [13] [(12)(23)(33)])
-- Just 1
-- gtgtgt radio (creaGrafo [13] [(12)(33)])
-- Nothing
radio Ord a =gt Grafo a -gt Maybe Int
radio g
| esGrafoNulo g = Nothing
| Nothing `elem` ds = Nothing
| otherwise = minimum ds
where ds = [excentricidad g v | v lt- vertices g]
387 Centro
Definicioacuten 388 Sean G = (V A) un grafo Llamamos centro del grafo G al conjunto deveacutertices de excentricidad miacutenima A estos veacutertices se les denomina veacutertices centrales
La funcioacuten (centro g) devuelve el centro del grafo g Por ejemplo
-- | Ejemplos
-- gtgtgt centro (creaGrafo [13] [(12)(23)(33)])
-- [2]
-- gtgtgt centro (creaGrafo [13] [(12)(13)(23)])
-- [123]
-- gtgtgt centro (creaGrafo [13] [(12)(33)])
-- [123]
centro Ord a =gt Grafo a -gt [a]
centro g = [v | v lt- vertices g excentricidad g v == r]
where r = radio g
104 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
388 Grosor
Definicioacuten 389 Sean G = (V A) un grafo Se llama grosor o cintura del grafo G almiacutenimo de las longitudes de los ciclos de G Si el grafo no posee ciclos (es decir es un grafoaciacuteclico) se dice que su cintura es infinita
La funcioacuten (grosor g) devuelve el grosor del grafo g
-- | Ejemplos
-- gtgtgt grosor (creaGrafo [123] [(12)(23)])
-- Nothing
-- gtgtgt grosor (creaGrafo [123] [(11)(12)(23)(34)])
-- Just 0
-- gtgtgt grosor grafoPetersen
-- Just 5
-- gtgtgt grosor grafoMoebiusCantor
-- Just 6
-- gtgtgt grosor grafoHeawood
-- Just 6
-- gtgtgt grosor grafoMcGee
-- Just 7
-- gtgtgt grosor grafoTutteCoxeter
-- Just 8
grosor Ord a =gt Grafo a -gt Maybe Int
grosor g
| esAciclico g = Nothing
| otherwise = Just (minimum [longitudCamino (head yss)
| x lt- vertices g
let yss = todosCiclos g x
not (null yss)])
Propiedades del grosor de los grafos
Teorema 3810 El grosor del grafo ciclo de orden n Cn es infin si n lt 3 y 3 en caso contrario
La propiedad se expresa por
prop_grosor_grafoCiclo Int -gt Bool
prop_grosor_grafoCiclo n =
grosor (grafoCiclo n) == if n lt 3
then Nothing
else Just n
Su comprobacioacuten para n le 30 es
ghcigt all prop_grosor_grafoCiclo [130]
True
Teorema 3811 El grosor del grafo amistad de orden n es 3 para todo n
38 Conectividad de los grafos 105
prop_grosor_grafoAmistad Int -gt Bool
prop_grosor_grafoAmistad n =
grosor (grafoAmistad n) == Just 3
Su comprobacioacuten para n le 30 es
ghcigt all prop_grosor_grafoAmistad [130]
True
Teorema 3812 El grosor del grafo completo de orden n Kn es infin si n lt 3 y 3 en casocontrario
La propiedad se expresa por
prop_grosor_completo Int -gt Bool
prop_grosor_completo n =
grosor (completo n) == if n lt 3
then Nothing
else Just 3
Su comprobacioacuten para n le 30 es
ghcigt all prop_grosor_completo [130]
True
Teorema 3813 El grosor del grafo bipartito completo de orden Kmn es infin si m = 1 oacuten = 1 y es 4 en caso contrario y 3 en caso contrario
La propiedad se expresa por
prop_grosor_bipartitoCompleto Int -gt Int -gt Bool
prop_grosor_bipartitoCompleto m n =
grosor (bipartitoCompleto m n) == if m == 1 || n == 1
then Nothing
else Just 4
Su comprobacioacuten para 1 le m le n le 15 es
ghcigt and [prop_grosor_bipartitoCompleto m n | m lt- [115] n lt- [m15]]
True
Teorema 3814 El grosor del grafo rueda de orden n Wn es infin si n lt 3 y 3 en caso contrario
La propiedad se expresa por
prop_grosor_grafoRueda Int -gt Bool
prop_grosor_grafoRueda n =
grosor (grafoRueda n) == if n lt 3
then Nothing
else Just 3
106 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Su comprobacioacuten para 1 le n le 30 es
ghcigt all prop_grosor_grafoRueda [130]
True
389 Propiedades e invariantes por isomorfismos
Teorema 3815 Sean G = (V A) y Gprime = (Vprime Aprime) grafos isomorfos con φ V rarr Vprime unisomorfismo Entonces dados u v isin V u sim v si y solamente si φ(u) sim φ(v)
La comprobacioacuten del teorema con QuickCheck es
ghcigt quickCheck prop_ConexionIsomorfismo1
+++ OK passed 100 tests
prop_ConexionIsomorfismo1 Grafo Int -gt Grafo Int -gt Bool
prop_ConexionIsomorfismo1 g h =
not (isomorfos g h) ||
and [ec g u v == ec h (imagen phi u) (imagen phi v)
| u lt- vs
v lt- vs
phi lt- isomorfismos g h]
where vs = vertices g
ec = estanConectados
Teorema 3816 Sean G = (V A) y Gprime = (Vprime Aprime) grafos isomorfos con φ V rarr Vprime unisomorfismo Entonces φ lleva cada componente conexa de G en una componente conexa deGprime
La comprobacioacuten del teorema con QuickCheck es
ghcigt quickCheck prop_ConexionIsomorfismo2
+++ OK passed 100 tests
prop_ConexionIsomorfismo2 Grafo Int -gt Grafo Int -gt Bool
prop_ConexionIsomorfismo2 g h =
not(isomorfos g h) ||
and [conjuntosIguales cch (aux f) | f lt- isomorfismos g h]
where cch = componentesConexas h
ccg = componentesConexas g
aux f = map (sort imagenConjunto f) ccg
Teorema 3817 Sean G = (V A) y Gprime = (Vprime Aprime) grafos isomorfos con φ V rarr Vprime unisomorfismo Entonces G y Gprime tienen el mismo nuacutemero de componentes conexas
La comprobacioacuten del teorema con QuickCheck es
38 Conectividad de los grafos 107
ghcigt quickCheck prop_ConexionIsomorfismo3
+++ OK passed 100 tests
prop_ConexionIsomorfismo3 Grafo Int -gt Grafo Int -gt Bool
prop_ConexionIsomorfismo3 g h =
not (isomorfos g h) ||
numeroComponentes g == numeroComponentes h
Teorema 3818 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que el diaacutemetro de G es igual al diaacutemetro de Gprime es decir el diaacutemetrode un grafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos diametro)
+++ OK passed 100 tests
Teorema 3819 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces se verifica que el radio de G es igual al radio de Gprime es decir el radio de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos radio)
+++ OK passed 100 tests
Teorema 3820 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que el grosor de G es igual al grosor de Gprime es decir el grosor de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos grosor)
+++ OK passed 100 tests
Teorema 3821 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que el centro de G es igual al centro de Gprime es decir el centro de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos centro)
+++ OK passed 100 tests
Teorema 3822 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces se verifica que el nuacutemero de componentes conexas de G es igual al nuacutemerode las de Gprime es decir el nuacutemero de componentes conexas de un grafo es un invariante porisomorfismos
108 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos numeroComponentes)
+++ OK passed 100 tests
Teorema 3823 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que los valores que toman las excentricidades de los veacutertices G esigual al de los veacutertices de Gprime es decir el conjunto de valores que toman las excentricidadesde los veacutertices es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos excentricidades)
+++ OK passed 100 tests
Capiacutetulo 4
Matrices asociadas a grafos
En este capiacutetulo se definiraacuten algunas representaciones de grafos como matrices secomprobaraacuten sus propiedades y volveremos a definir algunos conceptos del capiacutetu-lo 3 ahora utilizando matricesPara elaborar el contenido del capiacutetulo utilizareacute el segundo tema del trabajo fin degrado de Fco Javier Franco Galviacuten Aspectos algebraicos en teoriacutea de grafos ([7]) En eltrabajo el autor introduce los conceptos de matriz de adyacencia matriz de incidenciay otras matrices asociadas a grafos
41 Generador de grafos simples
En esta seccioacuten presentaremos el generador de grafos que nos permitiraacute generargrafos simples como listas de aristas arbitrariamente y usarlos como ejemplos opara comprobar propiedades en la seccioacuten de matrices asociadas a grafos(grafoSimple) es un generador de grafos simples de hasta 10 veacutertices Por ejemplo
ghcigt sample grafoSimple
G [12345678] [(14)(15)(16)(17)(18)(23)
(24)(25)(27)(35)(37)(45)(46)(56)(67)]
G [123456789] [(14)(18)(23)(25)(29)
(34)(35)(36)(38)(39)(46)(48)(49)
(58)(59)(69)(78)]
G [123456] [(12)(13)(24)(25)(26)(35)(56)]
G [1234567] [(12)(13)(14)(24)(25)(26)
(36)(45)(46)(67)]
G [1234] [(13)(14)(23)(34)]
G [123] [(23)]
G [12] [(12)]
G [123456] [(16)(24)(26)(35)(36)(56)]
G [123456789] [(12)(14)(15)(16)(17)(24)
(34)(37)(38)(39)(45)(47)(49)(56)(57)
(58)(59)(67)(69)(78)(79)]
109
110 Capiacutetulo 4 Matrices asociadas a grafos
G [123456789] [(13)(14)(15)(16)(23)(24)
(29)(35)(39)(45)(47)(48)(49)(57)(58)
(59)(67)(68)(69)(79)]
G [1] []
grafoSimple Gen (Grafo Int)
grafoSimple = do
n lt- choose (010)
as lt- sublistOf [(xy) | x lt- [1n] y lt- [x+1n]]
return (creaGrafo [1n] as)
42 Matrices de adyacencia
421 Definicioacuten y propiedades
Usaremos la funcioacuten (imprimeMatriz p) para imprimir por pantalla la matriz p conuna fila por liacutenea
-- | Ejemplo
-- gtgtgt imprimeMatriz (fromLists [[134][357][479]])
-- [134]
-- [357]
-- [479]
imprimeMatriz Show a =gt Matrix a -gt IO ()
imprimeMatriz p =
mapM_ print (toLists p)
Definicioacuten 421 Sea G = (V A) un grafo simple con V = v1 vn Se define sumatriz de adyacencia como Antimesn = (aij) donde el elemento aij toma el valor 1 si existealguna arista en A uniendo los veacutertices vi y vj y 0 en caso contrario
Nota 421 La matriz de adyacencia depende del etiquetado del grafo
La funcioacuten (matrizAdyacencia g) es la matriz de adyacencia del grafo g
-- | Ejemplo
-- gtgtgt imprimeMatriz (matrizAdyacencia (grafoCiclo 4))
-- [0101]
-- [1010]
-- [0101]
-- [1010]
-- gtgtgt imprimeMatriz (matrizAdyacencia (completo 4))
-- [0111]
-- [1011]
-- [1101]
-- [1110]
42 Matrices de adyacencia 111
matrizAdyacencia Grafo Int -gt Matrix Int
matrizAdyacencia g = matrix n n f
where n = orden g
f (ij) | (ij) `aristaEn` g = 1
| otherwise = 0
422 Propiedades baacutesicas de las matrices
La funcioacuten (esSimetrica p) se verifica si la matriz p es simeacutetrica
-- ejemplo
-- gtgtgt esSimetrica (fromLists [[134][357][479]])
-- True
-- gtgtgt esSimetrica (fromLists [[134][357][497]])
-- False
esSimetrica Eq a =gt Matrix a -gt Bool
esSimetrica p =
transpose p == p
La funcioacuten (potencia p n) devuelvela potencia nndasheacutesima de la matriz cuadrada p
-- Ejemplo
-- gtgtgt potencia (fromLists [[134][357][479]]) 3
-- ( 408 735 975 )
-- ( 735 1323 1755 )
-- ( 975 1755 2328 )
potencia Num a =gt Matrix a -gt Int -gt Matrix a
potencia p 1 = p
potencia p n = if (odd n)
then (m p (potencia (m p p) (div (n-1) 2)))
else (potencia (m p p) (div (n-1) 2))
where m = multStd2
423 Propiedades de las matrices de adyacencia
Teorema 422 Para todo n la matriz de adyacencia del grafo ciclo de orden n Cn es simeacute-trica
ghcigt all prop_simetricaAdyacenciaCompleto [130]
True
prop_simetricaAdyacenciaCompleto Int -gt Bool
prop_simetricaAdyacenciaCompleto n =
esSimetrica (matrizAdyacencia (completo n))
La funcioacuten (tamantildeoM g) devuelve el tamantildeo del grafo simple g calculado usandosu matriz de adyacencia
112 Capiacutetulo 4 Matrices asociadas a grafos
-- | Ejemplos
-- gtgtgt tamantildeoM (grafoCiclo 4)
-- 4
-- gtgtgt tamantildeoM grafoPetersen
-- 15
tamantildeoM Grafo Int -gt Int
tamantildeoM g = sum (toList (matrizAdyacencia g)) `div` 2
Teorema 423 El tamantildeo de un grafo simple es la mitad de la suma de los elementos de sumatriz de adyacencia
La comprobacioacuten del teorema con QuickCheck es
ghcigt quickCheck prop_tamantildeoMatriz
+++ OK passed 100 tests
prop_tamantildeoMatriz Property
prop_tamantildeoMatriz =
forAll grafoSimple
(g -gt tamantildeo g == tamantildeoM g)
Teorema 424 Si un grafo G = (V A) tiene un veacutertice aislado vi tanto la fila como lacolumna indasheacutesima de su matriz de adyacencia estaraacuten formadas por ceros
esAisladoM Grafo Int -gt Int -gt Bool
esAisladoM g v = if (all (==0)
(((toLists (ma g)) (v-1))
++((toLists (t (ma g))) (v-1))))
then True
else False
where ma = matrizAdyacencia
t = transpose
La comprobacioacuten del teorema es
ghcigt quickCheck prop_esAisladoMatriz
+++ OK passed 100 tests
prop_esAisladoMatriz Property
prop_esAisladoMatriz =
forAll grafoSimple
(g -gt and [esAislado g v == esAisladoM g v
| v lt- vertices g])
Teorema 425 Sea un grafo G = (V A) simple no dirigido con V = v1 vn Lasuma de los elementos de la fila (o columna) indasheacutesima de su matriz de adyacencia coincide conel grado del veacutertice vi Es decir
42 Matrices de adyacencia 113
δ(vi) =n
sumj=1
aij =n
sumj=1
aji
gradoM Grafo Int -gt Int -gt Int
gradoM g v = sum ((toLists (ma g)) (v-1))
where ma = matrizAdyacencia
La comprobacioacuten del teorema es
ghcigt quickCheck prop_gradoMatriz
+++ OK passed 100 tests
prop_gradoMatriz Property
prop_gradoMatriz =
forAll grafoSimple
(g -gt and [grado g v == gradoM g v | v lt- vertices g])
Teorema 426 Sea G = (V A) un grafo bipartito de conjuntos de veacutertices disjuntosV1 = v1 vk y V2 = vk+1 vn tal que V = V1 cup V2 y soacutelo existen aristasque conectan veacutertices de V1 con veacutertices de V2 Entonces con este etiquetado de V la matrizde adyacencia de G tiene la forma
A =
(θ BBt θ
)
prop_BipartitoMatriz Grafo Int -gt Property
prop_BipartitoMatriz g =
esBipartito g ==gt
all (==0) [ getElem u v m | [uv] lt- (f (fromJust p))]
where f (xsys) = filter p (subsequences xs ++ subsequences ys)
where p zs = length zs == 2
p = conjuntosVerticesDisjuntos g
m = matrizAdyacencia g
424 Caminos y arcos
En esta seccioacuten se presentaraacute la informacioacuten que contiene la matriz de adyacenciade un grafo en relacioacuten a los caminos que se encuentran en eacutel
Teorema 427 Sea G = (V A) un grafo con V = v1 vn y matriz de adyacenciaA = (aij) Entonces forallk ge 0 el elemento (i j) de Ak que denotaremos por ak
ij es elnuacutemero de caminos de longitud k desde el veacutertice vi al veacutertice vj
114 Capiacutetulo 4 Matrices asociadas a grafos
numeroCaminosDeLongitudM Grafo Int -gt Int -gt Int -gt Int -gt Int
numeroCaminosDeLongitudM g u v k = getElem u v mk
where ma = matrizAdyacencia g
n = orden g
mk = foldr (multStd2) (identity n) (take k (repeat ma))
La comprobacioacuten del teorema para k le 6 es
ghcigt quickCheck prop_numeroCaminosMatriz
+++ OK passed 100 tests
prop_numeroCaminosMatriz Grafo Int -gt Gen Bool
prop_numeroCaminosMatriz g = do
k lt- choose (06)
let vs = vertices g
return (and [ numeroCaminosDeLongitud g u v k ==
numeroCaminosDeLongitudM g u v k
|(uv) lt- productoCartesiano vs vs u lt v])
De este teorema se deducen las siguientes propiedades
Teorema 428 Sea G un grafo simple Siguiendo la notacioacuten del teorema anterior se tieneque1 a(2)ii = δ(vi)
2 a(3)ii es el nuacutemero de triaacutengulos que contienen al veacutertice vi
gradoCaminosM Grafo Int -gt Int -gt Int
gradoCaminosM g v = getElem v v m2
where m = matrizAdyacencia g
m2 = multStd2 m m
numeroTriangulosM Grafo Int -gt Int -gt Int
numeroTriangulosM g v = getElem v v (potencia m 3)
where m = matrizAdyacencia g
La comprobacioacuten con QuickCheck es
ghcigt quickCheck prop_GradoCaminosMatriz
+++ OK passed 100 tests
ghcigt quickCheck prop_TriangulosMatriz
+++ OK passed 100 tests
prop_GradoCaminosMatriz Grafo Int -gt Bool
prop_GradoCaminosMatriz g =
and [ grado g v == gradoCaminosM g v | v lt- vertices g]
42 Matrices de adyacencia 115
prop_TriangulosMatriz Property
prop_TriangulosMatriz =
forAll grafoSimple
(g -gt and [length (triangulos g v) ==
numeroTriangulosM g v | v lt- vertices g])
116 Capiacutetulo 4 Matrices asociadas a grafos
Capiacutetulo 5
Apeacutendices
51 Sistemas utilizados
El desarrollo de mi Trabajo de Fin de Grado requeriacutea de una infraestructura teacutecnicaque he tenido que trabajar antes de comenzar a desarrollar el contenido A conti-nuacioacuten voy a nombrar y comentar los sistemas y paquetes que he utilizado a lolargo del proyectobull Ubuntu como sistema operativo El primer paso fue instalar Ubuntu en mi orde-
nador portaacutetil personal Para ello seguiacute las recomendaciones de mi compantildeeroEduardo Paluzo quien ya lo habiacutea hecho antesPrimero me descargueacute la imagen del sistema Ubuntu 1604 LTS (para procesadorde 64 bits) desde la paacutegina de descargas de Ubuntu 1 y tambieacuten la herramientaLinuxLive USB Creator 2 que transformariacutea mi pendrive en una unidad USB Boo-teable cargada con la imagen de Ubuntu Una vez tuve la unidad USB preparadaprocediacute a instalar el nuevo sistema apagueacute el dispositivo y al encenderlo entreacuteen el Boot Menu de la BIOS del portaacutetil para arrancar desde el Pendrive en vez dehacerlo desde el disco duro Automaacuteticamente comenzoacute la instalacioacuten de Ubuntuy solo tuve que seguir las instrucciones del asistente para montar Ubuntu mante-niendo ademaacutes Windows 10 que era el sistema operativo con el que habiacutea estadotrabajando hasta ese momentoEl resultado fue un poco agridulce pues la instalacioacuten de Ubuntu se habiacutea reali-zado con eacutexito sin embargo al intentar arrancar Windows desde la nueva GRUBme daba un error al cargar la imagen del sistema Despueacutes de buscar el error queme apareciacutea en varios foros encontreacute una solucioacuten a mi problema deshabiliteacute elSecurity Boot desde la BIOS y pude volver a arrancar Windows 10 con normali-dad
1httpwwwubuntucomdownloaddesktop2httpwwwlinuxliveusbcom
117
118 Capiacutetulo 5 Apeacutendices
bull LATEX como sistema de composicioacuten de textos La distribucioacuten de LATEXTex Livecomo la mayoriacutea de software que he utilizado la descargueacute utilizando el Gestorde Paquetes Synaptic Anteriormente soacutelo habiacutea utilizado TexMaker como editorde LATEX asiacute que fue el primero que descargueacute Maacutes tarde mi tutor Joseacute Antoniome sugirioacute que mejor descargara el paquete AUCTex pues me permitiriacutea trabajarcon archivos TEX desde el editor Emacs asiacute lo hice y es el que he utilizado pararedactar el trabajo Ademaacutes de los que me recomendaba el gestor solo he tenidoque descargarme el paquete spanish de babel para poder componer el trabajo puesel paquete Tikz que he utilizado para representar los grafos veniacutea incluido en lassugerencias de Synapticbull Haskell como lenguaje de programacioacuten Ya habiacutea trabajado anteriormente con
este lenguaje en el grado y sabiacutea que soacutelo teniacutea que descargarme la plataforma deHaskell y podriacutea trabajar con el editor Emacs Seguiacute las indicaciones que se dan alos estudiantes de primer curso en la paacutegina del Dpto de Ciencias de la Compu-tacioacuten e Inteligencia Artificial 3 y me descargueacute los paquetes haskell-platform yhaskell-mode desde el Gestor de Paquetes Synaptic La versioacuten de la plataforma deHaskell con la que he trabajado es la 2014200debian2 y la del compilador GHC la7103-7bull Dropbox como sistema de almacenamiento compartido Ya habiacutea trabajado con
Dropbox en el pasado asiacute que crear una carpeta compartida con mis tutores nofue ninguacuten problema sin embargo al estar Dropbox sujeto a software no libre nome resultoacute tan sencillo instalarlo en mi nuevo sistema En primer lugar intenteacutehacerlo directamente desde Ubuntu Software que intentoacute instalar Dropbox Nauti-lus y abrioacute dos instalaciones en paralelo Se quedoacute colgado el ordenador asiacute quemateacute los procesos de instalacioacuten activos reinicieacute el sistema y me descargueacute direc-tamente el paquete de instalacioacuten desde la paacutegina de descargas de Dropbox 4 y loejecuteacute desde la terminalbull Git como sistema remoto de control de versiones Era la primera vez que trabaja-
ba con Git y me costoacute bastante adaptarme Mi tutor Joseacute Antonio y mi compantildeeroEduardo Paluzo me ayudaron mucho e hicieron el proceso de adaptacioacuten muchomaacutes aacutegil El manual que Eduardo ha redactado y presenta en su Trabajo Fin deGrado me ha sido muy uacutetil es una pequentildea guiacutea que cualquier interesado en elempleo de Git puede utilizar como introduccioacuten La instalacioacuten no resultoacute com-plicada a traveacutes del Gestor de Paquetes Synaptic me descargueacute el paquete elpa-magity todos los demaacutes paquetes necesarios para trabajar con Git en mi portaacutetil usandoel editor Emacs Eduardo me ayudoacute a crear el repositorio MDenHaskell en la plata-forma GitHub y clonarlo en mi ordenador personal Dicho repositorio contiene el
3httpwwwcsuses~jalonsocursosi1m-15sistemasphp4httpswwwdropboxcomesinstallos=lnx
52 Mapa de decisiones de disentildeo en conjuntos 119
total del trabajo y se almacena de forma puacuteblica La versioacuten de Magit que utilizoes la 250-2
52 Mapa de decisiones de disentildeo en conjuntos
Una vez comenzado el trabajo y habiendo hecho ya varias secciones acerca de laTeoriacutea de Grafos se puso de manifiesto la conveniencia de crear nuevos capiacutetulosintroduciendo conceptos de la Teoriacutea de Conjuntos y las relaciones que se puedenpresentar entre sus elementosHaskell tiene una libreriacutea especiacutefica para conjuntos DataSet sin embargo no estan intuitiva ni tan eficiente como la de listas (DataList) A lo largo del proyecto hecreado un moacutedulo que permite trabajar con conjuntos utilizando tanto su represen-tacioacuten como listas ordenadas sin elementos repetidos como su representacioacuten comolistas sin elementos repetidos Dicho moacutedulo se llama Conjuntos y lo presento en elprimer capiacutetulo del Trabajo
53 Mapa de decisiones de disentildeo en grafos
Al comienzo del proyecto la idea era que las primeras representaciones con lasque trabajara fueran las de grafos como vectores de adyacencia y grafos como matricesde adyacencia que se utilizan en Informaacutetica en el primer curso del Grado con lasque ya habiacutea trabajado y estaba familiarizadaLas definiciones de Informaacutetica estaacuten pensadas para grafos ponderados (dirigidoso no seguacuten se eligiera) mientras que en Matemaacutetica Discreta apenas se usan grafosdirigidos o ponderados por tanto el primer cambio en la representacioacuten utilizadafue simplificar las definiciones de modo que solo trabajaacuteramos con grafos no diri-gidos y no ponderados pero manteniendo las estructuras vectorial y matricial quemanteniacutean la eficienciaLas representaciones que utilizan arrays en Haskell son muy restrictivas pues soloadmiten vectores y matrices que se puedan indexar lo que hace muy complicadostodos los algoritmos que impliquen alguacuten cambio en los veacutertices de los grafos yademaacutes no permite trabajar con todos los tipos de veacutertices que pudieacuteramos desearDecidimos volver a cambiar la representacioacuten y esta vez nos decantamos por larepresentacioacuten de grafos como listas de aristas perdiendo en eficiencia pero ganandomucho en flexibilidad de escrituraPor uacuteltimo mis tutores sugirieron dar una representacioacuten de los grafos mediantesus matrices de adyacencia y comprobar la equivalencia de las definiciones que yahabiacutea hecho en otros moacutedulos con las dadas para esta representacioacuten Para ello he
120 Capiacutetulo 5 Apeacutendices
trabajado con la libreriacutea DataMatrix de Haskell
Bibliografiacutea
[1] J Alonso Temas de programacioacuten funcional Technical report Univ de Sevilla2015
[2] P Burzyn Complejidad computacional en problemas de modificacioacuten de aris-tas en grafos Technical report Univ de Buenos Aires
[3] K Claessen and J Hughes QuickCheckA Lightweight Tool for Random Tes-ting of Haskell Programs Technical report Chalmers University of Technology2000
[4] M Caacuterdenas Matemaacutetica discreta Technical report Univ de Sevilla 2015
[5] D de Matemaacuteticas El regalo de Cantor Technical report IES Matarrantildea deValderrobres 2009
[6] D de Aacutelgebra Aacutelgebra Baacutesica tema 1 Conjuntos Technical report Univ deSevilla 2015
[7] F Franco Aspectos algebraicos en Teoriacutea de Grafos Technical report Univ deSevilla 2016
[8] F Rabhi and G Lapalme Algorithms A functional programming approachAddison-Wesley Longman Publishing Co Inc Boston MA USA 1st edition1999
[9] P Vasconcelos Property Testing using QuickCheck Technical report Univer-sidade do Porto 2016
[10] Wikipedia Set (mathematics) Technical report Wikipedia La Enciclopedialibre 2016
[11] Wikipedia AnexoGaleriacutea de grafos Technical report Wikipedia La Enciclo-pedia libre 2016
[12] Wikipedia Teoriacutea de la complejidad computacional Technical report Wikipe-dia La Enciclopedia libre 2017
121
Iacutendice alfabeacutetico
Grafo 18 52adyacentes 53antiImagenRelacion 38aristaEn 53aristasCamino 88aristas 53automorfismos 87bipartitoCompleto 58biyecciones 47cardinal 22 31centro 103clasesEquivalencia 43combinaciones 25 34complementario 22 31completo 58componentesConexas1 97componentesConexas2 98componentesConexas3 98conjuntosIguales 30conjuntosIguales 21conjuntosVerticesDisjuntos 59conservaAdyacencia 78creaGrafo 52diametro 102distancia 93dominio 38eliminaArista 74eliminaLazos 74eliminaVertice 74elimina 19 28entorno 69esAisladoM 112
esAislado 69esAntisimetrica 41esAutomorfismo 86esBipartito 60esCamino 87esCerrado 94esCircuito 95esCompleto 77esConexo 100esFuncional 39esFuncion 43esGeodesica 94esInyectiva 45esIsomorfismo 81esLazo 69esReflexiva 40esRegular 70esRelacionEquivalencia 42esRelacionHomogenea 39esRelacionOrden 43esRelacion 37esSimetrica 41 111esSimple 70esSobreyectiva 45 46esSubconjuntoPropio 21 30esSubconjunto 20 29esSubgrafoMax 72esSubgrafoPropio 72esSubgrafo 72esTransitiva 41esUnitario 23 32esVacio 18 27
122
Iacutendice alfabeacutetico 123
estaRelacionado 40estanConectados 93excentricidades 102excentricidad 102funciones 44generaGrafo 54gradoM 113 114grado 69grafoAmistad 57grafoCiclo 56grafoCirculante 61grafoComplementario 77grafoEstrella 60grafoHeawood 64grafoMcGee 64grafoMoebiusCantor 67grafoNulo 55grafoPetersenGen 62grafoPetersen 66grafoRueda 61grafoSimple 110grafoThomson 63grafoTutteCoxeter 65grosor 104imagenConjunto 45imagenInversa 47imagenRelacion 38imagen 44imprimeMatriz 110inserta 18 27interseccion 33interseccion 24inversa 47isomorfismos 82isomorfos 82longitudCamino 88matrizAdyacencia 110minimoElemento 19 28morfismos 79
numeroArcosDeLongitud 92numeroCaminosDeLongitud 89numeroCaminosDeLongitugM 113numeroComponentesConexas 99numeroTriangulosM 114orden 68parDeVertices 91pertenece 19 28potencia 111productoCartesiano 34productoCartesiano 25prop_HavelHakimi 73prop_LemaApretonDeManos 73prop_completos 76prop_BipartitoMatriz 113prop_ConectadosRelEqui 97prop_ConexionIsomorfismo1 106prop_ConexionIsomorfismo2 106prop_ConexionIsomorfismo3 107prop_GradoMatriz 114prop_TriangulosMatriz 114prop_esAisladoMatriz 112prop_gradoMatriz 113prop_numeroCaminosMatriz 114prop_simetricaAdyacenciaCompleto 111prop_tamantildeoMatriz 112prop_todosArcosBA 92radio 103rango 38secuenciaGrados 71secuenciaGrafica 71sinRepetidos 19 29sonIncidentes 68sumaArista 75sumaGrafos 76 77sumaVertice 75tamantildeoM 111tamantildeo 68todosArcosBA 91
124 Iacutendice alfabeacutetico
todosArcos 90todosCaminos 88todosCiclos 96triangulos 94unionConjuntos 23 32unionGeneral 24 33vacio 18 27valenciaMax 70valenciaMin 70variaciones 26 35verticesCamino 88vertices 53
8 Iacutendice general
Abstract
Discrete mathematics is characterized as the branch of mathematics dealing withfinite and numerable sets Concepts and notations from discrete mathematics are use-ful in studying and describing objects and real-life problems In particular the graphtheory has numerous applications in logistics
Throughout this project some of the knowlegde adquired from the course ldquoMa-temaacutetica Discretardquo will be given a computational implementation The code will bewritten in Haskell language and a free version of it will be available in GitHub underthe name MDenHaskell The work will focus on the graph theory and will provide so-me examples and algorithms in order to give an introduction of it and how it can beimplemented in Haskell
At first two chapters will be presented as a gentle reminder of basic concepts rela-ted to the set theory and the relations that can be established among them The thirdchapter will introduce the main topic graph theory with different representationsdefinitions and examples on graphs It will go through aspects such as morphismconnectivity and paths in graphs Finally some properties and advantages of workingwith adjacency matrices will be presented in the fourth chapter
This project leaves the door open for the community of programmers to continueand improve it It can be used as a self-learning tool as well as to make calculationsthat by hand would be tedious
9
10 Iacutendice general
Introduccioacuten
El objetivo del trabajo es la implementacioacuten de algoritmos de matemaacutetica discretaen Haskell Los puntos de partida son
los temas de la asignatura ldquoMatemaacutetica discretardquo ([4])los temas de la asignatura ldquoInformaacuteticardquo ([1])el capiacutetulo 7 del libro ldquoAlgorithms A functional programming approachrdquo ([8]) yel artiacuteculo ldquoGraph theoryrdquo ([11]) de la WikipediaHaskell es un lenguaje de programacioacuten funcional desarrollado en los uacuteltimos antildeos
por la comunidad de programadores con la intencioacuten de usarlo como instrumentopara la ensentildeanza de programacioacuten funcional La motivacioacuten de este desarrollo eshacer el anaacutelisis y disentildeo de programas maacutes simple y permitir que los algoritmos seanfaacutecilmente adaptables a otros lenguajes de programacioacuten funcionales
En comparacioacuten con otros lenguajes de programacioacuten imperativos la sintaxis deHaskell permite definir funciones de forma maacutes clara y compacta En Haskell las fun-ciones se consideran valores al mismo nivel que los tipos enteros o cadenas en cual-quier lenguaje Por ello al igual que es habitual que en todos los lenguajes una funcioacutenreciba datos de entrada (de tipo entero flotante cadena etc) y devuelva datos (de losmismos tipos) en los lenguajes funcionales una funcioacuten puede recibir como dato deentrada una funcioacuten y devolver otra funcioacuten como salida que puede ser construida apartir de sus entradas y por operaciones entre funciones como la composicioacuten Estacapacidad nos proporciona meacutetodos maacutes potentes para construir y combinar los di-versos moacutedulos de los que se compone un programa Por ejemplo emulando la formade operar sobre funciones que habitualmente se usa en matemaacuteticas
La matemaacutetica discreta consiste en el estudio de las propiedades de los conjuntosfinitos o infinitos numerables lo que hace posible su directa implementacioacuten compu-tacional En particular la asignatura ldquoMatemaacutetica Discretardquo del grado se centra enestudiar propiedades y algoritmos de la combinatoria y la teoriacutea de grafos A lo largodel trabajo se implementaraacuten en Haskell definiciones y algoritmos con los que ya seha tenido una primera aproximacioacuten teoacuterica durante el grado
Los dos primeros capiacutetulos del trabajo sientan la base que permitiraacute en los dos si-guientes una aproximacioacuten a la teoriacutea de grafos En el primero se hace una introduc-cioacuten a la teoriacutea de conjuntos y se dan dos posibles representaciones de conjuntos con
11
12 Iacutendice general
las que trabajar en Haskell En el segundo se presentan los conceptos de ldquorelacioacutenrdquo yde ldquofuncioacutenrdquo que al igual que los conjuntos son necesarios para definir aplicacionesde los grafos Su redaccioacuten sigue la liacutenea de la primera parte de la asignatura ldquoAacutelgebraBaacutesicardquo del grado
En el tercer capiacutetulo del trabajo se hace una introduccioacuten a la teoriacutea de grafos Enprimer lugar se dan una representacioacuten con la que trabajar en Haskell y un generadorde grafos que permitiraacute comprobar propiedades con QuickCheck Seguidamente sepresenta una galeriacutea de grafos conocidos que se utilizaraacuten como ejemplos para lasdefiniciones y los algoritmos de las secciones siguientes Las primeras seraacuten algunasdeficiones baacutesicas y despueacutes se trataraacuten los conceptos de ldquomorfismosrdquo ldquocaminosrdquo yldquoconectividadrdquo en grafos
Por uacuteltimo en el cuarto capiacutetulo se da una representacioacuten de los grafos a traveacutesde su matriz de adyacencia Se implementaraacuten algunos de los resultados que JavierFranco Galviacuten expuso en su Trabajo Fin de Grado Aspectos algebraicos en teoriacutea de grafosy se comprueba que concuerdan con el desarrollo hecho en el capiacutetulo anterior
Cabe destacar el trabajo con los diferentes sistemas y programas que se han utiliza-do a lo largo del proyecto
Ubuntu como sistema operativoel editor de textos Emacs que ha permitido el uso de Haskell literario para la redaccioacutendel trabajoel paquete de produccioacuten de graacuteficos vectoriales Tikz de LATEX mediante el que seha dado la representacioacuten graacutefica de los ejemplos de grafosGitHub como sistema remoto de control de versionesy DocTest como sistema de validacioacuten de moacutedulosSe va a hacer una breve introduccioacuten los sistemas maacutes destacados
Ubuntu
Ubuntu es un sistema operativo creado a partir de GNULinux con la intencioacuten dehacer una versioacuten de este maacutes sencilla de manejar y que permitiera acceso al soft-ware libre para todo el mundo por igual La primera distribuioacuten oficial de Ubuntufue la versioacuten 410 y tuvo lugar en 2004 Desde entonces el proyecto ha captadola atencioacuten de miles de entusiastas del software libre que han querido unirse a lacomunidad UbuntuSoftware libre significa que los usuarios tienen la libertad de ejecutar copiar distri-buir estudiar modificar y mejorar el software Es una cuestioacuten de libertad no deprecio Para entender el concepto debe pensarse en laquolibreraquo como en laquolibertad deexpresioacutenraquo
Iacutendice general 13
Maacutes precisamente software libre significa que los usuarios de un programa tienenlas cuatro libertades esencialesbull La libertad de ejecutar el programa como lo desee con cualquier propoacutesito (liber-
tad 0)bull La libertad de estudiar el funcionamiento del programa y adaptarlo a sus necesi-
dades (libertad 1) El acceso al coacutedigo fuente es un prerrequisito para estobull La libertad de redistribuir copias para ayudar a los demaacutes (libertad 2)bull La libertad de mejorar el programa y de publicar las mejoras de modo que toda la
comunidad se beneficie (libertad 3) El acceso al coacutedigo fuente es un prerrequisitopara esto
Debido a la evolucioacuten de la tecnologiacutea y del uso de la red estas libertades son ahoraauacuten maacutes importantes que en el pasadoLo que diferencia a Ubuntu de otros sistemas ofrecidos por Linux es que los equiposcomercial y comunitario colaboran juntos en el desarrollo de un uacutenico proyecto Lasnovedades y avances estaacuten libremente a disposicioacuten de todos los usuarios y sonvoluntarios quienes se hacen cargo de los elementos maacutes criacuteticos del trabajoEn la paacutegina web de Ubuntu 1 se puede obtener maacutes informacioacuten acerca del siste-ma y en la paacutegina web de GNU 2 se puede encontrar maacutes informacioacuten acerca delsoftware libre
Haskell literario con Emacs
Haskell es un lenguaje de programacioacuten puramente funcional basado en lambdacalculus 3 Se caracteriza por sus programas concisos un potente sistema de tiposel trabajo con listas funciones recursivas y de orden superior y por tener evaluacioacutenperezosaTener que escribir coacutedigos largos y complicados hace la tarea del programador muycostosa Los lenguajes de programacioacuten funcional como Haskell lo intentan hacenmaacutes sencillo Aunque no se esteacute en la posicioacuten de usar Haskell en un proyecto de-terminado aprender su razonamiento puede ayudar a mejorar en cualquier otrolenguajeA la hora de elaborar la memoria de un proyecto en el que se estaacute utilizando Haskellla posibilidad de escribir coacutedigo y texto en un formato de calidad otorga globali-dad al trabajo El editor Emacs de GNU permite en particular trabajar en paralelocon Haskell y con Latex El trabajar con Haskell literario ha ayudado a detectar ysolventar errores maacutes raacutepido asiacute como a dar una estructura consolidada al trabajo
1httpswwwubuntucom2httpswwwgnuorg3httpsenwikipediaorgwikiLambda_calculus
14 Iacutendice general
En la paacutegina web del Departamento de Computacioacuten 4 se puede encontrar maacutesinformacioacuten acerca de Haskell y Emacs
GitHub
GitHub es una plataforma de desarrollo colaborativo que permite alojar proyectosusando el control de versiones de Git El trabajo con un sistema como este hacemucho maacutes faacutecil el trabajo en grupo pues cada individuo puede trabajar desde suordenador propio en paralelo a los demaacutes y remotamente ir actualizando el proyectosin perder la posibilidad de restaurarlo a una versioacuten anteriorEn particular GitHub ha sido una excelente herramienta de control de este TrabajoFin de Grado pues los tutores han podido seguir en cada momento el trabajo rea-lizado detectar faacutecilmente los errores y hacer modificaciones directamente sobre eldocumentoEl compantildeero Eduardo Paluzo Hidalgo hace en su Trabajo Fin de Grado una pe-quentildea introduccioacuten al uso de Github y a la instalacioacuten de magit en una distribucioacutenUbuntu muy recomendable para todos aquellos (especialmente los maacutes principian-tes) que tengan intereacutes en trabajar con este sistemaSe puede encontrar maacutes informacioacuten acerca de esta plataforma en la paacutegina web deGit 5
DocTest
DocTest para Haskell es un programa de verificacioacuten dinaacutemica de ejemplos Si se si-gue un determinado formato a la hora de escribir los ejemplos para las funciones deun documento en Haskell Doctest se encarga de comprobar que los ejemplos seancorrectos Estas validaciones han resultado claves en la realizacioacuten del trabajo puesalgunas definiciones han sido modificadas de forma casi continua y este proyectoespecialmente se basa en lo anterior para poder seguir construyendoSu uso es muy sencillo una vez instalado el correspondiente paquete y escrito losejemplos en el formato requerido solo hay que ejecutar el programa desde la consoladando como argumento el fichero que se desea validarSe puede enontrar maacutes informaioacuten acerca del programa y de coacutemo descargarlo ensu repositorio de GitHub 6
4httpwwwcsuses~jalonsocursosi1m-16temastema-1html5httpsgit-scmcom6httpsgithubcomsoldoctest
Capiacutetulo 1
Conjuntos
El concepto de conjunto aparece en todos los campos de las Matemaacuteticas pero iquestqueacutedebe entenderse por eacutel La Teoriacutea de conjuntos fue introducida por Georg Cantor(1845-1917) desde 1869 Cantor ejercioacute como profesor en la Universidad de Halley entre 1879 y 1884 publicoacute una serie de seis artiacuteculos en el Mathematische Annalenen los que hizo una introduccioacuten baacutesica a la teoriacutea de conjuntos En su Beitraumlge zurBegruumlndung der transfiniten Mengenlehre Cantor dio la siguiente definicioacuten de con-junto
Figura 11 Fragmento del texto traducido al ingleacutes en el que Cantor da la definicioacuten de conjunto
laquoDebemos entender por ldquoconjuntordquo (Menge) cualquier coleccioacuten vista co-mo un todo (Zusammenfassung zu einem Ganzen) M de objetos separa-dos y bien definidos m de nuestra intuicioacuten o pensamiento Estos objetosson los ldquoelementosrdquo de Mraquo
Felix Hausdorff en 1914 dice laquoun conjunto es una reunioacuten de cosas que constitu-yen una totalidad es decir una nueva cosaraquo y antildeade laquoesto puede difiacutecilmente seruna definicioacuten pero sirve como demostracioacuten expresiva del concepto de conjunto atraveacutes de conjuntos sencillos como el conjunto de habitantes de una ciudad o el deaacutetomos de Hidroacutegeno del SolraquoUn conjunto asiacute definido no tiene que estar compuesto necesariamente de elementoshomogeacuteneos y ademaacutes da lugar a cuestiones filosoacuteficas como si podemos llamar
15
16 Capiacutetulo 1 Conjuntos
conjunto a aquel que no posee ninguacuten elemento Matemaacuteticamente conviene aceptarsolo elementos que compartan alguna propiedad y definir el conjunto vaciacuteo comoaquel que no tiene elemento algunoEl gran meacuterito de Cantor fue considerar conjuntos transfinitos (que tiene infinitoselementos) concepto inaudito hasta avanzado el siglo XIX hablar del cardinal de unconjunto como el nuacutemero de sus elementos y hablar de conjuntos equivalentes cuan-do puede establecerse una biyeccioacuten entre ellos ideas ya apuntadas por Bolzanoquien se centroacute demasiado en el aspecto filosoacutefico sin llegar a formalizar sus ideas
A lo largo de la seccioacuten haremos una pequentildea introduccioacuten a la Teoriacutea de Conjun-tos presentando formalmente sus conceptos maacutes importantes A la hora de elaborarel contenido se han utilizado los siguientes recursos bibliograacuteficosbull el primer tema de la asignatura ldquoAacutelgebra baacutesicardquo ([6])bull los temas de la asignatura ldquoInformaacuteticardquo ([1])bull el artiacuteculo de la Wikipedia ldquoSet (mathematics)rdquo ([10] ylowast el artiacuteculo ldquoEl regalo de Cantorrdquo ([5])
11 El TAD de los conjuntos
En la presente seccioacuten se definen las operaciones baacutesicas necesarias para trabajarcon conjuntos en un lenguaje funcional En nuestro caso el lenguaje que utilizare-mos seraacute Haskell Daremos la signatura del Tipo Abstracto de Dato (TAD) de losconjuntos y daremos algunos ejemplos de posibles representaciones de conjuntoscon las que podriacuteamos trabajarA continuacioacuten presentamos las operaciones definidas en el TAD de los conjuntos
vacio Conj a
inserta Eq a =gt a -gt Conj a -gt Conj a
elimina Eq a =gt a -gt Conj a -gt Conj a
pertenece Eq a =gt Conj a -gt a -gt Bool
esVacio Conj a -gt Bool
minimoElemento Ord a =gt Conj a -gt a
dondebull (vacio) es el conjunto vaciacuteobull (inserta x c) es el conjunto obtenido antildeadiendo el elemento x al conjunto cbull (elimina x c) es el conjunto obtenido eliminando el elemento x del conjunto cbull (pertenece x c) se verifica si x pertenece al conjunto cbull (esVacio c) se verifica si c no tiene ninguacuten elementobull (minimoElemento c) devuelve el miacutenimo elemento del conjunto c
12 Representaciones de conjuntos 17
Hemos de tener en cuenta que a la hora de crear un nuevo tipo de dato con el querepresentar a los conjuntos este debe ser compatible con la entidad matemaacutetica querepresenta
Estas son algunas de las posibles representaciones con las que podriacuteamos trabajarcon conjuntos en Haskellbull En primer lugar podemos trabajar con la libreriacutea DataSet en este caso la imple-
mentacioacuten del tipo de dato Set estaacute basado en aacuterboles binarios balanceadosbull Por otra parte podemos definir un nuevo tipo Cj xs con el que trabajar con con-
juntos como listas no ordenadas con duplicados como listas no ordenadas sinduplicados o como listas ordenadas sin duplicadosbull Otra opcioacuten seriacutea trabajar directamente con conjuntos como listas para ello de-
bemos ignorar las repeticiones y el orden con vista a la igualdad de conjuntosbull Los conjuntos que soacutelo contienen nuacutemeros (de tipo Int) entre 0 y nminus 1 se pueden
representar como nuacutemeros binarios con n bits donde el bit i(0 le i lt n) es 1 syssel nuacutemero i pertenece al conjunto
Nota 111 Las funciones que aparecen en la especificacioacuten del TAD no dependende la representacioacuten que elijamos
12 Representaciones de conjuntos
121 Conjuntos como listas ordenadas sin repeticioacuten
En el moacutedulo ConjuntosConListasOrdenadasSinRepeticion se definen las funcio-nes del TAD de los conjuntos dando su representacioacuten como listas ordenadas sinrepeticioacuten
module ConjuntosConListasOrdenadasSinRepeticion
( Conj
vacio
inserta
listaAConjunto
elimina
pertenece
esVacio
minimoElemento
sinRepetidos
esUnitario
esSubconjunto
conjuntosIguales
esSubconjuntoPropio
complementario
18 Capiacutetulo 1 Conjuntos
cardinal
unionConjuntos
unionGeneral
interseccion
productoCartesiano
combinaciones
variacionesR
) where
En las definiciones del presente moacutedulo se usaraacuten algunas funciones de la libreriacuteaDataList
Vamos a definir un nuevo tipo de dato (Conj a) que representa a los conjuntoscomo listas ordenadas sin repeticioacuten
type Conj a = [a]
Las funciones baacutesicas que definiremos a partir de este tipo coincidiraacuten con las indi-cadas en el TAD de los conjuntosbull (vacio) es el conjunto vaciacuteo
-- | Ejemplo
-- gtgtgt vacio
-- []
vacio Conj a
vacio = []
bull (inserta x c) es el conjunto obtenido antildeadiendo el elemento x al conjunto c
-- | Ejemplo
-- gtgtgt inserta 5 vacio
-- [5]
-- gtgtgt foldr inserta vacio [2211242]
-- [124]
inserta Ord a =gt a -gt Conj a -gt Conj a
inserta x [] = [x]
inserta x ys
| pertenece ys x = ys
| otherwise = insert x ys
bull (listaAConjunto xs) devuelve el conjunto cuyos elementos son los de la lista xs
-- | Ejemplo
-- gtgtgt listaAConjunto [2211242]
-- [124]
listaAConjunto Ord a =gt [a] -gt Conj a
listaAConjunto = sort nub
bull (esVacio c) se verifica si c es el conjunto vaciacuteo
12 Representaciones de conjuntos 19
-- | Ejemplos
-- gtgtgt esVacio (listaAConjunto [25137532190])
-- False
-- gtgtgt esVacio vacio
-- True
esVacio Conj a -gt Bool
esVacio = null
bull (pertenece x c) se verifica si x es un elemento del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt pertenece c1 3
-- True
-- gtgtgt pertenece c1 4
-- False
pertenece Ord a =gt Conj a -gt a -gt Bool
pertenece ys x =
x == head (dropWhile (ltx) ys)
bull (elimina x c) es el conjunto obtenido eliminando el elemento x del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt elimina 3 c1
-- [012579]
-- gtgtgt elimina 4 c1
-- [0123579]
elimina Ord a =gt a -gt Conj a -gt Conj a
elimina x ys = us ++ dropWhile (==x) vs
where (usvs) = span (ltx) ys
bull (minimoElemento c) devuelve el miacutenimo elemento del conjunto c
-- | Ejemplos
-- gtgtgt minimoElemento (listaAConjunto [25137532190])
-- 0
-- gtgtgt minimoElemento (listaAConjunto ([ae] ++ [AE]))
-- A
minimoElemento Ord a =gt Conj a -gt a
minimoElemento = head
122 Definicioacuten de conjunto
Nota 121 Al trabajar con la representacioacuten de conjuntos como listas en Haskellhemos de cuidar que los ejemplos con los que trabajemos no tengan elementos re-petidos La funcioacuten (sinRepetidos xs) se verifica si la lista xs no tiene ninguacuten ele-mento repetido
20 Capiacutetulo 1 Conjuntos
-- | Ejemplos
-- gtgtgt sinRepetidos []
-- True
-- gtgtgt sinRepetidos [1231]
-- False
sinRepetidos Eq a =gt [a] -gt Bool
sinRepetidos xs = nub xs == xs
Los conjuntos pueden definirse de manera expliacutecita citando todos sus elementosentre llaves de manera impliacutecita dando una o varias caracteriacutesticas que determi-nen si un objeto dado estaacute o no en el conjunto Por ejemplo los conjuntos 1 2 3 4y x isinN|1 le x le 4 son el mismo definido de forma explicita e impliacutecita respecti-vamente
Nota 122 La definicioacuten impliacutecita es necesaria cuando el conjunto en cuestioacuten tieneuna cantidad infinita de elementos En general los conjuntos se notaraacuten con letrasmayuacutesculas A B y los elementos con letras minuacutesculas a b
Cuando trabajamos con conjuntos concretos siempre existe un contexto donde esosconjuntos existen Por ejemplo si A = minus1 1 2 3 4 5 y B = x|x isin Nes par elcontexto donde podemos considerar A y B es el conjunto de los nuacutemeros enterosZ En general a este conjunto se le denomina conjunto universal De una forma algomaacutes precisa podemos dar la siguiente definicioacuten
Definicioacuten 121 El conjunto universal que notaremos por U es un conjunto del queson subconjuntos todos los posibles conjuntos que originan el problema que tratamos
123 Subconjuntos
Definicioacuten 122 Dados dos conjuntos A y B si todo elemento de A es a su vez elementode B diremos que A es un subconjunto de B y lo notaremos A sube B En caso contrario senotaraacute A 6sube B
La funcioacuten (esSubconjunto c1 c2) se verifica si c1 es un subconjunto de c2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
-- gtgtgt c1 `esSubconjunto` c2
-- True
-- gtgtgt c1 `esSubconjunto` vacio
-- False
-- gtgtgt vacio `esSubconjunto` c2
12 Representaciones de conjuntos 21
-- True
-- gtgtgt c3 `esSubconjunto` c4
-- True
-- gtgtgt c2 `esSubconjunto` c1
-- False
esSubconjunto Ord a =gt Conj a -gt Conj a -gt Bool
esSubconjunto [] _ = True
esSubconjunto (xxs) ys =
x == head vs ampamp esSubconjunto xs (tail vs)
where (usvs) = span (ltx) ys
124 Igualdad de conjuntos
Definicioacuten 123 Dados dos conjuntos A y B diremos que son iguales si tienen los mismoselementos es decir si se verifica que A sube B y B sube A Lo notaremos A = B
La funcioacuten (conjuntosIguales c1 c2) se verifica si los conjuntos xs y ys son igua-les
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
-- gtgtgt let c5 = listaAConjunto [4444442]
-- gtgtgt conjuntosIguales c1 c2
-- False
-- gtgtgt conjuntosIguales c3 c4
-- True
-- gtgtgt conjuntosIguales c1 c5
-- True
conjuntosIguales Ord a =gt Conj a -gt Conj a -gt Bool
conjuntosIguales = (==)
125 Subconjuntos propios
Definicioacuten 124 Los subconjuntos de A distintos del empty y del mismo A se denominansubconjuntos propios de A
La funcioacuten (esSubconjuntoPropio c1 c2) se verifica si c1 es un subconjunto pro-pio de c2
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt esSubconjuntoPropio u u
22 Capiacutetulo 1 Conjuntos
-- False
-- gtgtgt esSubconjuntoPropio c1 u
-- True
esSubconjuntoPropio Ord a =gt Conj a -gt Conj a -gt Bool
esSubconjuntoPropio c1 c2 =
not (null c1) ampamp esSubconjunto c1 c2 ampamp c1 = c2
126 Complementario de un conjunto
Definicioacuten 125 Dado un conjunto A se define el complementario de A que notaremospor A como
A = x|x isin U x 6isin A
La funcioacuten (complementario u c) devuelve el complementario del conjunto c y enel universo u
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt let c2 = listaAConjunto [14689]
-- gtgtgt complementario u c1
-- [14689]
-- gtgtgt complementario u u
-- []
-- gtgtgt complementario u vacio
-- [123456789]
-- gtgtgt complementario u c2
-- [2357]
complementario Ord a =gt Conj a -gt Conj a -gt Conj a
complementario [] _ = []
complementario xs [] = xs
complementario (xxs) (yys)
| x lt y = x complementario xs (yys)
| otherwise = complementario xs ys
127 Cardinal de un conjunto
Definicioacuten 126 Dado un conjunto finito A denominaremos cardinal de A al nuacutemero deelementos que tiene y lo notaremos |A|
La funcioacuten (cardinal xs) devuelve el cardinal del conjunto xs
-- | Ejemplos
-- gtgtgt cardinal vacio
-- 0
-- gtgtgt cardinal (listaAConjunto [110])
12 Representaciones de conjuntos 23
-- 10
-- gtgtgt cardinal (listaAConjunto chocolate)
-- 7
cardinal Ord a =gt Conj a -gt Int
cardinal = length
128 Conjunto unitario
Definicioacuten 127 Un conjunto con un uacutenico elemento se denomina unitario
Nota 123 Notemos que si X = x es un conjunto unitario debemos distinguirentre el conjunto X y el elemento x
La funcioacuten (esUnitario c) se verifica si el conjunto c es unitario
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto (take 10 (repeat 5))
-- gtgtgt let c2 = listaAConjunto valverde
-- gtgtgt let c3 = listaAConjunto coco
-- gtgtgt esUnitario c1
-- True
-- gtgtgt esUnitario c2
-- False
-- gtgtgt esUnitario c2
-- False
esUnitario Ord a =gt Conj a -gt Bool
esUnitario c =
c == take 1 c
129 Unioacuten de conjuntos
Definicioacuten 128 Dados dos conjuntos A y B se define la unioacuten de A y B notado A cup Bcomo el conjunto formado por aquellos elementos que pertenecen al menos a uno de los dosconjuntos A oacute B es decir
A cup B = x | x isin A or x isin B
La funcioacuten (unionConjuntos c1 c2) devuelve la unioacuten de los conjuntos xs y ys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [139]
-- gtgtgt let c2 = listaAConjunto [249]
-- gtgtgt unionConjuntos c1 c2
-- [123456789]
unionConjuntos Ord a =gt Conj a -gt Conj a -gt Conj a
unionConjuntos [] [] = []
24 Capiacutetulo 1 Conjuntos
unionConjuntos [] ys = ys
unionConjuntos xs [] = xs
unionConjuntos (xxs) (yys)
| x lt y = x unionConjuntos xs (yys)
| x == y = x unionConjuntos xs ys
| otherwise = y unionConjuntos (xxs) ys
Definicioacuten 129 Dada una familia de conjuntos Ai con i isin I se define la unioacuten ge-neral de los conjuntos Ai notado
⋃iisinI Ai como el conjunto formado por aquellos elementos
que pertenecen al menos a uno de los conjuntos de la familia es decir
⋃iisinI
Ai = x | x isin Ai foralli isin I
La funcioacuten (unionGeneral xss) devuelve la unioacuten general de la familia de conjun-tos de la lista xss
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1415]
-- gtgtgt let c2 = listaAConjunto [2515]
-- gtgtgt let c3 = listaAConjunto [3615]
-- gtgtgt unionGeneral [c1c2c3]
-- [123456789101112131415]
unionGeneral Ord a =gt [Conj a] -gt Conj a
unionGeneral = foldr unionConjuntos vacio
1210 Interseccioacuten de conjuntos
Definicioacuten 1210 Dados dos conjuntos A y B se define la interseccioacuten de A y B notadoA cap B como el conjunto formado por aquellos elementos que pertenecen a cada uno de losdos conjuntos A y B es decir
A cap B = x | x isin A and x isin B
La funcioacuten (interseccion c1 c2) devuelve la interseccioacuten de los conjuntos c1 yc2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1320]
-- gtgtgt let c2 = listaAConjunto [2420]
-- gtgtgt let c3 = listaAConjunto [2430]
-- gtgtgt let c4 = listaAConjunto [4830]
-- gtgtgt interseccion c1 c2
-- []
-- gtgtgt interseccion c3 c4
12 Representaciones de conjuntos 25
-- [481216202428]
interseccion Ord a =gt Conj a -gt Conj a -gt Conj a
interseccion (xxs) (yys)
| x lt y = interseccion xs (yys)
| x gt y = interseccion (xxs) ys
| otherwise = x interseccion xs ys
interseccion _ _ = []
1211 Producto cartesiano
Definicioacuten 1211 El producto cartesiano 1 de dos conjuntos A y B es una operacioacutensobre ellos que resulta en un nuevo conjunto Atimes B que contiene a todos los pares ordenadostales que la primera componente pertenece a A y la segunda pertenece a B es decir
Atimes B = (a b) | a isin A b isin B
La funcioacuten (productoCartesiano c1 c2) devuelve el producto cartesiano de xs eys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [31]
-- gtgtgt let c2 = listaAConjunto [247]
-- gtgtgt productoCartesiano c1 c2
-- [(12)(14)(17)(32)(34)(37)]
-- gtgtgt productoCartesiano c2 c1
-- [(21)(23)(41)(43)(71)(73)]
productoCartesiano (Ord a Ord b) =gt Conj a -gt Conj b -gt Conj (ab)
productoCartesiano xs ys=
listaAConjunto [(xy) | x lt- xs y lt- ys]
1212 Combinaciones
Definicioacuten 1212 Las combinaciones de un conjunto S tomados en grupos de n son todoslos subconjuntos de S con n elementos
La funcioacuten (combinaciones n xs) devuelve las combinaciones de los elementos dexs en listas de n elementos
-- | Ejemplos
-- gtgtgt combinaciones 3 [ad]
-- [abcabdacdbcd]
-- gtgtgt combinaciones 2 [248]
-- [[24][26][28][46][48][68]]
1httpsenwikipediaorgwikiCartesian_product
26 Capiacutetulo 1 Conjuntos
combinaciones Integer -gt [a] -gt [[a]]
combinaciones 0 _ = [[]]
combinaciones _ [] = []
combinaciones k (xxs) =
[xys | ys lt- combinaciones (k-1) xs] ++ combinaciones k xs
1213 Variaciones con repeticioacuten
Definicioacuten 1213 Las variaciones con repeticioacuten de m elementos tomados en grupos den es el nuacutemero de diferentes nndashtuplas de un conjunto de m elementos
La funcioacuten (variacionesR n xs) devuelve las variaciones con con repeticioacuten de loselementos de xs en listas de n elementos
-- | Ejemplos
-- gtgtgt variacionesR 3 [ab]
-- [aaaaababaabbbaababbbabbb]
-- gtgtgt variacionesR 2 [235]
-- [[22][23][25][32][33][35][52][53][55]]
variacionesR Int -gt [a] -gt [[a]]
variacionesR _ [] = [[]]
variacionesR 0 _ = [[]]
variacionesR k us =
[uvs | u lt- us vs lt- variacionesR (k-1) us]
1214 Conjuntos como listas sin repeticioacuten
En el moacutedulo ConjuntosConListas se definen las funciones del TAD de los conjun-tos dando su representacioacuten como listas sin elementos repetidos
module ConjuntosConListas
( Conj
vacio
inserta
listaAConjunto
elimina
pertenece
esVacio
minimoElemento
sinRepetidos
esUnitario
esSubconjunto
conjuntosIguales
esSubconjuntoPropio
complementario
cardinal
12 Representaciones de conjuntos 27
unionConjuntos
unionGeneral
interseccion
productoCartesiano
combinaciones
variacionesR
) where
En las definiciones del presente moacutedulo se usaraacuten algunas funciones de la libreriacuteaDataList
Vamos a definir un nuevo tipo de dato (Conj a) que representa a los conjuntoscomo listas sin elementos repetidos
type Conj a = [a]
Las funciones baacutesicas que definiremos a partir de este tipo coincidiraacuten con las indi-cadas en el TAD de los conjuntosbull (vacio) es el conjunto vaciacuteo
-- | Ejemplo
-- gtgtgt vacio
-- []
vacio Conj a
vacio = []
bull (inserta x c) es el conjunto obtenido antildeadiendo el elemento x al conjunto c
-- | Ejemplo
-- gtgtgt inserta 5 vacio
-- [5]
-- gtgtgt foldr inserta vacio [2211242]
-- [142]
inserta Eq a =gt a -gt Conj a -gt Conj a
inserta x [] = [x]
inserta x ys | elem x ys = ys
| otherwise = xys
bull (listaAConjunto xs) devuelve el conjunto cuyos elementos son los de la lista xs
-- | Ejemplo
-- gtgtgt listaAConjunto [2211242]
-- [214]
listaAConjunto Eq a =gt [a] -gt Conj a
listaAConjunto = nub
bull (esVacio c) se verifica si c es el conjunto vaciacuteo
-- | Ejemplos
-- gtgtgt esVacio (listaAConjunto [25137532190])
-- False
28 Capiacutetulo 1 Conjuntos
-- gtgtgt esVacio vacio
-- True
esVacio Conj a -gt Bool
esVacio = null
bull (pertenece x c) se verifica si x es un elemento del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt pertenece 3 c1
-- True
-- gtgtgt pertenece 4 c1
-- False
pertenece Eq a =gt a -gt Conj a -gt Bool
pertenece = elem
bull (elimina x c) es el conjunto obtenido eliminando el elemento x del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt elimina 3 c1
-- [251790]
-- gtgtgt elimina 4 c1
-- [2513790]
elimina Eq a =gt a -gt Conj a -gt Conj a
elimina = delete
bull (minimoElemento c) devuelve el miacutenimo elemento del conjunto c
-- | Ejemplos
-- gtgtgt minimoElemento (listaAConjunto [25137532190])
-- 0
-- gtgtgt minimoElemento (listaAConjunto ([ae] ++ [AE]))
-- A
minimoElemento Ord a =gt Conj a -gt a
minimoElemento = minimum
1215 Definicioacuten de conjunto
Definicioacuten 1214 Llamaremos conjunto a una coleccioacuten de objetos que llamaremos ele-mentos distintos entre siacute y que comparten una propiedad Para que un conjunto esteacute biendefinido debe ser posible discernir si un objeto arbitrario estaacute o no en eacutel
Si el elemento a pertenece al conjunto A escribiremos a isin A En caso contrarioescribiremos a 6isin A
Nota 124 En Haskell para poder discernir si un objeto arbitrario pertenece a unconjunto se necesita que su tipo pertenezca a la clase Eq
12 Representaciones de conjuntos 29
Nota 125 Al trabajar con la representacioacuten de conjuntos como listas en Haskellhemos de cuidar que los ejemplos con los que trabajemos no tengan elementos re-petidos La funcioacuten (sinRepetidos xs) se verifica si la lista xs no tiene ninguacuten ele-mento repetido
-- | Ejemplos
-- gtgtgt sinRepetidos []
-- True
-- gtgtgt sinRepetidos [1231]
-- False
sinRepetidos Eq a =gt [a] -gt Bool
sinRepetidos xs = nub xs == xs
Los conjuntos pueden definirse de manera expliacutecita citando todos sus elementosentre llaves de manera impliacutecita dando una o varias caracteriacutesticas que determi-nen si un objeto dado estaacute o no en el conjunto Por ejemplo los conjuntos 1 2 3 4y x isinN|1 le x le 4 son el mismo definido de forma explicita e impliacutecita respecti-vamente
Nota 126 La definicioacuten impliacutecita es necesaria cuando el conjunto en cuestioacuten tieneuna cantidad infinita de elementos En general los conjuntos se notaraacuten con letrasmayuacutesculas A B y los elementos con letras minuacutesculas a b
Cuando trabajamos con conjuntos concretos siempre existe un contexto donde esosconjuntos existen Por ejemplo si A = minus1 1 2 3 4 5 y B = x|x isin Nes par elcontexto donde podemos considerar A y B es el conjunto de los nuacutemeros enterosZ En general a este conjunto se le denomina conjunto universal De una forma algomaacutes precisa podemos dar la siguiente definicioacuten
Definicioacuten 1215 El conjunto universal que notaremos por U es un conjunto del queson subconjuntos todos los posibles conjuntos que originan el problema que tratamos
1216 Subconjuntos
Definicioacuten 1216 Dados dos conjuntos A y B si todo elemento de A es a su vez elementode B diremos que A es un subconjunto de B y lo notaremos A sube B En caso contrario senotaraacute A 6sube B
La funcioacuten (esSubconjunto c1 c2) se verifica si c1 es un subconjunto de c2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
30 Capiacutetulo 1 Conjuntos
-- gtgtgt c1 `esSubconjunto` c2
-- True
-- gtgtgt c1 `esSubconjunto` vacio
-- False
-- gtgtgt vacio `esSubconjunto` c2
-- True
-- gtgtgt c3 `esSubconjunto` c4
-- True
-- gtgtgt c2 `esSubconjunto` c1
-- False
esSubconjunto Eq a =gt [a] -gt [a] -gt Bool
esSubconjunto c1 c2 = all (`elem` c2) c1
1217 Igualdad de conjuntos
Definicioacuten 1217 Dados dos conjuntos A y B diremos que son iguales si tienen losmismos elementos es decir si se verifica que A sube B y B sube A Lo notaremos A = B
La funcioacuten (conjuntosIguales c1 c2) se verifica si los conjuntos xs y ys son igua-les
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
-- gtgtgt let c5 = listaAConjunto [4444442]
-- gtgtgt conjuntosIguales c1 c2
-- False
-- gtgtgt conjuntosIguales c3 c4
-- True
-- gtgtgt conjuntosIguales c1 c5
-- True
conjuntosIguales Eq a =gt [a] -gt [a] -gt Bool
conjuntosIguales c1 c2 =
esSubconjunto c1 c2 ampamp esSubconjunto c2 c1
1218 Subconjuntos propios
Definicioacuten 1218 Los subconjuntos de A distintos del empty y del mismo A se denominansubconjuntos propios de A
La funcioacuten (esSubconjuntoPropio c1 c2) se verifica si c1 es un subconjunto pro-pio de c2
12 Representaciones de conjuntos 31
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt esSubconjuntoPropio u u
-- False
-- gtgtgt esSubconjuntoPropio c1 u
-- True
esSubconjuntoPropio Eq a =gt [a] -gt [a] -gt Bool
esSubconjuntoPropio c1 c2
| null c1 = False
| conjuntosIguales c1 c2 = False
| otherwise = esSubconjunto c1 c2
1219 Complementario de un conjunto
Definicioacuten 1219 Dado un conjunto A se define el complementario de A que notaremospor A como
A = x|x isin U x 6isin A
La funcioacuten (complementario u c) devuelve el complementario del conjunto c y enel universo u
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt let c2 = listaAConjunto [14689]
-- gtgtgt complementario u c1
-- [14689]
-- gtgtgt complementario u u
-- []
-- gtgtgt complementario u vacio
-- [123456789]
-- gtgtgt complementario u c2
-- [2357]
complementario Eq a =gt [a] -gt [a] -gt [a]
complementario = ()
1220 Cardinal de un conjunto
Definicioacuten 1220 Dado un conjunto finito A denominaremos cardinal de A al nuacutemerode elementos que tiene y lo notaremos |A|
La funcioacuten (cardinal xs) devuelve el cardinal del conjunto xs
32 Capiacutetulo 1 Conjuntos
-- | Ejemplos
-- gtgtgt cardinal vacio
-- 0
-- gtgtgt cardinal (listaAConjunto [110])
-- 10
-- gtgtgt cardinal (listaAConjunto chocolate)
-- 7
cardinal [a] -gt Int
cardinal = length
1221 Conjunto unitario
Definicioacuten 1221 Un conjunto con un uacutenico elemento se denomina unitario
Nota 127 Notemos que si X = x es un conjunto unitario debemos distinguirentre el conjunto X y el elemento x
La funcioacuten (esUnitario c) se verifica si el conjunto c es unitario
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto (take 10 (repeat 5))
-- gtgtgt let c2 = listaAConjunto valverde
-- gtgtgt let c3 = listaAConjunto coco
-- gtgtgt esUnitario c1
-- True
-- gtgtgt esUnitario c2
-- False
-- gtgtgt esUnitario c2
-- False
esUnitario Eq a =gt [a] -gt Bool
esUnitario c = c == take 1 c
1222 Unioacuten de conjuntos
Definicioacuten 1222 Dados dos conjuntos A y B se define la unioacuten de A y B notado A cup Bcomo el conjunto formado por aquellos elementos que pertenecen al menos a uno de los dosconjuntos A oacute B es decir
A cup B = x | x isin A or x isin B
La funcioacuten (unionConjuntos c1 c2) devuelve la unioacuten de los conjuntos xs y ys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [139]
-- gtgtgt let c2 = listaAConjunto [249]
12 Representaciones de conjuntos 33
-- gtgtgt unionConjuntos c1 c2
-- [135792468]
unionConjuntos Eq a =gt [a] -gt [a] -gt [a]
unionConjuntos = union
Definicioacuten 1223 Dada una familia de conjuntos Ai con i isin I se define la unioacuten ge-neral de los conjuntos Ai notado
⋃iisinI Ai como el conjunto formado por aquellos elementos
que pertenecen al menos a uno de los conjuntos de la familia es decir
⋃iisinI
Ai = x | x isin Ai foralli isin I
La funcioacuten (unionGeneral xss) devuelve la unioacuten general de la familia de conjun-tos de la lista xss
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1415]
-- gtgtgt let c2 = listaAConjunto [2515]
-- gtgtgt let c3 = listaAConjunto [3615]
-- gtgtgt unionGeneral [c1c2c3]
-- [147101325811143691215]
unionGeneral Eq a =gt [[a]] -gt [a]
unionGeneral = foldr unionConjuntos []
1223 Interseccioacuten de conjuntos
Definicioacuten 1224 Dados dos conjuntos A y B se define la interseccioacuten de A y B notadoA cap B como el conjunto formado por aquellos elementos que pertenecen a cada uno de losdos conjuntos A y B es decir
A cap B = x | x isin A and x isin B
La funcioacuten (interseccion c1 c2) devuelve la interseccioacuten de los conjuntos c1 yc2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1320]
-- gtgtgt let c2 = listaAConjunto [2420]
-- gtgtgt let c3 = listaAConjunto [2430]
-- gtgtgt let c4 = listaAConjunto [4830]
-- gtgtgt interseccion c1 c2
-- []
-- gtgtgt interseccion c3 c4
-- [481216202428]
34 Capiacutetulo 1 Conjuntos
interseccion Eq a =gt [a] -gt [a] -gt [a]
interseccion = intersect
1224 Producto cartesiano
Definicioacuten 1225 El producto cartesiano 2 de dos conjuntos A y B es una operacioacutensobre ellos que resulta en un nuevo conjunto Atimes B que contiene a todos los pares ordenadostales que la primera componente pertenece a A y la segunda pertenece a B es decir
Atimes B = (a b) | a isin A b isin B
La funcioacuten (productoCartesiano c1 c2) devuelve el producto cartesiano de xs eys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [31]
-- gtgtgt let c2 = listaAConjunto [247]
-- gtgtgt productoCartesiano c1 c2
-- [(32)(34)(37)(12)(14)(17)]
-- gtgtgt productoCartesiano c2 c1
-- [(23)(21)(43)(41)(73)(71)]
productoCartesiano [a] -gt [b] -gt [(ab)]
productoCartesiano xs ys = [ (xy) | x lt- xs y lt- ys]
1225 Combinaciones
Definicioacuten 1226 Las combinaciones de un conjunto S tomados en grupos de n son todoslos subconjuntos de S con n elementos
La funcioacuten (combinaciones n xs) devuelve las combinaciones de los elementos dexs en listas de n elementos
-- | Ejemplos
-- gtgtgt combinaciones 3 [ad]
-- [abcabdacdbcd]
-- gtgtgt combinaciones 2 [248]
-- [[24][26][28][46][48][68]]
combinaciones Integer -gt [a] -gt [[a]]
combinaciones 0 _ = [[]]
combinaciones _ [] = []
combinaciones k (xxs) =
[xys | ys lt- combinaciones (k-1) xs] ++ combinaciones k xs
2httpsenwikipediaorgwikiCartesian_product
13 Eleccioacuten de la representacioacuten de conjuntos 35
1226 Variaciones con repeticioacuten
Definicioacuten 1227 Las variaciones con repeticioacuten de m elementos tomados en grupos den es el nuacutemero de diferentes nndashtuplas de un conjunto de m elementos
La funcioacuten (variacionesR n xs) devuelve las variaciones con con repeticioacuten de loselementos de xs en listas de n elementos
-- | Ejemplos
-- gtgtgt variacionesR 3 [ab]
-- [aaaaababaabbbaababbbabbb]
-- gtgtgt variacionesR 2 [235]
-- [[22][23][25][32][33][35][52][53][55]]
variacionesR Int -gt [a] -gt [[a]]
variacionesR _ [] = [[]]
variacionesR 0 _ = [[]]
variacionesR k us =
[uvs | u lt- us vs lt- variacionesR (k-1) us]
13 Eleccioacuten de la representacioacuten de conjuntos
Nota 131 En el moacutedulo Conjuntos se elige la representacioacuten de conjunto con la quese trabajaraacute
-- Seleccionar para trabajar con los conjuntos como listas sin
-- elementos repetidos
module Conjuntos
(module ConjuntosConListas)
where
import ConjuntosConListas
-- Seleccionar para trabajar con los conjuntos como listas ordenadas
-- sin elementos repetidos
-- module Conjuntos
-- (module ConjuntosConListasOrdenadasSinRepeticion)
-- where
-- import ConjuntosConListasOrdenadasSinRepeticion
36 Capiacutetulo 1 Conjuntos
Capiacutetulo 2
Relaciones y funciones
21 Relaciones
Las relaciones que existen entre personas nuacutemeros conjuntos y muchas otras enti-dades pueden formalizarse en la idea de relacioacuten binaria En esta seccioacuten se define ydesarrolla este concepto particularizando en el caso de las relaciones homogeacuteneasy en el de las funciones
211 Relacioacuten binaria
Definicioacuten 211 Una relacioacuten binaria 1 (o correspondencia) entre dos conjuntos A yB es un subconjunto del producto cartesiano Atimes B
La funcioacuten (esRelacion xs ys r) se verifica si r es una relacioacuten binaria de xs enys Por ejemplo
-- | Ejemplos
-- gtgtgt esRelacion [31] [247] [(12)(34)]
-- True
-- gtgtgt esRelacion [31] [247] [(12)(31)]
-- False
esRelacion (Ord a Ord b) =gt [a] -gt [b] -gt [(ab)] -gt Bool
esRelacion xs ys r =
r `esSubconjunto` productoCartesiano xs ys
212 Imagen por una relacioacuten
Definicioacuten 212 Si R es una relacioacuten binaria la imagen del elemento x en la relacioacuten Res el conjunto de los valores correspondientes a x en R
1httpsenwikipediaorgwikiBinary_relation
37
38 Capiacutetulo 2 Relaciones y funciones
La funcioacuten (imagenRelacion r x) es la imagen de x en la relacioacuten r
-- | Ejemplos
-- gtgtgt imagenRelacion [(13)(25)(14)] 1
-- [34]
-- gtgtgt imagenRelacion [(13)(25)(14)] 2
-- [5]
-- gtgtgt imagenRelacion [(13)(25)(14)] 3
-- []
imagenRelacion (Ord a Ord b) =gt [(ab)] -gt a -gt [b]
imagenRelacion r x =
nub [y | (zy) lt- r z == x]
213 Dominio de una relacioacuten
Definicioacuten 213 Dada una relacioacuten binaria R su dominio es el conjunto que contiene atodos los valores que se toman en la relacioacuten R
La funcioacuten (dominio r) devuelve el dominio de la relacioacuten r
-- | Ejemplo
-- gtgtgt dominio [(32)(51)(34)]
-- [35]
dominio Ord a =gt [(ab)] -gt [a]
dominio r = listaAConjunto (map fst r)
214 Rango de una relacioacuten
Definicioacuten 214 El rango de una relacioacuten binaria R es el conjunto de las imaacutegenes demediante R
La funcioacuten (rango r) devuelve el rango de la relacioacuten binaria r
-- | Ejemplo
-- gtgtgt rango [(32)(52)(34)]
-- [24]
rango Ord b =gt [(ab)] -gt [b]
rango r = listaAConjunto (map snd r)
215 Antiimagen por una relacioacuten
Definicioacuten 215 La antiimagen del elemento y por una relacioacuten r es el conjunto de loselementos cuya imagen es y
La (antiImagenRelacion r y) es la antiimagen del elemento y en la relacioacuten bina-ria r
22 Relaciones homogeacuteneas 39
-- | Ejemplo
-- gtgtgt antiImagenRelacion [(13)(23)(74)] 3
-- [12]
antiImagenRelacion (Ord a Ord b) =gt [(ab)] -gt b -gt [a]
antiImagenRelacion r y =
nub [x | (xz) lt- r z == y]
216 Relacioacuten funcional
Definicioacuten 216 Dada una relacioacuten binaria R se dice funcional si todos los elementos desu dominio tienen una uacutenica imagen en R
La funcioacuten (esFuncional r) se verifica si la relacioacuten r es funcional
-- | Ejemplos
-- gtgtgt esFuncional [(32)(51)(79)]
-- True
-- gtgtgt esFuncional [(32)(51)(34)]
-- False
-- gtgtgt esFuncional [(32)(51)(32)]
-- True
esFuncional (Ord a Ord b) =gt [(ab)] -gt Bool
esFuncional r =
and [esUnitario (imagenRelacion r x) | x lt- dominio r]
22 Relaciones homogeacuteneas
Para elaborar la presente seccioacuten se han consultado los apuntes de ldquoAacutelgebra baacutesicardquo([6]) asignatura del primer curso del Grado en Matemaacuteticas
Definicioacuten 221 Una relacioacuten binaria entre dos conjuntos A y B se dice que es homogeacute-nea si los conjuntos son iguales es decir si A = B Si el par (x y) isin AA estaacute en la relacioacutenhomogeacutenea R diremos que x estaacute Rndashrelacionado con y o relacionado con y por R Esto senotaraacute frecuentemente xRy (noacutetese que el orden es importante)
La funcioacuten (esRelacionHomogenea xs r) se verifica si r es una relacioacuten binaria ho-mogeacutenea en el conjunto xs
-- | Ejemplos
-- gtgtgt esRelacionHomogenea [14] [(12)(24)(34)(41)]
-- True
-- gtgtgt esRelacionHomogenea [14] [(12)(25)(34)(41)]
-- False
-- gtgtgt esRelacionHomogenea [14] [(12)(34)(41)]
40 Capiacutetulo 2 Relaciones y funciones
-- True
esRelacionHomogenea Ord a =gt [a] -gt [(aa)] -gt Bool
esRelacionHomogenea xs = esRelacion xs xs
Nota 221 El segundo argumento que recibe la funcioacuten ha de ser una lista de parescon ambas componentes del mismo tipo
La funcioacuten (estaRelacionado r x y) se verifica si x estaacute relacionado con y en larelacioacuten homogeacutenea r
-- | Ejemplos
-- gtgtgt estaRelacionado [(13)(25)(46)] 2 5
-- True
-- gtgtgt estaRelacionado [(13)(25)(46)] 2 3
-- False
estaRelacionado Ord a =gt [(aa)] -gt a -gt a -gt Bool
estaRelacionado r x y = (xy) `elem` r
221 Relaciones reflexivas
Definicioacuten 222 Sea R una relacioacuten binaria homogeacutenea en el conjunto A Diremos que Res reflexiva cuando todos los elementos de A estaacuten relacionados por R consigo mismos esdecir cuando forallx isin A se tiene que xRx
La funcioacuten (esReflexiva xs r) se verifica si la relacioacuten r en xs es reflexiva
-- | Ejemplos
-- gtgtgt esReflexiva [12] [(11)(12)(22)]
-- True
-- gtgtgt esReflexiva [12] [(11)(12)]
-- False
esReflexiva Ord a =gt [a] -gt [(aa)] -gt Bool
esReflexiva xs r = zip xs xs `esSubconjunto` r
Nota 222 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xSylarrrarr xminus y es parbull xTylarrrarr x divide a yson relaciones binarias homogeacuteneas reflexivas
222 Relaciones simeacutetricas
Definicioacuten 223 Diremos que una relacioacuten homogeacutenea R es simeacutetrica cuando
forall(x y) isin R minusrarr (y x) isin R
22 Relaciones homogeacuteneas 41
La funcioacuten (esSimetrica r) se verifica si la relacioacuten r es simeacutetrica
-- | Ejemplos
-- gtgtgt esSimetrica [(11)(12)(21)]
-- True
-- gtgtgt esSimetrica [(11)(12)(22)]
-- False
esSimetrica Ord a =gt [(aa)] -gt Bool
esSimetrica r =
listaAConjunto [(yx) | (xy) lt- r] `esSubconjunto` r
Nota 223 En el conjunto N la relacioacuten caracterizada por xSy larrrarr xminus y es par esuna relacioacuten binaria homogeacutenea simeacutetrica
223 Relaciones antisimeacutetricas
Definicioacuten 224 Sea R una relacioacuten binaria homogeacutenea en el conjunto A Diremos que Res antisimeacutetrica cuando
forall(x y)[(x y) isin R and (y x) isin R minusrarr x = y
La funcioacuten (esAntisimetrica r) se verifica si la relacioacuten r es antisimeacutetrica
-- | Ejemplos
-- gtgtgt esAntisimetrica [(12)(31)]
-- True
-- gtgtgt esAntisimetrica [(12)(21)]
-- False
esAntisimetrica Ord a =gt [(aa)] -gt Bool
esAntisimetrica r =
and [x == y | (xy) lt- r (yx) `elem` r]
Nota 224 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xTylarrrarr x divide a ybull xRylarrrarr x lt yson relaciones binarias homogeacuteneas antisimeacutetricas
224 Relaciones transitivas
Definicioacuten 225 Sea R una relacioacuten binaria homogeacutenea en el conjunto A Diremos que Res transitiva cuando forall(x y) (y z) isin R se tiene que xRy e yRz minusrarr xRz
La funcioacuten (esTransitiva r) se verifica si la relacioacuten r es transitiva
42 Capiacutetulo 2 Relaciones y funciones
-- | Ejemplos
-- gtgtgt esTransitiva [(12)(13)(23)]
-- True
-- gtgtgt esTransitiva [(12)(23)]
-- False
esTransitiva Ord a =gt [(aa)] -gt Bool
esTransitiva r =
listaAConjunto [(xz) | (xy) lt- r (wz) lt- r y == w]
`esSubconjunto` r
Nota 225 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xSylarrrarr xminus y es parbull xTylarrrarr x divide a ybull xRylarrrarr x lt yson relaciones binarias homogeacuteneas transitivas
225 Relaciones de equivalencia
Definicioacuten 226 Las relaciones homogeacuteneas que son a la vez reflexivas simeacutetricas y tran-sitivas se denominan relaciones de equivalencia
La funcioacuten (esRelacionEquivalencia xs r) se verifica si r es una relacioacuten de equi-valencia en xs-- | Ejemplos
-- gtgtgt esRelacionEquivalencia [13] [(11)(12)(21)(22)(33)]
-- True
-- gtgtgt esRelacionEquivalencia [13] [(12)(21)(22)(33)]
-- False
-- gtgtgt esRelacionEquivalencia [13] [(11)(12)(22)(33)]
-- False
esRelacionEquivalencia Ord a =gt [a] -gt [(aa)] -gt Bool
esRelacionEquivalencia xs r =
esReflexiva xs r ampamp
esSimetrica r ampamp
esTransitiva r
Nota 226 En el conjunto N la relacioacuten caracterizada por xSy larrrarr xminus y es par esuna relacioacuten de equivalencia
226 Relaciones de orden
Definicioacuten 227 Las relaciones homogeacuteneas que son a la vez reflexivas antisimeacutetricas ytransitivas se denominan relaciones de orden
23 Funciones 43
La funcioacuten (esRelacionOrden xs r) se verifica si r es una relacioacuten de orden en xs
-- | Ejemplo
-- gtgtgt esRelacionOrden [13] [(11)(12)(13)(22)(23)(33)]
-- True
esRelacionOrden Ord a =gt [a] -gt [(aa)] -gt Bool
esRelacionOrden xs r =
esReflexiva xs r ampamp
esAntisimetrica r ampamp
esTransitiva r
Nota 227 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xTylarrrarr x divide a yson relaciones de orden
227 Clases de equivalencia
Definicioacuten 228 Si R es una relacioacuten de equivalencia en A denominamos clase de equi-valencia de un elemento x isin A al conjunto de todos los elementos de A relacionados con xes decir x = R(x) = y isin A|xRy donde la primera notacioacuten se usa si la relacioacuten con laque se estaacute tratando se sobreentiende y la segunda si no es asiacute
La funcioacuten (clasesEquivalencia xs r) devuelve las clases de la relacioacuten de equi-valencia r en xs
-- | Ejemplo
-- gtgtgt let r = [(xy) | x lt- [15] y lt- [15] even (x-y)]
-- gtgtgt clasesEquivalencia [15] r
-- [[135][24]]
clasesEquivalencia Ord a =gt [a] -gt [(aa)] -gt [[a]]
clasesEquivalencia _ [] = []
clasesEquivalencia [] _ = []
clasesEquivalencia (xxs) r = (xc) clasesEquivalencia (xs c) r
where c = filter (estaRelacionado r x) xs
23 Funciones
Definicioacuten 231 Dada una relacioacuten F entre A y B se diraacute que es una funcioacuten si es unarelacioacuten binaria es funcional y todos los elementos de A estaacuten en el dominio
La funcioacuten (esFuncion xs ys f) se verifica si f es una funcioacuten de xs en ys
-- | Ejemplos
-- gtgtgt esFuncion [13] [247] [(17)(32)]
44 Capiacutetulo 2 Relaciones y funciones
-- True
-- gtgtgt esFuncion [13] [247] [(17)]
-- False
-- gtgtgt esFuncion [13] [247] [(14)(17)(32)]
-- False
esFuncion (Ord a Ord b) =gt [a] -gt [b] -gt [(ab)] -gt Bool
esFuncion xs ys f =
esRelacion xs ys f ampamp
xs `esSubconjunto` dominio f ampamp
esFuncional f
Nota 231 A lo largo de la seccioacuten representaremos a las funciones como listas depares
type Funcion a b = [(ab)]
La funcioacuten (funciones xs ys) devuelve todas las posibles funciones del conjuntoxs en ys
-- | Ejemplos
-- gtgtgt pp $ funciones [12] [34]
-- [[(1 3)(2 3)][(1 3)(2 4)][(1 4)(2 3)]
-- [(1 4)(2 4)]]
-- gtgtgt pp $ funciones [12] [345]
-- [[(1 3)(2 3)][(1 3)(2 4)][(1 3)(2 5)]
-- [(1 4)(2 3)][(1 4)(2 4)][(1 4)(2 5)]
-- [(1 5)(2 3)][(1 5)(2 4)][(1 5)(2 5)]]
-- gtgtgt pp $ funciones [012] [34]
-- [[(0 3)(1 3)(2 3)][(0 3)(1 3)(2 4)]
-- [(0 3)(1 4)(2 3)][(0 3)(1 4)(2 4)]
-- [(0 4)(1 3)(2 3)][(0 4)(1 3)(2 4)]
-- [(0 4)(1 4)(2 3)][(0 4)(1 4)(2 4)]]
funciones [a] -gt [b] -gt [Funcion a b]
funciones xs ys =
[zip xs zs | zs lt- variacionesR (length xs) ys]
231 Imagen por una funcioacuten
Definicioacuten 232 Si f es una funcioacuten entre A y B y x es un elemento del conjunto A laimagen del elemento x por la funcioacuten f es el valor asociado a x por la funcioacuten f
La funcioacuten (imagen f x) es la imagen del elemento x en la funcioacuten f
-- | Ejemplos
-- gtgtgt imagen [(17)(32)] 1
-- 7
-- gtgtgt imagen [(17)(32)] 3
23 Funciones 45
-- 2
imagen (Ord a Ord b) =gt Funcion a b -gt a -gt b
imagen f x = head (imagenRelacion f x)
La funcioacuten (imagenConjunto f xs) es la imagen del conjunto xs en la funcioacuten f
-- | Ejemplos
-- gtgtgt imagenConjunto [(17)(32)(43)] [14]
-- [73]
-- gtgtgt imagenConjunto [(17)(32)] [31]
-- [27]
imagenConjunto (Ord a Ord b) =gt Funcion a b -gt [a] -gt [b]
imagenConjunto f xs = nub (map (imagen f) xs)
232 Funciones inyectivas
Definicioacuten 233 Diremos que una funcioacuten f entre dos conjuntos es inyectiva 2 si a ele-mentos distintos del dominio le corresponden elementos distintos de la imagen es decir siforalla b isin dominio( f ) tales que a 6= b f (a) 6= f (b)
La funcioacuten (esInyectiva fs) se verifica si la funcioacuten fs es inyectiva
-- | Ejemplos
-- gtgtgt esInyectiva [(14)(25)(36)]
-- True
-- gtgtgt esInyectiva [(14)(25)(34)]
-- False
-- gtgtgt esInyectiva [(14)(25)(36)(36)]
-- True
esInyectiva (Ord a Ord b) =gt Funcion a b -gt Bool
esInyectiva f =
all esUnitario [antiImagenRelacion f y | y lt- rango f]
233 Funciones sobreyectivas
Definicioacuten 234 Diremos que una funcioacuten f entre dos conjuntos A y B es sobreyectiva3 si todos los elementos de B son imagen de alguacuten elemento de A
La funcioacuten (esSobreyectiva xs ys f) se verifica si la funcioacuten f es sobreyectiva Ala hora de definirla estamos contando con que f es una funcioacuten entre xs y ys
-- | Ejemplos
-- gtgtgt esSobreyectiva [123] [456] [(14)(25)(36)]
2httpsenwikipediaorgwikiInjective_function3httpsenwikipediaorgwikiSurjective_function
46 Capiacutetulo 2 Relaciones y funciones
-- True
-- gtgtgt esSobreyectiva [123] [456] [(14)(25)(34)]
-- False
-- gtgtgt esSobreyectiva [123] [456] [(14)(24)(36)(36)]
-- False
esSobreyectiva (Ord aOrd b) =gt [a] -gt [b] -gt Funcion a b -gt Bool
esSobreyectiva _ ys f = ys `esSubconjunto` rango f
234 Funciones biyectivas
Definicioacuten 235 Diremos que una funcioacuten f entre dos conjuntos A y B es biyectiva 4 sicada elementos de B es imagen de un uacutenico elemento de A
La funcioacuten (esBiyectiva xs ys f) se verifica si la funcioacuten f es biyectiva
-- | Ejemplos
-- gtgtgt esBiyectiva [123] [456] [(14)(25)(36)(36)]
-- True
-- gtgtgt esBiyectiva [123] [456] [(14)(25)(34)]
-- False
-- gtgtgt esBiyectiva [123] [4567] [(14)(25)(36)]
-- False
esBiyectiva (Ord a Ord b) =gt [a] -gt [b] -gt Funcion a b -gt Bool
esBiyectiva xs ys f =
esInyectiva f ampamp esSobreyectiva xs ys f
La funciones biyecciones1 xs ys y biyecciones2 xs ys devuelven la lista de to-das las biyecciones entre los conjuntos xs y ys La primera lo hace filtrando las fun-ciones entre los conjuntos que son biyectivas y la segunda lo hace construyendouacutenicamente las funciones biyectivas entre los conjuntos con el consecuente ahorrocomputacional
ghcigt length (biyecciones1 [17] [ag])
5040
(1675 secs 4146744104 bytes)
ghcigt length (biyecciones2 [17] [ag])
5040
(002 secs 0 bytes)
ghcigt length (biyecciones1 [16] [ag])
0
(253 secs 592625824 bytes)
ghcigt length (biyecciones2 [16] [ag])
0
(001 secs 0 bytes)
4httpsenwikipediaorgwikiBijective_function
23 Funciones 47
biyecciones1 (Ord a Ord b) =gt [a] -gt [b] -gt [Funcion a b]
biyecciones1 xs ys =
filter (esBiyectiva xs ys) (funciones xs ys)
biyecciones2 (Ord a Ord b) =gt [a] -gt [b] -gt [Funcion a b]
biyecciones2 xs ys
| length xs = length ys = []
| otherwise = [zip xs zs | zs lt- permutations ys]
Nota 232 En lo que sigue trabajaremos con la funcioacuten biyecciones2 asiacute que laredefiniremos como biyecciones
biyecciones (Ord a Ord b) =gt [a] -gt [b] -gt [Funcion a b]
biyecciones = biyecciones2
235 Inversa de una funcioacuten
Definicioacuten 236 Si f es una funcioacuten biyectiva entre los conjuntos A y B definimos lafuncioacuten inversa 5 como la funcioacuten que a cada elemento de B le hace corresponder el elementode A del que es imagen en B
El valor de (inversa f) es la funcioacuten inversa de f
-- | Ejemplos
-- gtgtgt inversa [(14)(25)(36)]
-- [(41)(52)(63)]
-- gtgtgt sort (inversa [(1f)(2m)(3a)])
-- [(a3)(f1)(m2)]
inversa (Ord a Ord b) =gt Funcion a b -gt Funcion b a
inversa f = listaAConjunto [(yx) | (xy) lt- f]
Nota 233 Para considerar la inversa de una funcioacuten esta tiene que ser biyectivaLuego (inversa f) asigna a cada elemento del conjunto imagen (que en este casocoincide con la imagen) uno y solo uno del conjunto de salida
La funcioacuten (imagenInversa f y) devuelve el elemento del conjunto de salida de lafuncioacuten f tal que su imagen es y
-- | Ejemplos
-- gtgtgt imagenInversa [(14)(25)(36)] 5
-- 2
-- gtgtgt imagenInversa [(1f)(2m)(3a)] a
-- 3
imagenInversa (Ord a Ord b) =gt Funcion a b -gt b -gt a
imagenInversa f = imagen (inversa f)
5httpsenwikipediaorgwikiInverse_function
48 Capiacutetulo 2 Relaciones y funciones
Capiacutetulo 3
Introduccioacuten a la teoriacutea de grafos
Se dice que la Teoriacutea de Grafos tiene su origen en 1736 cuando Euler dio una so-lucioacuten al problema (hasta entonces no resuelto) de los siete puentes de Koumlnigsbergiquestexiste un camino que atraviese cada uno de los puentes exactamente una vezPara probar que no era posible Euler sustituyoacute cada regioacuten por un nodo y cadapuente por una arista creando el primer grafo que fuera modelo de un problemamatemaacutetico
Figura 31 Dibujo de los puentes de Koumlnigsberg
A
B
C
D
b
c
a
d
f
e
g
Figura 32 Modelo de los puentes de Koumlnigsberg
Desde entonces se ha ido desarrollando esta metodologiacutea hasta convertise en los uacutel-timos antildeos en una herramienta importante en aacutereas del conocimiento muy variadascomo por ejemplo la Investigacioacuten Operativa la Computacioacuten la Ingenieriacutea Eleacutec-trica la Geografiacutea y la Quiacutemica Es por ello que ademaacutes se ha erigido como unanueva disciplina matemaacutetica que generalmente asociada a las ramas de Topologiacuteay AacutelgebraLa utilidad de los grafos se basa en su gran poder de abstraccioacuten y una representa-cioacuten muy clara de cualquier relacioacuten lo que facilita enormemente tanto la fase demodelado como la de resolucioacuten de cualquier problema Gracias a la Teoriacutea de Gra-fos se han desarrollado una gran variedad de algoritmos y meacutetodos de decisioacuten quepodemos implementar a traveacutes de lenguajes funcionales y permiten automatizar laresolucioacuten de muchos problemas a menudo tediosos de resolver a mano
49
50 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
31 Definicioacuten de grafo
En primer lugar vamos a introducir terminologiacutea baacutesica en el desarrollo de la Teoriacuteade Grafos
Definicioacuten 311 Un grafo G es un par (V A) donde V es el conjunto cuyos elementosllamamos veacutertices (o nodos) y A es un conjunto cuyos elementos llamamos aristas
Definicioacuten 312 Una arista de un grafo G = (V A) es un conjunto de dos elementosde V Es decir para dos veacutertices v vprime de G (v vprime) y (vprime v) representa la misma arista
Definicioacuten 313 Dado un grafo G = (V A) diremos que un veacutertice v isin V es adyacentea vprime isin V si (vprime v) isin A
Definicioacuten 314 Si en un grafo dirigido se permiten aristas repetidas lo llamaremos mul-tigrafo Si no se permiten lo llamaremos grafo regular
Nota 311 Denotaremos por |V| al nuacutemero de veacutertices y por |A| al nuacutemero de aristasdel grafo (V A)
Ejemplo 312 Sea G = (V A) un grafo con V = a b c d y A = (a b) (a c) (b d)(d d) En este grafo los veacutertices a d son adyacentes a b
a
b
c
d
32 El TAD de los grafos
En esta seccioacuten nos planteamos la tarea de implementar las definiciones presenta-das anteriormente en un lenguaje funcional En nuestro caso el lenguaje que utili-zaremos seraacute Haskell Definiremos el Tipo Abstracto de Dato (TAD) de los grafos ydaremos algunos ejemplos de posibles representaciones de grafos con las que po-dremos trabajarSi consideramos un grafo finito cualquiera G = (V A) podemos ordenar el conjun-to de los veacutertices y representarlo como V = v1 vn con n = |V|En primer lugar necesitaremos crear un tipo (Grafo) cuya definicioacuten sea compatiblecon la entidad matemaacutetica que representa y que nos permita definir las operacionesque necesitamos para trabajar con los grafos Estas operaciones son
32 El TAD de los grafos 51
creaGrafo -- [a] -gt [(aa)] -gt Grafo a
vertices -- Grafo a -gt [a]
adyacentes -- Grafo a -gt a -gt [a]
aristaEn -- (aa) -gt Grafo a -gt Bool
aristas -- Grafo a -gt [(aa)]
dondebull (creaGrafo vs as) es un grafo tal que el conjunto de sus veacutertices es vs y el de
sus aristas es asbull (vertices g) es la lista de todos los veacutertices del grafo gbull (adyacentes g v) es la lista de los veacutertices adyacentes al veacutertice v en el grafo gbull (aristaEn a g) se verifica si a es una arista del grafo gbull (aristas g) es la lista de las aristas del grafo g
Nota 321 Las funciones que aparecen en la especificacioacuten del TAD no dependende la representacioacuten que elijamos
Ejemplo 322 Veamos un ejemplo de creacioacuten de grafo y su representacioacuten graacutefica
creaGrafo [15] [(12)(13)(15)(24)
(25)(34)(35)(45)]
1
2
34
5
321 Grafos como listas de aristas
En el moacutedulo GrafoConListaDeAristas se definen las funciones del TAD de losgrafos dando su representacioacuten como conjuntos de aristas es decir representandoa un grafo como dos conjuntos la primera seraacute la lista ordenada de los veacutertices y lasegunda la lista ordenada de las aristas (en ambas listas se excluye la posibilidad derepeticiones)
Nota 323 Las ventajas de usar arrays frente a usar listas es que los array tienenacceso constante (O(1)) a sus elementos mientras que las listas tienen acceso lineal(O(n)) y que la actualizacioacuten de un elemento en un array no supone espacio extraSin embargo los arrays son representaciones muy riacutegidas cualquier modificacioacutenen su estructura como cambiar su tamantildeo supone un gran coste computacionalpues se tendriacutea que crear de nuevo el array y ademaacutes sus iacutendices deben pertenecer
52 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
a la clase de los objetos indexables (Ix) luego perdemos mucha flexibilidad en larepresentacioacuten
- LANGUAGE DeriveGeneric -
module GrafoConListaDeAristas
( Grafo
creaGrafo -- [a] -gt [(aa)] -gt Grafo a
vertices -- Grafo a -gt [a]
adyacentes -- Grafo a -gt a -gt [a]
aristaEn -- (aa) -gt Grafo a -gt Bool
aristas -- Grafo a -gt [(aa)]
) where
En las definiciones del presente moacutedulo se usaraacuten las funciones nub y sort de lalibreriacutea DataList
Vamos a definir un nuevo tipo de dato (Grafo a) que representaraacute un grafo a partirde la lista de sus veacutertices (donde los veacutertices son de tipo a) y de aristas (que son paresde veacutertices)
data Grafo a = G [a] [(aa)]
deriving (Eq Show Generic)
instance (Out a) =gt Out (Grafo a)
Las funciones baacutesicas que definiremos a partir de este tipo coincidiraacuten con las indi-cadas en el TAD de los grafosbull (creaGrafo vs as) es el grafo cuyo conjunto de veacutertices es cs y el de sus aristas
es as-- | Ejemplo
-- gtgtgt creaGrafo [15] [(12)(14)(15)(23)(25)(34)(35)]
-- G [12345] [(12)(14)(15)(23)(25)(34)(35)]
creaGrafo Ord a =gt [a] -gt [(aa)] -gt Grafo a
creaGrafo vs as =
G (sort vs) (nub (sort [parOrdenado a | a lt- as]))
parOrdenado Ord a =gt (aa) -gt (aa)
parOrdenado (xy) | x lt= y = (xy)
| otherwise = (yx)
Ejemplo 324 ejGrafo es el grafo
32 El TAD de los grafos 53
1
2
3
4
5
Los ejemplos usaraacuten el siguiente grafo
ejGrafo Grafo Int
ejGrafo = creaGrafo [15]
[(12)(14)(15)(23)(25)(34)(35)(45)]
bull (vertices g) es la lista de los veacutertices del grafo g
-- | Ejemplo
-- gtgtgt vertices ejGrafo
-- [12345]
vertices Grafo a -gt [a]
vertices (G vs _) = vs
bull (adyacentes g v) es la lista de los veacutertices adyacentes al veacutertice v en el grafo g
-- | Ejemplos
-- gtgtgt adyacentes ejGrafo 4
-- [135]
-- gtgtgt adyacentes ejGrafo 3
-- [245]
adyacentes Eq a =gt Grafo a -gt a -gt [a]
adyacentes (G _ as) v =
[u | (ux) lt- as x == v] `union` [u | (xu) lt- as x == v]
bull (aristaEn a g) se verifica si a es una arista del grafo g
-- | Ejemplos
-- gtgtgt (51) `aristaEn` ejGrafo
-- True
-- gtgtgt (31) `aristaEn` ejGrafo
-- False
aristaEn Ord a =gt (aa) -gt Grafo a -gt Bool
aristaEn a (G _ as) = parOrdenado a `elem` as
bull (aristas g) es la lista de las aristas del grafo g
-- | Ejemplo
-- gtgtgt aristas ejGrafo
-- [(12)(14)(15)(23)(25)(34)(35)(45)]
aristas Grafo a -gt [(aa)]
aristas (G _ as) = as
54 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
33 Generador de grafos
En esta seccioacuten presentaremos el generador de grafos que nos permitiraacute generargrafos como listas de aristas arbitrariamente y usarlos como ejemplos o para com-probar propiedadesPara aprender a controlar el tamantildeo de los grafos generados he consultado las si-guientes fuentes QuickCheck A Lightweight Tool for Random Testing of Haskell Programs 1
([3]) Property Testing using QuickCheck 2 ([9])(generaGrafos n) es un generador de grafos de hasta n veacutertices Por ejemplo
ghcigt sample (generaGrafo 5)
G [12] []
G [1] [(11)]
G [] []
G [1234] [(22)]
G [123] [(11)(12)(13)(22)]
G [12345] [(12)(14)(15)(22)(23)(24)(33)(34)(44)(45)]
G [1] []
G [123] [(12)(22)(33)]
G [1234] [(11)(14)(23)(24)(33)(34)(44)]
G [12] []
G [123] [(11)(12)(22)(33)]
ghcigt sample (generaGrafo 2)
G [12] [(12)(22)]
G [12] [(11)]
G [12] [(11)(12)]
G [] []
G [1] [(11)]
G [1] []
G [1] []
G [] []
G [] []
G [] []
G [1] [(11)]
generaGrafo Int -gt Gen (Grafo Int)
generaGrafo s = do
let m = s `mod` 11
n lt- choose (0m)
as lt- sublistOf [(xy) | x lt- [1n] y lt- [xn]]
return (creaGrafo [1n] as)
1httpswwweecsnorthwesternedu~robbycourses395-495-2009-fallquickpdf2httpswwwdccfcuppt~pbvaulastapfslidesquickcheckhtml
34 Ejemplos de grafos 55
Nota 331 Los grafos estaacuten contenidos en la clase de los objetos generables aleato-riamente
instance Arbitrary (Grafo Int) where
arbitrary = sized generaGrafo
En el siguiente ejemplo se pueden observar algunos grafos generados
ghcigt sample (arbitrary Gen (Grafo Int))
G [] []
G [1] [(11)]
G [12] [(11)(12)]
G [1] [(11)]
G [12345678] [(14)(17)(22)(23)(25)(28)(35)
(36)(38)(44)(46)(47)(48)(56)(66)(67)(78)]
G [12345] [(11)(12)(14)(15)(24)(25)(34)(55)]
G [] []
G [] []
G [123] [(11)(22)(23)]
G [1234] [(11)(12)(14)(22)(33)]
G [1234567] [(11)(15)(16)(17)(22)(24)(25)
(26)(27)(33)(35)(46)(47)(55)(57)(66)(77)]
34 Ejemplos de grafos
El objetivo de esta seccioacuten es reunir una coleccioacuten de grafos lo suficientemente ex-tensa y variada como para poder utilizarla como recurso a la hora de comprobar laspropiedades y definiciones de funciones que implementaremos maacutes adelanteEn el proceso de recopilacioacuten de ejemplos se ha trabajado con diversas fuentesbull los apuntes de la asignatura ldquoMatemaacutetica discretardquo ([4])bull los temas de la asignatura ldquoInformaacuteticardquo ([1]) ybull el artiacuteculo ldquoGraph theoryrdquo ([11]) de la Wikipedia
Nota 341 Se utilizaraacute la representacioacuten de los grafos como listas de aristas
341 Grafo nulo
Definicioacuten 341 Un grafo nulo es un grafo que no tiene ni veacutertices ni aristas
La funcioacuten (grafoNulo) devuelve un grafo nulo
grafoNulo Ord a =gt Grafo a
grafoNulo = creaGrafo [] []
La funcioacuten (esGrafoNulo g) se verifica si g es un grafo nulo
56 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- | Ejemplos
-- gtgtgt esGrafoNulo grafoNulo
-- True
-- gtgtgt esGrafoNulo (creaGrafo [] [(12)])
-- False
-- gtgtgt esGrafoNulo (creaGrafo [12] [(12)])
-- False
esGrafoNulo Grafo a -gt Bool
esGrafoNulo g =
null (vertices g) ampamp null (aristas g)
342 Grafo ciclo
Definicioacuten 342 Un ciclo 3 de orden n C(n) es un grafo no dirigido y no ponderadocuyo conjunto de veacutertices viene dado por V = 1 n y el de las aristas por A = (0 1)(1 2) (nminus 2 nminus 1) (nminus 1 0)
La funcioacuten (grafoCiclo n) nos genera el ciclo de orden n
1
23
45
-- | Ejemplos
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
grafoCiclo Int -gt Grafo Int
grafoCiclo 0 = grafoNulo
grafoCiclo 1 = creaGrafo [1] []
grafoCiclo n = creaGrafo [1n]
([(uu+1) | u lt- [1n-1]] ++ [(n1)])
343 Grafo de la amistad
Definicioacuten 343 Un grafo de la amistad 4 de orden n es un grafo con 2n + 1 veacuterticesy 3n aristas formado uniendo n copias del ciclo C3 por un veacutertice comuacuten Lo denotamos porFn3httpseswikipediaorgwikiGrafo_completo4httpseswikipediaorgwikiGrafo_de_la_amistad
34 Ejemplos de grafos 57
La funcioacuten (grafoAmistad n) genera el grafo de la amistad de orden n Por ejemplo
1
2
34
5
1
2
3
4
5
6
7
-- | Ejemplos
-- gtgtgt pp $ grafoAmistad 2
-- G [12345]
-- [(1 2)(1 3)(1 4)(1 5)(2 3)(4 5)]
-- gtgtgt pp $ grafoAmistad 3
-- G [1234567]
-- [(1 2)(1 3)(1 4)(1 5)(1 6)(1 7)(2 3)
-- (4 5)(6 7)]
grafoAmistad Int -gt Grafo Int
grafoAmistad n =
creaGrafo [12n+1]
([(1a) | a lt- [22n+1]] ++
[(ab) | (ab) lt-zip [242n] [352n+1]])
344 Grafo completo
Definicioacuten 344 El grafo completo 5 de orden n K(n) es un grafo no dirigido cuyoconjunto de veacutertices viene dado por V = 1 n y tiene una arista entre cada par deveacutertices distintos
La funcioacuten (completo n) nos genera el grafo completo de orden n Por ejemplo
5httpseswikipediaorgwikiGrafo_completo
58 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
1
2
3
4
-- | Ejemplo
-- gtgtgt completo 4
-- G [1234] [(12)(13)(14)(23)(24)(34)]
completo Int -gt Grafo Int
completo n =
creaGrafo [1n]
[(ab) | a lt- [1n] b lt- [1a-1]]
345 Grafo bipartito
Definicioacuten 345 Un grafo bipartito 6 es un grafo G = (V A) verificando que elconjunto de sus veacutertices se puede dividir en dos subconjuntos disjuntos V1 V2 tales queV1 cupV2 = V de manera que forallu1 u2 isin V1[(u1 u2) 6isin A] y forallv1 v2 isin V2[(v1 v2) 6isin A]Un grafo bipartito completo 7 seraacute entonces un grafo bipartito G = (V1 cup V2 A) en elque todos los veacutertices de una particioacuten estaacuten conectados a los de la otra Si n = |V1| m =
|V2| denotamos al grafo bipartito G = (V1 cupV2 A) por Knm
La funcioacuten (bipartitoCompleto n m) nos genera el grafo bipartito Knm Por ejem-plo
1 2
3 4 5
-- | Ejemplo
-- gtgtgt bipartitoCompleto 2 3
-- G [12345] [(13)(14)(15)(23)(24)(25)]
bipartitoCompleto Int -gt Int -gt Grafo Int
bipartitoCompleto n m =
creaGrafo [1n+m]
[(ab) | a lt- [1n] b lt- [n+1n+m]]
6httpseswikipediaorgwikiGrafo_bipartito7httpseswikipediaorgwikiGrafo_bipartito_completo
34 Ejemplos de grafos 59
La funcioacuten (conjuntosVerticesDisjuntos g) devuelve Nothing si el grafo g no esbipartito y Just(xsys) si lo es donde xs ys es una particioacuten disjunta de los veacuterticesde g
-- | Ejemplo
-- gtgtgt conjuntosVerticesDisjuntos (bipartitoCompleto 3 4)
-- Just ([321][7654])
-- gtgtgt conjuntosVerticesDisjuntos (grafoCiclo 5)
-- Nothing
-- gtgtgt conjuntosVerticesDisjuntos (grafoCiclo 6)
-- Just ([531][642])
conjuntosVerticesDisjuntos Ord a =gt Grafo a -gt Maybe ([a][a])
conjuntosVerticesDisjuntos g
| null (vertices g) = Just ([][])
| otherwise = aux (vertices g) [] [] [] []
where u = union
a = adyacentes g
d xs x = xs [x]
aux [] _ _ r b = if (null (intersect r b))
then (Just (rb))
else Nothing
aux (vvs) [] [] [] [] = aux vs (a v) [v] [v] []
aux (vvs) [] c r b
| null (a v) = aux vs [] (vc) (vr) b
| null ((a v) c) =
if (or [elem u r | u lt- (a v)])
then (if (or [elem u b | u lt- (a v)])
then Nothing
else (aux vs [] (vc) r (vb)))
else (aux vs [] (vc) (vr) b)
| otherwise =
if (or [elem u r | u lt- (a v)])
then (if (or [elem u b | u lt- (a v)])
then Nothing
else (aux vs ((a v) c) (vc) r (vb)))
else (aux vs ((a v) c) (vc) (vr) b)
aux vs (qqs) c r b
| null ((a q) c) =
if (or [elem u r | u lt- (a q)])
then (if (or [elem u b | u lt- (a q)])
then Nothing
else (aux (d vs q) qs (qc) r (qb)))
else (aux (d vs q) qs (qc) (qr) b)
| otherwise =
if (or [elem u r | u lt- (a q)])
then (if (or [elem u b | u lt- (a q)])
then Nothing
else (aux (d vs q) (u ((a q) c) qs)
60 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
(qc) r (qb)))
else (aux (d vs q) (u ((a q) c) qs)
(qc) (qr) b)
La funcioacuten (esBipartito g) se verifica si el grafo g es bipartito
-- | Ejemplo
-- gtgtgt esBipartito (bipartitoCompleto 3 4)
-- True
-- gtgtgt esBipartito (grafoCiclo 5)
-- False
-- gtgtgt esBipartito (grafoCiclo 6)
-- True
esBipartito Ord a =gt Grafo a -gt Bool
esBipartito g = isJust (conjuntosVerticesDisjuntos g)
346 Grafo estrella
Definicioacuten 346 Una estrella 8 de orden n es el grafo bipartito completo K1n Denota-remos a una estrella de orden n por Sn Una estrella con 3 aristas se conoce en ingleacutes comoclaw (garra o garfio)
La funcioacuten (grafoEstrella n) crea un grafo circulante a partir de su orden n
2
34
56
1
-- | Ejemplo
-- gtgtgt grafoEstrella 5
-- G [123456] [(12)(13)(14)(15)(16)]
grafoEstrella Int -gt Grafo Int
grafoEstrella = bipartitoCompleto 1
347 Grafo rueda
Definicioacuten 347 Un grafo rueda 9 de orden n es un grafo no dirigido y no ponderado conn veacutertices que se forma conectando un uacutenico veacutertice a todos los veacutertices de un ciclo Cnminus1 Lodenotaremos por Wn8httpsenwikipediaorgwikiStar_(graph_theory))9httpseswikipediaorgwikiGrafo_rueda
34 Ejemplos de grafos 61
La funcioacuten (grafoRueda n) crea un grafo rueda a partir de su orden n
2
34
56
1
-- | Ejemplo
-- gtgtgt pp $ grafoRueda 6
-- G [123456]
-- [(1 2)(1 3)(1 4)(1 5)(1 6)(2 3)(2 6)
-- (3 4)(4 5)(5 6)]
grafoRueda Int -gt Grafo Int
grafoRueda n =
creaGrafo [1n]
([(1a) | a lt- [2n]] ++
[(ab) | (ab) lt- zip (2[2n-1]) (3n[4n])])
348 Grafo circulante
Definicioacuten 348 Un grafo circulante 10 de orden n ge 3 y saltos s1 sk es un grafono dirigido y no ponderado G = (1 n A) en el que cada nodo foralli isin V es adyacente alos 2k nodos iplusmn s1 iplusmn sk mod n Lo denotaremos por Cirs1sk
n
La funcioacuten (grafoCirculante n ss) crea un grafo circulante a partir de su orden n
y de la lista de sus saltos ss Por ejemplo
2
34
5
6 1
-- | Ejemplo
-- gtgtgt pp $ grafoCirculante 6 [12]
-- G [123456]
-- [(1 2)(1 3)(1 5)(1 6)(2 3)(2 4)(2 6)
-- (3 4)(3 5)(4 5)(4 6)(5 6)]
grafoCirculante Int -gt [Int] -gt Grafo Int
grafoCirculante n ss =
10httpsenwikipediaorgwikiCirculant_graph
62 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
creaGrafo [1n]
[(ab) | a lt- [1n]
b lt- sort (auxCir a ss n)
a lt b]
where auxCir v ss1 k =
concat [[fun (v+s) k fun (v-s) k] | s lt- ss1]
fun a b = if mod a b == 0 then b else mod a b
349 Grafo de Petersen generalizado
El grafo de Petersen generalizado 11 que denotaremos GPnk (con n ge 3 y 1 le k le(nminus 1)2) es un grafo formado por un grafo circulante Cirn
k en el interior rodeadopor un ciclo Cn al que estaacute conectado por una arista saliendo de cada veacutertice deforma que se creen n poliacutegonos regulares El grafo GPnk tiene 2n veacutertices y 3n aristasLa funcioacuten (grafoPetersenGen n k) devuelve el grafo de Petersen generalizadoGPnk
1
2
3
4
5
6
7
8
-- | Ejemplo
-- gtgtgt pp $ grafoPetersenGen 4 2
-- G [12345678]
-- [(1 3)(1 5)(2 4)(2 6)(3 7)(4 8)(5 6)
-- (5 8)(6 7)(7 8)]
grafoPetersenGen Int -gt Int -gt Grafo Int
grafoPetersenGen n k =
creaGrafo [12n]
(filter p (aristas (grafoCirculante n [k])) ++
[(xx+n) | x lt- [1n]] ++
(n+1n+2) (n+12n) [(xx+1) | x lt- [n+22n-1]])
where p (ab) = a lt b
11httpsenwikipediaorgwikiGeneralized_Petersen_graph
34 Ejemplos de grafos 63
3410 Otros grafos importantes
Grafo de Thomson
Definicioacuten 349 El grafo bipartito completo K33 es conocido como el grafo de Thomsony como veremos maacutes adelante seraacute clave a la hora de analizar propiedades topoloacutegicas de losgrafos
1 2 3
4 5 6
La funcioacuten (grafoThomson) genera el grafo de Thomson
-- | Ejemplo
-- gtgtgt pp $ grafoThomson
-- G [123456]
-- [(1 4)(1 5)(1 6)(2 4)(2 5)(2 6)(3 4)
-- (3 5)(3 6)]
grafoThomson Grafo Int
grafoThomson = bipartitoCompleto 3 3
Grafo de Heawood
El grafo de Heawood 12 es un grafo no dirigido regular con 14 veacutertices y 21 aris-tas Todos sus veacutertices son incidentes a exactamente 3 aristas es decir es un grafocuacutebico Tiene importantes propiedades geomeacutetricas y topoloacutegicas
1
2
3
45
6
7
8
9
10
11 12
13
14
12httpsenwikipediaorgwikiHeawood_graph
64 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten grafoHeawood genera el grafo de Heawood
-- | Ejemplo
-- gtgtgt pp $ grafoHeawood
-- G [1234567891011121314]
-- [(1 2)(1 6)(1 14)(2 3)(2 11)(3 4)(3 8)
-- (4 5)(4 13)(5 6)(5 10)(6 7)(7 8)(7 12)
-- (8 9)(9 10)(9 14)(10 11)(11 12)(12 13)
-- (13 14)]
grafoHeawood Grafo Int
grafoHeawood =
creaGrafo [114]
(aristas (grafoCiclo 14) ++
zip [1 23 4 5 7 9]
[611813101214])
Grafo de McGee
El grafo de McGee 13 es un grafo no dirigido cuacutebico con 24 veacutertices y 36 aristasTiene importantes propiedades geomeacutetricas y topoloacutegicas
1
2
3
45
6789
10
11
12
13
14
15
1617
18 19 2021
22
23
24
La funcioacuten grafoMcGee genera el grafo de McGee
-- | Ejemplo
-- gtgtgt pp $ grafoMcGee
-- G [12345678910111213141516171819
-- 2021222324]
-- [(1 2)(1 13)(1 24)(2 3)(2 9)(3 4)(3 20)
13httpsenwikipediaorgwikiMcGee_graph
34 Ejemplos de grafos 65
-- (4 5)(4 16)(5 6)(5 12)(6 7)(6 23)(7 8)
-- (7 19)(8 9)(8 15)(9 10)(10 11)(10 22)
-- (11 12)(11 18)(12 13)(13 14)(14 15)
-- (14 21)(15 16)(16 17)(17 18)(17 24)
-- (18 19)(19 20)(20 21)(21 22)(22 23)
-- (23 24)]
grafoMcGee Grafo Int
grafoMcGee =
creaGrafo [124]
(aristas (grafoCiclo 24) ++
zip [ 12 3 4 5 6 7 810111417]
[13920161223191522182124])
Grafo TuttendashCoxeter
El grafo TuttendashCoxeter 14 es un grafo no dirigido cuacutebico con 30 veacutertices y 45 aristasTiene importantes propiedades geomeacutetricas y topoloacutegicas
1
2
3
4
56
7891011
12
13
14
15
16
17
18
19
2021
22 23 24 2526
27
28
29
30
La funcioacuten grafoTutteCoxeter genera el grafo TuttendashCoxeter
-- | Ejemplo
-- gtgtgt pp $ grafoTutteCoxeter
-- G [12345678910111213141516171819
-- 2021222324252627282930]
14httpsenwikipediaorgwikiTutteT1textendashCoxeter_graph
66 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- [(1 2)(1 18)(1 30)(2 3)(2 23)(3 4)
-- (3 10)(4 5)(4 27)(5 6)(5 14)(6 7)(6 19)
-- (7 8)(7 24)(8 9)(8 29)(9 10)(9 16)
-- (10 11)(11 12)(11 20)(12 13)(12 25)
-- (13 14)(13 30)(14 15)(15 16)(15 22)
-- (16 17)(17 18)(17 26)(18 19)(19 20)
-- (20 21)(21 22)(21 28)(22 23)(23 24)
-- (24 25)(25 26)(26 27)(27 28)(28 29)
-- (29 30)]
grafoTutteCoxeter Grafo Int
grafoTutteCoxeter =
creaGrafo [130]
(aristas (grafoCiclo 30) ++
zip [ 1 2 3 4 5 6 7 8 9111213151721]
[182310271419242916202530222628])
Grafo de Petersen
El grafo de Petersen 15 se define como el grafo de Petersen generalizado GP52 esdecir es un grafo cuacutebico formado por los veacutertices de un pentaacutegono conectados alos veacutertices de una estrella de cinco puntas en la que cada nodo es adyacente a losnodos que estaacuten a un salto 2 de eacutel Es usado como ejemplo y como contraejemplo enmuchos problemas de la Teoriacutea de grafos
6
7
8 9
101
2
3 4
5
La funcioacuten grafoPetersen devuelve el grafo de Petersen
-- | Ejemplo
-- gtgtgt pp $ grafoPetersen
-- G [12345678910]
-- [(1 3)(1 4)(1 6)(2 4)(2 5)(2 7)(3 5)
-- (3 8)(4 9)(5 10)(6 7)(6 10)(7 8)(8 9)
-- (9 10)]
grafoPetersen Grafo Int
grafoPetersen = grafoPetersenGen 5 2
15httpsenwikipediaorgwikiPetersen_graph
35 Definiciones y propiedades 67
Grafo de MoeumlbiusndashCantor
El grafo de MoeumlbiusndashCantor 16 se define como el grafo de Petersen generalizadoGP83 es decir es un grafo cuacutebico formado por los veacutertices de un octoacutegono conecta-dos a los veacutertices de una estrella de ocho puntas en la que cada nodo es adyacente alos nodos que estaacuten a un salto 3 de eacutel Al igual que el grafo de Petersen tiene impor-tantes propiedades que lo hacen ser ejemplo y contraejemplo de muchos problemasde la Teoriacutea de Grafos
9
10
11
12
13
14
15
16
1
23
4
5
67
8
La funcioacuten grafoMoebiusCantor genera el grafo de MoeumlbiusndashCantor
-- | Ejemplo
-- gtgtgt pp $ grafoMoebiusCantor
-- G [12345678910111213141516]
-- [(1 4)(1 6)(1 9)(2 5)(2 7)(2 10)(3 6)
-- (3 8)(3 11)(4 7)(4 12)(5 8)(5 13)(6 14)
-- (7 15)(8 16)(9 10)(9 16)(10 11)(11 12)
-- (12 13)(13 14)(14 15)(15 16)]
grafoMoebiusCantor Grafo Int
grafoMoebiusCantor = grafoPetersenGen 8 3
35 Definiciones y propiedades
Una vez construida una pequentildea fuente de ejemplos estamos en condiciones deimplementar las definiciones sobre grafos en Haskell y ver que funcionan correc-tamente Ademaacutes comprobaremos que se cumplen las propiedades baacutesicas que sehan presentado en el tema Introduccioacuten a la teoriacutea de grafos de ldquoMatemaacutetica discretardquo([4])
16httpsenwikipediaorgwikiMoeumlbius-Kantor_graph
68 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Nota 351 Se utilizaraacute el tipo abstracto de grafos presentados en la seccioacuten 32 y seutilizaraacuten las librerias DataList y TestQuickCheck
351 Definiciones de grafos
Definicioacuten 351 El orden de un grafo G = (V A) se define como su nuacutemero de veacuterticesLo denotaremos por |V(G)|
La funcioacuten (orden g) devuelve el orden del grafo g
-- | Ejemplos
-- gtgtgt orden (grafoCiclo 4)
-- 4
-- gtgtgt orden (grafoEstrella 4)
-- 5
orden Grafo a -gt Int
orden = length vertices
Definicioacuten 352 El tamantildeo de un grafo G = (V A) se define como su nuacutemero de aristasLo denotaremos por |A(G)|
La funcioacuten (tamantildeo g) devuelve el orden del grafo g
-- | Ejemplos
-- gtgtgt tamantildeo (grafoCiclo 4)
-- 4
-- gtgtgt tamantildeo grafoPetersen
-- 15
tamantildeo Grafo a -gt Int
tamantildeo = length aristas
Definicioacuten 353 Diremos que dos aristas a aprime son incidentes si tienen interseccioacuten novaciacutea es decir si tienen alguacuten veacutertice en comuacuten
La funcioacuten (sonIncidentes a a) se verifica si las aristas a y a son incidentes
-- | Ejemplos
-- gtgtgt sonIncidentes (12) (24)
-- True
-- gtgtgt sonIncidentes (12) (34)
-- False
sonIncidentes Eq a =gt (aa) -gt (aa) -gt Bool
sonIncidentes (u1u2) (v1v2) =
or [u1 == v1 u1 == v2 u2 == v1 u2 == v2]
Definicioacuten 354 Diremos que una arista de un grafo G es un lazo si va de un veacutertice ensiacute mismo
35 Definiciones y propiedades 69
La funcioacuten (lazos g) devuelve los lazos del grafo g
-- | Ejemplos
-- gtgtgt lazos (creaGrafo [12] [(11)(12)(22)])
-- [(11)(22)]
-- gtgtgt lazos (grafoCiclo 5)
-- []
lazos Eq a =gt Grafo a -gt [(aa)]
lazos g = [(uv) | (uv) lt- aristas g u == v]
La funcioacuten (esLazo a) se verifica si la arista a es un lazo
-- | Ejemplos
-- gtgtgt esLazo (44)
-- True
-- gtgtgt esLazo (12)
-- False
esLazo Eq a =gt (aa) -gt Bool
esLazo (uv) = u == v
Definicioacuten 355 Dado un grafo G = (V A) fijado un veacutertice v isin V al conjunto deveacutertices que son adyacentes a v lo llamaremos entorno de v y lo denotaremos por N(v) =u isin V|(u v) isin A
La funcioacuten (entorno g v) devuelve el entorno del veacutertice v en el grafo g
-- | Ejemplo
-- gtgtgt entorno (creaGrafo [15] [(12)(13)(23)]) 2
-- [13]
entorno Eq a =gt Grafo a -gt a -gt [a]
entorno = adyacentes
Definicioacuten 356 Sea G = (V A) un grafo El grado (o valencia) de v isin V es grad(v) =|N(v)|
La funcioacuten (grado g v) devuelve el grado del veacutertice v en el grafo g
-- | Ejemplos
-- gtgtgt grado (creaGrafo [15] [(12)(13)(23)]) 2
-- 2
-- gtgtgt grado (grafoEstrella 5) 1
-- 5
grado Eq a =gt Grafo a -gt a -gt Int
grado g v = length (entorno g v)
Definicioacuten 357 Un veacutertice v de un grafo es aislado si su grado es 0
La funcioacuten (esAislado g v) se verifica si el veacutertice v es aislado en el grafo g
70 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- | Ejemplos
-- gtgtgt esAislado (creaGrafo [15] [(12)(13)(23)]) 4
-- True
-- gtgtgt esAislado (creaGrafo [15] [(12)(13)(23)]) 3
-- False
esAislado Eq a =gt Grafo a -gt a -gt Bool
esAislado g v = grado g v == 0
Definicioacuten 358 Un grafo es regular si todos sus veacutertices tienen el mismo grado
La funcioacuten (esRegular g) se verifica si el grafo g es regular
-- | Ejemplos
-- gtgtgt esRegular (creaGrafo [13] [(12)(13)(23)])
-- True
-- gtgtgt esRegular (creaGrafo [14] [(12)(13)(24)])
-- False
esRegular Eq a =gt Grafo a -gt Bool
esRegular g = all (==x) xs
where (xxs) = [grado g v | v lt- vertices g]
Definicioacuten 359 Dado un grafo G = (V A) llamamos valencia miacutenima o grado miacuteni-mo de G al valor δ(G) = mıngrad(v)|v isin V
La funcioacuten (valenciaMin g) devuelve la valencia miacutenima del grafo g
-- | Ejemplo
-- gtgtgt valenciaMin (creaGrafo [14] [(12)(13)(24)])
-- 1
valenciaMin Ord a =gt Grafo a -gt Int
valenciaMin g = minimum [grado g v | v lt- vertices g]
Definicioacuten 3510 Dado un grafo G = (V A) llamamos valencia maacutexima o gradomaacuteximo de G al valor δ(G) = maxgrad(v)|v isin V
La funcioacuten (valenciaMax g) devuelve la valencia maacutexima del grafo g
-- | Ejemplo
-- gtgtgt valenciaMax (creaGrafo [14] [(12)(13)(24)])
-- 2
valenciaMax Ord a =gt Grafo a -gt Int
valenciaMax g = maximum [grado g v | v lt- vertices g]
Definicioacuten 3511 Se dice que un grafo es simple si no contiene lazos ni aristas repetidas
La funcioacuten (esSimple g) se verifica si g es un grafo simple
35 Definiciones y propiedades 71
-- | Ejemplos
-- gtgtgt esSimple (creaGrafo [13] [(12)(13)(23)])
-- True
-- gtgtgt esSimple (creaGrafo [13] [(11)(12)(23)])
-- False
esSimple Ord a =gt Grafo a -gt Bool
esSimple g =
and [not ((xx) `aristaEn` g) | x lt- vertices g]
Definicioacuten 3512 Sea G un grafo Llamamos secuencia de grados de G a la lista degrados de sus veacutertices La secuencia se suele presentar en orden decreciente d1 ge d2 gemiddot middot middot ge dn
La funcioacuten (secuenciaGrados g) devuelve la secuencia de los grados del grafo g enorden decreciente
-- | Ejemplo
-- gtgtgt secuenciaGrados (creaGrafo [15] [(12)(13)(14)(24)])
-- [32210]
secuenciaGrados Eq a =gt Grafo a -gt [Int]
secuenciaGrados g = sortBy (flip compare) [grado g v | v lt- vertices g]
Nota 352 iquestQueacute listas de n nuacutemeros enteros son secuencias de grafos de n veacuterticesbull Si sumn
i=1 di es impar no hay ningunobull Si sumn
i=1 di es par entonces siempre hay un grafo con esa secuencia de grados (aun-que no necesariamente simple)
Definicioacuten 3513 Una secuencia graacutefica es una lista de nuacutemero enteros no negativos quees la secuencia de grados para alguacuten grafo simple
La funcioacuten (secuenciaGrafica ss) se verifica si existe alguacuten grafo con la secuenciade grados ss
-- | Ejemplos
-- gtgtgt secuenciaGrafica [32210]
-- True
-- gtgtgt secuenciaGrafica [3222]
-- False
secuenciaGrafica [Int] -gt Bool
secuenciaGrafica ss = even (sum ss) ampamp all p ss
where p s = s gt= 0 ampamp s lt= length ss
Definicioacuten 3514 Dado un grafo G = (V A) diremos que Gprime = (Vprime Aprime) es un subgrafode G si Vprime sube V y Aprime sube A
72 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (esSubgrafo g g) se verifica si g es un subgrafo de g
-- |Ejemplos
-- gtgtgt esSubgrafo (bipartitoCompleto 3 2) (bipartitoCompleto 3 3)
-- True
-- gtgtgt esSubgrafo (grafoEstrella 4) (grafoEstrella 5)
-- True
-- gtgtgt esSubgrafo (completo 5) (completo 4)
-- False
-- gtgtgt esSubgrafo (completo 3) (completo 4)
-- True
esSubgrafo Ord a =gt Grafo a -gt Grafo a -gt Bool
esSubgrafo g g =
vertices g `esSubconjunto` vertices g ampamp
aristas g `esSubconjunto` aristas g
Definicioacuten 3515 Si Gprime = (Vprime Aprime) es un subgrafo de G = (V A) tal que Vprime = Vdiremos que Gprime es un subgrafo maximal grafo recubridor o grafo de expansioacuten (eningleacutes spanning grah) de G
La funcioacuten (esSubgrafoMax g g) se verifica si g es un subgrafo maximal de g
-- | Ejemplos
-- gtgtgt esSubgrafoMax (grafoRueda 3) (grafoRueda 4)
-- False
-- gtgtgt esSubgrafoMax (grafoCiclo 4) (grafoRueda 4)
-- True
-- gtgtgt esSubgrafoMax (creaGrafo [13] [(12)]) (grafoCiclo 3)
-- True
-- gtgtgt esSubgrafoMax (creaGrafo [12] [(12)]) (grafoCiclo 3)
-- False
esSubgrafoMax Ord a =gt Grafo a -gt Grafo a -gt Bool
esSubgrafoMax g g =
g `esSubgrafo` g ampamp conjuntosIguales (vertices g) (vertices g)
Definicioacuten 3516 Sean Gprime = (Vprime Aprime) G = (V A) dos grafos si Vprime sub V o Aprime sub A sedice que Gprime es un subgrafo propio de G y se denota por Gprime sub G
La funcioacuten (esSubgrafoPropio g g) se verifica si g es un subgrafo propio de g
-- | Ejemplos
-- gtgtgt esSubgrafoPropio (grafoRueda 3) (grafoRueda 4)
-- True
-- gtgtgt esSubgrafoPropio (grafoRueda 4) (grafoCiclo 5)
-- False
-- gtgtgt esSubgrafoPropio (creaGrafo [13] [(12)]) (grafoCiclo 3)
-- True
-- gtgtgt esSubgrafoPropio (creaGrafo [12] [(12)]) (grafoCiclo 3)
35 Definiciones y propiedades 73
-- True
esSubgrafoPropio Ord a =gt Grafo a -gt Grafo a -gt Bool
esSubgrafoPropio g g =
esSubgrafo g g ampamp
(not (conjuntosIguales (vertices g) (vertices g)) ||
not (conjuntosIguales (aristas g) (aristas g)))
352 Propiedades de grafos
Teorema 3517 (Lema del apretoacuten de manos) En todo grafo simple el nuacutemero de veacuterticesde grado impar es par o cero
Vamos a comprobar que se verifica el lema del apretoacuten de manos utilizando la fun-cioacuten prop_LemaApretonDeManos
ghcigt quickCheck prop_LemaApretonDeManos
+++ OK passed 100 tests
prop_LemaApretonDeManos Grafo Int -gt Bool
prop_LemaApretonDeManos g =
even (length (filter odd [grado g v | v lt- vertices g]))
where g = creaGrafo (vertices g)
[(xy) | (xy) lt- aristas g x = y]
Teorema 3518 (HavelndashHakimi) Si n gt 1 y D = [d1 dn] es una lista de enterosentonces D es secuencia graacutefica si y soacutelo si la secuencia Dprime obtenida borrando el mayorelemento dmax y restando 1 a los siguientes dmax elementos maacutes grandes es graacutefica
Vamos a comprobar que se verifica el teorema de HavelndashHakimi utilizando la fun-cioacuten prop_HavelHakimi
ghcigt quickCheck prop_HavelHakimi
+++ OK passed 100 tests
prop_HavelHakimi [Int] -gt Bool
prop_HavelHakimi [] = True
prop_HavelHakimi (sss) =
not (secuenciaGrafica (sss) ampamp not (esVacio ss)) ||
secuenciaGrafica (map (x -gt x-1) (take s ss) ++ drop s ss)
353 Operaciones y propiedades sobre grafos
Eliminacioacuten de una arista
Definicioacuten 3519 Sea G = (V A) un grafo y sea (u v) isin A Definimos el grafo G (u v) como el subgrafo de G Gprime = (Vprime Aprime) con Vprime = V y Aprime = A (u v) Esta
74 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
operacioacuten se denomina eliminar una arista
La funcioacuten (eliminaArista g a) elimina la arista a del grafo g
-- | Ejemplos
-- gtgtgt eliminaArista (creaGrafo [14] [(12)(14)(24)]) (14)
-- G [1234] [(12)(24)]
-- gtgtgt eliminaArista (creaGrafo [14] [(12)(14)(24)]) (41)
-- G [1234] [(12)(24)]
-- gtgtgt eliminaArista (creaGrafo [14] [(12)(14)(24)]) (43)
-- G [1234] [(12)(14)(24)]
eliminaArista Ord a =gt Grafo a -gt (aa) -gt Grafo a
eliminaArista g (ab) =
creaGrafo (vertices g)
(aristas g [(ab)(ba)])
La funcioacuten (eliminaLazos g) devuelve un nuevo grafo obtenido a partir del grafog eliminando todas las aristas que fueran lazos
-- | Ejemplos
-- gtgtgt eliminaLazos (creaGrafo [12] [(11)(12)(22)])
-- G [12] [(12)]
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
-- gtgtgt eliminaLazos (grafoCiclo 5)
-- G [12345] [(12)(15)(23)(34)(45)]
eliminaLazos Ord a =gt Grafo a -gt Grafo a
eliminaLazos g = creaGrafo (vertices g)
[(xy) | (xy) lt- aristas g x = y]
Eliminacioacuten un veacutertice
Definicioacuten 3520 Sea G = (V A) un grafo y sea v isin V Definimos el grafo G v como elsubgrafo de G Gprime = (Vprime Aprime) con Vprime = V v y Aprime = A a isin A|v es un extremo de aEsta operacioacuten se denomina eliminar un veacutertice
La funcioacuten (eliminaVertice g v) elimina el veacutertice v del grafo g
-- | Ejemplos
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(24)]) 1
-- G [234] [(24)]
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(24)]) 4
-- G [123] [(12)]
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(24)]) 3
-- G [124] [(12)(14)(24)]
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(13)]) 1
-- G [234] []
eliminaVertice Ord a =gt Grafo a -gt a -gt Grafo a
35 Definiciones y propiedades 75
eliminaVertice g v =
creaGrafo (vertices g [v])
(as [(ab) | (ab) lt- as a == v || b == v])
where as = aristas g
Suma de aristas
Definicioacuten 3521 Sea G = (V A) un grafo y sean u v isin V tales que (u v) (v u) 6isin ADefinimos el grafo G + (u v) como el grafo Gprime = (V A cup (u v)) Esta operacioacuten sedenomina suma de una arista
La funcioacuten (sumaArista g a) suma la arista a al grafo g
-- | Ejemplos
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
-- gtgtgt sumaArista (grafoCiclo 5) (13)
-- G [12345] [(12)(13)(15)(23)(34)(45)]
sumaArista Ord a =gt Grafo a -gt (aa) -gt Grafo a
sumaArista g a =
creaGrafo (vertices g) (a aristas g)
Suma de veacutertices
Definicioacuten 3522 Sea G = (V A) un grafo y sea v 6isin V Definimos el grafo G + v comoel grafo Gprime = (Vprime Aprime) donde Vprime = V cup v Aprime = Acup (u v)|u isin V Esta operacioacuten sedenomina suma de un veacutertice
La funcioacuten (sumaVertice g a) suma el veacutertice a al grafo g
-- | Ejemplo
-- gtgtgt grafoCiclo 3
-- G [123] [(12)(13)(23)]
-- gtgtgt sumaVertice (grafoCiclo 3) 4
-- G [1234] [(12)(13)(14)(23)(24)(34)]
sumaVertice Ord a =gt Grafo a -gt a -gt Grafo a
sumaVertice g v =
creaGrafo (v vs) (aristas g ++ [(uv) | u lt- vs])
where vs = vertices g
Propiedad de los grafos completos
Proposicioacuten 3523 La familia de grafos completos Kn verifica que Kn = Knminus1 + n
Vamos a ver que se cumple la propiedad utilizando la funcioacuten prop_completos
76 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
ghcigt quickCheck prop_completos
+++ OK passed 100 tests
prop_completos Int -gt Property
prop_completos n = n gt= 2 ==gt
completo n == sumaVertice (completo (n-1)) n
A partir de esta propiedad se puede dar una definicioacuten alternativa de la funcioacuten(completo n) que devuelve el grafo completo Kn La nueva funcioacuten seraacute (completo2n)
completo2 Int -gt Grafo Int
completo2 0 = grafoNulo
completo2 n = sumaVertice (completo2 (n-1)) n
Vamos a comprobar la equivalencia de ambas deficiones
ghcigt prop_EquiCompleto
True
prop_EquiCompleto Bool
prop_EquiCompleto = and [completo n == completo2 n | n lt- [050]]
Vamos a ver cuaacutel de las definiciones es maacutes eficiente
ghcigt tamantildeo (completo 100)
4950
(117 secs 0 bytes)
ghcigt tamantildeo (completo2 100)
4950
(1549 secs 61756056 bytes)
La funcioacuten (completo n) es maacutes eficiente asiacute que seraacute la que seguiremos utilizando
Suma de grafos
Definicioacuten 3524 Sean G = (V A) Gprime = (Vprime A) dos grafos Definimos el grafo sumade G y Gprime como el grafo G + Gprime = (V cup Vprime A cup Aprime cup (u v)|u isin V v isin Vprime) Estaoperacioacuten se denomina suma de grafos
La funcioacuten (sumaGrafos g g) suma los grafos g y g
-- | Ejemplo
-- gtgtgt let g1 = creaGrafo [13] [(11)(13)(23)]
-- gtgtgt let g2 = creaGrafo [46] [(46)(56)]
-- gtgtgt pp $ sumaGrafos g1 g2
-- G [123456]
-- [(1 1)(1 3)(1 4)(1 5)(1 6)(2 3)(2 4)
-- (2 5)(2 6)(3 4)(3 5)(3 6)(4 6)(5 6)]
sumaGrafos Ord a =gt Grafo a -gt Grafo a -gt Grafo a
35 Definiciones y propiedades 77
sumaGrafos g1 g2 =
creaGrafo (vs1 `union` vs2)
(aristas g1 `union`
aristas g2 `union`
[(uv) | u lt- vs1 v lt- vs2])
where vs1 = vertices g1
vs2 = vertices g2
Unioacuten de grafos
Definicioacuten 3525 Sean G = (V A) Gprime = (Vprime A) dos grafos Definimos el grafo unioacutende G y Gprime como el grafo G cup H = (V cupVprime A cup Aprime) Esta operacioacuten se denomina unioacuten degrafos
La funcioacuten (unionGrafos g g) une los grafos g y g Por ejemplo
-- | Ejemplo
-- gtgtgt let g1 = creaGrafo [13] [(11)(13)(23)]
-- gtgtgt let g2 = creaGrafo [46] [(46)(56)]
-- gtgtgt unionGrafos g1 g2
-- G [123456] [(11)(13)(23)(46)(56)]
unionGrafos Ord a =gt Grafo a -gt Grafo a -gt Grafo a
unionGrafos g1 g2 =
creaGrafo (vertices g1 `union` vertices g2)
(aristas g1 `union` aristas g2)
Grafo complementario
Definicioacuten 3526 Dado un grafo G = (V A) se define el grafo complementario de Gcomo G = (V A) donde A = (u v)|u v isin V (u v) 6isin A
La funcioacuten (grafoComplementario g) devuelve el grafo complementario de g
-- | Ejemplo
-- gtgtgt grafoComplementario (creaGrafo [13] [(11)(13)(23)])
-- G [123] [(12)(22)(33)]
grafoComplementario Ord a =gt Grafo a -gt Grafo a
grafoComplementario g =
creaGrafo vs
[(uv)| u lt- vs v lt- vs u lt= v not ((uv) `aristaEn` g)]
where vs = vertices g
Definicioacuten 3527 Dado un grafo diremos que es completo si su complementario sin lazosno tiene aristas
La funcioacuten (esCompleto g) se verifica si el grafo g es completo
78 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- Ejemplos
-- gtgtgt esCompleto (completo 4)
-- True
-- gtgtgt esCompleto (grafoCiclo 5)
-- False
esCompleto Ord a =gt Grafo a -gt Bool
esCompleto g =
tamantildeo (eliminaLazos (grafoComplementario g)) == 0
36 Morfismos de grafos
Llegados a este punto es importante resaltar que un grafo se define como una en-tidad matemaacutetica abstracta es evidente que lo importante de un grafo no son losnombres de sus veacutertices ni su representacioacuten graacutefica La propiedad que caracterizaa un grafo es la forma en que sus veacutertices estaacuten unidos por las aristasA priori los siguientes grafos pueden parecer distintos
a
bc
de
1
23
45
Sin embargo ambos grafos son grafos de cinco veacutertices que tienen las mismas rela-ciones de vecindad entre sus nodos En esta seccioacuten estudiaremos estas relacionesque establecen las aristas entre los veacutertices de un grafo y presentaremos algoritmosque nos permitan identificar cuaacutendo dos grafos se pueden relacionar mediante apli-caciones entre sus veacutertices cumpliendo ciertas caracteriacutesicas
361 Morfismos
Definicioacuten 361 Si f es una funcioacuten entre dos grafos G = (V A) y Gprime = (Vprime Aprime)diremos que conserva la adyacencia si forallu v isin V se verifica que si (u v) isin A entonces( f (u) f (v)) isin Aprime
La funcioacuten (conservaAdyacencia g h f) se verifica si la funcioacuten f entre los grafosg y h conserva las adyacencias
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [14] [(12)(23)(34)]
-- gtgtgt let g2 = creaGrafo [14] [(12)(23)(24)]
-- gtgtgt let g3 = creaGrafo [4610] [(48)(68)(810)]
36 Morfismos de grafos 79
-- gtgtgt conservaAdyacencia g1 g3 [(14)(26)(38)(410)]
-- False
-- gtgtgt conservaAdyacencia g2 g3 [(14)(28)(36)(410)]
-- True
conservaAdyacencia (Ord a Ord b) =gt
Grafo a -gt Grafo b -gt Funcion a b -gt Bool
conservaAdyacencia g h f =
and [(imagen f ximagen f y) `aristaEn` h | (xy) lt- aristas g]
Definicioacuten 362 Dados dos grafos simples G = (V A) y Gprime = (Vprime Aprime) un morfismoentre G y Gprime es una funcioacuten φ V rarr Vprime que conserva las adyacencias
La funcioacuten (esMorfismo g h vvs) se verifica si la funcioacuten representada por vvs esun morfismo entre los grafos g y h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(12)(32)]
-- gtgtgt let g2 = creaGrafo [456] [(46)(56)]
-- gtgtgt esMorfismo g1 g2 [(14)(26)(35)]
-- True
-- gtgtgt esMorfismo g1 g2 [(14)(25)(36)]
-- False
-- gtgtgt esMorfismo g1 g2 [(14)(26)(35)(79)]
-- False
esMorfismo (Ord aOrd b) =gt Grafo a -gt Grafo b -gt
Funcion a b -gt Bool
esMorfismo g1 g2 f =
esFuncion (vertices g1) (vertices g2) f ampamp
conservaAdyacencia g1 g2 f
La funcioacuten (morfismos g h) devuelve todos los posibles morfismos entre los grafosg y h
-- | Ejemplos
-- gtgtgt grafoCiclo 3
-- G [123] [(12)(13)(23)]
-- gtgtgt let g = creaGrafo [46] [(44)(66)]
-- gtgtgt morfismos (grafoCiclo 3) g
-- [[(14)(24)(34)][(16)(26)(36)]]
-- gtgtgt morfismos g (grafoCiclo 3)
-- []
morfismos (Ord a Ord b) =gt Grafo a -gt Grafo b -gt [[(ab)]]
morfismos g h =
[f | f lt- funciones (vertices g) (vertices h)
conservaAdyacencia g h f]
80 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
362 Complejidad del problema de homomorfismo de grafos
En general en computacioacuten un problema algoriacutetmico consta de un conjunto I detodas las posibles entradas para el problema llamado el conjunto de instancias y deuna pregunta Q sobre esas instancias Resolver uno de estos problemas consiste endesarrollar un algoritmo cuya entrada es una instancia del problema y cuya salidaes una respuesta a la pregunta del problemaDecimos que un problema es de decisioacuten cuando las posibles respuestas a la pre-gunta son ldquosiacuterdquo o ldquonordquo Un ejemplo de problema de este tipo seriacutea dados dos grafosdecidir si estos son homomorfos o noA la hora de implementar un algoritmo que deacute solucioacuten al problema que estemosconsiderando es importante tener en cuenta el nuacutemero de pasos que efectuacutea hastaencontrar una respuesta Un algoritmo de tiempo polinomial se define como aquelcon funcioacuten de complejidad temporal en O(p(n)) para alguna funcioacuten polinoacutemicap donde n denota el tamantildeo de la entrada Cualquier algoritmo cuya funcioacuten decomplejidad temporal no pueda ser acotada de esta manera se denomina algoritmode tiempo exponencialLa mayoriacutea de los algoritmos de tiempo exponencial son simples variaciones de unabuacutesqueda exhaustiva mientras que los algoritmos de tiempo polinomial usualmen-te se obtienen mediante un anaacutelisis maacutes profundo de la estructura del problema Enla Teoriacutea de la complejidad computacional existe el consenso de que un problemano estaacute ldquobien resueltordquo hasta que se conozca un algoritmo de tiempo polinomialque lo resuelva Por tanto nos referiremos a un problema como ldquointratablerdquo si estan difiacutecil que no existe algoritmo de tiempo polinomial capaz de resolverloLos problemas de decisioacuten para los que existen algoritmos polinomiales consti-tuyen la clase P y son llamados polinomiales Un problema de decisioacuten es no-determiniacutestico polinomial cuando cualquier instancia que produce respuesta ldquosiacuterdquoposee una comprobacioacuten de correctitud (tambieacuten llamada certificado) verificable entiempo polinomia en el tamantildeo de la instancia Estos problemas de decisioacuten se di-ce que pertenecen a la clase NP Claramente P sube NP Sin embargo no se sabe siesta inclusioacuten es estricta uno de los principales problemas abiertos en Teoriacutea de lacomputacioacuten es saber si P 6= NPUna reduccioacuten es una transformacioacuten de un problema en otro problema Intuitiva-mente un problema Q puede ser reducido a otro problema Qprime si cualquier instanciadel problema Q puede ser ldquofaacutecilmenterdquo expresada como una instancia del problemaQprime y cuya solucioacuten proporcione una solucioacuten para la instancia de QLas reducciones en tiempo polinomial nos dotan de elementos para probar de unamanera formal que un problema es al menos tan difiacutecil que otro con una dife-rencia de un factor polinomial Estas son esenciales para definir a los problemas
36 Morfismos de grafos 81
NP-completos ademaacutes de ayudar a comprender los mismosLa clase de los problemas NP-completos contiene a los problemas maacutes difiacuteciles enNP en el sentido de que son los que esteacuten maacutes lejos de estar en P Debido a que elproblema P = NP no ha sido resuelto el hecho de reducir un problema B a otroproblema A indicariacutea que no se conoce solucioacuten en tiempo polinomial para A Estoes debido a que una solucioacuten en tiempo polinomial para A tendriacutea como conse-cuencia la existencia de una solucioacuten polinomial para B De manera similar debidoa que todos los problemas NP pueden ser reducidos a este conjunto encontrar unproblema NP-completo que pueda ser resuelto en un tiempo polinomial significariacuteaque P = NPEl problema de decidir si dos grafos son homomorfos es un problema de decisioacutenNP-completo La NP-completitud del problema se demuestra mediante la reduccioacutende este problema al problema de la clique 17En el proceso de recopilacioacuten de imformacioacuten acerca de la Teoriacutea de la complejidadse ha trabajado con dos fuentesbull la tesis de licenciatura de Pablo Burzyn ldquoComplejidad computacional en proble-
mas de modificacioacuten de aristas en grafosrdquo ([2]) ybull el artiacuteculo ldquoTeoriacutea de la complejidad computacionalrdquo ([12]) de la Wikipedia
363 Isomorfismos
Definicioacuten 363 Dados dos grafos simples G = (V A) y Gprime = (Vprime Aprime) un isomorfis-mo entre G y Gprime es un morfismo biyectivo cuyo inverso es morfismo entre Gprime y G
La funcioacuten (esIsomorfismo g h f) se verifica si la aplicacioacuten f es un isomorfismoentre los grafos g y h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt esIsomorfismo g1 g2 [(12)(24)(36)]
-- True
-- gtgtgt esIsomorfismo g1 g2 [(12)(22)(36)]
-- False
esIsomorfismo (Ord aOrd b) =gt
Grafo a -gt Grafo b -gt Funcion a b -gt Bool
esIsomorfismo g h f =
esBiyectiva vs1 vs2 f ampamp
esMorfismo g h f ampamp
esMorfismo h g (inversa f)
where vs1 = vertices g
vs2 = vertices h
17httpseswikipediaorgwikiProblema_de_la_clique
82 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (isomorfismos1 g h) devuelve todos los isomorfismos posibles entrelos grafos g y h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfismos1 g1 g2
-- [[(12)(24)(36)]]
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfismos1 g3 g4
-- []
-- gtgtgt let g5 = creaGrafo [123] [(11)(22)(33)]
-- gtgtgt let g6 = creaGrafo [246] [(22)(44)(66)]
-- gtgtgt pp $ isomorfismos1 g5 g6
-- [[(1 2)(2 4)(3 6)][(1 4)(2 2)(3 6)]
-- [(1 6)(2 4)(3 2)][(1 4)(2 6)(3 2)]
-- [(1 6)(2 2)(3 4)][(1 2)(2 6)(3 4)]]
isomorfismos1 (Ord aOrd b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos1 g h =
[f | f lt- biyecciones vs1 vs2
conservaAdyacencia g h f
conservaAdyacencia h g (inversa f)]
where vs1 = vertices g
vs2 = vertices h
Definicioacuten 364 Dos grafos G y H se dicen isomorfos si existe alguacuten isomorfismo entreellos
La funcioacuten isomorfos1 g h se verifica si los grafos g y h son isomorfos
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfos1 g1 g2
-- True
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfos1 g3 g4
-- False
isomorfos1 (Ord aOrd b) =gt Grafo a -gt Grafo b -gt Bool
isomorfos1 g = not null isomorfismos1 g
Nota 361 Al tener Haskell una evaluacioacuten perezosa la funcioacuten (isomorfos g h)
no necesita generar todos los isomorfismos entre los grafos g y h
Definicioacuten 365 Sea G = (V A) un grafo Un invariante por isomorfismos de G esuna propiedad de G que tiene el mismo valor para todos los grafos que son isomorfos a eacutel
36 Morfismos de grafos 83
esInvariantePorIsomorfismos
Eq a =gt (Grafo Int -gt a) -gt Grafo Int -gt Grafo Int -gt Bool
esInvariantePorIsomorfismos p g h =
isomorfos g h --gt (p g == p h)
where (--gt) = (lt=)
Teorema 366 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un iso-morfismo Entonces se verifica que |V(G)| = |V(Gprime)| es decir el orden de un grafo es uninvariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos orden)
+++ OK passed 100 tests
Teorema 367 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces se verifica que |A(G)| = |A(Gprime)| es decir el tamantildeo de un grafo es uninvariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos tamantildeo)
+++ OK passed 100 tests
Teorema 368 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces tienen la misma secuencia de grados es decir la secuencia de grados de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos secuenciaGrados)
+++ OK passed 100 tests
A partir de las propiedades que hemos demostrado de los isomorfismos vamos adar otra definicioacuten equivalente de las funciones (isomorfismos1 g h) y (isomorfos1
g h)
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfismos2 g1 g2
-- [[(12)(24)(36)]]
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfismos2 g3 g4
-- []
-- gtgtgt let g5 = creaGrafo [123] [(11)(22)(33)]
84 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- gtgtgt let g6 = creaGrafo [246] [(22)(44)(66)]
-- gtgtgt pp $ isomorfismos2 g5 g6
-- [[(1 2)(2 4)(3 6)][(1 4)(2 2)(3 6)]
-- [(1 6)(2 4)(3 2)][(1 4)(2 6)(3 2)]
-- [(1 6)(2 2)(3 4)][(1 2)(2 6)(3 4)]]
isomorfismos2 (Ord a Ord b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos2 g h
| orden g = orden h = []
| tamantildeo g = tamantildeo h = []
| secuenciaGrados g = secuenciaGrados h = []
| otherwise = [f | f lt- biyecciones vs1 vs2
conservaAdyacencia g h f]
where vs1 = vertices g
vs2 = vertices h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfos2 g1 g2
-- True
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfos2 g3 g4
-- False
isomorfos2 (Ord a Ord b) =gt Grafo a -gt Grafo b -gt Bool
isomorfos2 g =
not null isomorfismos2 g
isomorfismos3 (Ord a Ord b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos3 g h
| orden g = orden h = []
| tamantildeo g = tamantildeo h = []
| secuenciaGrados g = secuenciaGrados h = []
| otherwise = filter (conservaAdyacencia g h) (posibles g h)
verticesPorGrados g =
[filter (p n) (vertices g) | n lt- nub (secuenciaGrados g)]
where p m v = grado g v == m
aux1 [] _ = []
aux1 (xsxss) (ysyss) = (map (zip xs) (permutations ys))aux1 xss yss
aux2 [] = []
aux2 (xss[]) = xss
aux2 (xssyss[]) = [xs ++ ys | xs lt- xss ys lt- yss]
aux2 (xssyssxsss) =
aux2 ([xs ++ ys | xs lt- xss ys lt- yss]xsss)
36 Morfismos de grafos 85
posibles g h =
aux2 (aux1 (verticesPorGrados g) (verticesPorGrados h))
Vamos a comparar la eficiencia entre ambas definiciones
Nota 362 La nueva definicioacuten de (isomorfismos3 g h) es la maacutes eficiente con gra-fos poco regulares sin embargo cuando todos los veacutertices tienen el mismo grado(isomorfismos2 g h) sigue siendo mejor opcioacuten (aunque no hay mucha diferenciaen el coste computacional)ghcigt let n = 6 in (length (isomorfismos1 (completo n) (completo n)))
720
(018 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos2 (completo n) (completo n)))
720
(018 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos3 (completo n) (completo n)))
720
(018 secs 26123800 bytes)
ghcigt let n = 6 in (length (isomorfismos1 (grafoCiclo n) (grafoCiclo n)))
12
(004 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos2 (grafoCiclo n) (grafoCiclo n)))
12
(004 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos3 (grafoCiclo n) (grafoCiclo n)))
12
(004 secs 0 bytes)
ghcigt length (isomorfismos1 (grafoCiclo 6) (completo 7))
0
(000 secs 0 bytes)
ghcigt length (isomorfismos2 (grafoCiclo 6) (completo 7))
0
(001 secs 0 bytes)
ghcigt length (isomorfismos3 (grafoCiclo 6) (completo 7))
0
(000 secs 0 bytes)
ghcigt isomorfos1 (completo 10) (grafoCiclo 10)
False
(5190 secs 12841861176 bytes)
ghcigt isomorfos2 (completo 10) (grafoCiclo 10)
False
(000 secs 0 bytes)
ghcigt isomorfos3 (completo 10) (grafoCiclo 10)
False
86 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
(000 secs 0 bytes)
ghcigt isomorfos1 (grafoCiclo 10) (grafoRueda 10)
False
(7390 secs 16433969976 bytes)
ghcigt isomorfos2 (grafoCiclo 100) (grafoRueda 100)
False
(000 secs 0 bytes)
ghcigt isomorfos3 (grafoCiclo 100) (grafoRueda 100)
False
(000 secs 0 bytes)
ghcigt length (isomorfismos2 (grafoRueda 10) (grafoRueda 10))
18
(10112 secs 23237139992 bytes)
ghcigt length (isomorfismos3 (grafoRueda 10) (grafoRueda 10))
18
(4467 secs 9021442440 bytes)
Nota 363 Cuando los grafos son isomorfos comprobar que tienen el mismo nuacuteme-ro de veacutertices el mismo nuacutemero de aristas y la misma secuencia graacutefica no requieremucho tiempo ni espacio dando lugar a costes muy similares entre los dos paresde definiciones Sin embargo cuando los grafos tienen el mismo nuacutemero de veacuterticesy fallan en alguna de las demaacutes propiedades el resultado es muy costoso para laprimera definicioacuten mientras que es inmediato con la segundaA partir de ahora utilizaremos la funcioacuten isomorfismos2 para calcular los isomor-fismos entre dos grafos y la funcioacuten isomorfos para determinar si dos grafos sonisomorfos de modo que las renombraremos por isomorfismos y isomorfismos res-pectivamente
isomorfismos (Ord aOrd b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos = isomorfismos2
isomorfos (Ord aOrd b) =gt Grafo a -gt Grafo b -gt Bool
isomorfos = isomorfos2
364 Automorfismos
Definicioacuten 369 Dado un grafo simple G = (V A) un automorfismo de G es un iso-morfismo de G en siacute mismo
La funcioacuten (esAutomorfismo g f) se verifica si la aplicacioacuten f es un automorfismode g
-- | Ejemplos
-- gtgtgt let g = creaGrafo [123] [(12)(13)]
37 Caminos en grafos 87
-- gtgtgt esAutomorfismo g [(11)(23)(32)]
-- True
-- gtgtgt esAutomorfismo g [(12)(23)(31)]
-- False
esAutomorfismo Ord a =gt Grafo a -gt Funcion a a -gt Bool
esAutomorfismo g = esIsomorfismo g g
La funcioacuten (automorfismos g) devuelve la lista de todos los posibles automorfis-mos en g
-- | Ejemplo
-- gtgtgt automorfismos (creaGrafo [123] [(12)(13)])
-- [[(11)(22)(33)][(11)(23)(32)]]
automorfismos Ord a =gt Grafo a -gt [Funcion a a]
automorfismos g = isomorfismos1 g g
Nota 364 Cuando trabajamos con automorfismos es mejor utilizar en su defini-cioacuten la funcioacuten isomorfismos1 en vez de isomorfismos2 pues ser isomorfos es unarelacioacuten reflexiva es decir un grafo siempre es isomorfo a siacute mismo
37 Caminos en grafos
Una de las aplicaciones de la teoriacutea de grafos es la determinacioacuten de trayectos o re-corridos en una red de transporte o de distribucioacuten de productos Asiacute si cada veacuterticerepresenta un punto de intereacutes y cada arista representa una conexioacuten entre dos pun-tos usando grafos como modelos podemos simplificar el problema de encontrar laruta maacutes ventajosa en cada caso
371 Definicioacuten de camino
Definicioacuten 371 Sea G = (V A) un grafo simple y sean u v isin V dos veacutertices Uncamino entre u y v es una sucesioacuten de veacutertices de G u = v0 v1 v2 vkminus1 vk = vdonde foralli isin 0 kminus 1 (vi vi+1) isin A
La funcioacuten (esCamino g c) se verifica si la sucesioacuten de veacutertices c es un camino enel grafo g
-- | Ejemplo
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
-- gtgtgt esCamino (grafoCiclo 5) [123451]
-- True
-- gtgtgt esCamino (grafoCiclo 5) [124531]
-- False
88 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
esCamino Ord a =gt Grafo a -gt [a] -gt Bool
esCamino g c = all (`aristaEn` g) (zip c (tail c))
La funcioacuten (aristasCamino c) devuelve la lista de las aristas recorridas en el ca-mino c
-- | Ejemplos
-- gtgtgt aristasCamino [123]
-- [(12)(23)]
-- gtgtgt aristasCamino [1231]
-- [(12)(23)(13)]
-- gtgtgt aristasCamino [1232]
-- [(12)(23)(23)]
aristasCamino Ord a =gt [a] -gt [(aa)]
aristasCamino c =
map parOrdenado (zip c (tail c))
where parOrdenado (uv) | u lt= v = (uv)
| otherwise = (vu)
La funcioacuten (verticesCamino c) devuelve la lista de las vertices recorridas en elcamino c
-- | Ejemplo
-- gtgtgt verticesCamino [1231]
-- [123]
verticesCamino Ord a =gt [a] -gt [a]
verticesCamino c = nub c
Definicioacuten 372 Se llama longitud de un camino al nuacutemero de veces que se atraviesa unaarista en dicho camino
La funcioacuten (longitudCamino c) devuelve la longitud del camino c
-- | Ejemplo
-- gtgtgt longitudCamino [427]
-- 2
longitudCamino [a] -gt Int
longitudCamino c = length c - 1
La funcioacuten (todosCaminos g u v k) devuelve todos los caminos entre los veacuterticesu y v en el grafo g que tienen longitud k
-- | Ejemplo
-- gtgtgt todosCaminos (creaGrafo [12] [(12)]) 1 2 3
-- [[1212]]
-- gtgtgt todosCaminos (bipartitoCompleto 2 3) 1 3 3
-- [[1313][1323][1413][1423][1513][1523]]
todosCaminos Ord a =gt Grafo a -gt a -gt a -gt Int -gt [[a]]
todosCaminos g u v 0 = if u == v ampamp elem u (vertices g)
37 Caminos en grafos 89
then [[u]]
else []
todosCaminos g u v 1 = if aristaEn (uv) g
then [[uv]]
else []
todosCaminos g u v k =
filter p [uvs | n lt- [1k-1] w lt- a u vs lt- tC w v n]
where p xs = longitudCamino xs == k
a = adyacentes g
tC = todosCaminos g
La funcioacuten (numeroCaminosDeLongitud g u v k) es el nuacutemero de caminos de lon-gitud k uniendo los veacutertices u y v en el grafo g
-- | Ejemplos
-- gtgtgt numeroCaminosDeLongitud (completo 7) 1 4 5
-- 1111
-- gtgtgt numeroCaminosDeLongitud grafoPetersen 1 4 3
-- 5
numeroCaminosDeLongitud Ord a =gt Grafo a -gt a -gt a -gt Int -gt Int
numeroCaminosDeLongitud g u v = length todosCaminos g u v
372 Recorridos
Definicioacuten 373 Sea G = (V A) un grafo y sean u v isin V Un camino entre u y v queno repite aristas (quizaacutes veacutertices) se llama recorrido
La funcioacuten (esRecorrido g c) se verifica si el camino c es un recorrido en el grafog
-- | Ejemplo
-- gtgtgt esRecorrido (grafoCiclo 4) [214]
-- True
-- gtgtgt esRecorrido (grafoCiclo 4) [2141]
-- False
-- gtgtgt esRecorrido (grafoCiclo 4) [213]
-- False
esRecorrido Ord a =gt Grafo a -gt [a] -gt Bool
esRecorrido g c =
esCamino g c ampamp sinRepetidos (aristasCamino c)
373 Caminos simples
Definicioacuten 374 Un camino que no repite veacutertices (y por tanto tampoco aristas) se llamacamino simple
90 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (esCaminoSimple g c) se verifica si el camino c es un camino simple enel grafo g
-- | Ejemplos
-- gtgtgt esCaminoSimple (creaGrafo [12] [(11)(12)]) [112]
-- False
-- gtgtgt esCaminoSimple (grafoCiclo 4) [214]
-- True
-- gtgtgt esCaminoSimple (grafoCiclo 4) [14321]
-- True
-- gtgtgt esCaminoSimple (grafoCiclo 4) [43212]
-- False
esCaminoSimple Ord a =gt Grafo a -gt [a] -gt Bool
esCaminoSimple g [] = True
esCaminoSimple g vs =
esRecorrido g vs ampamp noRepiteVertices vs
where noRepiteVertices (xxs)
| sinRepetidos (xxs) = True
| x == last xs ampamp sinRepetidos xs = True
| otherwise = False
La funcioacuten (todosArcosBP g u v) devuelve una lista con todos los caminos simplesposibles en el grafo g entre los veacutertices u y v utilizando una algoritmo de buacutesquedaen profundidad sobre el grafo g Este algoritmo recorre el grafo de izquierda a dere-cha y de forma al visitar un nodo explora todos los caminos que pueden continuarpor eacutel antes de pasar al siquiente
-- | Ejemplos
-- gtgtgt grafoCiclo 4
-- G [1234] [(12)(14)(23)(34)]
-- gtgtgt todosArcosBP (grafoCiclo 4) 1 4
-- [[14][1234]]
-- gtgtgt todosArcosBP (grafoCiclo 4) 4 1
-- [[4321][41]]
-- gtgtgt todosArcosBP (creaGrafo [14] [(12)(34)]) 1 4
-- []
-- gtgtgt todosArcosBP (creaGrafo [12] [(11)(12)]) 1 1
-- [[1]]
todosArcosBP Ord a =gt Grafo a -gt a -gt a -gt [[a]]
todosArcosBP g x y = aux [[y]]
where aux [] = []
aux ([]zss) = aux zss
aux ((zzs)zss)
| z == x = (zzs) aux zss
| otherwise =
aux ([vzzs | v lt- adyacentes g z zs] ++ zss)
g = eliminaLazos g
eliminaLazos h = creaGrafo (vertices h)
37 Caminos en grafos 91
[(xy) | (xy) lt- aristas h x = y]
La funcioacuten (todosArcosBA g u v) devuelve una lista con todos los caminos simplesposibles en el grafo g entre los veacutertices u y v utilizando una algoritmo de buacutesquedaen anchura sobre el grafo g Este algoritmo recorre el grafo por niveles de formaque el primer camino de la lista es de longitud miacutenima
-- | Ejemplos
-- gtgtgt grafoCiclo 4
-- G [1234] [(12)(14)(23)(34)]
-- gtgtgt todosArcosBA (grafoCiclo 4) 1 4
-- [[14][1234]]
-- gtgtgt todosArcosBA (grafoCiclo 4) 4 1
-- [[41][4321]]
-- gtgtgt todosArcosBA (creaGrafo [14] [(12)(34)]) 1 4
-- []
-- gtgtgt todosArcosBA (creaGrafo [12] [(11)(12)]) 1 1
-- [[1]]
todosArcosBA Ord a =gt Grafo a -gt a -gt a -gt [[a]]
todosArcosBA g x y = aux [[y]]
where aux [] = []
aux ([]zss) = aux zss
aux ((zzs)zss)
| z == x = (zzs) aux zss
| otherwise =
aux (zss ++ [vzzs | v lt- adyacentes g z zs])
g = eliminaLazos g
Vamos a comprobar con QuickCheck que el primer elemento de la lista que de-vuelve la funcioacuten (todosArcosBA g u v) es de longitud miacutenima Para ello vamos autilizar la funcioacuten (parDeVertices g) que es un generador de pares de veacutertices delgrafo no nulo g Por ejemplo
ghcigt sample (parDeVertices (creaGrafo [19] []))
(39)
(93)
(74)
(43)
(28)
(72)
(84)
(53)
(72)
(31)
(72)
92 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
parDeVertices Grafo Int -gt Gen (IntInt)
parDeVertices g = do
x lt- elements vs
y lt- elements vs
return (xy)
where vs = vertices g
La propiedad es
prop_todosArcosBA Grafo Int -gt Property
prop_todosArcosBA g =
not (esGrafoNulo g) ==gt
forAll (parDeVertices g)
((xy) -gt let zss = todosArcosBA g x y
in null zss || longitudCamino (head zss) ==
minimum (map longitudCamino zss))
La comprobacioacuten es
ghcigt quickCheck prop_todosArcosBA
+++ OK passed 100 tests
Veamos que la funcioacuten (todosArcosBP g u v) no verifica la propiedad
ghcigt quickCheck prop_todosArcosBP
Failed Falsifiable (after 6 tests)
G [12345] [(12)(14)(15)(22)(23)(24)(44)(45)(55)]
(52)
prop_todosArcosBP Grafo Int -gt Property
prop_todosArcosBP g =
not (esGrafoNulo g) ==gt
forAll (parDeVertices g)
((xy) -gt let zss = todosArcosBP g x y
in null zss || longitudCamino (head zss) ==
minimum (map longitudCamino zss))
La funcioacuten (numeroArcosDeLongitud g u v k) devuelve el nuacutemero de caminos en-tre los veacutertices u y v en el grafo g que tienen longitud k
-- | Ejemplos
-- gtgtgt numeroArcosDeLongitud (completo 6) 1 3 4
-- 24
-- gtgtgt numeroArcosDeLongitud grafoPetersen 1 3 4
-- 4
numeroArcosDeLongitud Ord a =gt Grafo a -gt a -gt a -gt Int -gt Int
numeroArcosDeLongitud g u v k =
length (filter p (todosArcosBA g u v))
where p vs = longitudCamino vs == k
37 Caminos en grafos 93
374 Conexioacuten
Definicioacuten 375 Dado un grafo G = (V A) sean u v isin V Si existe alguacuten camino entreu y v en el grafo G diremos que estaacuten conectados y lo denotamos por u v
La funcioacuten (estanConectados g u v) se verifica si los veacutertices u y v estaacuten conecta-dos en el grafo g
-- | Ejemplos
-- gtgtgt estanConectados (creaGrafo [14] [(12)(24)]) 1 4
-- True
-- gtgtgt estanConectados (creaGrafo [14] [(12)(34)]) 1 4
-- False
estanConectados Ord a =gt Grafo a -gt a -gt a -gt Bool
estanConectados g u v
| esGrafoNulo g = False
| otherwise = not (null (todosArcosBA g u v))
Nota 371 La funcioacuten (estanConectados g u v) no necesita calcular todos los ca-minos entre u y v Puesto que Haskell utiliza por defecto evaluacioacuten perezosa siexiste alguacuten camino entre los dos veacutertices basta calcular el primero para saber quela lista de todos los caminos no es vaciacutea
375 Distancia
Definicioacuten 376 Se define la distancia entre u y v en el grafo G como la longitud delcamino maacutes corto que los une Si u y v no estaacuten conectados decimos que la distancia esinfinita
La funcioacuten (distancia g u v) devuelve la distancia entre los veacutertices u y v en elgrafo g En caso de que los veacutertices no esteacuten conectados devuelve el valor Nothing
-- | Ejemplos
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 1
-- Just 0
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 2
-- Just 1
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 3
-- Just 2
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 4
-- Nothing
distancia Ord a =gt Grafo a -gt a -gt a -gt Maybe Int
distancia g u v
| estanConectados g u v =
Just (longitudCamino (head (todosArcosBA g u v)))
| otherwise = Nothing
94 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Definicioacuten 377 Dado G = (V A) un grafo sean u v isin V Un camino entre u y v cuyalongitud coincide con la distancia entre los veacutertices se llama geodeacutesica entre u y v
La funcioacuten (esGeodesica g c) se verifica si el camino c es una geodeacutesica entre susextremos en el grafo g
-- | Ejemplos
-- gtgtgt let g = creaGrafo [14] [(12)(13)(23)(34)]
-- gtgtgt esGeodesica g [134]
-- True
-- gtgtgt esGeodesica g [1234]
-- False
esGeodesica Ord a =gt Grafo a -gt [a] -gt Bool
esGeodesica g c =
esCamino g c ampamp
longitudCamino c == fromJust (distancia g u v)
where u = head c
v = last c
Nota 372 No hace falta imponer en la definicioacuten de la funcioacuten que el camino seaun recorrido pues el camino de miacutenima longitud entre dos veacutertices es siempre unrecorrido
376 Caminos cerrados
Definicioacuten 378 Un camino en un grafo G se dice cerrado si sus extremos son igualesDiremos que un camino cerrado de longitud tres es un triaacutengulo
La funcioacuten (esCerrado g c) se verifica si el camino c es cerrado en el grafo g
-- | Ejemplos
-- gtgtgt let g = creaGrafo [14] [(12)(13)(23)(34)]
-- gtgtgt esCerrado g [1231]
-- True
-- gtgtgt esCerrado g [123]
-- False
-- gtgtgt esCerrado g [1241]
-- False
esCerrado (Ord a) =gt Grafo a -gt [a] -gt Bool
esCerrado _ [] = False
esCerrado g (vc) =
esCamino g c ampamp v == last c
La funcioacuten (triangulos g v) devuelve la lista de todos los triaacutengulos que pasanpor el veacutertice v en el grafo g
-- | Ejemplos
-- gtgtgt triangulos (completo 4) 3
37 Caminos en grafos 95
-- [[3123][3143][3213][3243][3413][3423]]
-- gtgtgt triangulos (grafoCiclo 6) 1
-- []
triangulos Ord a =gt Grafo a -gt a -gt [[a]]
triangulos g u = todosCaminos g u u 3
377 Circuitos
Definicioacuten 379 Un recorrido en un grafo G se dice circuito si sus extremos son iguales
La funcioacuten (esCircuito g c) se verifica si la sucesioacuten de veacutertices c es un circuitoen el grafo g
-- | Ejemplos
-- gtgtgt grafoCiclo 4
-- G [1234] [(12)(14)(23)(34)]
-- gtgtgt esCircuito (grafoCiclo 4) [12341]
-- True
-- gtgtgt esCircuito (grafoCiclo 4) [1234]
-- False
-- gtgtgt esCircuito (grafoCiclo 4) [1234141]
-- False
esCircuito (Ord a) =gt Grafo a -gt [a] -gt Bool
esCircuito g c =
esRecorrido g c ampamp esCerrado g c
378 Ciclos
Definicioacuten 3710 Un camino simple en un grafo G se dice que es un ciclo si sus extremosson iguales
La funcioacuten (esCiclo g c) se verifica si el camino c es un ciclo en el grafo g
-- | Ejemplos
-- gtgtgt esCiclo (grafoCiclo 4) [121]
-- False
-- gtgtgt esCiclo (grafoCiclo 4) [12341]
-- True
-- gtgtgt esCiclo (grafoCiclo 4) [1234]
-- False
-- gtgtgt esCiclo (grafoCiclo 4) [1234141]
-- False
esCiclo (Ord a) =gt Grafo a -gt [a] -gt Bool
esCiclo g c =
esCaminoSimple g c ampamp esCerrado g c
96 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (todosCiclos g v) devuelve todos los ciclos en el grafo g que pasan porel veacutertice v
-- | Ejemplos
-- gtgtgt todosCiclos (grafoCiclo 4) 3
-- [[34123][32143]]
-- gtgtgt todosCiclos (completo 3) 2
-- [[2312][2132]]
-- gtgtgt todosCiclos (creaGrafo [123] [(11)(12)(13)(23)]) 1
-- [[1][1321][1231]]
-- gtgtgt todosCiclos (creaGrafo [12] [(12)(22)(23)]) 2
-- [[2]]
todosCiclos Ord a =gt Grafo a -gt a -gt [[a]]
todosCiclos g x =
map f (filter p (concat [todosArcosBA g x u | u lt- a x]))
where p c = longitudCamino c = 1
f c | longitudCamino c == 0 = c
| otherwise = c ++ [x]
a = adyacentes g
Nota 373 El algoritmo utilizado en la definicioacuten de (todosCiclos g) es el de buacutes-queda en anchura Este algoritmo recorre el grafo por niveles de forma que el pri-mer camino de la lista es de longitud miacutenima
379 Grafos aciacuteclicos
Definicioacuten 3711 Diremos que un grafo G = (V A) es aciacuteclico si no contiene ninguacutenciclo es decir si forallv isin V no existe ninguacuten camino simple que comience y termine en v
La funcioacuten (esAciclico g) se verifica si el grafo g es aciacuteclico
-- | Ejemplo
-- gtgtgt esAciclico (creaGrafo [14] [(12)(24)])
-- True
-- gtgtgt esAciclico (grafoCiclo 5)
-- False
-- gtgtgt esAciclico (grafoEstrella 6)
-- True
esAciclico Ord a =gt Grafo a -gt Bool
esAciclico g =
and [null (todosCiclos g x) | x lt- vertices g]
38 Conectividad de los grafos 97
38 Conectividad de los grafos
381 Estar conectados por un camino
Teorema 381 Dado un grafo G la relacioacuten u sim v (estar conectados por un camino) es unarelacioacuten de equivalencia
La funcioacuten (estarConectadosCamino g) devuelve la relacioacuten entre los veacutertices delgrafo g de estar conectados por un camino en eacutel
-- | Ejemplo
-- gtgtgt estarConectadosCamino (creaGrafo [14] [(12)(24)])
-- [(11)(12)(14)(21)(22)(24)(33)(41)(42)(44)]
estarConectadosCamino Ord a =gt Grafo a -gt [(aa)]
estarConectadosCamino g =
[(uv) | u lt- vs v lt- vs estanConectados g u v]
where vs = vertices g
A continuacioacuten comprobaremos el resultado con QuickCheck
ghcigt quickCheck prop_conectadosRelEqui
+++ OK passed 100 tests
prop_conectadosRelEqui Grafo Int -gt Bool
prop_conectadosRelEqui g =
esRelacionEquivalencia (vertices g) (estarConectadosCamino g)
382 Componentes conexas de un grafo
Definicioacuten 382 Las clases de equivalencia obtenidas por la relacioacuten sim estar conectadospor un camino en un grafo G inducen subgrafos en G los veacutertices y todas las aristas de loscaminos que los conectan que reciben el nombre de componentes conexas por caminosde G
La funcioacuten (componentesConexas1 g) devuelve las componentes conexas por cami-nos del grafo g
-- | Ejemplos
-- gtgtgt componentesConexas (creaGrafo [15] [(12)(23)])
-- [[123][4][5]]
-- gtgtgt componentesConexas (creaGrafo [15] [(12)(23)(45)])
-- [[123][45]]
-- gtgtgt componentesConexas (creaGrafo [13] [(12)(23)])
-- [[123]]
componentesConexas1 Ord a =gt Grafo a -gt [[a]]
componentesConexas1 g =
clasesEquivalencia (vertices g) (estarConectadosCamino g)
98 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Vamos a definir dos nuevas funciones una que compruebe si el grafo es nulo o com-pleto pues en dichos casos las componentes seraacuten el conjunto vaciacuteo y el conjuntodel conjunto de veacutertices respectivamente y otra con un algoritmo algo maacutes comple-jo
componentesConexas2 Ord a =gt Grafo a -gt [[a]]
componentesConexas2 g
| esGrafoNulo g = []
| esCompleto g = [vertices g]
| otherwise =
clasesEquivalencia (vertices g) (estarConectadosCamino g)
componentesConexas3 Ord a =gt Grafo a -gt [[a]]
componentesConexas3 g = aux (vertices g) [] []
where aux [] [] [] = []
aux [] xs ys = [xs]
aux (vvs) [] [] =
aux (vs (a v)) (i v (a v)) (a v)
aux vs xs ys | null ((ug [a v | v lt- ys]) xs) =
xs aux vs [] []
| otherwise =
aux (vs ug [a v | v lt- ys])
(u xs (ug [a v | v lt- ys]))
(ug [a v | v lt- ys] ys)
a = adyacentes g
i = inserta
ug = unionGeneral
u = unionConjuntos
La comprobacioacuten con QuickCheck de la equivalencia de las definiciones es
ghcigt quickCheck prop_EquiComponentesConexas
+++ OK passed 100 tests
ghcigt quickCheck prop_EquiComponentesConexas2
+++ OK passed 100 tests
prop_EquiComponentesConexas Grafo Int -gt Bool
prop_EquiComponentesConexas g =
componentesConexas1 g == componentesConexas2 g
prop_EquiComponentesConexas2 Grafo Int -gt Bool
prop_EquiComponentesConexas2 g =
componentesConexas1 g == componentesConexas3 g
Comparemos ahora la eficiencia de las definiciones
ghcigt componentesConexas1 grafoNulo
[]
(003 secs 0 bytes)
38 Conectividad de los grafos 99
ghcigt componentesConexas2 grafoNulo
[]
(001 secs 0 bytes)
ghcigt componentesConexas3 grafoNulo
[]
(001 secs 0 bytes)
ghcigt length (componentesConexas1 (completo 50))
1
(023 secs 0 bytes)
ghcigt length (componentesConexas2 (completo 50))
1
(016 secs 0 bytes)
ghcigt length (componentesConexas3 (completo 50))
1
(008 secs 0 bytes)
ghcigt length (componentesConexas1 (completo 100))
1
(217 secs 205079912 bytes)
ghcigt length (componentesConexas2 (completo 100))
1
(285 secs 0 bytes)
ghcigt length (componentesConexas3 (completo 100))
1
(119 secs 0 bytes)
ghcigt length (componentesConexas1 (completo 150))
1
(1295 secs 742916792 bytes)
ghcigt length (componentesConexas2 (completo 150))
1
(2048 secs 0 bytes)
ghcigt length (componentesConexas3 (completo 150))
1
(964 secs 0 bytes)
Con grafos completos de gran tamantildeo Haskell tarda maacutes tiempo en comprobar quees completo que en calcular directamente sus clases de equivalencia y para grafosnulos apenas hay diferencia en el coste entre la primera y la segunda definicioacuten Porotra parte la tercera definicioacuten es la maacutes eficiente en todos los casos y seraacute por tantola que utilizaremos a lo largo del trabajo
componentesConexas Ord a =gt Grafo a -gt [[a]]
componentesConexas = componentesConexas3
La funcioacuten (numeroComponentes g) devuelve el nuacutemero de componentes conexasdel grafo g
-- Ejemplos
-- gtgtgt numeroComponentes (creaGrafo [15] [(12)(23)(45)])
100 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- 2
-- gtgtgt numeroComponentes (creaGrafo [14] [(12)(22)(34)])
-- 2
numeroComponentes Ord a =gt Grafo a -gt Int
numeroComponentes g
| null (aristas g) = orden g
| otherwise = length (componentesConexas g)
Nota 381 Hemos comprobado para la definicioacuten anterior que comprobar si un gra-fo es completo es muy costoso luego no conviene antildeadirlo como patroacuten
383 Grafos conexos
Definicioacuten 383 Dado un grafo diremos que es conexo si la relacioacuten tiene una uacutenica clasede equivalencia en eacutel es decir si el grafo tiene una uacutenica componente conexa
La funcioacuten (esConexo g) se verifica si el grafo g es conexo
-- Ejemplos
-- gtgtgt esConexo (creaGrafo [13] [(12)(23)])
-- True
-- gtgtgt esConexo (creaGrafo [15] [(12)(23)(45)])
-- False
esConexo Ord a =gt Grafo a -gt Bool
esConexo g = length (componentesConexas g) == 1
esConexo2 Ord a =gt Grafo a -gt Bool
esConexo2 g
| esGrafoNulo g = False
| esUnitario (vertices g) = True
| otherwise = aux (vertices g) [] []
where aux [] [] [] = False
aux [] xs _ = True
aux (vvs) [] [] | null vs = True
| null (a v) = False
| otherwise =
aux (vs a v) (i v (a v)) (a v)
aux vs xs ys | null ((ug [a v | v lt- xs]) xs) = False
| otherwise =
aux (vs (ug [a v | v lt- xs]))
(u (ug [a v | v lt- xs]) xs)
((ug [a v | v lt- xs]) xs)
a = adyacentes g
ug = unionGeneral
i = inserta
u = unionConjuntos
38 Conectividad de los grafos 101
La comprobacioacuten de la equivalencia de las definiciones con QuickCheck es
ghcigt quickCheck prop_EquiEsConexo
+++ OK passed 100 tests
prop_EquiEsConexo Grafo Int -gt Bool
prop_EquiEsConexo g =
esConexo g == esConexo2 g
Vamos a comparar ahora su eficiencia
ghcigt let g1 = grafoCiclo 100
(000 secs 0 bytes)
ghcigt let g = creaGrafo (vertices g1) (aristas g1 [(23)(9899)])
(000 secs 0 bytes)
ghcigt esConexo g
False
(117 secs 151632168 bytes)
ghcigt esConexo2 g
False
(001 secs 0 bytes)
ghcigt esConexo (grafoCiclo 500)
True
(7341 secs 10448270712 bytes)
ghcigt esConexo2 (grafoCiclo 500)
True
(18939 secs 18468849096 bytes)
ghcigt esConexo (grafoCiclo 500)
True
(7341 secs 10448270712 bytes)
ghcigt esConexo2 (grafoCiclo 500)
True
(18939 secs 18468849096 bytes)
En principio no nos proporciona ninguna ventaja la segunda definicioacuten asiacute que tra-bajaremos con la primera que hemos dado ya que es mucho maacutes sencilla
Teorema 384 Sea G un grafo G = (V A) es conexo si y solamente si forallu v isin V existe uncamino entre u y v
Vamos a comprobar el resultado con QuickCheck
ghcigt quickCheck prop_caracterizaGrafoConexo
+++ OK passed 100 tests
prop_caracterizaGrafoConexo Grafo Int -gt Property
prop_caracterizaGrafoConexo g =
not (esGrafoNulo g) ==gt
esConexo g == and [estanConectados g u v
| u lt- vertices g v lt- vertices g]
102 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
384 Excentricidad
Definicioacuten 385 Sean G = (V A) un grafo y v isin V Se define la excentricidad de v comoel maacuteximo de las distancias entre v y el resto de veacutertices de G La denotaremos por e(v)
La funcioacuten (excentricidad g v) devuelve la excentricidad del veacutertice v en el grafog
-- | Ejemplos
-- gtgtgt let g = creaGrafo [13] [(12)(23)(33)]
-- gtgtgt excentricidad g 1
-- Just 2
-- gtgtgt excentricidad g 2
-- Just 1
-- gtgtgt excentricidad (creaGrafo [13] [(12)(33)]) 1
-- Nothing
excentricidad Ord a =gt Grafo a -gt a -gt Maybe Int
excentricidad g u
| esGrafoNulo g = Nothing
| orden g == 1 = Just 0
| Nothing `elem` distancias = Nothing
| otherwise = maximum distancias
where distancias = [distancia g u v | v lt- vertices g [u]]
La funcioacuten (excentricidades g) devuelve la lista ordenada de las excentricidadesde los veacutertices del grafo g
-- | Ejemplos
-- gtgtgt excentricidades (creaGrafo [13] [(12)(23)(33)])
-- [Just 1Just 2Just 2]
-- gtgtgt excentricidades (creaGrafo [13] [(12)(33)])
-- [NothingNothingNothing]
excentricidades Ord a =gt Grafo a -gt [Maybe Int]
excentricidades g = sort (map (excentricidad g) (vertices g))
385 Diaacutemetro
Definicioacuten 386 Sea G = (V A) un grafo Se define el diaacutemetro de G como el maacuteximo delas distancias entre los veacutertices en V Lo denotaremos por d(G)
La funcioacuten (diametro g) devuelve el diaacutemetro del grafo g
-- | Ejemplos
-- gtgtgt diametro (creaGrafo [13] [(12)(23)(33)])
-- Just 2
-- gtgtgt diametro (creaGrafo [13] [(12)(33)])
-- Nothing
diametro Ord a =gt Grafo a -gt Maybe Int
38 Conectividad de los grafos 103
diametro g
| esGrafoNulo g = Nothing
| Nothing `elem` distancias = Nothing
| otherwise = maximum distancias
where vs = vertices g
distancias = [distancia g u v | u lt- vs v lt- vs u lt= v]
386 Radio
Definicioacuten 387 Sean G = (V A) un grafo y v isin V Se define el radio de G como elmiacutenimo de las excentricidades de sus veacutertices Lo denotaremos por r(G)
La funcioacuten (radio g) devuelve el radio del grafo g
-- | Ejemplos
-- gtgtgt radio (creaGrafo [13] [(12)(23)(33)])
-- Just 1
-- gtgtgt radio (creaGrafo [13] [(12)(33)])
-- Nothing
radio Ord a =gt Grafo a -gt Maybe Int
radio g
| esGrafoNulo g = Nothing
| Nothing `elem` ds = Nothing
| otherwise = minimum ds
where ds = [excentricidad g v | v lt- vertices g]
387 Centro
Definicioacuten 388 Sean G = (V A) un grafo Llamamos centro del grafo G al conjunto deveacutertices de excentricidad miacutenima A estos veacutertices se les denomina veacutertices centrales
La funcioacuten (centro g) devuelve el centro del grafo g Por ejemplo
-- | Ejemplos
-- gtgtgt centro (creaGrafo [13] [(12)(23)(33)])
-- [2]
-- gtgtgt centro (creaGrafo [13] [(12)(13)(23)])
-- [123]
-- gtgtgt centro (creaGrafo [13] [(12)(33)])
-- [123]
centro Ord a =gt Grafo a -gt [a]
centro g = [v | v lt- vertices g excentricidad g v == r]
where r = radio g
104 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
388 Grosor
Definicioacuten 389 Sean G = (V A) un grafo Se llama grosor o cintura del grafo G almiacutenimo de las longitudes de los ciclos de G Si el grafo no posee ciclos (es decir es un grafoaciacuteclico) se dice que su cintura es infinita
La funcioacuten (grosor g) devuelve el grosor del grafo g
-- | Ejemplos
-- gtgtgt grosor (creaGrafo [123] [(12)(23)])
-- Nothing
-- gtgtgt grosor (creaGrafo [123] [(11)(12)(23)(34)])
-- Just 0
-- gtgtgt grosor grafoPetersen
-- Just 5
-- gtgtgt grosor grafoMoebiusCantor
-- Just 6
-- gtgtgt grosor grafoHeawood
-- Just 6
-- gtgtgt grosor grafoMcGee
-- Just 7
-- gtgtgt grosor grafoTutteCoxeter
-- Just 8
grosor Ord a =gt Grafo a -gt Maybe Int
grosor g
| esAciclico g = Nothing
| otherwise = Just (minimum [longitudCamino (head yss)
| x lt- vertices g
let yss = todosCiclos g x
not (null yss)])
Propiedades del grosor de los grafos
Teorema 3810 El grosor del grafo ciclo de orden n Cn es infin si n lt 3 y 3 en caso contrario
La propiedad se expresa por
prop_grosor_grafoCiclo Int -gt Bool
prop_grosor_grafoCiclo n =
grosor (grafoCiclo n) == if n lt 3
then Nothing
else Just n
Su comprobacioacuten para n le 30 es
ghcigt all prop_grosor_grafoCiclo [130]
True
Teorema 3811 El grosor del grafo amistad de orden n es 3 para todo n
38 Conectividad de los grafos 105
prop_grosor_grafoAmistad Int -gt Bool
prop_grosor_grafoAmistad n =
grosor (grafoAmistad n) == Just 3
Su comprobacioacuten para n le 30 es
ghcigt all prop_grosor_grafoAmistad [130]
True
Teorema 3812 El grosor del grafo completo de orden n Kn es infin si n lt 3 y 3 en casocontrario
La propiedad se expresa por
prop_grosor_completo Int -gt Bool
prop_grosor_completo n =
grosor (completo n) == if n lt 3
then Nothing
else Just 3
Su comprobacioacuten para n le 30 es
ghcigt all prop_grosor_completo [130]
True
Teorema 3813 El grosor del grafo bipartito completo de orden Kmn es infin si m = 1 oacuten = 1 y es 4 en caso contrario y 3 en caso contrario
La propiedad se expresa por
prop_grosor_bipartitoCompleto Int -gt Int -gt Bool
prop_grosor_bipartitoCompleto m n =
grosor (bipartitoCompleto m n) == if m == 1 || n == 1
then Nothing
else Just 4
Su comprobacioacuten para 1 le m le n le 15 es
ghcigt and [prop_grosor_bipartitoCompleto m n | m lt- [115] n lt- [m15]]
True
Teorema 3814 El grosor del grafo rueda de orden n Wn es infin si n lt 3 y 3 en caso contrario
La propiedad se expresa por
prop_grosor_grafoRueda Int -gt Bool
prop_grosor_grafoRueda n =
grosor (grafoRueda n) == if n lt 3
then Nothing
else Just 3
106 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Su comprobacioacuten para 1 le n le 30 es
ghcigt all prop_grosor_grafoRueda [130]
True
389 Propiedades e invariantes por isomorfismos
Teorema 3815 Sean G = (V A) y Gprime = (Vprime Aprime) grafos isomorfos con φ V rarr Vprime unisomorfismo Entonces dados u v isin V u sim v si y solamente si φ(u) sim φ(v)
La comprobacioacuten del teorema con QuickCheck es
ghcigt quickCheck prop_ConexionIsomorfismo1
+++ OK passed 100 tests
prop_ConexionIsomorfismo1 Grafo Int -gt Grafo Int -gt Bool
prop_ConexionIsomorfismo1 g h =
not (isomorfos g h) ||
and [ec g u v == ec h (imagen phi u) (imagen phi v)
| u lt- vs
v lt- vs
phi lt- isomorfismos g h]
where vs = vertices g
ec = estanConectados
Teorema 3816 Sean G = (V A) y Gprime = (Vprime Aprime) grafos isomorfos con φ V rarr Vprime unisomorfismo Entonces φ lleva cada componente conexa de G en una componente conexa deGprime
La comprobacioacuten del teorema con QuickCheck es
ghcigt quickCheck prop_ConexionIsomorfismo2
+++ OK passed 100 tests
prop_ConexionIsomorfismo2 Grafo Int -gt Grafo Int -gt Bool
prop_ConexionIsomorfismo2 g h =
not(isomorfos g h) ||
and [conjuntosIguales cch (aux f) | f lt- isomorfismos g h]
where cch = componentesConexas h
ccg = componentesConexas g
aux f = map (sort imagenConjunto f) ccg
Teorema 3817 Sean G = (V A) y Gprime = (Vprime Aprime) grafos isomorfos con φ V rarr Vprime unisomorfismo Entonces G y Gprime tienen el mismo nuacutemero de componentes conexas
La comprobacioacuten del teorema con QuickCheck es
38 Conectividad de los grafos 107
ghcigt quickCheck prop_ConexionIsomorfismo3
+++ OK passed 100 tests
prop_ConexionIsomorfismo3 Grafo Int -gt Grafo Int -gt Bool
prop_ConexionIsomorfismo3 g h =
not (isomorfos g h) ||
numeroComponentes g == numeroComponentes h
Teorema 3818 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que el diaacutemetro de G es igual al diaacutemetro de Gprime es decir el diaacutemetrode un grafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos diametro)
+++ OK passed 100 tests
Teorema 3819 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces se verifica que el radio de G es igual al radio de Gprime es decir el radio de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos radio)
+++ OK passed 100 tests
Teorema 3820 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que el grosor de G es igual al grosor de Gprime es decir el grosor de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos grosor)
+++ OK passed 100 tests
Teorema 3821 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que el centro de G es igual al centro de Gprime es decir el centro de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos centro)
+++ OK passed 100 tests
Teorema 3822 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces se verifica que el nuacutemero de componentes conexas de G es igual al nuacutemerode las de Gprime es decir el nuacutemero de componentes conexas de un grafo es un invariante porisomorfismos
108 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos numeroComponentes)
+++ OK passed 100 tests
Teorema 3823 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que los valores que toman las excentricidades de los veacutertices G esigual al de los veacutertices de Gprime es decir el conjunto de valores que toman las excentricidadesde los veacutertices es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos excentricidades)
+++ OK passed 100 tests
Capiacutetulo 4
Matrices asociadas a grafos
En este capiacutetulo se definiraacuten algunas representaciones de grafos como matrices secomprobaraacuten sus propiedades y volveremos a definir algunos conceptos del capiacutetu-lo 3 ahora utilizando matricesPara elaborar el contenido del capiacutetulo utilizareacute el segundo tema del trabajo fin degrado de Fco Javier Franco Galviacuten Aspectos algebraicos en teoriacutea de grafos ([7]) En eltrabajo el autor introduce los conceptos de matriz de adyacencia matriz de incidenciay otras matrices asociadas a grafos
41 Generador de grafos simples
En esta seccioacuten presentaremos el generador de grafos que nos permitiraacute generargrafos simples como listas de aristas arbitrariamente y usarlos como ejemplos opara comprobar propiedades en la seccioacuten de matrices asociadas a grafos(grafoSimple) es un generador de grafos simples de hasta 10 veacutertices Por ejemplo
ghcigt sample grafoSimple
G [12345678] [(14)(15)(16)(17)(18)(23)
(24)(25)(27)(35)(37)(45)(46)(56)(67)]
G [123456789] [(14)(18)(23)(25)(29)
(34)(35)(36)(38)(39)(46)(48)(49)
(58)(59)(69)(78)]
G [123456] [(12)(13)(24)(25)(26)(35)(56)]
G [1234567] [(12)(13)(14)(24)(25)(26)
(36)(45)(46)(67)]
G [1234] [(13)(14)(23)(34)]
G [123] [(23)]
G [12] [(12)]
G [123456] [(16)(24)(26)(35)(36)(56)]
G [123456789] [(12)(14)(15)(16)(17)(24)
(34)(37)(38)(39)(45)(47)(49)(56)(57)
(58)(59)(67)(69)(78)(79)]
109
110 Capiacutetulo 4 Matrices asociadas a grafos
G [123456789] [(13)(14)(15)(16)(23)(24)
(29)(35)(39)(45)(47)(48)(49)(57)(58)
(59)(67)(68)(69)(79)]
G [1] []
grafoSimple Gen (Grafo Int)
grafoSimple = do
n lt- choose (010)
as lt- sublistOf [(xy) | x lt- [1n] y lt- [x+1n]]
return (creaGrafo [1n] as)
42 Matrices de adyacencia
421 Definicioacuten y propiedades
Usaremos la funcioacuten (imprimeMatriz p) para imprimir por pantalla la matriz p conuna fila por liacutenea
-- | Ejemplo
-- gtgtgt imprimeMatriz (fromLists [[134][357][479]])
-- [134]
-- [357]
-- [479]
imprimeMatriz Show a =gt Matrix a -gt IO ()
imprimeMatriz p =
mapM_ print (toLists p)
Definicioacuten 421 Sea G = (V A) un grafo simple con V = v1 vn Se define sumatriz de adyacencia como Antimesn = (aij) donde el elemento aij toma el valor 1 si existealguna arista en A uniendo los veacutertices vi y vj y 0 en caso contrario
Nota 421 La matriz de adyacencia depende del etiquetado del grafo
La funcioacuten (matrizAdyacencia g) es la matriz de adyacencia del grafo g
-- | Ejemplo
-- gtgtgt imprimeMatriz (matrizAdyacencia (grafoCiclo 4))
-- [0101]
-- [1010]
-- [0101]
-- [1010]
-- gtgtgt imprimeMatriz (matrizAdyacencia (completo 4))
-- [0111]
-- [1011]
-- [1101]
-- [1110]
42 Matrices de adyacencia 111
matrizAdyacencia Grafo Int -gt Matrix Int
matrizAdyacencia g = matrix n n f
where n = orden g
f (ij) | (ij) `aristaEn` g = 1
| otherwise = 0
422 Propiedades baacutesicas de las matrices
La funcioacuten (esSimetrica p) se verifica si la matriz p es simeacutetrica
-- ejemplo
-- gtgtgt esSimetrica (fromLists [[134][357][479]])
-- True
-- gtgtgt esSimetrica (fromLists [[134][357][497]])
-- False
esSimetrica Eq a =gt Matrix a -gt Bool
esSimetrica p =
transpose p == p
La funcioacuten (potencia p n) devuelvela potencia nndasheacutesima de la matriz cuadrada p
-- Ejemplo
-- gtgtgt potencia (fromLists [[134][357][479]]) 3
-- ( 408 735 975 )
-- ( 735 1323 1755 )
-- ( 975 1755 2328 )
potencia Num a =gt Matrix a -gt Int -gt Matrix a
potencia p 1 = p
potencia p n = if (odd n)
then (m p (potencia (m p p) (div (n-1) 2)))
else (potencia (m p p) (div (n-1) 2))
where m = multStd2
423 Propiedades de las matrices de adyacencia
Teorema 422 Para todo n la matriz de adyacencia del grafo ciclo de orden n Cn es simeacute-trica
ghcigt all prop_simetricaAdyacenciaCompleto [130]
True
prop_simetricaAdyacenciaCompleto Int -gt Bool
prop_simetricaAdyacenciaCompleto n =
esSimetrica (matrizAdyacencia (completo n))
La funcioacuten (tamantildeoM g) devuelve el tamantildeo del grafo simple g calculado usandosu matriz de adyacencia
112 Capiacutetulo 4 Matrices asociadas a grafos
-- | Ejemplos
-- gtgtgt tamantildeoM (grafoCiclo 4)
-- 4
-- gtgtgt tamantildeoM grafoPetersen
-- 15
tamantildeoM Grafo Int -gt Int
tamantildeoM g = sum (toList (matrizAdyacencia g)) `div` 2
Teorema 423 El tamantildeo de un grafo simple es la mitad de la suma de los elementos de sumatriz de adyacencia
La comprobacioacuten del teorema con QuickCheck es
ghcigt quickCheck prop_tamantildeoMatriz
+++ OK passed 100 tests
prop_tamantildeoMatriz Property
prop_tamantildeoMatriz =
forAll grafoSimple
(g -gt tamantildeo g == tamantildeoM g)
Teorema 424 Si un grafo G = (V A) tiene un veacutertice aislado vi tanto la fila como lacolumna indasheacutesima de su matriz de adyacencia estaraacuten formadas por ceros
esAisladoM Grafo Int -gt Int -gt Bool
esAisladoM g v = if (all (==0)
(((toLists (ma g)) (v-1))
++((toLists (t (ma g))) (v-1))))
then True
else False
where ma = matrizAdyacencia
t = transpose
La comprobacioacuten del teorema es
ghcigt quickCheck prop_esAisladoMatriz
+++ OK passed 100 tests
prop_esAisladoMatriz Property
prop_esAisladoMatriz =
forAll grafoSimple
(g -gt and [esAislado g v == esAisladoM g v
| v lt- vertices g])
Teorema 425 Sea un grafo G = (V A) simple no dirigido con V = v1 vn Lasuma de los elementos de la fila (o columna) indasheacutesima de su matriz de adyacencia coincide conel grado del veacutertice vi Es decir
42 Matrices de adyacencia 113
δ(vi) =n
sumj=1
aij =n
sumj=1
aji
gradoM Grafo Int -gt Int -gt Int
gradoM g v = sum ((toLists (ma g)) (v-1))
where ma = matrizAdyacencia
La comprobacioacuten del teorema es
ghcigt quickCheck prop_gradoMatriz
+++ OK passed 100 tests
prop_gradoMatriz Property
prop_gradoMatriz =
forAll grafoSimple
(g -gt and [grado g v == gradoM g v | v lt- vertices g])
Teorema 426 Sea G = (V A) un grafo bipartito de conjuntos de veacutertices disjuntosV1 = v1 vk y V2 = vk+1 vn tal que V = V1 cup V2 y soacutelo existen aristasque conectan veacutertices de V1 con veacutertices de V2 Entonces con este etiquetado de V la matrizde adyacencia de G tiene la forma
A =
(θ BBt θ
)
prop_BipartitoMatriz Grafo Int -gt Property
prop_BipartitoMatriz g =
esBipartito g ==gt
all (==0) [ getElem u v m | [uv] lt- (f (fromJust p))]
where f (xsys) = filter p (subsequences xs ++ subsequences ys)
where p zs = length zs == 2
p = conjuntosVerticesDisjuntos g
m = matrizAdyacencia g
424 Caminos y arcos
En esta seccioacuten se presentaraacute la informacioacuten que contiene la matriz de adyacenciade un grafo en relacioacuten a los caminos que se encuentran en eacutel
Teorema 427 Sea G = (V A) un grafo con V = v1 vn y matriz de adyacenciaA = (aij) Entonces forallk ge 0 el elemento (i j) de Ak que denotaremos por ak
ij es elnuacutemero de caminos de longitud k desde el veacutertice vi al veacutertice vj
114 Capiacutetulo 4 Matrices asociadas a grafos
numeroCaminosDeLongitudM Grafo Int -gt Int -gt Int -gt Int -gt Int
numeroCaminosDeLongitudM g u v k = getElem u v mk
where ma = matrizAdyacencia g
n = orden g
mk = foldr (multStd2) (identity n) (take k (repeat ma))
La comprobacioacuten del teorema para k le 6 es
ghcigt quickCheck prop_numeroCaminosMatriz
+++ OK passed 100 tests
prop_numeroCaminosMatriz Grafo Int -gt Gen Bool
prop_numeroCaminosMatriz g = do
k lt- choose (06)
let vs = vertices g
return (and [ numeroCaminosDeLongitud g u v k ==
numeroCaminosDeLongitudM g u v k
|(uv) lt- productoCartesiano vs vs u lt v])
De este teorema se deducen las siguientes propiedades
Teorema 428 Sea G un grafo simple Siguiendo la notacioacuten del teorema anterior se tieneque1 a(2)ii = δ(vi)
2 a(3)ii es el nuacutemero de triaacutengulos que contienen al veacutertice vi
gradoCaminosM Grafo Int -gt Int -gt Int
gradoCaminosM g v = getElem v v m2
where m = matrizAdyacencia g
m2 = multStd2 m m
numeroTriangulosM Grafo Int -gt Int -gt Int
numeroTriangulosM g v = getElem v v (potencia m 3)
where m = matrizAdyacencia g
La comprobacioacuten con QuickCheck es
ghcigt quickCheck prop_GradoCaminosMatriz
+++ OK passed 100 tests
ghcigt quickCheck prop_TriangulosMatriz
+++ OK passed 100 tests
prop_GradoCaminosMatriz Grafo Int -gt Bool
prop_GradoCaminosMatriz g =
and [ grado g v == gradoCaminosM g v | v lt- vertices g]
42 Matrices de adyacencia 115
prop_TriangulosMatriz Property
prop_TriangulosMatriz =
forAll grafoSimple
(g -gt and [length (triangulos g v) ==
numeroTriangulosM g v | v lt- vertices g])
116 Capiacutetulo 4 Matrices asociadas a grafos
Capiacutetulo 5
Apeacutendices
51 Sistemas utilizados
El desarrollo de mi Trabajo de Fin de Grado requeriacutea de una infraestructura teacutecnicaque he tenido que trabajar antes de comenzar a desarrollar el contenido A conti-nuacioacuten voy a nombrar y comentar los sistemas y paquetes que he utilizado a lolargo del proyectobull Ubuntu como sistema operativo El primer paso fue instalar Ubuntu en mi orde-
nador portaacutetil personal Para ello seguiacute las recomendaciones de mi compantildeeroEduardo Paluzo quien ya lo habiacutea hecho antesPrimero me descargueacute la imagen del sistema Ubuntu 1604 LTS (para procesadorde 64 bits) desde la paacutegina de descargas de Ubuntu 1 y tambieacuten la herramientaLinuxLive USB Creator 2 que transformariacutea mi pendrive en una unidad USB Boo-teable cargada con la imagen de Ubuntu Una vez tuve la unidad USB preparadaprocediacute a instalar el nuevo sistema apagueacute el dispositivo y al encenderlo entreacuteen el Boot Menu de la BIOS del portaacutetil para arrancar desde el Pendrive en vez dehacerlo desde el disco duro Automaacuteticamente comenzoacute la instalacioacuten de Ubuntuy solo tuve que seguir las instrucciones del asistente para montar Ubuntu mante-niendo ademaacutes Windows 10 que era el sistema operativo con el que habiacutea estadotrabajando hasta ese momentoEl resultado fue un poco agridulce pues la instalacioacuten de Ubuntu se habiacutea reali-zado con eacutexito sin embargo al intentar arrancar Windows desde la nueva GRUBme daba un error al cargar la imagen del sistema Despueacutes de buscar el error queme apareciacutea en varios foros encontreacute una solucioacuten a mi problema deshabiliteacute elSecurity Boot desde la BIOS y pude volver a arrancar Windows 10 con normali-dad
1httpwwwubuntucomdownloaddesktop2httpwwwlinuxliveusbcom
117
118 Capiacutetulo 5 Apeacutendices
bull LATEX como sistema de composicioacuten de textos La distribucioacuten de LATEXTex Livecomo la mayoriacutea de software que he utilizado la descargueacute utilizando el Gestorde Paquetes Synaptic Anteriormente soacutelo habiacutea utilizado TexMaker como editorde LATEX asiacute que fue el primero que descargueacute Maacutes tarde mi tutor Joseacute Antoniome sugirioacute que mejor descargara el paquete AUCTex pues me permitiriacutea trabajarcon archivos TEX desde el editor Emacs asiacute lo hice y es el que he utilizado pararedactar el trabajo Ademaacutes de los que me recomendaba el gestor solo he tenidoque descargarme el paquete spanish de babel para poder componer el trabajo puesel paquete Tikz que he utilizado para representar los grafos veniacutea incluido en lassugerencias de Synapticbull Haskell como lenguaje de programacioacuten Ya habiacutea trabajado anteriormente con
este lenguaje en el grado y sabiacutea que soacutelo teniacutea que descargarme la plataforma deHaskell y podriacutea trabajar con el editor Emacs Seguiacute las indicaciones que se dan alos estudiantes de primer curso en la paacutegina del Dpto de Ciencias de la Compu-tacioacuten e Inteligencia Artificial 3 y me descargueacute los paquetes haskell-platform yhaskell-mode desde el Gestor de Paquetes Synaptic La versioacuten de la plataforma deHaskell con la que he trabajado es la 2014200debian2 y la del compilador GHC la7103-7bull Dropbox como sistema de almacenamiento compartido Ya habiacutea trabajado con
Dropbox en el pasado asiacute que crear una carpeta compartida con mis tutores nofue ninguacuten problema sin embargo al estar Dropbox sujeto a software no libre nome resultoacute tan sencillo instalarlo en mi nuevo sistema En primer lugar intenteacutehacerlo directamente desde Ubuntu Software que intentoacute instalar Dropbox Nauti-lus y abrioacute dos instalaciones en paralelo Se quedoacute colgado el ordenador asiacute quemateacute los procesos de instalacioacuten activos reinicieacute el sistema y me descargueacute direc-tamente el paquete de instalacioacuten desde la paacutegina de descargas de Dropbox 4 y loejecuteacute desde la terminalbull Git como sistema remoto de control de versiones Era la primera vez que trabaja-
ba con Git y me costoacute bastante adaptarme Mi tutor Joseacute Antonio y mi compantildeeroEduardo Paluzo me ayudaron mucho e hicieron el proceso de adaptacioacuten muchomaacutes aacutegil El manual que Eduardo ha redactado y presenta en su Trabajo Fin deGrado me ha sido muy uacutetil es una pequentildea guiacutea que cualquier interesado en elempleo de Git puede utilizar como introduccioacuten La instalacioacuten no resultoacute com-plicada a traveacutes del Gestor de Paquetes Synaptic me descargueacute el paquete elpa-magity todos los demaacutes paquetes necesarios para trabajar con Git en mi portaacutetil usandoel editor Emacs Eduardo me ayudoacute a crear el repositorio MDenHaskell en la plata-forma GitHub y clonarlo en mi ordenador personal Dicho repositorio contiene el
3httpwwwcsuses~jalonsocursosi1m-15sistemasphp4httpswwwdropboxcomesinstallos=lnx
52 Mapa de decisiones de disentildeo en conjuntos 119
total del trabajo y se almacena de forma puacuteblica La versioacuten de Magit que utilizoes la 250-2
52 Mapa de decisiones de disentildeo en conjuntos
Una vez comenzado el trabajo y habiendo hecho ya varias secciones acerca de laTeoriacutea de Grafos se puso de manifiesto la conveniencia de crear nuevos capiacutetulosintroduciendo conceptos de la Teoriacutea de Conjuntos y las relaciones que se puedenpresentar entre sus elementosHaskell tiene una libreriacutea especiacutefica para conjuntos DataSet sin embargo no estan intuitiva ni tan eficiente como la de listas (DataList) A lo largo del proyecto hecreado un moacutedulo que permite trabajar con conjuntos utilizando tanto su represen-tacioacuten como listas ordenadas sin elementos repetidos como su representacioacuten comolistas sin elementos repetidos Dicho moacutedulo se llama Conjuntos y lo presento en elprimer capiacutetulo del Trabajo
53 Mapa de decisiones de disentildeo en grafos
Al comienzo del proyecto la idea era que las primeras representaciones con lasque trabajara fueran las de grafos como vectores de adyacencia y grafos como matricesde adyacencia que se utilizan en Informaacutetica en el primer curso del Grado con lasque ya habiacutea trabajado y estaba familiarizadaLas definiciones de Informaacutetica estaacuten pensadas para grafos ponderados (dirigidoso no seguacuten se eligiera) mientras que en Matemaacutetica Discreta apenas se usan grafosdirigidos o ponderados por tanto el primer cambio en la representacioacuten utilizadafue simplificar las definiciones de modo que solo trabajaacuteramos con grafos no diri-gidos y no ponderados pero manteniendo las estructuras vectorial y matricial quemanteniacutean la eficienciaLas representaciones que utilizan arrays en Haskell son muy restrictivas pues soloadmiten vectores y matrices que se puedan indexar lo que hace muy complicadostodos los algoritmos que impliquen alguacuten cambio en los veacutertices de los grafos yademaacutes no permite trabajar con todos los tipos de veacutertices que pudieacuteramos desearDecidimos volver a cambiar la representacioacuten y esta vez nos decantamos por larepresentacioacuten de grafos como listas de aristas perdiendo en eficiencia pero ganandomucho en flexibilidad de escrituraPor uacuteltimo mis tutores sugirieron dar una representacioacuten de los grafos mediantesus matrices de adyacencia y comprobar la equivalencia de las definiciones que yahabiacutea hecho en otros moacutedulos con las dadas para esta representacioacuten Para ello he
120 Capiacutetulo 5 Apeacutendices
trabajado con la libreriacutea DataMatrix de Haskell
Bibliografiacutea
[1] J Alonso Temas de programacioacuten funcional Technical report Univ de Sevilla2015
[2] P Burzyn Complejidad computacional en problemas de modificacioacuten de aris-tas en grafos Technical report Univ de Buenos Aires
[3] K Claessen and J Hughes QuickCheckA Lightweight Tool for Random Tes-ting of Haskell Programs Technical report Chalmers University of Technology2000
[4] M Caacuterdenas Matemaacutetica discreta Technical report Univ de Sevilla 2015
[5] D de Matemaacuteticas El regalo de Cantor Technical report IES Matarrantildea deValderrobres 2009
[6] D de Aacutelgebra Aacutelgebra Baacutesica tema 1 Conjuntos Technical report Univ deSevilla 2015
[7] F Franco Aspectos algebraicos en Teoriacutea de Grafos Technical report Univ deSevilla 2016
[8] F Rabhi and G Lapalme Algorithms A functional programming approachAddison-Wesley Longman Publishing Co Inc Boston MA USA 1st edition1999
[9] P Vasconcelos Property Testing using QuickCheck Technical report Univer-sidade do Porto 2016
[10] Wikipedia Set (mathematics) Technical report Wikipedia La Enciclopedialibre 2016
[11] Wikipedia AnexoGaleriacutea de grafos Technical report Wikipedia La Enciclo-pedia libre 2016
[12] Wikipedia Teoriacutea de la complejidad computacional Technical report Wikipe-dia La Enciclopedia libre 2017
121
Iacutendice alfabeacutetico
Grafo 18 52adyacentes 53antiImagenRelacion 38aristaEn 53aristasCamino 88aristas 53automorfismos 87bipartitoCompleto 58biyecciones 47cardinal 22 31centro 103clasesEquivalencia 43combinaciones 25 34complementario 22 31completo 58componentesConexas1 97componentesConexas2 98componentesConexas3 98conjuntosIguales 30conjuntosIguales 21conjuntosVerticesDisjuntos 59conservaAdyacencia 78creaGrafo 52diametro 102distancia 93dominio 38eliminaArista 74eliminaLazos 74eliminaVertice 74elimina 19 28entorno 69esAisladoM 112
esAislado 69esAntisimetrica 41esAutomorfismo 86esBipartito 60esCamino 87esCerrado 94esCircuito 95esCompleto 77esConexo 100esFuncional 39esFuncion 43esGeodesica 94esInyectiva 45esIsomorfismo 81esLazo 69esReflexiva 40esRegular 70esRelacionEquivalencia 42esRelacionHomogenea 39esRelacionOrden 43esRelacion 37esSimetrica 41 111esSimple 70esSobreyectiva 45 46esSubconjuntoPropio 21 30esSubconjunto 20 29esSubgrafoMax 72esSubgrafoPropio 72esSubgrafo 72esTransitiva 41esUnitario 23 32esVacio 18 27
122
Iacutendice alfabeacutetico 123
estaRelacionado 40estanConectados 93excentricidades 102excentricidad 102funciones 44generaGrafo 54gradoM 113 114grado 69grafoAmistad 57grafoCiclo 56grafoCirculante 61grafoComplementario 77grafoEstrella 60grafoHeawood 64grafoMcGee 64grafoMoebiusCantor 67grafoNulo 55grafoPetersenGen 62grafoPetersen 66grafoRueda 61grafoSimple 110grafoThomson 63grafoTutteCoxeter 65grosor 104imagenConjunto 45imagenInversa 47imagenRelacion 38imagen 44imprimeMatriz 110inserta 18 27interseccion 33interseccion 24inversa 47isomorfismos 82isomorfos 82longitudCamino 88matrizAdyacencia 110minimoElemento 19 28morfismos 79
numeroArcosDeLongitud 92numeroCaminosDeLongitud 89numeroCaminosDeLongitugM 113numeroComponentesConexas 99numeroTriangulosM 114orden 68parDeVertices 91pertenece 19 28potencia 111productoCartesiano 34productoCartesiano 25prop_HavelHakimi 73prop_LemaApretonDeManos 73prop_completos 76prop_BipartitoMatriz 113prop_ConectadosRelEqui 97prop_ConexionIsomorfismo1 106prop_ConexionIsomorfismo2 106prop_ConexionIsomorfismo3 107prop_GradoMatriz 114prop_TriangulosMatriz 114prop_esAisladoMatriz 112prop_gradoMatriz 113prop_numeroCaminosMatriz 114prop_simetricaAdyacenciaCompleto 111prop_tamantildeoMatriz 112prop_todosArcosBA 92radio 103rango 38secuenciaGrados 71secuenciaGrafica 71sinRepetidos 19 29sonIncidentes 68sumaArista 75sumaGrafos 76 77sumaVertice 75tamantildeoM 111tamantildeo 68todosArcosBA 91
124 Iacutendice alfabeacutetico
todosArcos 90todosCaminos 88todosCiclos 96triangulos 94unionConjuntos 23 32unionGeneral 24 33vacio 18 27valenciaMax 70valenciaMin 70variaciones 26 35verticesCamino 88vertices 53
Abstract
Discrete mathematics is characterized as the branch of mathematics dealing withfinite and numerable sets Concepts and notations from discrete mathematics are use-ful in studying and describing objects and real-life problems In particular the graphtheory has numerous applications in logistics
Throughout this project some of the knowlegde adquired from the course ldquoMa-temaacutetica Discretardquo will be given a computational implementation The code will bewritten in Haskell language and a free version of it will be available in GitHub underthe name MDenHaskell The work will focus on the graph theory and will provide so-me examples and algorithms in order to give an introduction of it and how it can beimplemented in Haskell
At first two chapters will be presented as a gentle reminder of basic concepts rela-ted to the set theory and the relations that can be established among them The thirdchapter will introduce the main topic graph theory with different representationsdefinitions and examples on graphs It will go through aspects such as morphismconnectivity and paths in graphs Finally some properties and advantages of workingwith adjacency matrices will be presented in the fourth chapter
This project leaves the door open for the community of programmers to continueand improve it It can be used as a self-learning tool as well as to make calculationsthat by hand would be tedious
9
10 Iacutendice general
Introduccioacuten
El objetivo del trabajo es la implementacioacuten de algoritmos de matemaacutetica discretaen Haskell Los puntos de partida son
los temas de la asignatura ldquoMatemaacutetica discretardquo ([4])los temas de la asignatura ldquoInformaacuteticardquo ([1])el capiacutetulo 7 del libro ldquoAlgorithms A functional programming approachrdquo ([8]) yel artiacuteculo ldquoGraph theoryrdquo ([11]) de la WikipediaHaskell es un lenguaje de programacioacuten funcional desarrollado en los uacuteltimos antildeos
por la comunidad de programadores con la intencioacuten de usarlo como instrumentopara la ensentildeanza de programacioacuten funcional La motivacioacuten de este desarrollo eshacer el anaacutelisis y disentildeo de programas maacutes simple y permitir que los algoritmos seanfaacutecilmente adaptables a otros lenguajes de programacioacuten funcionales
En comparacioacuten con otros lenguajes de programacioacuten imperativos la sintaxis deHaskell permite definir funciones de forma maacutes clara y compacta En Haskell las fun-ciones se consideran valores al mismo nivel que los tipos enteros o cadenas en cual-quier lenguaje Por ello al igual que es habitual que en todos los lenguajes una funcioacutenreciba datos de entrada (de tipo entero flotante cadena etc) y devuelva datos (de losmismos tipos) en los lenguajes funcionales una funcioacuten puede recibir como dato deentrada una funcioacuten y devolver otra funcioacuten como salida que puede ser construida apartir de sus entradas y por operaciones entre funciones como la composicioacuten Estacapacidad nos proporciona meacutetodos maacutes potentes para construir y combinar los di-versos moacutedulos de los que se compone un programa Por ejemplo emulando la formade operar sobre funciones que habitualmente se usa en matemaacuteticas
La matemaacutetica discreta consiste en el estudio de las propiedades de los conjuntosfinitos o infinitos numerables lo que hace posible su directa implementacioacuten compu-tacional En particular la asignatura ldquoMatemaacutetica Discretardquo del grado se centra enestudiar propiedades y algoritmos de la combinatoria y la teoriacutea de grafos A lo largodel trabajo se implementaraacuten en Haskell definiciones y algoritmos con los que ya seha tenido una primera aproximacioacuten teoacuterica durante el grado
Los dos primeros capiacutetulos del trabajo sientan la base que permitiraacute en los dos si-guientes una aproximacioacuten a la teoriacutea de grafos En el primero se hace una introduc-cioacuten a la teoriacutea de conjuntos y se dan dos posibles representaciones de conjuntos con
11
12 Iacutendice general
las que trabajar en Haskell En el segundo se presentan los conceptos de ldquorelacioacutenrdquo yde ldquofuncioacutenrdquo que al igual que los conjuntos son necesarios para definir aplicacionesde los grafos Su redaccioacuten sigue la liacutenea de la primera parte de la asignatura ldquoAacutelgebraBaacutesicardquo del grado
En el tercer capiacutetulo del trabajo se hace una introduccioacuten a la teoriacutea de grafos Enprimer lugar se dan una representacioacuten con la que trabajar en Haskell y un generadorde grafos que permitiraacute comprobar propiedades con QuickCheck Seguidamente sepresenta una galeriacutea de grafos conocidos que se utilizaraacuten como ejemplos para lasdefiniciones y los algoritmos de las secciones siguientes Las primeras seraacuten algunasdeficiones baacutesicas y despueacutes se trataraacuten los conceptos de ldquomorfismosrdquo ldquocaminosrdquo yldquoconectividadrdquo en grafos
Por uacuteltimo en el cuarto capiacutetulo se da una representacioacuten de los grafos a traveacutesde su matriz de adyacencia Se implementaraacuten algunos de los resultados que JavierFranco Galviacuten expuso en su Trabajo Fin de Grado Aspectos algebraicos en teoriacutea de grafosy se comprueba que concuerdan con el desarrollo hecho en el capiacutetulo anterior
Cabe destacar el trabajo con los diferentes sistemas y programas que se han utiliza-do a lo largo del proyecto
Ubuntu como sistema operativoel editor de textos Emacs que ha permitido el uso de Haskell literario para la redaccioacutendel trabajoel paquete de produccioacuten de graacuteficos vectoriales Tikz de LATEX mediante el que seha dado la representacioacuten graacutefica de los ejemplos de grafosGitHub como sistema remoto de control de versionesy DocTest como sistema de validacioacuten de moacutedulosSe va a hacer una breve introduccioacuten los sistemas maacutes destacados
Ubuntu
Ubuntu es un sistema operativo creado a partir de GNULinux con la intencioacuten dehacer una versioacuten de este maacutes sencilla de manejar y que permitiera acceso al soft-ware libre para todo el mundo por igual La primera distribuioacuten oficial de Ubuntufue la versioacuten 410 y tuvo lugar en 2004 Desde entonces el proyecto ha captadola atencioacuten de miles de entusiastas del software libre que han querido unirse a lacomunidad UbuntuSoftware libre significa que los usuarios tienen la libertad de ejecutar copiar distri-buir estudiar modificar y mejorar el software Es una cuestioacuten de libertad no deprecio Para entender el concepto debe pensarse en laquolibreraquo como en laquolibertad deexpresioacutenraquo
Iacutendice general 13
Maacutes precisamente software libre significa que los usuarios de un programa tienenlas cuatro libertades esencialesbull La libertad de ejecutar el programa como lo desee con cualquier propoacutesito (liber-
tad 0)bull La libertad de estudiar el funcionamiento del programa y adaptarlo a sus necesi-
dades (libertad 1) El acceso al coacutedigo fuente es un prerrequisito para estobull La libertad de redistribuir copias para ayudar a los demaacutes (libertad 2)bull La libertad de mejorar el programa y de publicar las mejoras de modo que toda la
comunidad se beneficie (libertad 3) El acceso al coacutedigo fuente es un prerrequisitopara esto
Debido a la evolucioacuten de la tecnologiacutea y del uso de la red estas libertades son ahoraauacuten maacutes importantes que en el pasadoLo que diferencia a Ubuntu de otros sistemas ofrecidos por Linux es que los equiposcomercial y comunitario colaboran juntos en el desarrollo de un uacutenico proyecto Lasnovedades y avances estaacuten libremente a disposicioacuten de todos los usuarios y sonvoluntarios quienes se hacen cargo de los elementos maacutes criacuteticos del trabajoEn la paacutegina web de Ubuntu 1 se puede obtener maacutes informacioacuten acerca del siste-ma y en la paacutegina web de GNU 2 se puede encontrar maacutes informacioacuten acerca delsoftware libre
Haskell literario con Emacs
Haskell es un lenguaje de programacioacuten puramente funcional basado en lambdacalculus 3 Se caracteriza por sus programas concisos un potente sistema de tiposel trabajo con listas funciones recursivas y de orden superior y por tener evaluacioacutenperezosaTener que escribir coacutedigos largos y complicados hace la tarea del programador muycostosa Los lenguajes de programacioacuten funcional como Haskell lo intentan hacenmaacutes sencillo Aunque no se esteacute en la posicioacuten de usar Haskell en un proyecto de-terminado aprender su razonamiento puede ayudar a mejorar en cualquier otrolenguajeA la hora de elaborar la memoria de un proyecto en el que se estaacute utilizando Haskellla posibilidad de escribir coacutedigo y texto en un formato de calidad otorga globali-dad al trabajo El editor Emacs de GNU permite en particular trabajar en paralelocon Haskell y con Latex El trabajar con Haskell literario ha ayudado a detectar ysolventar errores maacutes raacutepido asiacute como a dar una estructura consolidada al trabajo
1httpswwwubuntucom2httpswwwgnuorg3httpsenwikipediaorgwikiLambda_calculus
14 Iacutendice general
En la paacutegina web del Departamento de Computacioacuten 4 se puede encontrar maacutesinformacioacuten acerca de Haskell y Emacs
GitHub
GitHub es una plataforma de desarrollo colaborativo que permite alojar proyectosusando el control de versiones de Git El trabajo con un sistema como este hacemucho maacutes faacutecil el trabajo en grupo pues cada individuo puede trabajar desde suordenador propio en paralelo a los demaacutes y remotamente ir actualizando el proyectosin perder la posibilidad de restaurarlo a una versioacuten anteriorEn particular GitHub ha sido una excelente herramienta de control de este TrabajoFin de Grado pues los tutores han podido seguir en cada momento el trabajo rea-lizado detectar faacutecilmente los errores y hacer modificaciones directamente sobre eldocumentoEl compantildeero Eduardo Paluzo Hidalgo hace en su Trabajo Fin de Grado una pe-quentildea introduccioacuten al uso de Github y a la instalacioacuten de magit en una distribucioacutenUbuntu muy recomendable para todos aquellos (especialmente los maacutes principian-tes) que tengan intereacutes en trabajar con este sistemaSe puede encontrar maacutes informacioacuten acerca de esta plataforma en la paacutegina web deGit 5
DocTest
DocTest para Haskell es un programa de verificacioacuten dinaacutemica de ejemplos Si se si-gue un determinado formato a la hora de escribir los ejemplos para las funciones deun documento en Haskell Doctest se encarga de comprobar que los ejemplos seancorrectos Estas validaciones han resultado claves en la realizacioacuten del trabajo puesalgunas definiciones han sido modificadas de forma casi continua y este proyectoespecialmente se basa en lo anterior para poder seguir construyendoSu uso es muy sencillo una vez instalado el correspondiente paquete y escrito losejemplos en el formato requerido solo hay que ejecutar el programa desde la consoladando como argumento el fichero que se desea validarSe puede enontrar maacutes informaioacuten acerca del programa y de coacutemo descargarlo ensu repositorio de GitHub 6
4httpwwwcsuses~jalonsocursosi1m-16temastema-1html5httpsgit-scmcom6httpsgithubcomsoldoctest
Capiacutetulo 1
Conjuntos
El concepto de conjunto aparece en todos los campos de las Matemaacuteticas pero iquestqueacutedebe entenderse por eacutel La Teoriacutea de conjuntos fue introducida por Georg Cantor(1845-1917) desde 1869 Cantor ejercioacute como profesor en la Universidad de Halley entre 1879 y 1884 publicoacute una serie de seis artiacuteculos en el Mathematische Annalenen los que hizo una introduccioacuten baacutesica a la teoriacutea de conjuntos En su Beitraumlge zurBegruumlndung der transfiniten Mengenlehre Cantor dio la siguiente definicioacuten de con-junto
Figura 11 Fragmento del texto traducido al ingleacutes en el que Cantor da la definicioacuten de conjunto
laquoDebemos entender por ldquoconjuntordquo (Menge) cualquier coleccioacuten vista co-mo un todo (Zusammenfassung zu einem Ganzen) M de objetos separa-dos y bien definidos m de nuestra intuicioacuten o pensamiento Estos objetosson los ldquoelementosrdquo de Mraquo
Felix Hausdorff en 1914 dice laquoun conjunto es una reunioacuten de cosas que constitu-yen una totalidad es decir una nueva cosaraquo y antildeade laquoesto puede difiacutecilmente seruna definicioacuten pero sirve como demostracioacuten expresiva del concepto de conjunto atraveacutes de conjuntos sencillos como el conjunto de habitantes de una ciudad o el deaacutetomos de Hidroacutegeno del SolraquoUn conjunto asiacute definido no tiene que estar compuesto necesariamente de elementoshomogeacuteneos y ademaacutes da lugar a cuestiones filosoacuteficas como si podemos llamar
15
16 Capiacutetulo 1 Conjuntos
conjunto a aquel que no posee ninguacuten elemento Matemaacuteticamente conviene aceptarsolo elementos que compartan alguna propiedad y definir el conjunto vaciacuteo comoaquel que no tiene elemento algunoEl gran meacuterito de Cantor fue considerar conjuntos transfinitos (que tiene infinitoselementos) concepto inaudito hasta avanzado el siglo XIX hablar del cardinal de unconjunto como el nuacutemero de sus elementos y hablar de conjuntos equivalentes cuan-do puede establecerse una biyeccioacuten entre ellos ideas ya apuntadas por Bolzanoquien se centroacute demasiado en el aspecto filosoacutefico sin llegar a formalizar sus ideas
A lo largo de la seccioacuten haremos una pequentildea introduccioacuten a la Teoriacutea de Conjun-tos presentando formalmente sus conceptos maacutes importantes A la hora de elaborarel contenido se han utilizado los siguientes recursos bibliograacuteficosbull el primer tema de la asignatura ldquoAacutelgebra baacutesicardquo ([6])bull los temas de la asignatura ldquoInformaacuteticardquo ([1])bull el artiacuteculo de la Wikipedia ldquoSet (mathematics)rdquo ([10] ylowast el artiacuteculo ldquoEl regalo de Cantorrdquo ([5])
11 El TAD de los conjuntos
En la presente seccioacuten se definen las operaciones baacutesicas necesarias para trabajarcon conjuntos en un lenguaje funcional En nuestro caso el lenguaje que utilizare-mos seraacute Haskell Daremos la signatura del Tipo Abstracto de Dato (TAD) de losconjuntos y daremos algunos ejemplos de posibles representaciones de conjuntoscon las que podriacuteamos trabajarA continuacioacuten presentamos las operaciones definidas en el TAD de los conjuntos
vacio Conj a
inserta Eq a =gt a -gt Conj a -gt Conj a
elimina Eq a =gt a -gt Conj a -gt Conj a
pertenece Eq a =gt Conj a -gt a -gt Bool
esVacio Conj a -gt Bool
minimoElemento Ord a =gt Conj a -gt a
dondebull (vacio) es el conjunto vaciacuteobull (inserta x c) es el conjunto obtenido antildeadiendo el elemento x al conjunto cbull (elimina x c) es el conjunto obtenido eliminando el elemento x del conjunto cbull (pertenece x c) se verifica si x pertenece al conjunto cbull (esVacio c) se verifica si c no tiene ninguacuten elementobull (minimoElemento c) devuelve el miacutenimo elemento del conjunto c
12 Representaciones de conjuntos 17
Hemos de tener en cuenta que a la hora de crear un nuevo tipo de dato con el querepresentar a los conjuntos este debe ser compatible con la entidad matemaacutetica querepresenta
Estas son algunas de las posibles representaciones con las que podriacuteamos trabajarcon conjuntos en Haskellbull En primer lugar podemos trabajar con la libreriacutea DataSet en este caso la imple-
mentacioacuten del tipo de dato Set estaacute basado en aacuterboles binarios balanceadosbull Por otra parte podemos definir un nuevo tipo Cj xs con el que trabajar con con-
juntos como listas no ordenadas con duplicados como listas no ordenadas sinduplicados o como listas ordenadas sin duplicadosbull Otra opcioacuten seriacutea trabajar directamente con conjuntos como listas para ello de-
bemos ignorar las repeticiones y el orden con vista a la igualdad de conjuntosbull Los conjuntos que soacutelo contienen nuacutemeros (de tipo Int) entre 0 y nminus 1 se pueden
representar como nuacutemeros binarios con n bits donde el bit i(0 le i lt n) es 1 syssel nuacutemero i pertenece al conjunto
Nota 111 Las funciones que aparecen en la especificacioacuten del TAD no dependende la representacioacuten que elijamos
12 Representaciones de conjuntos
121 Conjuntos como listas ordenadas sin repeticioacuten
En el moacutedulo ConjuntosConListasOrdenadasSinRepeticion se definen las funcio-nes del TAD de los conjuntos dando su representacioacuten como listas ordenadas sinrepeticioacuten
module ConjuntosConListasOrdenadasSinRepeticion
( Conj
vacio
inserta
listaAConjunto
elimina
pertenece
esVacio
minimoElemento
sinRepetidos
esUnitario
esSubconjunto
conjuntosIguales
esSubconjuntoPropio
complementario
18 Capiacutetulo 1 Conjuntos
cardinal
unionConjuntos
unionGeneral
interseccion
productoCartesiano
combinaciones
variacionesR
) where
En las definiciones del presente moacutedulo se usaraacuten algunas funciones de la libreriacuteaDataList
Vamos a definir un nuevo tipo de dato (Conj a) que representa a los conjuntoscomo listas ordenadas sin repeticioacuten
type Conj a = [a]
Las funciones baacutesicas que definiremos a partir de este tipo coincidiraacuten con las indi-cadas en el TAD de los conjuntosbull (vacio) es el conjunto vaciacuteo
-- | Ejemplo
-- gtgtgt vacio
-- []
vacio Conj a
vacio = []
bull (inserta x c) es el conjunto obtenido antildeadiendo el elemento x al conjunto c
-- | Ejemplo
-- gtgtgt inserta 5 vacio
-- [5]
-- gtgtgt foldr inserta vacio [2211242]
-- [124]
inserta Ord a =gt a -gt Conj a -gt Conj a
inserta x [] = [x]
inserta x ys
| pertenece ys x = ys
| otherwise = insert x ys
bull (listaAConjunto xs) devuelve el conjunto cuyos elementos son los de la lista xs
-- | Ejemplo
-- gtgtgt listaAConjunto [2211242]
-- [124]
listaAConjunto Ord a =gt [a] -gt Conj a
listaAConjunto = sort nub
bull (esVacio c) se verifica si c es el conjunto vaciacuteo
12 Representaciones de conjuntos 19
-- | Ejemplos
-- gtgtgt esVacio (listaAConjunto [25137532190])
-- False
-- gtgtgt esVacio vacio
-- True
esVacio Conj a -gt Bool
esVacio = null
bull (pertenece x c) se verifica si x es un elemento del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt pertenece c1 3
-- True
-- gtgtgt pertenece c1 4
-- False
pertenece Ord a =gt Conj a -gt a -gt Bool
pertenece ys x =
x == head (dropWhile (ltx) ys)
bull (elimina x c) es el conjunto obtenido eliminando el elemento x del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt elimina 3 c1
-- [012579]
-- gtgtgt elimina 4 c1
-- [0123579]
elimina Ord a =gt a -gt Conj a -gt Conj a
elimina x ys = us ++ dropWhile (==x) vs
where (usvs) = span (ltx) ys
bull (minimoElemento c) devuelve el miacutenimo elemento del conjunto c
-- | Ejemplos
-- gtgtgt minimoElemento (listaAConjunto [25137532190])
-- 0
-- gtgtgt minimoElemento (listaAConjunto ([ae] ++ [AE]))
-- A
minimoElemento Ord a =gt Conj a -gt a
minimoElemento = head
122 Definicioacuten de conjunto
Nota 121 Al trabajar con la representacioacuten de conjuntos como listas en Haskellhemos de cuidar que los ejemplos con los que trabajemos no tengan elementos re-petidos La funcioacuten (sinRepetidos xs) se verifica si la lista xs no tiene ninguacuten ele-mento repetido
20 Capiacutetulo 1 Conjuntos
-- | Ejemplos
-- gtgtgt sinRepetidos []
-- True
-- gtgtgt sinRepetidos [1231]
-- False
sinRepetidos Eq a =gt [a] -gt Bool
sinRepetidos xs = nub xs == xs
Los conjuntos pueden definirse de manera expliacutecita citando todos sus elementosentre llaves de manera impliacutecita dando una o varias caracteriacutesticas que determi-nen si un objeto dado estaacute o no en el conjunto Por ejemplo los conjuntos 1 2 3 4y x isinN|1 le x le 4 son el mismo definido de forma explicita e impliacutecita respecti-vamente
Nota 122 La definicioacuten impliacutecita es necesaria cuando el conjunto en cuestioacuten tieneuna cantidad infinita de elementos En general los conjuntos se notaraacuten con letrasmayuacutesculas A B y los elementos con letras minuacutesculas a b
Cuando trabajamos con conjuntos concretos siempre existe un contexto donde esosconjuntos existen Por ejemplo si A = minus1 1 2 3 4 5 y B = x|x isin Nes par elcontexto donde podemos considerar A y B es el conjunto de los nuacutemeros enterosZ En general a este conjunto se le denomina conjunto universal De una forma algomaacutes precisa podemos dar la siguiente definicioacuten
Definicioacuten 121 El conjunto universal que notaremos por U es un conjunto del queson subconjuntos todos los posibles conjuntos que originan el problema que tratamos
123 Subconjuntos
Definicioacuten 122 Dados dos conjuntos A y B si todo elemento de A es a su vez elementode B diremos que A es un subconjunto de B y lo notaremos A sube B En caso contrario senotaraacute A 6sube B
La funcioacuten (esSubconjunto c1 c2) se verifica si c1 es un subconjunto de c2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
-- gtgtgt c1 `esSubconjunto` c2
-- True
-- gtgtgt c1 `esSubconjunto` vacio
-- False
-- gtgtgt vacio `esSubconjunto` c2
12 Representaciones de conjuntos 21
-- True
-- gtgtgt c3 `esSubconjunto` c4
-- True
-- gtgtgt c2 `esSubconjunto` c1
-- False
esSubconjunto Ord a =gt Conj a -gt Conj a -gt Bool
esSubconjunto [] _ = True
esSubconjunto (xxs) ys =
x == head vs ampamp esSubconjunto xs (tail vs)
where (usvs) = span (ltx) ys
124 Igualdad de conjuntos
Definicioacuten 123 Dados dos conjuntos A y B diremos que son iguales si tienen los mismoselementos es decir si se verifica que A sube B y B sube A Lo notaremos A = B
La funcioacuten (conjuntosIguales c1 c2) se verifica si los conjuntos xs y ys son igua-les
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
-- gtgtgt let c5 = listaAConjunto [4444442]
-- gtgtgt conjuntosIguales c1 c2
-- False
-- gtgtgt conjuntosIguales c3 c4
-- True
-- gtgtgt conjuntosIguales c1 c5
-- True
conjuntosIguales Ord a =gt Conj a -gt Conj a -gt Bool
conjuntosIguales = (==)
125 Subconjuntos propios
Definicioacuten 124 Los subconjuntos de A distintos del empty y del mismo A se denominansubconjuntos propios de A
La funcioacuten (esSubconjuntoPropio c1 c2) se verifica si c1 es un subconjunto pro-pio de c2
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt esSubconjuntoPropio u u
22 Capiacutetulo 1 Conjuntos
-- False
-- gtgtgt esSubconjuntoPropio c1 u
-- True
esSubconjuntoPropio Ord a =gt Conj a -gt Conj a -gt Bool
esSubconjuntoPropio c1 c2 =
not (null c1) ampamp esSubconjunto c1 c2 ampamp c1 = c2
126 Complementario de un conjunto
Definicioacuten 125 Dado un conjunto A se define el complementario de A que notaremospor A como
A = x|x isin U x 6isin A
La funcioacuten (complementario u c) devuelve el complementario del conjunto c y enel universo u
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt let c2 = listaAConjunto [14689]
-- gtgtgt complementario u c1
-- [14689]
-- gtgtgt complementario u u
-- []
-- gtgtgt complementario u vacio
-- [123456789]
-- gtgtgt complementario u c2
-- [2357]
complementario Ord a =gt Conj a -gt Conj a -gt Conj a
complementario [] _ = []
complementario xs [] = xs
complementario (xxs) (yys)
| x lt y = x complementario xs (yys)
| otherwise = complementario xs ys
127 Cardinal de un conjunto
Definicioacuten 126 Dado un conjunto finito A denominaremos cardinal de A al nuacutemero deelementos que tiene y lo notaremos |A|
La funcioacuten (cardinal xs) devuelve el cardinal del conjunto xs
-- | Ejemplos
-- gtgtgt cardinal vacio
-- 0
-- gtgtgt cardinal (listaAConjunto [110])
12 Representaciones de conjuntos 23
-- 10
-- gtgtgt cardinal (listaAConjunto chocolate)
-- 7
cardinal Ord a =gt Conj a -gt Int
cardinal = length
128 Conjunto unitario
Definicioacuten 127 Un conjunto con un uacutenico elemento se denomina unitario
Nota 123 Notemos que si X = x es un conjunto unitario debemos distinguirentre el conjunto X y el elemento x
La funcioacuten (esUnitario c) se verifica si el conjunto c es unitario
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto (take 10 (repeat 5))
-- gtgtgt let c2 = listaAConjunto valverde
-- gtgtgt let c3 = listaAConjunto coco
-- gtgtgt esUnitario c1
-- True
-- gtgtgt esUnitario c2
-- False
-- gtgtgt esUnitario c2
-- False
esUnitario Ord a =gt Conj a -gt Bool
esUnitario c =
c == take 1 c
129 Unioacuten de conjuntos
Definicioacuten 128 Dados dos conjuntos A y B se define la unioacuten de A y B notado A cup Bcomo el conjunto formado por aquellos elementos que pertenecen al menos a uno de los dosconjuntos A oacute B es decir
A cup B = x | x isin A or x isin B
La funcioacuten (unionConjuntos c1 c2) devuelve la unioacuten de los conjuntos xs y ys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [139]
-- gtgtgt let c2 = listaAConjunto [249]
-- gtgtgt unionConjuntos c1 c2
-- [123456789]
unionConjuntos Ord a =gt Conj a -gt Conj a -gt Conj a
unionConjuntos [] [] = []
24 Capiacutetulo 1 Conjuntos
unionConjuntos [] ys = ys
unionConjuntos xs [] = xs
unionConjuntos (xxs) (yys)
| x lt y = x unionConjuntos xs (yys)
| x == y = x unionConjuntos xs ys
| otherwise = y unionConjuntos (xxs) ys
Definicioacuten 129 Dada una familia de conjuntos Ai con i isin I se define la unioacuten ge-neral de los conjuntos Ai notado
⋃iisinI Ai como el conjunto formado por aquellos elementos
que pertenecen al menos a uno de los conjuntos de la familia es decir
⋃iisinI
Ai = x | x isin Ai foralli isin I
La funcioacuten (unionGeneral xss) devuelve la unioacuten general de la familia de conjun-tos de la lista xss
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1415]
-- gtgtgt let c2 = listaAConjunto [2515]
-- gtgtgt let c3 = listaAConjunto [3615]
-- gtgtgt unionGeneral [c1c2c3]
-- [123456789101112131415]
unionGeneral Ord a =gt [Conj a] -gt Conj a
unionGeneral = foldr unionConjuntos vacio
1210 Interseccioacuten de conjuntos
Definicioacuten 1210 Dados dos conjuntos A y B se define la interseccioacuten de A y B notadoA cap B como el conjunto formado por aquellos elementos que pertenecen a cada uno de losdos conjuntos A y B es decir
A cap B = x | x isin A and x isin B
La funcioacuten (interseccion c1 c2) devuelve la interseccioacuten de los conjuntos c1 yc2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1320]
-- gtgtgt let c2 = listaAConjunto [2420]
-- gtgtgt let c3 = listaAConjunto [2430]
-- gtgtgt let c4 = listaAConjunto [4830]
-- gtgtgt interseccion c1 c2
-- []
-- gtgtgt interseccion c3 c4
12 Representaciones de conjuntos 25
-- [481216202428]
interseccion Ord a =gt Conj a -gt Conj a -gt Conj a
interseccion (xxs) (yys)
| x lt y = interseccion xs (yys)
| x gt y = interseccion (xxs) ys
| otherwise = x interseccion xs ys
interseccion _ _ = []
1211 Producto cartesiano
Definicioacuten 1211 El producto cartesiano 1 de dos conjuntos A y B es una operacioacutensobre ellos que resulta en un nuevo conjunto Atimes B que contiene a todos los pares ordenadostales que la primera componente pertenece a A y la segunda pertenece a B es decir
Atimes B = (a b) | a isin A b isin B
La funcioacuten (productoCartesiano c1 c2) devuelve el producto cartesiano de xs eys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [31]
-- gtgtgt let c2 = listaAConjunto [247]
-- gtgtgt productoCartesiano c1 c2
-- [(12)(14)(17)(32)(34)(37)]
-- gtgtgt productoCartesiano c2 c1
-- [(21)(23)(41)(43)(71)(73)]
productoCartesiano (Ord a Ord b) =gt Conj a -gt Conj b -gt Conj (ab)
productoCartesiano xs ys=
listaAConjunto [(xy) | x lt- xs y lt- ys]
1212 Combinaciones
Definicioacuten 1212 Las combinaciones de un conjunto S tomados en grupos de n son todoslos subconjuntos de S con n elementos
La funcioacuten (combinaciones n xs) devuelve las combinaciones de los elementos dexs en listas de n elementos
-- | Ejemplos
-- gtgtgt combinaciones 3 [ad]
-- [abcabdacdbcd]
-- gtgtgt combinaciones 2 [248]
-- [[24][26][28][46][48][68]]
1httpsenwikipediaorgwikiCartesian_product
26 Capiacutetulo 1 Conjuntos
combinaciones Integer -gt [a] -gt [[a]]
combinaciones 0 _ = [[]]
combinaciones _ [] = []
combinaciones k (xxs) =
[xys | ys lt- combinaciones (k-1) xs] ++ combinaciones k xs
1213 Variaciones con repeticioacuten
Definicioacuten 1213 Las variaciones con repeticioacuten de m elementos tomados en grupos den es el nuacutemero de diferentes nndashtuplas de un conjunto de m elementos
La funcioacuten (variacionesR n xs) devuelve las variaciones con con repeticioacuten de loselementos de xs en listas de n elementos
-- | Ejemplos
-- gtgtgt variacionesR 3 [ab]
-- [aaaaababaabbbaababbbabbb]
-- gtgtgt variacionesR 2 [235]
-- [[22][23][25][32][33][35][52][53][55]]
variacionesR Int -gt [a] -gt [[a]]
variacionesR _ [] = [[]]
variacionesR 0 _ = [[]]
variacionesR k us =
[uvs | u lt- us vs lt- variacionesR (k-1) us]
1214 Conjuntos como listas sin repeticioacuten
En el moacutedulo ConjuntosConListas se definen las funciones del TAD de los conjun-tos dando su representacioacuten como listas sin elementos repetidos
module ConjuntosConListas
( Conj
vacio
inserta
listaAConjunto
elimina
pertenece
esVacio
minimoElemento
sinRepetidos
esUnitario
esSubconjunto
conjuntosIguales
esSubconjuntoPropio
complementario
cardinal
12 Representaciones de conjuntos 27
unionConjuntos
unionGeneral
interseccion
productoCartesiano
combinaciones
variacionesR
) where
En las definiciones del presente moacutedulo se usaraacuten algunas funciones de la libreriacuteaDataList
Vamos a definir un nuevo tipo de dato (Conj a) que representa a los conjuntoscomo listas sin elementos repetidos
type Conj a = [a]
Las funciones baacutesicas que definiremos a partir de este tipo coincidiraacuten con las indi-cadas en el TAD de los conjuntosbull (vacio) es el conjunto vaciacuteo
-- | Ejemplo
-- gtgtgt vacio
-- []
vacio Conj a
vacio = []
bull (inserta x c) es el conjunto obtenido antildeadiendo el elemento x al conjunto c
-- | Ejemplo
-- gtgtgt inserta 5 vacio
-- [5]
-- gtgtgt foldr inserta vacio [2211242]
-- [142]
inserta Eq a =gt a -gt Conj a -gt Conj a
inserta x [] = [x]
inserta x ys | elem x ys = ys
| otherwise = xys
bull (listaAConjunto xs) devuelve el conjunto cuyos elementos son los de la lista xs
-- | Ejemplo
-- gtgtgt listaAConjunto [2211242]
-- [214]
listaAConjunto Eq a =gt [a] -gt Conj a
listaAConjunto = nub
bull (esVacio c) se verifica si c es el conjunto vaciacuteo
-- | Ejemplos
-- gtgtgt esVacio (listaAConjunto [25137532190])
-- False
28 Capiacutetulo 1 Conjuntos
-- gtgtgt esVacio vacio
-- True
esVacio Conj a -gt Bool
esVacio = null
bull (pertenece x c) se verifica si x es un elemento del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt pertenece 3 c1
-- True
-- gtgtgt pertenece 4 c1
-- False
pertenece Eq a =gt a -gt Conj a -gt Bool
pertenece = elem
bull (elimina x c) es el conjunto obtenido eliminando el elemento x del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt elimina 3 c1
-- [251790]
-- gtgtgt elimina 4 c1
-- [2513790]
elimina Eq a =gt a -gt Conj a -gt Conj a
elimina = delete
bull (minimoElemento c) devuelve el miacutenimo elemento del conjunto c
-- | Ejemplos
-- gtgtgt minimoElemento (listaAConjunto [25137532190])
-- 0
-- gtgtgt minimoElemento (listaAConjunto ([ae] ++ [AE]))
-- A
minimoElemento Ord a =gt Conj a -gt a
minimoElemento = minimum
1215 Definicioacuten de conjunto
Definicioacuten 1214 Llamaremos conjunto a una coleccioacuten de objetos que llamaremos ele-mentos distintos entre siacute y que comparten una propiedad Para que un conjunto esteacute biendefinido debe ser posible discernir si un objeto arbitrario estaacute o no en eacutel
Si el elemento a pertenece al conjunto A escribiremos a isin A En caso contrarioescribiremos a 6isin A
Nota 124 En Haskell para poder discernir si un objeto arbitrario pertenece a unconjunto se necesita que su tipo pertenezca a la clase Eq
12 Representaciones de conjuntos 29
Nota 125 Al trabajar con la representacioacuten de conjuntos como listas en Haskellhemos de cuidar que los ejemplos con los que trabajemos no tengan elementos re-petidos La funcioacuten (sinRepetidos xs) se verifica si la lista xs no tiene ninguacuten ele-mento repetido
-- | Ejemplos
-- gtgtgt sinRepetidos []
-- True
-- gtgtgt sinRepetidos [1231]
-- False
sinRepetidos Eq a =gt [a] -gt Bool
sinRepetidos xs = nub xs == xs
Los conjuntos pueden definirse de manera expliacutecita citando todos sus elementosentre llaves de manera impliacutecita dando una o varias caracteriacutesticas que determi-nen si un objeto dado estaacute o no en el conjunto Por ejemplo los conjuntos 1 2 3 4y x isinN|1 le x le 4 son el mismo definido de forma explicita e impliacutecita respecti-vamente
Nota 126 La definicioacuten impliacutecita es necesaria cuando el conjunto en cuestioacuten tieneuna cantidad infinita de elementos En general los conjuntos se notaraacuten con letrasmayuacutesculas A B y los elementos con letras minuacutesculas a b
Cuando trabajamos con conjuntos concretos siempre existe un contexto donde esosconjuntos existen Por ejemplo si A = minus1 1 2 3 4 5 y B = x|x isin Nes par elcontexto donde podemos considerar A y B es el conjunto de los nuacutemeros enterosZ En general a este conjunto se le denomina conjunto universal De una forma algomaacutes precisa podemos dar la siguiente definicioacuten
Definicioacuten 1215 El conjunto universal que notaremos por U es un conjunto del queson subconjuntos todos los posibles conjuntos que originan el problema que tratamos
1216 Subconjuntos
Definicioacuten 1216 Dados dos conjuntos A y B si todo elemento de A es a su vez elementode B diremos que A es un subconjunto de B y lo notaremos A sube B En caso contrario senotaraacute A 6sube B
La funcioacuten (esSubconjunto c1 c2) se verifica si c1 es un subconjunto de c2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
30 Capiacutetulo 1 Conjuntos
-- gtgtgt c1 `esSubconjunto` c2
-- True
-- gtgtgt c1 `esSubconjunto` vacio
-- False
-- gtgtgt vacio `esSubconjunto` c2
-- True
-- gtgtgt c3 `esSubconjunto` c4
-- True
-- gtgtgt c2 `esSubconjunto` c1
-- False
esSubconjunto Eq a =gt [a] -gt [a] -gt Bool
esSubconjunto c1 c2 = all (`elem` c2) c1
1217 Igualdad de conjuntos
Definicioacuten 1217 Dados dos conjuntos A y B diremos que son iguales si tienen losmismos elementos es decir si se verifica que A sube B y B sube A Lo notaremos A = B
La funcioacuten (conjuntosIguales c1 c2) se verifica si los conjuntos xs y ys son igua-les
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
-- gtgtgt let c5 = listaAConjunto [4444442]
-- gtgtgt conjuntosIguales c1 c2
-- False
-- gtgtgt conjuntosIguales c3 c4
-- True
-- gtgtgt conjuntosIguales c1 c5
-- True
conjuntosIguales Eq a =gt [a] -gt [a] -gt Bool
conjuntosIguales c1 c2 =
esSubconjunto c1 c2 ampamp esSubconjunto c2 c1
1218 Subconjuntos propios
Definicioacuten 1218 Los subconjuntos de A distintos del empty y del mismo A se denominansubconjuntos propios de A
La funcioacuten (esSubconjuntoPropio c1 c2) se verifica si c1 es un subconjunto pro-pio de c2
12 Representaciones de conjuntos 31
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt esSubconjuntoPropio u u
-- False
-- gtgtgt esSubconjuntoPropio c1 u
-- True
esSubconjuntoPropio Eq a =gt [a] -gt [a] -gt Bool
esSubconjuntoPropio c1 c2
| null c1 = False
| conjuntosIguales c1 c2 = False
| otherwise = esSubconjunto c1 c2
1219 Complementario de un conjunto
Definicioacuten 1219 Dado un conjunto A se define el complementario de A que notaremospor A como
A = x|x isin U x 6isin A
La funcioacuten (complementario u c) devuelve el complementario del conjunto c y enel universo u
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt let c2 = listaAConjunto [14689]
-- gtgtgt complementario u c1
-- [14689]
-- gtgtgt complementario u u
-- []
-- gtgtgt complementario u vacio
-- [123456789]
-- gtgtgt complementario u c2
-- [2357]
complementario Eq a =gt [a] -gt [a] -gt [a]
complementario = ()
1220 Cardinal de un conjunto
Definicioacuten 1220 Dado un conjunto finito A denominaremos cardinal de A al nuacutemerode elementos que tiene y lo notaremos |A|
La funcioacuten (cardinal xs) devuelve el cardinal del conjunto xs
32 Capiacutetulo 1 Conjuntos
-- | Ejemplos
-- gtgtgt cardinal vacio
-- 0
-- gtgtgt cardinal (listaAConjunto [110])
-- 10
-- gtgtgt cardinal (listaAConjunto chocolate)
-- 7
cardinal [a] -gt Int
cardinal = length
1221 Conjunto unitario
Definicioacuten 1221 Un conjunto con un uacutenico elemento se denomina unitario
Nota 127 Notemos que si X = x es un conjunto unitario debemos distinguirentre el conjunto X y el elemento x
La funcioacuten (esUnitario c) se verifica si el conjunto c es unitario
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto (take 10 (repeat 5))
-- gtgtgt let c2 = listaAConjunto valverde
-- gtgtgt let c3 = listaAConjunto coco
-- gtgtgt esUnitario c1
-- True
-- gtgtgt esUnitario c2
-- False
-- gtgtgt esUnitario c2
-- False
esUnitario Eq a =gt [a] -gt Bool
esUnitario c = c == take 1 c
1222 Unioacuten de conjuntos
Definicioacuten 1222 Dados dos conjuntos A y B se define la unioacuten de A y B notado A cup Bcomo el conjunto formado por aquellos elementos que pertenecen al menos a uno de los dosconjuntos A oacute B es decir
A cup B = x | x isin A or x isin B
La funcioacuten (unionConjuntos c1 c2) devuelve la unioacuten de los conjuntos xs y ys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [139]
-- gtgtgt let c2 = listaAConjunto [249]
12 Representaciones de conjuntos 33
-- gtgtgt unionConjuntos c1 c2
-- [135792468]
unionConjuntos Eq a =gt [a] -gt [a] -gt [a]
unionConjuntos = union
Definicioacuten 1223 Dada una familia de conjuntos Ai con i isin I se define la unioacuten ge-neral de los conjuntos Ai notado
⋃iisinI Ai como el conjunto formado por aquellos elementos
que pertenecen al menos a uno de los conjuntos de la familia es decir
⋃iisinI
Ai = x | x isin Ai foralli isin I
La funcioacuten (unionGeneral xss) devuelve la unioacuten general de la familia de conjun-tos de la lista xss
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1415]
-- gtgtgt let c2 = listaAConjunto [2515]
-- gtgtgt let c3 = listaAConjunto [3615]
-- gtgtgt unionGeneral [c1c2c3]
-- [147101325811143691215]
unionGeneral Eq a =gt [[a]] -gt [a]
unionGeneral = foldr unionConjuntos []
1223 Interseccioacuten de conjuntos
Definicioacuten 1224 Dados dos conjuntos A y B se define la interseccioacuten de A y B notadoA cap B como el conjunto formado por aquellos elementos que pertenecen a cada uno de losdos conjuntos A y B es decir
A cap B = x | x isin A and x isin B
La funcioacuten (interseccion c1 c2) devuelve la interseccioacuten de los conjuntos c1 yc2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1320]
-- gtgtgt let c2 = listaAConjunto [2420]
-- gtgtgt let c3 = listaAConjunto [2430]
-- gtgtgt let c4 = listaAConjunto [4830]
-- gtgtgt interseccion c1 c2
-- []
-- gtgtgt interseccion c3 c4
-- [481216202428]
34 Capiacutetulo 1 Conjuntos
interseccion Eq a =gt [a] -gt [a] -gt [a]
interseccion = intersect
1224 Producto cartesiano
Definicioacuten 1225 El producto cartesiano 2 de dos conjuntos A y B es una operacioacutensobre ellos que resulta en un nuevo conjunto Atimes B que contiene a todos los pares ordenadostales que la primera componente pertenece a A y la segunda pertenece a B es decir
Atimes B = (a b) | a isin A b isin B
La funcioacuten (productoCartesiano c1 c2) devuelve el producto cartesiano de xs eys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [31]
-- gtgtgt let c2 = listaAConjunto [247]
-- gtgtgt productoCartesiano c1 c2
-- [(32)(34)(37)(12)(14)(17)]
-- gtgtgt productoCartesiano c2 c1
-- [(23)(21)(43)(41)(73)(71)]
productoCartesiano [a] -gt [b] -gt [(ab)]
productoCartesiano xs ys = [ (xy) | x lt- xs y lt- ys]
1225 Combinaciones
Definicioacuten 1226 Las combinaciones de un conjunto S tomados en grupos de n son todoslos subconjuntos de S con n elementos
La funcioacuten (combinaciones n xs) devuelve las combinaciones de los elementos dexs en listas de n elementos
-- | Ejemplos
-- gtgtgt combinaciones 3 [ad]
-- [abcabdacdbcd]
-- gtgtgt combinaciones 2 [248]
-- [[24][26][28][46][48][68]]
combinaciones Integer -gt [a] -gt [[a]]
combinaciones 0 _ = [[]]
combinaciones _ [] = []
combinaciones k (xxs) =
[xys | ys lt- combinaciones (k-1) xs] ++ combinaciones k xs
2httpsenwikipediaorgwikiCartesian_product
13 Eleccioacuten de la representacioacuten de conjuntos 35
1226 Variaciones con repeticioacuten
Definicioacuten 1227 Las variaciones con repeticioacuten de m elementos tomados en grupos den es el nuacutemero de diferentes nndashtuplas de un conjunto de m elementos
La funcioacuten (variacionesR n xs) devuelve las variaciones con con repeticioacuten de loselementos de xs en listas de n elementos
-- | Ejemplos
-- gtgtgt variacionesR 3 [ab]
-- [aaaaababaabbbaababbbabbb]
-- gtgtgt variacionesR 2 [235]
-- [[22][23][25][32][33][35][52][53][55]]
variacionesR Int -gt [a] -gt [[a]]
variacionesR _ [] = [[]]
variacionesR 0 _ = [[]]
variacionesR k us =
[uvs | u lt- us vs lt- variacionesR (k-1) us]
13 Eleccioacuten de la representacioacuten de conjuntos
Nota 131 En el moacutedulo Conjuntos se elige la representacioacuten de conjunto con la quese trabajaraacute
-- Seleccionar para trabajar con los conjuntos como listas sin
-- elementos repetidos
module Conjuntos
(module ConjuntosConListas)
where
import ConjuntosConListas
-- Seleccionar para trabajar con los conjuntos como listas ordenadas
-- sin elementos repetidos
-- module Conjuntos
-- (module ConjuntosConListasOrdenadasSinRepeticion)
-- where
-- import ConjuntosConListasOrdenadasSinRepeticion
36 Capiacutetulo 1 Conjuntos
Capiacutetulo 2
Relaciones y funciones
21 Relaciones
Las relaciones que existen entre personas nuacutemeros conjuntos y muchas otras enti-dades pueden formalizarse en la idea de relacioacuten binaria En esta seccioacuten se define ydesarrolla este concepto particularizando en el caso de las relaciones homogeacuteneasy en el de las funciones
211 Relacioacuten binaria
Definicioacuten 211 Una relacioacuten binaria 1 (o correspondencia) entre dos conjuntos A yB es un subconjunto del producto cartesiano Atimes B
La funcioacuten (esRelacion xs ys r) se verifica si r es una relacioacuten binaria de xs enys Por ejemplo
-- | Ejemplos
-- gtgtgt esRelacion [31] [247] [(12)(34)]
-- True
-- gtgtgt esRelacion [31] [247] [(12)(31)]
-- False
esRelacion (Ord a Ord b) =gt [a] -gt [b] -gt [(ab)] -gt Bool
esRelacion xs ys r =
r `esSubconjunto` productoCartesiano xs ys
212 Imagen por una relacioacuten
Definicioacuten 212 Si R es una relacioacuten binaria la imagen del elemento x en la relacioacuten Res el conjunto de los valores correspondientes a x en R
1httpsenwikipediaorgwikiBinary_relation
37
38 Capiacutetulo 2 Relaciones y funciones
La funcioacuten (imagenRelacion r x) es la imagen de x en la relacioacuten r
-- | Ejemplos
-- gtgtgt imagenRelacion [(13)(25)(14)] 1
-- [34]
-- gtgtgt imagenRelacion [(13)(25)(14)] 2
-- [5]
-- gtgtgt imagenRelacion [(13)(25)(14)] 3
-- []
imagenRelacion (Ord a Ord b) =gt [(ab)] -gt a -gt [b]
imagenRelacion r x =
nub [y | (zy) lt- r z == x]
213 Dominio de una relacioacuten
Definicioacuten 213 Dada una relacioacuten binaria R su dominio es el conjunto que contiene atodos los valores que se toman en la relacioacuten R
La funcioacuten (dominio r) devuelve el dominio de la relacioacuten r
-- | Ejemplo
-- gtgtgt dominio [(32)(51)(34)]
-- [35]
dominio Ord a =gt [(ab)] -gt [a]
dominio r = listaAConjunto (map fst r)
214 Rango de una relacioacuten
Definicioacuten 214 El rango de una relacioacuten binaria R es el conjunto de las imaacutegenes demediante R
La funcioacuten (rango r) devuelve el rango de la relacioacuten binaria r
-- | Ejemplo
-- gtgtgt rango [(32)(52)(34)]
-- [24]
rango Ord b =gt [(ab)] -gt [b]
rango r = listaAConjunto (map snd r)
215 Antiimagen por una relacioacuten
Definicioacuten 215 La antiimagen del elemento y por una relacioacuten r es el conjunto de loselementos cuya imagen es y
La (antiImagenRelacion r y) es la antiimagen del elemento y en la relacioacuten bina-ria r
22 Relaciones homogeacuteneas 39
-- | Ejemplo
-- gtgtgt antiImagenRelacion [(13)(23)(74)] 3
-- [12]
antiImagenRelacion (Ord a Ord b) =gt [(ab)] -gt b -gt [a]
antiImagenRelacion r y =
nub [x | (xz) lt- r z == y]
216 Relacioacuten funcional
Definicioacuten 216 Dada una relacioacuten binaria R se dice funcional si todos los elementos desu dominio tienen una uacutenica imagen en R
La funcioacuten (esFuncional r) se verifica si la relacioacuten r es funcional
-- | Ejemplos
-- gtgtgt esFuncional [(32)(51)(79)]
-- True
-- gtgtgt esFuncional [(32)(51)(34)]
-- False
-- gtgtgt esFuncional [(32)(51)(32)]
-- True
esFuncional (Ord a Ord b) =gt [(ab)] -gt Bool
esFuncional r =
and [esUnitario (imagenRelacion r x) | x lt- dominio r]
22 Relaciones homogeacuteneas
Para elaborar la presente seccioacuten se han consultado los apuntes de ldquoAacutelgebra baacutesicardquo([6]) asignatura del primer curso del Grado en Matemaacuteticas
Definicioacuten 221 Una relacioacuten binaria entre dos conjuntos A y B se dice que es homogeacute-nea si los conjuntos son iguales es decir si A = B Si el par (x y) isin AA estaacute en la relacioacutenhomogeacutenea R diremos que x estaacute Rndashrelacionado con y o relacionado con y por R Esto senotaraacute frecuentemente xRy (noacutetese que el orden es importante)
La funcioacuten (esRelacionHomogenea xs r) se verifica si r es una relacioacuten binaria ho-mogeacutenea en el conjunto xs
-- | Ejemplos
-- gtgtgt esRelacionHomogenea [14] [(12)(24)(34)(41)]
-- True
-- gtgtgt esRelacionHomogenea [14] [(12)(25)(34)(41)]
-- False
-- gtgtgt esRelacionHomogenea [14] [(12)(34)(41)]
40 Capiacutetulo 2 Relaciones y funciones
-- True
esRelacionHomogenea Ord a =gt [a] -gt [(aa)] -gt Bool
esRelacionHomogenea xs = esRelacion xs xs
Nota 221 El segundo argumento que recibe la funcioacuten ha de ser una lista de parescon ambas componentes del mismo tipo
La funcioacuten (estaRelacionado r x y) se verifica si x estaacute relacionado con y en larelacioacuten homogeacutenea r
-- | Ejemplos
-- gtgtgt estaRelacionado [(13)(25)(46)] 2 5
-- True
-- gtgtgt estaRelacionado [(13)(25)(46)] 2 3
-- False
estaRelacionado Ord a =gt [(aa)] -gt a -gt a -gt Bool
estaRelacionado r x y = (xy) `elem` r
221 Relaciones reflexivas
Definicioacuten 222 Sea R una relacioacuten binaria homogeacutenea en el conjunto A Diremos que Res reflexiva cuando todos los elementos de A estaacuten relacionados por R consigo mismos esdecir cuando forallx isin A se tiene que xRx
La funcioacuten (esReflexiva xs r) se verifica si la relacioacuten r en xs es reflexiva
-- | Ejemplos
-- gtgtgt esReflexiva [12] [(11)(12)(22)]
-- True
-- gtgtgt esReflexiva [12] [(11)(12)]
-- False
esReflexiva Ord a =gt [a] -gt [(aa)] -gt Bool
esReflexiva xs r = zip xs xs `esSubconjunto` r
Nota 222 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xSylarrrarr xminus y es parbull xTylarrrarr x divide a yson relaciones binarias homogeacuteneas reflexivas
222 Relaciones simeacutetricas
Definicioacuten 223 Diremos que una relacioacuten homogeacutenea R es simeacutetrica cuando
forall(x y) isin R minusrarr (y x) isin R
22 Relaciones homogeacuteneas 41
La funcioacuten (esSimetrica r) se verifica si la relacioacuten r es simeacutetrica
-- | Ejemplos
-- gtgtgt esSimetrica [(11)(12)(21)]
-- True
-- gtgtgt esSimetrica [(11)(12)(22)]
-- False
esSimetrica Ord a =gt [(aa)] -gt Bool
esSimetrica r =
listaAConjunto [(yx) | (xy) lt- r] `esSubconjunto` r
Nota 223 En el conjunto N la relacioacuten caracterizada por xSy larrrarr xminus y es par esuna relacioacuten binaria homogeacutenea simeacutetrica
223 Relaciones antisimeacutetricas
Definicioacuten 224 Sea R una relacioacuten binaria homogeacutenea en el conjunto A Diremos que Res antisimeacutetrica cuando
forall(x y)[(x y) isin R and (y x) isin R minusrarr x = y
La funcioacuten (esAntisimetrica r) se verifica si la relacioacuten r es antisimeacutetrica
-- | Ejemplos
-- gtgtgt esAntisimetrica [(12)(31)]
-- True
-- gtgtgt esAntisimetrica [(12)(21)]
-- False
esAntisimetrica Ord a =gt [(aa)] -gt Bool
esAntisimetrica r =
and [x == y | (xy) lt- r (yx) `elem` r]
Nota 224 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xTylarrrarr x divide a ybull xRylarrrarr x lt yson relaciones binarias homogeacuteneas antisimeacutetricas
224 Relaciones transitivas
Definicioacuten 225 Sea R una relacioacuten binaria homogeacutenea en el conjunto A Diremos que Res transitiva cuando forall(x y) (y z) isin R se tiene que xRy e yRz minusrarr xRz
La funcioacuten (esTransitiva r) se verifica si la relacioacuten r es transitiva
42 Capiacutetulo 2 Relaciones y funciones
-- | Ejemplos
-- gtgtgt esTransitiva [(12)(13)(23)]
-- True
-- gtgtgt esTransitiva [(12)(23)]
-- False
esTransitiva Ord a =gt [(aa)] -gt Bool
esTransitiva r =
listaAConjunto [(xz) | (xy) lt- r (wz) lt- r y == w]
`esSubconjunto` r
Nota 225 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xSylarrrarr xminus y es parbull xTylarrrarr x divide a ybull xRylarrrarr x lt yson relaciones binarias homogeacuteneas transitivas
225 Relaciones de equivalencia
Definicioacuten 226 Las relaciones homogeacuteneas que son a la vez reflexivas simeacutetricas y tran-sitivas se denominan relaciones de equivalencia
La funcioacuten (esRelacionEquivalencia xs r) se verifica si r es una relacioacuten de equi-valencia en xs-- | Ejemplos
-- gtgtgt esRelacionEquivalencia [13] [(11)(12)(21)(22)(33)]
-- True
-- gtgtgt esRelacionEquivalencia [13] [(12)(21)(22)(33)]
-- False
-- gtgtgt esRelacionEquivalencia [13] [(11)(12)(22)(33)]
-- False
esRelacionEquivalencia Ord a =gt [a] -gt [(aa)] -gt Bool
esRelacionEquivalencia xs r =
esReflexiva xs r ampamp
esSimetrica r ampamp
esTransitiva r
Nota 226 En el conjunto N la relacioacuten caracterizada por xSy larrrarr xminus y es par esuna relacioacuten de equivalencia
226 Relaciones de orden
Definicioacuten 227 Las relaciones homogeacuteneas que son a la vez reflexivas antisimeacutetricas ytransitivas se denominan relaciones de orden
23 Funciones 43
La funcioacuten (esRelacionOrden xs r) se verifica si r es una relacioacuten de orden en xs
-- | Ejemplo
-- gtgtgt esRelacionOrden [13] [(11)(12)(13)(22)(23)(33)]
-- True
esRelacionOrden Ord a =gt [a] -gt [(aa)] -gt Bool
esRelacionOrden xs r =
esReflexiva xs r ampamp
esAntisimetrica r ampamp
esTransitiva r
Nota 227 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xTylarrrarr x divide a yson relaciones de orden
227 Clases de equivalencia
Definicioacuten 228 Si R es una relacioacuten de equivalencia en A denominamos clase de equi-valencia de un elemento x isin A al conjunto de todos los elementos de A relacionados con xes decir x = R(x) = y isin A|xRy donde la primera notacioacuten se usa si la relacioacuten con laque se estaacute tratando se sobreentiende y la segunda si no es asiacute
La funcioacuten (clasesEquivalencia xs r) devuelve las clases de la relacioacuten de equi-valencia r en xs
-- | Ejemplo
-- gtgtgt let r = [(xy) | x lt- [15] y lt- [15] even (x-y)]
-- gtgtgt clasesEquivalencia [15] r
-- [[135][24]]
clasesEquivalencia Ord a =gt [a] -gt [(aa)] -gt [[a]]
clasesEquivalencia _ [] = []
clasesEquivalencia [] _ = []
clasesEquivalencia (xxs) r = (xc) clasesEquivalencia (xs c) r
where c = filter (estaRelacionado r x) xs
23 Funciones
Definicioacuten 231 Dada una relacioacuten F entre A y B se diraacute que es una funcioacuten si es unarelacioacuten binaria es funcional y todos los elementos de A estaacuten en el dominio
La funcioacuten (esFuncion xs ys f) se verifica si f es una funcioacuten de xs en ys
-- | Ejemplos
-- gtgtgt esFuncion [13] [247] [(17)(32)]
44 Capiacutetulo 2 Relaciones y funciones
-- True
-- gtgtgt esFuncion [13] [247] [(17)]
-- False
-- gtgtgt esFuncion [13] [247] [(14)(17)(32)]
-- False
esFuncion (Ord a Ord b) =gt [a] -gt [b] -gt [(ab)] -gt Bool
esFuncion xs ys f =
esRelacion xs ys f ampamp
xs `esSubconjunto` dominio f ampamp
esFuncional f
Nota 231 A lo largo de la seccioacuten representaremos a las funciones como listas depares
type Funcion a b = [(ab)]
La funcioacuten (funciones xs ys) devuelve todas las posibles funciones del conjuntoxs en ys
-- | Ejemplos
-- gtgtgt pp $ funciones [12] [34]
-- [[(1 3)(2 3)][(1 3)(2 4)][(1 4)(2 3)]
-- [(1 4)(2 4)]]
-- gtgtgt pp $ funciones [12] [345]
-- [[(1 3)(2 3)][(1 3)(2 4)][(1 3)(2 5)]
-- [(1 4)(2 3)][(1 4)(2 4)][(1 4)(2 5)]
-- [(1 5)(2 3)][(1 5)(2 4)][(1 5)(2 5)]]
-- gtgtgt pp $ funciones [012] [34]
-- [[(0 3)(1 3)(2 3)][(0 3)(1 3)(2 4)]
-- [(0 3)(1 4)(2 3)][(0 3)(1 4)(2 4)]
-- [(0 4)(1 3)(2 3)][(0 4)(1 3)(2 4)]
-- [(0 4)(1 4)(2 3)][(0 4)(1 4)(2 4)]]
funciones [a] -gt [b] -gt [Funcion a b]
funciones xs ys =
[zip xs zs | zs lt- variacionesR (length xs) ys]
231 Imagen por una funcioacuten
Definicioacuten 232 Si f es una funcioacuten entre A y B y x es un elemento del conjunto A laimagen del elemento x por la funcioacuten f es el valor asociado a x por la funcioacuten f
La funcioacuten (imagen f x) es la imagen del elemento x en la funcioacuten f
-- | Ejemplos
-- gtgtgt imagen [(17)(32)] 1
-- 7
-- gtgtgt imagen [(17)(32)] 3
23 Funciones 45
-- 2
imagen (Ord a Ord b) =gt Funcion a b -gt a -gt b
imagen f x = head (imagenRelacion f x)
La funcioacuten (imagenConjunto f xs) es la imagen del conjunto xs en la funcioacuten f
-- | Ejemplos
-- gtgtgt imagenConjunto [(17)(32)(43)] [14]
-- [73]
-- gtgtgt imagenConjunto [(17)(32)] [31]
-- [27]
imagenConjunto (Ord a Ord b) =gt Funcion a b -gt [a] -gt [b]
imagenConjunto f xs = nub (map (imagen f) xs)
232 Funciones inyectivas
Definicioacuten 233 Diremos que una funcioacuten f entre dos conjuntos es inyectiva 2 si a ele-mentos distintos del dominio le corresponden elementos distintos de la imagen es decir siforalla b isin dominio( f ) tales que a 6= b f (a) 6= f (b)
La funcioacuten (esInyectiva fs) se verifica si la funcioacuten fs es inyectiva
-- | Ejemplos
-- gtgtgt esInyectiva [(14)(25)(36)]
-- True
-- gtgtgt esInyectiva [(14)(25)(34)]
-- False
-- gtgtgt esInyectiva [(14)(25)(36)(36)]
-- True
esInyectiva (Ord a Ord b) =gt Funcion a b -gt Bool
esInyectiva f =
all esUnitario [antiImagenRelacion f y | y lt- rango f]
233 Funciones sobreyectivas
Definicioacuten 234 Diremos que una funcioacuten f entre dos conjuntos A y B es sobreyectiva3 si todos los elementos de B son imagen de alguacuten elemento de A
La funcioacuten (esSobreyectiva xs ys f) se verifica si la funcioacuten f es sobreyectiva Ala hora de definirla estamos contando con que f es una funcioacuten entre xs y ys
-- | Ejemplos
-- gtgtgt esSobreyectiva [123] [456] [(14)(25)(36)]
2httpsenwikipediaorgwikiInjective_function3httpsenwikipediaorgwikiSurjective_function
46 Capiacutetulo 2 Relaciones y funciones
-- True
-- gtgtgt esSobreyectiva [123] [456] [(14)(25)(34)]
-- False
-- gtgtgt esSobreyectiva [123] [456] [(14)(24)(36)(36)]
-- False
esSobreyectiva (Ord aOrd b) =gt [a] -gt [b] -gt Funcion a b -gt Bool
esSobreyectiva _ ys f = ys `esSubconjunto` rango f
234 Funciones biyectivas
Definicioacuten 235 Diremos que una funcioacuten f entre dos conjuntos A y B es biyectiva 4 sicada elementos de B es imagen de un uacutenico elemento de A
La funcioacuten (esBiyectiva xs ys f) se verifica si la funcioacuten f es biyectiva
-- | Ejemplos
-- gtgtgt esBiyectiva [123] [456] [(14)(25)(36)(36)]
-- True
-- gtgtgt esBiyectiva [123] [456] [(14)(25)(34)]
-- False
-- gtgtgt esBiyectiva [123] [4567] [(14)(25)(36)]
-- False
esBiyectiva (Ord a Ord b) =gt [a] -gt [b] -gt Funcion a b -gt Bool
esBiyectiva xs ys f =
esInyectiva f ampamp esSobreyectiva xs ys f
La funciones biyecciones1 xs ys y biyecciones2 xs ys devuelven la lista de to-das las biyecciones entre los conjuntos xs y ys La primera lo hace filtrando las fun-ciones entre los conjuntos que son biyectivas y la segunda lo hace construyendouacutenicamente las funciones biyectivas entre los conjuntos con el consecuente ahorrocomputacional
ghcigt length (biyecciones1 [17] [ag])
5040
(1675 secs 4146744104 bytes)
ghcigt length (biyecciones2 [17] [ag])
5040
(002 secs 0 bytes)
ghcigt length (biyecciones1 [16] [ag])
0
(253 secs 592625824 bytes)
ghcigt length (biyecciones2 [16] [ag])
0
(001 secs 0 bytes)
4httpsenwikipediaorgwikiBijective_function
23 Funciones 47
biyecciones1 (Ord a Ord b) =gt [a] -gt [b] -gt [Funcion a b]
biyecciones1 xs ys =
filter (esBiyectiva xs ys) (funciones xs ys)
biyecciones2 (Ord a Ord b) =gt [a] -gt [b] -gt [Funcion a b]
biyecciones2 xs ys
| length xs = length ys = []
| otherwise = [zip xs zs | zs lt- permutations ys]
Nota 232 En lo que sigue trabajaremos con la funcioacuten biyecciones2 asiacute que laredefiniremos como biyecciones
biyecciones (Ord a Ord b) =gt [a] -gt [b] -gt [Funcion a b]
biyecciones = biyecciones2
235 Inversa de una funcioacuten
Definicioacuten 236 Si f es una funcioacuten biyectiva entre los conjuntos A y B definimos lafuncioacuten inversa 5 como la funcioacuten que a cada elemento de B le hace corresponder el elementode A del que es imagen en B
El valor de (inversa f) es la funcioacuten inversa de f
-- | Ejemplos
-- gtgtgt inversa [(14)(25)(36)]
-- [(41)(52)(63)]
-- gtgtgt sort (inversa [(1f)(2m)(3a)])
-- [(a3)(f1)(m2)]
inversa (Ord a Ord b) =gt Funcion a b -gt Funcion b a
inversa f = listaAConjunto [(yx) | (xy) lt- f]
Nota 233 Para considerar la inversa de una funcioacuten esta tiene que ser biyectivaLuego (inversa f) asigna a cada elemento del conjunto imagen (que en este casocoincide con la imagen) uno y solo uno del conjunto de salida
La funcioacuten (imagenInversa f y) devuelve el elemento del conjunto de salida de lafuncioacuten f tal que su imagen es y
-- | Ejemplos
-- gtgtgt imagenInversa [(14)(25)(36)] 5
-- 2
-- gtgtgt imagenInversa [(1f)(2m)(3a)] a
-- 3
imagenInversa (Ord a Ord b) =gt Funcion a b -gt b -gt a
imagenInversa f = imagen (inversa f)
5httpsenwikipediaorgwikiInverse_function
48 Capiacutetulo 2 Relaciones y funciones
Capiacutetulo 3
Introduccioacuten a la teoriacutea de grafos
Se dice que la Teoriacutea de Grafos tiene su origen en 1736 cuando Euler dio una so-lucioacuten al problema (hasta entonces no resuelto) de los siete puentes de Koumlnigsbergiquestexiste un camino que atraviese cada uno de los puentes exactamente una vezPara probar que no era posible Euler sustituyoacute cada regioacuten por un nodo y cadapuente por una arista creando el primer grafo que fuera modelo de un problemamatemaacutetico
Figura 31 Dibujo de los puentes de Koumlnigsberg
A
B
C
D
b
c
a
d
f
e
g
Figura 32 Modelo de los puentes de Koumlnigsberg
Desde entonces se ha ido desarrollando esta metodologiacutea hasta convertise en los uacutel-timos antildeos en una herramienta importante en aacutereas del conocimiento muy variadascomo por ejemplo la Investigacioacuten Operativa la Computacioacuten la Ingenieriacutea Eleacutec-trica la Geografiacutea y la Quiacutemica Es por ello que ademaacutes se ha erigido como unanueva disciplina matemaacutetica que generalmente asociada a las ramas de Topologiacuteay AacutelgebraLa utilidad de los grafos se basa en su gran poder de abstraccioacuten y una representa-cioacuten muy clara de cualquier relacioacuten lo que facilita enormemente tanto la fase demodelado como la de resolucioacuten de cualquier problema Gracias a la Teoriacutea de Gra-fos se han desarrollado una gran variedad de algoritmos y meacutetodos de decisioacuten quepodemos implementar a traveacutes de lenguajes funcionales y permiten automatizar laresolucioacuten de muchos problemas a menudo tediosos de resolver a mano
49
50 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
31 Definicioacuten de grafo
En primer lugar vamos a introducir terminologiacutea baacutesica en el desarrollo de la Teoriacuteade Grafos
Definicioacuten 311 Un grafo G es un par (V A) donde V es el conjunto cuyos elementosllamamos veacutertices (o nodos) y A es un conjunto cuyos elementos llamamos aristas
Definicioacuten 312 Una arista de un grafo G = (V A) es un conjunto de dos elementosde V Es decir para dos veacutertices v vprime de G (v vprime) y (vprime v) representa la misma arista
Definicioacuten 313 Dado un grafo G = (V A) diremos que un veacutertice v isin V es adyacentea vprime isin V si (vprime v) isin A
Definicioacuten 314 Si en un grafo dirigido se permiten aristas repetidas lo llamaremos mul-tigrafo Si no se permiten lo llamaremos grafo regular
Nota 311 Denotaremos por |V| al nuacutemero de veacutertices y por |A| al nuacutemero de aristasdel grafo (V A)
Ejemplo 312 Sea G = (V A) un grafo con V = a b c d y A = (a b) (a c) (b d)(d d) En este grafo los veacutertices a d son adyacentes a b
a
b
c
d
32 El TAD de los grafos
En esta seccioacuten nos planteamos la tarea de implementar las definiciones presenta-das anteriormente en un lenguaje funcional En nuestro caso el lenguaje que utili-zaremos seraacute Haskell Definiremos el Tipo Abstracto de Dato (TAD) de los grafos ydaremos algunos ejemplos de posibles representaciones de grafos con las que po-dremos trabajarSi consideramos un grafo finito cualquiera G = (V A) podemos ordenar el conjun-to de los veacutertices y representarlo como V = v1 vn con n = |V|En primer lugar necesitaremos crear un tipo (Grafo) cuya definicioacuten sea compatiblecon la entidad matemaacutetica que representa y que nos permita definir las operacionesque necesitamos para trabajar con los grafos Estas operaciones son
32 El TAD de los grafos 51
creaGrafo -- [a] -gt [(aa)] -gt Grafo a
vertices -- Grafo a -gt [a]
adyacentes -- Grafo a -gt a -gt [a]
aristaEn -- (aa) -gt Grafo a -gt Bool
aristas -- Grafo a -gt [(aa)]
dondebull (creaGrafo vs as) es un grafo tal que el conjunto de sus veacutertices es vs y el de
sus aristas es asbull (vertices g) es la lista de todos los veacutertices del grafo gbull (adyacentes g v) es la lista de los veacutertices adyacentes al veacutertice v en el grafo gbull (aristaEn a g) se verifica si a es una arista del grafo gbull (aristas g) es la lista de las aristas del grafo g
Nota 321 Las funciones que aparecen en la especificacioacuten del TAD no dependende la representacioacuten que elijamos
Ejemplo 322 Veamos un ejemplo de creacioacuten de grafo y su representacioacuten graacutefica
creaGrafo [15] [(12)(13)(15)(24)
(25)(34)(35)(45)]
1
2
34
5
321 Grafos como listas de aristas
En el moacutedulo GrafoConListaDeAristas se definen las funciones del TAD de losgrafos dando su representacioacuten como conjuntos de aristas es decir representandoa un grafo como dos conjuntos la primera seraacute la lista ordenada de los veacutertices y lasegunda la lista ordenada de las aristas (en ambas listas se excluye la posibilidad derepeticiones)
Nota 323 Las ventajas de usar arrays frente a usar listas es que los array tienenacceso constante (O(1)) a sus elementos mientras que las listas tienen acceso lineal(O(n)) y que la actualizacioacuten de un elemento en un array no supone espacio extraSin embargo los arrays son representaciones muy riacutegidas cualquier modificacioacutenen su estructura como cambiar su tamantildeo supone un gran coste computacionalpues se tendriacutea que crear de nuevo el array y ademaacutes sus iacutendices deben pertenecer
52 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
a la clase de los objetos indexables (Ix) luego perdemos mucha flexibilidad en larepresentacioacuten
- LANGUAGE DeriveGeneric -
module GrafoConListaDeAristas
( Grafo
creaGrafo -- [a] -gt [(aa)] -gt Grafo a
vertices -- Grafo a -gt [a]
adyacentes -- Grafo a -gt a -gt [a]
aristaEn -- (aa) -gt Grafo a -gt Bool
aristas -- Grafo a -gt [(aa)]
) where
En las definiciones del presente moacutedulo se usaraacuten las funciones nub y sort de lalibreriacutea DataList
Vamos a definir un nuevo tipo de dato (Grafo a) que representaraacute un grafo a partirde la lista de sus veacutertices (donde los veacutertices son de tipo a) y de aristas (que son paresde veacutertices)
data Grafo a = G [a] [(aa)]
deriving (Eq Show Generic)
instance (Out a) =gt Out (Grafo a)
Las funciones baacutesicas que definiremos a partir de este tipo coincidiraacuten con las indi-cadas en el TAD de los grafosbull (creaGrafo vs as) es el grafo cuyo conjunto de veacutertices es cs y el de sus aristas
es as-- | Ejemplo
-- gtgtgt creaGrafo [15] [(12)(14)(15)(23)(25)(34)(35)]
-- G [12345] [(12)(14)(15)(23)(25)(34)(35)]
creaGrafo Ord a =gt [a] -gt [(aa)] -gt Grafo a
creaGrafo vs as =
G (sort vs) (nub (sort [parOrdenado a | a lt- as]))
parOrdenado Ord a =gt (aa) -gt (aa)
parOrdenado (xy) | x lt= y = (xy)
| otherwise = (yx)
Ejemplo 324 ejGrafo es el grafo
32 El TAD de los grafos 53
1
2
3
4
5
Los ejemplos usaraacuten el siguiente grafo
ejGrafo Grafo Int
ejGrafo = creaGrafo [15]
[(12)(14)(15)(23)(25)(34)(35)(45)]
bull (vertices g) es la lista de los veacutertices del grafo g
-- | Ejemplo
-- gtgtgt vertices ejGrafo
-- [12345]
vertices Grafo a -gt [a]
vertices (G vs _) = vs
bull (adyacentes g v) es la lista de los veacutertices adyacentes al veacutertice v en el grafo g
-- | Ejemplos
-- gtgtgt adyacentes ejGrafo 4
-- [135]
-- gtgtgt adyacentes ejGrafo 3
-- [245]
adyacentes Eq a =gt Grafo a -gt a -gt [a]
adyacentes (G _ as) v =
[u | (ux) lt- as x == v] `union` [u | (xu) lt- as x == v]
bull (aristaEn a g) se verifica si a es una arista del grafo g
-- | Ejemplos
-- gtgtgt (51) `aristaEn` ejGrafo
-- True
-- gtgtgt (31) `aristaEn` ejGrafo
-- False
aristaEn Ord a =gt (aa) -gt Grafo a -gt Bool
aristaEn a (G _ as) = parOrdenado a `elem` as
bull (aristas g) es la lista de las aristas del grafo g
-- | Ejemplo
-- gtgtgt aristas ejGrafo
-- [(12)(14)(15)(23)(25)(34)(35)(45)]
aristas Grafo a -gt [(aa)]
aristas (G _ as) = as
54 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
33 Generador de grafos
En esta seccioacuten presentaremos el generador de grafos que nos permitiraacute generargrafos como listas de aristas arbitrariamente y usarlos como ejemplos o para com-probar propiedadesPara aprender a controlar el tamantildeo de los grafos generados he consultado las si-guientes fuentes QuickCheck A Lightweight Tool for Random Testing of Haskell Programs 1
([3]) Property Testing using QuickCheck 2 ([9])(generaGrafos n) es un generador de grafos de hasta n veacutertices Por ejemplo
ghcigt sample (generaGrafo 5)
G [12] []
G [1] [(11)]
G [] []
G [1234] [(22)]
G [123] [(11)(12)(13)(22)]
G [12345] [(12)(14)(15)(22)(23)(24)(33)(34)(44)(45)]
G [1] []
G [123] [(12)(22)(33)]
G [1234] [(11)(14)(23)(24)(33)(34)(44)]
G [12] []
G [123] [(11)(12)(22)(33)]
ghcigt sample (generaGrafo 2)
G [12] [(12)(22)]
G [12] [(11)]
G [12] [(11)(12)]
G [] []
G [1] [(11)]
G [1] []
G [1] []
G [] []
G [] []
G [] []
G [1] [(11)]
generaGrafo Int -gt Gen (Grafo Int)
generaGrafo s = do
let m = s `mod` 11
n lt- choose (0m)
as lt- sublistOf [(xy) | x lt- [1n] y lt- [xn]]
return (creaGrafo [1n] as)
1httpswwweecsnorthwesternedu~robbycourses395-495-2009-fallquickpdf2httpswwwdccfcuppt~pbvaulastapfslidesquickcheckhtml
34 Ejemplos de grafos 55
Nota 331 Los grafos estaacuten contenidos en la clase de los objetos generables aleato-riamente
instance Arbitrary (Grafo Int) where
arbitrary = sized generaGrafo
En el siguiente ejemplo se pueden observar algunos grafos generados
ghcigt sample (arbitrary Gen (Grafo Int))
G [] []
G [1] [(11)]
G [12] [(11)(12)]
G [1] [(11)]
G [12345678] [(14)(17)(22)(23)(25)(28)(35)
(36)(38)(44)(46)(47)(48)(56)(66)(67)(78)]
G [12345] [(11)(12)(14)(15)(24)(25)(34)(55)]
G [] []
G [] []
G [123] [(11)(22)(23)]
G [1234] [(11)(12)(14)(22)(33)]
G [1234567] [(11)(15)(16)(17)(22)(24)(25)
(26)(27)(33)(35)(46)(47)(55)(57)(66)(77)]
34 Ejemplos de grafos
El objetivo de esta seccioacuten es reunir una coleccioacuten de grafos lo suficientemente ex-tensa y variada como para poder utilizarla como recurso a la hora de comprobar laspropiedades y definiciones de funciones que implementaremos maacutes adelanteEn el proceso de recopilacioacuten de ejemplos se ha trabajado con diversas fuentesbull los apuntes de la asignatura ldquoMatemaacutetica discretardquo ([4])bull los temas de la asignatura ldquoInformaacuteticardquo ([1]) ybull el artiacuteculo ldquoGraph theoryrdquo ([11]) de la Wikipedia
Nota 341 Se utilizaraacute la representacioacuten de los grafos como listas de aristas
341 Grafo nulo
Definicioacuten 341 Un grafo nulo es un grafo que no tiene ni veacutertices ni aristas
La funcioacuten (grafoNulo) devuelve un grafo nulo
grafoNulo Ord a =gt Grafo a
grafoNulo = creaGrafo [] []
La funcioacuten (esGrafoNulo g) se verifica si g es un grafo nulo
56 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- | Ejemplos
-- gtgtgt esGrafoNulo grafoNulo
-- True
-- gtgtgt esGrafoNulo (creaGrafo [] [(12)])
-- False
-- gtgtgt esGrafoNulo (creaGrafo [12] [(12)])
-- False
esGrafoNulo Grafo a -gt Bool
esGrafoNulo g =
null (vertices g) ampamp null (aristas g)
342 Grafo ciclo
Definicioacuten 342 Un ciclo 3 de orden n C(n) es un grafo no dirigido y no ponderadocuyo conjunto de veacutertices viene dado por V = 1 n y el de las aristas por A = (0 1)(1 2) (nminus 2 nminus 1) (nminus 1 0)
La funcioacuten (grafoCiclo n) nos genera el ciclo de orden n
1
23
45
-- | Ejemplos
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
grafoCiclo Int -gt Grafo Int
grafoCiclo 0 = grafoNulo
grafoCiclo 1 = creaGrafo [1] []
grafoCiclo n = creaGrafo [1n]
([(uu+1) | u lt- [1n-1]] ++ [(n1)])
343 Grafo de la amistad
Definicioacuten 343 Un grafo de la amistad 4 de orden n es un grafo con 2n + 1 veacuterticesy 3n aristas formado uniendo n copias del ciclo C3 por un veacutertice comuacuten Lo denotamos porFn3httpseswikipediaorgwikiGrafo_completo4httpseswikipediaorgwikiGrafo_de_la_amistad
34 Ejemplos de grafos 57
La funcioacuten (grafoAmistad n) genera el grafo de la amistad de orden n Por ejemplo
1
2
34
5
1
2
3
4
5
6
7
-- | Ejemplos
-- gtgtgt pp $ grafoAmistad 2
-- G [12345]
-- [(1 2)(1 3)(1 4)(1 5)(2 3)(4 5)]
-- gtgtgt pp $ grafoAmistad 3
-- G [1234567]
-- [(1 2)(1 3)(1 4)(1 5)(1 6)(1 7)(2 3)
-- (4 5)(6 7)]
grafoAmistad Int -gt Grafo Int
grafoAmistad n =
creaGrafo [12n+1]
([(1a) | a lt- [22n+1]] ++
[(ab) | (ab) lt-zip [242n] [352n+1]])
344 Grafo completo
Definicioacuten 344 El grafo completo 5 de orden n K(n) es un grafo no dirigido cuyoconjunto de veacutertices viene dado por V = 1 n y tiene una arista entre cada par deveacutertices distintos
La funcioacuten (completo n) nos genera el grafo completo de orden n Por ejemplo
5httpseswikipediaorgwikiGrafo_completo
58 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
1
2
3
4
-- | Ejemplo
-- gtgtgt completo 4
-- G [1234] [(12)(13)(14)(23)(24)(34)]
completo Int -gt Grafo Int
completo n =
creaGrafo [1n]
[(ab) | a lt- [1n] b lt- [1a-1]]
345 Grafo bipartito
Definicioacuten 345 Un grafo bipartito 6 es un grafo G = (V A) verificando que elconjunto de sus veacutertices se puede dividir en dos subconjuntos disjuntos V1 V2 tales queV1 cupV2 = V de manera que forallu1 u2 isin V1[(u1 u2) 6isin A] y forallv1 v2 isin V2[(v1 v2) 6isin A]Un grafo bipartito completo 7 seraacute entonces un grafo bipartito G = (V1 cup V2 A) en elque todos los veacutertices de una particioacuten estaacuten conectados a los de la otra Si n = |V1| m =
|V2| denotamos al grafo bipartito G = (V1 cupV2 A) por Knm
La funcioacuten (bipartitoCompleto n m) nos genera el grafo bipartito Knm Por ejem-plo
1 2
3 4 5
-- | Ejemplo
-- gtgtgt bipartitoCompleto 2 3
-- G [12345] [(13)(14)(15)(23)(24)(25)]
bipartitoCompleto Int -gt Int -gt Grafo Int
bipartitoCompleto n m =
creaGrafo [1n+m]
[(ab) | a lt- [1n] b lt- [n+1n+m]]
6httpseswikipediaorgwikiGrafo_bipartito7httpseswikipediaorgwikiGrafo_bipartito_completo
34 Ejemplos de grafos 59
La funcioacuten (conjuntosVerticesDisjuntos g) devuelve Nothing si el grafo g no esbipartito y Just(xsys) si lo es donde xs ys es una particioacuten disjunta de los veacuterticesde g
-- | Ejemplo
-- gtgtgt conjuntosVerticesDisjuntos (bipartitoCompleto 3 4)
-- Just ([321][7654])
-- gtgtgt conjuntosVerticesDisjuntos (grafoCiclo 5)
-- Nothing
-- gtgtgt conjuntosVerticesDisjuntos (grafoCiclo 6)
-- Just ([531][642])
conjuntosVerticesDisjuntos Ord a =gt Grafo a -gt Maybe ([a][a])
conjuntosVerticesDisjuntos g
| null (vertices g) = Just ([][])
| otherwise = aux (vertices g) [] [] [] []
where u = union
a = adyacentes g
d xs x = xs [x]
aux [] _ _ r b = if (null (intersect r b))
then (Just (rb))
else Nothing
aux (vvs) [] [] [] [] = aux vs (a v) [v] [v] []
aux (vvs) [] c r b
| null (a v) = aux vs [] (vc) (vr) b
| null ((a v) c) =
if (or [elem u r | u lt- (a v)])
then (if (or [elem u b | u lt- (a v)])
then Nothing
else (aux vs [] (vc) r (vb)))
else (aux vs [] (vc) (vr) b)
| otherwise =
if (or [elem u r | u lt- (a v)])
then (if (or [elem u b | u lt- (a v)])
then Nothing
else (aux vs ((a v) c) (vc) r (vb)))
else (aux vs ((a v) c) (vc) (vr) b)
aux vs (qqs) c r b
| null ((a q) c) =
if (or [elem u r | u lt- (a q)])
then (if (or [elem u b | u lt- (a q)])
then Nothing
else (aux (d vs q) qs (qc) r (qb)))
else (aux (d vs q) qs (qc) (qr) b)
| otherwise =
if (or [elem u r | u lt- (a q)])
then (if (or [elem u b | u lt- (a q)])
then Nothing
else (aux (d vs q) (u ((a q) c) qs)
60 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
(qc) r (qb)))
else (aux (d vs q) (u ((a q) c) qs)
(qc) (qr) b)
La funcioacuten (esBipartito g) se verifica si el grafo g es bipartito
-- | Ejemplo
-- gtgtgt esBipartito (bipartitoCompleto 3 4)
-- True
-- gtgtgt esBipartito (grafoCiclo 5)
-- False
-- gtgtgt esBipartito (grafoCiclo 6)
-- True
esBipartito Ord a =gt Grafo a -gt Bool
esBipartito g = isJust (conjuntosVerticesDisjuntos g)
346 Grafo estrella
Definicioacuten 346 Una estrella 8 de orden n es el grafo bipartito completo K1n Denota-remos a una estrella de orden n por Sn Una estrella con 3 aristas se conoce en ingleacutes comoclaw (garra o garfio)
La funcioacuten (grafoEstrella n) crea un grafo circulante a partir de su orden n
2
34
56
1
-- | Ejemplo
-- gtgtgt grafoEstrella 5
-- G [123456] [(12)(13)(14)(15)(16)]
grafoEstrella Int -gt Grafo Int
grafoEstrella = bipartitoCompleto 1
347 Grafo rueda
Definicioacuten 347 Un grafo rueda 9 de orden n es un grafo no dirigido y no ponderado conn veacutertices que se forma conectando un uacutenico veacutertice a todos los veacutertices de un ciclo Cnminus1 Lodenotaremos por Wn8httpsenwikipediaorgwikiStar_(graph_theory))9httpseswikipediaorgwikiGrafo_rueda
34 Ejemplos de grafos 61
La funcioacuten (grafoRueda n) crea un grafo rueda a partir de su orden n
2
34
56
1
-- | Ejemplo
-- gtgtgt pp $ grafoRueda 6
-- G [123456]
-- [(1 2)(1 3)(1 4)(1 5)(1 6)(2 3)(2 6)
-- (3 4)(4 5)(5 6)]
grafoRueda Int -gt Grafo Int
grafoRueda n =
creaGrafo [1n]
([(1a) | a lt- [2n]] ++
[(ab) | (ab) lt- zip (2[2n-1]) (3n[4n])])
348 Grafo circulante
Definicioacuten 348 Un grafo circulante 10 de orden n ge 3 y saltos s1 sk es un grafono dirigido y no ponderado G = (1 n A) en el que cada nodo foralli isin V es adyacente alos 2k nodos iplusmn s1 iplusmn sk mod n Lo denotaremos por Cirs1sk
n
La funcioacuten (grafoCirculante n ss) crea un grafo circulante a partir de su orden n
y de la lista de sus saltos ss Por ejemplo
2
34
5
6 1
-- | Ejemplo
-- gtgtgt pp $ grafoCirculante 6 [12]
-- G [123456]
-- [(1 2)(1 3)(1 5)(1 6)(2 3)(2 4)(2 6)
-- (3 4)(3 5)(4 5)(4 6)(5 6)]
grafoCirculante Int -gt [Int] -gt Grafo Int
grafoCirculante n ss =
10httpsenwikipediaorgwikiCirculant_graph
62 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
creaGrafo [1n]
[(ab) | a lt- [1n]
b lt- sort (auxCir a ss n)
a lt b]
where auxCir v ss1 k =
concat [[fun (v+s) k fun (v-s) k] | s lt- ss1]
fun a b = if mod a b == 0 then b else mod a b
349 Grafo de Petersen generalizado
El grafo de Petersen generalizado 11 que denotaremos GPnk (con n ge 3 y 1 le k le(nminus 1)2) es un grafo formado por un grafo circulante Cirn
k en el interior rodeadopor un ciclo Cn al que estaacute conectado por una arista saliendo de cada veacutertice deforma que se creen n poliacutegonos regulares El grafo GPnk tiene 2n veacutertices y 3n aristasLa funcioacuten (grafoPetersenGen n k) devuelve el grafo de Petersen generalizadoGPnk
1
2
3
4
5
6
7
8
-- | Ejemplo
-- gtgtgt pp $ grafoPetersenGen 4 2
-- G [12345678]
-- [(1 3)(1 5)(2 4)(2 6)(3 7)(4 8)(5 6)
-- (5 8)(6 7)(7 8)]
grafoPetersenGen Int -gt Int -gt Grafo Int
grafoPetersenGen n k =
creaGrafo [12n]
(filter p (aristas (grafoCirculante n [k])) ++
[(xx+n) | x lt- [1n]] ++
(n+1n+2) (n+12n) [(xx+1) | x lt- [n+22n-1]])
where p (ab) = a lt b
11httpsenwikipediaorgwikiGeneralized_Petersen_graph
34 Ejemplos de grafos 63
3410 Otros grafos importantes
Grafo de Thomson
Definicioacuten 349 El grafo bipartito completo K33 es conocido como el grafo de Thomsony como veremos maacutes adelante seraacute clave a la hora de analizar propiedades topoloacutegicas de losgrafos
1 2 3
4 5 6
La funcioacuten (grafoThomson) genera el grafo de Thomson
-- | Ejemplo
-- gtgtgt pp $ grafoThomson
-- G [123456]
-- [(1 4)(1 5)(1 6)(2 4)(2 5)(2 6)(3 4)
-- (3 5)(3 6)]
grafoThomson Grafo Int
grafoThomson = bipartitoCompleto 3 3
Grafo de Heawood
El grafo de Heawood 12 es un grafo no dirigido regular con 14 veacutertices y 21 aris-tas Todos sus veacutertices son incidentes a exactamente 3 aristas es decir es un grafocuacutebico Tiene importantes propiedades geomeacutetricas y topoloacutegicas
1
2
3
45
6
7
8
9
10
11 12
13
14
12httpsenwikipediaorgwikiHeawood_graph
64 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten grafoHeawood genera el grafo de Heawood
-- | Ejemplo
-- gtgtgt pp $ grafoHeawood
-- G [1234567891011121314]
-- [(1 2)(1 6)(1 14)(2 3)(2 11)(3 4)(3 8)
-- (4 5)(4 13)(5 6)(5 10)(6 7)(7 8)(7 12)
-- (8 9)(9 10)(9 14)(10 11)(11 12)(12 13)
-- (13 14)]
grafoHeawood Grafo Int
grafoHeawood =
creaGrafo [114]
(aristas (grafoCiclo 14) ++
zip [1 23 4 5 7 9]
[611813101214])
Grafo de McGee
El grafo de McGee 13 es un grafo no dirigido cuacutebico con 24 veacutertices y 36 aristasTiene importantes propiedades geomeacutetricas y topoloacutegicas
1
2
3
45
6789
10
11
12
13
14
15
1617
18 19 2021
22
23
24
La funcioacuten grafoMcGee genera el grafo de McGee
-- | Ejemplo
-- gtgtgt pp $ grafoMcGee
-- G [12345678910111213141516171819
-- 2021222324]
-- [(1 2)(1 13)(1 24)(2 3)(2 9)(3 4)(3 20)
13httpsenwikipediaorgwikiMcGee_graph
34 Ejemplos de grafos 65
-- (4 5)(4 16)(5 6)(5 12)(6 7)(6 23)(7 8)
-- (7 19)(8 9)(8 15)(9 10)(10 11)(10 22)
-- (11 12)(11 18)(12 13)(13 14)(14 15)
-- (14 21)(15 16)(16 17)(17 18)(17 24)
-- (18 19)(19 20)(20 21)(21 22)(22 23)
-- (23 24)]
grafoMcGee Grafo Int
grafoMcGee =
creaGrafo [124]
(aristas (grafoCiclo 24) ++
zip [ 12 3 4 5 6 7 810111417]
[13920161223191522182124])
Grafo TuttendashCoxeter
El grafo TuttendashCoxeter 14 es un grafo no dirigido cuacutebico con 30 veacutertices y 45 aristasTiene importantes propiedades geomeacutetricas y topoloacutegicas
1
2
3
4
56
7891011
12
13
14
15
16
17
18
19
2021
22 23 24 2526
27
28
29
30
La funcioacuten grafoTutteCoxeter genera el grafo TuttendashCoxeter
-- | Ejemplo
-- gtgtgt pp $ grafoTutteCoxeter
-- G [12345678910111213141516171819
-- 2021222324252627282930]
14httpsenwikipediaorgwikiTutteT1textendashCoxeter_graph
66 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- [(1 2)(1 18)(1 30)(2 3)(2 23)(3 4)
-- (3 10)(4 5)(4 27)(5 6)(5 14)(6 7)(6 19)
-- (7 8)(7 24)(8 9)(8 29)(9 10)(9 16)
-- (10 11)(11 12)(11 20)(12 13)(12 25)
-- (13 14)(13 30)(14 15)(15 16)(15 22)
-- (16 17)(17 18)(17 26)(18 19)(19 20)
-- (20 21)(21 22)(21 28)(22 23)(23 24)
-- (24 25)(25 26)(26 27)(27 28)(28 29)
-- (29 30)]
grafoTutteCoxeter Grafo Int
grafoTutteCoxeter =
creaGrafo [130]
(aristas (grafoCiclo 30) ++
zip [ 1 2 3 4 5 6 7 8 9111213151721]
[182310271419242916202530222628])
Grafo de Petersen
El grafo de Petersen 15 se define como el grafo de Petersen generalizado GP52 esdecir es un grafo cuacutebico formado por los veacutertices de un pentaacutegono conectados alos veacutertices de una estrella de cinco puntas en la que cada nodo es adyacente a losnodos que estaacuten a un salto 2 de eacutel Es usado como ejemplo y como contraejemplo enmuchos problemas de la Teoriacutea de grafos
6
7
8 9
101
2
3 4
5
La funcioacuten grafoPetersen devuelve el grafo de Petersen
-- | Ejemplo
-- gtgtgt pp $ grafoPetersen
-- G [12345678910]
-- [(1 3)(1 4)(1 6)(2 4)(2 5)(2 7)(3 5)
-- (3 8)(4 9)(5 10)(6 7)(6 10)(7 8)(8 9)
-- (9 10)]
grafoPetersen Grafo Int
grafoPetersen = grafoPetersenGen 5 2
15httpsenwikipediaorgwikiPetersen_graph
35 Definiciones y propiedades 67
Grafo de MoeumlbiusndashCantor
El grafo de MoeumlbiusndashCantor 16 se define como el grafo de Petersen generalizadoGP83 es decir es un grafo cuacutebico formado por los veacutertices de un octoacutegono conecta-dos a los veacutertices de una estrella de ocho puntas en la que cada nodo es adyacente alos nodos que estaacuten a un salto 3 de eacutel Al igual que el grafo de Petersen tiene impor-tantes propiedades que lo hacen ser ejemplo y contraejemplo de muchos problemasde la Teoriacutea de Grafos
9
10
11
12
13
14
15
16
1
23
4
5
67
8
La funcioacuten grafoMoebiusCantor genera el grafo de MoeumlbiusndashCantor
-- | Ejemplo
-- gtgtgt pp $ grafoMoebiusCantor
-- G [12345678910111213141516]
-- [(1 4)(1 6)(1 9)(2 5)(2 7)(2 10)(3 6)
-- (3 8)(3 11)(4 7)(4 12)(5 8)(5 13)(6 14)
-- (7 15)(8 16)(9 10)(9 16)(10 11)(11 12)
-- (12 13)(13 14)(14 15)(15 16)]
grafoMoebiusCantor Grafo Int
grafoMoebiusCantor = grafoPetersenGen 8 3
35 Definiciones y propiedades
Una vez construida una pequentildea fuente de ejemplos estamos en condiciones deimplementar las definiciones sobre grafos en Haskell y ver que funcionan correc-tamente Ademaacutes comprobaremos que se cumplen las propiedades baacutesicas que sehan presentado en el tema Introduccioacuten a la teoriacutea de grafos de ldquoMatemaacutetica discretardquo([4])
16httpsenwikipediaorgwikiMoeumlbius-Kantor_graph
68 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Nota 351 Se utilizaraacute el tipo abstracto de grafos presentados en la seccioacuten 32 y seutilizaraacuten las librerias DataList y TestQuickCheck
351 Definiciones de grafos
Definicioacuten 351 El orden de un grafo G = (V A) se define como su nuacutemero de veacuterticesLo denotaremos por |V(G)|
La funcioacuten (orden g) devuelve el orden del grafo g
-- | Ejemplos
-- gtgtgt orden (grafoCiclo 4)
-- 4
-- gtgtgt orden (grafoEstrella 4)
-- 5
orden Grafo a -gt Int
orden = length vertices
Definicioacuten 352 El tamantildeo de un grafo G = (V A) se define como su nuacutemero de aristasLo denotaremos por |A(G)|
La funcioacuten (tamantildeo g) devuelve el orden del grafo g
-- | Ejemplos
-- gtgtgt tamantildeo (grafoCiclo 4)
-- 4
-- gtgtgt tamantildeo grafoPetersen
-- 15
tamantildeo Grafo a -gt Int
tamantildeo = length aristas
Definicioacuten 353 Diremos que dos aristas a aprime son incidentes si tienen interseccioacuten novaciacutea es decir si tienen alguacuten veacutertice en comuacuten
La funcioacuten (sonIncidentes a a) se verifica si las aristas a y a son incidentes
-- | Ejemplos
-- gtgtgt sonIncidentes (12) (24)
-- True
-- gtgtgt sonIncidentes (12) (34)
-- False
sonIncidentes Eq a =gt (aa) -gt (aa) -gt Bool
sonIncidentes (u1u2) (v1v2) =
or [u1 == v1 u1 == v2 u2 == v1 u2 == v2]
Definicioacuten 354 Diremos que una arista de un grafo G es un lazo si va de un veacutertice ensiacute mismo
35 Definiciones y propiedades 69
La funcioacuten (lazos g) devuelve los lazos del grafo g
-- | Ejemplos
-- gtgtgt lazos (creaGrafo [12] [(11)(12)(22)])
-- [(11)(22)]
-- gtgtgt lazos (grafoCiclo 5)
-- []
lazos Eq a =gt Grafo a -gt [(aa)]
lazos g = [(uv) | (uv) lt- aristas g u == v]
La funcioacuten (esLazo a) se verifica si la arista a es un lazo
-- | Ejemplos
-- gtgtgt esLazo (44)
-- True
-- gtgtgt esLazo (12)
-- False
esLazo Eq a =gt (aa) -gt Bool
esLazo (uv) = u == v
Definicioacuten 355 Dado un grafo G = (V A) fijado un veacutertice v isin V al conjunto deveacutertices que son adyacentes a v lo llamaremos entorno de v y lo denotaremos por N(v) =u isin V|(u v) isin A
La funcioacuten (entorno g v) devuelve el entorno del veacutertice v en el grafo g
-- | Ejemplo
-- gtgtgt entorno (creaGrafo [15] [(12)(13)(23)]) 2
-- [13]
entorno Eq a =gt Grafo a -gt a -gt [a]
entorno = adyacentes
Definicioacuten 356 Sea G = (V A) un grafo El grado (o valencia) de v isin V es grad(v) =|N(v)|
La funcioacuten (grado g v) devuelve el grado del veacutertice v en el grafo g
-- | Ejemplos
-- gtgtgt grado (creaGrafo [15] [(12)(13)(23)]) 2
-- 2
-- gtgtgt grado (grafoEstrella 5) 1
-- 5
grado Eq a =gt Grafo a -gt a -gt Int
grado g v = length (entorno g v)
Definicioacuten 357 Un veacutertice v de un grafo es aislado si su grado es 0
La funcioacuten (esAislado g v) se verifica si el veacutertice v es aislado en el grafo g
70 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- | Ejemplos
-- gtgtgt esAislado (creaGrafo [15] [(12)(13)(23)]) 4
-- True
-- gtgtgt esAislado (creaGrafo [15] [(12)(13)(23)]) 3
-- False
esAislado Eq a =gt Grafo a -gt a -gt Bool
esAislado g v = grado g v == 0
Definicioacuten 358 Un grafo es regular si todos sus veacutertices tienen el mismo grado
La funcioacuten (esRegular g) se verifica si el grafo g es regular
-- | Ejemplos
-- gtgtgt esRegular (creaGrafo [13] [(12)(13)(23)])
-- True
-- gtgtgt esRegular (creaGrafo [14] [(12)(13)(24)])
-- False
esRegular Eq a =gt Grafo a -gt Bool
esRegular g = all (==x) xs
where (xxs) = [grado g v | v lt- vertices g]
Definicioacuten 359 Dado un grafo G = (V A) llamamos valencia miacutenima o grado miacuteni-mo de G al valor δ(G) = mıngrad(v)|v isin V
La funcioacuten (valenciaMin g) devuelve la valencia miacutenima del grafo g
-- | Ejemplo
-- gtgtgt valenciaMin (creaGrafo [14] [(12)(13)(24)])
-- 1
valenciaMin Ord a =gt Grafo a -gt Int
valenciaMin g = minimum [grado g v | v lt- vertices g]
Definicioacuten 3510 Dado un grafo G = (V A) llamamos valencia maacutexima o gradomaacuteximo de G al valor δ(G) = maxgrad(v)|v isin V
La funcioacuten (valenciaMax g) devuelve la valencia maacutexima del grafo g
-- | Ejemplo
-- gtgtgt valenciaMax (creaGrafo [14] [(12)(13)(24)])
-- 2
valenciaMax Ord a =gt Grafo a -gt Int
valenciaMax g = maximum [grado g v | v lt- vertices g]
Definicioacuten 3511 Se dice que un grafo es simple si no contiene lazos ni aristas repetidas
La funcioacuten (esSimple g) se verifica si g es un grafo simple
35 Definiciones y propiedades 71
-- | Ejemplos
-- gtgtgt esSimple (creaGrafo [13] [(12)(13)(23)])
-- True
-- gtgtgt esSimple (creaGrafo [13] [(11)(12)(23)])
-- False
esSimple Ord a =gt Grafo a -gt Bool
esSimple g =
and [not ((xx) `aristaEn` g) | x lt- vertices g]
Definicioacuten 3512 Sea G un grafo Llamamos secuencia de grados de G a la lista degrados de sus veacutertices La secuencia se suele presentar en orden decreciente d1 ge d2 gemiddot middot middot ge dn
La funcioacuten (secuenciaGrados g) devuelve la secuencia de los grados del grafo g enorden decreciente
-- | Ejemplo
-- gtgtgt secuenciaGrados (creaGrafo [15] [(12)(13)(14)(24)])
-- [32210]
secuenciaGrados Eq a =gt Grafo a -gt [Int]
secuenciaGrados g = sortBy (flip compare) [grado g v | v lt- vertices g]
Nota 352 iquestQueacute listas de n nuacutemeros enteros son secuencias de grafos de n veacuterticesbull Si sumn
i=1 di es impar no hay ningunobull Si sumn
i=1 di es par entonces siempre hay un grafo con esa secuencia de grados (aun-que no necesariamente simple)
Definicioacuten 3513 Una secuencia graacutefica es una lista de nuacutemero enteros no negativos quees la secuencia de grados para alguacuten grafo simple
La funcioacuten (secuenciaGrafica ss) se verifica si existe alguacuten grafo con la secuenciade grados ss
-- | Ejemplos
-- gtgtgt secuenciaGrafica [32210]
-- True
-- gtgtgt secuenciaGrafica [3222]
-- False
secuenciaGrafica [Int] -gt Bool
secuenciaGrafica ss = even (sum ss) ampamp all p ss
where p s = s gt= 0 ampamp s lt= length ss
Definicioacuten 3514 Dado un grafo G = (V A) diremos que Gprime = (Vprime Aprime) es un subgrafode G si Vprime sube V y Aprime sube A
72 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (esSubgrafo g g) se verifica si g es un subgrafo de g
-- |Ejemplos
-- gtgtgt esSubgrafo (bipartitoCompleto 3 2) (bipartitoCompleto 3 3)
-- True
-- gtgtgt esSubgrafo (grafoEstrella 4) (grafoEstrella 5)
-- True
-- gtgtgt esSubgrafo (completo 5) (completo 4)
-- False
-- gtgtgt esSubgrafo (completo 3) (completo 4)
-- True
esSubgrafo Ord a =gt Grafo a -gt Grafo a -gt Bool
esSubgrafo g g =
vertices g `esSubconjunto` vertices g ampamp
aristas g `esSubconjunto` aristas g
Definicioacuten 3515 Si Gprime = (Vprime Aprime) es un subgrafo de G = (V A) tal que Vprime = Vdiremos que Gprime es un subgrafo maximal grafo recubridor o grafo de expansioacuten (eningleacutes spanning grah) de G
La funcioacuten (esSubgrafoMax g g) se verifica si g es un subgrafo maximal de g
-- | Ejemplos
-- gtgtgt esSubgrafoMax (grafoRueda 3) (grafoRueda 4)
-- False
-- gtgtgt esSubgrafoMax (grafoCiclo 4) (grafoRueda 4)
-- True
-- gtgtgt esSubgrafoMax (creaGrafo [13] [(12)]) (grafoCiclo 3)
-- True
-- gtgtgt esSubgrafoMax (creaGrafo [12] [(12)]) (grafoCiclo 3)
-- False
esSubgrafoMax Ord a =gt Grafo a -gt Grafo a -gt Bool
esSubgrafoMax g g =
g `esSubgrafo` g ampamp conjuntosIguales (vertices g) (vertices g)
Definicioacuten 3516 Sean Gprime = (Vprime Aprime) G = (V A) dos grafos si Vprime sub V o Aprime sub A sedice que Gprime es un subgrafo propio de G y se denota por Gprime sub G
La funcioacuten (esSubgrafoPropio g g) se verifica si g es un subgrafo propio de g
-- | Ejemplos
-- gtgtgt esSubgrafoPropio (grafoRueda 3) (grafoRueda 4)
-- True
-- gtgtgt esSubgrafoPropio (grafoRueda 4) (grafoCiclo 5)
-- False
-- gtgtgt esSubgrafoPropio (creaGrafo [13] [(12)]) (grafoCiclo 3)
-- True
-- gtgtgt esSubgrafoPropio (creaGrafo [12] [(12)]) (grafoCiclo 3)
35 Definiciones y propiedades 73
-- True
esSubgrafoPropio Ord a =gt Grafo a -gt Grafo a -gt Bool
esSubgrafoPropio g g =
esSubgrafo g g ampamp
(not (conjuntosIguales (vertices g) (vertices g)) ||
not (conjuntosIguales (aristas g) (aristas g)))
352 Propiedades de grafos
Teorema 3517 (Lema del apretoacuten de manos) En todo grafo simple el nuacutemero de veacuterticesde grado impar es par o cero
Vamos a comprobar que se verifica el lema del apretoacuten de manos utilizando la fun-cioacuten prop_LemaApretonDeManos
ghcigt quickCheck prop_LemaApretonDeManos
+++ OK passed 100 tests
prop_LemaApretonDeManos Grafo Int -gt Bool
prop_LemaApretonDeManos g =
even (length (filter odd [grado g v | v lt- vertices g]))
where g = creaGrafo (vertices g)
[(xy) | (xy) lt- aristas g x = y]
Teorema 3518 (HavelndashHakimi) Si n gt 1 y D = [d1 dn] es una lista de enterosentonces D es secuencia graacutefica si y soacutelo si la secuencia Dprime obtenida borrando el mayorelemento dmax y restando 1 a los siguientes dmax elementos maacutes grandes es graacutefica
Vamos a comprobar que se verifica el teorema de HavelndashHakimi utilizando la fun-cioacuten prop_HavelHakimi
ghcigt quickCheck prop_HavelHakimi
+++ OK passed 100 tests
prop_HavelHakimi [Int] -gt Bool
prop_HavelHakimi [] = True
prop_HavelHakimi (sss) =
not (secuenciaGrafica (sss) ampamp not (esVacio ss)) ||
secuenciaGrafica (map (x -gt x-1) (take s ss) ++ drop s ss)
353 Operaciones y propiedades sobre grafos
Eliminacioacuten de una arista
Definicioacuten 3519 Sea G = (V A) un grafo y sea (u v) isin A Definimos el grafo G (u v) como el subgrafo de G Gprime = (Vprime Aprime) con Vprime = V y Aprime = A (u v) Esta
74 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
operacioacuten se denomina eliminar una arista
La funcioacuten (eliminaArista g a) elimina la arista a del grafo g
-- | Ejemplos
-- gtgtgt eliminaArista (creaGrafo [14] [(12)(14)(24)]) (14)
-- G [1234] [(12)(24)]
-- gtgtgt eliminaArista (creaGrafo [14] [(12)(14)(24)]) (41)
-- G [1234] [(12)(24)]
-- gtgtgt eliminaArista (creaGrafo [14] [(12)(14)(24)]) (43)
-- G [1234] [(12)(14)(24)]
eliminaArista Ord a =gt Grafo a -gt (aa) -gt Grafo a
eliminaArista g (ab) =
creaGrafo (vertices g)
(aristas g [(ab)(ba)])
La funcioacuten (eliminaLazos g) devuelve un nuevo grafo obtenido a partir del grafog eliminando todas las aristas que fueran lazos
-- | Ejemplos
-- gtgtgt eliminaLazos (creaGrafo [12] [(11)(12)(22)])
-- G [12] [(12)]
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
-- gtgtgt eliminaLazos (grafoCiclo 5)
-- G [12345] [(12)(15)(23)(34)(45)]
eliminaLazos Ord a =gt Grafo a -gt Grafo a
eliminaLazos g = creaGrafo (vertices g)
[(xy) | (xy) lt- aristas g x = y]
Eliminacioacuten un veacutertice
Definicioacuten 3520 Sea G = (V A) un grafo y sea v isin V Definimos el grafo G v como elsubgrafo de G Gprime = (Vprime Aprime) con Vprime = V v y Aprime = A a isin A|v es un extremo de aEsta operacioacuten se denomina eliminar un veacutertice
La funcioacuten (eliminaVertice g v) elimina el veacutertice v del grafo g
-- | Ejemplos
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(24)]) 1
-- G [234] [(24)]
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(24)]) 4
-- G [123] [(12)]
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(24)]) 3
-- G [124] [(12)(14)(24)]
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(13)]) 1
-- G [234] []
eliminaVertice Ord a =gt Grafo a -gt a -gt Grafo a
35 Definiciones y propiedades 75
eliminaVertice g v =
creaGrafo (vertices g [v])
(as [(ab) | (ab) lt- as a == v || b == v])
where as = aristas g
Suma de aristas
Definicioacuten 3521 Sea G = (V A) un grafo y sean u v isin V tales que (u v) (v u) 6isin ADefinimos el grafo G + (u v) como el grafo Gprime = (V A cup (u v)) Esta operacioacuten sedenomina suma de una arista
La funcioacuten (sumaArista g a) suma la arista a al grafo g
-- | Ejemplos
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
-- gtgtgt sumaArista (grafoCiclo 5) (13)
-- G [12345] [(12)(13)(15)(23)(34)(45)]
sumaArista Ord a =gt Grafo a -gt (aa) -gt Grafo a
sumaArista g a =
creaGrafo (vertices g) (a aristas g)
Suma de veacutertices
Definicioacuten 3522 Sea G = (V A) un grafo y sea v 6isin V Definimos el grafo G + v comoel grafo Gprime = (Vprime Aprime) donde Vprime = V cup v Aprime = Acup (u v)|u isin V Esta operacioacuten sedenomina suma de un veacutertice
La funcioacuten (sumaVertice g a) suma el veacutertice a al grafo g
-- | Ejemplo
-- gtgtgt grafoCiclo 3
-- G [123] [(12)(13)(23)]
-- gtgtgt sumaVertice (grafoCiclo 3) 4
-- G [1234] [(12)(13)(14)(23)(24)(34)]
sumaVertice Ord a =gt Grafo a -gt a -gt Grafo a
sumaVertice g v =
creaGrafo (v vs) (aristas g ++ [(uv) | u lt- vs])
where vs = vertices g
Propiedad de los grafos completos
Proposicioacuten 3523 La familia de grafos completos Kn verifica que Kn = Knminus1 + n
Vamos a ver que se cumple la propiedad utilizando la funcioacuten prop_completos
76 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
ghcigt quickCheck prop_completos
+++ OK passed 100 tests
prop_completos Int -gt Property
prop_completos n = n gt= 2 ==gt
completo n == sumaVertice (completo (n-1)) n
A partir de esta propiedad se puede dar una definicioacuten alternativa de la funcioacuten(completo n) que devuelve el grafo completo Kn La nueva funcioacuten seraacute (completo2n)
completo2 Int -gt Grafo Int
completo2 0 = grafoNulo
completo2 n = sumaVertice (completo2 (n-1)) n
Vamos a comprobar la equivalencia de ambas deficiones
ghcigt prop_EquiCompleto
True
prop_EquiCompleto Bool
prop_EquiCompleto = and [completo n == completo2 n | n lt- [050]]
Vamos a ver cuaacutel de las definiciones es maacutes eficiente
ghcigt tamantildeo (completo 100)
4950
(117 secs 0 bytes)
ghcigt tamantildeo (completo2 100)
4950
(1549 secs 61756056 bytes)
La funcioacuten (completo n) es maacutes eficiente asiacute que seraacute la que seguiremos utilizando
Suma de grafos
Definicioacuten 3524 Sean G = (V A) Gprime = (Vprime A) dos grafos Definimos el grafo sumade G y Gprime como el grafo G + Gprime = (V cup Vprime A cup Aprime cup (u v)|u isin V v isin Vprime) Estaoperacioacuten se denomina suma de grafos
La funcioacuten (sumaGrafos g g) suma los grafos g y g
-- | Ejemplo
-- gtgtgt let g1 = creaGrafo [13] [(11)(13)(23)]
-- gtgtgt let g2 = creaGrafo [46] [(46)(56)]
-- gtgtgt pp $ sumaGrafos g1 g2
-- G [123456]
-- [(1 1)(1 3)(1 4)(1 5)(1 6)(2 3)(2 4)
-- (2 5)(2 6)(3 4)(3 5)(3 6)(4 6)(5 6)]
sumaGrafos Ord a =gt Grafo a -gt Grafo a -gt Grafo a
35 Definiciones y propiedades 77
sumaGrafos g1 g2 =
creaGrafo (vs1 `union` vs2)
(aristas g1 `union`
aristas g2 `union`
[(uv) | u lt- vs1 v lt- vs2])
where vs1 = vertices g1
vs2 = vertices g2
Unioacuten de grafos
Definicioacuten 3525 Sean G = (V A) Gprime = (Vprime A) dos grafos Definimos el grafo unioacutende G y Gprime como el grafo G cup H = (V cupVprime A cup Aprime) Esta operacioacuten se denomina unioacuten degrafos
La funcioacuten (unionGrafos g g) une los grafos g y g Por ejemplo
-- | Ejemplo
-- gtgtgt let g1 = creaGrafo [13] [(11)(13)(23)]
-- gtgtgt let g2 = creaGrafo [46] [(46)(56)]
-- gtgtgt unionGrafos g1 g2
-- G [123456] [(11)(13)(23)(46)(56)]
unionGrafos Ord a =gt Grafo a -gt Grafo a -gt Grafo a
unionGrafos g1 g2 =
creaGrafo (vertices g1 `union` vertices g2)
(aristas g1 `union` aristas g2)
Grafo complementario
Definicioacuten 3526 Dado un grafo G = (V A) se define el grafo complementario de Gcomo G = (V A) donde A = (u v)|u v isin V (u v) 6isin A
La funcioacuten (grafoComplementario g) devuelve el grafo complementario de g
-- | Ejemplo
-- gtgtgt grafoComplementario (creaGrafo [13] [(11)(13)(23)])
-- G [123] [(12)(22)(33)]
grafoComplementario Ord a =gt Grafo a -gt Grafo a
grafoComplementario g =
creaGrafo vs
[(uv)| u lt- vs v lt- vs u lt= v not ((uv) `aristaEn` g)]
where vs = vertices g
Definicioacuten 3527 Dado un grafo diremos que es completo si su complementario sin lazosno tiene aristas
La funcioacuten (esCompleto g) se verifica si el grafo g es completo
78 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- Ejemplos
-- gtgtgt esCompleto (completo 4)
-- True
-- gtgtgt esCompleto (grafoCiclo 5)
-- False
esCompleto Ord a =gt Grafo a -gt Bool
esCompleto g =
tamantildeo (eliminaLazos (grafoComplementario g)) == 0
36 Morfismos de grafos
Llegados a este punto es importante resaltar que un grafo se define como una en-tidad matemaacutetica abstracta es evidente que lo importante de un grafo no son losnombres de sus veacutertices ni su representacioacuten graacutefica La propiedad que caracterizaa un grafo es la forma en que sus veacutertices estaacuten unidos por las aristasA priori los siguientes grafos pueden parecer distintos
a
bc
de
1
23
45
Sin embargo ambos grafos son grafos de cinco veacutertices que tienen las mismas rela-ciones de vecindad entre sus nodos En esta seccioacuten estudiaremos estas relacionesque establecen las aristas entre los veacutertices de un grafo y presentaremos algoritmosque nos permitan identificar cuaacutendo dos grafos se pueden relacionar mediante apli-caciones entre sus veacutertices cumpliendo ciertas caracteriacutesicas
361 Morfismos
Definicioacuten 361 Si f es una funcioacuten entre dos grafos G = (V A) y Gprime = (Vprime Aprime)diremos que conserva la adyacencia si forallu v isin V se verifica que si (u v) isin A entonces( f (u) f (v)) isin Aprime
La funcioacuten (conservaAdyacencia g h f) se verifica si la funcioacuten f entre los grafosg y h conserva las adyacencias
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [14] [(12)(23)(34)]
-- gtgtgt let g2 = creaGrafo [14] [(12)(23)(24)]
-- gtgtgt let g3 = creaGrafo [4610] [(48)(68)(810)]
36 Morfismos de grafos 79
-- gtgtgt conservaAdyacencia g1 g3 [(14)(26)(38)(410)]
-- False
-- gtgtgt conservaAdyacencia g2 g3 [(14)(28)(36)(410)]
-- True
conservaAdyacencia (Ord a Ord b) =gt
Grafo a -gt Grafo b -gt Funcion a b -gt Bool
conservaAdyacencia g h f =
and [(imagen f ximagen f y) `aristaEn` h | (xy) lt- aristas g]
Definicioacuten 362 Dados dos grafos simples G = (V A) y Gprime = (Vprime Aprime) un morfismoentre G y Gprime es una funcioacuten φ V rarr Vprime que conserva las adyacencias
La funcioacuten (esMorfismo g h vvs) se verifica si la funcioacuten representada por vvs esun morfismo entre los grafos g y h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(12)(32)]
-- gtgtgt let g2 = creaGrafo [456] [(46)(56)]
-- gtgtgt esMorfismo g1 g2 [(14)(26)(35)]
-- True
-- gtgtgt esMorfismo g1 g2 [(14)(25)(36)]
-- False
-- gtgtgt esMorfismo g1 g2 [(14)(26)(35)(79)]
-- False
esMorfismo (Ord aOrd b) =gt Grafo a -gt Grafo b -gt
Funcion a b -gt Bool
esMorfismo g1 g2 f =
esFuncion (vertices g1) (vertices g2) f ampamp
conservaAdyacencia g1 g2 f
La funcioacuten (morfismos g h) devuelve todos los posibles morfismos entre los grafosg y h
-- | Ejemplos
-- gtgtgt grafoCiclo 3
-- G [123] [(12)(13)(23)]
-- gtgtgt let g = creaGrafo [46] [(44)(66)]
-- gtgtgt morfismos (grafoCiclo 3) g
-- [[(14)(24)(34)][(16)(26)(36)]]
-- gtgtgt morfismos g (grafoCiclo 3)
-- []
morfismos (Ord a Ord b) =gt Grafo a -gt Grafo b -gt [[(ab)]]
morfismos g h =
[f | f lt- funciones (vertices g) (vertices h)
conservaAdyacencia g h f]
80 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
362 Complejidad del problema de homomorfismo de grafos
En general en computacioacuten un problema algoriacutetmico consta de un conjunto I detodas las posibles entradas para el problema llamado el conjunto de instancias y deuna pregunta Q sobre esas instancias Resolver uno de estos problemas consiste endesarrollar un algoritmo cuya entrada es una instancia del problema y cuya salidaes una respuesta a la pregunta del problemaDecimos que un problema es de decisioacuten cuando las posibles respuestas a la pre-gunta son ldquosiacuterdquo o ldquonordquo Un ejemplo de problema de este tipo seriacutea dados dos grafosdecidir si estos son homomorfos o noA la hora de implementar un algoritmo que deacute solucioacuten al problema que estemosconsiderando es importante tener en cuenta el nuacutemero de pasos que efectuacutea hastaencontrar una respuesta Un algoritmo de tiempo polinomial se define como aquelcon funcioacuten de complejidad temporal en O(p(n)) para alguna funcioacuten polinoacutemicap donde n denota el tamantildeo de la entrada Cualquier algoritmo cuya funcioacuten decomplejidad temporal no pueda ser acotada de esta manera se denomina algoritmode tiempo exponencialLa mayoriacutea de los algoritmos de tiempo exponencial son simples variaciones de unabuacutesqueda exhaustiva mientras que los algoritmos de tiempo polinomial usualmen-te se obtienen mediante un anaacutelisis maacutes profundo de la estructura del problema Enla Teoriacutea de la complejidad computacional existe el consenso de que un problemano estaacute ldquobien resueltordquo hasta que se conozca un algoritmo de tiempo polinomialque lo resuelva Por tanto nos referiremos a un problema como ldquointratablerdquo si estan difiacutecil que no existe algoritmo de tiempo polinomial capaz de resolverloLos problemas de decisioacuten para los que existen algoritmos polinomiales consti-tuyen la clase P y son llamados polinomiales Un problema de decisioacuten es no-determiniacutestico polinomial cuando cualquier instancia que produce respuesta ldquosiacuterdquoposee una comprobacioacuten de correctitud (tambieacuten llamada certificado) verificable entiempo polinomia en el tamantildeo de la instancia Estos problemas de decisioacuten se di-ce que pertenecen a la clase NP Claramente P sube NP Sin embargo no se sabe siesta inclusioacuten es estricta uno de los principales problemas abiertos en Teoriacutea de lacomputacioacuten es saber si P 6= NPUna reduccioacuten es una transformacioacuten de un problema en otro problema Intuitiva-mente un problema Q puede ser reducido a otro problema Qprime si cualquier instanciadel problema Q puede ser ldquofaacutecilmenterdquo expresada como una instancia del problemaQprime y cuya solucioacuten proporcione una solucioacuten para la instancia de QLas reducciones en tiempo polinomial nos dotan de elementos para probar de unamanera formal que un problema es al menos tan difiacutecil que otro con una dife-rencia de un factor polinomial Estas son esenciales para definir a los problemas
36 Morfismos de grafos 81
NP-completos ademaacutes de ayudar a comprender los mismosLa clase de los problemas NP-completos contiene a los problemas maacutes difiacuteciles enNP en el sentido de que son los que esteacuten maacutes lejos de estar en P Debido a que elproblema P = NP no ha sido resuelto el hecho de reducir un problema B a otroproblema A indicariacutea que no se conoce solucioacuten en tiempo polinomial para A Estoes debido a que una solucioacuten en tiempo polinomial para A tendriacutea como conse-cuencia la existencia de una solucioacuten polinomial para B De manera similar debidoa que todos los problemas NP pueden ser reducidos a este conjunto encontrar unproblema NP-completo que pueda ser resuelto en un tiempo polinomial significariacuteaque P = NPEl problema de decidir si dos grafos son homomorfos es un problema de decisioacutenNP-completo La NP-completitud del problema se demuestra mediante la reduccioacutende este problema al problema de la clique 17En el proceso de recopilacioacuten de imformacioacuten acerca de la Teoriacutea de la complejidadse ha trabajado con dos fuentesbull la tesis de licenciatura de Pablo Burzyn ldquoComplejidad computacional en proble-
mas de modificacioacuten de aristas en grafosrdquo ([2]) ybull el artiacuteculo ldquoTeoriacutea de la complejidad computacionalrdquo ([12]) de la Wikipedia
363 Isomorfismos
Definicioacuten 363 Dados dos grafos simples G = (V A) y Gprime = (Vprime Aprime) un isomorfis-mo entre G y Gprime es un morfismo biyectivo cuyo inverso es morfismo entre Gprime y G
La funcioacuten (esIsomorfismo g h f) se verifica si la aplicacioacuten f es un isomorfismoentre los grafos g y h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt esIsomorfismo g1 g2 [(12)(24)(36)]
-- True
-- gtgtgt esIsomorfismo g1 g2 [(12)(22)(36)]
-- False
esIsomorfismo (Ord aOrd b) =gt
Grafo a -gt Grafo b -gt Funcion a b -gt Bool
esIsomorfismo g h f =
esBiyectiva vs1 vs2 f ampamp
esMorfismo g h f ampamp
esMorfismo h g (inversa f)
where vs1 = vertices g
vs2 = vertices h
17httpseswikipediaorgwikiProblema_de_la_clique
82 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (isomorfismos1 g h) devuelve todos los isomorfismos posibles entrelos grafos g y h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfismos1 g1 g2
-- [[(12)(24)(36)]]
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfismos1 g3 g4
-- []
-- gtgtgt let g5 = creaGrafo [123] [(11)(22)(33)]
-- gtgtgt let g6 = creaGrafo [246] [(22)(44)(66)]
-- gtgtgt pp $ isomorfismos1 g5 g6
-- [[(1 2)(2 4)(3 6)][(1 4)(2 2)(3 6)]
-- [(1 6)(2 4)(3 2)][(1 4)(2 6)(3 2)]
-- [(1 6)(2 2)(3 4)][(1 2)(2 6)(3 4)]]
isomorfismos1 (Ord aOrd b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos1 g h =
[f | f lt- biyecciones vs1 vs2
conservaAdyacencia g h f
conservaAdyacencia h g (inversa f)]
where vs1 = vertices g
vs2 = vertices h
Definicioacuten 364 Dos grafos G y H se dicen isomorfos si existe alguacuten isomorfismo entreellos
La funcioacuten isomorfos1 g h se verifica si los grafos g y h son isomorfos
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfos1 g1 g2
-- True
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfos1 g3 g4
-- False
isomorfos1 (Ord aOrd b) =gt Grafo a -gt Grafo b -gt Bool
isomorfos1 g = not null isomorfismos1 g
Nota 361 Al tener Haskell una evaluacioacuten perezosa la funcioacuten (isomorfos g h)
no necesita generar todos los isomorfismos entre los grafos g y h
Definicioacuten 365 Sea G = (V A) un grafo Un invariante por isomorfismos de G esuna propiedad de G que tiene el mismo valor para todos los grafos que son isomorfos a eacutel
36 Morfismos de grafos 83
esInvariantePorIsomorfismos
Eq a =gt (Grafo Int -gt a) -gt Grafo Int -gt Grafo Int -gt Bool
esInvariantePorIsomorfismos p g h =
isomorfos g h --gt (p g == p h)
where (--gt) = (lt=)
Teorema 366 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un iso-morfismo Entonces se verifica que |V(G)| = |V(Gprime)| es decir el orden de un grafo es uninvariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos orden)
+++ OK passed 100 tests
Teorema 367 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces se verifica que |A(G)| = |A(Gprime)| es decir el tamantildeo de un grafo es uninvariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos tamantildeo)
+++ OK passed 100 tests
Teorema 368 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces tienen la misma secuencia de grados es decir la secuencia de grados de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos secuenciaGrados)
+++ OK passed 100 tests
A partir de las propiedades que hemos demostrado de los isomorfismos vamos adar otra definicioacuten equivalente de las funciones (isomorfismos1 g h) y (isomorfos1
g h)
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfismos2 g1 g2
-- [[(12)(24)(36)]]
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfismos2 g3 g4
-- []
-- gtgtgt let g5 = creaGrafo [123] [(11)(22)(33)]
84 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- gtgtgt let g6 = creaGrafo [246] [(22)(44)(66)]
-- gtgtgt pp $ isomorfismos2 g5 g6
-- [[(1 2)(2 4)(3 6)][(1 4)(2 2)(3 6)]
-- [(1 6)(2 4)(3 2)][(1 4)(2 6)(3 2)]
-- [(1 6)(2 2)(3 4)][(1 2)(2 6)(3 4)]]
isomorfismos2 (Ord a Ord b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos2 g h
| orden g = orden h = []
| tamantildeo g = tamantildeo h = []
| secuenciaGrados g = secuenciaGrados h = []
| otherwise = [f | f lt- biyecciones vs1 vs2
conservaAdyacencia g h f]
where vs1 = vertices g
vs2 = vertices h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfos2 g1 g2
-- True
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfos2 g3 g4
-- False
isomorfos2 (Ord a Ord b) =gt Grafo a -gt Grafo b -gt Bool
isomorfos2 g =
not null isomorfismos2 g
isomorfismos3 (Ord a Ord b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos3 g h
| orden g = orden h = []
| tamantildeo g = tamantildeo h = []
| secuenciaGrados g = secuenciaGrados h = []
| otherwise = filter (conservaAdyacencia g h) (posibles g h)
verticesPorGrados g =
[filter (p n) (vertices g) | n lt- nub (secuenciaGrados g)]
where p m v = grado g v == m
aux1 [] _ = []
aux1 (xsxss) (ysyss) = (map (zip xs) (permutations ys))aux1 xss yss
aux2 [] = []
aux2 (xss[]) = xss
aux2 (xssyss[]) = [xs ++ ys | xs lt- xss ys lt- yss]
aux2 (xssyssxsss) =
aux2 ([xs ++ ys | xs lt- xss ys lt- yss]xsss)
36 Morfismos de grafos 85
posibles g h =
aux2 (aux1 (verticesPorGrados g) (verticesPorGrados h))
Vamos a comparar la eficiencia entre ambas definiciones
Nota 362 La nueva definicioacuten de (isomorfismos3 g h) es la maacutes eficiente con gra-fos poco regulares sin embargo cuando todos los veacutertices tienen el mismo grado(isomorfismos2 g h) sigue siendo mejor opcioacuten (aunque no hay mucha diferenciaen el coste computacional)ghcigt let n = 6 in (length (isomorfismos1 (completo n) (completo n)))
720
(018 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos2 (completo n) (completo n)))
720
(018 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos3 (completo n) (completo n)))
720
(018 secs 26123800 bytes)
ghcigt let n = 6 in (length (isomorfismos1 (grafoCiclo n) (grafoCiclo n)))
12
(004 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos2 (grafoCiclo n) (grafoCiclo n)))
12
(004 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos3 (grafoCiclo n) (grafoCiclo n)))
12
(004 secs 0 bytes)
ghcigt length (isomorfismos1 (grafoCiclo 6) (completo 7))
0
(000 secs 0 bytes)
ghcigt length (isomorfismos2 (grafoCiclo 6) (completo 7))
0
(001 secs 0 bytes)
ghcigt length (isomorfismos3 (grafoCiclo 6) (completo 7))
0
(000 secs 0 bytes)
ghcigt isomorfos1 (completo 10) (grafoCiclo 10)
False
(5190 secs 12841861176 bytes)
ghcigt isomorfos2 (completo 10) (grafoCiclo 10)
False
(000 secs 0 bytes)
ghcigt isomorfos3 (completo 10) (grafoCiclo 10)
False
86 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
(000 secs 0 bytes)
ghcigt isomorfos1 (grafoCiclo 10) (grafoRueda 10)
False
(7390 secs 16433969976 bytes)
ghcigt isomorfos2 (grafoCiclo 100) (grafoRueda 100)
False
(000 secs 0 bytes)
ghcigt isomorfos3 (grafoCiclo 100) (grafoRueda 100)
False
(000 secs 0 bytes)
ghcigt length (isomorfismos2 (grafoRueda 10) (grafoRueda 10))
18
(10112 secs 23237139992 bytes)
ghcigt length (isomorfismos3 (grafoRueda 10) (grafoRueda 10))
18
(4467 secs 9021442440 bytes)
Nota 363 Cuando los grafos son isomorfos comprobar que tienen el mismo nuacuteme-ro de veacutertices el mismo nuacutemero de aristas y la misma secuencia graacutefica no requieremucho tiempo ni espacio dando lugar a costes muy similares entre los dos paresde definiciones Sin embargo cuando los grafos tienen el mismo nuacutemero de veacuterticesy fallan en alguna de las demaacutes propiedades el resultado es muy costoso para laprimera definicioacuten mientras que es inmediato con la segundaA partir de ahora utilizaremos la funcioacuten isomorfismos2 para calcular los isomor-fismos entre dos grafos y la funcioacuten isomorfos para determinar si dos grafos sonisomorfos de modo que las renombraremos por isomorfismos y isomorfismos res-pectivamente
isomorfismos (Ord aOrd b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos = isomorfismos2
isomorfos (Ord aOrd b) =gt Grafo a -gt Grafo b -gt Bool
isomorfos = isomorfos2
364 Automorfismos
Definicioacuten 369 Dado un grafo simple G = (V A) un automorfismo de G es un iso-morfismo de G en siacute mismo
La funcioacuten (esAutomorfismo g f) se verifica si la aplicacioacuten f es un automorfismode g
-- | Ejemplos
-- gtgtgt let g = creaGrafo [123] [(12)(13)]
37 Caminos en grafos 87
-- gtgtgt esAutomorfismo g [(11)(23)(32)]
-- True
-- gtgtgt esAutomorfismo g [(12)(23)(31)]
-- False
esAutomorfismo Ord a =gt Grafo a -gt Funcion a a -gt Bool
esAutomorfismo g = esIsomorfismo g g
La funcioacuten (automorfismos g) devuelve la lista de todos los posibles automorfis-mos en g
-- | Ejemplo
-- gtgtgt automorfismos (creaGrafo [123] [(12)(13)])
-- [[(11)(22)(33)][(11)(23)(32)]]
automorfismos Ord a =gt Grafo a -gt [Funcion a a]
automorfismos g = isomorfismos1 g g
Nota 364 Cuando trabajamos con automorfismos es mejor utilizar en su defini-cioacuten la funcioacuten isomorfismos1 en vez de isomorfismos2 pues ser isomorfos es unarelacioacuten reflexiva es decir un grafo siempre es isomorfo a siacute mismo
37 Caminos en grafos
Una de las aplicaciones de la teoriacutea de grafos es la determinacioacuten de trayectos o re-corridos en una red de transporte o de distribucioacuten de productos Asiacute si cada veacuterticerepresenta un punto de intereacutes y cada arista representa una conexioacuten entre dos pun-tos usando grafos como modelos podemos simplificar el problema de encontrar laruta maacutes ventajosa en cada caso
371 Definicioacuten de camino
Definicioacuten 371 Sea G = (V A) un grafo simple y sean u v isin V dos veacutertices Uncamino entre u y v es una sucesioacuten de veacutertices de G u = v0 v1 v2 vkminus1 vk = vdonde foralli isin 0 kminus 1 (vi vi+1) isin A
La funcioacuten (esCamino g c) se verifica si la sucesioacuten de veacutertices c es un camino enel grafo g
-- | Ejemplo
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
-- gtgtgt esCamino (grafoCiclo 5) [123451]
-- True
-- gtgtgt esCamino (grafoCiclo 5) [124531]
-- False
88 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
esCamino Ord a =gt Grafo a -gt [a] -gt Bool
esCamino g c = all (`aristaEn` g) (zip c (tail c))
La funcioacuten (aristasCamino c) devuelve la lista de las aristas recorridas en el ca-mino c
-- | Ejemplos
-- gtgtgt aristasCamino [123]
-- [(12)(23)]
-- gtgtgt aristasCamino [1231]
-- [(12)(23)(13)]
-- gtgtgt aristasCamino [1232]
-- [(12)(23)(23)]
aristasCamino Ord a =gt [a] -gt [(aa)]
aristasCamino c =
map parOrdenado (zip c (tail c))
where parOrdenado (uv) | u lt= v = (uv)
| otherwise = (vu)
La funcioacuten (verticesCamino c) devuelve la lista de las vertices recorridas en elcamino c
-- | Ejemplo
-- gtgtgt verticesCamino [1231]
-- [123]
verticesCamino Ord a =gt [a] -gt [a]
verticesCamino c = nub c
Definicioacuten 372 Se llama longitud de un camino al nuacutemero de veces que se atraviesa unaarista en dicho camino
La funcioacuten (longitudCamino c) devuelve la longitud del camino c
-- | Ejemplo
-- gtgtgt longitudCamino [427]
-- 2
longitudCamino [a] -gt Int
longitudCamino c = length c - 1
La funcioacuten (todosCaminos g u v k) devuelve todos los caminos entre los veacuterticesu y v en el grafo g que tienen longitud k
-- | Ejemplo
-- gtgtgt todosCaminos (creaGrafo [12] [(12)]) 1 2 3
-- [[1212]]
-- gtgtgt todosCaminos (bipartitoCompleto 2 3) 1 3 3
-- [[1313][1323][1413][1423][1513][1523]]
todosCaminos Ord a =gt Grafo a -gt a -gt a -gt Int -gt [[a]]
todosCaminos g u v 0 = if u == v ampamp elem u (vertices g)
37 Caminos en grafos 89
then [[u]]
else []
todosCaminos g u v 1 = if aristaEn (uv) g
then [[uv]]
else []
todosCaminos g u v k =
filter p [uvs | n lt- [1k-1] w lt- a u vs lt- tC w v n]
where p xs = longitudCamino xs == k
a = adyacentes g
tC = todosCaminos g
La funcioacuten (numeroCaminosDeLongitud g u v k) es el nuacutemero de caminos de lon-gitud k uniendo los veacutertices u y v en el grafo g
-- | Ejemplos
-- gtgtgt numeroCaminosDeLongitud (completo 7) 1 4 5
-- 1111
-- gtgtgt numeroCaminosDeLongitud grafoPetersen 1 4 3
-- 5
numeroCaminosDeLongitud Ord a =gt Grafo a -gt a -gt a -gt Int -gt Int
numeroCaminosDeLongitud g u v = length todosCaminos g u v
372 Recorridos
Definicioacuten 373 Sea G = (V A) un grafo y sean u v isin V Un camino entre u y v queno repite aristas (quizaacutes veacutertices) se llama recorrido
La funcioacuten (esRecorrido g c) se verifica si el camino c es un recorrido en el grafog
-- | Ejemplo
-- gtgtgt esRecorrido (grafoCiclo 4) [214]
-- True
-- gtgtgt esRecorrido (grafoCiclo 4) [2141]
-- False
-- gtgtgt esRecorrido (grafoCiclo 4) [213]
-- False
esRecorrido Ord a =gt Grafo a -gt [a] -gt Bool
esRecorrido g c =
esCamino g c ampamp sinRepetidos (aristasCamino c)
373 Caminos simples
Definicioacuten 374 Un camino que no repite veacutertices (y por tanto tampoco aristas) se llamacamino simple
90 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (esCaminoSimple g c) se verifica si el camino c es un camino simple enel grafo g
-- | Ejemplos
-- gtgtgt esCaminoSimple (creaGrafo [12] [(11)(12)]) [112]
-- False
-- gtgtgt esCaminoSimple (grafoCiclo 4) [214]
-- True
-- gtgtgt esCaminoSimple (grafoCiclo 4) [14321]
-- True
-- gtgtgt esCaminoSimple (grafoCiclo 4) [43212]
-- False
esCaminoSimple Ord a =gt Grafo a -gt [a] -gt Bool
esCaminoSimple g [] = True
esCaminoSimple g vs =
esRecorrido g vs ampamp noRepiteVertices vs
where noRepiteVertices (xxs)
| sinRepetidos (xxs) = True
| x == last xs ampamp sinRepetidos xs = True
| otherwise = False
La funcioacuten (todosArcosBP g u v) devuelve una lista con todos los caminos simplesposibles en el grafo g entre los veacutertices u y v utilizando una algoritmo de buacutesquedaen profundidad sobre el grafo g Este algoritmo recorre el grafo de izquierda a dere-cha y de forma al visitar un nodo explora todos los caminos que pueden continuarpor eacutel antes de pasar al siquiente
-- | Ejemplos
-- gtgtgt grafoCiclo 4
-- G [1234] [(12)(14)(23)(34)]
-- gtgtgt todosArcosBP (grafoCiclo 4) 1 4
-- [[14][1234]]
-- gtgtgt todosArcosBP (grafoCiclo 4) 4 1
-- [[4321][41]]
-- gtgtgt todosArcosBP (creaGrafo [14] [(12)(34)]) 1 4
-- []
-- gtgtgt todosArcosBP (creaGrafo [12] [(11)(12)]) 1 1
-- [[1]]
todosArcosBP Ord a =gt Grafo a -gt a -gt a -gt [[a]]
todosArcosBP g x y = aux [[y]]
where aux [] = []
aux ([]zss) = aux zss
aux ((zzs)zss)
| z == x = (zzs) aux zss
| otherwise =
aux ([vzzs | v lt- adyacentes g z zs] ++ zss)
g = eliminaLazos g
eliminaLazos h = creaGrafo (vertices h)
37 Caminos en grafos 91
[(xy) | (xy) lt- aristas h x = y]
La funcioacuten (todosArcosBA g u v) devuelve una lista con todos los caminos simplesposibles en el grafo g entre los veacutertices u y v utilizando una algoritmo de buacutesquedaen anchura sobre el grafo g Este algoritmo recorre el grafo por niveles de formaque el primer camino de la lista es de longitud miacutenima
-- | Ejemplos
-- gtgtgt grafoCiclo 4
-- G [1234] [(12)(14)(23)(34)]
-- gtgtgt todosArcosBA (grafoCiclo 4) 1 4
-- [[14][1234]]
-- gtgtgt todosArcosBA (grafoCiclo 4) 4 1
-- [[41][4321]]
-- gtgtgt todosArcosBA (creaGrafo [14] [(12)(34)]) 1 4
-- []
-- gtgtgt todosArcosBA (creaGrafo [12] [(11)(12)]) 1 1
-- [[1]]
todosArcosBA Ord a =gt Grafo a -gt a -gt a -gt [[a]]
todosArcosBA g x y = aux [[y]]
where aux [] = []
aux ([]zss) = aux zss
aux ((zzs)zss)
| z == x = (zzs) aux zss
| otherwise =
aux (zss ++ [vzzs | v lt- adyacentes g z zs])
g = eliminaLazos g
Vamos a comprobar con QuickCheck que el primer elemento de la lista que de-vuelve la funcioacuten (todosArcosBA g u v) es de longitud miacutenima Para ello vamos autilizar la funcioacuten (parDeVertices g) que es un generador de pares de veacutertices delgrafo no nulo g Por ejemplo
ghcigt sample (parDeVertices (creaGrafo [19] []))
(39)
(93)
(74)
(43)
(28)
(72)
(84)
(53)
(72)
(31)
(72)
92 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
parDeVertices Grafo Int -gt Gen (IntInt)
parDeVertices g = do
x lt- elements vs
y lt- elements vs
return (xy)
where vs = vertices g
La propiedad es
prop_todosArcosBA Grafo Int -gt Property
prop_todosArcosBA g =
not (esGrafoNulo g) ==gt
forAll (parDeVertices g)
((xy) -gt let zss = todosArcosBA g x y
in null zss || longitudCamino (head zss) ==
minimum (map longitudCamino zss))
La comprobacioacuten es
ghcigt quickCheck prop_todosArcosBA
+++ OK passed 100 tests
Veamos que la funcioacuten (todosArcosBP g u v) no verifica la propiedad
ghcigt quickCheck prop_todosArcosBP
Failed Falsifiable (after 6 tests)
G [12345] [(12)(14)(15)(22)(23)(24)(44)(45)(55)]
(52)
prop_todosArcosBP Grafo Int -gt Property
prop_todosArcosBP g =
not (esGrafoNulo g) ==gt
forAll (parDeVertices g)
((xy) -gt let zss = todosArcosBP g x y
in null zss || longitudCamino (head zss) ==
minimum (map longitudCamino zss))
La funcioacuten (numeroArcosDeLongitud g u v k) devuelve el nuacutemero de caminos en-tre los veacutertices u y v en el grafo g que tienen longitud k
-- | Ejemplos
-- gtgtgt numeroArcosDeLongitud (completo 6) 1 3 4
-- 24
-- gtgtgt numeroArcosDeLongitud grafoPetersen 1 3 4
-- 4
numeroArcosDeLongitud Ord a =gt Grafo a -gt a -gt a -gt Int -gt Int
numeroArcosDeLongitud g u v k =
length (filter p (todosArcosBA g u v))
where p vs = longitudCamino vs == k
37 Caminos en grafos 93
374 Conexioacuten
Definicioacuten 375 Dado un grafo G = (V A) sean u v isin V Si existe alguacuten camino entreu y v en el grafo G diremos que estaacuten conectados y lo denotamos por u v
La funcioacuten (estanConectados g u v) se verifica si los veacutertices u y v estaacuten conecta-dos en el grafo g
-- | Ejemplos
-- gtgtgt estanConectados (creaGrafo [14] [(12)(24)]) 1 4
-- True
-- gtgtgt estanConectados (creaGrafo [14] [(12)(34)]) 1 4
-- False
estanConectados Ord a =gt Grafo a -gt a -gt a -gt Bool
estanConectados g u v
| esGrafoNulo g = False
| otherwise = not (null (todosArcosBA g u v))
Nota 371 La funcioacuten (estanConectados g u v) no necesita calcular todos los ca-minos entre u y v Puesto que Haskell utiliza por defecto evaluacioacuten perezosa siexiste alguacuten camino entre los dos veacutertices basta calcular el primero para saber quela lista de todos los caminos no es vaciacutea
375 Distancia
Definicioacuten 376 Se define la distancia entre u y v en el grafo G como la longitud delcamino maacutes corto que los une Si u y v no estaacuten conectados decimos que la distancia esinfinita
La funcioacuten (distancia g u v) devuelve la distancia entre los veacutertices u y v en elgrafo g En caso de que los veacutertices no esteacuten conectados devuelve el valor Nothing
-- | Ejemplos
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 1
-- Just 0
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 2
-- Just 1
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 3
-- Just 2
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 4
-- Nothing
distancia Ord a =gt Grafo a -gt a -gt a -gt Maybe Int
distancia g u v
| estanConectados g u v =
Just (longitudCamino (head (todosArcosBA g u v)))
| otherwise = Nothing
94 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Definicioacuten 377 Dado G = (V A) un grafo sean u v isin V Un camino entre u y v cuyalongitud coincide con la distancia entre los veacutertices se llama geodeacutesica entre u y v
La funcioacuten (esGeodesica g c) se verifica si el camino c es una geodeacutesica entre susextremos en el grafo g
-- | Ejemplos
-- gtgtgt let g = creaGrafo [14] [(12)(13)(23)(34)]
-- gtgtgt esGeodesica g [134]
-- True
-- gtgtgt esGeodesica g [1234]
-- False
esGeodesica Ord a =gt Grafo a -gt [a] -gt Bool
esGeodesica g c =
esCamino g c ampamp
longitudCamino c == fromJust (distancia g u v)
where u = head c
v = last c
Nota 372 No hace falta imponer en la definicioacuten de la funcioacuten que el camino seaun recorrido pues el camino de miacutenima longitud entre dos veacutertices es siempre unrecorrido
376 Caminos cerrados
Definicioacuten 378 Un camino en un grafo G se dice cerrado si sus extremos son igualesDiremos que un camino cerrado de longitud tres es un triaacutengulo
La funcioacuten (esCerrado g c) se verifica si el camino c es cerrado en el grafo g
-- | Ejemplos
-- gtgtgt let g = creaGrafo [14] [(12)(13)(23)(34)]
-- gtgtgt esCerrado g [1231]
-- True
-- gtgtgt esCerrado g [123]
-- False
-- gtgtgt esCerrado g [1241]
-- False
esCerrado (Ord a) =gt Grafo a -gt [a] -gt Bool
esCerrado _ [] = False
esCerrado g (vc) =
esCamino g c ampamp v == last c
La funcioacuten (triangulos g v) devuelve la lista de todos los triaacutengulos que pasanpor el veacutertice v en el grafo g
-- | Ejemplos
-- gtgtgt triangulos (completo 4) 3
37 Caminos en grafos 95
-- [[3123][3143][3213][3243][3413][3423]]
-- gtgtgt triangulos (grafoCiclo 6) 1
-- []
triangulos Ord a =gt Grafo a -gt a -gt [[a]]
triangulos g u = todosCaminos g u u 3
377 Circuitos
Definicioacuten 379 Un recorrido en un grafo G se dice circuito si sus extremos son iguales
La funcioacuten (esCircuito g c) se verifica si la sucesioacuten de veacutertices c es un circuitoen el grafo g
-- | Ejemplos
-- gtgtgt grafoCiclo 4
-- G [1234] [(12)(14)(23)(34)]
-- gtgtgt esCircuito (grafoCiclo 4) [12341]
-- True
-- gtgtgt esCircuito (grafoCiclo 4) [1234]
-- False
-- gtgtgt esCircuito (grafoCiclo 4) [1234141]
-- False
esCircuito (Ord a) =gt Grafo a -gt [a] -gt Bool
esCircuito g c =
esRecorrido g c ampamp esCerrado g c
378 Ciclos
Definicioacuten 3710 Un camino simple en un grafo G se dice que es un ciclo si sus extremosson iguales
La funcioacuten (esCiclo g c) se verifica si el camino c es un ciclo en el grafo g
-- | Ejemplos
-- gtgtgt esCiclo (grafoCiclo 4) [121]
-- False
-- gtgtgt esCiclo (grafoCiclo 4) [12341]
-- True
-- gtgtgt esCiclo (grafoCiclo 4) [1234]
-- False
-- gtgtgt esCiclo (grafoCiclo 4) [1234141]
-- False
esCiclo (Ord a) =gt Grafo a -gt [a] -gt Bool
esCiclo g c =
esCaminoSimple g c ampamp esCerrado g c
96 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (todosCiclos g v) devuelve todos los ciclos en el grafo g que pasan porel veacutertice v
-- | Ejemplos
-- gtgtgt todosCiclos (grafoCiclo 4) 3
-- [[34123][32143]]
-- gtgtgt todosCiclos (completo 3) 2
-- [[2312][2132]]
-- gtgtgt todosCiclos (creaGrafo [123] [(11)(12)(13)(23)]) 1
-- [[1][1321][1231]]
-- gtgtgt todosCiclos (creaGrafo [12] [(12)(22)(23)]) 2
-- [[2]]
todosCiclos Ord a =gt Grafo a -gt a -gt [[a]]
todosCiclos g x =
map f (filter p (concat [todosArcosBA g x u | u lt- a x]))
where p c = longitudCamino c = 1
f c | longitudCamino c == 0 = c
| otherwise = c ++ [x]
a = adyacentes g
Nota 373 El algoritmo utilizado en la definicioacuten de (todosCiclos g) es el de buacutes-queda en anchura Este algoritmo recorre el grafo por niveles de forma que el pri-mer camino de la lista es de longitud miacutenima
379 Grafos aciacuteclicos
Definicioacuten 3711 Diremos que un grafo G = (V A) es aciacuteclico si no contiene ninguacutenciclo es decir si forallv isin V no existe ninguacuten camino simple que comience y termine en v
La funcioacuten (esAciclico g) se verifica si el grafo g es aciacuteclico
-- | Ejemplo
-- gtgtgt esAciclico (creaGrafo [14] [(12)(24)])
-- True
-- gtgtgt esAciclico (grafoCiclo 5)
-- False
-- gtgtgt esAciclico (grafoEstrella 6)
-- True
esAciclico Ord a =gt Grafo a -gt Bool
esAciclico g =
and [null (todosCiclos g x) | x lt- vertices g]
38 Conectividad de los grafos 97
38 Conectividad de los grafos
381 Estar conectados por un camino
Teorema 381 Dado un grafo G la relacioacuten u sim v (estar conectados por un camino) es unarelacioacuten de equivalencia
La funcioacuten (estarConectadosCamino g) devuelve la relacioacuten entre los veacutertices delgrafo g de estar conectados por un camino en eacutel
-- | Ejemplo
-- gtgtgt estarConectadosCamino (creaGrafo [14] [(12)(24)])
-- [(11)(12)(14)(21)(22)(24)(33)(41)(42)(44)]
estarConectadosCamino Ord a =gt Grafo a -gt [(aa)]
estarConectadosCamino g =
[(uv) | u lt- vs v lt- vs estanConectados g u v]
where vs = vertices g
A continuacioacuten comprobaremos el resultado con QuickCheck
ghcigt quickCheck prop_conectadosRelEqui
+++ OK passed 100 tests
prop_conectadosRelEqui Grafo Int -gt Bool
prop_conectadosRelEqui g =
esRelacionEquivalencia (vertices g) (estarConectadosCamino g)
382 Componentes conexas de un grafo
Definicioacuten 382 Las clases de equivalencia obtenidas por la relacioacuten sim estar conectadospor un camino en un grafo G inducen subgrafos en G los veacutertices y todas las aristas de loscaminos que los conectan que reciben el nombre de componentes conexas por caminosde G
La funcioacuten (componentesConexas1 g) devuelve las componentes conexas por cami-nos del grafo g
-- | Ejemplos
-- gtgtgt componentesConexas (creaGrafo [15] [(12)(23)])
-- [[123][4][5]]
-- gtgtgt componentesConexas (creaGrafo [15] [(12)(23)(45)])
-- [[123][45]]
-- gtgtgt componentesConexas (creaGrafo [13] [(12)(23)])
-- [[123]]
componentesConexas1 Ord a =gt Grafo a -gt [[a]]
componentesConexas1 g =
clasesEquivalencia (vertices g) (estarConectadosCamino g)
98 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Vamos a definir dos nuevas funciones una que compruebe si el grafo es nulo o com-pleto pues en dichos casos las componentes seraacuten el conjunto vaciacuteo y el conjuntodel conjunto de veacutertices respectivamente y otra con un algoritmo algo maacutes comple-jo
componentesConexas2 Ord a =gt Grafo a -gt [[a]]
componentesConexas2 g
| esGrafoNulo g = []
| esCompleto g = [vertices g]
| otherwise =
clasesEquivalencia (vertices g) (estarConectadosCamino g)
componentesConexas3 Ord a =gt Grafo a -gt [[a]]
componentesConexas3 g = aux (vertices g) [] []
where aux [] [] [] = []
aux [] xs ys = [xs]
aux (vvs) [] [] =
aux (vs (a v)) (i v (a v)) (a v)
aux vs xs ys | null ((ug [a v | v lt- ys]) xs) =
xs aux vs [] []
| otherwise =
aux (vs ug [a v | v lt- ys])
(u xs (ug [a v | v lt- ys]))
(ug [a v | v lt- ys] ys)
a = adyacentes g
i = inserta
ug = unionGeneral
u = unionConjuntos
La comprobacioacuten con QuickCheck de la equivalencia de las definiciones es
ghcigt quickCheck prop_EquiComponentesConexas
+++ OK passed 100 tests
ghcigt quickCheck prop_EquiComponentesConexas2
+++ OK passed 100 tests
prop_EquiComponentesConexas Grafo Int -gt Bool
prop_EquiComponentesConexas g =
componentesConexas1 g == componentesConexas2 g
prop_EquiComponentesConexas2 Grafo Int -gt Bool
prop_EquiComponentesConexas2 g =
componentesConexas1 g == componentesConexas3 g
Comparemos ahora la eficiencia de las definiciones
ghcigt componentesConexas1 grafoNulo
[]
(003 secs 0 bytes)
38 Conectividad de los grafos 99
ghcigt componentesConexas2 grafoNulo
[]
(001 secs 0 bytes)
ghcigt componentesConexas3 grafoNulo
[]
(001 secs 0 bytes)
ghcigt length (componentesConexas1 (completo 50))
1
(023 secs 0 bytes)
ghcigt length (componentesConexas2 (completo 50))
1
(016 secs 0 bytes)
ghcigt length (componentesConexas3 (completo 50))
1
(008 secs 0 bytes)
ghcigt length (componentesConexas1 (completo 100))
1
(217 secs 205079912 bytes)
ghcigt length (componentesConexas2 (completo 100))
1
(285 secs 0 bytes)
ghcigt length (componentesConexas3 (completo 100))
1
(119 secs 0 bytes)
ghcigt length (componentesConexas1 (completo 150))
1
(1295 secs 742916792 bytes)
ghcigt length (componentesConexas2 (completo 150))
1
(2048 secs 0 bytes)
ghcigt length (componentesConexas3 (completo 150))
1
(964 secs 0 bytes)
Con grafos completos de gran tamantildeo Haskell tarda maacutes tiempo en comprobar quees completo que en calcular directamente sus clases de equivalencia y para grafosnulos apenas hay diferencia en el coste entre la primera y la segunda definicioacuten Porotra parte la tercera definicioacuten es la maacutes eficiente en todos los casos y seraacute por tantola que utilizaremos a lo largo del trabajo
componentesConexas Ord a =gt Grafo a -gt [[a]]
componentesConexas = componentesConexas3
La funcioacuten (numeroComponentes g) devuelve el nuacutemero de componentes conexasdel grafo g
-- Ejemplos
-- gtgtgt numeroComponentes (creaGrafo [15] [(12)(23)(45)])
100 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- 2
-- gtgtgt numeroComponentes (creaGrafo [14] [(12)(22)(34)])
-- 2
numeroComponentes Ord a =gt Grafo a -gt Int
numeroComponentes g
| null (aristas g) = orden g
| otherwise = length (componentesConexas g)
Nota 381 Hemos comprobado para la definicioacuten anterior que comprobar si un gra-fo es completo es muy costoso luego no conviene antildeadirlo como patroacuten
383 Grafos conexos
Definicioacuten 383 Dado un grafo diremos que es conexo si la relacioacuten tiene una uacutenica clasede equivalencia en eacutel es decir si el grafo tiene una uacutenica componente conexa
La funcioacuten (esConexo g) se verifica si el grafo g es conexo
-- Ejemplos
-- gtgtgt esConexo (creaGrafo [13] [(12)(23)])
-- True
-- gtgtgt esConexo (creaGrafo [15] [(12)(23)(45)])
-- False
esConexo Ord a =gt Grafo a -gt Bool
esConexo g = length (componentesConexas g) == 1
esConexo2 Ord a =gt Grafo a -gt Bool
esConexo2 g
| esGrafoNulo g = False
| esUnitario (vertices g) = True
| otherwise = aux (vertices g) [] []
where aux [] [] [] = False
aux [] xs _ = True
aux (vvs) [] [] | null vs = True
| null (a v) = False
| otherwise =
aux (vs a v) (i v (a v)) (a v)
aux vs xs ys | null ((ug [a v | v lt- xs]) xs) = False
| otherwise =
aux (vs (ug [a v | v lt- xs]))
(u (ug [a v | v lt- xs]) xs)
((ug [a v | v lt- xs]) xs)
a = adyacentes g
ug = unionGeneral
i = inserta
u = unionConjuntos
38 Conectividad de los grafos 101
La comprobacioacuten de la equivalencia de las definiciones con QuickCheck es
ghcigt quickCheck prop_EquiEsConexo
+++ OK passed 100 tests
prop_EquiEsConexo Grafo Int -gt Bool
prop_EquiEsConexo g =
esConexo g == esConexo2 g
Vamos a comparar ahora su eficiencia
ghcigt let g1 = grafoCiclo 100
(000 secs 0 bytes)
ghcigt let g = creaGrafo (vertices g1) (aristas g1 [(23)(9899)])
(000 secs 0 bytes)
ghcigt esConexo g
False
(117 secs 151632168 bytes)
ghcigt esConexo2 g
False
(001 secs 0 bytes)
ghcigt esConexo (grafoCiclo 500)
True
(7341 secs 10448270712 bytes)
ghcigt esConexo2 (grafoCiclo 500)
True
(18939 secs 18468849096 bytes)
ghcigt esConexo (grafoCiclo 500)
True
(7341 secs 10448270712 bytes)
ghcigt esConexo2 (grafoCiclo 500)
True
(18939 secs 18468849096 bytes)
En principio no nos proporciona ninguna ventaja la segunda definicioacuten asiacute que tra-bajaremos con la primera que hemos dado ya que es mucho maacutes sencilla
Teorema 384 Sea G un grafo G = (V A) es conexo si y solamente si forallu v isin V existe uncamino entre u y v
Vamos a comprobar el resultado con QuickCheck
ghcigt quickCheck prop_caracterizaGrafoConexo
+++ OK passed 100 tests
prop_caracterizaGrafoConexo Grafo Int -gt Property
prop_caracterizaGrafoConexo g =
not (esGrafoNulo g) ==gt
esConexo g == and [estanConectados g u v
| u lt- vertices g v lt- vertices g]
102 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
384 Excentricidad
Definicioacuten 385 Sean G = (V A) un grafo y v isin V Se define la excentricidad de v comoel maacuteximo de las distancias entre v y el resto de veacutertices de G La denotaremos por e(v)
La funcioacuten (excentricidad g v) devuelve la excentricidad del veacutertice v en el grafog
-- | Ejemplos
-- gtgtgt let g = creaGrafo [13] [(12)(23)(33)]
-- gtgtgt excentricidad g 1
-- Just 2
-- gtgtgt excentricidad g 2
-- Just 1
-- gtgtgt excentricidad (creaGrafo [13] [(12)(33)]) 1
-- Nothing
excentricidad Ord a =gt Grafo a -gt a -gt Maybe Int
excentricidad g u
| esGrafoNulo g = Nothing
| orden g == 1 = Just 0
| Nothing `elem` distancias = Nothing
| otherwise = maximum distancias
where distancias = [distancia g u v | v lt- vertices g [u]]
La funcioacuten (excentricidades g) devuelve la lista ordenada de las excentricidadesde los veacutertices del grafo g
-- | Ejemplos
-- gtgtgt excentricidades (creaGrafo [13] [(12)(23)(33)])
-- [Just 1Just 2Just 2]
-- gtgtgt excentricidades (creaGrafo [13] [(12)(33)])
-- [NothingNothingNothing]
excentricidades Ord a =gt Grafo a -gt [Maybe Int]
excentricidades g = sort (map (excentricidad g) (vertices g))
385 Diaacutemetro
Definicioacuten 386 Sea G = (V A) un grafo Se define el diaacutemetro de G como el maacuteximo delas distancias entre los veacutertices en V Lo denotaremos por d(G)
La funcioacuten (diametro g) devuelve el diaacutemetro del grafo g
-- | Ejemplos
-- gtgtgt diametro (creaGrafo [13] [(12)(23)(33)])
-- Just 2
-- gtgtgt diametro (creaGrafo [13] [(12)(33)])
-- Nothing
diametro Ord a =gt Grafo a -gt Maybe Int
38 Conectividad de los grafos 103
diametro g
| esGrafoNulo g = Nothing
| Nothing `elem` distancias = Nothing
| otherwise = maximum distancias
where vs = vertices g
distancias = [distancia g u v | u lt- vs v lt- vs u lt= v]
386 Radio
Definicioacuten 387 Sean G = (V A) un grafo y v isin V Se define el radio de G como elmiacutenimo de las excentricidades de sus veacutertices Lo denotaremos por r(G)
La funcioacuten (radio g) devuelve el radio del grafo g
-- | Ejemplos
-- gtgtgt radio (creaGrafo [13] [(12)(23)(33)])
-- Just 1
-- gtgtgt radio (creaGrafo [13] [(12)(33)])
-- Nothing
radio Ord a =gt Grafo a -gt Maybe Int
radio g
| esGrafoNulo g = Nothing
| Nothing `elem` ds = Nothing
| otherwise = minimum ds
where ds = [excentricidad g v | v lt- vertices g]
387 Centro
Definicioacuten 388 Sean G = (V A) un grafo Llamamos centro del grafo G al conjunto deveacutertices de excentricidad miacutenima A estos veacutertices se les denomina veacutertices centrales
La funcioacuten (centro g) devuelve el centro del grafo g Por ejemplo
-- | Ejemplos
-- gtgtgt centro (creaGrafo [13] [(12)(23)(33)])
-- [2]
-- gtgtgt centro (creaGrafo [13] [(12)(13)(23)])
-- [123]
-- gtgtgt centro (creaGrafo [13] [(12)(33)])
-- [123]
centro Ord a =gt Grafo a -gt [a]
centro g = [v | v lt- vertices g excentricidad g v == r]
where r = radio g
104 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
388 Grosor
Definicioacuten 389 Sean G = (V A) un grafo Se llama grosor o cintura del grafo G almiacutenimo de las longitudes de los ciclos de G Si el grafo no posee ciclos (es decir es un grafoaciacuteclico) se dice que su cintura es infinita
La funcioacuten (grosor g) devuelve el grosor del grafo g
-- | Ejemplos
-- gtgtgt grosor (creaGrafo [123] [(12)(23)])
-- Nothing
-- gtgtgt grosor (creaGrafo [123] [(11)(12)(23)(34)])
-- Just 0
-- gtgtgt grosor grafoPetersen
-- Just 5
-- gtgtgt grosor grafoMoebiusCantor
-- Just 6
-- gtgtgt grosor grafoHeawood
-- Just 6
-- gtgtgt grosor grafoMcGee
-- Just 7
-- gtgtgt grosor grafoTutteCoxeter
-- Just 8
grosor Ord a =gt Grafo a -gt Maybe Int
grosor g
| esAciclico g = Nothing
| otherwise = Just (minimum [longitudCamino (head yss)
| x lt- vertices g
let yss = todosCiclos g x
not (null yss)])
Propiedades del grosor de los grafos
Teorema 3810 El grosor del grafo ciclo de orden n Cn es infin si n lt 3 y 3 en caso contrario
La propiedad se expresa por
prop_grosor_grafoCiclo Int -gt Bool
prop_grosor_grafoCiclo n =
grosor (grafoCiclo n) == if n lt 3
then Nothing
else Just n
Su comprobacioacuten para n le 30 es
ghcigt all prop_grosor_grafoCiclo [130]
True
Teorema 3811 El grosor del grafo amistad de orden n es 3 para todo n
38 Conectividad de los grafos 105
prop_grosor_grafoAmistad Int -gt Bool
prop_grosor_grafoAmistad n =
grosor (grafoAmistad n) == Just 3
Su comprobacioacuten para n le 30 es
ghcigt all prop_grosor_grafoAmistad [130]
True
Teorema 3812 El grosor del grafo completo de orden n Kn es infin si n lt 3 y 3 en casocontrario
La propiedad se expresa por
prop_grosor_completo Int -gt Bool
prop_grosor_completo n =
grosor (completo n) == if n lt 3
then Nothing
else Just 3
Su comprobacioacuten para n le 30 es
ghcigt all prop_grosor_completo [130]
True
Teorema 3813 El grosor del grafo bipartito completo de orden Kmn es infin si m = 1 oacuten = 1 y es 4 en caso contrario y 3 en caso contrario
La propiedad se expresa por
prop_grosor_bipartitoCompleto Int -gt Int -gt Bool
prop_grosor_bipartitoCompleto m n =
grosor (bipartitoCompleto m n) == if m == 1 || n == 1
then Nothing
else Just 4
Su comprobacioacuten para 1 le m le n le 15 es
ghcigt and [prop_grosor_bipartitoCompleto m n | m lt- [115] n lt- [m15]]
True
Teorema 3814 El grosor del grafo rueda de orden n Wn es infin si n lt 3 y 3 en caso contrario
La propiedad se expresa por
prop_grosor_grafoRueda Int -gt Bool
prop_grosor_grafoRueda n =
grosor (grafoRueda n) == if n lt 3
then Nothing
else Just 3
106 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Su comprobacioacuten para 1 le n le 30 es
ghcigt all prop_grosor_grafoRueda [130]
True
389 Propiedades e invariantes por isomorfismos
Teorema 3815 Sean G = (V A) y Gprime = (Vprime Aprime) grafos isomorfos con φ V rarr Vprime unisomorfismo Entonces dados u v isin V u sim v si y solamente si φ(u) sim φ(v)
La comprobacioacuten del teorema con QuickCheck es
ghcigt quickCheck prop_ConexionIsomorfismo1
+++ OK passed 100 tests
prop_ConexionIsomorfismo1 Grafo Int -gt Grafo Int -gt Bool
prop_ConexionIsomorfismo1 g h =
not (isomorfos g h) ||
and [ec g u v == ec h (imagen phi u) (imagen phi v)
| u lt- vs
v lt- vs
phi lt- isomorfismos g h]
where vs = vertices g
ec = estanConectados
Teorema 3816 Sean G = (V A) y Gprime = (Vprime Aprime) grafos isomorfos con φ V rarr Vprime unisomorfismo Entonces φ lleva cada componente conexa de G en una componente conexa deGprime
La comprobacioacuten del teorema con QuickCheck es
ghcigt quickCheck prop_ConexionIsomorfismo2
+++ OK passed 100 tests
prop_ConexionIsomorfismo2 Grafo Int -gt Grafo Int -gt Bool
prop_ConexionIsomorfismo2 g h =
not(isomorfos g h) ||
and [conjuntosIguales cch (aux f) | f lt- isomorfismos g h]
where cch = componentesConexas h
ccg = componentesConexas g
aux f = map (sort imagenConjunto f) ccg
Teorema 3817 Sean G = (V A) y Gprime = (Vprime Aprime) grafos isomorfos con φ V rarr Vprime unisomorfismo Entonces G y Gprime tienen el mismo nuacutemero de componentes conexas
La comprobacioacuten del teorema con QuickCheck es
38 Conectividad de los grafos 107
ghcigt quickCheck prop_ConexionIsomorfismo3
+++ OK passed 100 tests
prop_ConexionIsomorfismo3 Grafo Int -gt Grafo Int -gt Bool
prop_ConexionIsomorfismo3 g h =
not (isomorfos g h) ||
numeroComponentes g == numeroComponentes h
Teorema 3818 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que el diaacutemetro de G es igual al diaacutemetro de Gprime es decir el diaacutemetrode un grafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos diametro)
+++ OK passed 100 tests
Teorema 3819 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces se verifica que el radio de G es igual al radio de Gprime es decir el radio de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos radio)
+++ OK passed 100 tests
Teorema 3820 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que el grosor de G es igual al grosor de Gprime es decir el grosor de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos grosor)
+++ OK passed 100 tests
Teorema 3821 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que el centro de G es igual al centro de Gprime es decir el centro de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos centro)
+++ OK passed 100 tests
Teorema 3822 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces se verifica que el nuacutemero de componentes conexas de G es igual al nuacutemerode las de Gprime es decir el nuacutemero de componentes conexas de un grafo es un invariante porisomorfismos
108 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos numeroComponentes)
+++ OK passed 100 tests
Teorema 3823 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que los valores que toman las excentricidades de los veacutertices G esigual al de los veacutertices de Gprime es decir el conjunto de valores que toman las excentricidadesde los veacutertices es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos excentricidades)
+++ OK passed 100 tests
Capiacutetulo 4
Matrices asociadas a grafos
En este capiacutetulo se definiraacuten algunas representaciones de grafos como matrices secomprobaraacuten sus propiedades y volveremos a definir algunos conceptos del capiacutetu-lo 3 ahora utilizando matricesPara elaborar el contenido del capiacutetulo utilizareacute el segundo tema del trabajo fin degrado de Fco Javier Franco Galviacuten Aspectos algebraicos en teoriacutea de grafos ([7]) En eltrabajo el autor introduce los conceptos de matriz de adyacencia matriz de incidenciay otras matrices asociadas a grafos
41 Generador de grafos simples
En esta seccioacuten presentaremos el generador de grafos que nos permitiraacute generargrafos simples como listas de aristas arbitrariamente y usarlos como ejemplos opara comprobar propiedades en la seccioacuten de matrices asociadas a grafos(grafoSimple) es un generador de grafos simples de hasta 10 veacutertices Por ejemplo
ghcigt sample grafoSimple
G [12345678] [(14)(15)(16)(17)(18)(23)
(24)(25)(27)(35)(37)(45)(46)(56)(67)]
G [123456789] [(14)(18)(23)(25)(29)
(34)(35)(36)(38)(39)(46)(48)(49)
(58)(59)(69)(78)]
G [123456] [(12)(13)(24)(25)(26)(35)(56)]
G [1234567] [(12)(13)(14)(24)(25)(26)
(36)(45)(46)(67)]
G [1234] [(13)(14)(23)(34)]
G [123] [(23)]
G [12] [(12)]
G [123456] [(16)(24)(26)(35)(36)(56)]
G [123456789] [(12)(14)(15)(16)(17)(24)
(34)(37)(38)(39)(45)(47)(49)(56)(57)
(58)(59)(67)(69)(78)(79)]
109
110 Capiacutetulo 4 Matrices asociadas a grafos
G [123456789] [(13)(14)(15)(16)(23)(24)
(29)(35)(39)(45)(47)(48)(49)(57)(58)
(59)(67)(68)(69)(79)]
G [1] []
grafoSimple Gen (Grafo Int)
grafoSimple = do
n lt- choose (010)
as lt- sublistOf [(xy) | x lt- [1n] y lt- [x+1n]]
return (creaGrafo [1n] as)
42 Matrices de adyacencia
421 Definicioacuten y propiedades
Usaremos la funcioacuten (imprimeMatriz p) para imprimir por pantalla la matriz p conuna fila por liacutenea
-- | Ejemplo
-- gtgtgt imprimeMatriz (fromLists [[134][357][479]])
-- [134]
-- [357]
-- [479]
imprimeMatriz Show a =gt Matrix a -gt IO ()
imprimeMatriz p =
mapM_ print (toLists p)
Definicioacuten 421 Sea G = (V A) un grafo simple con V = v1 vn Se define sumatriz de adyacencia como Antimesn = (aij) donde el elemento aij toma el valor 1 si existealguna arista en A uniendo los veacutertices vi y vj y 0 en caso contrario
Nota 421 La matriz de adyacencia depende del etiquetado del grafo
La funcioacuten (matrizAdyacencia g) es la matriz de adyacencia del grafo g
-- | Ejemplo
-- gtgtgt imprimeMatriz (matrizAdyacencia (grafoCiclo 4))
-- [0101]
-- [1010]
-- [0101]
-- [1010]
-- gtgtgt imprimeMatriz (matrizAdyacencia (completo 4))
-- [0111]
-- [1011]
-- [1101]
-- [1110]
42 Matrices de adyacencia 111
matrizAdyacencia Grafo Int -gt Matrix Int
matrizAdyacencia g = matrix n n f
where n = orden g
f (ij) | (ij) `aristaEn` g = 1
| otherwise = 0
422 Propiedades baacutesicas de las matrices
La funcioacuten (esSimetrica p) se verifica si la matriz p es simeacutetrica
-- ejemplo
-- gtgtgt esSimetrica (fromLists [[134][357][479]])
-- True
-- gtgtgt esSimetrica (fromLists [[134][357][497]])
-- False
esSimetrica Eq a =gt Matrix a -gt Bool
esSimetrica p =
transpose p == p
La funcioacuten (potencia p n) devuelvela potencia nndasheacutesima de la matriz cuadrada p
-- Ejemplo
-- gtgtgt potencia (fromLists [[134][357][479]]) 3
-- ( 408 735 975 )
-- ( 735 1323 1755 )
-- ( 975 1755 2328 )
potencia Num a =gt Matrix a -gt Int -gt Matrix a
potencia p 1 = p
potencia p n = if (odd n)
then (m p (potencia (m p p) (div (n-1) 2)))
else (potencia (m p p) (div (n-1) 2))
where m = multStd2
423 Propiedades de las matrices de adyacencia
Teorema 422 Para todo n la matriz de adyacencia del grafo ciclo de orden n Cn es simeacute-trica
ghcigt all prop_simetricaAdyacenciaCompleto [130]
True
prop_simetricaAdyacenciaCompleto Int -gt Bool
prop_simetricaAdyacenciaCompleto n =
esSimetrica (matrizAdyacencia (completo n))
La funcioacuten (tamantildeoM g) devuelve el tamantildeo del grafo simple g calculado usandosu matriz de adyacencia
112 Capiacutetulo 4 Matrices asociadas a grafos
-- | Ejemplos
-- gtgtgt tamantildeoM (grafoCiclo 4)
-- 4
-- gtgtgt tamantildeoM grafoPetersen
-- 15
tamantildeoM Grafo Int -gt Int
tamantildeoM g = sum (toList (matrizAdyacencia g)) `div` 2
Teorema 423 El tamantildeo de un grafo simple es la mitad de la suma de los elementos de sumatriz de adyacencia
La comprobacioacuten del teorema con QuickCheck es
ghcigt quickCheck prop_tamantildeoMatriz
+++ OK passed 100 tests
prop_tamantildeoMatriz Property
prop_tamantildeoMatriz =
forAll grafoSimple
(g -gt tamantildeo g == tamantildeoM g)
Teorema 424 Si un grafo G = (V A) tiene un veacutertice aislado vi tanto la fila como lacolumna indasheacutesima de su matriz de adyacencia estaraacuten formadas por ceros
esAisladoM Grafo Int -gt Int -gt Bool
esAisladoM g v = if (all (==0)
(((toLists (ma g)) (v-1))
++((toLists (t (ma g))) (v-1))))
then True
else False
where ma = matrizAdyacencia
t = transpose
La comprobacioacuten del teorema es
ghcigt quickCheck prop_esAisladoMatriz
+++ OK passed 100 tests
prop_esAisladoMatriz Property
prop_esAisladoMatriz =
forAll grafoSimple
(g -gt and [esAislado g v == esAisladoM g v
| v lt- vertices g])
Teorema 425 Sea un grafo G = (V A) simple no dirigido con V = v1 vn Lasuma de los elementos de la fila (o columna) indasheacutesima de su matriz de adyacencia coincide conel grado del veacutertice vi Es decir
42 Matrices de adyacencia 113
δ(vi) =n
sumj=1
aij =n
sumj=1
aji
gradoM Grafo Int -gt Int -gt Int
gradoM g v = sum ((toLists (ma g)) (v-1))
where ma = matrizAdyacencia
La comprobacioacuten del teorema es
ghcigt quickCheck prop_gradoMatriz
+++ OK passed 100 tests
prop_gradoMatriz Property
prop_gradoMatriz =
forAll grafoSimple
(g -gt and [grado g v == gradoM g v | v lt- vertices g])
Teorema 426 Sea G = (V A) un grafo bipartito de conjuntos de veacutertices disjuntosV1 = v1 vk y V2 = vk+1 vn tal que V = V1 cup V2 y soacutelo existen aristasque conectan veacutertices de V1 con veacutertices de V2 Entonces con este etiquetado de V la matrizde adyacencia de G tiene la forma
A =
(θ BBt θ
)
prop_BipartitoMatriz Grafo Int -gt Property
prop_BipartitoMatriz g =
esBipartito g ==gt
all (==0) [ getElem u v m | [uv] lt- (f (fromJust p))]
where f (xsys) = filter p (subsequences xs ++ subsequences ys)
where p zs = length zs == 2
p = conjuntosVerticesDisjuntos g
m = matrizAdyacencia g
424 Caminos y arcos
En esta seccioacuten se presentaraacute la informacioacuten que contiene la matriz de adyacenciade un grafo en relacioacuten a los caminos que se encuentran en eacutel
Teorema 427 Sea G = (V A) un grafo con V = v1 vn y matriz de adyacenciaA = (aij) Entonces forallk ge 0 el elemento (i j) de Ak que denotaremos por ak
ij es elnuacutemero de caminos de longitud k desde el veacutertice vi al veacutertice vj
114 Capiacutetulo 4 Matrices asociadas a grafos
numeroCaminosDeLongitudM Grafo Int -gt Int -gt Int -gt Int -gt Int
numeroCaminosDeLongitudM g u v k = getElem u v mk
where ma = matrizAdyacencia g
n = orden g
mk = foldr (multStd2) (identity n) (take k (repeat ma))
La comprobacioacuten del teorema para k le 6 es
ghcigt quickCheck prop_numeroCaminosMatriz
+++ OK passed 100 tests
prop_numeroCaminosMatriz Grafo Int -gt Gen Bool
prop_numeroCaminosMatriz g = do
k lt- choose (06)
let vs = vertices g
return (and [ numeroCaminosDeLongitud g u v k ==
numeroCaminosDeLongitudM g u v k
|(uv) lt- productoCartesiano vs vs u lt v])
De este teorema se deducen las siguientes propiedades
Teorema 428 Sea G un grafo simple Siguiendo la notacioacuten del teorema anterior se tieneque1 a(2)ii = δ(vi)
2 a(3)ii es el nuacutemero de triaacutengulos que contienen al veacutertice vi
gradoCaminosM Grafo Int -gt Int -gt Int
gradoCaminosM g v = getElem v v m2
where m = matrizAdyacencia g
m2 = multStd2 m m
numeroTriangulosM Grafo Int -gt Int -gt Int
numeroTriangulosM g v = getElem v v (potencia m 3)
where m = matrizAdyacencia g
La comprobacioacuten con QuickCheck es
ghcigt quickCheck prop_GradoCaminosMatriz
+++ OK passed 100 tests
ghcigt quickCheck prop_TriangulosMatriz
+++ OK passed 100 tests
prop_GradoCaminosMatriz Grafo Int -gt Bool
prop_GradoCaminosMatriz g =
and [ grado g v == gradoCaminosM g v | v lt- vertices g]
42 Matrices de adyacencia 115
prop_TriangulosMatriz Property
prop_TriangulosMatriz =
forAll grafoSimple
(g -gt and [length (triangulos g v) ==
numeroTriangulosM g v | v lt- vertices g])
116 Capiacutetulo 4 Matrices asociadas a grafos
Capiacutetulo 5
Apeacutendices
51 Sistemas utilizados
El desarrollo de mi Trabajo de Fin de Grado requeriacutea de una infraestructura teacutecnicaque he tenido que trabajar antes de comenzar a desarrollar el contenido A conti-nuacioacuten voy a nombrar y comentar los sistemas y paquetes que he utilizado a lolargo del proyectobull Ubuntu como sistema operativo El primer paso fue instalar Ubuntu en mi orde-
nador portaacutetil personal Para ello seguiacute las recomendaciones de mi compantildeeroEduardo Paluzo quien ya lo habiacutea hecho antesPrimero me descargueacute la imagen del sistema Ubuntu 1604 LTS (para procesadorde 64 bits) desde la paacutegina de descargas de Ubuntu 1 y tambieacuten la herramientaLinuxLive USB Creator 2 que transformariacutea mi pendrive en una unidad USB Boo-teable cargada con la imagen de Ubuntu Una vez tuve la unidad USB preparadaprocediacute a instalar el nuevo sistema apagueacute el dispositivo y al encenderlo entreacuteen el Boot Menu de la BIOS del portaacutetil para arrancar desde el Pendrive en vez dehacerlo desde el disco duro Automaacuteticamente comenzoacute la instalacioacuten de Ubuntuy solo tuve que seguir las instrucciones del asistente para montar Ubuntu mante-niendo ademaacutes Windows 10 que era el sistema operativo con el que habiacutea estadotrabajando hasta ese momentoEl resultado fue un poco agridulce pues la instalacioacuten de Ubuntu se habiacutea reali-zado con eacutexito sin embargo al intentar arrancar Windows desde la nueva GRUBme daba un error al cargar la imagen del sistema Despueacutes de buscar el error queme apareciacutea en varios foros encontreacute una solucioacuten a mi problema deshabiliteacute elSecurity Boot desde la BIOS y pude volver a arrancar Windows 10 con normali-dad
1httpwwwubuntucomdownloaddesktop2httpwwwlinuxliveusbcom
117
118 Capiacutetulo 5 Apeacutendices
bull LATEX como sistema de composicioacuten de textos La distribucioacuten de LATEXTex Livecomo la mayoriacutea de software que he utilizado la descargueacute utilizando el Gestorde Paquetes Synaptic Anteriormente soacutelo habiacutea utilizado TexMaker como editorde LATEX asiacute que fue el primero que descargueacute Maacutes tarde mi tutor Joseacute Antoniome sugirioacute que mejor descargara el paquete AUCTex pues me permitiriacutea trabajarcon archivos TEX desde el editor Emacs asiacute lo hice y es el que he utilizado pararedactar el trabajo Ademaacutes de los que me recomendaba el gestor solo he tenidoque descargarme el paquete spanish de babel para poder componer el trabajo puesel paquete Tikz que he utilizado para representar los grafos veniacutea incluido en lassugerencias de Synapticbull Haskell como lenguaje de programacioacuten Ya habiacutea trabajado anteriormente con
este lenguaje en el grado y sabiacutea que soacutelo teniacutea que descargarme la plataforma deHaskell y podriacutea trabajar con el editor Emacs Seguiacute las indicaciones que se dan alos estudiantes de primer curso en la paacutegina del Dpto de Ciencias de la Compu-tacioacuten e Inteligencia Artificial 3 y me descargueacute los paquetes haskell-platform yhaskell-mode desde el Gestor de Paquetes Synaptic La versioacuten de la plataforma deHaskell con la que he trabajado es la 2014200debian2 y la del compilador GHC la7103-7bull Dropbox como sistema de almacenamiento compartido Ya habiacutea trabajado con
Dropbox en el pasado asiacute que crear una carpeta compartida con mis tutores nofue ninguacuten problema sin embargo al estar Dropbox sujeto a software no libre nome resultoacute tan sencillo instalarlo en mi nuevo sistema En primer lugar intenteacutehacerlo directamente desde Ubuntu Software que intentoacute instalar Dropbox Nauti-lus y abrioacute dos instalaciones en paralelo Se quedoacute colgado el ordenador asiacute quemateacute los procesos de instalacioacuten activos reinicieacute el sistema y me descargueacute direc-tamente el paquete de instalacioacuten desde la paacutegina de descargas de Dropbox 4 y loejecuteacute desde la terminalbull Git como sistema remoto de control de versiones Era la primera vez que trabaja-
ba con Git y me costoacute bastante adaptarme Mi tutor Joseacute Antonio y mi compantildeeroEduardo Paluzo me ayudaron mucho e hicieron el proceso de adaptacioacuten muchomaacutes aacutegil El manual que Eduardo ha redactado y presenta en su Trabajo Fin deGrado me ha sido muy uacutetil es una pequentildea guiacutea que cualquier interesado en elempleo de Git puede utilizar como introduccioacuten La instalacioacuten no resultoacute com-plicada a traveacutes del Gestor de Paquetes Synaptic me descargueacute el paquete elpa-magity todos los demaacutes paquetes necesarios para trabajar con Git en mi portaacutetil usandoel editor Emacs Eduardo me ayudoacute a crear el repositorio MDenHaskell en la plata-forma GitHub y clonarlo en mi ordenador personal Dicho repositorio contiene el
3httpwwwcsuses~jalonsocursosi1m-15sistemasphp4httpswwwdropboxcomesinstallos=lnx
52 Mapa de decisiones de disentildeo en conjuntos 119
total del trabajo y se almacena de forma puacuteblica La versioacuten de Magit que utilizoes la 250-2
52 Mapa de decisiones de disentildeo en conjuntos
Una vez comenzado el trabajo y habiendo hecho ya varias secciones acerca de laTeoriacutea de Grafos se puso de manifiesto la conveniencia de crear nuevos capiacutetulosintroduciendo conceptos de la Teoriacutea de Conjuntos y las relaciones que se puedenpresentar entre sus elementosHaskell tiene una libreriacutea especiacutefica para conjuntos DataSet sin embargo no estan intuitiva ni tan eficiente como la de listas (DataList) A lo largo del proyecto hecreado un moacutedulo que permite trabajar con conjuntos utilizando tanto su represen-tacioacuten como listas ordenadas sin elementos repetidos como su representacioacuten comolistas sin elementos repetidos Dicho moacutedulo se llama Conjuntos y lo presento en elprimer capiacutetulo del Trabajo
53 Mapa de decisiones de disentildeo en grafos
Al comienzo del proyecto la idea era que las primeras representaciones con lasque trabajara fueran las de grafos como vectores de adyacencia y grafos como matricesde adyacencia que se utilizan en Informaacutetica en el primer curso del Grado con lasque ya habiacutea trabajado y estaba familiarizadaLas definiciones de Informaacutetica estaacuten pensadas para grafos ponderados (dirigidoso no seguacuten se eligiera) mientras que en Matemaacutetica Discreta apenas se usan grafosdirigidos o ponderados por tanto el primer cambio en la representacioacuten utilizadafue simplificar las definiciones de modo que solo trabajaacuteramos con grafos no diri-gidos y no ponderados pero manteniendo las estructuras vectorial y matricial quemanteniacutean la eficienciaLas representaciones que utilizan arrays en Haskell son muy restrictivas pues soloadmiten vectores y matrices que se puedan indexar lo que hace muy complicadostodos los algoritmos que impliquen alguacuten cambio en los veacutertices de los grafos yademaacutes no permite trabajar con todos los tipos de veacutertices que pudieacuteramos desearDecidimos volver a cambiar la representacioacuten y esta vez nos decantamos por larepresentacioacuten de grafos como listas de aristas perdiendo en eficiencia pero ganandomucho en flexibilidad de escrituraPor uacuteltimo mis tutores sugirieron dar una representacioacuten de los grafos mediantesus matrices de adyacencia y comprobar la equivalencia de las definiciones que yahabiacutea hecho en otros moacutedulos con las dadas para esta representacioacuten Para ello he
120 Capiacutetulo 5 Apeacutendices
trabajado con la libreriacutea DataMatrix de Haskell
Bibliografiacutea
[1] J Alonso Temas de programacioacuten funcional Technical report Univ de Sevilla2015
[2] P Burzyn Complejidad computacional en problemas de modificacioacuten de aris-tas en grafos Technical report Univ de Buenos Aires
[3] K Claessen and J Hughes QuickCheckA Lightweight Tool for Random Tes-ting of Haskell Programs Technical report Chalmers University of Technology2000
[4] M Caacuterdenas Matemaacutetica discreta Technical report Univ de Sevilla 2015
[5] D de Matemaacuteticas El regalo de Cantor Technical report IES Matarrantildea deValderrobres 2009
[6] D de Aacutelgebra Aacutelgebra Baacutesica tema 1 Conjuntos Technical report Univ deSevilla 2015
[7] F Franco Aspectos algebraicos en Teoriacutea de Grafos Technical report Univ deSevilla 2016
[8] F Rabhi and G Lapalme Algorithms A functional programming approachAddison-Wesley Longman Publishing Co Inc Boston MA USA 1st edition1999
[9] P Vasconcelos Property Testing using QuickCheck Technical report Univer-sidade do Porto 2016
[10] Wikipedia Set (mathematics) Technical report Wikipedia La Enciclopedialibre 2016
[11] Wikipedia AnexoGaleriacutea de grafos Technical report Wikipedia La Enciclo-pedia libre 2016
[12] Wikipedia Teoriacutea de la complejidad computacional Technical report Wikipe-dia La Enciclopedia libre 2017
121
Iacutendice alfabeacutetico
Grafo 18 52adyacentes 53antiImagenRelacion 38aristaEn 53aristasCamino 88aristas 53automorfismos 87bipartitoCompleto 58biyecciones 47cardinal 22 31centro 103clasesEquivalencia 43combinaciones 25 34complementario 22 31completo 58componentesConexas1 97componentesConexas2 98componentesConexas3 98conjuntosIguales 30conjuntosIguales 21conjuntosVerticesDisjuntos 59conservaAdyacencia 78creaGrafo 52diametro 102distancia 93dominio 38eliminaArista 74eliminaLazos 74eliminaVertice 74elimina 19 28entorno 69esAisladoM 112
esAislado 69esAntisimetrica 41esAutomorfismo 86esBipartito 60esCamino 87esCerrado 94esCircuito 95esCompleto 77esConexo 100esFuncional 39esFuncion 43esGeodesica 94esInyectiva 45esIsomorfismo 81esLazo 69esReflexiva 40esRegular 70esRelacionEquivalencia 42esRelacionHomogenea 39esRelacionOrden 43esRelacion 37esSimetrica 41 111esSimple 70esSobreyectiva 45 46esSubconjuntoPropio 21 30esSubconjunto 20 29esSubgrafoMax 72esSubgrafoPropio 72esSubgrafo 72esTransitiva 41esUnitario 23 32esVacio 18 27
122
Iacutendice alfabeacutetico 123
estaRelacionado 40estanConectados 93excentricidades 102excentricidad 102funciones 44generaGrafo 54gradoM 113 114grado 69grafoAmistad 57grafoCiclo 56grafoCirculante 61grafoComplementario 77grafoEstrella 60grafoHeawood 64grafoMcGee 64grafoMoebiusCantor 67grafoNulo 55grafoPetersenGen 62grafoPetersen 66grafoRueda 61grafoSimple 110grafoThomson 63grafoTutteCoxeter 65grosor 104imagenConjunto 45imagenInversa 47imagenRelacion 38imagen 44imprimeMatriz 110inserta 18 27interseccion 33interseccion 24inversa 47isomorfismos 82isomorfos 82longitudCamino 88matrizAdyacencia 110minimoElemento 19 28morfismos 79
numeroArcosDeLongitud 92numeroCaminosDeLongitud 89numeroCaminosDeLongitugM 113numeroComponentesConexas 99numeroTriangulosM 114orden 68parDeVertices 91pertenece 19 28potencia 111productoCartesiano 34productoCartesiano 25prop_HavelHakimi 73prop_LemaApretonDeManos 73prop_completos 76prop_BipartitoMatriz 113prop_ConectadosRelEqui 97prop_ConexionIsomorfismo1 106prop_ConexionIsomorfismo2 106prop_ConexionIsomorfismo3 107prop_GradoMatriz 114prop_TriangulosMatriz 114prop_esAisladoMatriz 112prop_gradoMatriz 113prop_numeroCaminosMatriz 114prop_simetricaAdyacenciaCompleto 111prop_tamantildeoMatriz 112prop_todosArcosBA 92radio 103rango 38secuenciaGrados 71secuenciaGrafica 71sinRepetidos 19 29sonIncidentes 68sumaArista 75sumaGrafos 76 77sumaVertice 75tamantildeoM 111tamantildeo 68todosArcosBA 91
124 Iacutendice alfabeacutetico
todosArcos 90todosCaminos 88todosCiclos 96triangulos 94unionConjuntos 23 32unionGeneral 24 33vacio 18 27valenciaMax 70valenciaMin 70variaciones 26 35verticesCamino 88vertices 53
10 Iacutendice general
Introduccioacuten
El objetivo del trabajo es la implementacioacuten de algoritmos de matemaacutetica discretaen Haskell Los puntos de partida son
los temas de la asignatura ldquoMatemaacutetica discretardquo ([4])los temas de la asignatura ldquoInformaacuteticardquo ([1])el capiacutetulo 7 del libro ldquoAlgorithms A functional programming approachrdquo ([8]) yel artiacuteculo ldquoGraph theoryrdquo ([11]) de la WikipediaHaskell es un lenguaje de programacioacuten funcional desarrollado en los uacuteltimos antildeos
por la comunidad de programadores con la intencioacuten de usarlo como instrumentopara la ensentildeanza de programacioacuten funcional La motivacioacuten de este desarrollo eshacer el anaacutelisis y disentildeo de programas maacutes simple y permitir que los algoritmos seanfaacutecilmente adaptables a otros lenguajes de programacioacuten funcionales
En comparacioacuten con otros lenguajes de programacioacuten imperativos la sintaxis deHaskell permite definir funciones de forma maacutes clara y compacta En Haskell las fun-ciones se consideran valores al mismo nivel que los tipos enteros o cadenas en cual-quier lenguaje Por ello al igual que es habitual que en todos los lenguajes una funcioacutenreciba datos de entrada (de tipo entero flotante cadena etc) y devuelva datos (de losmismos tipos) en los lenguajes funcionales una funcioacuten puede recibir como dato deentrada una funcioacuten y devolver otra funcioacuten como salida que puede ser construida apartir de sus entradas y por operaciones entre funciones como la composicioacuten Estacapacidad nos proporciona meacutetodos maacutes potentes para construir y combinar los di-versos moacutedulos de los que se compone un programa Por ejemplo emulando la formade operar sobre funciones que habitualmente se usa en matemaacuteticas
La matemaacutetica discreta consiste en el estudio de las propiedades de los conjuntosfinitos o infinitos numerables lo que hace posible su directa implementacioacuten compu-tacional En particular la asignatura ldquoMatemaacutetica Discretardquo del grado se centra enestudiar propiedades y algoritmos de la combinatoria y la teoriacutea de grafos A lo largodel trabajo se implementaraacuten en Haskell definiciones y algoritmos con los que ya seha tenido una primera aproximacioacuten teoacuterica durante el grado
Los dos primeros capiacutetulos del trabajo sientan la base que permitiraacute en los dos si-guientes una aproximacioacuten a la teoriacutea de grafos En el primero se hace una introduc-cioacuten a la teoriacutea de conjuntos y se dan dos posibles representaciones de conjuntos con
11
12 Iacutendice general
las que trabajar en Haskell En el segundo se presentan los conceptos de ldquorelacioacutenrdquo yde ldquofuncioacutenrdquo que al igual que los conjuntos son necesarios para definir aplicacionesde los grafos Su redaccioacuten sigue la liacutenea de la primera parte de la asignatura ldquoAacutelgebraBaacutesicardquo del grado
En el tercer capiacutetulo del trabajo se hace una introduccioacuten a la teoriacutea de grafos Enprimer lugar se dan una representacioacuten con la que trabajar en Haskell y un generadorde grafos que permitiraacute comprobar propiedades con QuickCheck Seguidamente sepresenta una galeriacutea de grafos conocidos que se utilizaraacuten como ejemplos para lasdefiniciones y los algoritmos de las secciones siguientes Las primeras seraacuten algunasdeficiones baacutesicas y despueacutes se trataraacuten los conceptos de ldquomorfismosrdquo ldquocaminosrdquo yldquoconectividadrdquo en grafos
Por uacuteltimo en el cuarto capiacutetulo se da una representacioacuten de los grafos a traveacutesde su matriz de adyacencia Se implementaraacuten algunos de los resultados que JavierFranco Galviacuten expuso en su Trabajo Fin de Grado Aspectos algebraicos en teoriacutea de grafosy se comprueba que concuerdan con el desarrollo hecho en el capiacutetulo anterior
Cabe destacar el trabajo con los diferentes sistemas y programas que se han utiliza-do a lo largo del proyecto
Ubuntu como sistema operativoel editor de textos Emacs que ha permitido el uso de Haskell literario para la redaccioacutendel trabajoel paquete de produccioacuten de graacuteficos vectoriales Tikz de LATEX mediante el que seha dado la representacioacuten graacutefica de los ejemplos de grafosGitHub como sistema remoto de control de versionesy DocTest como sistema de validacioacuten de moacutedulosSe va a hacer una breve introduccioacuten los sistemas maacutes destacados
Ubuntu
Ubuntu es un sistema operativo creado a partir de GNULinux con la intencioacuten dehacer una versioacuten de este maacutes sencilla de manejar y que permitiera acceso al soft-ware libre para todo el mundo por igual La primera distribuioacuten oficial de Ubuntufue la versioacuten 410 y tuvo lugar en 2004 Desde entonces el proyecto ha captadola atencioacuten de miles de entusiastas del software libre que han querido unirse a lacomunidad UbuntuSoftware libre significa que los usuarios tienen la libertad de ejecutar copiar distri-buir estudiar modificar y mejorar el software Es una cuestioacuten de libertad no deprecio Para entender el concepto debe pensarse en laquolibreraquo como en laquolibertad deexpresioacutenraquo
Iacutendice general 13
Maacutes precisamente software libre significa que los usuarios de un programa tienenlas cuatro libertades esencialesbull La libertad de ejecutar el programa como lo desee con cualquier propoacutesito (liber-
tad 0)bull La libertad de estudiar el funcionamiento del programa y adaptarlo a sus necesi-
dades (libertad 1) El acceso al coacutedigo fuente es un prerrequisito para estobull La libertad de redistribuir copias para ayudar a los demaacutes (libertad 2)bull La libertad de mejorar el programa y de publicar las mejoras de modo que toda la
comunidad se beneficie (libertad 3) El acceso al coacutedigo fuente es un prerrequisitopara esto
Debido a la evolucioacuten de la tecnologiacutea y del uso de la red estas libertades son ahoraauacuten maacutes importantes que en el pasadoLo que diferencia a Ubuntu de otros sistemas ofrecidos por Linux es que los equiposcomercial y comunitario colaboran juntos en el desarrollo de un uacutenico proyecto Lasnovedades y avances estaacuten libremente a disposicioacuten de todos los usuarios y sonvoluntarios quienes se hacen cargo de los elementos maacutes criacuteticos del trabajoEn la paacutegina web de Ubuntu 1 se puede obtener maacutes informacioacuten acerca del siste-ma y en la paacutegina web de GNU 2 se puede encontrar maacutes informacioacuten acerca delsoftware libre
Haskell literario con Emacs
Haskell es un lenguaje de programacioacuten puramente funcional basado en lambdacalculus 3 Se caracteriza por sus programas concisos un potente sistema de tiposel trabajo con listas funciones recursivas y de orden superior y por tener evaluacioacutenperezosaTener que escribir coacutedigos largos y complicados hace la tarea del programador muycostosa Los lenguajes de programacioacuten funcional como Haskell lo intentan hacenmaacutes sencillo Aunque no se esteacute en la posicioacuten de usar Haskell en un proyecto de-terminado aprender su razonamiento puede ayudar a mejorar en cualquier otrolenguajeA la hora de elaborar la memoria de un proyecto en el que se estaacute utilizando Haskellla posibilidad de escribir coacutedigo y texto en un formato de calidad otorga globali-dad al trabajo El editor Emacs de GNU permite en particular trabajar en paralelocon Haskell y con Latex El trabajar con Haskell literario ha ayudado a detectar ysolventar errores maacutes raacutepido asiacute como a dar una estructura consolidada al trabajo
1httpswwwubuntucom2httpswwwgnuorg3httpsenwikipediaorgwikiLambda_calculus
14 Iacutendice general
En la paacutegina web del Departamento de Computacioacuten 4 se puede encontrar maacutesinformacioacuten acerca de Haskell y Emacs
GitHub
GitHub es una plataforma de desarrollo colaborativo que permite alojar proyectosusando el control de versiones de Git El trabajo con un sistema como este hacemucho maacutes faacutecil el trabajo en grupo pues cada individuo puede trabajar desde suordenador propio en paralelo a los demaacutes y remotamente ir actualizando el proyectosin perder la posibilidad de restaurarlo a una versioacuten anteriorEn particular GitHub ha sido una excelente herramienta de control de este TrabajoFin de Grado pues los tutores han podido seguir en cada momento el trabajo rea-lizado detectar faacutecilmente los errores y hacer modificaciones directamente sobre eldocumentoEl compantildeero Eduardo Paluzo Hidalgo hace en su Trabajo Fin de Grado una pe-quentildea introduccioacuten al uso de Github y a la instalacioacuten de magit en una distribucioacutenUbuntu muy recomendable para todos aquellos (especialmente los maacutes principian-tes) que tengan intereacutes en trabajar con este sistemaSe puede encontrar maacutes informacioacuten acerca de esta plataforma en la paacutegina web deGit 5
DocTest
DocTest para Haskell es un programa de verificacioacuten dinaacutemica de ejemplos Si se si-gue un determinado formato a la hora de escribir los ejemplos para las funciones deun documento en Haskell Doctest se encarga de comprobar que los ejemplos seancorrectos Estas validaciones han resultado claves en la realizacioacuten del trabajo puesalgunas definiciones han sido modificadas de forma casi continua y este proyectoespecialmente se basa en lo anterior para poder seguir construyendoSu uso es muy sencillo una vez instalado el correspondiente paquete y escrito losejemplos en el formato requerido solo hay que ejecutar el programa desde la consoladando como argumento el fichero que se desea validarSe puede enontrar maacutes informaioacuten acerca del programa y de coacutemo descargarlo ensu repositorio de GitHub 6
4httpwwwcsuses~jalonsocursosi1m-16temastema-1html5httpsgit-scmcom6httpsgithubcomsoldoctest
Capiacutetulo 1
Conjuntos
El concepto de conjunto aparece en todos los campos de las Matemaacuteticas pero iquestqueacutedebe entenderse por eacutel La Teoriacutea de conjuntos fue introducida por Georg Cantor(1845-1917) desde 1869 Cantor ejercioacute como profesor en la Universidad de Halley entre 1879 y 1884 publicoacute una serie de seis artiacuteculos en el Mathematische Annalenen los que hizo una introduccioacuten baacutesica a la teoriacutea de conjuntos En su Beitraumlge zurBegruumlndung der transfiniten Mengenlehre Cantor dio la siguiente definicioacuten de con-junto
Figura 11 Fragmento del texto traducido al ingleacutes en el que Cantor da la definicioacuten de conjunto
laquoDebemos entender por ldquoconjuntordquo (Menge) cualquier coleccioacuten vista co-mo un todo (Zusammenfassung zu einem Ganzen) M de objetos separa-dos y bien definidos m de nuestra intuicioacuten o pensamiento Estos objetosson los ldquoelementosrdquo de Mraquo
Felix Hausdorff en 1914 dice laquoun conjunto es una reunioacuten de cosas que constitu-yen una totalidad es decir una nueva cosaraquo y antildeade laquoesto puede difiacutecilmente seruna definicioacuten pero sirve como demostracioacuten expresiva del concepto de conjunto atraveacutes de conjuntos sencillos como el conjunto de habitantes de una ciudad o el deaacutetomos de Hidroacutegeno del SolraquoUn conjunto asiacute definido no tiene que estar compuesto necesariamente de elementoshomogeacuteneos y ademaacutes da lugar a cuestiones filosoacuteficas como si podemos llamar
15
16 Capiacutetulo 1 Conjuntos
conjunto a aquel que no posee ninguacuten elemento Matemaacuteticamente conviene aceptarsolo elementos que compartan alguna propiedad y definir el conjunto vaciacuteo comoaquel que no tiene elemento algunoEl gran meacuterito de Cantor fue considerar conjuntos transfinitos (que tiene infinitoselementos) concepto inaudito hasta avanzado el siglo XIX hablar del cardinal de unconjunto como el nuacutemero de sus elementos y hablar de conjuntos equivalentes cuan-do puede establecerse una biyeccioacuten entre ellos ideas ya apuntadas por Bolzanoquien se centroacute demasiado en el aspecto filosoacutefico sin llegar a formalizar sus ideas
A lo largo de la seccioacuten haremos una pequentildea introduccioacuten a la Teoriacutea de Conjun-tos presentando formalmente sus conceptos maacutes importantes A la hora de elaborarel contenido se han utilizado los siguientes recursos bibliograacuteficosbull el primer tema de la asignatura ldquoAacutelgebra baacutesicardquo ([6])bull los temas de la asignatura ldquoInformaacuteticardquo ([1])bull el artiacuteculo de la Wikipedia ldquoSet (mathematics)rdquo ([10] ylowast el artiacuteculo ldquoEl regalo de Cantorrdquo ([5])
11 El TAD de los conjuntos
En la presente seccioacuten se definen las operaciones baacutesicas necesarias para trabajarcon conjuntos en un lenguaje funcional En nuestro caso el lenguaje que utilizare-mos seraacute Haskell Daremos la signatura del Tipo Abstracto de Dato (TAD) de losconjuntos y daremos algunos ejemplos de posibles representaciones de conjuntoscon las que podriacuteamos trabajarA continuacioacuten presentamos las operaciones definidas en el TAD de los conjuntos
vacio Conj a
inserta Eq a =gt a -gt Conj a -gt Conj a
elimina Eq a =gt a -gt Conj a -gt Conj a
pertenece Eq a =gt Conj a -gt a -gt Bool
esVacio Conj a -gt Bool
minimoElemento Ord a =gt Conj a -gt a
dondebull (vacio) es el conjunto vaciacuteobull (inserta x c) es el conjunto obtenido antildeadiendo el elemento x al conjunto cbull (elimina x c) es el conjunto obtenido eliminando el elemento x del conjunto cbull (pertenece x c) se verifica si x pertenece al conjunto cbull (esVacio c) se verifica si c no tiene ninguacuten elementobull (minimoElemento c) devuelve el miacutenimo elemento del conjunto c
12 Representaciones de conjuntos 17
Hemos de tener en cuenta que a la hora de crear un nuevo tipo de dato con el querepresentar a los conjuntos este debe ser compatible con la entidad matemaacutetica querepresenta
Estas son algunas de las posibles representaciones con las que podriacuteamos trabajarcon conjuntos en Haskellbull En primer lugar podemos trabajar con la libreriacutea DataSet en este caso la imple-
mentacioacuten del tipo de dato Set estaacute basado en aacuterboles binarios balanceadosbull Por otra parte podemos definir un nuevo tipo Cj xs con el que trabajar con con-
juntos como listas no ordenadas con duplicados como listas no ordenadas sinduplicados o como listas ordenadas sin duplicadosbull Otra opcioacuten seriacutea trabajar directamente con conjuntos como listas para ello de-
bemos ignorar las repeticiones y el orden con vista a la igualdad de conjuntosbull Los conjuntos que soacutelo contienen nuacutemeros (de tipo Int) entre 0 y nminus 1 se pueden
representar como nuacutemeros binarios con n bits donde el bit i(0 le i lt n) es 1 syssel nuacutemero i pertenece al conjunto
Nota 111 Las funciones que aparecen en la especificacioacuten del TAD no dependende la representacioacuten que elijamos
12 Representaciones de conjuntos
121 Conjuntos como listas ordenadas sin repeticioacuten
En el moacutedulo ConjuntosConListasOrdenadasSinRepeticion se definen las funcio-nes del TAD de los conjuntos dando su representacioacuten como listas ordenadas sinrepeticioacuten
module ConjuntosConListasOrdenadasSinRepeticion
( Conj
vacio
inserta
listaAConjunto
elimina
pertenece
esVacio
minimoElemento
sinRepetidos
esUnitario
esSubconjunto
conjuntosIguales
esSubconjuntoPropio
complementario
18 Capiacutetulo 1 Conjuntos
cardinal
unionConjuntos
unionGeneral
interseccion
productoCartesiano
combinaciones
variacionesR
) where
En las definiciones del presente moacutedulo se usaraacuten algunas funciones de la libreriacuteaDataList
Vamos a definir un nuevo tipo de dato (Conj a) que representa a los conjuntoscomo listas ordenadas sin repeticioacuten
type Conj a = [a]
Las funciones baacutesicas que definiremos a partir de este tipo coincidiraacuten con las indi-cadas en el TAD de los conjuntosbull (vacio) es el conjunto vaciacuteo
-- | Ejemplo
-- gtgtgt vacio
-- []
vacio Conj a
vacio = []
bull (inserta x c) es el conjunto obtenido antildeadiendo el elemento x al conjunto c
-- | Ejemplo
-- gtgtgt inserta 5 vacio
-- [5]
-- gtgtgt foldr inserta vacio [2211242]
-- [124]
inserta Ord a =gt a -gt Conj a -gt Conj a
inserta x [] = [x]
inserta x ys
| pertenece ys x = ys
| otherwise = insert x ys
bull (listaAConjunto xs) devuelve el conjunto cuyos elementos son los de la lista xs
-- | Ejemplo
-- gtgtgt listaAConjunto [2211242]
-- [124]
listaAConjunto Ord a =gt [a] -gt Conj a
listaAConjunto = sort nub
bull (esVacio c) se verifica si c es el conjunto vaciacuteo
12 Representaciones de conjuntos 19
-- | Ejemplos
-- gtgtgt esVacio (listaAConjunto [25137532190])
-- False
-- gtgtgt esVacio vacio
-- True
esVacio Conj a -gt Bool
esVacio = null
bull (pertenece x c) se verifica si x es un elemento del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt pertenece c1 3
-- True
-- gtgtgt pertenece c1 4
-- False
pertenece Ord a =gt Conj a -gt a -gt Bool
pertenece ys x =
x == head (dropWhile (ltx) ys)
bull (elimina x c) es el conjunto obtenido eliminando el elemento x del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt elimina 3 c1
-- [012579]
-- gtgtgt elimina 4 c1
-- [0123579]
elimina Ord a =gt a -gt Conj a -gt Conj a
elimina x ys = us ++ dropWhile (==x) vs
where (usvs) = span (ltx) ys
bull (minimoElemento c) devuelve el miacutenimo elemento del conjunto c
-- | Ejemplos
-- gtgtgt minimoElemento (listaAConjunto [25137532190])
-- 0
-- gtgtgt minimoElemento (listaAConjunto ([ae] ++ [AE]))
-- A
minimoElemento Ord a =gt Conj a -gt a
minimoElemento = head
122 Definicioacuten de conjunto
Nota 121 Al trabajar con la representacioacuten de conjuntos como listas en Haskellhemos de cuidar que los ejemplos con los que trabajemos no tengan elementos re-petidos La funcioacuten (sinRepetidos xs) se verifica si la lista xs no tiene ninguacuten ele-mento repetido
20 Capiacutetulo 1 Conjuntos
-- | Ejemplos
-- gtgtgt sinRepetidos []
-- True
-- gtgtgt sinRepetidos [1231]
-- False
sinRepetidos Eq a =gt [a] -gt Bool
sinRepetidos xs = nub xs == xs
Los conjuntos pueden definirse de manera expliacutecita citando todos sus elementosentre llaves de manera impliacutecita dando una o varias caracteriacutesticas que determi-nen si un objeto dado estaacute o no en el conjunto Por ejemplo los conjuntos 1 2 3 4y x isinN|1 le x le 4 son el mismo definido de forma explicita e impliacutecita respecti-vamente
Nota 122 La definicioacuten impliacutecita es necesaria cuando el conjunto en cuestioacuten tieneuna cantidad infinita de elementos En general los conjuntos se notaraacuten con letrasmayuacutesculas A B y los elementos con letras minuacutesculas a b
Cuando trabajamos con conjuntos concretos siempre existe un contexto donde esosconjuntos existen Por ejemplo si A = minus1 1 2 3 4 5 y B = x|x isin Nes par elcontexto donde podemos considerar A y B es el conjunto de los nuacutemeros enterosZ En general a este conjunto se le denomina conjunto universal De una forma algomaacutes precisa podemos dar la siguiente definicioacuten
Definicioacuten 121 El conjunto universal que notaremos por U es un conjunto del queson subconjuntos todos los posibles conjuntos que originan el problema que tratamos
123 Subconjuntos
Definicioacuten 122 Dados dos conjuntos A y B si todo elemento de A es a su vez elementode B diremos que A es un subconjunto de B y lo notaremos A sube B En caso contrario senotaraacute A 6sube B
La funcioacuten (esSubconjunto c1 c2) se verifica si c1 es un subconjunto de c2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
-- gtgtgt c1 `esSubconjunto` c2
-- True
-- gtgtgt c1 `esSubconjunto` vacio
-- False
-- gtgtgt vacio `esSubconjunto` c2
12 Representaciones de conjuntos 21
-- True
-- gtgtgt c3 `esSubconjunto` c4
-- True
-- gtgtgt c2 `esSubconjunto` c1
-- False
esSubconjunto Ord a =gt Conj a -gt Conj a -gt Bool
esSubconjunto [] _ = True
esSubconjunto (xxs) ys =
x == head vs ampamp esSubconjunto xs (tail vs)
where (usvs) = span (ltx) ys
124 Igualdad de conjuntos
Definicioacuten 123 Dados dos conjuntos A y B diremos que son iguales si tienen los mismoselementos es decir si se verifica que A sube B y B sube A Lo notaremos A = B
La funcioacuten (conjuntosIguales c1 c2) se verifica si los conjuntos xs y ys son igua-les
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
-- gtgtgt let c5 = listaAConjunto [4444442]
-- gtgtgt conjuntosIguales c1 c2
-- False
-- gtgtgt conjuntosIguales c3 c4
-- True
-- gtgtgt conjuntosIguales c1 c5
-- True
conjuntosIguales Ord a =gt Conj a -gt Conj a -gt Bool
conjuntosIguales = (==)
125 Subconjuntos propios
Definicioacuten 124 Los subconjuntos de A distintos del empty y del mismo A se denominansubconjuntos propios de A
La funcioacuten (esSubconjuntoPropio c1 c2) se verifica si c1 es un subconjunto pro-pio de c2
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt esSubconjuntoPropio u u
22 Capiacutetulo 1 Conjuntos
-- False
-- gtgtgt esSubconjuntoPropio c1 u
-- True
esSubconjuntoPropio Ord a =gt Conj a -gt Conj a -gt Bool
esSubconjuntoPropio c1 c2 =
not (null c1) ampamp esSubconjunto c1 c2 ampamp c1 = c2
126 Complementario de un conjunto
Definicioacuten 125 Dado un conjunto A se define el complementario de A que notaremospor A como
A = x|x isin U x 6isin A
La funcioacuten (complementario u c) devuelve el complementario del conjunto c y enel universo u
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt let c2 = listaAConjunto [14689]
-- gtgtgt complementario u c1
-- [14689]
-- gtgtgt complementario u u
-- []
-- gtgtgt complementario u vacio
-- [123456789]
-- gtgtgt complementario u c2
-- [2357]
complementario Ord a =gt Conj a -gt Conj a -gt Conj a
complementario [] _ = []
complementario xs [] = xs
complementario (xxs) (yys)
| x lt y = x complementario xs (yys)
| otherwise = complementario xs ys
127 Cardinal de un conjunto
Definicioacuten 126 Dado un conjunto finito A denominaremos cardinal de A al nuacutemero deelementos que tiene y lo notaremos |A|
La funcioacuten (cardinal xs) devuelve el cardinal del conjunto xs
-- | Ejemplos
-- gtgtgt cardinal vacio
-- 0
-- gtgtgt cardinal (listaAConjunto [110])
12 Representaciones de conjuntos 23
-- 10
-- gtgtgt cardinal (listaAConjunto chocolate)
-- 7
cardinal Ord a =gt Conj a -gt Int
cardinal = length
128 Conjunto unitario
Definicioacuten 127 Un conjunto con un uacutenico elemento se denomina unitario
Nota 123 Notemos que si X = x es un conjunto unitario debemos distinguirentre el conjunto X y el elemento x
La funcioacuten (esUnitario c) se verifica si el conjunto c es unitario
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto (take 10 (repeat 5))
-- gtgtgt let c2 = listaAConjunto valverde
-- gtgtgt let c3 = listaAConjunto coco
-- gtgtgt esUnitario c1
-- True
-- gtgtgt esUnitario c2
-- False
-- gtgtgt esUnitario c2
-- False
esUnitario Ord a =gt Conj a -gt Bool
esUnitario c =
c == take 1 c
129 Unioacuten de conjuntos
Definicioacuten 128 Dados dos conjuntos A y B se define la unioacuten de A y B notado A cup Bcomo el conjunto formado por aquellos elementos que pertenecen al menos a uno de los dosconjuntos A oacute B es decir
A cup B = x | x isin A or x isin B
La funcioacuten (unionConjuntos c1 c2) devuelve la unioacuten de los conjuntos xs y ys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [139]
-- gtgtgt let c2 = listaAConjunto [249]
-- gtgtgt unionConjuntos c1 c2
-- [123456789]
unionConjuntos Ord a =gt Conj a -gt Conj a -gt Conj a
unionConjuntos [] [] = []
24 Capiacutetulo 1 Conjuntos
unionConjuntos [] ys = ys
unionConjuntos xs [] = xs
unionConjuntos (xxs) (yys)
| x lt y = x unionConjuntos xs (yys)
| x == y = x unionConjuntos xs ys
| otherwise = y unionConjuntos (xxs) ys
Definicioacuten 129 Dada una familia de conjuntos Ai con i isin I se define la unioacuten ge-neral de los conjuntos Ai notado
⋃iisinI Ai como el conjunto formado por aquellos elementos
que pertenecen al menos a uno de los conjuntos de la familia es decir
⋃iisinI
Ai = x | x isin Ai foralli isin I
La funcioacuten (unionGeneral xss) devuelve la unioacuten general de la familia de conjun-tos de la lista xss
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1415]
-- gtgtgt let c2 = listaAConjunto [2515]
-- gtgtgt let c3 = listaAConjunto [3615]
-- gtgtgt unionGeneral [c1c2c3]
-- [123456789101112131415]
unionGeneral Ord a =gt [Conj a] -gt Conj a
unionGeneral = foldr unionConjuntos vacio
1210 Interseccioacuten de conjuntos
Definicioacuten 1210 Dados dos conjuntos A y B se define la interseccioacuten de A y B notadoA cap B como el conjunto formado por aquellos elementos que pertenecen a cada uno de losdos conjuntos A y B es decir
A cap B = x | x isin A and x isin B
La funcioacuten (interseccion c1 c2) devuelve la interseccioacuten de los conjuntos c1 yc2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1320]
-- gtgtgt let c2 = listaAConjunto [2420]
-- gtgtgt let c3 = listaAConjunto [2430]
-- gtgtgt let c4 = listaAConjunto [4830]
-- gtgtgt interseccion c1 c2
-- []
-- gtgtgt interseccion c3 c4
12 Representaciones de conjuntos 25
-- [481216202428]
interseccion Ord a =gt Conj a -gt Conj a -gt Conj a
interseccion (xxs) (yys)
| x lt y = interseccion xs (yys)
| x gt y = interseccion (xxs) ys
| otherwise = x interseccion xs ys
interseccion _ _ = []
1211 Producto cartesiano
Definicioacuten 1211 El producto cartesiano 1 de dos conjuntos A y B es una operacioacutensobre ellos que resulta en un nuevo conjunto Atimes B que contiene a todos los pares ordenadostales que la primera componente pertenece a A y la segunda pertenece a B es decir
Atimes B = (a b) | a isin A b isin B
La funcioacuten (productoCartesiano c1 c2) devuelve el producto cartesiano de xs eys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [31]
-- gtgtgt let c2 = listaAConjunto [247]
-- gtgtgt productoCartesiano c1 c2
-- [(12)(14)(17)(32)(34)(37)]
-- gtgtgt productoCartesiano c2 c1
-- [(21)(23)(41)(43)(71)(73)]
productoCartesiano (Ord a Ord b) =gt Conj a -gt Conj b -gt Conj (ab)
productoCartesiano xs ys=
listaAConjunto [(xy) | x lt- xs y lt- ys]
1212 Combinaciones
Definicioacuten 1212 Las combinaciones de un conjunto S tomados en grupos de n son todoslos subconjuntos de S con n elementos
La funcioacuten (combinaciones n xs) devuelve las combinaciones de los elementos dexs en listas de n elementos
-- | Ejemplos
-- gtgtgt combinaciones 3 [ad]
-- [abcabdacdbcd]
-- gtgtgt combinaciones 2 [248]
-- [[24][26][28][46][48][68]]
1httpsenwikipediaorgwikiCartesian_product
26 Capiacutetulo 1 Conjuntos
combinaciones Integer -gt [a] -gt [[a]]
combinaciones 0 _ = [[]]
combinaciones _ [] = []
combinaciones k (xxs) =
[xys | ys lt- combinaciones (k-1) xs] ++ combinaciones k xs
1213 Variaciones con repeticioacuten
Definicioacuten 1213 Las variaciones con repeticioacuten de m elementos tomados en grupos den es el nuacutemero de diferentes nndashtuplas de un conjunto de m elementos
La funcioacuten (variacionesR n xs) devuelve las variaciones con con repeticioacuten de loselementos de xs en listas de n elementos
-- | Ejemplos
-- gtgtgt variacionesR 3 [ab]
-- [aaaaababaabbbaababbbabbb]
-- gtgtgt variacionesR 2 [235]
-- [[22][23][25][32][33][35][52][53][55]]
variacionesR Int -gt [a] -gt [[a]]
variacionesR _ [] = [[]]
variacionesR 0 _ = [[]]
variacionesR k us =
[uvs | u lt- us vs lt- variacionesR (k-1) us]
1214 Conjuntos como listas sin repeticioacuten
En el moacutedulo ConjuntosConListas se definen las funciones del TAD de los conjun-tos dando su representacioacuten como listas sin elementos repetidos
module ConjuntosConListas
( Conj
vacio
inserta
listaAConjunto
elimina
pertenece
esVacio
minimoElemento
sinRepetidos
esUnitario
esSubconjunto
conjuntosIguales
esSubconjuntoPropio
complementario
cardinal
12 Representaciones de conjuntos 27
unionConjuntos
unionGeneral
interseccion
productoCartesiano
combinaciones
variacionesR
) where
En las definiciones del presente moacutedulo se usaraacuten algunas funciones de la libreriacuteaDataList
Vamos a definir un nuevo tipo de dato (Conj a) que representa a los conjuntoscomo listas sin elementos repetidos
type Conj a = [a]
Las funciones baacutesicas que definiremos a partir de este tipo coincidiraacuten con las indi-cadas en el TAD de los conjuntosbull (vacio) es el conjunto vaciacuteo
-- | Ejemplo
-- gtgtgt vacio
-- []
vacio Conj a
vacio = []
bull (inserta x c) es el conjunto obtenido antildeadiendo el elemento x al conjunto c
-- | Ejemplo
-- gtgtgt inserta 5 vacio
-- [5]
-- gtgtgt foldr inserta vacio [2211242]
-- [142]
inserta Eq a =gt a -gt Conj a -gt Conj a
inserta x [] = [x]
inserta x ys | elem x ys = ys
| otherwise = xys
bull (listaAConjunto xs) devuelve el conjunto cuyos elementos son los de la lista xs
-- | Ejemplo
-- gtgtgt listaAConjunto [2211242]
-- [214]
listaAConjunto Eq a =gt [a] -gt Conj a
listaAConjunto = nub
bull (esVacio c) se verifica si c es el conjunto vaciacuteo
-- | Ejemplos
-- gtgtgt esVacio (listaAConjunto [25137532190])
-- False
28 Capiacutetulo 1 Conjuntos
-- gtgtgt esVacio vacio
-- True
esVacio Conj a -gt Bool
esVacio = null
bull (pertenece x c) se verifica si x es un elemento del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt pertenece 3 c1
-- True
-- gtgtgt pertenece 4 c1
-- False
pertenece Eq a =gt a -gt Conj a -gt Bool
pertenece = elem
bull (elimina x c) es el conjunto obtenido eliminando el elemento x del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt elimina 3 c1
-- [251790]
-- gtgtgt elimina 4 c1
-- [2513790]
elimina Eq a =gt a -gt Conj a -gt Conj a
elimina = delete
bull (minimoElemento c) devuelve el miacutenimo elemento del conjunto c
-- | Ejemplos
-- gtgtgt minimoElemento (listaAConjunto [25137532190])
-- 0
-- gtgtgt minimoElemento (listaAConjunto ([ae] ++ [AE]))
-- A
minimoElemento Ord a =gt Conj a -gt a
minimoElemento = minimum
1215 Definicioacuten de conjunto
Definicioacuten 1214 Llamaremos conjunto a una coleccioacuten de objetos que llamaremos ele-mentos distintos entre siacute y que comparten una propiedad Para que un conjunto esteacute biendefinido debe ser posible discernir si un objeto arbitrario estaacute o no en eacutel
Si el elemento a pertenece al conjunto A escribiremos a isin A En caso contrarioescribiremos a 6isin A
Nota 124 En Haskell para poder discernir si un objeto arbitrario pertenece a unconjunto se necesita que su tipo pertenezca a la clase Eq
12 Representaciones de conjuntos 29
Nota 125 Al trabajar con la representacioacuten de conjuntos como listas en Haskellhemos de cuidar que los ejemplos con los que trabajemos no tengan elementos re-petidos La funcioacuten (sinRepetidos xs) se verifica si la lista xs no tiene ninguacuten ele-mento repetido
-- | Ejemplos
-- gtgtgt sinRepetidos []
-- True
-- gtgtgt sinRepetidos [1231]
-- False
sinRepetidos Eq a =gt [a] -gt Bool
sinRepetidos xs = nub xs == xs
Los conjuntos pueden definirse de manera expliacutecita citando todos sus elementosentre llaves de manera impliacutecita dando una o varias caracteriacutesticas que determi-nen si un objeto dado estaacute o no en el conjunto Por ejemplo los conjuntos 1 2 3 4y x isinN|1 le x le 4 son el mismo definido de forma explicita e impliacutecita respecti-vamente
Nota 126 La definicioacuten impliacutecita es necesaria cuando el conjunto en cuestioacuten tieneuna cantidad infinita de elementos En general los conjuntos se notaraacuten con letrasmayuacutesculas A B y los elementos con letras minuacutesculas a b
Cuando trabajamos con conjuntos concretos siempre existe un contexto donde esosconjuntos existen Por ejemplo si A = minus1 1 2 3 4 5 y B = x|x isin Nes par elcontexto donde podemos considerar A y B es el conjunto de los nuacutemeros enterosZ En general a este conjunto se le denomina conjunto universal De una forma algomaacutes precisa podemos dar la siguiente definicioacuten
Definicioacuten 1215 El conjunto universal que notaremos por U es un conjunto del queson subconjuntos todos los posibles conjuntos que originan el problema que tratamos
1216 Subconjuntos
Definicioacuten 1216 Dados dos conjuntos A y B si todo elemento de A es a su vez elementode B diremos que A es un subconjunto de B y lo notaremos A sube B En caso contrario senotaraacute A 6sube B
La funcioacuten (esSubconjunto c1 c2) se verifica si c1 es un subconjunto de c2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
30 Capiacutetulo 1 Conjuntos
-- gtgtgt c1 `esSubconjunto` c2
-- True
-- gtgtgt c1 `esSubconjunto` vacio
-- False
-- gtgtgt vacio `esSubconjunto` c2
-- True
-- gtgtgt c3 `esSubconjunto` c4
-- True
-- gtgtgt c2 `esSubconjunto` c1
-- False
esSubconjunto Eq a =gt [a] -gt [a] -gt Bool
esSubconjunto c1 c2 = all (`elem` c2) c1
1217 Igualdad de conjuntos
Definicioacuten 1217 Dados dos conjuntos A y B diremos que son iguales si tienen losmismos elementos es decir si se verifica que A sube B y B sube A Lo notaremos A = B
La funcioacuten (conjuntosIguales c1 c2) se verifica si los conjuntos xs y ys son igua-les
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
-- gtgtgt let c5 = listaAConjunto [4444442]
-- gtgtgt conjuntosIguales c1 c2
-- False
-- gtgtgt conjuntosIguales c3 c4
-- True
-- gtgtgt conjuntosIguales c1 c5
-- True
conjuntosIguales Eq a =gt [a] -gt [a] -gt Bool
conjuntosIguales c1 c2 =
esSubconjunto c1 c2 ampamp esSubconjunto c2 c1
1218 Subconjuntos propios
Definicioacuten 1218 Los subconjuntos de A distintos del empty y del mismo A se denominansubconjuntos propios de A
La funcioacuten (esSubconjuntoPropio c1 c2) se verifica si c1 es un subconjunto pro-pio de c2
12 Representaciones de conjuntos 31
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt esSubconjuntoPropio u u
-- False
-- gtgtgt esSubconjuntoPropio c1 u
-- True
esSubconjuntoPropio Eq a =gt [a] -gt [a] -gt Bool
esSubconjuntoPropio c1 c2
| null c1 = False
| conjuntosIguales c1 c2 = False
| otherwise = esSubconjunto c1 c2
1219 Complementario de un conjunto
Definicioacuten 1219 Dado un conjunto A se define el complementario de A que notaremospor A como
A = x|x isin U x 6isin A
La funcioacuten (complementario u c) devuelve el complementario del conjunto c y enel universo u
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt let c2 = listaAConjunto [14689]
-- gtgtgt complementario u c1
-- [14689]
-- gtgtgt complementario u u
-- []
-- gtgtgt complementario u vacio
-- [123456789]
-- gtgtgt complementario u c2
-- [2357]
complementario Eq a =gt [a] -gt [a] -gt [a]
complementario = ()
1220 Cardinal de un conjunto
Definicioacuten 1220 Dado un conjunto finito A denominaremos cardinal de A al nuacutemerode elementos que tiene y lo notaremos |A|
La funcioacuten (cardinal xs) devuelve el cardinal del conjunto xs
32 Capiacutetulo 1 Conjuntos
-- | Ejemplos
-- gtgtgt cardinal vacio
-- 0
-- gtgtgt cardinal (listaAConjunto [110])
-- 10
-- gtgtgt cardinal (listaAConjunto chocolate)
-- 7
cardinal [a] -gt Int
cardinal = length
1221 Conjunto unitario
Definicioacuten 1221 Un conjunto con un uacutenico elemento se denomina unitario
Nota 127 Notemos que si X = x es un conjunto unitario debemos distinguirentre el conjunto X y el elemento x
La funcioacuten (esUnitario c) se verifica si el conjunto c es unitario
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto (take 10 (repeat 5))
-- gtgtgt let c2 = listaAConjunto valverde
-- gtgtgt let c3 = listaAConjunto coco
-- gtgtgt esUnitario c1
-- True
-- gtgtgt esUnitario c2
-- False
-- gtgtgt esUnitario c2
-- False
esUnitario Eq a =gt [a] -gt Bool
esUnitario c = c == take 1 c
1222 Unioacuten de conjuntos
Definicioacuten 1222 Dados dos conjuntos A y B se define la unioacuten de A y B notado A cup Bcomo el conjunto formado por aquellos elementos que pertenecen al menos a uno de los dosconjuntos A oacute B es decir
A cup B = x | x isin A or x isin B
La funcioacuten (unionConjuntos c1 c2) devuelve la unioacuten de los conjuntos xs y ys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [139]
-- gtgtgt let c2 = listaAConjunto [249]
12 Representaciones de conjuntos 33
-- gtgtgt unionConjuntos c1 c2
-- [135792468]
unionConjuntos Eq a =gt [a] -gt [a] -gt [a]
unionConjuntos = union
Definicioacuten 1223 Dada una familia de conjuntos Ai con i isin I se define la unioacuten ge-neral de los conjuntos Ai notado
⋃iisinI Ai como el conjunto formado por aquellos elementos
que pertenecen al menos a uno de los conjuntos de la familia es decir
⋃iisinI
Ai = x | x isin Ai foralli isin I
La funcioacuten (unionGeneral xss) devuelve la unioacuten general de la familia de conjun-tos de la lista xss
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1415]
-- gtgtgt let c2 = listaAConjunto [2515]
-- gtgtgt let c3 = listaAConjunto [3615]
-- gtgtgt unionGeneral [c1c2c3]
-- [147101325811143691215]
unionGeneral Eq a =gt [[a]] -gt [a]
unionGeneral = foldr unionConjuntos []
1223 Interseccioacuten de conjuntos
Definicioacuten 1224 Dados dos conjuntos A y B se define la interseccioacuten de A y B notadoA cap B como el conjunto formado por aquellos elementos que pertenecen a cada uno de losdos conjuntos A y B es decir
A cap B = x | x isin A and x isin B
La funcioacuten (interseccion c1 c2) devuelve la interseccioacuten de los conjuntos c1 yc2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1320]
-- gtgtgt let c2 = listaAConjunto [2420]
-- gtgtgt let c3 = listaAConjunto [2430]
-- gtgtgt let c4 = listaAConjunto [4830]
-- gtgtgt interseccion c1 c2
-- []
-- gtgtgt interseccion c3 c4
-- [481216202428]
34 Capiacutetulo 1 Conjuntos
interseccion Eq a =gt [a] -gt [a] -gt [a]
interseccion = intersect
1224 Producto cartesiano
Definicioacuten 1225 El producto cartesiano 2 de dos conjuntos A y B es una operacioacutensobre ellos que resulta en un nuevo conjunto Atimes B que contiene a todos los pares ordenadostales que la primera componente pertenece a A y la segunda pertenece a B es decir
Atimes B = (a b) | a isin A b isin B
La funcioacuten (productoCartesiano c1 c2) devuelve el producto cartesiano de xs eys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [31]
-- gtgtgt let c2 = listaAConjunto [247]
-- gtgtgt productoCartesiano c1 c2
-- [(32)(34)(37)(12)(14)(17)]
-- gtgtgt productoCartesiano c2 c1
-- [(23)(21)(43)(41)(73)(71)]
productoCartesiano [a] -gt [b] -gt [(ab)]
productoCartesiano xs ys = [ (xy) | x lt- xs y lt- ys]
1225 Combinaciones
Definicioacuten 1226 Las combinaciones de un conjunto S tomados en grupos de n son todoslos subconjuntos de S con n elementos
La funcioacuten (combinaciones n xs) devuelve las combinaciones de los elementos dexs en listas de n elementos
-- | Ejemplos
-- gtgtgt combinaciones 3 [ad]
-- [abcabdacdbcd]
-- gtgtgt combinaciones 2 [248]
-- [[24][26][28][46][48][68]]
combinaciones Integer -gt [a] -gt [[a]]
combinaciones 0 _ = [[]]
combinaciones _ [] = []
combinaciones k (xxs) =
[xys | ys lt- combinaciones (k-1) xs] ++ combinaciones k xs
2httpsenwikipediaorgwikiCartesian_product
13 Eleccioacuten de la representacioacuten de conjuntos 35
1226 Variaciones con repeticioacuten
Definicioacuten 1227 Las variaciones con repeticioacuten de m elementos tomados en grupos den es el nuacutemero de diferentes nndashtuplas de un conjunto de m elementos
La funcioacuten (variacionesR n xs) devuelve las variaciones con con repeticioacuten de loselementos de xs en listas de n elementos
-- | Ejemplos
-- gtgtgt variacionesR 3 [ab]
-- [aaaaababaabbbaababbbabbb]
-- gtgtgt variacionesR 2 [235]
-- [[22][23][25][32][33][35][52][53][55]]
variacionesR Int -gt [a] -gt [[a]]
variacionesR _ [] = [[]]
variacionesR 0 _ = [[]]
variacionesR k us =
[uvs | u lt- us vs lt- variacionesR (k-1) us]
13 Eleccioacuten de la representacioacuten de conjuntos
Nota 131 En el moacutedulo Conjuntos se elige la representacioacuten de conjunto con la quese trabajaraacute
-- Seleccionar para trabajar con los conjuntos como listas sin
-- elementos repetidos
module Conjuntos
(module ConjuntosConListas)
where
import ConjuntosConListas
-- Seleccionar para trabajar con los conjuntos como listas ordenadas
-- sin elementos repetidos
-- module Conjuntos
-- (module ConjuntosConListasOrdenadasSinRepeticion)
-- where
-- import ConjuntosConListasOrdenadasSinRepeticion
36 Capiacutetulo 1 Conjuntos
Capiacutetulo 2
Relaciones y funciones
21 Relaciones
Las relaciones que existen entre personas nuacutemeros conjuntos y muchas otras enti-dades pueden formalizarse en la idea de relacioacuten binaria En esta seccioacuten se define ydesarrolla este concepto particularizando en el caso de las relaciones homogeacuteneasy en el de las funciones
211 Relacioacuten binaria
Definicioacuten 211 Una relacioacuten binaria 1 (o correspondencia) entre dos conjuntos A yB es un subconjunto del producto cartesiano Atimes B
La funcioacuten (esRelacion xs ys r) se verifica si r es una relacioacuten binaria de xs enys Por ejemplo
-- | Ejemplos
-- gtgtgt esRelacion [31] [247] [(12)(34)]
-- True
-- gtgtgt esRelacion [31] [247] [(12)(31)]
-- False
esRelacion (Ord a Ord b) =gt [a] -gt [b] -gt [(ab)] -gt Bool
esRelacion xs ys r =
r `esSubconjunto` productoCartesiano xs ys
212 Imagen por una relacioacuten
Definicioacuten 212 Si R es una relacioacuten binaria la imagen del elemento x en la relacioacuten Res el conjunto de los valores correspondientes a x en R
1httpsenwikipediaorgwikiBinary_relation
37
38 Capiacutetulo 2 Relaciones y funciones
La funcioacuten (imagenRelacion r x) es la imagen de x en la relacioacuten r
-- | Ejemplos
-- gtgtgt imagenRelacion [(13)(25)(14)] 1
-- [34]
-- gtgtgt imagenRelacion [(13)(25)(14)] 2
-- [5]
-- gtgtgt imagenRelacion [(13)(25)(14)] 3
-- []
imagenRelacion (Ord a Ord b) =gt [(ab)] -gt a -gt [b]
imagenRelacion r x =
nub [y | (zy) lt- r z == x]
213 Dominio de una relacioacuten
Definicioacuten 213 Dada una relacioacuten binaria R su dominio es el conjunto que contiene atodos los valores que se toman en la relacioacuten R
La funcioacuten (dominio r) devuelve el dominio de la relacioacuten r
-- | Ejemplo
-- gtgtgt dominio [(32)(51)(34)]
-- [35]
dominio Ord a =gt [(ab)] -gt [a]
dominio r = listaAConjunto (map fst r)
214 Rango de una relacioacuten
Definicioacuten 214 El rango de una relacioacuten binaria R es el conjunto de las imaacutegenes demediante R
La funcioacuten (rango r) devuelve el rango de la relacioacuten binaria r
-- | Ejemplo
-- gtgtgt rango [(32)(52)(34)]
-- [24]
rango Ord b =gt [(ab)] -gt [b]
rango r = listaAConjunto (map snd r)
215 Antiimagen por una relacioacuten
Definicioacuten 215 La antiimagen del elemento y por una relacioacuten r es el conjunto de loselementos cuya imagen es y
La (antiImagenRelacion r y) es la antiimagen del elemento y en la relacioacuten bina-ria r
22 Relaciones homogeacuteneas 39
-- | Ejemplo
-- gtgtgt antiImagenRelacion [(13)(23)(74)] 3
-- [12]
antiImagenRelacion (Ord a Ord b) =gt [(ab)] -gt b -gt [a]
antiImagenRelacion r y =
nub [x | (xz) lt- r z == y]
216 Relacioacuten funcional
Definicioacuten 216 Dada una relacioacuten binaria R se dice funcional si todos los elementos desu dominio tienen una uacutenica imagen en R
La funcioacuten (esFuncional r) se verifica si la relacioacuten r es funcional
-- | Ejemplos
-- gtgtgt esFuncional [(32)(51)(79)]
-- True
-- gtgtgt esFuncional [(32)(51)(34)]
-- False
-- gtgtgt esFuncional [(32)(51)(32)]
-- True
esFuncional (Ord a Ord b) =gt [(ab)] -gt Bool
esFuncional r =
and [esUnitario (imagenRelacion r x) | x lt- dominio r]
22 Relaciones homogeacuteneas
Para elaborar la presente seccioacuten se han consultado los apuntes de ldquoAacutelgebra baacutesicardquo([6]) asignatura del primer curso del Grado en Matemaacuteticas
Definicioacuten 221 Una relacioacuten binaria entre dos conjuntos A y B se dice que es homogeacute-nea si los conjuntos son iguales es decir si A = B Si el par (x y) isin AA estaacute en la relacioacutenhomogeacutenea R diremos que x estaacute Rndashrelacionado con y o relacionado con y por R Esto senotaraacute frecuentemente xRy (noacutetese que el orden es importante)
La funcioacuten (esRelacionHomogenea xs r) se verifica si r es una relacioacuten binaria ho-mogeacutenea en el conjunto xs
-- | Ejemplos
-- gtgtgt esRelacionHomogenea [14] [(12)(24)(34)(41)]
-- True
-- gtgtgt esRelacionHomogenea [14] [(12)(25)(34)(41)]
-- False
-- gtgtgt esRelacionHomogenea [14] [(12)(34)(41)]
40 Capiacutetulo 2 Relaciones y funciones
-- True
esRelacionHomogenea Ord a =gt [a] -gt [(aa)] -gt Bool
esRelacionHomogenea xs = esRelacion xs xs
Nota 221 El segundo argumento que recibe la funcioacuten ha de ser una lista de parescon ambas componentes del mismo tipo
La funcioacuten (estaRelacionado r x y) se verifica si x estaacute relacionado con y en larelacioacuten homogeacutenea r
-- | Ejemplos
-- gtgtgt estaRelacionado [(13)(25)(46)] 2 5
-- True
-- gtgtgt estaRelacionado [(13)(25)(46)] 2 3
-- False
estaRelacionado Ord a =gt [(aa)] -gt a -gt a -gt Bool
estaRelacionado r x y = (xy) `elem` r
221 Relaciones reflexivas
Definicioacuten 222 Sea R una relacioacuten binaria homogeacutenea en el conjunto A Diremos que Res reflexiva cuando todos los elementos de A estaacuten relacionados por R consigo mismos esdecir cuando forallx isin A se tiene que xRx
La funcioacuten (esReflexiva xs r) se verifica si la relacioacuten r en xs es reflexiva
-- | Ejemplos
-- gtgtgt esReflexiva [12] [(11)(12)(22)]
-- True
-- gtgtgt esReflexiva [12] [(11)(12)]
-- False
esReflexiva Ord a =gt [a] -gt [(aa)] -gt Bool
esReflexiva xs r = zip xs xs `esSubconjunto` r
Nota 222 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xSylarrrarr xminus y es parbull xTylarrrarr x divide a yson relaciones binarias homogeacuteneas reflexivas
222 Relaciones simeacutetricas
Definicioacuten 223 Diremos que una relacioacuten homogeacutenea R es simeacutetrica cuando
forall(x y) isin R minusrarr (y x) isin R
22 Relaciones homogeacuteneas 41
La funcioacuten (esSimetrica r) se verifica si la relacioacuten r es simeacutetrica
-- | Ejemplos
-- gtgtgt esSimetrica [(11)(12)(21)]
-- True
-- gtgtgt esSimetrica [(11)(12)(22)]
-- False
esSimetrica Ord a =gt [(aa)] -gt Bool
esSimetrica r =
listaAConjunto [(yx) | (xy) lt- r] `esSubconjunto` r
Nota 223 En el conjunto N la relacioacuten caracterizada por xSy larrrarr xminus y es par esuna relacioacuten binaria homogeacutenea simeacutetrica
223 Relaciones antisimeacutetricas
Definicioacuten 224 Sea R una relacioacuten binaria homogeacutenea en el conjunto A Diremos que Res antisimeacutetrica cuando
forall(x y)[(x y) isin R and (y x) isin R minusrarr x = y
La funcioacuten (esAntisimetrica r) se verifica si la relacioacuten r es antisimeacutetrica
-- | Ejemplos
-- gtgtgt esAntisimetrica [(12)(31)]
-- True
-- gtgtgt esAntisimetrica [(12)(21)]
-- False
esAntisimetrica Ord a =gt [(aa)] -gt Bool
esAntisimetrica r =
and [x == y | (xy) lt- r (yx) `elem` r]
Nota 224 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xTylarrrarr x divide a ybull xRylarrrarr x lt yson relaciones binarias homogeacuteneas antisimeacutetricas
224 Relaciones transitivas
Definicioacuten 225 Sea R una relacioacuten binaria homogeacutenea en el conjunto A Diremos que Res transitiva cuando forall(x y) (y z) isin R se tiene que xRy e yRz minusrarr xRz
La funcioacuten (esTransitiva r) se verifica si la relacioacuten r es transitiva
42 Capiacutetulo 2 Relaciones y funciones
-- | Ejemplos
-- gtgtgt esTransitiva [(12)(13)(23)]
-- True
-- gtgtgt esTransitiva [(12)(23)]
-- False
esTransitiva Ord a =gt [(aa)] -gt Bool
esTransitiva r =
listaAConjunto [(xz) | (xy) lt- r (wz) lt- r y == w]
`esSubconjunto` r
Nota 225 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xSylarrrarr xminus y es parbull xTylarrrarr x divide a ybull xRylarrrarr x lt yson relaciones binarias homogeacuteneas transitivas
225 Relaciones de equivalencia
Definicioacuten 226 Las relaciones homogeacuteneas que son a la vez reflexivas simeacutetricas y tran-sitivas se denominan relaciones de equivalencia
La funcioacuten (esRelacionEquivalencia xs r) se verifica si r es una relacioacuten de equi-valencia en xs-- | Ejemplos
-- gtgtgt esRelacionEquivalencia [13] [(11)(12)(21)(22)(33)]
-- True
-- gtgtgt esRelacionEquivalencia [13] [(12)(21)(22)(33)]
-- False
-- gtgtgt esRelacionEquivalencia [13] [(11)(12)(22)(33)]
-- False
esRelacionEquivalencia Ord a =gt [a] -gt [(aa)] -gt Bool
esRelacionEquivalencia xs r =
esReflexiva xs r ampamp
esSimetrica r ampamp
esTransitiva r
Nota 226 En el conjunto N la relacioacuten caracterizada por xSy larrrarr xminus y es par esuna relacioacuten de equivalencia
226 Relaciones de orden
Definicioacuten 227 Las relaciones homogeacuteneas que son a la vez reflexivas antisimeacutetricas ytransitivas se denominan relaciones de orden
23 Funciones 43
La funcioacuten (esRelacionOrden xs r) se verifica si r es una relacioacuten de orden en xs
-- | Ejemplo
-- gtgtgt esRelacionOrden [13] [(11)(12)(13)(22)(23)(33)]
-- True
esRelacionOrden Ord a =gt [a] -gt [(aa)] -gt Bool
esRelacionOrden xs r =
esReflexiva xs r ampamp
esAntisimetrica r ampamp
esTransitiva r
Nota 227 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xTylarrrarr x divide a yson relaciones de orden
227 Clases de equivalencia
Definicioacuten 228 Si R es una relacioacuten de equivalencia en A denominamos clase de equi-valencia de un elemento x isin A al conjunto de todos los elementos de A relacionados con xes decir x = R(x) = y isin A|xRy donde la primera notacioacuten se usa si la relacioacuten con laque se estaacute tratando se sobreentiende y la segunda si no es asiacute
La funcioacuten (clasesEquivalencia xs r) devuelve las clases de la relacioacuten de equi-valencia r en xs
-- | Ejemplo
-- gtgtgt let r = [(xy) | x lt- [15] y lt- [15] even (x-y)]
-- gtgtgt clasesEquivalencia [15] r
-- [[135][24]]
clasesEquivalencia Ord a =gt [a] -gt [(aa)] -gt [[a]]
clasesEquivalencia _ [] = []
clasesEquivalencia [] _ = []
clasesEquivalencia (xxs) r = (xc) clasesEquivalencia (xs c) r
where c = filter (estaRelacionado r x) xs
23 Funciones
Definicioacuten 231 Dada una relacioacuten F entre A y B se diraacute que es una funcioacuten si es unarelacioacuten binaria es funcional y todos los elementos de A estaacuten en el dominio
La funcioacuten (esFuncion xs ys f) se verifica si f es una funcioacuten de xs en ys
-- | Ejemplos
-- gtgtgt esFuncion [13] [247] [(17)(32)]
44 Capiacutetulo 2 Relaciones y funciones
-- True
-- gtgtgt esFuncion [13] [247] [(17)]
-- False
-- gtgtgt esFuncion [13] [247] [(14)(17)(32)]
-- False
esFuncion (Ord a Ord b) =gt [a] -gt [b] -gt [(ab)] -gt Bool
esFuncion xs ys f =
esRelacion xs ys f ampamp
xs `esSubconjunto` dominio f ampamp
esFuncional f
Nota 231 A lo largo de la seccioacuten representaremos a las funciones como listas depares
type Funcion a b = [(ab)]
La funcioacuten (funciones xs ys) devuelve todas las posibles funciones del conjuntoxs en ys
-- | Ejemplos
-- gtgtgt pp $ funciones [12] [34]
-- [[(1 3)(2 3)][(1 3)(2 4)][(1 4)(2 3)]
-- [(1 4)(2 4)]]
-- gtgtgt pp $ funciones [12] [345]
-- [[(1 3)(2 3)][(1 3)(2 4)][(1 3)(2 5)]
-- [(1 4)(2 3)][(1 4)(2 4)][(1 4)(2 5)]
-- [(1 5)(2 3)][(1 5)(2 4)][(1 5)(2 5)]]
-- gtgtgt pp $ funciones [012] [34]
-- [[(0 3)(1 3)(2 3)][(0 3)(1 3)(2 4)]
-- [(0 3)(1 4)(2 3)][(0 3)(1 4)(2 4)]
-- [(0 4)(1 3)(2 3)][(0 4)(1 3)(2 4)]
-- [(0 4)(1 4)(2 3)][(0 4)(1 4)(2 4)]]
funciones [a] -gt [b] -gt [Funcion a b]
funciones xs ys =
[zip xs zs | zs lt- variacionesR (length xs) ys]
231 Imagen por una funcioacuten
Definicioacuten 232 Si f es una funcioacuten entre A y B y x es un elemento del conjunto A laimagen del elemento x por la funcioacuten f es el valor asociado a x por la funcioacuten f
La funcioacuten (imagen f x) es la imagen del elemento x en la funcioacuten f
-- | Ejemplos
-- gtgtgt imagen [(17)(32)] 1
-- 7
-- gtgtgt imagen [(17)(32)] 3
23 Funciones 45
-- 2
imagen (Ord a Ord b) =gt Funcion a b -gt a -gt b
imagen f x = head (imagenRelacion f x)
La funcioacuten (imagenConjunto f xs) es la imagen del conjunto xs en la funcioacuten f
-- | Ejemplos
-- gtgtgt imagenConjunto [(17)(32)(43)] [14]
-- [73]
-- gtgtgt imagenConjunto [(17)(32)] [31]
-- [27]
imagenConjunto (Ord a Ord b) =gt Funcion a b -gt [a] -gt [b]
imagenConjunto f xs = nub (map (imagen f) xs)
232 Funciones inyectivas
Definicioacuten 233 Diremos que una funcioacuten f entre dos conjuntos es inyectiva 2 si a ele-mentos distintos del dominio le corresponden elementos distintos de la imagen es decir siforalla b isin dominio( f ) tales que a 6= b f (a) 6= f (b)
La funcioacuten (esInyectiva fs) se verifica si la funcioacuten fs es inyectiva
-- | Ejemplos
-- gtgtgt esInyectiva [(14)(25)(36)]
-- True
-- gtgtgt esInyectiva [(14)(25)(34)]
-- False
-- gtgtgt esInyectiva [(14)(25)(36)(36)]
-- True
esInyectiva (Ord a Ord b) =gt Funcion a b -gt Bool
esInyectiva f =
all esUnitario [antiImagenRelacion f y | y lt- rango f]
233 Funciones sobreyectivas
Definicioacuten 234 Diremos que una funcioacuten f entre dos conjuntos A y B es sobreyectiva3 si todos los elementos de B son imagen de alguacuten elemento de A
La funcioacuten (esSobreyectiva xs ys f) se verifica si la funcioacuten f es sobreyectiva Ala hora de definirla estamos contando con que f es una funcioacuten entre xs y ys
-- | Ejemplos
-- gtgtgt esSobreyectiva [123] [456] [(14)(25)(36)]
2httpsenwikipediaorgwikiInjective_function3httpsenwikipediaorgwikiSurjective_function
46 Capiacutetulo 2 Relaciones y funciones
-- True
-- gtgtgt esSobreyectiva [123] [456] [(14)(25)(34)]
-- False
-- gtgtgt esSobreyectiva [123] [456] [(14)(24)(36)(36)]
-- False
esSobreyectiva (Ord aOrd b) =gt [a] -gt [b] -gt Funcion a b -gt Bool
esSobreyectiva _ ys f = ys `esSubconjunto` rango f
234 Funciones biyectivas
Definicioacuten 235 Diremos que una funcioacuten f entre dos conjuntos A y B es biyectiva 4 sicada elementos de B es imagen de un uacutenico elemento de A
La funcioacuten (esBiyectiva xs ys f) se verifica si la funcioacuten f es biyectiva
-- | Ejemplos
-- gtgtgt esBiyectiva [123] [456] [(14)(25)(36)(36)]
-- True
-- gtgtgt esBiyectiva [123] [456] [(14)(25)(34)]
-- False
-- gtgtgt esBiyectiva [123] [4567] [(14)(25)(36)]
-- False
esBiyectiva (Ord a Ord b) =gt [a] -gt [b] -gt Funcion a b -gt Bool
esBiyectiva xs ys f =
esInyectiva f ampamp esSobreyectiva xs ys f
La funciones biyecciones1 xs ys y biyecciones2 xs ys devuelven la lista de to-das las biyecciones entre los conjuntos xs y ys La primera lo hace filtrando las fun-ciones entre los conjuntos que son biyectivas y la segunda lo hace construyendouacutenicamente las funciones biyectivas entre los conjuntos con el consecuente ahorrocomputacional
ghcigt length (biyecciones1 [17] [ag])
5040
(1675 secs 4146744104 bytes)
ghcigt length (biyecciones2 [17] [ag])
5040
(002 secs 0 bytes)
ghcigt length (biyecciones1 [16] [ag])
0
(253 secs 592625824 bytes)
ghcigt length (biyecciones2 [16] [ag])
0
(001 secs 0 bytes)
4httpsenwikipediaorgwikiBijective_function
23 Funciones 47
biyecciones1 (Ord a Ord b) =gt [a] -gt [b] -gt [Funcion a b]
biyecciones1 xs ys =
filter (esBiyectiva xs ys) (funciones xs ys)
biyecciones2 (Ord a Ord b) =gt [a] -gt [b] -gt [Funcion a b]
biyecciones2 xs ys
| length xs = length ys = []
| otherwise = [zip xs zs | zs lt- permutations ys]
Nota 232 En lo que sigue trabajaremos con la funcioacuten biyecciones2 asiacute que laredefiniremos como biyecciones
biyecciones (Ord a Ord b) =gt [a] -gt [b] -gt [Funcion a b]
biyecciones = biyecciones2
235 Inversa de una funcioacuten
Definicioacuten 236 Si f es una funcioacuten biyectiva entre los conjuntos A y B definimos lafuncioacuten inversa 5 como la funcioacuten que a cada elemento de B le hace corresponder el elementode A del que es imagen en B
El valor de (inversa f) es la funcioacuten inversa de f
-- | Ejemplos
-- gtgtgt inversa [(14)(25)(36)]
-- [(41)(52)(63)]
-- gtgtgt sort (inversa [(1f)(2m)(3a)])
-- [(a3)(f1)(m2)]
inversa (Ord a Ord b) =gt Funcion a b -gt Funcion b a
inversa f = listaAConjunto [(yx) | (xy) lt- f]
Nota 233 Para considerar la inversa de una funcioacuten esta tiene que ser biyectivaLuego (inversa f) asigna a cada elemento del conjunto imagen (que en este casocoincide con la imagen) uno y solo uno del conjunto de salida
La funcioacuten (imagenInversa f y) devuelve el elemento del conjunto de salida de lafuncioacuten f tal que su imagen es y
-- | Ejemplos
-- gtgtgt imagenInversa [(14)(25)(36)] 5
-- 2
-- gtgtgt imagenInversa [(1f)(2m)(3a)] a
-- 3
imagenInversa (Ord a Ord b) =gt Funcion a b -gt b -gt a
imagenInversa f = imagen (inversa f)
5httpsenwikipediaorgwikiInverse_function
48 Capiacutetulo 2 Relaciones y funciones
Capiacutetulo 3
Introduccioacuten a la teoriacutea de grafos
Se dice que la Teoriacutea de Grafos tiene su origen en 1736 cuando Euler dio una so-lucioacuten al problema (hasta entonces no resuelto) de los siete puentes de Koumlnigsbergiquestexiste un camino que atraviese cada uno de los puentes exactamente una vezPara probar que no era posible Euler sustituyoacute cada regioacuten por un nodo y cadapuente por una arista creando el primer grafo que fuera modelo de un problemamatemaacutetico
Figura 31 Dibujo de los puentes de Koumlnigsberg
A
B
C
D
b
c
a
d
f
e
g
Figura 32 Modelo de los puentes de Koumlnigsberg
Desde entonces se ha ido desarrollando esta metodologiacutea hasta convertise en los uacutel-timos antildeos en una herramienta importante en aacutereas del conocimiento muy variadascomo por ejemplo la Investigacioacuten Operativa la Computacioacuten la Ingenieriacutea Eleacutec-trica la Geografiacutea y la Quiacutemica Es por ello que ademaacutes se ha erigido como unanueva disciplina matemaacutetica que generalmente asociada a las ramas de Topologiacuteay AacutelgebraLa utilidad de los grafos se basa en su gran poder de abstraccioacuten y una representa-cioacuten muy clara de cualquier relacioacuten lo que facilita enormemente tanto la fase demodelado como la de resolucioacuten de cualquier problema Gracias a la Teoriacutea de Gra-fos se han desarrollado una gran variedad de algoritmos y meacutetodos de decisioacuten quepodemos implementar a traveacutes de lenguajes funcionales y permiten automatizar laresolucioacuten de muchos problemas a menudo tediosos de resolver a mano
49
50 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
31 Definicioacuten de grafo
En primer lugar vamos a introducir terminologiacutea baacutesica en el desarrollo de la Teoriacuteade Grafos
Definicioacuten 311 Un grafo G es un par (V A) donde V es el conjunto cuyos elementosllamamos veacutertices (o nodos) y A es un conjunto cuyos elementos llamamos aristas
Definicioacuten 312 Una arista de un grafo G = (V A) es un conjunto de dos elementosde V Es decir para dos veacutertices v vprime de G (v vprime) y (vprime v) representa la misma arista
Definicioacuten 313 Dado un grafo G = (V A) diremos que un veacutertice v isin V es adyacentea vprime isin V si (vprime v) isin A
Definicioacuten 314 Si en un grafo dirigido se permiten aristas repetidas lo llamaremos mul-tigrafo Si no se permiten lo llamaremos grafo regular
Nota 311 Denotaremos por |V| al nuacutemero de veacutertices y por |A| al nuacutemero de aristasdel grafo (V A)
Ejemplo 312 Sea G = (V A) un grafo con V = a b c d y A = (a b) (a c) (b d)(d d) En este grafo los veacutertices a d son adyacentes a b
a
b
c
d
32 El TAD de los grafos
En esta seccioacuten nos planteamos la tarea de implementar las definiciones presenta-das anteriormente en un lenguaje funcional En nuestro caso el lenguaje que utili-zaremos seraacute Haskell Definiremos el Tipo Abstracto de Dato (TAD) de los grafos ydaremos algunos ejemplos de posibles representaciones de grafos con las que po-dremos trabajarSi consideramos un grafo finito cualquiera G = (V A) podemos ordenar el conjun-to de los veacutertices y representarlo como V = v1 vn con n = |V|En primer lugar necesitaremos crear un tipo (Grafo) cuya definicioacuten sea compatiblecon la entidad matemaacutetica que representa y que nos permita definir las operacionesque necesitamos para trabajar con los grafos Estas operaciones son
32 El TAD de los grafos 51
creaGrafo -- [a] -gt [(aa)] -gt Grafo a
vertices -- Grafo a -gt [a]
adyacentes -- Grafo a -gt a -gt [a]
aristaEn -- (aa) -gt Grafo a -gt Bool
aristas -- Grafo a -gt [(aa)]
dondebull (creaGrafo vs as) es un grafo tal que el conjunto de sus veacutertices es vs y el de
sus aristas es asbull (vertices g) es la lista de todos los veacutertices del grafo gbull (adyacentes g v) es la lista de los veacutertices adyacentes al veacutertice v en el grafo gbull (aristaEn a g) se verifica si a es una arista del grafo gbull (aristas g) es la lista de las aristas del grafo g
Nota 321 Las funciones que aparecen en la especificacioacuten del TAD no dependende la representacioacuten que elijamos
Ejemplo 322 Veamos un ejemplo de creacioacuten de grafo y su representacioacuten graacutefica
creaGrafo [15] [(12)(13)(15)(24)
(25)(34)(35)(45)]
1
2
34
5
321 Grafos como listas de aristas
En el moacutedulo GrafoConListaDeAristas se definen las funciones del TAD de losgrafos dando su representacioacuten como conjuntos de aristas es decir representandoa un grafo como dos conjuntos la primera seraacute la lista ordenada de los veacutertices y lasegunda la lista ordenada de las aristas (en ambas listas se excluye la posibilidad derepeticiones)
Nota 323 Las ventajas de usar arrays frente a usar listas es que los array tienenacceso constante (O(1)) a sus elementos mientras que las listas tienen acceso lineal(O(n)) y que la actualizacioacuten de un elemento en un array no supone espacio extraSin embargo los arrays son representaciones muy riacutegidas cualquier modificacioacutenen su estructura como cambiar su tamantildeo supone un gran coste computacionalpues se tendriacutea que crear de nuevo el array y ademaacutes sus iacutendices deben pertenecer
52 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
a la clase de los objetos indexables (Ix) luego perdemos mucha flexibilidad en larepresentacioacuten
- LANGUAGE DeriveGeneric -
module GrafoConListaDeAristas
( Grafo
creaGrafo -- [a] -gt [(aa)] -gt Grafo a
vertices -- Grafo a -gt [a]
adyacentes -- Grafo a -gt a -gt [a]
aristaEn -- (aa) -gt Grafo a -gt Bool
aristas -- Grafo a -gt [(aa)]
) where
En las definiciones del presente moacutedulo se usaraacuten las funciones nub y sort de lalibreriacutea DataList
Vamos a definir un nuevo tipo de dato (Grafo a) que representaraacute un grafo a partirde la lista de sus veacutertices (donde los veacutertices son de tipo a) y de aristas (que son paresde veacutertices)
data Grafo a = G [a] [(aa)]
deriving (Eq Show Generic)
instance (Out a) =gt Out (Grafo a)
Las funciones baacutesicas que definiremos a partir de este tipo coincidiraacuten con las indi-cadas en el TAD de los grafosbull (creaGrafo vs as) es el grafo cuyo conjunto de veacutertices es cs y el de sus aristas
es as-- | Ejemplo
-- gtgtgt creaGrafo [15] [(12)(14)(15)(23)(25)(34)(35)]
-- G [12345] [(12)(14)(15)(23)(25)(34)(35)]
creaGrafo Ord a =gt [a] -gt [(aa)] -gt Grafo a
creaGrafo vs as =
G (sort vs) (nub (sort [parOrdenado a | a lt- as]))
parOrdenado Ord a =gt (aa) -gt (aa)
parOrdenado (xy) | x lt= y = (xy)
| otherwise = (yx)
Ejemplo 324 ejGrafo es el grafo
32 El TAD de los grafos 53
1
2
3
4
5
Los ejemplos usaraacuten el siguiente grafo
ejGrafo Grafo Int
ejGrafo = creaGrafo [15]
[(12)(14)(15)(23)(25)(34)(35)(45)]
bull (vertices g) es la lista de los veacutertices del grafo g
-- | Ejemplo
-- gtgtgt vertices ejGrafo
-- [12345]
vertices Grafo a -gt [a]
vertices (G vs _) = vs
bull (adyacentes g v) es la lista de los veacutertices adyacentes al veacutertice v en el grafo g
-- | Ejemplos
-- gtgtgt adyacentes ejGrafo 4
-- [135]
-- gtgtgt adyacentes ejGrafo 3
-- [245]
adyacentes Eq a =gt Grafo a -gt a -gt [a]
adyacentes (G _ as) v =
[u | (ux) lt- as x == v] `union` [u | (xu) lt- as x == v]
bull (aristaEn a g) se verifica si a es una arista del grafo g
-- | Ejemplos
-- gtgtgt (51) `aristaEn` ejGrafo
-- True
-- gtgtgt (31) `aristaEn` ejGrafo
-- False
aristaEn Ord a =gt (aa) -gt Grafo a -gt Bool
aristaEn a (G _ as) = parOrdenado a `elem` as
bull (aristas g) es la lista de las aristas del grafo g
-- | Ejemplo
-- gtgtgt aristas ejGrafo
-- [(12)(14)(15)(23)(25)(34)(35)(45)]
aristas Grafo a -gt [(aa)]
aristas (G _ as) = as
54 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
33 Generador de grafos
En esta seccioacuten presentaremos el generador de grafos que nos permitiraacute generargrafos como listas de aristas arbitrariamente y usarlos como ejemplos o para com-probar propiedadesPara aprender a controlar el tamantildeo de los grafos generados he consultado las si-guientes fuentes QuickCheck A Lightweight Tool for Random Testing of Haskell Programs 1
([3]) Property Testing using QuickCheck 2 ([9])(generaGrafos n) es un generador de grafos de hasta n veacutertices Por ejemplo
ghcigt sample (generaGrafo 5)
G [12] []
G [1] [(11)]
G [] []
G [1234] [(22)]
G [123] [(11)(12)(13)(22)]
G [12345] [(12)(14)(15)(22)(23)(24)(33)(34)(44)(45)]
G [1] []
G [123] [(12)(22)(33)]
G [1234] [(11)(14)(23)(24)(33)(34)(44)]
G [12] []
G [123] [(11)(12)(22)(33)]
ghcigt sample (generaGrafo 2)
G [12] [(12)(22)]
G [12] [(11)]
G [12] [(11)(12)]
G [] []
G [1] [(11)]
G [1] []
G [1] []
G [] []
G [] []
G [] []
G [1] [(11)]
generaGrafo Int -gt Gen (Grafo Int)
generaGrafo s = do
let m = s `mod` 11
n lt- choose (0m)
as lt- sublistOf [(xy) | x lt- [1n] y lt- [xn]]
return (creaGrafo [1n] as)
1httpswwweecsnorthwesternedu~robbycourses395-495-2009-fallquickpdf2httpswwwdccfcuppt~pbvaulastapfslidesquickcheckhtml
34 Ejemplos de grafos 55
Nota 331 Los grafos estaacuten contenidos en la clase de los objetos generables aleato-riamente
instance Arbitrary (Grafo Int) where
arbitrary = sized generaGrafo
En el siguiente ejemplo se pueden observar algunos grafos generados
ghcigt sample (arbitrary Gen (Grafo Int))
G [] []
G [1] [(11)]
G [12] [(11)(12)]
G [1] [(11)]
G [12345678] [(14)(17)(22)(23)(25)(28)(35)
(36)(38)(44)(46)(47)(48)(56)(66)(67)(78)]
G [12345] [(11)(12)(14)(15)(24)(25)(34)(55)]
G [] []
G [] []
G [123] [(11)(22)(23)]
G [1234] [(11)(12)(14)(22)(33)]
G [1234567] [(11)(15)(16)(17)(22)(24)(25)
(26)(27)(33)(35)(46)(47)(55)(57)(66)(77)]
34 Ejemplos de grafos
El objetivo de esta seccioacuten es reunir una coleccioacuten de grafos lo suficientemente ex-tensa y variada como para poder utilizarla como recurso a la hora de comprobar laspropiedades y definiciones de funciones que implementaremos maacutes adelanteEn el proceso de recopilacioacuten de ejemplos se ha trabajado con diversas fuentesbull los apuntes de la asignatura ldquoMatemaacutetica discretardquo ([4])bull los temas de la asignatura ldquoInformaacuteticardquo ([1]) ybull el artiacuteculo ldquoGraph theoryrdquo ([11]) de la Wikipedia
Nota 341 Se utilizaraacute la representacioacuten de los grafos como listas de aristas
341 Grafo nulo
Definicioacuten 341 Un grafo nulo es un grafo que no tiene ni veacutertices ni aristas
La funcioacuten (grafoNulo) devuelve un grafo nulo
grafoNulo Ord a =gt Grafo a
grafoNulo = creaGrafo [] []
La funcioacuten (esGrafoNulo g) se verifica si g es un grafo nulo
56 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- | Ejemplos
-- gtgtgt esGrafoNulo grafoNulo
-- True
-- gtgtgt esGrafoNulo (creaGrafo [] [(12)])
-- False
-- gtgtgt esGrafoNulo (creaGrafo [12] [(12)])
-- False
esGrafoNulo Grafo a -gt Bool
esGrafoNulo g =
null (vertices g) ampamp null (aristas g)
342 Grafo ciclo
Definicioacuten 342 Un ciclo 3 de orden n C(n) es un grafo no dirigido y no ponderadocuyo conjunto de veacutertices viene dado por V = 1 n y el de las aristas por A = (0 1)(1 2) (nminus 2 nminus 1) (nminus 1 0)
La funcioacuten (grafoCiclo n) nos genera el ciclo de orden n
1
23
45
-- | Ejemplos
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
grafoCiclo Int -gt Grafo Int
grafoCiclo 0 = grafoNulo
grafoCiclo 1 = creaGrafo [1] []
grafoCiclo n = creaGrafo [1n]
([(uu+1) | u lt- [1n-1]] ++ [(n1)])
343 Grafo de la amistad
Definicioacuten 343 Un grafo de la amistad 4 de orden n es un grafo con 2n + 1 veacuterticesy 3n aristas formado uniendo n copias del ciclo C3 por un veacutertice comuacuten Lo denotamos porFn3httpseswikipediaorgwikiGrafo_completo4httpseswikipediaorgwikiGrafo_de_la_amistad
34 Ejemplos de grafos 57
La funcioacuten (grafoAmistad n) genera el grafo de la amistad de orden n Por ejemplo
1
2
34
5
1
2
3
4
5
6
7
-- | Ejemplos
-- gtgtgt pp $ grafoAmistad 2
-- G [12345]
-- [(1 2)(1 3)(1 4)(1 5)(2 3)(4 5)]
-- gtgtgt pp $ grafoAmistad 3
-- G [1234567]
-- [(1 2)(1 3)(1 4)(1 5)(1 6)(1 7)(2 3)
-- (4 5)(6 7)]
grafoAmistad Int -gt Grafo Int
grafoAmistad n =
creaGrafo [12n+1]
([(1a) | a lt- [22n+1]] ++
[(ab) | (ab) lt-zip [242n] [352n+1]])
344 Grafo completo
Definicioacuten 344 El grafo completo 5 de orden n K(n) es un grafo no dirigido cuyoconjunto de veacutertices viene dado por V = 1 n y tiene una arista entre cada par deveacutertices distintos
La funcioacuten (completo n) nos genera el grafo completo de orden n Por ejemplo
5httpseswikipediaorgwikiGrafo_completo
58 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
1
2
3
4
-- | Ejemplo
-- gtgtgt completo 4
-- G [1234] [(12)(13)(14)(23)(24)(34)]
completo Int -gt Grafo Int
completo n =
creaGrafo [1n]
[(ab) | a lt- [1n] b lt- [1a-1]]
345 Grafo bipartito
Definicioacuten 345 Un grafo bipartito 6 es un grafo G = (V A) verificando que elconjunto de sus veacutertices se puede dividir en dos subconjuntos disjuntos V1 V2 tales queV1 cupV2 = V de manera que forallu1 u2 isin V1[(u1 u2) 6isin A] y forallv1 v2 isin V2[(v1 v2) 6isin A]Un grafo bipartito completo 7 seraacute entonces un grafo bipartito G = (V1 cup V2 A) en elque todos los veacutertices de una particioacuten estaacuten conectados a los de la otra Si n = |V1| m =
|V2| denotamos al grafo bipartito G = (V1 cupV2 A) por Knm
La funcioacuten (bipartitoCompleto n m) nos genera el grafo bipartito Knm Por ejem-plo
1 2
3 4 5
-- | Ejemplo
-- gtgtgt bipartitoCompleto 2 3
-- G [12345] [(13)(14)(15)(23)(24)(25)]
bipartitoCompleto Int -gt Int -gt Grafo Int
bipartitoCompleto n m =
creaGrafo [1n+m]
[(ab) | a lt- [1n] b lt- [n+1n+m]]
6httpseswikipediaorgwikiGrafo_bipartito7httpseswikipediaorgwikiGrafo_bipartito_completo
34 Ejemplos de grafos 59
La funcioacuten (conjuntosVerticesDisjuntos g) devuelve Nothing si el grafo g no esbipartito y Just(xsys) si lo es donde xs ys es una particioacuten disjunta de los veacuterticesde g
-- | Ejemplo
-- gtgtgt conjuntosVerticesDisjuntos (bipartitoCompleto 3 4)
-- Just ([321][7654])
-- gtgtgt conjuntosVerticesDisjuntos (grafoCiclo 5)
-- Nothing
-- gtgtgt conjuntosVerticesDisjuntos (grafoCiclo 6)
-- Just ([531][642])
conjuntosVerticesDisjuntos Ord a =gt Grafo a -gt Maybe ([a][a])
conjuntosVerticesDisjuntos g
| null (vertices g) = Just ([][])
| otherwise = aux (vertices g) [] [] [] []
where u = union
a = adyacentes g
d xs x = xs [x]
aux [] _ _ r b = if (null (intersect r b))
then (Just (rb))
else Nothing
aux (vvs) [] [] [] [] = aux vs (a v) [v] [v] []
aux (vvs) [] c r b
| null (a v) = aux vs [] (vc) (vr) b
| null ((a v) c) =
if (or [elem u r | u lt- (a v)])
then (if (or [elem u b | u lt- (a v)])
then Nothing
else (aux vs [] (vc) r (vb)))
else (aux vs [] (vc) (vr) b)
| otherwise =
if (or [elem u r | u lt- (a v)])
then (if (or [elem u b | u lt- (a v)])
then Nothing
else (aux vs ((a v) c) (vc) r (vb)))
else (aux vs ((a v) c) (vc) (vr) b)
aux vs (qqs) c r b
| null ((a q) c) =
if (or [elem u r | u lt- (a q)])
then (if (or [elem u b | u lt- (a q)])
then Nothing
else (aux (d vs q) qs (qc) r (qb)))
else (aux (d vs q) qs (qc) (qr) b)
| otherwise =
if (or [elem u r | u lt- (a q)])
then (if (or [elem u b | u lt- (a q)])
then Nothing
else (aux (d vs q) (u ((a q) c) qs)
60 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
(qc) r (qb)))
else (aux (d vs q) (u ((a q) c) qs)
(qc) (qr) b)
La funcioacuten (esBipartito g) se verifica si el grafo g es bipartito
-- | Ejemplo
-- gtgtgt esBipartito (bipartitoCompleto 3 4)
-- True
-- gtgtgt esBipartito (grafoCiclo 5)
-- False
-- gtgtgt esBipartito (grafoCiclo 6)
-- True
esBipartito Ord a =gt Grafo a -gt Bool
esBipartito g = isJust (conjuntosVerticesDisjuntos g)
346 Grafo estrella
Definicioacuten 346 Una estrella 8 de orden n es el grafo bipartito completo K1n Denota-remos a una estrella de orden n por Sn Una estrella con 3 aristas se conoce en ingleacutes comoclaw (garra o garfio)
La funcioacuten (grafoEstrella n) crea un grafo circulante a partir de su orden n
2
34
56
1
-- | Ejemplo
-- gtgtgt grafoEstrella 5
-- G [123456] [(12)(13)(14)(15)(16)]
grafoEstrella Int -gt Grafo Int
grafoEstrella = bipartitoCompleto 1
347 Grafo rueda
Definicioacuten 347 Un grafo rueda 9 de orden n es un grafo no dirigido y no ponderado conn veacutertices que se forma conectando un uacutenico veacutertice a todos los veacutertices de un ciclo Cnminus1 Lodenotaremos por Wn8httpsenwikipediaorgwikiStar_(graph_theory))9httpseswikipediaorgwikiGrafo_rueda
34 Ejemplos de grafos 61
La funcioacuten (grafoRueda n) crea un grafo rueda a partir de su orden n
2
34
56
1
-- | Ejemplo
-- gtgtgt pp $ grafoRueda 6
-- G [123456]
-- [(1 2)(1 3)(1 4)(1 5)(1 6)(2 3)(2 6)
-- (3 4)(4 5)(5 6)]
grafoRueda Int -gt Grafo Int
grafoRueda n =
creaGrafo [1n]
([(1a) | a lt- [2n]] ++
[(ab) | (ab) lt- zip (2[2n-1]) (3n[4n])])
348 Grafo circulante
Definicioacuten 348 Un grafo circulante 10 de orden n ge 3 y saltos s1 sk es un grafono dirigido y no ponderado G = (1 n A) en el que cada nodo foralli isin V es adyacente alos 2k nodos iplusmn s1 iplusmn sk mod n Lo denotaremos por Cirs1sk
n
La funcioacuten (grafoCirculante n ss) crea un grafo circulante a partir de su orden n
y de la lista de sus saltos ss Por ejemplo
2
34
5
6 1
-- | Ejemplo
-- gtgtgt pp $ grafoCirculante 6 [12]
-- G [123456]
-- [(1 2)(1 3)(1 5)(1 6)(2 3)(2 4)(2 6)
-- (3 4)(3 5)(4 5)(4 6)(5 6)]
grafoCirculante Int -gt [Int] -gt Grafo Int
grafoCirculante n ss =
10httpsenwikipediaorgwikiCirculant_graph
62 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
creaGrafo [1n]
[(ab) | a lt- [1n]
b lt- sort (auxCir a ss n)
a lt b]
where auxCir v ss1 k =
concat [[fun (v+s) k fun (v-s) k] | s lt- ss1]
fun a b = if mod a b == 0 then b else mod a b
349 Grafo de Petersen generalizado
El grafo de Petersen generalizado 11 que denotaremos GPnk (con n ge 3 y 1 le k le(nminus 1)2) es un grafo formado por un grafo circulante Cirn
k en el interior rodeadopor un ciclo Cn al que estaacute conectado por una arista saliendo de cada veacutertice deforma que se creen n poliacutegonos regulares El grafo GPnk tiene 2n veacutertices y 3n aristasLa funcioacuten (grafoPetersenGen n k) devuelve el grafo de Petersen generalizadoGPnk
1
2
3
4
5
6
7
8
-- | Ejemplo
-- gtgtgt pp $ grafoPetersenGen 4 2
-- G [12345678]
-- [(1 3)(1 5)(2 4)(2 6)(3 7)(4 8)(5 6)
-- (5 8)(6 7)(7 8)]
grafoPetersenGen Int -gt Int -gt Grafo Int
grafoPetersenGen n k =
creaGrafo [12n]
(filter p (aristas (grafoCirculante n [k])) ++
[(xx+n) | x lt- [1n]] ++
(n+1n+2) (n+12n) [(xx+1) | x lt- [n+22n-1]])
where p (ab) = a lt b
11httpsenwikipediaorgwikiGeneralized_Petersen_graph
34 Ejemplos de grafos 63
3410 Otros grafos importantes
Grafo de Thomson
Definicioacuten 349 El grafo bipartito completo K33 es conocido como el grafo de Thomsony como veremos maacutes adelante seraacute clave a la hora de analizar propiedades topoloacutegicas de losgrafos
1 2 3
4 5 6
La funcioacuten (grafoThomson) genera el grafo de Thomson
-- | Ejemplo
-- gtgtgt pp $ grafoThomson
-- G [123456]
-- [(1 4)(1 5)(1 6)(2 4)(2 5)(2 6)(3 4)
-- (3 5)(3 6)]
grafoThomson Grafo Int
grafoThomson = bipartitoCompleto 3 3
Grafo de Heawood
El grafo de Heawood 12 es un grafo no dirigido regular con 14 veacutertices y 21 aris-tas Todos sus veacutertices son incidentes a exactamente 3 aristas es decir es un grafocuacutebico Tiene importantes propiedades geomeacutetricas y topoloacutegicas
1
2
3
45
6
7
8
9
10
11 12
13
14
12httpsenwikipediaorgwikiHeawood_graph
64 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten grafoHeawood genera el grafo de Heawood
-- | Ejemplo
-- gtgtgt pp $ grafoHeawood
-- G [1234567891011121314]
-- [(1 2)(1 6)(1 14)(2 3)(2 11)(3 4)(3 8)
-- (4 5)(4 13)(5 6)(5 10)(6 7)(7 8)(7 12)
-- (8 9)(9 10)(9 14)(10 11)(11 12)(12 13)
-- (13 14)]
grafoHeawood Grafo Int
grafoHeawood =
creaGrafo [114]
(aristas (grafoCiclo 14) ++
zip [1 23 4 5 7 9]
[611813101214])
Grafo de McGee
El grafo de McGee 13 es un grafo no dirigido cuacutebico con 24 veacutertices y 36 aristasTiene importantes propiedades geomeacutetricas y topoloacutegicas
1
2
3
45
6789
10
11
12
13
14
15
1617
18 19 2021
22
23
24
La funcioacuten grafoMcGee genera el grafo de McGee
-- | Ejemplo
-- gtgtgt pp $ grafoMcGee
-- G [12345678910111213141516171819
-- 2021222324]
-- [(1 2)(1 13)(1 24)(2 3)(2 9)(3 4)(3 20)
13httpsenwikipediaorgwikiMcGee_graph
34 Ejemplos de grafos 65
-- (4 5)(4 16)(5 6)(5 12)(6 7)(6 23)(7 8)
-- (7 19)(8 9)(8 15)(9 10)(10 11)(10 22)
-- (11 12)(11 18)(12 13)(13 14)(14 15)
-- (14 21)(15 16)(16 17)(17 18)(17 24)
-- (18 19)(19 20)(20 21)(21 22)(22 23)
-- (23 24)]
grafoMcGee Grafo Int
grafoMcGee =
creaGrafo [124]
(aristas (grafoCiclo 24) ++
zip [ 12 3 4 5 6 7 810111417]
[13920161223191522182124])
Grafo TuttendashCoxeter
El grafo TuttendashCoxeter 14 es un grafo no dirigido cuacutebico con 30 veacutertices y 45 aristasTiene importantes propiedades geomeacutetricas y topoloacutegicas
1
2
3
4
56
7891011
12
13
14
15
16
17
18
19
2021
22 23 24 2526
27
28
29
30
La funcioacuten grafoTutteCoxeter genera el grafo TuttendashCoxeter
-- | Ejemplo
-- gtgtgt pp $ grafoTutteCoxeter
-- G [12345678910111213141516171819
-- 2021222324252627282930]
14httpsenwikipediaorgwikiTutteT1textendashCoxeter_graph
66 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- [(1 2)(1 18)(1 30)(2 3)(2 23)(3 4)
-- (3 10)(4 5)(4 27)(5 6)(5 14)(6 7)(6 19)
-- (7 8)(7 24)(8 9)(8 29)(9 10)(9 16)
-- (10 11)(11 12)(11 20)(12 13)(12 25)
-- (13 14)(13 30)(14 15)(15 16)(15 22)
-- (16 17)(17 18)(17 26)(18 19)(19 20)
-- (20 21)(21 22)(21 28)(22 23)(23 24)
-- (24 25)(25 26)(26 27)(27 28)(28 29)
-- (29 30)]
grafoTutteCoxeter Grafo Int
grafoTutteCoxeter =
creaGrafo [130]
(aristas (grafoCiclo 30) ++
zip [ 1 2 3 4 5 6 7 8 9111213151721]
[182310271419242916202530222628])
Grafo de Petersen
El grafo de Petersen 15 se define como el grafo de Petersen generalizado GP52 esdecir es un grafo cuacutebico formado por los veacutertices de un pentaacutegono conectados alos veacutertices de una estrella de cinco puntas en la que cada nodo es adyacente a losnodos que estaacuten a un salto 2 de eacutel Es usado como ejemplo y como contraejemplo enmuchos problemas de la Teoriacutea de grafos
6
7
8 9
101
2
3 4
5
La funcioacuten grafoPetersen devuelve el grafo de Petersen
-- | Ejemplo
-- gtgtgt pp $ grafoPetersen
-- G [12345678910]
-- [(1 3)(1 4)(1 6)(2 4)(2 5)(2 7)(3 5)
-- (3 8)(4 9)(5 10)(6 7)(6 10)(7 8)(8 9)
-- (9 10)]
grafoPetersen Grafo Int
grafoPetersen = grafoPetersenGen 5 2
15httpsenwikipediaorgwikiPetersen_graph
35 Definiciones y propiedades 67
Grafo de MoeumlbiusndashCantor
El grafo de MoeumlbiusndashCantor 16 se define como el grafo de Petersen generalizadoGP83 es decir es un grafo cuacutebico formado por los veacutertices de un octoacutegono conecta-dos a los veacutertices de una estrella de ocho puntas en la que cada nodo es adyacente alos nodos que estaacuten a un salto 3 de eacutel Al igual que el grafo de Petersen tiene impor-tantes propiedades que lo hacen ser ejemplo y contraejemplo de muchos problemasde la Teoriacutea de Grafos
9
10
11
12
13
14
15
16
1
23
4
5
67
8
La funcioacuten grafoMoebiusCantor genera el grafo de MoeumlbiusndashCantor
-- | Ejemplo
-- gtgtgt pp $ grafoMoebiusCantor
-- G [12345678910111213141516]
-- [(1 4)(1 6)(1 9)(2 5)(2 7)(2 10)(3 6)
-- (3 8)(3 11)(4 7)(4 12)(5 8)(5 13)(6 14)
-- (7 15)(8 16)(9 10)(9 16)(10 11)(11 12)
-- (12 13)(13 14)(14 15)(15 16)]
grafoMoebiusCantor Grafo Int
grafoMoebiusCantor = grafoPetersenGen 8 3
35 Definiciones y propiedades
Una vez construida una pequentildea fuente de ejemplos estamos en condiciones deimplementar las definiciones sobre grafos en Haskell y ver que funcionan correc-tamente Ademaacutes comprobaremos que se cumplen las propiedades baacutesicas que sehan presentado en el tema Introduccioacuten a la teoriacutea de grafos de ldquoMatemaacutetica discretardquo([4])
16httpsenwikipediaorgwikiMoeumlbius-Kantor_graph
68 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Nota 351 Se utilizaraacute el tipo abstracto de grafos presentados en la seccioacuten 32 y seutilizaraacuten las librerias DataList y TestQuickCheck
351 Definiciones de grafos
Definicioacuten 351 El orden de un grafo G = (V A) se define como su nuacutemero de veacuterticesLo denotaremos por |V(G)|
La funcioacuten (orden g) devuelve el orden del grafo g
-- | Ejemplos
-- gtgtgt orden (grafoCiclo 4)
-- 4
-- gtgtgt orden (grafoEstrella 4)
-- 5
orden Grafo a -gt Int
orden = length vertices
Definicioacuten 352 El tamantildeo de un grafo G = (V A) se define como su nuacutemero de aristasLo denotaremos por |A(G)|
La funcioacuten (tamantildeo g) devuelve el orden del grafo g
-- | Ejemplos
-- gtgtgt tamantildeo (grafoCiclo 4)
-- 4
-- gtgtgt tamantildeo grafoPetersen
-- 15
tamantildeo Grafo a -gt Int
tamantildeo = length aristas
Definicioacuten 353 Diremos que dos aristas a aprime son incidentes si tienen interseccioacuten novaciacutea es decir si tienen alguacuten veacutertice en comuacuten
La funcioacuten (sonIncidentes a a) se verifica si las aristas a y a son incidentes
-- | Ejemplos
-- gtgtgt sonIncidentes (12) (24)
-- True
-- gtgtgt sonIncidentes (12) (34)
-- False
sonIncidentes Eq a =gt (aa) -gt (aa) -gt Bool
sonIncidentes (u1u2) (v1v2) =
or [u1 == v1 u1 == v2 u2 == v1 u2 == v2]
Definicioacuten 354 Diremos que una arista de un grafo G es un lazo si va de un veacutertice ensiacute mismo
35 Definiciones y propiedades 69
La funcioacuten (lazos g) devuelve los lazos del grafo g
-- | Ejemplos
-- gtgtgt lazos (creaGrafo [12] [(11)(12)(22)])
-- [(11)(22)]
-- gtgtgt lazos (grafoCiclo 5)
-- []
lazos Eq a =gt Grafo a -gt [(aa)]
lazos g = [(uv) | (uv) lt- aristas g u == v]
La funcioacuten (esLazo a) se verifica si la arista a es un lazo
-- | Ejemplos
-- gtgtgt esLazo (44)
-- True
-- gtgtgt esLazo (12)
-- False
esLazo Eq a =gt (aa) -gt Bool
esLazo (uv) = u == v
Definicioacuten 355 Dado un grafo G = (V A) fijado un veacutertice v isin V al conjunto deveacutertices que son adyacentes a v lo llamaremos entorno de v y lo denotaremos por N(v) =u isin V|(u v) isin A
La funcioacuten (entorno g v) devuelve el entorno del veacutertice v en el grafo g
-- | Ejemplo
-- gtgtgt entorno (creaGrafo [15] [(12)(13)(23)]) 2
-- [13]
entorno Eq a =gt Grafo a -gt a -gt [a]
entorno = adyacentes
Definicioacuten 356 Sea G = (V A) un grafo El grado (o valencia) de v isin V es grad(v) =|N(v)|
La funcioacuten (grado g v) devuelve el grado del veacutertice v en el grafo g
-- | Ejemplos
-- gtgtgt grado (creaGrafo [15] [(12)(13)(23)]) 2
-- 2
-- gtgtgt grado (grafoEstrella 5) 1
-- 5
grado Eq a =gt Grafo a -gt a -gt Int
grado g v = length (entorno g v)
Definicioacuten 357 Un veacutertice v de un grafo es aislado si su grado es 0
La funcioacuten (esAislado g v) se verifica si el veacutertice v es aislado en el grafo g
70 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- | Ejemplos
-- gtgtgt esAislado (creaGrafo [15] [(12)(13)(23)]) 4
-- True
-- gtgtgt esAislado (creaGrafo [15] [(12)(13)(23)]) 3
-- False
esAislado Eq a =gt Grafo a -gt a -gt Bool
esAislado g v = grado g v == 0
Definicioacuten 358 Un grafo es regular si todos sus veacutertices tienen el mismo grado
La funcioacuten (esRegular g) se verifica si el grafo g es regular
-- | Ejemplos
-- gtgtgt esRegular (creaGrafo [13] [(12)(13)(23)])
-- True
-- gtgtgt esRegular (creaGrafo [14] [(12)(13)(24)])
-- False
esRegular Eq a =gt Grafo a -gt Bool
esRegular g = all (==x) xs
where (xxs) = [grado g v | v lt- vertices g]
Definicioacuten 359 Dado un grafo G = (V A) llamamos valencia miacutenima o grado miacuteni-mo de G al valor δ(G) = mıngrad(v)|v isin V
La funcioacuten (valenciaMin g) devuelve la valencia miacutenima del grafo g
-- | Ejemplo
-- gtgtgt valenciaMin (creaGrafo [14] [(12)(13)(24)])
-- 1
valenciaMin Ord a =gt Grafo a -gt Int
valenciaMin g = minimum [grado g v | v lt- vertices g]
Definicioacuten 3510 Dado un grafo G = (V A) llamamos valencia maacutexima o gradomaacuteximo de G al valor δ(G) = maxgrad(v)|v isin V
La funcioacuten (valenciaMax g) devuelve la valencia maacutexima del grafo g
-- | Ejemplo
-- gtgtgt valenciaMax (creaGrafo [14] [(12)(13)(24)])
-- 2
valenciaMax Ord a =gt Grafo a -gt Int
valenciaMax g = maximum [grado g v | v lt- vertices g]
Definicioacuten 3511 Se dice que un grafo es simple si no contiene lazos ni aristas repetidas
La funcioacuten (esSimple g) se verifica si g es un grafo simple
35 Definiciones y propiedades 71
-- | Ejemplos
-- gtgtgt esSimple (creaGrafo [13] [(12)(13)(23)])
-- True
-- gtgtgt esSimple (creaGrafo [13] [(11)(12)(23)])
-- False
esSimple Ord a =gt Grafo a -gt Bool
esSimple g =
and [not ((xx) `aristaEn` g) | x lt- vertices g]
Definicioacuten 3512 Sea G un grafo Llamamos secuencia de grados de G a la lista degrados de sus veacutertices La secuencia se suele presentar en orden decreciente d1 ge d2 gemiddot middot middot ge dn
La funcioacuten (secuenciaGrados g) devuelve la secuencia de los grados del grafo g enorden decreciente
-- | Ejemplo
-- gtgtgt secuenciaGrados (creaGrafo [15] [(12)(13)(14)(24)])
-- [32210]
secuenciaGrados Eq a =gt Grafo a -gt [Int]
secuenciaGrados g = sortBy (flip compare) [grado g v | v lt- vertices g]
Nota 352 iquestQueacute listas de n nuacutemeros enteros son secuencias de grafos de n veacuterticesbull Si sumn
i=1 di es impar no hay ningunobull Si sumn
i=1 di es par entonces siempre hay un grafo con esa secuencia de grados (aun-que no necesariamente simple)
Definicioacuten 3513 Una secuencia graacutefica es una lista de nuacutemero enteros no negativos quees la secuencia de grados para alguacuten grafo simple
La funcioacuten (secuenciaGrafica ss) se verifica si existe alguacuten grafo con la secuenciade grados ss
-- | Ejemplos
-- gtgtgt secuenciaGrafica [32210]
-- True
-- gtgtgt secuenciaGrafica [3222]
-- False
secuenciaGrafica [Int] -gt Bool
secuenciaGrafica ss = even (sum ss) ampamp all p ss
where p s = s gt= 0 ampamp s lt= length ss
Definicioacuten 3514 Dado un grafo G = (V A) diremos que Gprime = (Vprime Aprime) es un subgrafode G si Vprime sube V y Aprime sube A
72 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (esSubgrafo g g) se verifica si g es un subgrafo de g
-- |Ejemplos
-- gtgtgt esSubgrafo (bipartitoCompleto 3 2) (bipartitoCompleto 3 3)
-- True
-- gtgtgt esSubgrafo (grafoEstrella 4) (grafoEstrella 5)
-- True
-- gtgtgt esSubgrafo (completo 5) (completo 4)
-- False
-- gtgtgt esSubgrafo (completo 3) (completo 4)
-- True
esSubgrafo Ord a =gt Grafo a -gt Grafo a -gt Bool
esSubgrafo g g =
vertices g `esSubconjunto` vertices g ampamp
aristas g `esSubconjunto` aristas g
Definicioacuten 3515 Si Gprime = (Vprime Aprime) es un subgrafo de G = (V A) tal que Vprime = Vdiremos que Gprime es un subgrafo maximal grafo recubridor o grafo de expansioacuten (eningleacutes spanning grah) de G
La funcioacuten (esSubgrafoMax g g) se verifica si g es un subgrafo maximal de g
-- | Ejemplos
-- gtgtgt esSubgrafoMax (grafoRueda 3) (grafoRueda 4)
-- False
-- gtgtgt esSubgrafoMax (grafoCiclo 4) (grafoRueda 4)
-- True
-- gtgtgt esSubgrafoMax (creaGrafo [13] [(12)]) (grafoCiclo 3)
-- True
-- gtgtgt esSubgrafoMax (creaGrafo [12] [(12)]) (grafoCiclo 3)
-- False
esSubgrafoMax Ord a =gt Grafo a -gt Grafo a -gt Bool
esSubgrafoMax g g =
g `esSubgrafo` g ampamp conjuntosIguales (vertices g) (vertices g)
Definicioacuten 3516 Sean Gprime = (Vprime Aprime) G = (V A) dos grafos si Vprime sub V o Aprime sub A sedice que Gprime es un subgrafo propio de G y se denota por Gprime sub G
La funcioacuten (esSubgrafoPropio g g) se verifica si g es un subgrafo propio de g
-- | Ejemplos
-- gtgtgt esSubgrafoPropio (grafoRueda 3) (grafoRueda 4)
-- True
-- gtgtgt esSubgrafoPropio (grafoRueda 4) (grafoCiclo 5)
-- False
-- gtgtgt esSubgrafoPropio (creaGrafo [13] [(12)]) (grafoCiclo 3)
-- True
-- gtgtgt esSubgrafoPropio (creaGrafo [12] [(12)]) (grafoCiclo 3)
35 Definiciones y propiedades 73
-- True
esSubgrafoPropio Ord a =gt Grafo a -gt Grafo a -gt Bool
esSubgrafoPropio g g =
esSubgrafo g g ampamp
(not (conjuntosIguales (vertices g) (vertices g)) ||
not (conjuntosIguales (aristas g) (aristas g)))
352 Propiedades de grafos
Teorema 3517 (Lema del apretoacuten de manos) En todo grafo simple el nuacutemero de veacuterticesde grado impar es par o cero
Vamos a comprobar que se verifica el lema del apretoacuten de manos utilizando la fun-cioacuten prop_LemaApretonDeManos
ghcigt quickCheck prop_LemaApretonDeManos
+++ OK passed 100 tests
prop_LemaApretonDeManos Grafo Int -gt Bool
prop_LemaApretonDeManos g =
even (length (filter odd [grado g v | v lt- vertices g]))
where g = creaGrafo (vertices g)
[(xy) | (xy) lt- aristas g x = y]
Teorema 3518 (HavelndashHakimi) Si n gt 1 y D = [d1 dn] es una lista de enterosentonces D es secuencia graacutefica si y soacutelo si la secuencia Dprime obtenida borrando el mayorelemento dmax y restando 1 a los siguientes dmax elementos maacutes grandes es graacutefica
Vamos a comprobar que se verifica el teorema de HavelndashHakimi utilizando la fun-cioacuten prop_HavelHakimi
ghcigt quickCheck prop_HavelHakimi
+++ OK passed 100 tests
prop_HavelHakimi [Int] -gt Bool
prop_HavelHakimi [] = True
prop_HavelHakimi (sss) =
not (secuenciaGrafica (sss) ampamp not (esVacio ss)) ||
secuenciaGrafica (map (x -gt x-1) (take s ss) ++ drop s ss)
353 Operaciones y propiedades sobre grafos
Eliminacioacuten de una arista
Definicioacuten 3519 Sea G = (V A) un grafo y sea (u v) isin A Definimos el grafo G (u v) como el subgrafo de G Gprime = (Vprime Aprime) con Vprime = V y Aprime = A (u v) Esta
74 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
operacioacuten se denomina eliminar una arista
La funcioacuten (eliminaArista g a) elimina la arista a del grafo g
-- | Ejemplos
-- gtgtgt eliminaArista (creaGrafo [14] [(12)(14)(24)]) (14)
-- G [1234] [(12)(24)]
-- gtgtgt eliminaArista (creaGrafo [14] [(12)(14)(24)]) (41)
-- G [1234] [(12)(24)]
-- gtgtgt eliminaArista (creaGrafo [14] [(12)(14)(24)]) (43)
-- G [1234] [(12)(14)(24)]
eliminaArista Ord a =gt Grafo a -gt (aa) -gt Grafo a
eliminaArista g (ab) =
creaGrafo (vertices g)
(aristas g [(ab)(ba)])
La funcioacuten (eliminaLazos g) devuelve un nuevo grafo obtenido a partir del grafog eliminando todas las aristas que fueran lazos
-- | Ejemplos
-- gtgtgt eliminaLazos (creaGrafo [12] [(11)(12)(22)])
-- G [12] [(12)]
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
-- gtgtgt eliminaLazos (grafoCiclo 5)
-- G [12345] [(12)(15)(23)(34)(45)]
eliminaLazos Ord a =gt Grafo a -gt Grafo a
eliminaLazos g = creaGrafo (vertices g)
[(xy) | (xy) lt- aristas g x = y]
Eliminacioacuten un veacutertice
Definicioacuten 3520 Sea G = (V A) un grafo y sea v isin V Definimos el grafo G v como elsubgrafo de G Gprime = (Vprime Aprime) con Vprime = V v y Aprime = A a isin A|v es un extremo de aEsta operacioacuten se denomina eliminar un veacutertice
La funcioacuten (eliminaVertice g v) elimina el veacutertice v del grafo g
-- | Ejemplos
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(24)]) 1
-- G [234] [(24)]
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(24)]) 4
-- G [123] [(12)]
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(24)]) 3
-- G [124] [(12)(14)(24)]
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(13)]) 1
-- G [234] []
eliminaVertice Ord a =gt Grafo a -gt a -gt Grafo a
35 Definiciones y propiedades 75
eliminaVertice g v =
creaGrafo (vertices g [v])
(as [(ab) | (ab) lt- as a == v || b == v])
where as = aristas g
Suma de aristas
Definicioacuten 3521 Sea G = (V A) un grafo y sean u v isin V tales que (u v) (v u) 6isin ADefinimos el grafo G + (u v) como el grafo Gprime = (V A cup (u v)) Esta operacioacuten sedenomina suma de una arista
La funcioacuten (sumaArista g a) suma la arista a al grafo g
-- | Ejemplos
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
-- gtgtgt sumaArista (grafoCiclo 5) (13)
-- G [12345] [(12)(13)(15)(23)(34)(45)]
sumaArista Ord a =gt Grafo a -gt (aa) -gt Grafo a
sumaArista g a =
creaGrafo (vertices g) (a aristas g)
Suma de veacutertices
Definicioacuten 3522 Sea G = (V A) un grafo y sea v 6isin V Definimos el grafo G + v comoel grafo Gprime = (Vprime Aprime) donde Vprime = V cup v Aprime = Acup (u v)|u isin V Esta operacioacuten sedenomina suma de un veacutertice
La funcioacuten (sumaVertice g a) suma el veacutertice a al grafo g
-- | Ejemplo
-- gtgtgt grafoCiclo 3
-- G [123] [(12)(13)(23)]
-- gtgtgt sumaVertice (grafoCiclo 3) 4
-- G [1234] [(12)(13)(14)(23)(24)(34)]
sumaVertice Ord a =gt Grafo a -gt a -gt Grafo a
sumaVertice g v =
creaGrafo (v vs) (aristas g ++ [(uv) | u lt- vs])
where vs = vertices g
Propiedad de los grafos completos
Proposicioacuten 3523 La familia de grafos completos Kn verifica que Kn = Knminus1 + n
Vamos a ver que se cumple la propiedad utilizando la funcioacuten prop_completos
76 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
ghcigt quickCheck prop_completos
+++ OK passed 100 tests
prop_completos Int -gt Property
prop_completos n = n gt= 2 ==gt
completo n == sumaVertice (completo (n-1)) n
A partir de esta propiedad se puede dar una definicioacuten alternativa de la funcioacuten(completo n) que devuelve el grafo completo Kn La nueva funcioacuten seraacute (completo2n)
completo2 Int -gt Grafo Int
completo2 0 = grafoNulo
completo2 n = sumaVertice (completo2 (n-1)) n
Vamos a comprobar la equivalencia de ambas deficiones
ghcigt prop_EquiCompleto
True
prop_EquiCompleto Bool
prop_EquiCompleto = and [completo n == completo2 n | n lt- [050]]
Vamos a ver cuaacutel de las definiciones es maacutes eficiente
ghcigt tamantildeo (completo 100)
4950
(117 secs 0 bytes)
ghcigt tamantildeo (completo2 100)
4950
(1549 secs 61756056 bytes)
La funcioacuten (completo n) es maacutes eficiente asiacute que seraacute la que seguiremos utilizando
Suma de grafos
Definicioacuten 3524 Sean G = (V A) Gprime = (Vprime A) dos grafos Definimos el grafo sumade G y Gprime como el grafo G + Gprime = (V cup Vprime A cup Aprime cup (u v)|u isin V v isin Vprime) Estaoperacioacuten se denomina suma de grafos
La funcioacuten (sumaGrafos g g) suma los grafos g y g
-- | Ejemplo
-- gtgtgt let g1 = creaGrafo [13] [(11)(13)(23)]
-- gtgtgt let g2 = creaGrafo [46] [(46)(56)]
-- gtgtgt pp $ sumaGrafos g1 g2
-- G [123456]
-- [(1 1)(1 3)(1 4)(1 5)(1 6)(2 3)(2 4)
-- (2 5)(2 6)(3 4)(3 5)(3 6)(4 6)(5 6)]
sumaGrafos Ord a =gt Grafo a -gt Grafo a -gt Grafo a
35 Definiciones y propiedades 77
sumaGrafos g1 g2 =
creaGrafo (vs1 `union` vs2)
(aristas g1 `union`
aristas g2 `union`
[(uv) | u lt- vs1 v lt- vs2])
where vs1 = vertices g1
vs2 = vertices g2
Unioacuten de grafos
Definicioacuten 3525 Sean G = (V A) Gprime = (Vprime A) dos grafos Definimos el grafo unioacutende G y Gprime como el grafo G cup H = (V cupVprime A cup Aprime) Esta operacioacuten se denomina unioacuten degrafos
La funcioacuten (unionGrafos g g) une los grafos g y g Por ejemplo
-- | Ejemplo
-- gtgtgt let g1 = creaGrafo [13] [(11)(13)(23)]
-- gtgtgt let g2 = creaGrafo [46] [(46)(56)]
-- gtgtgt unionGrafos g1 g2
-- G [123456] [(11)(13)(23)(46)(56)]
unionGrafos Ord a =gt Grafo a -gt Grafo a -gt Grafo a
unionGrafos g1 g2 =
creaGrafo (vertices g1 `union` vertices g2)
(aristas g1 `union` aristas g2)
Grafo complementario
Definicioacuten 3526 Dado un grafo G = (V A) se define el grafo complementario de Gcomo G = (V A) donde A = (u v)|u v isin V (u v) 6isin A
La funcioacuten (grafoComplementario g) devuelve el grafo complementario de g
-- | Ejemplo
-- gtgtgt grafoComplementario (creaGrafo [13] [(11)(13)(23)])
-- G [123] [(12)(22)(33)]
grafoComplementario Ord a =gt Grafo a -gt Grafo a
grafoComplementario g =
creaGrafo vs
[(uv)| u lt- vs v lt- vs u lt= v not ((uv) `aristaEn` g)]
where vs = vertices g
Definicioacuten 3527 Dado un grafo diremos que es completo si su complementario sin lazosno tiene aristas
La funcioacuten (esCompleto g) se verifica si el grafo g es completo
78 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- Ejemplos
-- gtgtgt esCompleto (completo 4)
-- True
-- gtgtgt esCompleto (grafoCiclo 5)
-- False
esCompleto Ord a =gt Grafo a -gt Bool
esCompleto g =
tamantildeo (eliminaLazos (grafoComplementario g)) == 0
36 Morfismos de grafos
Llegados a este punto es importante resaltar que un grafo se define como una en-tidad matemaacutetica abstracta es evidente que lo importante de un grafo no son losnombres de sus veacutertices ni su representacioacuten graacutefica La propiedad que caracterizaa un grafo es la forma en que sus veacutertices estaacuten unidos por las aristasA priori los siguientes grafos pueden parecer distintos
a
bc
de
1
23
45
Sin embargo ambos grafos son grafos de cinco veacutertices que tienen las mismas rela-ciones de vecindad entre sus nodos En esta seccioacuten estudiaremos estas relacionesque establecen las aristas entre los veacutertices de un grafo y presentaremos algoritmosque nos permitan identificar cuaacutendo dos grafos se pueden relacionar mediante apli-caciones entre sus veacutertices cumpliendo ciertas caracteriacutesicas
361 Morfismos
Definicioacuten 361 Si f es una funcioacuten entre dos grafos G = (V A) y Gprime = (Vprime Aprime)diremos que conserva la adyacencia si forallu v isin V se verifica que si (u v) isin A entonces( f (u) f (v)) isin Aprime
La funcioacuten (conservaAdyacencia g h f) se verifica si la funcioacuten f entre los grafosg y h conserva las adyacencias
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [14] [(12)(23)(34)]
-- gtgtgt let g2 = creaGrafo [14] [(12)(23)(24)]
-- gtgtgt let g3 = creaGrafo [4610] [(48)(68)(810)]
36 Morfismos de grafos 79
-- gtgtgt conservaAdyacencia g1 g3 [(14)(26)(38)(410)]
-- False
-- gtgtgt conservaAdyacencia g2 g3 [(14)(28)(36)(410)]
-- True
conservaAdyacencia (Ord a Ord b) =gt
Grafo a -gt Grafo b -gt Funcion a b -gt Bool
conservaAdyacencia g h f =
and [(imagen f ximagen f y) `aristaEn` h | (xy) lt- aristas g]
Definicioacuten 362 Dados dos grafos simples G = (V A) y Gprime = (Vprime Aprime) un morfismoentre G y Gprime es una funcioacuten φ V rarr Vprime que conserva las adyacencias
La funcioacuten (esMorfismo g h vvs) se verifica si la funcioacuten representada por vvs esun morfismo entre los grafos g y h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(12)(32)]
-- gtgtgt let g2 = creaGrafo [456] [(46)(56)]
-- gtgtgt esMorfismo g1 g2 [(14)(26)(35)]
-- True
-- gtgtgt esMorfismo g1 g2 [(14)(25)(36)]
-- False
-- gtgtgt esMorfismo g1 g2 [(14)(26)(35)(79)]
-- False
esMorfismo (Ord aOrd b) =gt Grafo a -gt Grafo b -gt
Funcion a b -gt Bool
esMorfismo g1 g2 f =
esFuncion (vertices g1) (vertices g2) f ampamp
conservaAdyacencia g1 g2 f
La funcioacuten (morfismos g h) devuelve todos los posibles morfismos entre los grafosg y h
-- | Ejemplos
-- gtgtgt grafoCiclo 3
-- G [123] [(12)(13)(23)]
-- gtgtgt let g = creaGrafo [46] [(44)(66)]
-- gtgtgt morfismos (grafoCiclo 3) g
-- [[(14)(24)(34)][(16)(26)(36)]]
-- gtgtgt morfismos g (grafoCiclo 3)
-- []
morfismos (Ord a Ord b) =gt Grafo a -gt Grafo b -gt [[(ab)]]
morfismos g h =
[f | f lt- funciones (vertices g) (vertices h)
conservaAdyacencia g h f]
80 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
362 Complejidad del problema de homomorfismo de grafos
En general en computacioacuten un problema algoriacutetmico consta de un conjunto I detodas las posibles entradas para el problema llamado el conjunto de instancias y deuna pregunta Q sobre esas instancias Resolver uno de estos problemas consiste endesarrollar un algoritmo cuya entrada es una instancia del problema y cuya salidaes una respuesta a la pregunta del problemaDecimos que un problema es de decisioacuten cuando las posibles respuestas a la pre-gunta son ldquosiacuterdquo o ldquonordquo Un ejemplo de problema de este tipo seriacutea dados dos grafosdecidir si estos son homomorfos o noA la hora de implementar un algoritmo que deacute solucioacuten al problema que estemosconsiderando es importante tener en cuenta el nuacutemero de pasos que efectuacutea hastaencontrar una respuesta Un algoritmo de tiempo polinomial se define como aquelcon funcioacuten de complejidad temporal en O(p(n)) para alguna funcioacuten polinoacutemicap donde n denota el tamantildeo de la entrada Cualquier algoritmo cuya funcioacuten decomplejidad temporal no pueda ser acotada de esta manera se denomina algoritmode tiempo exponencialLa mayoriacutea de los algoritmos de tiempo exponencial son simples variaciones de unabuacutesqueda exhaustiva mientras que los algoritmos de tiempo polinomial usualmen-te se obtienen mediante un anaacutelisis maacutes profundo de la estructura del problema Enla Teoriacutea de la complejidad computacional existe el consenso de que un problemano estaacute ldquobien resueltordquo hasta que se conozca un algoritmo de tiempo polinomialque lo resuelva Por tanto nos referiremos a un problema como ldquointratablerdquo si estan difiacutecil que no existe algoritmo de tiempo polinomial capaz de resolverloLos problemas de decisioacuten para los que existen algoritmos polinomiales consti-tuyen la clase P y son llamados polinomiales Un problema de decisioacuten es no-determiniacutestico polinomial cuando cualquier instancia que produce respuesta ldquosiacuterdquoposee una comprobacioacuten de correctitud (tambieacuten llamada certificado) verificable entiempo polinomia en el tamantildeo de la instancia Estos problemas de decisioacuten se di-ce que pertenecen a la clase NP Claramente P sube NP Sin embargo no se sabe siesta inclusioacuten es estricta uno de los principales problemas abiertos en Teoriacutea de lacomputacioacuten es saber si P 6= NPUna reduccioacuten es una transformacioacuten de un problema en otro problema Intuitiva-mente un problema Q puede ser reducido a otro problema Qprime si cualquier instanciadel problema Q puede ser ldquofaacutecilmenterdquo expresada como una instancia del problemaQprime y cuya solucioacuten proporcione una solucioacuten para la instancia de QLas reducciones en tiempo polinomial nos dotan de elementos para probar de unamanera formal que un problema es al menos tan difiacutecil que otro con una dife-rencia de un factor polinomial Estas son esenciales para definir a los problemas
36 Morfismos de grafos 81
NP-completos ademaacutes de ayudar a comprender los mismosLa clase de los problemas NP-completos contiene a los problemas maacutes difiacuteciles enNP en el sentido de que son los que esteacuten maacutes lejos de estar en P Debido a que elproblema P = NP no ha sido resuelto el hecho de reducir un problema B a otroproblema A indicariacutea que no se conoce solucioacuten en tiempo polinomial para A Estoes debido a que una solucioacuten en tiempo polinomial para A tendriacutea como conse-cuencia la existencia de una solucioacuten polinomial para B De manera similar debidoa que todos los problemas NP pueden ser reducidos a este conjunto encontrar unproblema NP-completo que pueda ser resuelto en un tiempo polinomial significariacuteaque P = NPEl problema de decidir si dos grafos son homomorfos es un problema de decisioacutenNP-completo La NP-completitud del problema se demuestra mediante la reduccioacutende este problema al problema de la clique 17En el proceso de recopilacioacuten de imformacioacuten acerca de la Teoriacutea de la complejidadse ha trabajado con dos fuentesbull la tesis de licenciatura de Pablo Burzyn ldquoComplejidad computacional en proble-
mas de modificacioacuten de aristas en grafosrdquo ([2]) ybull el artiacuteculo ldquoTeoriacutea de la complejidad computacionalrdquo ([12]) de la Wikipedia
363 Isomorfismos
Definicioacuten 363 Dados dos grafos simples G = (V A) y Gprime = (Vprime Aprime) un isomorfis-mo entre G y Gprime es un morfismo biyectivo cuyo inverso es morfismo entre Gprime y G
La funcioacuten (esIsomorfismo g h f) se verifica si la aplicacioacuten f es un isomorfismoentre los grafos g y h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt esIsomorfismo g1 g2 [(12)(24)(36)]
-- True
-- gtgtgt esIsomorfismo g1 g2 [(12)(22)(36)]
-- False
esIsomorfismo (Ord aOrd b) =gt
Grafo a -gt Grafo b -gt Funcion a b -gt Bool
esIsomorfismo g h f =
esBiyectiva vs1 vs2 f ampamp
esMorfismo g h f ampamp
esMorfismo h g (inversa f)
where vs1 = vertices g
vs2 = vertices h
17httpseswikipediaorgwikiProblema_de_la_clique
82 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (isomorfismos1 g h) devuelve todos los isomorfismos posibles entrelos grafos g y h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfismos1 g1 g2
-- [[(12)(24)(36)]]
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfismos1 g3 g4
-- []
-- gtgtgt let g5 = creaGrafo [123] [(11)(22)(33)]
-- gtgtgt let g6 = creaGrafo [246] [(22)(44)(66)]
-- gtgtgt pp $ isomorfismos1 g5 g6
-- [[(1 2)(2 4)(3 6)][(1 4)(2 2)(3 6)]
-- [(1 6)(2 4)(3 2)][(1 4)(2 6)(3 2)]
-- [(1 6)(2 2)(3 4)][(1 2)(2 6)(3 4)]]
isomorfismos1 (Ord aOrd b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos1 g h =
[f | f lt- biyecciones vs1 vs2
conservaAdyacencia g h f
conservaAdyacencia h g (inversa f)]
where vs1 = vertices g
vs2 = vertices h
Definicioacuten 364 Dos grafos G y H se dicen isomorfos si existe alguacuten isomorfismo entreellos
La funcioacuten isomorfos1 g h se verifica si los grafos g y h son isomorfos
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfos1 g1 g2
-- True
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfos1 g3 g4
-- False
isomorfos1 (Ord aOrd b) =gt Grafo a -gt Grafo b -gt Bool
isomorfos1 g = not null isomorfismos1 g
Nota 361 Al tener Haskell una evaluacioacuten perezosa la funcioacuten (isomorfos g h)
no necesita generar todos los isomorfismos entre los grafos g y h
Definicioacuten 365 Sea G = (V A) un grafo Un invariante por isomorfismos de G esuna propiedad de G que tiene el mismo valor para todos los grafos que son isomorfos a eacutel
36 Morfismos de grafos 83
esInvariantePorIsomorfismos
Eq a =gt (Grafo Int -gt a) -gt Grafo Int -gt Grafo Int -gt Bool
esInvariantePorIsomorfismos p g h =
isomorfos g h --gt (p g == p h)
where (--gt) = (lt=)
Teorema 366 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un iso-morfismo Entonces se verifica que |V(G)| = |V(Gprime)| es decir el orden de un grafo es uninvariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos orden)
+++ OK passed 100 tests
Teorema 367 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces se verifica que |A(G)| = |A(Gprime)| es decir el tamantildeo de un grafo es uninvariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos tamantildeo)
+++ OK passed 100 tests
Teorema 368 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces tienen la misma secuencia de grados es decir la secuencia de grados de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos secuenciaGrados)
+++ OK passed 100 tests
A partir de las propiedades que hemos demostrado de los isomorfismos vamos adar otra definicioacuten equivalente de las funciones (isomorfismos1 g h) y (isomorfos1
g h)
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfismos2 g1 g2
-- [[(12)(24)(36)]]
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfismos2 g3 g4
-- []
-- gtgtgt let g5 = creaGrafo [123] [(11)(22)(33)]
84 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- gtgtgt let g6 = creaGrafo [246] [(22)(44)(66)]
-- gtgtgt pp $ isomorfismos2 g5 g6
-- [[(1 2)(2 4)(3 6)][(1 4)(2 2)(3 6)]
-- [(1 6)(2 4)(3 2)][(1 4)(2 6)(3 2)]
-- [(1 6)(2 2)(3 4)][(1 2)(2 6)(3 4)]]
isomorfismos2 (Ord a Ord b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos2 g h
| orden g = orden h = []
| tamantildeo g = tamantildeo h = []
| secuenciaGrados g = secuenciaGrados h = []
| otherwise = [f | f lt- biyecciones vs1 vs2
conservaAdyacencia g h f]
where vs1 = vertices g
vs2 = vertices h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfos2 g1 g2
-- True
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfos2 g3 g4
-- False
isomorfos2 (Ord a Ord b) =gt Grafo a -gt Grafo b -gt Bool
isomorfos2 g =
not null isomorfismos2 g
isomorfismos3 (Ord a Ord b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos3 g h
| orden g = orden h = []
| tamantildeo g = tamantildeo h = []
| secuenciaGrados g = secuenciaGrados h = []
| otherwise = filter (conservaAdyacencia g h) (posibles g h)
verticesPorGrados g =
[filter (p n) (vertices g) | n lt- nub (secuenciaGrados g)]
where p m v = grado g v == m
aux1 [] _ = []
aux1 (xsxss) (ysyss) = (map (zip xs) (permutations ys))aux1 xss yss
aux2 [] = []
aux2 (xss[]) = xss
aux2 (xssyss[]) = [xs ++ ys | xs lt- xss ys lt- yss]
aux2 (xssyssxsss) =
aux2 ([xs ++ ys | xs lt- xss ys lt- yss]xsss)
36 Morfismos de grafos 85
posibles g h =
aux2 (aux1 (verticesPorGrados g) (verticesPorGrados h))
Vamos a comparar la eficiencia entre ambas definiciones
Nota 362 La nueva definicioacuten de (isomorfismos3 g h) es la maacutes eficiente con gra-fos poco regulares sin embargo cuando todos los veacutertices tienen el mismo grado(isomorfismos2 g h) sigue siendo mejor opcioacuten (aunque no hay mucha diferenciaen el coste computacional)ghcigt let n = 6 in (length (isomorfismos1 (completo n) (completo n)))
720
(018 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos2 (completo n) (completo n)))
720
(018 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos3 (completo n) (completo n)))
720
(018 secs 26123800 bytes)
ghcigt let n = 6 in (length (isomorfismos1 (grafoCiclo n) (grafoCiclo n)))
12
(004 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos2 (grafoCiclo n) (grafoCiclo n)))
12
(004 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos3 (grafoCiclo n) (grafoCiclo n)))
12
(004 secs 0 bytes)
ghcigt length (isomorfismos1 (grafoCiclo 6) (completo 7))
0
(000 secs 0 bytes)
ghcigt length (isomorfismos2 (grafoCiclo 6) (completo 7))
0
(001 secs 0 bytes)
ghcigt length (isomorfismos3 (grafoCiclo 6) (completo 7))
0
(000 secs 0 bytes)
ghcigt isomorfos1 (completo 10) (grafoCiclo 10)
False
(5190 secs 12841861176 bytes)
ghcigt isomorfos2 (completo 10) (grafoCiclo 10)
False
(000 secs 0 bytes)
ghcigt isomorfos3 (completo 10) (grafoCiclo 10)
False
86 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
(000 secs 0 bytes)
ghcigt isomorfos1 (grafoCiclo 10) (grafoRueda 10)
False
(7390 secs 16433969976 bytes)
ghcigt isomorfos2 (grafoCiclo 100) (grafoRueda 100)
False
(000 secs 0 bytes)
ghcigt isomorfos3 (grafoCiclo 100) (grafoRueda 100)
False
(000 secs 0 bytes)
ghcigt length (isomorfismos2 (grafoRueda 10) (grafoRueda 10))
18
(10112 secs 23237139992 bytes)
ghcigt length (isomorfismos3 (grafoRueda 10) (grafoRueda 10))
18
(4467 secs 9021442440 bytes)
Nota 363 Cuando los grafos son isomorfos comprobar que tienen el mismo nuacuteme-ro de veacutertices el mismo nuacutemero de aristas y la misma secuencia graacutefica no requieremucho tiempo ni espacio dando lugar a costes muy similares entre los dos paresde definiciones Sin embargo cuando los grafos tienen el mismo nuacutemero de veacuterticesy fallan en alguna de las demaacutes propiedades el resultado es muy costoso para laprimera definicioacuten mientras que es inmediato con la segundaA partir de ahora utilizaremos la funcioacuten isomorfismos2 para calcular los isomor-fismos entre dos grafos y la funcioacuten isomorfos para determinar si dos grafos sonisomorfos de modo que las renombraremos por isomorfismos y isomorfismos res-pectivamente
isomorfismos (Ord aOrd b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos = isomorfismos2
isomorfos (Ord aOrd b) =gt Grafo a -gt Grafo b -gt Bool
isomorfos = isomorfos2
364 Automorfismos
Definicioacuten 369 Dado un grafo simple G = (V A) un automorfismo de G es un iso-morfismo de G en siacute mismo
La funcioacuten (esAutomorfismo g f) se verifica si la aplicacioacuten f es un automorfismode g
-- | Ejemplos
-- gtgtgt let g = creaGrafo [123] [(12)(13)]
37 Caminos en grafos 87
-- gtgtgt esAutomorfismo g [(11)(23)(32)]
-- True
-- gtgtgt esAutomorfismo g [(12)(23)(31)]
-- False
esAutomorfismo Ord a =gt Grafo a -gt Funcion a a -gt Bool
esAutomorfismo g = esIsomorfismo g g
La funcioacuten (automorfismos g) devuelve la lista de todos los posibles automorfis-mos en g
-- | Ejemplo
-- gtgtgt automorfismos (creaGrafo [123] [(12)(13)])
-- [[(11)(22)(33)][(11)(23)(32)]]
automorfismos Ord a =gt Grafo a -gt [Funcion a a]
automorfismos g = isomorfismos1 g g
Nota 364 Cuando trabajamos con automorfismos es mejor utilizar en su defini-cioacuten la funcioacuten isomorfismos1 en vez de isomorfismos2 pues ser isomorfos es unarelacioacuten reflexiva es decir un grafo siempre es isomorfo a siacute mismo
37 Caminos en grafos
Una de las aplicaciones de la teoriacutea de grafos es la determinacioacuten de trayectos o re-corridos en una red de transporte o de distribucioacuten de productos Asiacute si cada veacuterticerepresenta un punto de intereacutes y cada arista representa una conexioacuten entre dos pun-tos usando grafos como modelos podemos simplificar el problema de encontrar laruta maacutes ventajosa en cada caso
371 Definicioacuten de camino
Definicioacuten 371 Sea G = (V A) un grafo simple y sean u v isin V dos veacutertices Uncamino entre u y v es una sucesioacuten de veacutertices de G u = v0 v1 v2 vkminus1 vk = vdonde foralli isin 0 kminus 1 (vi vi+1) isin A
La funcioacuten (esCamino g c) se verifica si la sucesioacuten de veacutertices c es un camino enel grafo g
-- | Ejemplo
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
-- gtgtgt esCamino (grafoCiclo 5) [123451]
-- True
-- gtgtgt esCamino (grafoCiclo 5) [124531]
-- False
88 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
esCamino Ord a =gt Grafo a -gt [a] -gt Bool
esCamino g c = all (`aristaEn` g) (zip c (tail c))
La funcioacuten (aristasCamino c) devuelve la lista de las aristas recorridas en el ca-mino c
-- | Ejemplos
-- gtgtgt aristasCamino [123]
-- [(12)(23)]
-- gtgtgt aristasCamino [1231]
-- [(12)(23)(13)]
-- gtgtgt aristasCamino [1232]
-- [(12)(23)(23)]
aristasCamino Ord a =gt [a] -gt [(aa)]
aristasCamino c =
map parOrdenado (zip c (tail c))
where parOrdenado (uv) | u lt= v = (uv)
| otherwise = (vu)
La funcioacuten (verticesCamino c) devuelve la lista de las vertices recorridas en elcamino c
-- | Ejemplo
-- gtgtgt verticesCamino [1231]
-- [123]
verticesCamino Ord a =gt [a] -gt [a]
verticesCamino c = nub c
Definicioacuten 372 Se llama longitud de un camino al nuacutemero de veces que se atraviesa unaarista en dicho camino
La funcioacuten (longitudCamino c) devuelve la longitud del camino c
-- | Ejemplo
-- gtgtgt longitudCamino [427]
-- 2
longitudCamino [a] -gt Int
longitudCamino c = length c - 1
La funcioacuten (todosCaminos g u v k) devuelve todos los caminos entre los veacuterticesu y v en el grafo g que tienen longitud k
-- | Ejemplo
-- gtgtgt todosCaminos (creaGrafo [12] [(12)]) 1 2 3
-- [[1212]]
-- gtgtgt todosCaminos (bipartitoCompleto 2 3) 1 3 3
-- [[1313][1323][1413][1423][1513][1523]]
todosCaminos Ord a =gt Grafo a -gt a -gt a -gt Int -gt [[a]]
todosCaminos g u v 0 = if u == v ampamp elem u (vertices g)
37 Caminos en grafos 89
then [[u]]
else []
todosCaminos g u v 1 = if aristaEn (uv) g
then [[uv]]
else []
todosCaminos g u v k =
filter p [uvs | n lt- [1k-1] w lt- a u vs lt- tC w v n]
where p xs = longitudCamino xs == k
a = adyacentes g
tC = todosCaminos g
La funcioacuten (numeroCaminosDeLongitud g u v k) es el nuacutemero de caminos de lon-gitud k uniendo los veacutertices u y v en el grafo g
-- | Ejemplos
-- gtgtgt numeroCaminosDeLongitud (completo 7) 1 4 5
-- 1111
-- gtgtgt numeroCaminosDeLongitud grafoPetersen 1 4 3
-- 5
numeroCaminosDeLongitud Ord a =gt Grafo a -gt a -gt a -gt Int -gt Int
numeroCaminosDeLongitud g u v = length todosCaminos g u v
372 Recorridos
Definicioacuten 373 Sea G = (V A) un grafo y sean u v isin V Un camino entre u y v queno repite aristas (quizaacutes veacutertices) se llama recorrido
La funcioacuten (esRecorrido g c) se verifica si el camino c es un recorrido en el grafog
-- | Ejemplo
-- gtgtgt esRecorrido (grafoCiclo 4) [214]
-- True
-- gtgtgt esRecorrido (grafoCiclo 4) [2141]
-- False
-- gtgtgt esRecorrido (grafoCiclo 4) [213]
-- False
esRecorrido Ord a =gt Grafo a -gt [a] -gt Bool
esRecorrido g c =
esCamino g c ampamp sinRepetidos (aristasCamino c)
373 Caminos simples
Definicioacuten 374 Un camino que no repite veacutertices (y por tanto tampoco aristas) se llamacamino simple
90 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (esCaminoSimple g c) se verifica si el camino c es un camino simple enel grafo g
-- | Ejemplos
-- gtgtgt esCaminoSimple (creaGrafo [12] [(11)(12)]) [112]
-- False
-- gtgtgt esCaminoSimple (grafoCiclo 4) [214]
-- True
-- gtgtgt esCaminoSimple (grafoCiclo 4) [14321]
-- True
-- gtgtgt esCaminoSimple (grafoCiclo 4) [43212]
-- False
esCaminoSimple Ord a =gt Grafo a -gt [a] -gt Bool
esCaminoSimple g [] = True
esCaminoSimple g vs =
esRecorrido g vs ampamp noRepiteVertices vs
where noRepiteVertices (xxs)
| sinRepetidos (xxs) = True
| x == last xs ampamp sinRepetidos xs = True
| otherwise = False
La funcioacuten (todosArcosBP g u v) devuelve una lista con todos los caminos simplesposibles en el grafo g entre los veacutertices u y v utilizando una algoritmo de buacutesquedaen profundidad sobre el grafo g Este algoritmo recorre el grafo de izquierda a dere-cha y de forma al visitar un nodo explora todos los caminos que pueden continuarpor eacutel antes de pasar al siquiente
-- | Ejemplos
-- gtgtgt grafoCiclo 4
-- G [1234] [(12)(14)(23)(34)]
-- gtgtgt todosArcosBP (grafoCiclo 4) 1 4
-- [[14][1234]]
-- gtgtgt todosArcosBP (grafoCiclo 4) 4 1
-- [[4321][41]]
-- gtgtgt todosArcosBP (creaGrafo [14] [(12)(34)]) 1 4
-- []
-- gtgtgt todosArcosBP (creaGrafo [12] [(11)(12)]) 1 1
-- [[1]]
todosArcosBP Ord a =gt Grafo a -gt a -gt a -gt [[a]]
todosArcosBP g x y = aux [[y]]
where aux [] = []
aux ([]zss) = aux zss
aux ((zzs)zss)
| z == x = (zzs) aux zss
| otherwise =
aux ([vzzs | v lt- adyacentes g z zs] ++ zss)
g = eliminaLazos g
eliminaLazos h = creaGrafo (vertices h)
37 Caminos en grafos 91
[(xy) | (xy) lt- aristas h x = y]
La funcioacuten (todosArcosBA g u v) devuelve una lista con todos los caminos simplesposibles en el grafo g entre los veacutertices u y v utilizando una algoritmo de buacutesquedaen anchura sobre el grafo g Este algoritmo recorre el grafo por niveles de formaque el primer camino de la lista es de longitud miacutenima
-- | Ejemplos
-- gtgtgt grafoCiclo 4
-- G [1234] [(12)(14)(23)(34)]
-- gtgtgt todosArcosBA (grafoCiclo 4) 1 4
-- [[14][1234]]
-- gtgtgt todosArcosBA (grafoCiclo 4) 4 1
-- [[41][4321]]
-- gtgtgt todosArcosBA (creaGrafo [14] [(12)(34)]) 1 4
-- []
-- gtgtgt todosArcosBA (creaGrafo [12] [(11)(12)]) 1 1
-- [[1]]
todosArcosBA Ord a =gt Grafo a -gt a -gt a -gt [[a]]
todosArcosBA g x y = aux [[y]]
where aux [] = []
aux ([]zss) = aux zss
aux ((zzs)zss)
| z == x = (zzs) aux zss
| otherwise =
aux (zss ++ [vzzs | v lt- adyacentes g z zs])
g = eliminaLazos g
Vamos a comprobar con QuickCheck que el primer elemento de la lista que de-vuelve la funcioacuten (todosArcosBA g u v) es de longitud miacutenima Para ello vamos autilizar la funcioacuten (parDeVertices g) que es un generador de pares de veacutertices delgrafo no nulo g Por ejemplo
ghcigt sample (parDeVertices (creaGrafo [19] []))
(39)
(93)
(74)
(43)
(28)
(72)
(84)
(53)
(72)
(31)
(72)
92 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
parDeVertices Grafo Int -gt Gen (IntInt)
parDeVertices g = do
x lt- elements vs
y lt- elements vs
return (xy)
where vs = vertices g
La propiedad es
prop_todosArcosBA Grafo Int -gt Property
prop_todosArcosBA g =
not (esGrafoNulo g) ==gt
forAll (parDeVertices g)
((xy) -gt let zss = todosArcosBA g x y
in null zss || longitudCamino (head zss) ==
minimum (map longitudCamino zss))
La comprobacioacuten es
ghcigt quickCheck prop_todosArcosBA
+++ OK passed 100 tests
Veamos que la funcioacuten (todosArcosBP g u v) no verifica la propiedad
ghcigt quickCheck prop_todosArcosBP
Failed Falsifiable (after 6 tests)
G [12345] [(12)(14)(15)(22)(23)(24)(44)(45)(55)]
(52)
prop_todosArcosBP Grafo Int -gt Property
prop_todosArcosBP g =
not (esGrafoNulo g) ==gt
forAll (parDeVertices g)
((xy) -gt let zss = todosArcosBP g x y
in null zss || longitudCamino (head zss) ==
minimum (map longitudCamino zss))
La funcioacuten (numeroArcosDeLongitud g u v k) devuelve el nuacutemero de caminos en-tre los veacutertices u y v en el grafo g que tienen longitud k
-- | Ejemplos
-- gtgtgt numeroArcosDeLongitud (completo 6) 1 3 4
-- 24
-- gtgtgt numeroArcosDeLongitud grafoPetersen 1 3 4
-- 4
numeroArcosDeLongitud Ord a =gt Grafo a -gt a -gt a -gt Int -gt Int
numeroArcosDeLongitud g u v k =
length (filter p (todosArcosBA g u v))
where p vs = longitudCamino vs == k
37 Caminos en grafos 93
374 Conexioacuten
Definicioacuten 375 Dado un grafo G = (V A) sean u v isin V Si existe alguacuten camino entreu y v en el grafo G diremos que estaacuten conectados y lo denotamos por u v
La funcioacuten (estanConectados g u v) se verifica si los veacutertices u y v estaacuten conecta-dos en el grafo g
-- | Ejemplos
-- gtgtgt estanConectados (creaGrafo [14] [(12)(24)]) 1 4
-- True
-- gtgtgt estanConectados (creaGrafo [14] [(12)(34)]) 1 4
-- False
estanConectados Ord a =gt Grafo a -gt a -gt a -gt Bool
estanConectados g u v
| esGrafoNulo g = False
| otherwise = not (null (todosArcosBA g u v))
Nota 371 La funcioacuten (estanConectados g u v) no necesita calcular todos los ca-minos entre u y v Puesto que Haskell utiliza por defecto evaluacioacuten perezosa siexiste alguacuten camino entre los dos veacutertices basta calcular el primero para saber quela lista de todos los caminos no es vaciacutea
375 Distancia
Definicioacuten 376 Se define la distancia entre u y v en el grafo G como la longitud delcamino maacutes corto que los une Si u y v no estaacuten conectados decimos que la distancia esinfinita
La funcioacuten (distancia g u v) devuelve la distancia entre los veacutertices u y v en elgrafo g En caso de que los veacutertices no esteacuten conectados devuelve el valor Nothing
-- | Ejemplos
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 1
-- Just 0
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 2
-- Just 1
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 3
-- Just 2
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 4
-- Nothing
distancia Ord a =gt Grafo a -gt a -gt a -gt Maybe Int
distancia g u v
| estanConectados g u v =
Just (longitudCamino (head (todosArcosBA g u v)))
| otherwise = Nothing
94 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Definicioacuten 377 Dado G = (V A) un grafo sean u v isin V Un camino entre u y v cuyalongitud coincide con la distancia entre los veacutertices se llama geodeacutesica entre u y v
La funcioacuten (esGeodesica g c) se verifica si el camino c es una geodeacutesica entre susextremos en el grafo g
-- | Ejemplos
-- gtgtgt let g = creaGrafo [14] [(12)(13)(23)(34)]
-- gtgtgt esGeodesica g [134]
-- True
-- gtgtgt esGeodesica g [1234]
-- False
esGeodesica Ord a =gt Grafo a -gt [a] -gt Bool
esGeodesica g c =
esCamino g c ampamp
longitudCamino c == fromJust (distancia g u v)
where u = head c
v = last c
Nota 372 No hace falta imponer en la definicioacuten de la funcioacuten que el camino seaun recorrido pues el camino de miacutenima longitud entre dos veacutertices es siempre unrecorrido
376 Caminos cerrados
Definicioacuten 378 Un camino en un grafo G se dice cerrado si sus extremos son igualesDiremos que un camino cerrado de longitud tres es un triaacutengulo
La funcioacuten (esCerrado g c) se verifica si el camino c es cerrado en el grafo g
-- | Ejemplos
-- gtgtgt let g = creaGrafo [14] [(12)(13)(23)(34)]
-- gtgtgt esCerrado g [1231]
-- True
-- gtgtgt esCerrado g [123]
-- False
-- gtgtgt esCerrado g [1241]
-- False
esCerrado (Ord a) =gt Grafo a -gt [a] -gt Bool
esCerrado _ [] = False
esCerrado g (vc) =
esCamino g c ampamp v == last c
La funcioacuten (triangulos g v) devuelve la lista de todos los triaacutengulos que pasanpor el veacutertice v en el grafo g
-- | Ejemplos
-- gtgtgt triangulos (completo 4) 3
37 Caminos en grafos 95
-- [[3123][3143][3213][3243][3413][3423]]
-- gtgtgt triangulos (grafoCiclo 6) 1
-- []
triangulos Ord a =gt Grafo a -gt a -gt [[a]]
triangulos g u = todosCaminos g u u 3
377 Circuitos
Definicioacuten 379 Un recorrido en un grafo G se dice circuito si sus extremos son iguales
La funcioacuten (esCircuito g c) se verifica si la sucesioacuten de veacutertices c es un circuitoen el grafo g
-- | Ejemplos
-- gtgtgt grafoCiclo 4
-- G [1234] [(12)(14)(23)(34)]
-- gtgtgt esCircuito (grafoCiclo 4) [12341]
-- True
-- gtgtgt esCircuito (grafoCiclo 4) [1234]
-- False
-- gtgtgt esCircuito (grafoCiclo 4) [1234141]
-- False
esCircuito (Ord a) =gt Grafo a -gt [a] -gt Bool
esCircuito g c =
esRecorrido g c ampamp esCerrado g c
378 Ciclos
Definicioacuten 3710 Un camino simple en un grafo G se dice que es un ciclo si sus extremosson iguales
La funcioacuten (esCiclo g c) se verifica si el camino c es un ciclo en el grafo g
-- | Ejemplos
-- gtgtgt esCiclo (grafoCiclo 4) [121]
-- False
-- gtgtgt esCiclo (grafoCiclo 4) [12341]
-- True
-- gtgtgt esCiclo (grafoCiclo 4) [1234]
-- False
-- gtgtgt esCiclo (grafoCiclo 4) [1234141]
-- False
esCiclo (Ord a) =gt Grafo a -gt [a] -gt Bool
esCiclo g c =
esCaminoSimple g c ampamp esCerrado g c
96 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (todosCiclos g v) devuelve todos los ciclos en el grafo g que pasan porel veacutertice v
-- | Ejemplos
-- gtgtgt todosCiclos (grafoCiclo 4) 3
-- [[34123][32143]]
-- gtgtgt todosCiclos (completo 3) 2
-- [[2312][2132]]
-- gtgtgt todosCiclos (creaGrafo [123] [(11)(12)(13)(23)]) 1
-- [[1][1321][1231]]
-- gtgtgt todosCiclos (creaGrafo [12] [(12)(22)(23)]) 2
-- [[2]]
todosCiclos Ord a =gt Grafo a -gt a -gt [[a]]
todosCiclos g x =
map f (filter p (concat [todosArcosBA g x u | u lt- a x]))
where p c = longitudCamino c = 1
f c | longitudCamino c == 0 = c
| otherwise = c ++ [x]
a = adyacentes g
Nota 373 El algoritmo utilizado en la definicioacuten de (todosCiclos g) es el de buacutes-queda en anchura Este algoritmo recorre el grafo por niveles de forma que el pri-mer camino de la lista es de longitud miacutenima
379 Grafos aciacuteclicos
Definicioacuten 3711 Diremos que un grafo G = (V A) es aciacuteclico si no contiene ninguacutenciclo es decir si forallv isin V no existe ninguacuten camino simple que comience y termine en v
La funcioacuten (esAciclico g) se verifica si el grafo g es aciacuteclico
-- | Ejemplo
-- gtgtgt esAciclico (creaGrafo [14] [(12)(24)])
-- True
-- gtgtgt esAciclico (grafoCiclo 5)
-- False
-- gtgtgt esAciclico (grafoEstrella 6)
-- True
esAciclico Ord a =gt Grafo a -gt Bool
esAciclico g =
and [null (todosCiclos g x) | x lt- vertices g]
38 Conectividad de los grafos 97
38 Conectividad de los grafos
381 Estar conectados por un camino
Teorema 381 Dado un grafo G la relacioacuten u sim v (estar conectados por un camino) es unarelacioacuten de equivalencia
La funcioacuten (estarConectadosCamino g) devuelve la relacioacuten entre los veacutertices delgrafo g de estar conectados por un camino en eacutel
-- | Ejemplo
-- gtgtgt estarConectadosCamino (creaGrafo [14] [(12)(24)])
-- [(11)(12)(14)(21)(22)(24)(33)(41)(42)(44)]
estarConectadosCamino Ord a =gt Grafo a -gt [(aa)]
estarConectadosCamino g =
[(uv) | u lt- vs v lt- vs estanConectados g u v]
where vs = vertices g
A continuacioacuten comprobaremos el resultado con QuickCheck
ghcigt quickCheck prop_conectadosRelEqui
+++ OK passed 100 tests
prop_conectadosRelEqui Grafo Int -gt Bool
prop_conectadosRelEqui g =
esRelacionEquivalencia (vertices g) (estarConectadosCamino g)
382 Componentes conexas de un grafo
Definicioacuten 382 Las clases de equivalencia obtenidas por la relacioacuten sim estar conectadospor un camino en un grafo G inducen subgrafos en G los veacutertices y todas las aristas de loscaminos que los conectan que reciben el nombre de componentes conexas por caminosde G
La funcioacuten (componentesConexas1 g) devuelve las componentes conexas por cami-nos del grafo g
-- | Ejemplos
-- gtgtgt componentesConexas (creaGrafo [15] [(12)(23)])
-- [[123][4][5]]
-- gtgtgt componentesConexas (creaGrafo [15] [(12)(23)(45)])
-- [[123][45]]
-- gtgtgt componentesConexas (creaGrafo [13] [(12)(23)])
-- [[123]]
componentesConexas1 Ord a =gt Grafo a -gt [[a]]
componentesConexas1 g =
clasesEquivalencia (vertices g) (estarConectadosCamino g)
98 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Vamos a definir dos nuevas funciones una que compruebe si el grafo es nulo o com-pleto pues en dichos casos las componentes seraacuten el conjunto vaciacuteo y el conjuntodel conjunto de veacutertices respectivamente y otra con un algoritmo algo maacutes comple-jo
componentesConexas2 Ord a =gt Grafo a -gt [[a]]
componentesConexas2 g
| esGrafoNulo g = []
| esCompleto g = [vertices g]
| otherwise =
clasesEquivalencia (vertices g) (estarConectadosCamino g)
componentesConexas3 Ord a =gt Grafo a -gt [[a]]
componentesConexas3 g = aux (vertices g) [] []
where aux [] [] [] = []
aux [] xs ys = [xs]
aux (vvs) [] [] =
aux (vs (a v)) (i v (a v)) (a v)
aux vs xs ys | null ((ug [a v | v lt- ys]) xs) =
xs aux vs [] []
| otherwise =
aux (vs ug [a v | v lt- ys])
(u xs (ug [a v | v lt- ys]))
(ug [a v | v lt- ys] ys)
a = adyacentes g
i = inserta
ug = unionGeneral
u = unionConjuntos
La comprobacioacuten con QuickCheck de la equivalencia de las definiciones es
ghcigt quickCheck prop_EquiComponentesConexas
+++ OK passed 100 tests
ghcigt quickCheck prop_EquiComponentesConexas2
+++ OK passed 100 tests
prop_EquiComponentesConexas Grafo Int -gt Bool
prop_EquiComponentesConexas g =
componentesConexas1 g == componentesConexas2 g
prop_EquiComponentesConexas2 Grafo Int -gt Bool
prop_EquiComponentesConexas2 g =
componentesConexas1 g == componentesConexas3 g
Comparemos ahora la eficiencia de las definiciones
ghcigt componentesConexas1 grafoNulo
[]
(003 secs 0 bytes)
38 Conectividad de los grafos 99
ghcigt componentesConexas2 grafoNulo
[]
(001 secs 0 bytes)
ghcigt componentesConexas3 grafoNulo
[]
(001 secs 0 bytes)
ghcigt length (componentesConexas1 (completo 50))
1
(023 secs 0 bytes)
ghcigt length (componentesConexas2 (completo 50))
1
(016 secs 0 bytes)
ghcigt length (componentesConexas3 (completo 50))
1
(008 secs 0 bytes)
ghcigt length (componentesConexas1 (completo 100))
1
(217 secs 205079912 bytes)
ghcigt length (componentesConexas2 (completo 100))
1
(285 secs 0 bytes)
ghcigt length (componentesConexas3 (completo 100))
1
(119 secs 0 bytes)
ghcigt length (componentesConexas1 (completo 150))
1
(1295 secs 742916792 bytes)
ghcigt length (componentesConexas2 (completo 150))
1
(2048 secs 0 bytes)
ghcigt length (componentesConexas3 (completo 150))
1
(964 secs 0 bytes)
Con grafos completos de gran tamantildeo Haskell tarda maacutes tiempo en comprobar quees completo que en calcular directamente sus clases de equivalencia y para grafosnulos apenas hay diferencia en el coste entre la primera y la segunda definicioacuten Porotra parte la tercera definicioacuten es la maacutes eficiente en todos los casos y seraacute por tantola que utilizaremos a lo largo del trabajo
componentesConexas Ord a =gt Grafo a -gt [[a]]
componentesConexas = componentesConexas3
La funcioacuten (numeroComponentes g) devuelve el nuacutemero de componentes conexasdel grafo g
-- Ejemplos
-- gtgtgt numeroComponentes (creaGrafo [15] [(12)(23)(45)])
100 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- 2
-- gtgtgt numeroComponentes (creaGrafo [14] [(12)(22)(34)])
-- 2
numeroComponentes Ord a =gt Grafo a -gt Int
numeroComponentes g
| null (aristas g) = orden g
| otherwise = length (componentesConexas g)
Nota 381 Hemos comprobado para la definicioacuten anterior que comprobar si un gra-fo es completo es muy costoso luego no conviene antildeadirlo como patroacuten
383 Grafos conexos
Definicioacuten 383 Dado un grafo diremos que es conexo si la relacioacuten tiene una uacutenica clasede equivalencia en eacutel es decir si el grafo tiene una uacutenica componente conexa
La funcioacuten (esConexo g) se verifica si el grafo g es conexo
-- Ejemplos
-- gtgtgt esConexo (creaGrafo [13] [(12)(23)])
-- True
-- gtgtgt esConexo (creaGrafo [15] [(12)(23)(45)])
-- False
esConexo Ord a =gt Grafo a -gt Bool
esConexo g = length (componentesConexas g) == 1
esConexo2 Ord a =gt Grafo a -gt Bool
esConexo2 g
| esGrafoNulo g = False
| esUnitario (vertices g) = True
| otherwise = aux (vertices g) [] []
where aux [] [] [] = False
aux [] xs _ = True
aux (vvs) [] [] | null vs = True
| null (a v) = False
| otherwise =
aux (vs a v) (i v (a v)) (a v)
aux vs xs ys | null ((ug [a v | v lt- xs]) xs) = False
| otherwise =
aux (vs (ug [a v | v lt- xs]))
(u (ug [a v | v lt- xs]) xs)
((ug [a v | v lt- xs]) xs)
a = adyacentes g
ug = unionGeneral
i = inserta
u = unionConjuntos
38 Conectividad de los grafos 101
La comprobacioacuten de la equivalencia de las definiciones con QuickCheck es
ghcigt quickCheck prop_EquiEsConexo
+++ OK passed 100 tests
prop_EquiEsConexo Grafo Int -gt Bool
prop_EquiEsConexo g =
esConexo g == esConexo2 g
Vamos a comparar ahora su eficiencia
ghcigt let g1 = grafoCiclo 100
(000 secs 0 bytes)
ghcigt let g = creaGrafo (vertices g1) (aristas g1 [(23)(9899)])
(000 secs 0 bytes)
ghcigt esConexo g
False
(117 secs 151632168 bytes)
ghcigt esConexo2 g
False
(001 secs 0 bytes)
ghcigt esConexo (grafoCiclo 500)
True
(7341 secs 10448270712 bytes)
ghcigt esConexo2 (grafoCiclo 500)
True
(18939 secs 18468849096 bytes)
ghcigt esConexo (grafoCiclo 500)
True
(7341 secs 10448270712 bytes)
ghcigt esConexo2 (grafoCiclo 500)
True
(18939 secs 18468849096 bytes)
En principio no nos proporciona ninguna ventaja la segunda definicioacuten asiacute que tra-bajaremos con la primera que hemos dado ya que es mucho maacutes sencilla
Teorema 384 Sea G un grafo G = (V A) es conexo si y solamente si forallu v isin V existe uncamino entre u y v
Vamos a comprobar el resultado con QuickCheck
ghcigt quickCheck prop_caracterizaGrafoConexo
+++ OK passed 100 tests
prop_caracterizaGrafoConexo Grafo Int -gt Property
prop_caracterizaGrafoConexo g =
not (esGrafoNulo g) ==gt
esConexo g == and [estanConectados g u v
| u lt- vertices g v lt- vertices g]
102 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
384 Excentricidad
Definicioacuten 385 Sean G = (V A) un grafo y v isin V Se define la excentricidad de v comoel maacuteximo de las distancias entre v y el resto de veacutertices de G La denotaremos por e(v)
La funcioacuten (excentricidad g v) devuelve la excentricidad del veacutertice v en el grafog
-- | Ejemplos
-- gtgtgt let g = creaGrafo [13] [(12)(23)(33)]
-- gtgtgt excentricidad g 1
-- Just 2
-- gtgtgt excentricidad g 2
-- Just 1
-- gtgtgt excentricidad (creaGrafo [13] [(12)(33)]) 1
-- Nothing
excentricidad Ord a =gt Grafo a -gt a -gt Maybe Int
excentricidad g u
| esGrafoNulo g = Nothing
| orden g == 1 = Just 0
| Nothing `elem` distancias = Nothing
| otherwise = maximum distancias
where distancias = [distancia g u v | v lt- vertices g [u]]
La funcioacuten (excentricidades g) devuelve la lista ordenada de las excentricidadesde los veacutertices del grafo g
-- | Ejemplos
-- gtgtgt excentricidades (creaGrafo [13] [(12)(23)(33)])
-- [Just 1Just 2Just 2]
-- gtgtgt excentricidades (creaGrafo [13] [(12)(33)])
-- [NothingNothingNothing]
excentricidades Ord a =gt Grafo a -gt [Maybe Int]
excentricidades g = sort (map (excentricidad g) (vertices g))
385 Diaacutemetro
Definicioacuten 386 Sea G = (V A) un grafo Se define el diaacutemetro de G como el maacuteximo delas distancias entre los veacutertices en V Lo denotaremos por d(G)
La funcioacuten (diametro g) devuelve el diaacutemetro del grafo g
-- | Ejemplos
-- gtgtgt diametro (creaGrafo [13] [(12)(23)(33)])
-- Just 2
-- gtgtgt diametro (creaGrafo [13] [(12)(33)])
-- Nothing
diametro Ord a =gt Grafo a -gt Maybe Int
38 Conectividad de los grafos 103
diametro g
| esGrafoNulo g = Nothing
| Nothing `elem` distancias = Nothing
| otherwise = maximum distancias
where vs = vertices g
distancias = [distancia g u v | u lt- vs v lt- vs u lt= v]
386 Radio
Definicioacuten 387 Sean G = (V A) un grafo y v isin V Se define el radio de G como elmiacutenimo de las excentricidades de sus veacutertices Lo denotaremos por r(G)
La funcioacuten (radio g) devuelve el radio del grafo g
-- | Ejemplos
-- gtgtgt radio (creaGrafo [13] [(12)(23)(33)])
-- Just 1
-- gtgtgt radio (creaGrafo [13] [(12)(33)])
-- Nothing
radio Ord a =gt Grafo a -gt Maybe Int
radio g
| esGrafoNulo g = Nothing
| Nothing `elem` ds = Nothing
| otherwise = minimum ds
where ds = [excentricidad g v | v lt- vertices g]
387 Centro
Definicioacuten 388 Sean G = (V A) un grafo Llamamos centro del grafo G al conjunto deveacutertices de excentricidad miacutenima A estos veacutertices se les denomina veacutertices centrales
La funcioacuten (centro g) devuelve el centro del grafo g Por ejemplo
-- | Ejemplos
-- gtgtgt centro (creaGrafo [13] [(12)(23)(33)])
-- [2]
-- gtgtgt centro (creaGrafo [13] [(12)(13)(23)])
-- [123]
-- gtgtgt centro (creaGrafo [13] [(12)(33)])
-- [123]
centro Ord a =gt Grafo a -gt [a]
centro g = [v | v lt- vertices g excentricidad g v == r]
where r = radio g
104 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
388 Grosor
Definicioacuten 389 Sean G = (V A) un grafo Se llama grosor o cintura del grafo G almiacutenimo de las longitudes de los ciclos de G Si el grafo no posee ciclos (es decir es un grafoaciacuteclico) se dice que su cintura es infinita
La funcioacuten (grosor g) devuelve el grosor del grafo g
-- | Ejemplos
-- gtgtgt grosor (creaGrafo [123] [(12)(23)])
-- Nothing
-- gtgtgt grosor (creaGrafo [123] [(11)(12)(23)(34)])
-- Just 0
-- gtgtgt grosor grafoPetersen
-- Just 5
-- gtgtgt grosor grafoMoebiusCantor
-- Just 6
-- gtgtgt grosor grafoHeawood
-- Just 6
-- gtgtgt grosor grafoMcGee
-- Just 7
-- gtgtgt grosor grafoTutteCoxeter
-- Just 8
grosor Ord a =gt Grafo a -gt Maybe Int
grosor g
| esAciclico g = Nothing
| otherwise = Just (minimum [longitudCamino (head yss)
| x lt- vertices g
let yss = todosCiclos g x
not (null yss)])
Propiedades del grosor de los grafos
Teorema 3810 El grosor del grafo ciclo de orden n Cn es infin si n lt 3 y 3 en caso contrario
La propiedad se expresa por
prop_grosor_grafoCiclo Int -gt Bool
prop_grosor_grafoCiclo n =
grosor (grafoCiclo n) == if n lt 3
then Nothing
else Just n
Su comprobacioacuten para n le 30 es
ghcigt all prop_grosor_grafoCiclo [130]
True
Teorema 3811 El grosor del grafo amistad de orden n es 3 para todo n
38 Conectividad de los grafos 105
prop_grosor_grafoAmistad Int -gt Bool
prop_grosor_grafoAmistad n =
grosor (grafoAmistad n) == Just 3
Su comprobacioacuten para n le 30 es
ghcigt all prop_grosor_grafoAmistad [130]
True
Teorema 3812 El grosor del grafo completo de orden n Kn es infin si n lt 3 y 3 en casocontrario
La propiedad se expresa por
prop_grosor_completo Int -gt Bool
prop_grosor_completo n =
grosor (completo n) == if n lt 3
then Nothing
else Just 3
Su comprobacioacuten para n le 30 es
ghcigt all prop_grosor_completo [130]
True
Teorema 3813 El grosor del grafo bipartito completo de orden Kmn es infin si m = 1 oacuten = 1 y es 4 en caso contrario y 3 en caso contrario
La propiedad se expresa por
prop_grosor_bipartitoCompleto Int -gt Int -gt Bool
prop_grosor_bipartitoCompleto m n =
grosor (bipartitoCompleto m n) == if m == 1 || n == 1
then Nothing
else Just 4
Su comprobacioacuten para 1 le m le n le 15 es
ghcigt and [prop_grosor_bipartitoCompleto m n | m lt- [115] n lt- [m15]]
True
Teorema 3814 El grosor del grafo rueda de orden n Wn es infin si n lt 3 y 3 en caso contrario
La propiedad se expresa por
prop_grosor_grafoRueda Int -gt Bool
prop_grosor_grafoRueda n =
grosor (grafoRueda n) == if n lt 3
then Nothing
else Just 3
106 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Su comprobacioacuten para 1 le n le 30 es
ghcigt all prop_grosor_grafoRueda [130]
True
389 Propiedades e invariantes por isomorfismos
Teorema 3815 Sean G = (V A) y Gprime = (Vprime Aprime) grafos isomorfos con φ V rarr Vprime unisomorfismo Entonces dados u v isin V u sim v si y solamente si φ(u) sim φ(v)
La comprobacioacuten del teorema con QuickCheck es
ghcigt quickCheck prop_ConexionIsomorfismo1
+++ OK passed 100 tests
prop_ConexionIsomorfismo1 Grafo Int -gt Grafo Int -gt Bool
prop_ConexionIsomorfismo1 g h =
not (isomorfos g h) ||
and [ec g u v == ec h (imagen phi u) (imagen phi v)
| u lt- vs
v lt- vs
phi lt- isomorfismos g h]
where vs = vertices g
ec = estanConectados
Teorema 3816 Sean G = (V A) y Gprime = (Vprime Aprime) grafos isomorfos con φ V rarr Vprime unisomorfismo Entonces φ lleva cada componente conexa de G en una componente conexa deGprime
La comprobacioacuten del teorema con QuickCheck es
ghcigt quickCheck prop_ConexionIsomorfismo2
+++ OK passed 100 tests
prop_ConexionIsomorfismo2 Grafo Int -gt Grafo Int -gt Bool
prop_ConexionIsomorfismo2 g h =
not(isomorfos g h) ||
and [conjuntosIguales cch (aux f) | f lt- isomorfismos g h]
where cch = componentesConexas h
ccg = componentesConexas g
aux f = map (sort imagenConjunto f) ccg
Teorema 3817 Sean G = (V A) y Gprime = (Vprime Aprime) grafos isomorfos con φ V rarr Vprime unisomorfismo Entonces G y Gprime tienen el mismo nuacutemero de componentes conexas
La comprobacioacuten del teorema con QuickCheck es
38 Conectividad de los grafos 107
ghcigt quickCheck prop_ConexionIsomorfismo3
+++ OK passed 100 tests
prop_ConexionIsomorfismo3 Grafo Int -gt Grafo Int -gt Bool
prop_ConexionIsomorfismo3 g h =
not (isomorfos g h) ||
numeroComponentes g == numeroComponentes h
Teorema 3818 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que el diaacutemetro de G es igual al diaacutemetro de Gprime es decir el diaacutemetrode un grafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos diametro)
+++ OK passed 100 tests
Teorema 3819 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces se verifica que el radio de G es igual al radio de Gprime es decir el radio de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos radio)
+++ OK passed 100 tests
Teorema 3820 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que el grosor de G es igual al grosor de Gprime es decir el grosor de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos grosor)
+++ OK passed 100 tests
Teorema 3821 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que el centro de G es igual al centro de Gprime es decir el centro de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos centro)
+++ OK passed 100 tests
Teorema 3822 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces se verifica que el nuacutemero de componentes conexas de G es igual al nuacutemerode las de Gprime es decir el nuacutemero de componentes conexas de un grafo es un invariante porisomorfismos
108 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos numeroComponentes)
+++ OK passed 100 tests
Teorema 3823 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que los valores que toman las excentricidades de los veacutertices G esigual al de los veacutertices de Gprime es decir el conjunto de valores que toman las excentricidadesde los veacutertices es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos excentricidades)
+++ OK passed 100 tests
Capiacutetulo 4
Matrices asociadas a grafos
En este capiacutetulo se definiraacuten algunas representaciones de grafos como matrices secomprobaraacuten sus propiedades y volveremos a definir algunos conceptos del capiacutetu-lo 3 ahora utilizando matricesPara elaborar el contenido del capiacutetulo utilizareacute el segundo tema del trabajo fin degrado de Fco Javier Franco Galviacuten Aspectos algebraicos en teoriacutea de grafos ([7]) En eltrabajo el autor introduce los conceptos de matriz de adyacencia matriz de incidenciay otras matrices asociadas a grafos
41 Generador de grafos simples
En esta seccioacuten presentaremos el generador de grafos que nos permitiraacute generargrafos simples como listas de aristas arbitrariamente y usarlos como ejemplos opara comprobar propiedades en la seccioacuten de matrices asociadas a grafos(grafoSimple) es un generador de grafos simples de hasta 10 veacutertices Por ejemplo
ghcigt sample grafoSimple
G [12345678] [(14)(15)(16)(17)(18)(23)
(24)(25)(27)(35)(37)(45)(46)(56)(67)]
G [123456789] [(14)(18)(23)(25)(29)
(34)(35)(36)(38)(39)(46)(48)(49)
(58)(59)(69)(78)]
G [123456] [(12)(13)(24)(25)(26)(35)(56)]
G [1234567] [(12)(13)(14)(24)(25)(26)
(36)(45)(46)(67)]
G [1234] [(13)(14)(23)(34)]
G [123] [(23)]
G [12] [(12)]
G [123456] [(16)(24)(26)(35)(36)(56)]
G [123456789] [(12)(14)(15)(16)(17)(24)
(34)(37)(38)(39)(45)(47)(49)(56)(57)
(58)(59)(67)(69)(78)(79)]
109
110 Capiacutetulo 4 Matrices asociadas a grafos
G [123456789] [(13)(14)(15)(16)(23)(24)
(29)(35)(39)(45)(47)(48)(49)(57)(58)
(59)(67)(68)(69)(79)]
G [1] []
grafoSimple Gen (Grafo Int)
grafoSimple = do
n lt- choose (010)
as lt- sublistOf [(xy) | x lt- [1n] y lt- [x+1n]]
return (creaGrafo [1n] as)
42 Matrices de adyacencia
421 Definicioacuten y propiedades
Usaremos la funcioacuten (imprimeMatriz p) para imprimir por pantalla la matriz p conuna fila por liacutenea
-- | Ejemplo
-- gtgtgt imprimeMatriz (fromLists [[134][357][479]])
-- [134]
-- [357]
-- [479]
imprimeMatriz Show a =gt Matrix a -gt IO ()
imprimeMatriz p =
mapM_ print (toLists p)
Definicioacuten 421 Sea G = (V A) un grafo simple con V = v1 vn Se define sumatriz de adyacencia como Antimesn = (aij) donde el elemento aij toma el valor 1 si existealguna arista en A uniendo los veacutertices vi y vj y 0 en caso contrario
Nota 421 La matriz de adyacencia depende del etiquetado del grafo
La funcioacuten (matrizAdyacencia g) es la matriz de adyacencia del grafo g
-- | Ejemplo
-- gtgtgt imprimeMatriz (matrizAdyacencia (grafoCiclo 4))
-- [0101]
-- [1010]
-- [0101]
-- [1010]
-- gtgtgt imprimeMatriz (matrizAdyacencia (completo 4))
-- [0111]
-- [1011]
-- [1101]
-- [1110]
42 Matrices de adyacencia 111
matrizAdyacencia Grafo Int -gt Matrix Int
matrizAdyacencia g = matrix n n f
where n = orden g
f (ij) | (ij) `aristaEn` g = 1
| otherwise = 0
422 Propiedades baacutesicas de las matrices
La funcioacuten (esSimetrica p) se verifica si la matriz p es simeacutetrica
-- ejemplo
-- gtgtgt esSimetrica (fromLists [[134][357][479]])
-- True
-- gtgtgt esSimetrica (fromLists [[134][357][497]])
-- False
esSimetrica Eq a =gt Matrix a -gt Bool
esSimetrica p =
transpose p == p
La funcioacuten (potencia p n) devuelvela potencia nndasheacutesima de la matriz cuadrada p
-- Ejemplo
-- gtgtgt potencia (fromLists [[134][357][479]]) 3
-- ( 408 735 975 )
-- ( 735 1323 1755 )
-- ( 975 1755 2328 )
potencia Num a =gt Matrix a -gt Int -gt Matrix a
potencia p 1 = p
potencia p n = if (odd n)
then (m p (potencia (m p p) (div (n-1) 2)))
else (potencia (m p p) (div (n-1) 2))
where m = multStd2
423 Propiedades de las matrices de adyacencia
Teorema 422 Para todo n la matriz de adyacencia del grafo ciclo de orden n Cn es simeacute-trica
ghcigt all prop_simetricaAdyacenciaCompleto [130]
True
prop_simetricaAdyacenciaCompleto Int -gt Bool
prop_simetricaAdyacenciaCompleto n =
esSimetrica (matrizAdyacencia (completo n))
La funcioacuten (tamantildeoM g) devuelve el tamantildeo del grafo simple g calculado usandosu matriz de adyacencia
112 Capiacutetulo 4 Matrices asociadas a grafos
-- | Ejemplos
-- gtgtgt tamantildeoM (grafoCiclo 4)
-- 4
-- gtgtgt tamantildeoM grafoPetersen
-- 15
tamantildeoM Grafo Int -gt Int
tamantildeoM g = sum (toList (matrizAdyacencia g)) `div` 2
Teorema 423 El tamantildeo de un grafo simple es la mitad de la suma de los elementos de sumatriz de adyacencia
La comprobacioacuten del teorema con QuickCheck es
ghcigt quickCheck prop_tamantildeoMatriz
+++ OK passed 100 tests
prop_tamantildeoMatriz Property
prop_tamantildeoMatriz =
forAll grafoSimple
(g -gt tamantildeo g == tamantildeoM g)
Teorema 424 Si un grafo G = (V A) tiene un veacutertice aislado vi tanto la fila como lacolumna indasheacutesima de su matriz de adyacencia estaraacuten formadas por ceros
esAisladoM Grafo Int -gt Int -gt Bool
esAisladoM g v = if (all (==0)
(((toLists (ma g)) (v-1))
++((toLists (t (ma g))) (v-1))))
then True
else False
where ma = matrizAdyacencia
t = transpose
La comprobacioacuten del teorema es
ghcigt quickCheck prop_esAisladoMatriz
+++ OK passed 100 tests
prop_esAisladoMatriz Property
prop_esAisladoMatriz =
forAll grafoSimple
(g -gt and [esAislado g v == esAisladoM g v
| v lt- vertices g])
Teorema 425 Sea un grafo G = (V A) simple no dirigido con V = v1 vn Lasuma de los elementos de la fila (o columna) indasheacutesima de su matriz de adyacencia coincide conel grado del veacutertice vi Es decir
42 Matrices de adyacencia 113
δ(vi) =n
sumj=1
aij =n
sumj=1
aji
gradoM Grafo Int -gt Int -gt Int
gradoM g v = sum ((toLists (ma g)) (v-1))
where ma = matrizAdyacencia
La comprobacioacuten del teorema es
ghcigt quickCheck prop_gradoMatriz
+++ OK passed 100 tests
prop_gradoMatriz Property
prop_gradoMatriz =
forAll grafoSimple
(g -gt and [grado g v == gradoM g v | v lt- vertices g])
Teorema 426 Sea G = (V A) un grafo bipartito de conjuntos de veacutertices disjuntosV1 = v1 vk y V2 = vk+1 vn tal que V = V1 cup V2 y soacutelo existen aristasque conectan veacutertices de V1 con veacutertices de V2 Entonces con este etiquetado de V la matrizde adyacencia de G tiene la forma
A =
(θ BBt θ
)
prop_BipartitoMatriz Grafo Int -gt Property
prop_BipartitoMatriz g =
esBipartito g ==gt
all (==0) [ getElem u v m | [uv] lt- (f (fromJust p))]
where f (xsys) = filter p (subsequences xs ++ subsequences ys)
where p zs = length zs == 2
p = conjuntosVerticesDisjuntos g
m = matrizAdyacencia g
424 Caminos y arcos
En esta seccioacuten se presentaraacute la informacioacuten que contiene la matriz de adyacenciade un grafo en relacioacuten a los caminos que se encuentran en eacutel
Teorema 427 Sea G = (V A) un grafo con V = v1 vn y matriz de adyacenciaA = (aij) Entonces forallk ge 0 el elemento (i j) de Ak que denotaremos por ak
ij es elnuacutemero de caminos de longitud k desde el veacutertice vi al veacutertice vj
114 Capiacutetulo 4 Matrices asociadas a grafos
numeroCaminosDeLongitudM Grafo Int -gt Int -gt Int -gt Int -gt Int
numeroCaminosDeLongitudM g u v k = getElem u v mk
where ma = matrizAdyacencia g
n = orden g
mk = foldr (multStd2) (identity n) (take k (repeat ma))
La comprobacioacuten del teorema para k le 6 es
ghcigt quickCheck prop_numeroCaminosMatriz
+++ OK passed 100 tests
prop_numeroCaminosMatriz Grafo Int -gt Gen Bool
prop_numeroCaminosMatriz g = do
k lt- choose (06)
let vs = vertices g
return (and [ numeroCaminosDeLongitud g u v k ==
numeroCaminosDeLongitudM g u v k
|(uv) lt- productoCartesiano vs vs u lt v])
De este teorema se deducen las siguientes propiedades
Teorema 428 Sea G un grafo simple Siguiendo la notacioacuten del teorema anterior se tieneque1 a(2)ii = δ(vi)
2 a(3)ii es el nuacutemero de triaacutengulos que contienen al veacutertice vi
gradoCaminosM Grafo Int -gt Int -gt Int
gradoCaminosM g v = getElem v v m2
where m = matrizAdyacencia g
m2 = multStd2 m m
numeroTriangulosM Grafo Int -gt Int -gt Int
numeroTriangulosM g v = getElem v v (potencia m 3)
where m = matrizAdyacencia g
La comprobacioacuten con QuickCheck es
ghcigt quickCheck prop_GradoCaminosMatriz
+++ OK passed 100 tests
ghcigt quickCheck prop_TriangulosMatriz
+++ OK passed 100 tests
prop_GradoCaminosMatriz Grafo Int -gt Bool
prop_GradoCaminosMatriz g =
and [ grado g v == gradoCaminosM g v | v lt- vertices g]
42 Matrices de adyacencia 115
prop_TriangulosMatriz Property
prop_TriangulosMatriz =
forAll grafoSimple
(g -gt and [length (triangulos g v) ==
numeroTriangulosM g v | v lt- vertices g])
116 Capiacutetulo 4 Matrices asociadas a grafos
Capiacutetulo 5
Apeacutendices
51 Sistemas utilizados
El desarrollo de mi Trabajo de Fin de Grado requeriacutea de una infraestructura teacutecnicaque he tenido que trabajar antes de comenzar a desarrollar el contenido A conti-nuacioacuten voy a nombrar y comentar los sistemas y paquetes que he utilizado a lolargo del proyectobull Ubuntu como sistema operativo El primer paso fue instalar Ubuntu en mi orde-
nador portaacutetil personal Para ello seguiacute las recomendaciones de mi compantildeeroEduardo Paluzo quien ya lo habiacutea hecho antesPrimero me descargueacute la imagen del sistema Ubuntu 1604 LTS (para procesadorde 64 bits) desde la paacutegina de descargas de Ubuntu 1 y tambieacuten la herramientaLinuxLive USB Creator 2 que transformariacutea mi pendrive en una unidad USB Boo-teable cargada con la imagen de Ubuntu Una vez tuve la unidad USB preparadaprocediacute a instalar el nuevo sistema apagueacute el dispositivo y al encenderlo entreacuteen el Boot Menu de la BIOS del portaacutetil para arrancar desde el Pendrive en vez dehacerlo desde el disco duro Automaacuteticamente comenzoacute la instalacioacuten de Ubuntuy solo tuve que seguir las instrucciones del asistente para montar Ubuntu mante-niendo ademaacutes Windows 10 que era el sistema operativo con el que habiacutea estadotrabajando hasta ese momentoEl resultado fue un poco agridulce pues la instalacioacuten de Ubuntu se habiacutea reali-zado con eacutexito sin embargo al intentar arrancar Windows desde la nueva GRUBme daba un error al cargar la imagen del sistema Despueacutes de buscar el error queme apareciacutea en varios foros encontreacute una solucioacuten a mi problema deshabiliteacute elSecurity Boot desde la BIOS y pude volver a arrancar Windows 10 con normali-dad
1httpwwwubuntucomdownloaddesktop2httpwwwlinuxliveusbcom
117
118 Capiacutetulo 5 Apeacutendices
bull LATEX como sistema de composicioacuten de textos La distribucioacuten de LATEXTex Livecomo la mayoriacutea de software que he utilizado la descargueacute utilizando el Gestorde Paquetes Synaptic Anteriormente soacutelo habiacutea utilizado TexMaker como editorde LATEX asiacute que fue el primero que descargueacute Maacutes tarde mi tutor Joseacute Antoniome sugirioacute que mejor descargara el paquete AUCTex pues me permitiriacutea trabajarcon archivos TEX desde el editor Emacs asiacute lo hice y es el que he utilizado pararedactar el trabajo Ademaacutes de los que me recomendaba el gestor solo he tenidoque descargarme el paquete spanish de babel para poder componer el trabajo puesel paquete Tikz que he utilizado para representar los grafos veniacutea incluido en lassugerencias de Synapticbull Haskell como lenguaje de programacioacuten Ya habiacutea trabajado anteriormente con
este lenguaje en el grado y sabiacutea que soacutelo teniacutea que descargarme la plataforma deHaskell y podriacutea trabajar con el editor Emacs Seguiacute las indicaciones que se dan alos estudiantes de primer curso en la paacutegina del Dpto de Ciencias de la Compu-tacioacuten e Inteligencia Artificial 3 y me descargueacute los paquetes haskell-platform yhaskell-mode desde el Gestor de Paquetes Synaptic La versioacuten de la plataforma deHaskell con la que he trabajado es la 2014200debian2 y la del compilador GHC la7103-7bull Dropbox como sistema de almacenamiento compartido Ya habiacutea trabajado con
Dropbox en el pasado asiacute que crear una carpeta compartida con mis tutores nofue ninguacuten problema sin embargo al estar Dropbox sujeto a software no libre nome resultoacute tan sencillo instalarlo en mi nuevo sistema En primer lugar intenteacutehacerlo directamente desde Ubuntu Software que intentoacute instalar Dropbox Nauti-lus y abrioacute dos instalaciones en paralelo Se quedoacute colgado el ordenador asiacute quemateacute los procesos de instalacioacuten activos reinicieacute el sistema y me descargueacute direc-tamente el paquete de instalacioacuten desde la paacutegina de descargas de Dropbox 4 y loejecuteacute desde la terminalbull Git como sistema remoto de control de versiones Era la primera vez que trabaja-
ba con Git y me costoacute bastante adaptarme Mi tutor Joseacute Antonio y mi compantildeeroEduardo Paluzo me ayudaron mucho e hicieron el proceso de adaptacioacuten muchomaacutes aacutegil El manual que Eduardo ha redactado y presenta en su Trabajo Fin deGrado me ha sido muy uacutetil es una pequentildea guiacutea que cualquier interesado en elempleo de Git puede utilizar como introduccioacuten La instalacioacuten no resultoacute com-plicada a traveacutes del Gestor de Paquetes Synaptic me descargueacute el paquete elpa-magity todos los demaacutes paquetes necesarios para trabajar con Git en mi portaacutetil usandoel editor Emacs Eduardo me ayudoacute a crear el repositorio MDenHaskell en la plata-forma GitHub y clonarlo en mi ordenador personal Dicho repositorio contiene el
3httpwwwcsuses~jalonsocursosi1m-15sistemasphp4httpswwwdropboxcomesinstallos=lnx
52 Mapa de decisiones de disentildeo en conjuntos 119
total del trabajo y se almacena de forma puacuteblica La versioacuten de Magit que utilizoes la 250-2
52 Mapa de decisiones de disentildeo en conjuntos
Una vez comenzado el trabajo y habiendo hecho ya varias secciones acerca de laTeoriacutea de Grafos se puso de manifiesto la conveniencia de crear nuevos capiacutetulosintroduciendo conceptos de la Teoriacutea de Conjuntos y las relaciones que se puedenpresentar entre sus elementosHaskell tiene una libreriacutea especiacutefica para conjuntos DataSet sin embargo no estan intuitiva ni tan eficiente como la de listas (DataList) A lo largo del proyecto hecreado un moacutedulo que permite trabajar con conjuntos utilizando tanto su represen-tacioacuten como listas ordenadas sin elementos repetidos como su representacioacuten comolistas sin elementos repetidos Dicho moacutedulo se llama Conjuntos y lo presento en elprimer capiacutetulo del Trabajo
53 Mapa de decisiones de disentildeo en grafos
Al comienzo del proyecto la idea era que las primeras representaciones con lasque trabajara fueran las de grafos como vectores de adyacencia y grafos como matricesde adyacencia que se utilizan en Informaacutetica en el primer curso del Grado con lasque ya habiacutea trabajado y estaba familiarizadaLas definiciones de Informaacutetica estaacuten pensadas para grafos ponderados (dirigidoso no seguacuten se eligiera) mientras que en Matemaacutetica Discreta apenas se usan grafosdirigidos o ponderados por tanto el primer cambio en la representacioacuten utilizadafue simplificar las definiciones de modo que solo trabajaacuteramos con grafos no diri-gidos y no ponderados pero manteniendo las estructuras vectorial y matricial quemanteniacutean la eficienciaLas representaciones que utilizan arrays en Haskell son muy restrictivas pues soloadmiten vectores y matrices que se puedan indexar lo que hace muy complicadostodos los algoritmos que impliquen alguacuten cambio en los veacutertices de los grafos yademaacutes no permite trabajar con todos los tipos de veacutertices que pudieacuteramos desearDecidimos volver a cambiar la representacioacuten y esta vez nos decantamos por larepresentacioacuten de grafos como listas de aristas perdiendo en eficiencia pero ganandomucho en flexibilidad de escrituraPor uacuteltimo mis tutores sugirieron dar una representacioacuten de los grafos mediantesus matrices de adyacencia y comprobar la equivalencia de las definiciones que yahabiacutea hecho en otros moacutedulos con las dadas para esta representacioacuten Para ello he
120 Capiacutetulo 5 Apeacutendices
trabajado con la libreriacutea DataMatrix de Haskell
Bibliografiacutea
[1] J Alonso Temas de programacioacuten funcional Technical report Univ de Sevilla2015
[2] P Burzyn Complejidad computacional en problemas de modificacioacuten de aris-tas en grafos Technical report Univ de Buenos Aires
[3] K Claessen and J Hughes QuickCheckA Lightweight Tool for Random Tes-ting of Haskell Programs Technical report Chalmers University of Technology2000
[4] M Caacuterdenas Matemaacutetica discreta Technical report Univ de Sevilla 2015
[5] D de Matemaacuteticas El regalo de Cantor Technical report IES Matarrantildea deValderrobres 2009
[6] D de Aacutelgebra Aacutelgebra Baacutesica tema 1 Conjuntos Technical report Univ deSevilla 2015
[7] F Franco Aspectos algebraicos en Teoriacutea de Grafos Technical report Univ deSevilla 2016
[8] F Rabhi and G Lapalme Algorithms A functional programming approachAddison-Wesley Longman Publishing Co Inc Boston MA USA 1st edition1999
[9] P Vasconcelos Property Testing using QuickCheck Technical report Univer-sidade do Porto 2016
[10] Wikipedia Set (mathematics) Technical report Wikipedia La Enciclopedialibre 2016
[11] Wikipedia AnexoGaleriacutea de grafos Technical report Wikipedia La Enciclo-pedia libre 2016
[12] Wikipedia Teoriacutea de la complejidad computacional Technical report Wikipe-dia La Enciclopedia libre 2017
121
Iacutendice alfabeacutetico
Grafo 18 52adyacentes 53antiImagenRelacion 38aristaEn 53aristasCamino 88aristas 53automorfismos 87bipartitoCompleto 58biyecciones 47cardinal 22 31centro 103clasesEquivalencia 43combinaciones 25 34complementario 22 31completo 58componentesConexas1 97componentesConexas2 98componentesConexas3 98conjuntosIguales 30conjuntosIguales 21conjuntosVerticesDisjuntos 59conservaAdyacencia 78creaGrafo 52diametro 102distancia 93dominio 38eliminaArista 74eliminaLazos 74eliminaVertice 74elimina 19 28entorno 69esAisladoM 112
esAislado 69esAntisimetrica 41esAutomorfismo 86esBipartito 60esCamino 87esCerrado 94esCircuito 95esCompleto 77esConexo 100esFuncional 39esFuncion 43esGeodesica 94esInyectiva 45esIsomorfismo 81esLazo 69esReflexiva 40esRegular 70esRelacionEquivalencia 42esRelacionHomogenea 39esRelacionOrden 43esRelacion 37esSimetrica 41 111esSimple 70esSobreyectiva 45 46esSubconjuntoPropio 21 30esSubconjunto 20 29esSubgrafoMax 72esSubgrafoPropio 72esSubgrafo 72esTransitiva 41esUnitario 23 32esVacio 18 27
122
Iacutendice alfabeacutetico 123
estaRelacionado 40estanConectados 93excentricidades 102excentricidad 102funciones 44generaGrafo 54gradoM 113 114grado 69grafoAmistad 57grafoCiclo 56grafoCirculante 61grafoComplementario 77grafoEstrella 60grafoHeawood 64grafoMcGee 64grafoMoebiusCantor 67grafoNulo 55grafoPetersenGen 62grafoPetersen 66grafoRueda 61grafoSimple 110grafoThomson 63grafoTutteCoxeter 65grosor 104imagenConjunto 45imagenInversa 47imagenRelacion 38imagen 44imprimeMatriz 110inserta 18 27interseccion 33interseccion 24inversa 47isomorfismos 82isomorfos 82longitudCamino 88matrizAdyacencia 110minimoElemento 19 28morfismos 79
numeroArcosDeLongitud 92numeroCaminosDeLongitud 89numeroCaminosDeLongitugM 113numeroComponentesConexas 99numeroTriangulosM 114orden 68parDeVertices 91pertenece 19 28potencia 111productoCartesiano 34productoCartesiano 25prop_HavelHakimi 73prop_LemaApretonDeManos 73prop_completos 76prop_BipartitoMatriz 113prop_ConectadosRelEqui 97prop_ConexionIsomorfismo1 106prop_ConexionIsomorfismo2 106prop_ConexionIsomorfismo3 107prop_GradoMatriz 114prop_TriangulosMatriz 114prop_esAisladoMatriz 112prop_gradoMatriz 113prop_numeroCaminosMatriz 114prop_simetricaAdyacenciaCompleto 111prop_tamantildeoMatriz 112prop_todosArcosBA 92radio 103rango 38secuenciaGrados 71secuenciaGrafica 71sinRepetidos 19 29sonIncidentes 68sumaArista 75sumaGrafos 76 77sumaVertice 75tamantildeoM 111tamantildeo 68todosArcosBA 91
124 Iacutendice alfabeacutetico
todosArcos 90todosCaminos 88todosCiclos 96triangulos 94unionConjuntos 23 32unionGeneral 24 33vacio 18 27valenciaMax 70valenciaMin 70variaciones 26 35verticesCamino 88vertices 53
Introduccioacuten
El objetivo del trabajo es la implementacioacuten de algoritmos de matemaacutetica discretaen Haskell Los puntos de partida son
los temas de la asignatura ldquoMatemaacutetica discretardquo ([4])los temas de la asignatura ldquoInformaacuteticardquo ([1])el capiacutetulo 7 del libro ldquoAlgorithms A functional programming approachrdquo ([8]) yel artiacuteculo ldquoGraph theoryrdquo ([11]) de la WikipediaHaskell es un lenguaje de programacioacuten funcional desarrollado en los uacuteltimos antildeos
por la comunidad de programadores con la intencioacuten de usarlo como instrumentopara la ensentildeanza de programacioacuten funcional La motivacioacuten de este desarrollo eshacer el anaacutelisis y disentildeo de programas maacutes simple y permitir que los algoritmos seanfaacutecilmente adaptables a otros lenguajes de programacioacuten funcionales
En comparacioacuten con otros lenguajes de programacioacuten imperativos la sintaxis deHaskell permite definir funciones de forma maacutes clara y compacta En Haskell las fun-ciones se consideran valores al mismo nivel que los tipos enteros o cadenas en cual-quier lenguaje Por ello al igual que es habitual que en todos los lenguajes una funcioacutenreciba datos de entrada (de tipo entero flotante cadena etc) y devuelva datos (de losmismos tipos) en los lenguajes funcionales una funcioacuten puede recibir como dato deentrada una funcioacuten y devolver otra funcioacuten como salida que puede ser construida apartir de sus entradas y por operaciones entre funciones como la composicioacuten Estacapacidad nos proporciona meacutetodos maacutes potentes para construir y combinar los di-versos moacutedulos de los que se compone un programa Por ejemplo emulando la formade operar sobre funciones que habitualmente se usa en matemaacuteticas
La matemaacutetica discreta consiste en el estudio de las propiedades de los conjuntosfinitos o infinitos numerables lo que hace posible su directa implementacioacuten compu-tacional En particular la asignatura ldquoMatemaacutetica Discretardquo del grado se centra enestudiar propiedades y algoritmos de la combinatoria y la teoriacutea de grafos A lo largodel trabajo se implementaraacuten en Haskell definiciones y algoritmos con los que ya seha tenido una primera aproximacioacuten teoacuterica durante el grado
Los dos primeros capiacutetulos del trabajo sientan la base que permitiraacute en los dos si-guientes una aproximacioacuten a la teoriacutea de grafos En el primero se hace una introduc-cioacuten a la teoriacutea de conjuntos y se dan dos posibles representaciones de conjuntos con
11
12 Iacutendice general
las que trabajar en Haskell En el segundo se presentan los conceptos de ldquorelacioacutenrdquo yde ldquofuncioacutenrdquo que al igual que los conjuntos son necesarios para definir aplicacionesde los grafos Su redaccioacuten sigue la liacutenea de la primera parte de la asignatura ldquoAacutelgebraBaacutesicardquo del grado
En el tercer capiacutetulo del trabajo se hace una introduccioacuten a la teoriacutea de grafos Enprimer lugar se dan una representacioacuten con la que trabajar en Haskell y un generadorde grafos que permitiraacute comprobar propiedades con QuickCheck Seguidamente sepresenta una galeriacutea de grafos conocidos que se utilizaraacuten como ejemplos para lasdefiniciones y los algoritmos de las secciones siguientes Las primeras seraacuten algunasdeficiones baacutesicas y despueacutes se trataraacuten los conceptos de ldquomorfismosrdquo ldquocaminosrdquo yldquoconectividadrdquo en grafos
Por uacuteltimo en el cuarto capiacutetulo se da una representacioacuten de los grafos a traveacutesde su matriz de adyacencia Se implementaraacuten algunos de los resultados que JavierFranco Galviacuten expuso en su Trabajo Fin de Grado Aspectos algebraicos en teoriacutea de grafosy se comprueba que concuerdan con el desarrollo hecho en el capiacutetulo anterior
Cabe destacar el trabajo con los diferentes sistemas y programas que se han utiliza-do a lo largo del proyecto
Ubuntu como sistema operativoel editor de textos Emacs que ha permitido el uso de Haskell literario para la redaccioacutendel trabajoel paquete de produccioacuten de graacuteficos vectoriales Tikz de LATEX mediante el que seha dado la representacioacuten graacutefica de los ejemplos de grafosGitHub como sistema remoto de control de versionesy DocTest como sistema de validacioacuten de moacutedulosSe va a hacer una breve introduccioacuten los sistemas maacutes destacados
Ubuntu
Ubuntu es un sistema operativo creado a partir de GNULinux con la intencioacuten dehacer una versioacuten de este maacutes sencilla de manejar y que permitiera acceso al soft-ware libre para todo el mundo por igual La primera distribuioacuten oficial de Ubuntufue la versioacuten 410 y tuvo lugar en 2004 Desde entonces el proyecto ha captadola atencioacuten de miles de entusiastas del software libre que han querido unirse a lacomunidad UbuntuSoftware libre significa que los usuarios tienen la libertad de ejecutar copiar distri-buir estudiar modificar y mejorar el software Es una cuestioacuten de libertad no deprecio Para entender el concepto debe pensarse en laquolibreraquo como en laquolibertad deexpresioacutenraquo
Iacutendice general 13
Maacutes precisamente software libre significa que los usuarios de un programa tienenlas cuatro libertades esencialesbull La libertad de ejecutar el programa como lo desee con cualquier propoacutesito (liber-
tad 0)bull La libertad de estudiar el funcionamiento del programa y adaptarlo a sus necesi-
dades (libertad 1) El acceso al coacutedigo fuente es un prerrequisito para estobull La libertad de redistribuir copias para ayudar a los demaacutes (libertad 2)bull La libertad de mejorar el programa y de publicar las mejoras de modo que toda la
comunidad se beneficie (libertad 3) El acceso al coacutedigo fuente es un prerrequisitopara esto
Debido a la evolucioacuten de la tecnologiacutea y del uso de la red estas libertades son ahoraauacuten maacutes importantes que en el pasadoLo que diferencia a Ubuntu de otros sistemas ofrecidos por Linux es que los equiposcomercial y comunitario colaboran juntos en el desarrollo de un uacutenico proyecto Lasnovedades y avances estaacuten libremente a disposicioacuten de todos los usuarios y sonvoluntarios quienes se hacen cargo de los elementos maacutes criacuteticos del trabajoEn la paacutegina web de Ubuntu 1 se puede obtener maacutes informacioacuten acerca del siste-ma y en la paacutegina web de GNU 2 se puede encontrar maacutes informacioacuten acerca delsoftware libre
Haskell literario con Emacs
Haskell es un lenguaje de programacioacuten puramente funcional basado en lambdacalculus 3 Se caracteriza por sus programas concisos un potente sistema de tiposel trabajo con listas funciones recursivas y de orden superior y por tener evaluacioacutenperezosaTener que escribir coacutedigos largos y complicados hace la tarea del programador muycostosa Los lenguajes de programacioacuten funcional como Haskell lo intentan hacenmaacutes sencillo Aunque no se esteacute en la posicioacuten de usar Haskell en un proyecto de-terminado aprender su razonamiento puede ayudar a mejorar en cualquier otrolenguajeA la hora de elaborar la memoria de un proyecto en el que se estaacute utilizando Haskellla posibilidad de escribir coacutedigo y texto en un formato de calidad otorga globali-dad al trabajo El editor Emacs de GNU permite en particular trabajar en paralelocon Haskell y con Latex El trabajar con Haskell literario ha ayudado a detectar ysolventar errores maacutes raacutepido asiacute como a dar una estructura consolidada al trabajo
1httpswwwubuntucom2httpswwwgnuorg3httpsenwikipediaorgwikiLambda_calculus
14 Iacutendice general
En la paacutegina web del Departamento de Computacioacuten 4 se puede encontrar maacutesinformacioacuten acerca de Haskell y Emacs
GitHub
GitHub es una plataforma de desarrollo colaborativo que permite alojar proyectosusando el control de versiones de Git El trabajo con un sistema como este hacemucho maacutes faacutecil el trabajo en grupo pues cada individuo puede trabajar desde suordenador propio en paralelo a los demaacutes y remotamente ir actualizando el proyectosin perder la posibilidad de restaurarlo a una versioacuten anteriorEn particular GitHub ha sido una excelente herramienta de control de este TrabajoFin de Grado pues los tutores han podido seguir en cada momento el trabajo rea-lizado detectar faacutecilmente los errores y hacer modificaciones directamente sobre eldocumentoEl compantildeero Eduardo Paluzo Hidalgo hace en su Trabajo Fin de Grado una pe-quentildea introduccioacuten al uso de Github y a la instalacioacuten de magit en una distribucioacutenUbuntu muy recomendable para todos aquellos (especialmente los maacutes principian-tes) que tengan intereacutes en trabajar con este sistemaSe puede encontrar maacutes informacioacuten acerca de esta plataforma en la paacutegina web deGit 5
DocTest
DocTest para Haskell es un programa de verificacioacuten dinaacutemica de ejemplos Si se si-gue un determinado formato a la hora de escribir los ejemplos para las funciones deun documento en Haskell Doctest se encarga de comprobar que los ejemplos seancorrectos Estas validaciones han resultado claves en la realizacioacuten del trabajo puesalgunas definiciones han sido modificadas de forma casi continua y este proyectoespecialmente se basa en lo anterior para poder seguir construyendoSu uso es muy sencillo una vez instalado el correspondiente paquete y escrito losejemplos en el formato requerido solo hay que ejecutar el programa desde la consoladando como argumento el fichero que se desea validarSe puede enontrar maacutes informaioacuten acerca del programa y de coacutemo descargarlo ensu repositorio de GitHub 6
4httpwwwcsuses~jalonsocursosi1m-16temastema-1html5httpsgit-scmcom6httpsgithubcomsoldoctest
Capiacutetulo 1
Conjuntos
El concepto de conjunto aparece en todos los campos de las Matemaacuteticas pero iquestqueacutedebe entenderse por eacutel La Teoriacutea de conjuntos fue introducida por Georg Cantor(1845-1917) desde 1869 Cantor ejercioacute como profesor en la Universidad de Halley entre 1879 y 1884 publicoacute una serie de seis artiacuteculos en el Mathematische Annalenen los que hizo una introduccioacuten baacutesica a la teoriacutea de conjuntos En su Beitraumlge zurBegruumlndung der transfiniten Mengenlehre Cantor dio la siguiente definicioacuten de con-junto
Figura 11 Fragmento del texto traducido al ingleacutes en el que Cantor da la definicioacuten de conjunto
laquoDebemos entender por ldquoconjuntordquo (Menge) cualquier coleccioacuten vista co-mo un todo (Zusammenfassung zu einem Ganzen) M de objetos separa-dos y bien definidos m de nuestra intuicioacuten o pensamiento Estos objetosson los ldquoelementosrdquo de Mraquo
Felix Hausdorff en 1914 dice laquoun conjunto es una reunioacuten de cosas que constitu-yen una totalidad es decir una nueva cosaraquo y antildeade laquoesto puede difiacutecilmente seruna definicioacuten pero sirve como demostracioacuten expresiva del concepto de conjunto atraveacutes de conjuntos sencillos como el conjunto de habitantes de una ciudad o el deaacutetomos de Hidroacutegeno del SolraquoUn conjunto asiacute definido no tiene que estar compuesto necesariamente de elementoshomogeacuteneos y ademaacutes da lugar a cuestiones filosoacuteficas como si podemos llamar
15
16 Capiacutetulo 1 Conjuntos
conjunto a aquel que no posee ninguacuten elemento Matemaacuteticamente conviene aceptarsolo elementos que compartan alguna propiedad y definir el conjunto vaciacuteo comoaquel que no tiene elemento algunoEl gran meacuterito de Cantor fue considerar conjuntos transfinitos (que tiene infinitoselementos) concepto inaudito hasta avanzado el siglo XIX hablar del cardinal de unconjunto como el nuacutemero de sus elementos y hablar de conjuntos equivalentes cuan-do puede establecerse una biyeccioacuten entre ellos ideas ya apuntadas por Bolzanoquien se centroacute demasiado en el aspecto filosoacutefico sin llegar a formalizar sus ideas
A lo largo de la seccioacuten haremos una pequentildea introduccioacuten a la Teoriacutea de Conjun-tos presentando formalmente sus conceptos maacutes importantes A la hora de elaborarel contenido se han utilizado los siguientes recursos bibliograacuteficosbull el primer tema de la asignatura ldquoAacutelgebra baacutesicardquo ([6])bull los temas de la asignatura ldquoInformaacuteticardquo ([1])bull el artiacuteculo de la Wikipedia ldquoSet (mathematics)rdquo ([10] ylowast el artiacuteculo ldquoEl regalo de Cantorrdquo ([5])
11 El TAD de los conjuntos
En la presente seccioacuten se definen las operaciones baacutesicas necesarias para trabajarcon conjuntos en un lenguaje funcional En nuestro caso el lenguaje que utilizare-mos seraacute Haskell Daremos la signatura del Tipo Abstracto de Dato (TAD) de losconjuntos y daremos algunos ejemplos de posibles representaciones de conjuntoscon las que podriacuteamos trabajarA continuacioacuten presentamos las operaciones definidas en el TAD de los conjuntos
vacio Conj a
inserta Eq a =gt a -gt Conj a -gt Conj a
elimina Eq a =gt a -gt Conj a -gt Conj a
pertenece Eq a =gt Conj a -gt a -gt Bool
esVacio Conj a -gt Bool
minimoElemento Ord a =gt Conj a -gt a
dondebull (vacio) es el conjunto vaciacuteobull (inserta x c) es el conjunto obtenido antildeadiendo el elemento x al conjunto cbull (elimina x c) es el conjunto obtenido eliminando el elemento x del conjunto cbull (pertenece x c) se verifica si x pertenece al conjunto cbull (esVacio c) se verifica si c no tiene ninguacuten elementobull (minimoElemento c) devuelve el miacutenimo elemento del conjunto c
12 Representaciones de conjuntos 17
Hemos de tener en cuenta que a la hora de crear un nuevo tipo de dato con el querepresentar a los conjuntos este debe ser compatible con la entidad matemaacutetica querepresenta
Estas son algunas de las posibles representaciones con las que podriacuteamos trabajarcon conjuntos en Haskellbull En primer lugar podemos trabajar con la libreriacutea DataSet en este caso la imple-
mentacioacuten del tipo de dato Set estaacute basado en aacuterboles binarios balanceadosbull Por otra parte podemos definir un nuevo tipo Cj xs con el que trabajar con con-
juntos como listas no ordenadas con duplicados como listas no ordenadas sinduplicados o como listas ordenadas sin duplicadosbull Otra opcioacuten seriacutea trabajar directamente con conjuntos como listas para ello de-
bemos ignorar las repeticiones y el orden con vista a la igualdad de conjuntosbull Los conjuntos que soacutelo contienen nuacutemeros (de tipo Int) entre 0 y nminus 1 se pueden
representar como nuacutemeros binarios con n bits donde el bit i(0 le i lt n) es 1 syssel nuacutemero i pertenece al conjunto
Nota 111 Las funciones que aparecen en la especificacioacuten del TAD no dependende la representacioacuten que elijamos
12 Representaciones de conjuntos
121 Conjuntos como listas ordenadas sin repeticioacuten
En el moacutedulo ConjuntosConListasOrdenadasSinRepeticion se definen las funcio-nes del TAD de los conjuntos dando su representacioacuten como listas ordenadas sinrepeticioacuten
module ConjuntosConListasOrdenadasSinRepeticion
( Conj
vacio
inserta
listaAConjunto
elimina
pertenece
esVacio
minimoElemento
sinRepetidos
esUnitario
esSubconjunto
conjuntosIguales
esSubconjuntoPropio
complementario
18 Capiacutetulo 1 Conjuntos
cardinal
unionConjuntos
unionGeneral
interseccion
productoCartesiano
combinaciones
variacionesR
) where
En las definiciones del presente moacutedulo se usaraacuten algunas funciones de la libreriacuteaDataList
Vamos a definir un nuevo tipo de dato (Conj a) que representa a los conjuntoscomo listas ordenadas sin repeticioacuten
type Conj a = [a]
Las funciones baacutesicas que definiremos a partir de este tipo coincidiraacuten con las indi-cadas en el TAD de los conjuntosbull (vacio) es el conjunto vaciacuteo
-- | Ejemplo
-- gtgtgt vacio
-- []
vacio Conj a
vacio = []
bull (inserta x c) es el conjunto obtenido antildeadiendo el elemento x al conjunto c
-- | Ejemplo
-- gtgtgt inserta 5 vacio
-- [5]
-- gtgtgt foldr inserta vacio [2211242]
-- [124]
inserta Ord a =gt a -gt Conj a -gt Conj a
inserta x [] = [x]
inserta x ys
| pertenece ys x = ys
| otherwise = insert x ys
bull (listaAConjunto xs) devuelve el conjunto cuyos elementos son los de la lista xs
-- | Ejemplo
-- gtgtgt listaAConjunto [2211242]
-- [124]
listaAConjunto Ord a =gt [a] -gt Conj a
listaAConjunto = sort nub
bull (esVacio c) se verifica si c es el conjunto vaciacuteo
12 Representaciones de conjuntos 19
-- | Ejemplos
-- gtgtgt esVacio (listaAConjunto [25137532190])
-- False
-- gtgtgt esVacio vacio
-- True
esVacio Conj a -gt Bool
esVacio = null
bull (pertenece x c) se verifica si x es un elemento del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt pertenece c1 3
-- True
-- gtgtgt pertenece c1 4
-- False
pertenece Ord a =gt Conj a -gt a -gt Bool
pertenece ys x =
x == head (dropWhile (ltx) ys)
bull (elimina x c) es el conjunto obtenido eliminando el elemento x del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt elimina 3 c1
-- [012579]
-- gtgtgt elimina 4 c1
-- [0123579]
elimina Ord a =gt a -gt Conj a -gt Conj a
elimina x ys = us ++ dropWhile (==x) vs
where (usvs) = span (ltx) ys
bull (minimoElemento c) devuelve el miacutenimo elemento del conjunto c
-- | Ejemplos
-- gtgtgt minimoElemento (listaAConjunto [25137532190])
-- 0
-- gtgtgt minimoElemento (listaAConjunto ([ae] ++ [AE]))
-- A
minimoElemento Ord a =gt Conj a -gt a
minimoElemento = head
122 Definicioacuten de conjunto
Nota 121 Al trabajar con la representacioacuten de conjuntos como listas en Haskellhemos de cuidar que los ejemplos con los que trabajemos no tengan elementos re-petidos La funcioacuten (sinRepetidos xs) se verifica si la lista xs no tiene ninguacuten ele-mento repetido
20 Capiacutetulo 1 Conjuntos
-- | Ejemplos
-- gtgtgt sinRepetidos []
-- True
-- gtgtgt sinRepetidos [1231]
-- False
sinRepetidos Eq a =gt [a] -gt Bool
sinRepetidos xs = nub xs == xs
Los conjuntos pueden definirse de manera expliacutecita citando todos sus elementosentre llaves de manera impliacutecita dando una o varias caracteriacutesticas que determi-nen si un objeto dado estaacute o no en el conjunto Por ejemplo los conjuntos 1 2 3 4y x isinN|1 le x le 4 son el mismo definido de forma explicita e impliacutecita respecti-vamente
Nota 122 La definicioacuten impliacutecita es necesaria cuando el conjunto en cuestioacuten tieneuna cantidad infinita de elementos En general los conjuntos se notaraacuten con letrasmayuacutesculas A B y los elementos con letras minuacutesculas a b
Cuando trabajamos con conjuntos concretos siempre existe un contexto donde esosconjuntos existen Por ejemplo si A = minus1 1 2 3 4 5 y B = x|x isin Nes par elcontexto donde podemos considerar A y B es el conjunto de los nuacutemeros enterosZ En general a este conjunto se le denomina conjunto universal De una forma algomaacutes precisa podemos dar la siguiente definicioacuten
Definicioacuten 121 El conjunto universal que notaremos por U es un conjunto del queson subconjuntos todos los posibles conjuntos que originan el problema que tratamos
123 Subconjuntos
Definicioacuten 122 Dados dos conjuntos A y B si todo elemento de A es a su vez elementode B diremos que A es un subconjunto de B y lo notaremos A sube B En caso contrario senotaraacute A 6sube B
La funcioacuten (esSubconjunto c1 c2) se verifica si c1 es un subconjunto de c2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
-- gtgtgt c1 `esSubconjunto` c2
-- True
-- gtgtgt c1 `esSubconjunto` vacio
-- False
-- gtgtgt vacio `esSubconjunto` c2
12 Representaciones de conjuntos 21
-- True
-- gtgtgt c3 `esSubconjunto` c4
-- True
-- gtgtgt c2 `esSubconjunto` c1
-- False
esSubconjunto Ord a =gt Conj a -gt Conj a -gt Bool
esSubconjunto [] _ = True
esSubconjunto (xxs) ys =
x == head vs ampamp esSubconjunto xs (tail vs)
where (usvs) = span (ltx) ys
124 Igualdad de conjuntos
Definicioacuten 123 Dados dos conjuntos A y B diremos que son iguales si tienen los mismoselementos es decir si se verifica que A sube B y B sube A Lo notaremos A = B
La funcioacuten (conjuntosIguales c1 c2) se verifica si los conjuntos xs y ys son igua-les
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
-- gtgtgt let c5 = listaAConjunto [4444442]
-- gtgtgt conjuntosIguales c1 c2
-- False
-- gtgtgt conjuntosIguales c3 c4
-- True
-- gtgtgt conjuntosIguales c1 c5
-- True
conjuntosIguales Ord a =gt Conj a -gt Conj a -gt Bool
conjuntosIguales = (==)
125 Subconjuntos propios
Definicioacuten 124 Los subconjuntos de A distintos del empty y del mismo A se denominansubconjuntos propios de A
La funcioacuten (esSubconjuntoPropio c1 c2) se verifica si c1 es un subconjunto pro-pio de c2
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt esSubconjuntoPropio u u
22 Capiacutetulo 1 Conjuntos
-- False
-- gtgtgt esSubconjuntoPropio c1 u
-- True
esSubconjuntoPropio Ord a =gt Conj a -gt Conj a -gt Bool
esSubconjuntoPropio c1 c2 =
not (null c1) ampamp esSubconjunto c1 c2 ampamp c1 = c2
126 Complementario de un conjunto
Definicioacuten 125 Dado un conjunto A se define el complementario de A que notaremospor A como
A = x|x isin U x 6isin A
La funcioacuten (complementario u c) devuelve el complementario del conjunto c y enel universo u
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt let c2 = listaAConjunto [14689]
-- gtgtgt complementario u c1
-- [14689]
-- gtgtgt complementario u u
-- []
-- gtgtgt complementario u vacio
-- [123456789]
-- gtgtgt complementario u c2
-- [2357]
complementario Ord a =gt Conj a -gt Conj a -gt Conj a
complementario [] _ = []
complementario xs [] = xs
complementario (xxs) (yys)
| x lt y = x complementario xs (yys)
| otherwise = complementario xs ys
127 Cardinal de un conjunto
Definicioacuten 126 Dado un conjunto finito A denominaremos cardinal de A al nuacutemero deelementos que tiene y lo notaremos |A|
La funcioacuten (cardinal xs) devuelve el cardinal del conjunto xs
-- | Ejemplos
-- gtgtgt cardinal vacio
-- 0
-- gtgtgt cardinal (listaAConjunto [110])
12 Representaciones de conjuntos 23
-- 10
-- gtgtgt cardinal (listaAConjunto chocolate)
-- 7
cardinal Ord a =gt Conj a -gt Int
cardinal = length
128 Conjunto unitario
Definicioacuten 127 Un conjunto con un uacutenico elemento se denomina unitario
Nota 123 Notemos que si X = x es un conjunto unitario debemos distinguirentre el conjunto X y el elemento x
La funcioacuten (esUnitario c) se verifica si el conjunto c es unitario
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto (take 10 (repeat 5))
-- gtgtgt let c2 = listaAConjunto valverde
-- gtgtgt let c3 = listaAConjunto coco
-- gtgtgt esUnitario c1
-- True
-- gtgtgt esUnitario c2
-- False
-- gtgtgt esUnitario c2
-- False
esUnitario Ord a =gt Conj a -gt Bool
esUnitario c =
c == take 1 c
129 Unioacuten de conjuntos
Definicioacuten 128 Dados dos conjuntos A y B se define la unioacuten de A y B notado A cup Bcomo el conjunto formado por aquellos elementos que pertenecen al menos a uno de los dosconjuntos A oacute B es decir
A cup B = x | x isin A or x isin B
La funcioacuten (unionConjuntos c1 c2) devuelve la unioacuten de los conjuntos xs y ys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [139]
-- gtgtgt let c2 = listaAConjunto [249]
-- gtgtgt unionConjuntos c1 c2
-- [123456789]
unionConjuntos Ord a =gt Conj a -gt Conj a -gt Conj a
unionConjuntos [] [] = []
24 Capiacutetulo 1 Conjuntos
unionConjuntos [] ys = ys
unionConjuntos xs [] = xs
unionConjuntos (xxs) (yys)
| x lt y = x unionConjuntos xs (yys)
| x == y = x unionConjuntos xs ys
| otherwise = y unionConjuntos (xxs) ys
Definicioacuten 129 Dada una familia de conjuntos Ai con i isin I se define la unioacuten ge-neral de los conjuntos Ai notado
⋃iisinI Ai como el conjunto formado por aquellos elementos
que pertenecen al menos a uno de los conjuntos de la familia es decir
⋃iisinI
Ai = x | x isin Ai foralli isin I
La funcioacuten (unionGeneral xss) devuelve la unioacuten general de la familia de conjun-tos de la lista xss
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1415]
-- gtgtgt let c2 = listaAConjunto [2515]
-- gtgtgt let c3 = listaAConjunto [3615]
-- gtgtgt unionGeneral [c1c2c3]
-- [123456789101112131415]
unionGeneral Ord a =gt [Conj a] -gt Conj a
unionGeneral = foldr unionConjuntos vacio
1210 Interseccioacuten de conjuntos
Definicioacuten 1210 Dados dos conjuntos A y B se define la interseccioacuten de A y B notadoA cap B como el conjunto formado por aquellos elementos que pertenecen a cada uno de losdos conjuntos A y B es decir
A cap B = x | x isin A and x isin B
La funcioacuten (interseccion c1 c2) devuelve la interseccioacuten de los conjuntos c1 yc2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1320]
-- gtgtgt let c2 = listaAConjunto [2420]
-- gtgtgt let c3 = listaAConjunto [2430]
-- gtgtgt let c4 = listaAConjunto [4830]
-- gtgtgt interseccion c1 c2
-- []
-- gtgtgt interseccion c3 c4
12 Representaciones de conjuntos 25
-- [481216202428]
interseccion Ord a =gt Conj a -gt Conj a -gt Conj a
interseccion (xxs) (yys)
| x lt y = interseccion xs (yys)
| x gt y = interseccion (xxs) ys
| otherwise = x interseccion xs ys
interseccion _ _ = []
1211 Producto cartesiano
Definicioacuten 1211 El producto cartesiano 1 de dos conjuntos A y B es una operacioacutensobre ellos que resulta en un nuevo conjunto Atimes B que contiene a todos los pares ordenadostales que la primera componente pertenece a A y la segunda pertenece a B es decir
Atimes B = (a b) | a isin A b isin B
La funcioacuten (productoCartesiano c1 c2) devuelve el producto cartesiano de xs eys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [31]
-- gtgtgt let c2 = listaAConjunto [247]
-- gtgtgt productoCartesiano c1 c2
-- [(12)(14)(17)(32)(34)(37)]
-- gtgtgt productoCartesiano c2 c1
-- [(21)(23)(41)(43)(71)(73)]
productoCartesiano (Ord a Ord b) =gt Conj a -gt Conj b -gt Conj (ab)
productoCartesiano xs ys=
listaAConjunto [(xy) | x lt- xs y lt- ys]
1212 Combinaciones
Definicioacuten 1212 Las combinaciones de un conjunto S tomados en grupos de n son todoslos subconjuntos de S con n elementos
La funcioacuten (combinaciones n xs) devuelve las combinaciones de los elementos dexs en listas de n elementos
-- | Ejemplos
-- gtgtgt combinaciones 3 [ad]
-- [abcabdacdbcd]
-- gtgtgt combinaciones 2 [248]
-- [[24][26][28][46][48][68]]
1httpsenwikipediaorgwikiCartesian_product
26 Capiacutetulo 1 Conjuntos
combinaciones Integer -gt [a] -gt [[a]]
combinaciones 0 _ = [[]]
combinaciones _ [] = []
combinaciones k (xxs) =
[xys | ys lt- combinaciones (k-1) xs] ++ combinaciones k xs
1213 Variaciones con repeticioacuten
Definicioacuten 1213 Las variaciones con repeticioacuten de m elementos tomados en grupos den es el nuacutemero de diferentes nndashtuplas de un conjunto de m elementos
La funcioacuten (variacionesR n xs) devuelve las variaciones con con repeticioacuten de loselementos de xs en listas de n elementos
-- | Ejemplos
-- gtgtgt variacionesR 3 [ab]
-- [aaaaababaabbbaababbbabbb]
-- gtgtgt variacionesR 2 [235]
-- [[22][23][25][32][33][35][52][53][55]]
variacionesR Int -gt [a] -gt [[a]]
variacionesR _ [] = [[]]
variacionesR 0 _ = [[]]
variacionesR k us =
[uvs | u lt- us vs lt- variacionesR (k-1) us]
1214 Conjuntos como listas sin repeticioacuten
En el moacutedulo ConjuntosConListas se definen las funciones del TAD de los conjun-tos dando su representacioacuten como listas sin elementos repetidos
module ConjuntosConListas
( Conj
vacio
inserta
listaAConjunto
elimina
pertenece
esVacio
minimoElemento
sinRepetidos
esUnitario
esSubconjunto
conjuntosIguales
esSubconjuntoPropio
complementario
cardinal
12 Representaciones de conjuntos 27
unionConjuntos
unionGeneral
interseccion
productoCartesiano
combinaciones
variacionesR
) where
En las definiciones del presente moacutedulo se usaraacuten algunas funciones de la libreriacuteaDataList
Vamos a definir un nuevo tipo de dato (Conj a) que representa a los conjuntoscomo listas sin elementos repetidos
type Conj a = [a]
Las funciones baacutesicas que definiremos a partir de este tipo coincidiraacuten con las indi-cadas en el TAD de los conjuntosbull (vacio) es el conjunto vaciacuteo
-- | Ejemplo
-- gtgtgt vacio
-- []
vacio Conj a
vacio = []
bull (inserta x c) es el conjunto obtenido antildeadiendo el elemento x al conjunto c
-- | Ejemplo
-- gtgtgt inserta 5 vacio
-- [5]
-- gtgtgt foldr inserta vacio [2211242]
-- [142]
inserta Eq a =gt a -gt Conj a -gt Conj a
inserta x [] = [x]
inserta x ys | elem x ys = ys
| otherwise = xys
bull (listaAConjunto xs) devuelve el conjunto cuyos elementos son los de la lista xs
-- | Ejemplo
-- gtgtgt listaAConjunto [2211242]
-- [214]
listaAConjunto Eq a =gt [a] -gt Conj a
listaAConjunto = nub
bull (esVacio c) se verifica si c es el conjunto vaciacuteo
-- | Ejemplos
-- gtgtgt esVacio (listaAConjunto [25137532190])
-- False
28 Capiacutetulo 1 Conjuntos
-- gtgtgt esVacio vacio
-- True
esVacio Conj a -gt Bool
esVacio = null
bull (pertenece x c) se verifica si x es un elemento del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt pertenece 3 c1
-- True
-- gtgtgt pertenece 4 c1
-- False
pertenece Eq a =gt a -gt Conj a -gt Bool
pertenece = elem
bull (elimina x c) es el conjunto obtenido eliminando el elemento x del conjunto c
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [25137532190]
-- gtgtgt elimina 3 c1
-- [251790]
-- gtgtgt elimina 4 c1
-- [2513790]
elimina Eq a =gt a -gt Conj a -gt Conj a
elimina = delete
bull (minimoElemento c) devuelve el miacutenimo elemento del conjunto c
-- | Ejemplos
-- gtgtgt minimoElemento (listaAConjunto [25137532190])
-- 0
-- gtgtgt minimoElemento (listaAConjunto ([ae] ++ [AE]))
-- A
minimoElemento Ord a =gt Conj a -gt a
minimoElemento = minimum
1215 Definicioacuten de conjunto
Definicioacuten 1214 Llamaremos conjunto a una coleccioacuten de objetos que llamaremos ele-mentos distintos entre siacute y que comparten una propiedad Para que un conjunto esteacute biendefinido debe ser posible discernir si un objeto arbitrario estaacute o no en eacutel
Si el elemento a pertenece al conjunto A escribiremos a isin A En caso contrarioescribiremos a 6isin A
Nota 124 En Haskell para poder discernir si un objeto arbitrario pertenece a unconjunto se necesita que su tipo pertenezca a la clase Eq
12 Representaciones de conjuntos 29
Nota 125 Al trabajar con la representacioacuten de conjuntos como listas en Haskellhemos de cuidar que los ejemplos con los que trabajemos no tengan elementos re-petidos La funcioacuten (sinRepetidos xs) se verifica si la lista xs no tiene ninguacuten ele-mento repetido
-- | Ejemplos
-- gtgtgt sinRepetidos []
-- True
-- gtgtgt sinRepetidos [1231]
-- False
sinRepetidos Eq a =gt [a] -gt Bool
sinRepetidos xs = nub xs == xs
Los conjuntos pueden definirse de manera expliacutecita citando todos sus elementosentre llaves de manera impliacutecita dando una o varias caracteriacutesticas que determi-nen si un objeto dado estaacute o no en el conjunto Por ejemplo los conjuntos 1 2 3 4y x isinN|1 le x le 4 son el mismo definido de forma explicita e impliacutecita respecti-vamente
Nota 126 La definicioacuten impliacutecita es necesaria cuando el conjunto en cuestioacuten tieneuna cantidad infinita de elementos En general los conjuntos se notaraacuten con letrasmayuacutesculas A B y los elementos con letras minuacutesculas a b
Cuando trabajamos con conjuntos concretos siempre existe un contexto donde esosconjuntos existen Por ejemplo si A = minus1 1 2 3 4 5 y B = x|x isin Nes par elcontexto donde podemos considerar A y B es el conjunto de los nuacutemeros enterosZ En general a este conjunto se le denomina conjunto universal De una forma algomaacutes precisa podemos dar la siguiente definicioacuten
Definicioacuten 1215 El conjunto universal que notaremos por U es un conjunto del queson subconjuntos todos los posibles conjuntos que originan el problema que tratamos
1216 Subconjuntos
Definicioacuten 1216 Dados dos conjuntos A y B si todo elemento de A es a su vez elementode B diremos que A es un subconjunto de B y lo notaremos A sube B En caso contrario senotaraacute A 6sube B
La funcioacuten (esSubconjunto c1 c2) se verifica si c1 es un subconjunto de c2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
30 Capiacutetulo 1 Conjuntos
-- gtgtgt c1 `esSubconjunto` c2
-- True
-- gtgtgt c1 `esSubconjunto` vacio
-- False
-- gtgtgt vacio `esSubconjunto` c2
-- True
-- gtgtgt c3 `esSubconjunto` c4
-- True
-- gtgtgt c2 `esSubconjunto` c1
-- False
esSubconjunto Eq a =gt [a] -gt [a] -gt Bool
esSubconjunto c1 c2 = all (`elem` c2) c1
1217 Igualdad de conjuntos
Definicioacuten 1217 Dados dos conjuntos A y B diremos que son iguales si tienen losmismos elementos es decir si se verifica que A sube B y B sube A Lo notaremos A = B
La funcioacuten (conjuntosIguales c1 c2) se verifica si los conjuntos xs y ys son igua-les
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [42]
-- gtgtgt let c2 = listaAConjunto [324]
-- gtgtgt let c3 = listaAConjunto [421]
-- gtgtgt let c4 = listaAConjunto [124]
-- gtgtgt let c5 = listaAConjunto [4444442]
-- gtgtgt conjuntosIguales c1 c2
-- False
-- gtgtgt conjuntosIguales c3 c4
-- True
-- gtgtgt conjuntosIguales c1 c5
-- True
conjuntosIguales Eq a =gt [a] -gt [a] -gt Bool
conjuntosIguales c1 c2 =
esSubconjunto c1 c2 ampamp esSubconjunto c2 c1
1218 Subconjuntos propios
Definicioacuten 1218 Los subconjuntos de A distintos del empty y del mismo A se denominansubconjuntos propios de A
La funcioacuten (esSubconjuntoPropio c1 c2) se verifica si c1 es un subconjunto pro-pio de c2
12 Representaciones de conjuntos 31
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt esSubconjuntoPropio u u
-- False
-- gtgtgt esSubconjuntoPropio c1 u
-- True
esSubconjuntoPropio Eq a =gt [a] -gt [a] -gt Bool
esSubconjuntoPropio c1 c2
| null c1 = False
| conjuntosIguales c1 c2 = False
| otherwise = esSubconjunto c1 c2
1219 Complementario de un conjunto
Definicioacuten 1219 Dado un conjunto A se define el complementario de A que notaremospor A como
A = x|x isin U x 6isin A
La funcioacuten (complementario u c) devuelve el complementario del conjunto c y enel universo u
-- | Ejemplos
-- gtgtgt let u = listaAConjunto [19]
-- gtgtgt let c1 = listaAConjunto [3257]
-- gtgtgt let c2 = listaAConjunto [14689]
-- gtgtgt complementario u c1
-- [14689]
-- gtgtgt complementario u u
-- []
-- gtgtgt complementario u vacio
-- [123456789]
-- gtgtgt complementario u c2
-- [2357]
complementario Eq a =gt [a] -gt [a] -gt [a]
complementario = ()
1220 Cardinal de un conjunto
Definicioacuten 1220 Dado un conjunto finito A denominaremos cardinal de A al nuacutemerode elementos que tiene y lo notaremos |A|
La funcioacuten (cardinal xs) devuelve el cardinal del conjunto xs
32 Capiacutetulo 1 Conjuntos
-- | Ejemplos
-- gtgtgt cardinal vacio
-- 0
-- gtgtgt cardinal (listaAConjunto [110])
-- 10
-- gtgtgt cardinal (listaAConjunto chocolate)
-- 7
cardinal [a] -gt Int
cardinal = length
1221 Conjunto unitario
Definicioacuten 1221 Un conjunto con un uacutenico elemento se denomina unitario
Nota 127 Notemos que si X = x es un conjunto unitario debemos distinguirentre el conjunto X y el elemento x
La funcioacuten (esUnitario c) se verifica si el conjunto c es unitario
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto (take 10 (repeat 5))
-- gtgtgt let c2 = listaAConjunto valverde
-- gtgtgt let c3 = listaAConjunto coco
-- gtgtgt esUnitario c1
-- True
-- gtgtgt esUnitario c2
-- False
-- gtgtgt esUnitario c2
-- False
esUnitario Eq a =gt [a] -gt Bool
esUnitario c = c == take 1 c
1222 Unioacuten de conjuntos
Definicioacuten 1222 Dados dos conjuntos A y B se define la unioacuten de A y B notado A cup Bcomo el conjunto formado por aquellos elementos que pertenecen al menos a uno de los dosconjuntos A oacute B es decir
A cup B = x | x isin A or x isin B
La funcioacuten (unionConjuntos c1 c2) devuelve la unioacuten de los conjuntos xs y ys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [139]
-- gtgtgt let c2 = listaAConjunto [249]
12 Representaciones de conjuntos 33
-- gtgtgt unionConjuntos c1 c2
-- [135792468]
unionConjuntos Eq a =gt [a] -gt [a] -gt [a]
unionConjuntos = union
Definicioacuten 1223 Dada una familia de conjuntos Ai con i isin I se define la unioacuten ge-neral de los conjuntos Ai notado
⋃iisinI Ai como el conjunto formado por aquellos elementos
que pertenecen al menos a uno de los conjuntos de la familia es decir
⋃iisinI
Ai = x | x isin Ai foralli isin I
La funcioacuten (unionGeneral xss) devuelve la unioacuten general de la familia de conjun-tos de la lista xss
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1415]
-- gtgtgt let c2 = listaAConjunto [2515]
-- gtgtgt let c3 = listaAConjunto [3615]
-- gtgtgt unionGeneral [c1c2c3]
-- [147101325811143691215]
unionGeneral Eq a =gt [[a]] -gt [a]
unionGeneral = foldr unionConjuntos []
1223 Interseccioacuten de conjuntos
Definicioacuten 1224 Dados dos conjuntos A y B se define la interseccioacuten de A y B notadoA cap B como el conjunto formado por aquellos elementos que pertenecen a cada uno de losdos conjuntos A y B es decir
A cap B = x | x isin A and x isin B
La funcioacuten (interseccion c1 c2) devuelve la interseccioacuten de los conjuntos c1 yc2
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [1320]
-- gtgtgt let c2 = listaAConjunto [2420]
-- gtgtgt let c3 = listaAConjunto [2430]
-- gtgtgt let c4 = listaAConjunto [4830]
-- gtgtgt interseccion c1 c2
-- []
-- gtgtgt interseccion c3 c4
-- [481216202428]
34 Capiacutetulo 1 Conjuntos
interseccion Eq a =gt [a] -gt [a] -gt [a]
interseccion = intersect
1224 Producto cartesiano
Definicioacuten 1225 El producto cartesiano 2 de dos conjuntos A y B es una operacioacutensobre ellos que resulta en un nuevo conjunto Atimes B que contiene a todos los pares ordenadostales que la primera componente pertenece a A y la segunda pertenece a B es decir
Atimes B = (a b) | a isin A b isin B
La funcioacuten (productoCartesiano c1 c2) devuelve el producto cartesiano de xs eys
-- | Ejemplos
-- gtgtgt let c1 = listaAConjunto [31]
-- gtgtgt let c2 = listaAConjunto [247]
-- gtgtgt productoCartesiano c1 c2
-- [(32)(34)(37)(12)(14)(17)]
-- gtgtgt productoCartesiano c2 c1
-- [(23)(21)(43)(41)(73)(71)]
productoCartesiano [a] -gt [b] -gt [(ab)]
productoCartesiano xs ys = [ (xy) | x lt- xs y lt- ys]
1225 Combinaciones
Definicioacuten 1226 Las combinaciones de un conjunto S tomados en grupos de n son todoslos subconjuntos de S con n elementos
La funcioacuten (combinaciones n xs) devuelve las combinaciones de los elementos dexs en listas de n elementos
-- | Ejemplos
-- gtgtgt combinaciones 3 [ad]
-- [abcabdacdbcd]
-- gtgtgt combinaciones 2 [248]
-- [[24][26][28][46][48][68]]
combinaciones Integer -gt [a] -gt [[a]]
combinaciones 0 _ = [[]]
combinaciones _ [] = []
combinaciones k (xxs) =
[xys | ys lt- combinaciones (k-1) xs] ++ combinaciones k xs
2httpsenwikipediaorgwikiCartesian_product
13 Eleccioacuten de la representacioacuten de conjuntos 35
1226 Variaciones con repeticioacuten
Definicioacuten 1227 Las variaciones con repeticioacuten de m elementos tomados en grupos den es el nuacutemero de diferentes nndashtuplas de un conjunto de m elementos
La funcioacuten (variacionesR n xs) devuelve las variaciones con con repeticioacuten de loselementos de xs en listas de n elementos
-- | Ejemplos
-- gtgtgt variacionesR 3 [ab]
-- [aaaaababaabbbaababbbabbb]
-- gtgtgt variacionesR 2 [235]
-- [[22][23][25][32][33][35][52][53][55]]
variacionesR Int -gt [a] -gt [[a]]
variacionesR _ [] = [[]]
variacionesR 0 _ = [[]]
variacionesR k us =
[uvs | u lt- us vs lt- variacionesR (k-1) us]
13 Eleccioacuten de la representacioacuten de conjuntos
Nota 131 En el moacutedulo Conjuntos se elige la representacioacuten de conjunto con la quese trabajaraacute
-- Seleccionar para trabajar con los conjuntos como listas sin
-- elementos repetidos
module Conjuntos
(module ConjuntosConListas)
where
import ConjuntosConListas
-- Seleccionar para trabajar con los conjuntos como listas ordenadas
-- sin elementos repetidos
-- module Conjuntos
-- (module ConjuntosConListasOrdenadasSinRepeticion)
-- where
-- import ConjuntosConListasOrdenadasSinRepeticion
36 Capiacutetulo 1 Conjuntos
Capiacutetulo 2
Relaciones y funciones
21 Relaciones
Las relaciones que existen entre personas nuacutemeros conjuntos y muchas otras enti-dades pueden formalizarse en la idea de relacioacuten binaria En esta seccioacuten se define ydesarrolla este concepto particularizando en el caso de las relaciones homogeacuteneasy en el de las funciones
211 Relacioacuten binaria
Definicioacuten 211 Una relacioacuten binaria 1 (o correspondencia) entre dos conjuntos A yB es un subconjunto del producto cartesiano Atimes B
La funcioacuten (esRelacion xs ys r) se verifica si r es una relacioacuten binaria de xs enys Por ejemplo
-- | Ejemplos
-- gtgtgt esRelacion [31] [247] [(12)(34)]
-- True
-- gtgtgt esRelacion [31] [247] [(12)(31)]
-- False
esRelacion (Ord a Ord b) =gt [a] -gt [b] -gt [(ab)] -gt Bool
esRelacion xs ys r =
r `esSubconjunto` productoCartesiano xs ys
212 Imagen por una relacioacuten
Definicioacuten 212 Si R es una relacioacuten binaria la imagen del elemento x en la relacioacuten Res el conjunto de los valores correspondientes a x en R
1httpsenwikipediaorgwikiBinary_relation
37
38 Capiacutetulo 2 Relaciones y funciones
La funcioacuten (imagenRelacion r x) es la imagen de x en la relacioacuten r
-- | Ejemplos
-- gtgtgt imagenRelacion [(13)(25)(14)] 1
-- [34]
-- gtgtgt imagenRelacion [(13)(25)(14)] 2
-- [5]
-- gtgtgt imagenRelacion [(13)(25)(14)] 3
-- []
imagenRelacion (Ord a Ord b) =gt [(ab)] -gt a -gt [b]
imagenRelacion r x =
nub [y | (zy) lt- r z == x]
213 Dominio de una relacioacuten
Definicioacuten 213 Dada una relacioacuten binaria R su dominio es el conjunto que contiene atodos los valores que se toman en la relacioacuten R
La funcioacuten (dominio r) devuelve el dominio de la relacioacuten r
-- | Ejemplo
-- gtgtgt dominio [(32)(51)(34)]
-- [35]
dominio Ord a =gt [(ab)] -gt [a]
dominio r = listaAConjunto (map fst r)
214 Rango de una relacioacuten
Definicioacuten 214 El rango de una relacioacuten binaria R es el conjunto de las imaacutegenes demediante R
La funcioacuten (rango r) devuelve el rango de la relacioacuten binaria r
-- | Ejemplo
-- gtgtgt rango [(32)(52)(34)]
-- [24]
rango Ord b =gt [(ab)] -gt [b]
rango r = listaAConjunto (map snd r)
215 Antiimagen por una relacioacuten
Definicioacuten 215 La antiimagen del elemento y por una relacioacuten r es el conjunto de loselementos cuya imagen es y
La (antiImagenRelacion r y) es la antiimagen del elemento y en la relacioacuten bina-ria r
22 Relaciones homogeacuteneas 39
-- | Ejemplo
-- gtgtgt antiImagenRelacion [(13)(23)(74)] 3
-- [12]
antiImagenRelacion (Ord a Ord b) =gt [(ab)] -gt b -gt [a]
antiImagenRelacion r y =
nub [x | (xz) lt- r z == y]
216 Relacioacuten funcional
Definicioacuten 216 Dada una relacioacuten binaria R se dice funcional si todos los elementos desu dominio tienen una uacutenica imagen en R
La funcioacuten (esFuncional r) se verifica si la relacioacuten r es funcional
-- | Ejemplos
-- gtgtgt esFuncional [(32)(51)(79)]
-- True
-- gtgtgt esFuncional [(32)(51)(34)]
-- False
-- gtgtgt esFuncional [(32)(51)(32)]
-- True
esFuncional (Ord a Ord b) =gt [(ab)] -gt Bool
esFuncional r =
and [esUnitario (imagenRelacion r x) | x lt- dominio r]
22 Relaciones homogeacuteneas
Para elaborar la presente seccioacuten se han consultado los apuntes de ldquoAacutelgebra baacutesicardquo([6]) asignatura del primer curso del Grado en Matemaacuteticas
Definicioacuten 221 Una relacioacuten binaria entre dos conjuntos A y B se dice que es homogeacute-nea si los conjuntos son iguales es decir si A = B Si el par (x y) isin AA estaacute en la relacioacutenhomogeacutenea R diremos que x estaacute Rndashrelacionado con y o relacionado con y por R Esto senotaraacute frecuentemente xRy (noacutetese que el orden es importante)
La funcioacuten (esRelacionHomogenea xs r) se verifica si r es una relacioacuten binaria ho-mogeacutenea en el conjunto xs
-- | Ejemplos
-- gtgtgt esRelacionHomogenea [14] [(12)(24)(34)(41)]
-- True
-- gtgtgt esRelacionHomogenea [14] [(12)(25)(34)(41)]
-- False
-- gtgtgt esRelacionHomogenea [14] [(12)(34)(41)]
40 Capiacutetulo 2 Relaciones y funciones
-- True
esRelacionHomogenea Ord a =gt [a] -gt [(aa)] -gt Bool
esRelacionHomogenea xs = esRelacion xs xs
Nota 221 El segundo argumento que recibe la funcioacuten ha de ser una lista de parescon ambas componentes del mismo tipo
La funcioacuten (estaRelacionado r x y) se verifica si x estaacute relacionado con y en larelacioacuten homogeacutenea r
-- | Ejemplos
-- gtgtgt estaRelacionado [(13)(25)(46)] 2 5
-- True
-- gtgtgt estaRelacionado [(13)(25)(46)] 2 3
-- False
estaRelacionado Ord a =gt [(aa)] -gt a -gt a -gt Bool
estaRelacionado r x y = (xy) `elem` r
221 Relaciones reflexivas
Definicioacuten 222 Sea R una relacioacuten binaria homogeacutenea en el conjunto A Diremos que Res reflexiva cuando todos los elementos de A estaacuten relacionados por R consigo mismos esdecir cuando forallx isin A se tiene que xRx
La funcioacuten (esReflexiva xs r) se verifica si la relacioacuten r en xs es reflexiva
-- | Ejemplos
-- gtgtgt esReflexiva [12] [(11)(12)(22)]
-- True
-- gtgtgt esReflexiva [12] [(11)(12)]
-- False
esReflexiva Ord a =gt [a] -gt [(aa)] -gt Bool
esReflexiva xs r = zip xs xs `esSubconjunto` r
Nota 222 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xSylarrrarr xminus y es parbull xTylarrrarr x divide a yson relaciones binarias homogeacuteneas reflexivas
222 Relaciones simeacutetricas
Definicioacuten 223 Diremos que una relacioacuten homogeacutenea R es simeacutetrica cuando
forall(x y) isin R minusrarr (y x) isin R
22 Relaciones homogeacuteneas 41
La funcioacuten (esSimetrica r) se verifica si la relacioacuten r es simeacutetrica
-- | Ejemplos
-- gtgtgt esSimetrica [(11)(12)(21)]
-- True
-- gtgtgt esSimetrica [(11)(12)(22)]
-- False
esSimetrica Ord a =gt [(aa)] -gt Bool
esSimetrica r =
listaAConjunto [(yx) | (xy) lt- r] `esSubconjunto` r
Nota 223 En el conjunto N la relacioacuten caracterizada por xSy larrrarr xminus y es par esuna relacioacuten binaria homogeacutenea simeacutetrica
223 Relaciones antisimeacutetricas
Definicioacuten 224 Sea R una relacioacuten binaria homogeacutenea en el conjunto A Diremos que Res antisimeacutetrica cuando
forall(x y)[(x y) isin R and (y x) isin R minusrarr x = y
La funcioacuten (esAntisimetrica r) se verifica si la relacioacuten r es antisimeacutetrica
-- | Ejemplos
-- gtgtgt esAntisimetrica [(12)(31)]
-- True
-- gtgtgt esAntisimetrica [(12)(21)]
-- False
esAntisimetrica Ord a =gt [(aa)] -gt Bool
esAntisimetrica r =
and [x == y | (xy) lt- r (yx) `elem` r]
Nota 224 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xTylarrrarr x divide a ybull xRylarrrarr x lt yson relaciones binarias homogeacuteneas antisimeacutetricas
224 Relaciones transitivas
Definicioacuten 225 Sea R una relacioacuten binaria homogeacutenea en el conjunto A Diremos que Res transitiva cuando forall(x y) (y z) isin R se tiene que xRy e yRz minusrarr xRz
La funcioacuten (esTransitiva r) se verifica si la relacioacuten r es transitiva
42 Capiacutetulo 2 Relaciones y funciones
-- | Ejemplos
-- gtgtgt esTransitiva [(12)(13)(23)]
-- True
-- gtgtgt esTransitiva [(12)(23)]
-- False
esTransitiva Ord a =gt [(aa)] -gt Bool
esTransitiva r =
listaAConjunto [(xz) | (xy) lt- r (wz) lt- r y == w]
`esSubconjunto` r
Nota 225 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xSylarrrarr xminus y es parbull xTylarrrarr x divide a ybull xRylarrrarr x lt yson relaciones binarias homogeacuteneas transitivas
225 Relaciones de equivalencia
Definicioacuten 226 Las relaciones homogeacuteneas que son a la vez reflexivas simeacutetricas y tran-sitivas se denominan relaciones de equivalencia
La funcioacuten (esRelacionEquivalencia xs r) se verifica si r es una relacioacuten de equi-valencia en xs-- | Ejemplos
-- gtgtgt esRelacionEquivalencia [13] [(11)(12)(21)(22)(33)]
-- True
-- gtgtgt esRelacionEquivalencia [13] [(12)(21)(22)(33)]
-- False
-- gtgtgt esRelacionEquivalencia [13] [(11)(12)(22)(33)]
-- False
esRelacionEquivalencia Ord a =gt [a] -gt [(aa)] -gt Bool
esRelacionEquivalencia xs r =
esReflexiva xs r ampamp
esSimetrica r ampamp
esTransitiva r
Nota 226 En el conjunto N la relacioacuten caracterizada por xSy larrrarr xminus y es par esuna relacioacuten de equivalencia
226 Relaciones de orden
Definicioacuten 227 Las relaciones homogeacuteneas que son a la vez reflexivas antisimeacutetricas ytransitivas se denominan relaciones de orden
23 Funciones 43
La funcioacuten (esRelacionOrden xs r) se verifica si r es una relacioacuten de orden en xs
-- | Ejemplo
-- gtgtgt esRelacionOrden [13] [(11)(12)(13)(22)(23)(33)]
-- True
esRelacionOrden Ord a =gt [a] -gt [(aa)] -gt Bool
esRelacionOrden xs r =
esReflexiva xs r ampamp
esAntisimetrica r ampamp
esTransitiva r
Nota 227 En el conjunto N las relaciones caracterizadas porbull xRylarrrarr x le ybull xTylarrrarr x divide a yson relaciones de orden
227 Clases de equivalencia
Definicioacuten 228 Si R es una relacioacuten de equivalencia en A denominamos clase de equi-valencia de un elemento x isin A al conjunto de todos los elementos de A relacionados con xes decir x = R(x) = y isin A|xRy donde la primera notacioacuten se usa si la relacioacuten con laque se estaacute tratando se sobreentiende y la segunda si no es asiacute
La funcioacuten (clasesEquivalencia xs r) devuelve las clases de la relacioacuten de equi-valencia r en xs
-- | Ejemplo
-- gtgtgt let r = [(xy) | x lt- [15] y lt- [15] even (x-y)]
-- gtgtgt clasesEquivalencia [15] r
-- [[135][24]]
clasesEquivalencia Ord a =gt [a] -gt [(aa)] -gt [[a]]
clasesEquivalencia _ [] = []
clasesEquivalencia [] _ = []
clasesEquivalencia (xxs) r = (xc) clasesEquivalencia (xs c) r
where c = filter (estaRelacionado r x) xs
23 Funciones
Definicioacuten 231 Dada una relacioacuten F entre A y B se diraacute que es una funcioacuten si es unarelacioacuten binaria es funcional y todos los elementos de A estaacuten en el dominio
La funcioacuten (esFuncion xs ys f) se verifica si f es una funcioacuten de xs en ys
-- | Ejemplos
-- gtgtgt esFuncion [13] [247] [(17)(32)]
44 Capiacutetulo 2 Relaciones y funciones
-- True
-- gtgtgt esFuncion [13] [247] [(17)]
-- False
-- gtgtgt esFuncion [13] [247] [(14)(17)(32)]
-- False
esFuncion (Ord a Ord b) =gt [a] -gt [b] -gt [(ab)] -gt Bool
esFuncion xs ys f =
esRelacion xs ys f ampamp
xs `esSubconjunto` dominio f ampamp
esFuncional f
Nota 231 A lo largo de la seccioacuten representaremos a las funciones como listas depares
type Funcion a b = [(ab)]
La funcioacuten (funciones xs ys) devuelve todas las posibles funciones del conjuntoxs en ys
-- | Ejemplos
-- gtgtgt pp $ funciones [12] [34]
-- [[(1 3)(2 3)][(1 3)(2 4)][(1 4)(2 3)]
-- [(1 4)(2 4)]]
-- gtgtgt pp $ funciones [12] [345]
-- [[(1 3)(2 3)][(1 3)(2 4)][(1 3)(2 5)]
-- [(1 4)(2 3)][(1 4)(2 4)][(1 4)(2 5)]
-- [(1 5)(2 3)][(1 5)(2 4)][(1 5)(2 5)]]
-- gtgtgt pp $ funciones [012] [34]
-- [[(0 3)(1 3)(2 3)][(0 3)(1 3)(2 4)]
-- [(0 3)(1 4)(2 3)][(0 3)(1 4)(2 4)]
-- [(0 4)(1 3)(2 3)][(0 4)(1 3)(2 4)]
-- [(0 4)(1 4)(2 3)][(0 4)(1 4)(2 4)]]
funciones [a] -gt [b] -gt [Funcion a b]
funciones xs ys =
[zip xs zs | zs lt- variacionesR (length xs) ys]
231 Imagen por una funcioacuten
Definicioacuten 232 Si f es una funcioacuten entre A y B y x es un elemento del conjunto A laimagen del elemento x por la funcioacuten f es el valor asociado a x por la funcioacuten f
La funcioacuten (imagen f x) es la imagen del elemento x en la funcioacuten f
-- | Ejemplos
-- gtgtgt imagen [(17)(32)] 1
-- 7
-- gtgtgt imagen [(17)(32)] 3
23 Funciones 45
-- 2
imagen (Ord a Ord b) =gt Funcion a b -gt a -gt b
imagen f x = head (imagenRelacion f x)
La funcioacuten (imagenConjunto f xs) es la imagen del conjunto xs en la funcioacuten f
-- | Ejemplos
-- gtgtgt imagenConjunto [(17)(32)(43)] [14]
-- [73]
-- gtgtgt imagenConjunto [(17)(32)] [31]
-- [27]
imagenConjunto (Ord a Ord b) =gt Funcion a b -gt [a] -gt [b]
imagenConjunto f xs = nub (map (imagen f) xs)
232 Funciones inyectivas
Definicioacuten 233 Diremos que una funcioacuten f entre dos conjuntos es inyectiva 2 si a ele-mentos distintos del dominio le corresponden elementos distintos de la imagen es decir siforalla b isin dominio( f ) tales que a 6= b f (a) 6= f (b)
La funcioacuten (esInyectiva fs) se verifica si la funcioacuten fs es inyectiva
-- | Ejemplos
-- gtgtgt esInyectiva [(14)(25)(36)]
-- True
-- gtgtgt esInyectiva [(14)(25)(34)]
-- False
-- gtgtgt esInyectiva [(14)(25)(36)(36)]
-- True
esInyectiva (Ord a Ord b) =gt Funcion a b -gt Bool
esInyectiva f =
all esUnitario [antiImagenRelacion f y | y lt- rango f]
233 Funciones sobreyectivas
Definicioacuten 234 Diremos que una funcioacuten f entre dos conjuntos A y B es sobreyectiva3 si todos los elementos de B son imagen de alguacuten elemento de A
La funcioacuten (esSobreyectiva xs ys f) se verifica si la funcioacuten f es sobreyectiva Ala hora de definirla estamos contando con que f es una funcioacuten entre xs y ys
-- | Ejemplos
-- gtgtgt esSobreyectiva [123] [456] [(14)(25)(36)]
2httpsenwikipediaorgwikiInjective_function3httpsenwikipediaorgwikiSurjective_function
46 Capiacutetulo 2 Relaciones y funciones
-- True
-- gtgtgt esSobreyectiva [123] [456] [(14)(25)(34)]
-- False
-- gtgtgt esSobreyectiva [123] [456] [(14)(24)(36)(36)]
-- False
esSobreyectiva (Ord aOrd b) =gt [a] -gt [b] -gt Funcion a b -gt Bool
esSobreyectiva _ ys f = ys `esSubconjunto` rango f
234 Funciones biyectivas
Definicioacuten 235 Diremos que una funcioacuten f entre dos conjuntos A y B es biyectiva 4 sicada elementos de B es imagen de un uacutenico elemento de A
La funcioacuten (esBiyectiva xs ys f) se verifica si la funcioacuten f es biyectiva
-- | Ejemplos
-- gtgtgt esBiyectiva [123] [456] [(14)(25)(36)(36)]
-- True
-- gtgtgt esBiyectiva [123] [456] [(14)(25)(34)]
-- False
-- gtgtgt esBiyectiva [123] [4567] [(14)(25)(36)]
-- False
esBiyectiva (Ord a Ord b) =gt [a] -gt [b] -gt Funcion a b -gt Bool
esBiyectiva xs ys f =
esInyectiva f ampamp esSobreyectiva xs ys f
La funciones biyecciones1 xs ys y biyecciones2 xs ys devuelven la lista de to-das las biyecciones entre los conjuntos xs y ys La primera lo hace filtrando las fun-ciones entre los conjuntos que son biyectivas y la segunda lo hace construyendouacutenicamente las funciones biyectivas entre los conjuntos con el consecuente ahorrocomputacional
ghcigt length (biyecciones1 [17] [ag])
5040
(1675 secs 4146744104 bytes)
ghcigt length (biyecciones2 [17] [ag])
5040
(002 secs 0 bytes)
ghcigt length (biyecciones1 [16] [ag])
0
(253 secs 592625824 bytes)
ghcigt length (biyecciones2 [16] [ag])
0
(001 secs 0 bytes)
4httpsenwikipediaorgwikiBijective_function
23 Funciones 47
biyecciones1 (Ord a Ord b) =gt [a] -gt [b] -gt [Funcion a b]
biyecciones1 xs ys =
filter (esBiyectiva xs ys) (funciones xs ys)
biyecciones2 (Ord a Ord b) =gt [a] -gt [b] -gt [Funcion a b]
biyecciones2 xs ys
| length xs = length ys = []
| otherwise = [zip xs zs | zs lt- permutations ys]
Nota 232 En lo que sigue trabajaremos con la funcioacuten biyecciones2 asiacute que laredefiniremos como biyecciones
biyecciones (Ord a Ord b) =gt [a] -gt [b] -gt [Funcion a b]
biyecciones = biyecciones2
235 Inversa de una funcioacuten
Definicioacuten 236 Si f es una funcioacuten biyectiva entre los conjuntos A y B definimos lafuncioacuten inversa 5 como la funcioacuten que a cada elemento de B le hace corresponder el elementode A del que es imagen en B
El valor de (inversa f) es la funcioacuten inversa de f
-- | Ejemplos
-- gtgtgt inversa [(14)(25)(36)]
-- [(41)(52)(63)]
-- gtgtgt sort (inversa [(1f)(2m)(3a)])
-- [(a3)(f1)(m2)]
inversa (Ord a Ord b) =gt Funcion a b -gt Funcion b a
inversa f = listaAConjunto [(yx) | (xy) lt- f]
Nota 233 Para considerar la inversa de una funcioacuten esta tiene que ser biyectivaLuego (inversa f) asigna a cada elemento del conjunto imagen (que en este casocoincide con la imagen) uno y solo uno del conjunto de salida
La funcioacuten (imagenInversa f y) devuelve el elemento del conjunto de salida de lafuncioacuten f tal que su imagen es y
-- | Ejemplos
-- gtgtgt imagenInversa [(14)(25)(36)] 5
-- 2
-- gtgtgt imagenInversa [(1f)(2m)(3a)] a
-- 3
imagenInversa (Ord a Ord b) =gt Funcion a b -gt b -gt a
imagenInversa f = imagen (inversa f)
5httpsenwikipediaorgwikiInverse_function
48 Capiacutetulo 2 Relaciones y funciones
Capiacutetulo 3
Introduccioacuten a la teoriacutea de grafos
Se dice que la Teoriacutea de Grafos tiene su origen en 1736 cuando Euler dio una so-lucioacuten al problema (hasta entonces no resuelto) de los siete puentes de Koumlnigsbergiquestexiste un camino que atraviese cada uno de los puentes exactamente una vezPara probar que no era posible Euler sustituyoacute cada regioacuten por un nodo y cadapuente por una arista creando el primer grafo que fuera modelo de un problemamatemaacutetico
Figura 31 Dibujo de los puentes de Koumlnigsberg
A
B
C
D
b
c
a
d
f
e
g
Figura 32 Modelo de los puentes de Koumlnigsberg
Desde entonces se ha ido desarrollando esta metodologiacutea hasta convertise en los uacutel-timos antildeos en una herramienta importante en aacutereas del conocimiento muy variadascomo por ejemplo la Investigacioacuten Operativa la Computacioacuten la Ingenieriacutea Eleacutec-trica la Geografiacutea y la Quiacutemica Es por ello que ademaacutes se ha erigido como unanueva disciplina matemaacutetica que generalmente asociada a las ramas de Topologiacuteay AacutelgebraLa utilidad de los grafos se basa en su gran poder de abstraccioacuten y una representa-cioacuten muy clara de cualquier relacioacuten lo que facilita enormemente tanto la fase demodelado como la de resolucioacuten de cualquier problema Gracias a la Teoriacutea de Gra-fos se han desarrollado una gran variedad de algoritmos y meacutetodos de decisioacuten quepodemos implementar a traveacutes de lenguajes funcionales y permiten automatizar laresolucioacuten de muchos problemas a menudo tediosos de resolver a mano
49
50 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
31 Definicioacuten de grafo
En primer lugar vamos a introducir terminologiacutea baacutesica en el desarrollo de la Teoriacuteade Grafos
Definicioacuten 311 Un grafo G es un par (V A) donde V es el conjunto cuyos elementosllamamos veacutertices (o nodos) y A es un conjunto cuyos elementos llamamos aristas
Definicioacuten 312 Una arista de un grafo G = (V A) es un conjunto de dos elementosde V Es decir para dos veacutertices v vprime de G (v vprime) y (vprime v) representa la misma arista
Definicioacuten 313 Dado un grafo G = (V A) diremos que un veacutertice v isin V es adyacentea vprime isin V si (vprime v) isin A
Definicioacuten 314 Si en un grafo dirigido se permiten aristas repetidas lo llamaremos mul-tigrafo Si no se permiten lo llamaremos grafo regular
Nota 311 Denotaremos por |V| al nuacutemero de veacutertices y por |A| al nuacutemero de aristasdel grafo (V A)
Ejemplo 312 Sea G = (V A) un grafo con V = a b c d y A = (a b) (a c) (b d)(d d) En este grafo los veacutertices a d son adyacentes a b
a
b
c
d
32 El TAD de los grafos
En esta seccioacuten nos planteamos la tarea de implementar las definiciones presenta-das anteriormente en un lenguaje funcional En nuestro caso el lenguaje que utili-zaremos seraacute Haskell Definiremos el Tipo Abstracto de Dato (TAD) de los grafos ydaremos algunos ejemplos de posibles representaciones de grafos con las que po-dremos trabajarSi consideramos un grafo finito cualquiera G = (V A) podemos ordenar el conjun-to de los veacutertices y representarlo como V = v1 vn con n = |V|En primer lugar necesitaremos crear un tipo (Grafo) cuya definicioacuten sea compatiblecon la entidad matemaacutetica que representa y que nos permita definir las operacionesque necesitamos para trabajar con los grafos Estas operaciones son
32 El TAD de los grafos 51
creaGrafo -- [a] -gt [(aa)] -gt Grafo a
vertices -- Grafo a -gt [a]
adyacentes -- Grafo a -gt a -gt [a]
aristaEn -- (aa) -gt Grafo a -gt Bool
aristas -- Grafo a -gt [(aa)]
dondebull (creaGrafo vs as) es un grafo tal que el conjunto de sus veacutertices es vs y el de
sus aristas es asbull (vertices g) es la lista de todos los veacutertices del grafo gbull (adyacentes g v) es la lista de los veacutertices adyacentes al veacutertice v en el grafo gbull (aristaEn a g) se verifica si a es una arista del grafo gbull (aristas g) es la lista de las aristas del grafo g
Nota 321 Las funciones que aparecen en la especificacioacuten del TAD no dependende la representacioacuten que elijamos
Ejemplo 322 Veamos un ejemplo de creacioacuten de grafo y su representacioacuten graacutefica
creaGrafo [15] [(12)(13)(15)(24)
(25)(34)(35)(45)]
1
2
34
5
321 Grafos como listas de aristas
En el moacutedulo GrafoConListaDeAristas se definen las funciones del TAD de losgrafos dando su representacioacuten como conjuntos de aristas es decir representandoa un grafo como dos conjuntos la primera seraacute la lista ordenada de los veacutertices y lasegunda la lista ordenada de las aristas (en ambas listas se excluye la posibilidad derepeticiones)
Nota 323 Las ventajas de usar arrays frente a usar listas es que los array tienenacceso constante (O(1)) a sus elementos mientras que las listas tienen acceso lineal(O(n)) y que la actualizacioacuten de un elemento en un array no supone espacio extraSin embargo los arrays son representaciones muy riacutegidas cualquier modificacioacutenen su estructura como cambiar su tamantildeo supone un gran coste computacionalpues se tendriacutea que crear de nuevo el array y ademaacutes sus iacutendices deben pertenecer
52 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
a la clase de los objetos indexables (Ix) luego perdemos mucha flexibilidad en larepresentacioacuten
- LANGUAGE DeriveGeneric -
module GrafoConListaDeAristas
( Grafo
creaGrafo -- [a] -gt [(aa)] -gt Grafo a
vertices -- Grafo a -gt [a]
adyacentes -- Grafo a -gt a -gt [a]
aristaEn -- (aa) -gt Grafo a -gt Bool
aristas -- Grafo a -gt [(aa)]
) where
En las definiciones del presente moacutedulo se usaraacuten las funciones nub y sort de lalibreriacutea DataList
Vamos a definir un nuevo tipo de dato (Grafo a) que representaraacute un grafo a partirde la lista de sus veacutertices (donde los veacutertices son de tipo a) y de aristas (que son paresde veacutertices)
data Grafo a = G [a] [(aa)]
deriving (Eq Show Generic)
instance (Out a) =gt Out (Grafo a)
Las funciones baacutesicas que definiremos a partir de este tipo coincidiraacuten con las indi-cadas en el TAD de los grafosbull (creaGrafo vs as) es el grafo cuyo conjunto de veacutertices es cs y el de sus aristas
es as-- | Ejemplo
-- gtgtgt creaGrafo [15] [(12)(14)(15)(23)(25)(34)(35)]
-- G [12345] [(12)(14)(15)(23)(25)(34)(35)]
creaGrafo Ord a =gt [a] -gt [(aa)] -gt Grafo a
creaGrafo vs as =
G (sort vs) (nub (sort [parOrdenado a | a lt- as]))
parOrdenado Ord a =gt (aa) -gt (aa)
parOrdenado (xy) | x lt= y = (xy)
| otherwise = (yx)
Ejemplo 324 ejGrafo es el grafo
32 El TAD de los grafos 53
1
2
3
4
5
Los ejemplos usaraacuten el siguiente grafo
ejGrafo Grafo Int
ejGrafo = creaGrafo [15]
[(12)(14)(15)(23)(25)(34)(35)(45)]
bull (vertices g) es la lista de los veacutertices del grafo g
-- | Ejemplo
-- gtgtgt vertices ejGrafo
-- [12345]
vertices Grafo a -gt [a]
vertices (G vs _) = vs
bull (adyacentes g v) es la lista de los veacutertices adyacentes al veacutertice v en el grafo g
-- | Ejemplos
-- gtgtgt adyacentes ejGrafo 4
-- [135]
-- gtgtgt adyacentes ejGrafo 3
-- [245]
adyacentes Eq a =gt Grafo a -gt a -gt [a]
adyacentes (G _ as) v =
[u | (ux) lt- as x == v] `union` [u | (xu) lt- as x == v]
bull (aristaEn a g) se verifica si a es una arista del grafo g
-- | Ejemplos
-- gtgtgt (51) `aristaEn` ejGrafo
-- True
-- gtgtgt (31) `aristaEn` ejGrafo
-- False
aristaEn Ord a =gt (aa) -gt Grafo a -gt Bool
aristaEn a (G _ as) = parOrdenado a `elem` as
bull (aristas g) es la lista de las aristas del grafo g
-- | Ejemplo
-- gtgtgt aristas ejGrafo
-- [(12)(14)(15)(23)(25)(34)(35)(45)]
aristas Grafo a -gt [(aa)]
aristas (G _ as) = as
54 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
33 Generador de grafos
En esta seccioacuten presentaremos el generador de grafos que nos permitiraacute generargrafos como listas de aristas arbitrariamente y usarlos como ejemplos o para com-probar propiedadesPara aprender a controlar el tamantildeo de los grafos generados he consultado las si-guientes fuentes QuickCheck A Lightweight Tool for Random Testing of Haskell Programs 1
([3]) Property Testing using QuickCheck 2 ([9])(generaGrafos n) es un generador de grafos de hasta n veacutertices Por ejemplo
ghcigt sample (generaGrafo 5)
G [12] []
G [1] [(11)]
G [] []
G [1234] [(22)]
G [123] [(11)(12)(13)(22)]
G [12345] [(12)(14)(15)(22)(23)(24)(33)(34)(44)(45)]
G [1] []
G [123] [(12)(22)(33)]
G [1234] [(11)(14)(23)(24)(33)(34)(44)]
G [12] []
G [123] [(11)(12)(22)(33)]
ghcigt sample (generaGrafo 2)
G [12] [(12)(22)]
G [12] [(11)]
G [12] [(11)(12)]
G [] []
G [1] [(11)]
G [1] []
G [1] []
G [] []
G [] []
G [] []
G [1] [(11)]
generaGrafo Int -gt Gen (Grafo Int)
generaGrafo s = do
let m = s `mod` 11
n lt- choose (0m)
as lt- sublistOf [(xy) | x lt- [1n] y lt- [xn]]
return (creaGrafo [1n] as)
1httpswwweecsnorthwesternedu~robbycourses395-495-2009-fallquickpdf2httpswwwdccfcuppt~pbvaulastapfslidesquickcheckhtml
34 Ejemplos de grafos 55
Nota 331 Los grafos estaacuten contenidos en la clase de los objetos generables aleato-riamente
instance Arbitrary (Grafo Int) where
arbitrary = sized generaGrafo
En el siguiente ejemplo se pueden observar algunos grafos generados
ghcigt sample (arbitrary Gen (Grafo Int))
G [] []
G [1] [(11)]
G [12] [(11)(12)]
G [1] [(11)]
G [12345678] [(14)(17)(22)(23)(25)(28)(35)
(36)(38)(44)(46)(47)(48)(56)(66)(67)(78)]
G [12345] [(11)(12)(14)(15)(24)(25)(34)(55)]
G [] []
G [] []
G [123] [(11)(22)(23)]
G [1234] [(11)(12)(14)(22)(33)]
G [1234567] [(11)(15)(16)(17)(22)(24)(25)
(26)(27)(33)(35)(46)(47)(55)(57)(66)(77)]
34 Ejemplos de grafos
El objetivo de esta seccioacuten es reunir una coleccioacuten de grafos lo suficientemente ex-tensa y variada como para poder utilizarla como recurso a la hora de comprobar laspropiedades y definiciones de funciones que implementaremos maacutes adelanteEn el proceso de recopilacioacuten de ejemplos se ha trabajado con diversas fuentesbull los apuntes de la asignatura ldquoMatemaacutetica discretardquo ([4])bull los temas de la asignatura ldquoInformaacuteticardquo ([1]) ybull el artiacuteculo ldquoGraph theoryrdquo ([11]) de la Wikipedia
Nota 341 Se utilizaraacute la representacioacuten de los grafos como listas de aristas
341 Grafo nulo
Definicioacuten 341 Un grafo nulo es un grafo que no tiene ni veacutertices ni aristas
La funcioacuten (grafoNulo) devuelve un grafo nulo
grafoNulo Ord a =gt Grafo a
grafoNulo = creaGrafo [] []
La funcioacuten (esGrafoNulo g) se verifica si g es un grafo nulo
56 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- | Ejemplos
-- gtgtgt esGrafoNulo grafoNulo
-- True
-- gtgtgt esGrafoNulo (creaGrafo [] [(12)])
-- False
-- gtgtgt esGrafoNulo (creaGrafo [12] [(12)])
-- False
esGrafoNulo Grafo a -gt Bool
esGrafoNulo g =
null (vertices g) ampamp null (aristas g)
342 Grafo ciclo
Definicioacuten 342 Un ciclo 3 de orden n C(n) es un grafo no dirigido y no ponderadocuyo conjunto de veacutertices viene dado por V = 1 n y el de las aristas por A = (0 1)(1 2) (nminus 2 nminus 1) (nminus 1 0)
La funcioacuten (grafoCiclo n) nos genera el ciclo de orden n
1
23
45
-- | Ejemplos
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
grafoCiclo Int -gt Grafo Int
grafoCiclo 0 = grafoNulo
grafoCiclo 1 = creaGrafo [1] []
grafoCiclo n = creaGrafo [1n]
([(uu+1) | u lt- [1n-1]] ++ [(n1)])
343 Grafo de la amistad
Definicioacuten 343 Un grafo de la amistad 4 de orden n es un grafo con 2n + 1 veacuterticesy 3n aristas formado uniendo n copias del ciclo C3 por un veacutertice comuacuten Lo denotamos porFn3httpseswikipediaorgwikiGrafo_completo4httpseswikipediaorgwikiGrafo_de_la_amistad
34 Ejemplos de grafos 57
La funcioacuten (grafoAmistad n) genera el grafo de la amistad de orden n Por ejemplo
1
2
34
5
1
2
3
4
5
6
7
-- | Ejemplos
-- gtgtgt pp $ grafoAmistad 2
-- G [12345]
-- [(1 2)(1 3)(1 4)(1 5)(2 3)(4 5)]
-- gtgtgt pp $ grafoAmistad 3
-- G [1234567]
-- [(1 2)(1 3)(1 4)(1 5)(1 6)(1 7)(2 3)
-- (4 5)(6 7)]
grafoAmistad Int -gt Grafo Int
grafoAmistad n =
creaGrafo [12n+1]
([(1a) | a lt- [22n+1]] ++
[(ab) | (ab) lt-zip [242n] [352n+1]])
344 Grafo completo
Definicioacuten 344 El grafo completo 5 de orden n K(n) es un grafo no dirigido cuyoconjunto de veacutertices viene dado por V = 1 n y tiene una arista entre cada par deveacutertices distintos
La funcioacuten (completo n) nos genera el grafo completo de orden n Por ejemplo
5httpseswikipediaorgwikiGrafo_completo
58 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
1
2
3
4
-- | Ejemplo
-- gtgtgt completo 4
-- G [1234] [(12)(13)(14)(23)(24)(34)]
completo Int -gt Grafo Int
completo n =
creaGrafo [1n]
[(ab) | a lt- [1n] b lt- [1a-1]]
345 Grafo bipartito
Definicioacuten 345 Un grafo bipartito 6 es un grafo G = (V A) verificando que elconjunto de sus veacutertices se puede dividir en dos subconjuntos disjuntos V1 V2 tales queV1 cupV2 = V de manera que forallu1 u2 isin V1[(u1 u2) 6isin A] y forallv1 v2 isin V2[(v1 v2) 6isin A]Un grafo bipartito completo 7 seraacute entonces un grafo bipartito G = (V1 cup V2 A) en elque todos los veacutertices de una particioacuten estaacuten conectados a los de la otra Si n = |V1| m =
|V2| denotamos al grafo bipartito G = (V1 cupV2 A) por Knm
La funcioacuten (bipartitoCompleto n m) nos genera el grafo bipartito Knm Por ejem-plo
1 2
3 4 5
-- | Ejemplo
-- gtgtgt bipartitoCompleto 2 3
-- G [12345] [(13)(14)(15)(23)(24)(25)]
bipartitoCompleto Int -gt Int -gt Grafo Int
bipartitoCompleto n m =
creaGrafo [1n+m]
[(ab) | a lt- [1n] b lt- [n+1n+m]]
6httpseswikipediaorgwikiGrafo_bipartito7httpseswikipediaorgwikiGrafo_bipartito_completo
34 Ejemplos de grafos 59
La funcioacuten (conjuntosVerticesDisjuntos g) devuelve Nothing si el grafo g no esbipartito y Just(xsys) si lo es donde xs ys es una particioacuten disjunta de los veacuterticesde g
-- | Ejemplo
-- gtgtgt conjuntosVerticesDisjuntos (bipartitoCompleto 3 4)
-- Just ([321][7654])
-- gtgtgt conjuntosVerticesDisjuntos (grafoCiclo 5)
-- Nothing
-- gtgtgt conjuntosVerticesDisjuntos (grafoCiclo 6)
-- Just ([531][642])
conjuntosVerticesDisjuntos Ord a =gt Grafo a -gt Maybe ([a][a])
conjuntosVerticesDisjuntos g
| null (vertices g) = Just ([][])
| otherwise = aux (vertices g) [] [] [] []
where u = union
a = adyacentes g
d xs x = xs [x]
aux [] _ _ r b = if (null (intersect r b))
then (Just (rb))
else Nothing
aux (vvs) [] [] [] [] = aux vs (a v) [v] [v] []
aux (vvs) [] c r b
| null (a v) = aux vs [] (vc) (vr) b
| null ((a v) c) =
if (or [elem u r | u lt- (a v)])
then (if (or [elem u b | u lt- (a v)])
then Nothing
else (aux vs [] (vc) r (vb)))
else (aux vs [] (vc) (vr) b)
| otherwise =
if (or [elem u r | u lt- (a v)])
then (if (or [elem u b | u lt- (a v)])
then Nothing
else (aux vs ((a v) c) (vc) r (vb)))
else (aux vs ((a v) c) (vc) (vr) b)
aux vs (qqs) c r b
| null ((a q) c) =
if (or [elem u r | u lt- (a q)])
then (if (or [elem u b | u lt- (a q)])
then Nothing
else (aux (d vs q) qs (qc) r (qb)))
else (aux (d vs q) qs (qc) (qr) b)
| otherwise =
if (or [elem u r | u lt- (a q)])
then (if (or [elem u b | u lt- (a q)])
then Nothing
else (aux (d vs q) (u ((a q) c) qs)
60 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
(qc) r (qb)))
else (aux (d vs q) (u ((a q) c) qs)
(qc) (qr) b)
La funcioacuten (esBipartito g) se verifica si el grafo g es bipartito
-- | Ejemplo
-- gtgtgt esBipartito (bipartitoCompleto 3 4)
-- True
-- gtgtgt esBipartito (grafoCiclo 5)
-- False
-- gtgtgt esBipartito (grafoCiclo 6)
-- True
esBipartito Ord a =gt Grafo a -gt Bool
esBipartito g = isJust (conjuntosVerticesDisjuntos g)
346 Grafo estrella
Definicioacuten 346 Una estrella 8 de orden n es el grafo bipartito completo K1n Denota-remos a una estrella de orden n por Sn Una estrella con 3 aristas se conoce en ingleacutes comoclaw (garra o garfio)
La funcioacuten (grafoEstrella n) crea un grafo circulante a partir de su orden n
2
34
56
1
-- | Ejemplo
-- gtgtgt grafoEstrella 5
-- G [123456] [(12)(13)(14)(15)(16)]
grafoEstrella Int -gt Grafo Int
grafoEstrella = bipartitoCompleto 1
347 Grafo rueda
Definicioacuten 347 Un grafo rueda 9 de orden n es un grafo no dirigido y no ponderado conn veacutertices que se forma conectando un uacutenico veacutertice a todos los veacutertices de un ciclo Cnminus1 Lodenotaremos por Wn8httpsenwikipediaorgwikiStar_(graph_theory))9httpseswikipediaorgwikiGrafo_rueda
34 Ejemplos de grafos 61
La funcioacuten (grafoRueda n) crea un grafo rueda a partir de su orden n
2
34
56
1
-- | Ejemplo
-- gtgtgt pp $ grafoRueda 6
-- G [123456]
-- [(1 2)(1 3)(1 4)(1 5)(1 6)(2 3)(2 6)
-- (3 4)(4 5)(5 6)]
grafoRueda Int -gt Grafo Int
grafoRueda n =
creaGrafo [1n]
([(1a) | a lt- [2n]] ++
[(ab) | (ab) lt- zip (2[2n-1]) (3n[4n])])
348 Grafo circulante
Definicioacuten 348 Un grafo circulante 10 de orden n ge 3 y saltos s1 sk es un grafono dirigido y no ponderado G = (1 n A) en el que cada nodo foralli isin V es adyacente alos 2k nodos iplusmn s1 iplusmn sk mod n Lo denotaremos por Cirs1sk
n
La funcioacuten (grafoCirculante n ss) crea un grafo circulante a partir de su orden n
y de la lista de sus saltos ss Por ejemplo
2
34
5
6 1
-- | Ejemplo
-- gtgtgt pp $ grafoCirculante 6 [12]
-- G [123456]
-- [(1 2)(1 3)(1 5)(1 6)(2 3)(2 4)(2 6)
-- (3 4)(3 5)(4 5)(4 6)(5 6)]
grafoCirculante Int -gt [Int] -gt Grafo Int
grafoCirculante n ss =
10httpsenwikipediaorgwikiCirculant_graph
62 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
creaGrafo [1n]
[(ab) | a lt- [1n]
b lt- sort (auxCir a ss n)
a lt b]
where auxCir v ss1 k =
concat [[fun (v+s) k fun (v-s) k] | s lt- ss1]
fun a b = if mod a b == 0 then b else mod a b
349 Grafo de Petersen generalizado
El grafo de Petersen generalizado 11 que denotaremos GPnk (con n ge 3 y 1 le k le(nminus 1)2) es un grafo formado por un grafo circulante Cirn
k en el interior rodeadopor un ciclo Cn al que estaacute conectado por una arista saliendo de cada veacutertice deforma que se creen n poliacutegonos regulares El grafo GPnk tiene 2n veacutertices y 3n aristasLa funcioacuten (grafoPetersenGen n k) devuelve el grafo de Petersen generalizadoGPnk
1
2
3
4
5
6
7
8
-- | Ejemplo
-- gtgtgt pp $ grafoPetersenGen 4 2
-- G [12345678]
-- [(1 3)(1 5)(2 4)(2 6)(3 7)(4 8)(5 6)
-- (5 8)(6 7)(7 8)]
grafoPetersenGen Int -gt Int -gt Grafo Int
grafoPetersenGen n k =
creaGrafo [12n]
(filter p (aristas (grafoCirculante n [k])) ++
[(xx+n) | x lt- [1n]] ++
(n+1n+2) (n+12n) [(xx+1) | x lt- [n+22n-1]])
where p (ab) = a lt b
11httpsenwikipediaorgwikiGeneralized_Petersen_graph
34 Ejemplos de grafos 63
3410 Otros grafos importantes
Grafo de Thomson
Definicioacuten 349 El grafo bipartito completo K33 es conocido como el grafo de Thomsony como veremos maacutes adelante seraacute clave a la hora de analizar propiedades topoloacutegicas de losgrafos
1 2 3
4 5 6
La funcioacuten (grafoThomson) genera el grafo de Thomson
-- | Ejemplo
-- gtgtgt pp $ grafoThomson
-- G [123456]
-- [(1 4)(1 5)(1 6)(2 4)(2 5)(2 6)(3 4)
-- (3 5)(3 6)]
grafoThomson Grafo Int
grafoThomson = bipartitoCompleto 3 3
Grafo de Heawood
El grafo de Heawood 12 es un grafo no dirigido regular con 14 veacutertices y 21 aris-tas Todos sus veacutertices son incidentes a exactamente 3 aristas es decir es un grafocuacutebico Tiene importantes propiedades geomeacutetricas y topoloacutegicas
1
2
3
45
6
7
8
9
10
11 12
13
14
12httpsenwikipediaorgwikiHeawood_graph
64 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten grafoHeawood genera el grafo de Heawood
-- | Ejemplo
-- gtgtgt pp $ grafoHeawood
-- G [1234567891011121314]
-- [(1 2)(1 6)(1 14)(2 3)(2 11)(3 4)(3 8)
-- (4 5)(4 13)(5 6)(5 10)(6 7)(7 8)(7 12)
-- (8 9)(9 10)(9 14)(10 11)(11 12)(12 13)
-- (13 14)]
grafoHeawood Grafo Int
grafoHeawood =
creaGrafo [114]
(aristas (grafoCiclo 14) ++
zip [1 23 4 5 7 9]
[611813101214])
Grafo de McGee
El grafo de McGee 13 es un grafo no dirigido cuacutebico con 24 veacutertices y 36 aristasTiene importantes propiedades geomeacutetricas y topoloacutegicas
1
2
3
45
6789
10
11
12
13
14
15
1617
18 19 2021
22
23
24
La funcioacuten grafoMcGee genera el grafo de McGee
-- | Ejemplo
-- gtgtgt pp $ grafoMcGee
-- G [12345678910111213141516171819
-- 2021222324]
-- [(1 2)(1 13)(1 24)(2 3)(2 9)(3 4)(3 20)
13httpsenwikipediaorgwikiMcGee_graph
34 Ejemplos de grafos 65
-- (4 5)(4 16)(5 6)(5 12)(6 7)(6 23)(7 8)
-- (7 19)(8 9)(8 15)(9 10)(10 11)(10 22)
-- (11 12)(11 18)(12 13)(13 14)(14 15)
-- (14 21)(15 16)(16 17)(17 18)(17 24)
-- (18 19)(19 20)(20 21)(21 22)(22 23)
-- (23 24)]
grafoMcGee Grafo Int
grafoMcGee =
creaGrafo [124]
(aristas (grafoCiclo 24) ++
zip [ 12 3 4 5 6 7 810111417]
[13920161223191522182124])
Grafo TuttendashCoxeter
El grafo TuttendashCoxeter 14 es un grafo no dirigido cuacutebico con 30 veacutertices y 45 aristasTiene importantes propiedades geomeacutetricas y topoloacutegicas
1
2
3
4
56
7891011
12
13
14
15
16
17
18
19
2021
22 23 24 2526
27
28
29
30
La funcioacuten grafoTutteCoxeter genera el grafo TuttendashCoxeter
-- | Ejemplo
-- gtgtgt pp $ grafoTutteCoxeter
-- G [12345678910111213141516171819
-- 2021222324252627282930]
14httpsenwikipediaorgwikiTutteT1textendashCoxeter_graph
66 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- [(1 2)(1 18)(1 30)(2 3)(2 23)(3 4)
-- (3 10)(4 5)(4 27)(5 6)(5 14)(6 7)(6 19)
-- (7 8)(7 24)(8 9)(8 29)(9 10)(9 16)
-- (10 11)(11 12)(11 20)(12 13)(12 25)
-- (13 14)(13 30)(14 15)(15 16)(15 22)
-- (16 17)(17 18)(17 26)(18 19)(19 20)
-- (20 21)(21 22)(21 28)(22 23)(23 24)
-- (24 25)(25 26)(26 27)(27 28)(28 29)
-- (29 30)]
grafoTutteCoxeter Grafo Int
grafoTutteCoxeter =
creaGrafo [130]
(aristas (grafoCiclo 30) ++
zip [ 1 2 3 4 5 6 7 8 9111213151721]
[182310271419242916202530222628])
Grafo de Petersen
El grafo de Petersen 15 se define como el grafo de Petersen generalizado GP52 esdecir es un grafo cuacutebico formado por los veacutertices de un pentaacutegono conectados alos veacutertices de una estrella de cinco puntas en la que cada nodo es adyacente a losnodos que estaacuten a un salto 2 de eacutel Es usado como ejemplo y como contraejemplo enmuchos problemas de la Teoriacutea de grafos
6
7
8 9
101
2
3 4
5
La funcioacuten grafoPetersen devuelve el grafo de Petersen
-- | Ejemplo
-- gtgtgt pp $ grafoPetersen
-- G [12345678910]
-- [(1 3)(1 4)(1 6)(2 4)(2 5)(2 7)(3 5)
-- (3 8)(4 9)(5 10)(6 7)(6 10)(7 8)(8 9)
-- (9 10)]
grafoPetersen Grafo Int
grafoPetersen = grafoPetersenGen 5 2
15httpsenwikipediaorgwikiPetersen_graph
35 Definiciones y propiedades 67
Grafo de MoeumlbiusndashCantor
El grafo de MoeumlbiusndashCantor 16 se define como el grafo de Petersen generalizadoGP83 es decir es un grafo cuacutebico formado por los veacutertices de un octoacutegono conecta-dos a los veacutertices de una estrella de ocho puntas en la que cada nodo es adyacente alos nodos que estaacuten a un salto 3 de eacutel Al igual que el grafo de Petersen tiene impor-tantes propiedades que lo hacen ser ejemplo y contraejemplo de muchos problemasde la Teoriacutea de Grafos
9
10
11
12
13
14
15
16
1
23
4
5
67
8
La funcioacuten grafoMoebiusCantor genera el grafo de MoeumlbiusndashCantor
-- | Ejemplo
-- gtgtgt pp $ grafoMoebiusCantor
-- G [12345678910111213141516]
-- [(1 4)(1 6)(1 9)(2 5)(2 7)(2 10)(3 6)
-- (3 8)(3 11)(4 7)(4 12)(5 8)(5 13)(6 14)
-- (7 15)(8 16)(9 10)(9 16)(10 11)(11 12)
-- (12 13)(13 14)(14 15)(15 16)]
grafoMoebiusCantor Grafo Int
grafoMoebiusCantor = grafoPetersenGen 8 3
35 Definiciones y propiedades
Una vez construida una pequentildea fuente de ejemplos estamos en condiciones deimplementar las definiciones sobre grafos en Haskell y ver que funcionan correc-tamente Ademaacutes comprobaremos que se cumplen las propiedades baacutesicas que sehan presentado en el tema Introduccioacuten a la teoriacutea de grafos de ldquoMatemaacutetica discretardquo([4])
16httpsenwikipediaorgwikiMoeumlbius-Kantor_graph
68 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Nota 351 Se utilizaraacute el tipo abstracto de grafos presentados en la seccioacuten 32 y seutilizaraacuten las librerias DataList y TestQuickCheck
351 Definiciones de grafos
Definicioacuten 351 El orden de un grafo G = (V A) se define como su nuacutemero de veacuterticesLo denotaremos por |V(G)|
La funcioacuten (orden g) devuelve el orden del grafo g
-- | Ejemplos
-- gtgtgt orden (grafoCiclo 4)
-- 4
-- gtgtgt orden (grafoEstrella 4)
-- 5
orden Grafo a -gt Int
orden = length vertices
Definicioacuten 352 El tamantildeo de un grafo G = (V A) se define como su nuacutemero de aristasLo denotaremos por |A(G)|
La funcioacuten (tamantildeo g) devuelve el orden del grafo g
-- | Ejemplos
-- gtgtgt tamantildeo (grafoCiclo 4)
-- 4
-- gtgtgt tamantildeo grafoPetersen
-- 15
tamantildeo Grafo a -gt Int
tamantildeo = length aristas
Definicioacuten 353 Diremos que dos aristas a aprime son incidentes si tienen interseccioacuten novaciacutea es decir si tienen alguacuten veacutertice en comuacuten
La funcioacuten (sonIncidentes a a) se verifica si las aristas a y a son incidentes
-- | Ejemplos
-- gtgtgt sonIncidentes (12) (24)
-- True
-- gtgtgt sonIncidentes (12) (34)
-- False
sonIncidentes Eq a =gt (aa) -gt (aa) -gt Bool
sonIncidentes (u1u2) (v1v2) =
or [u1 == v1 u1 == v2 u2 == v1 u2 == v2]
Definicioacuten 354 Diremos que una arista de un grafo G es un lazo si va de un veacutertice ensiacute mismo
35 Definiciones y propiedades 69
La funcioacuten (lazos g) devuelve los lazos del grafo g
-- | Ejemplos
-- gtgtgt lazos (creaGrafo [12] [(11)(12)(22)])
-- [(11)(22)]
-- gtgtgt lazos (grafoCiclo 5)
-- []
lazos Eq a =gt Grafo a -gt [(aa)]
lazos g = [(uv) | (uv) lt- aristas g u == v]
La funcioacuten (esLazo a) se verifica si la arista a es un lazo
-- | Ejemplos
-- gtgtgt esLazo (44)
-- True
-- gtgtgt esLazo (12)
-- False
esLazo Eq a =gt (aa) -gt Bool
esLazo (uv) = u == v
Definicioacuten 355 Dado un grafo G = (V A) fijado un veacutertice v isin V al conjunto deveacutertices que son adyacentes a v lo llamaremos entorno de v y lo denotaremos por N(v) =u isin V|(u v) isin A
La funcioacuten (entorno g v) devuelve el entorno del veacutertice v en el grafo g
-- | Ejemplo
-- gtgtgt entorno (creaGrafo [15] [(12)(13)(23)]) 2
-- [13]
entorno Eq a =gt Grafo a -gt a -gt [a]
entorno = adyacentes
Definicioacuten 356 Sea G = (V A) un grafo El grado (o valencia) de v isin V es grad(v) =|N(v)|
La funcioacuten (grado g v) devuelve el grado del veacutertice v en el grafo g
-- | Ejemplos
-- gtgtgt grado (creaGrafo [15] [(12)(13)(23)]) 2
-- 2
-- gtgtgt grado (grafoEstrella 5) 1
-- 5
grado Eq a =gt Grafo a -gt a -gt Int
grado g v = length (entorno g v)
Definicioacuten 357 Un veacutertice v de un grafo es aislado si su grado es 0
La funcioacuten (esAislado g v) se verifica si el veacutertice v es aislado en el grafo g
70 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- | Ejemplos
-- gtgtgt esAislado (creaGrafo [15] [(12)(13)(23)]) 4
-- True
-- gtgtgt esAislado (creaGrafo [15] [(12)(13)(23)]) 3
-- False
esAislado Eq a =gt Grafo a -gt a -gt Bool
esAislado g v = grado g v == 0
Definicioacuten 358 Un grafo es regular si todos sus veacutertices tienen el mismo grado
La funcioacuten (esRegular g) se verifica si el grafo g es regular
-- | Ejemplos
-- gtgtgt esRegular (creaGrafo [13] [(12)(13)(23)])
-- True
-- gtgtgt esRegular (creaGrafo [14] [(12)(13)(24)])
-- False
esRegular Eq a =gt Grafo a -gt Bool
esRegular g = all (==x) xs
where (xxs) = [grado g v | v lt- vertices g]
Definicioacuten 359 Dado un grafo G = (V A) llamamos valencia miacutenima o grado miacuteni-mo de G al valor δ(G) = mıngrad(v)|v isin V
La funcioacuten (valenciaMin g) devuelve la valencia miacutenima del grafo g
-- | Ejemplo
-- gtgtgt valenciaMin (creaGrafo [14] [(12)(13)(24)])
-- 1
valenciaMin Ord a =gt Grafo a -gt Int
valenciaMin g = minimum [grado g v | v lt- vertices g]
Definicioacuten 3510 Dado un grafo G = (V A) llamamos valencia maacutexima o gradomaacuteximo de G al valor δ(G) = maxgrad(v)|v isin V
La funcioacuten (valenciaMax g) devuelve la valencia maacutexima del grafo g
-- | Ejemplo
-- gtgtgt valenciaMax (creaGrafo [14] [(12)(13)(24)])
-- 2
valenciaMax Ord a =gt Grafo a -gt Int
valenciaMax g = maximum [grado g v | v lt- vertices g]
Definicioacuten 3511 Se dice que un grafo es simple si no contiene lazos ni aristas repetidas
La funcioacuten (esSimple g) se verifica si g es un grafo simple
35 Definiciones y propiedades 71
-- | Ejemplos
-- gtgtgt esSimple (creaGrafo [13] [(12)(13)(23)])
-- True
-- gtgtgt esSimple (creaGrafo [13] [(11)(12)(23)])
-- False
esSimple Ord a =gt Grafo a -gt Bool
esSimple g =
and [not ((xx) `aristaEn` g) | x lt- vertices g]
Definicioacuten 3512 Sea G un grafo Llamamos secuencia de grados de G a la lista degrados de sus veacutertices La secuencia se suele presentar en orden decreciente d1 ge d2 gemiddot middot middot ge dn
La funcioacuten (secuenciaGrados g) devuelve la secuencia de los grados del grafo g enorden decreciente
-- | Ejemplo
-- gtgtgt secuenciaGrados (creaGrafo [15] [(12)(13)(14)(24)])
-- [32210]
secuenciaGrados Eq a =gt Grafo a -gt [Int]
secuenciaGrados g = sortBy (flip compare) [grado g v | v lt- vertices g]
Nota 352 iquestQueacute listas de n nuacutemeros enteros son secuencias de grafos de n veacuterticesbull Si sumn
i=1 di es impar no hay ningunobull Si sumn
i=1 di es par entonces siempre hay un grafo con esa secuencia de grados (aun-que no necesariamente simple)
Definicioacuten 3513 Una secuencia graacutefica es una lista de nuacutemero enteros no negativos quees la secuencia de grados para alguacuten grafo simple
La funcioacuten (secuenciaGrafica ss) se verifica si existe alguacuten grafo con la secuenciade grados ss
-- | Ejemplos
-- gtgtgt secuenciaGrafica [32210]
-- True
-- gtgtgt secuenciaGrafica [3222]
-- False
secuenciaGrafica [Int] -gt Bool
secuenciaGrafica ss = even (sum ss) ampamp all p ss
where p s = s gt= 0 ampamp s lt= length ss
Definicioacuten 3514 Dado un grafo G = (V A) diremos que Gprime = (Vprime Aprime) es un subgrafode G si Vprime sube V y Aprime sube A
72 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (esSubgrafo g g) se verifica si g es un subgrafo de g
-- |Ejemplos
-- gtgtgt esSubgrafo (bipartitoCompleto 3 2) (bipartitoCompleto 3 3)
-- True
-- gtgtgt esSubgrafo (grafoEstrella 4) (grafoEstrella 5)
-- True
-- gtgtgt esSubgrafo (completo 5) (completo 4)
-- False
-- gtgtgt esSubgrafo (completo 3) (completo 4)
-- True
esSubgrafo Ord a =gt Grafo a -gt Grafo a -gt Bool
esSubgrafo g g =
vertices g `esSubconjunto` vertices g ampamp
aristas g `esSubconjunto` aristas g
Definicioacuten 3515 Si Gprime = (Vprime Aprime) es un subgrafo de G = (V A) tal que Vprime = Vdiremos que Gprime es un subgrafo maximal grafo recubridor o grafo de expansioacuten (eningleacutes spanning grah) de G
La funcioacuten (esSubgrafoMax g g) se verifica si g es un subgrafo maximal de g
-- | Ejemplos
-- gtgtgt esSubgrafoMax (grafoRueda 3) (grafoRueda 4)
-- False
-- gtgtgt esSubgrafoMax (grafoCiclo 4) (grafoRueda 4)
-- True
-- gtgtgt esSubgrafoMax (creaGrafo [13] [(12)]) (grafoCiclo 3)
-- True
-- gtgtgt esSubgrafoMax (creaGrafo [12] [(12)]) (grafoCiclo 3)
-- False
esSubgrafoMax Ord a =gt Grafo a -gt Grafo a -gt Bool
esSubgrafoMax g g =
g `esSubgrafo` g ampamp conjuntosIguales (vertices g) (vertices g)
Definicioacuten 3516 Sean Gprime = (Vprime Aprime) G = (V A) dos grafos si Vprime sub V o Aprime sub A sedice que Gprime es un subgrafo propio de G y se denota por Gprime sub G
La funcioacuten (esSubgrafoPropio g g) se verifica si g es un subgrafo propio de g
-- | Ejemplos
-- gtgtgt esSubgrafoPropio (grafoRueda 3) (grafoRueda 4)
-- True
-- gtgtgt esSubgrafoPropio (grafoRueda 4) (grafoCiclo 5)
-- False
-- gtgtgt esSubgrafoPropio (creaGrafo [13] [(12)]) (grafoCiclo 3)
-- True
-- gtgtgt esSubgrafoPropio (creaGrafo [12] [(12)]) (grafoCiclo 3)
35 Definiciones y propiedades 73
-- True
esSubgrafoPropio Ord a =gt Grafo a -gt Grafo a -gt Bool
esSubgrafoPropio g g =
esSubgrafo g g ampamp
(not (conjuntosIguales (vertices g) (vertices g)) ||
not (conjuntosIguales (aristas g) (aristas g)))
352 Propiedades de grafos
Teorema 3517 (Lema del apretoacuten de manos) En todo grafo simple el nuacutemero de veacuterticesde grado impar es par o cero
Vamos a comprobar que se verifica el lema del apretoacuten de manos utilizando la fun-cioacuten prop_LemaApretonDeManos
ghcigt quickCheck prop_LemaApretonDeManos
+++ OK passed 100 tests
prop_LemaApretonDeManos Grafo Int -gt Bool
prop_LemaApretonDeManos g =
even (length (filter odd [grado g v | v lt- vertices g]))
where g = creaGrafo (vertices g)
[(xy) | (xy) lt- aristas g x = y]
Teorema 3518 (HavelndashHakimi) Si n gt 1 y D = [d1 dn] es una lista de enterosentonces D es secuencia graacutefica si y soacutelo si la secuencia Dprime obtenida borrando el mayorelemento dmax y restando 1 a los siguientes dmax elementos maacutes grandes es graacutefica
Vamos a comprobar que se verifica el teorema de HavelndashHakimi utilizando la fun-cioacuten prop_HavelHakimi
ghcigt quickCheck prop_HavelHakimi
+++ OK passed 100 tests
prop_HavelHakimi [Int] -gt Bool
prop_HavelHakimi [] = True
prop_HavelHakimi (sss) =
not (secuenciaGrafica (sss) ampamp not (esVacio ss)) ||
secuenciaGrafica (map (x -gt x-1) (take s ss) ++ drop s ss)
353 Operaciones y propiedades sobre grafos
Eliminacioacuten de una arista
Definicioacuten 3519 Sea G = (V A) un grafo y sea (u v) isin A Definimos el grafo G (u v) como el subgrafo de G Gprime = (Vprime Aprime) con Vprime = V y Aprime = A (u v) Esta
74 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
operacioacuten se denomina eliminar una arista
La funcioacuten (eliminaArista g a) elimina la arista a del grafo g
-- | Ejemplos
-- gtgtgt eliminaArista (creaGrafo [14] [(12)(14)(24)]) (14)
-- G [1234] [(12)(24)]
-- gtgtgt eliminaArista (creaGrafo [14] [(12)(14)(24)]) (41)
-- G [1234] [(12)(24)]
-- gtgtgt eliminaArista (creaGrafo [14] [(12)(14)(24)]) (43)
-- G [1234] [(12)(14)(24)]
eliminaArista Ord a =gt Grafo a -gt (aa) -gt Grafo a
eliminaArista g (ab) =
creaGrafo (vertices g)
(aristas g [(ab)(ba)])
La funcioacuten (eliminaLazos g) devuelve un nuevo grafo obtenido a partir del grafog eliminando todas las aristas que fueran lazos
-- | Ejemplos
-- gtgtgt eliminaLazos (creaGrafo [12] [(11)(12)(22)])
-- G [12] [(12)]
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
-- gtgtgt eliminaLazos (grafoCiclo 5)
-- G [12345] [(12)(15)(23)(34)(45)]
eliminaLazos Ord a =gt Grafo a -gt Grafo a
eliminaLazos g = creaGrafo (vertices g)
[(xy) | (xy) lt- aristas g x = y]
Eliminacioacuten un veacutertice
Definicioacuten 3520 Sea G = (V A) un grafo y sea v isin V Definimos el grafo G v como elsubgrafo de G Gprime = (Vprime Aprime) con Vprime = V v y Aprime = A a isin A|v es un extremo de aEsta operacioacuten se denomina eliminar un veacutertice
La funcioacuten (eliminaVertice g v) elimina el veacutertice v del grafo g
-- | Ejemplos
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(24)]) 1
-- G [234] [(24)]
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(24)]) 4
-- G [123] [(12)]
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(24)]) 3
-- G [124] [(12)(14)(24)]
-- gtgtgt eliminaVertice (creaGrafo [14] [(12)(14)(13)]) 1
-- G [234] []
eliminaVertice Ord a =gt Grafo a -gt a -gt Grafo a
35 Definiciones y propiedades 75
eliminaVertice g v =
creaGrafo (vertices g [v])
(as [(ab) | (ab) lt- as a == v || b == v])
where as = aristas g
Suma de aristas
Definicioacuten 3521 Sea G = (V A) un grafo y sean u v isin V tales que (u v) (v u) 6isin ADefinimos el grafo G + (u v) como el grafo Gprime = (V A cup (u v)) Esta operacioacuten sedenomina suma de una arista
La funcioacuten (sumaArista g a) suma la arista a al grafo g
-- | Ejemplos
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
-- gtgtgt sumaArista (grafoCiclo 5) (13)
-- G [12345] [(12)(13)(15)(23)(34)(45)]
sumaArista Ord a =gt Grafo a -gt (aa) -gt Grafo a
sumaArista g a =
creaGrafo (vertices g) (a aristas g)
Suma de veacutertices
Definicioacuten 3522 Sea G = (V A) un grafo y sea v 6isin V Definimos el grafo G + v comoel grafo Gprime = (Vprime Aprime) donde Vprime = V cup v Aprime = Acup (u v)|u isin V Esta operacioacuten sedenomina suma de un veacutertice
La funcioacuten (sumaVertice g a) suma el veacutertice a al grafo g
-- | Ejemplo
-- gtgtgt grafoCiclo 3
-- G [123] [(12)(13)(23)]
-- gtgtgt sumaVertice (grafoCiclo 3) 4
-- G [1234] [(12)(13)(14)(23)(24)(34)]
sumaVertice Ord a =gt Grafo a -gt a -gt Grafo a
sumaVertice g v =
creaGrafo (v vs) (aristas g ++ [(uv) | u lt- vs])
where vs = vertices g
Propiedad de los grafos completos
Proposicioacuten 3523 La familia de grafos completos Kn verifica que Kn = Knminus1 + n
Vamos a ver que se cumple la propiedad utilizando la funcioacuten prop_completos
76 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
ghcigt quickCheck prop_completos
+++ OK passed 100 tests
prop_completos Int -gt Property
prop_completos n = n gt= 2 ==gt
completo n == sumaVertice (completo (n-1)) n
A partir de esta propiedad se puede dar una definicioacuten alternativa de la funcioacuten(completo n) que devuelve el grafo completo Kn La nueva funcioacuten seraacute (completo2n)
completo2 Int -gt Grafo Int
completo2 0 = grafoNulo
completo2 n = sumaVertice (completo2 (n-1)) n
Vamos a comprobar la equivalencia de ambas deficiones
ghcigt prop_EquiCompleto
True
prop_EquiCompleto Bool
prop_EquiCompleto = and [completo n == completo2 n | n lt- [050]]
Vamos a ver cuaacutel de las definiciones es maacutes eficiente
ghcigt tamantildeo (completo 100)
4950
(117 secs 0 bytes)
ghcigt tamantildeo (completo2 100)
4950
(1549 secs 61756056 bytes)
La funcioacuten (completo n) es maacutes eficiente asiacute que seraacute la que seguiremos utilizando
Suma de grafos
Definicioacuten 3524 Sean G = (V A) Gprime = (Vprime A) dos grafos Definimos el grafo sumade G y Gprime como el grafo G + Gprime = (V cup Vprime A cup Aprime cup (u v)|u isin V v isin Vprime) Estaoperacioacuten se denomina suma de grafos
La funcioacuten (sumaGrafos g g) suma los grafos g y g
-- | Ejemplo
-- gtgtgt let g1 = creaGrafo [13] [(11)(13)(23)]
-- gtgtgt let g2 = creaGrafo [46] [(46)(56)]
-- gtgtgt pp $ sumaGrafos g1 g2
-- G [123456]
-- [(1 1)(1 3)(1 4)(1 5)(1 6)(2 3)(2 4)
-- (2 5)(2 6)(3 4)(3 5)(3 6)(4 6)(5 6)]
sumaGrafos Ord a =gt Grafo a -gt Grafo a -gt Grafo a
35 Definiciones y propiedades 77
sumaGrafos g1 g2 =
creaGrafo (vs1 `union` vs2)
(aristas g1 `union`
aristas g2 `union`
[(uv) | u lt- vs1 v lt- vs2])
where vs1 = vertices g1
vs2 = vertices g2
Unioacuten de grafos
Definicioacuten 3525 Sean G = (V A) Gprime = (Vprime A) dos grafos Definimos el grafo unioacutende G y Gprime como el grafo G cup H = (V cupVprime A cup Aprime) Esta operacioacuten se denomina unioacuten degrafos
La funcioacuten (unionGrafos g g) une los grafos g y g Por ejemplo
-- | Ejemplo
-- gtgtgt let g1 = creaGrafo [13] [(11)(13)(23)]
-- gtgtgt let g2 = creaGrafo [46] [(46)(56)]
-- gtgtgt unionGrafos g1 g2
-- G [123456] [(11)(13)(23)(46)(56)]
unionGrafos Ord a =gt Grafo a -gt Grafo a -gt Grafo a
unionGrafos g1 g2 =
creaGrafo (vertices g1 `union` vertices g2)
(aristas g1 `union` aristas g2)
Grafo complementario
Definicioacuten 3526 Dado un grafo G = (V A) se define el grafo complementario de Gcomo G = (V A) donde A = (u v)|u v isin V (u v) 6isin A
La funcioacuten (grafoComplementario g) devuelve el grafo complementario de g
-- | Ejemplo
-- gtgtgt grafoComplementario (creaGrafo [13] [(11)(13)(23)])
-- G [123] [(12)(22)(33)]
grafoComplementario Ord a =gt Grafo a -gt Grafo a
grafoComplementario g =
creaGrafo vs
[(uv)| u lt- vs v lt- vs u lt= v not ((uv) `aristaEn` g)]
where vs = vertices g
Definicioacuten 3527 Dado un grafo diremos que es completo si su complementario sin lazosno tiene aristas
La funcioacuten (esCompleto g) se verifica si el grafo g es completo
78 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- Ejemplos
-- gtgtgt esCompleto (completo 4)
-- True
-- gtgtgt esCompleto (grafoCiclo 5)
-- False
esCompleto Ord a =gt Grafo a -gt Bool
esCompleto g =
tamantildeo (eliminaLazos (grafoComplementario g)) == 0
36 Morfismos de grafos
Llegados a este punto es importante resaltar que un grafo se define como una en-tidad matemaacutetica abstracta es evidente que lo importante de un grafo no son losnombres de sus veacutertices ni su representacioacuten graacutefica La propiedad que caracterizaa un grafo es la forma en que sus veacutertices estaacuten unidos por las aristasA priori los siguientes grafos pueden parecer distintos
a
bc
de
1
23
45
Sin embargo ambos grafos son grafos de cinco veacutertices que tienen las mismas rela-ciones de vecindad entre sus nodos En esta seccioacuten estudiaremos estas relacionesque establecen las aristas entre los veacutertices de un grafo y presentaremos algoritmosque nos permitan identificar cuaacutendo dos grafos se pueden relacionar mediante apli-caciones entre sus veacutertices cumpliendo ciertas caracteriacutesicas
361 Morfismos
Definicioacuten 361 Si f es una funcioacuten entre dos grafos G = (V A) y Gprime = (Vprime Aprime)diremos que conserva la adyacencia si forallu v isin V se verifica que si (u v) isin A entonces( f (u) f (v)) isin Aprime
La funcioacuten (conservaAdyacencia g h f) se verifica si la funcioacuten f entre los grafosg y h conserva las adyacencias
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [14] [(12)(23)(34)]
-- gtgtgt let g2 = creaGrafo [14] [(12)(23)(24)]
-- gtgtgt let g3 = creaGrafo [4610] [(48)(68)(810)]
36 Morfismos de grafos 79
-- gtgtgt conservaAdyacencia g1 g3 [(14)(26)(38)(410)]
-- False
-- gtgtgt conservaAdyacencia g2 g3 [(14)(28)(36)(410)]
-- True
conservaAdyacencia (Ord a Ord b) =gt
Grafo a -gt Grafo b -gt Funcion a b -gt Bool
conservaAdyacencia g h f =
and [(imagen f ximagen f y) `aristaEn` h | (xy) lt- aristas g]
Definicioacuten 362 Dados dos grafos simples G = (V A) y Gprime = (Vprime Aprime) un morfismoentre G y Gprime es una funcioacuten φ V rarr Vprime que conserva las adyacencias
La funcioacuten (esMorfismo g h vvs) se verifica si la funcioacuten representada por vvs esun morfismo entre los grafos g y h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(12)(32)]
-- gtgtgt let g2 = creaGrafo [456] [(46)(56)]
-- gtgtgt esMorfismo g1 g2 [(14)(26)(35)]
-- True
-- gtgtgt esMorfismo g1 g2 [(14)(25)(36)]
-- False
-- gtgtgt esMorfismo g1 g2 [(14)(26)(35)(79)]
-- False
esMorfismo (Ord aOrd b) =gt Grafo a -gt Grafo b -gt
Funcion a b -gt Bool
esMorfismo g1 g2 f =
esFuncion (vertices g1) (vertices g2) f ampamp
conservaAdyacencia g1 g2 f
La funcioacuten (morfismos g h) devuelve todos los posibles morfismos entre los grafosg y h
-- | Ejemplos
-- gtgtgt grafoCiclo 3
-- G [123] [(12)(13)(23)]
-- gtgtgt let g = creaGrafo [46] [(44)(66)]
-- gtgtgt morfismos (grafoCiclo 3) g
-- [[(14)(24)(34)][(16)(26)(36)]]
-- gtgtgt morfismos g (grafoCiclo 3)
-- []
morfismos (Ord a Ord b) =gt Grafo a -gt Grafo b -gt [[(ab)]]
morfismos g h =
[f | f lt- funciones (vertices g) (vertices h)
conservaAdyacencia g h f]
80 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
362 Complejidad del problema de homomorfismo de grafos
En general en computacioacuten un problema algoriacutetmico consta de un conjunto I detodas las posibles entradas para el problema llamado el conjunto de instancias y deuna pregunta Q sobre esas instancias Resolver uno de estos problemas consiste endesarrollar un algoritmo cuya entrada es una instancia del problema y cuya salidaes una respuesta a la pregunta del problemaDecimos que un problema es de decisioacuten cuando las posibles respuestas a la pre-gunta son ldquosiacuterdquo o ldquonordquo Un ejemplo de problema de este tipo seriacutea dados dos grafosdecidir si estos son homomorfos o noA la hora de implementar un algoritmo que deacute solucioacuten al problema que estemosconsiderando es importante tener en cuenta el nuacutemero de pasos que efectuacutea hastaencontrar una respuesta Un algoritmo de tiempo polinomial se define como aquelcon funcioacuten de complejidad temporal en O(p(n)) para alguna funcioacuten polinoacutemicap donde n denota el tamantildeo de la entrada Cualquier algoritmo cuya funcioacuten decomplejidad temporal no pueda ser acotada de esta manera se denomina algoritmode tiempo exponencialLa mayoriacutea de los algoritmos de tiempo exponencial son simples variaciones de unabuacutesqueda exhaustiva mientras que los algoritmos de tiempo polinomial usualmen-te se obtienen mediante un anaacutelisis maacutes profundo de la estructura del problema Enla Teoriacutea de la complejidad computacional existe el consenso de que un problemano estaacute ldquobien resueltordquo hasta que se conozca un algoritmo de tiempo polinomialque lo resuelva Por tanto nos referiremos a un problema como ldquointratablerdquo si estan difiacutecil que no existe algoritmo de tiempo polinomial capaz de resolverloLos problemas de decisioacuten para los que existen algoritmos polinomiales consti-tuyen la clase P y son llamados polinomiales Un problema de decisioacuten es no-determiniacutestico polinomial cuando cualquier instancia que produce respuesta ldquosiacuterdquoposee una comprobacioacuten de correctitud (tambieacuten llamada certificado) verificable entiempo polinomia en el tamantildeo de la instancia Estos problemas de decisioacuten se di-ce que pertenecen a la clase NP Claramente P sube NP Sin embargo no se sabe siesta inclusioacuten es estricta uno de los principales problemas abiertos en Teoriacutea de lacomputacioacuten es saber si P 6= NPUna reduccioacuten es una transformacioacuten de un problema en otro problema Intuitiva-mente un problema Q puede ser reducido a otro problema Qprime si cualquier instanciadel problema Q puede ser ldquofaacutecilmenterdquo expresada como una instancia del problemaQprime y cuya solucioacuten proporcione una solucioacuten para la instancia de QLas reducciones en tiempo polinomial nos dotan de elementos para probar de unamanera formal que un problema es al menos tan difiacutecil que otro con una dife-rencia de un factor polinomial Estas son esenciales para definir a los problemas
36 Morfismos de grafos 81
NP-completos ademaacutes de ayudar a comprender los mismosLa clase de los problemas NP-completos contiene a los problemas maacutes difiacuteciles enNP en el sentido de que son los que esteacuten maacutes lejos de estar en P Debido a que elproblema P = NP no ha sido resuelto el hecho de reducir un problema B a otroproblema A indicariacutea que no se conoce solucioacuten en tiempo polinomial para A Estoes debido a que una solucioacuten en tiempo polinomial para A tendriacutea como conse-cuencia la existencia de una solucioacuten polinomial para B De manera similar debidoa que todos los problemas NP pueden ser reducidos a este conjunto encontrar unproblema NP-completo que pueda ser resuelto en un tiempo polinomial significariacuteaque P = NPEl problema de decidir si dos grafos son homomorfos es un problema de decisioacutenNP-completo La NP-completitud del problema se demuestra mediante la reduccioacutende este problema al problema de la clique 17En el proceso de recopilacioacuten de imformacioacuten acerca de la Teoriacutea de la complejidadse ha trabajado con dos fuentesbull la tesis de licenciatura de Pablo Burzyn ldquoComplejidad computacional en proble-
mas de modificacioacuten de aristas en grafosrdquo ([2]) ybull el artiacuteculo ldquoTeoriacutea de la complejidad computacionalrdquo ([12]) de la Wikipedia
363 Isomorfismos
Definicioacuten 363 Dados dos grafos simples G = (V A) y Gprime = (Vprime Aprime) un isomorfis-mo entre G y Gprime es un morfismo biyectivo cuyo inverso es morfismo entre Gprime y G
La funcioacuten (esIsomorfismo g h f) se verifica si la aplicacioacuten f es un isomorfismoentre los grafos g y h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt esIsomorfismo g1 g2 [(12)(24)(36)]
-- True
-- gtgtgt esIsomorfismo g1 g2 [(12)(22)(36)]
-- False
esIsomorfismo (Ord aOrd b) =gt
Grafo a -gt Grafo b -gt Funcion a b -gt Bool
esIsomorfismo g h f =
esBiyectiva vs1 vs2 f ampamp
esMorfismo g h f ampamp
esMorfismo h g (inversa f)
where vs1 = vertices g
vs2 = vertices h
17httpseswikipediaorgwikiProblema_de_la_clique
82 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (isomorfismos1 g h) devuelve todos los isomorfismos posibles entrelos grafos g y h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfismos1 g1 g2
-- [[(12)(24)(36)]]
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfismos1 g3 g4
-- []
-- gtgtgt let g5 = creaGrafo [123] [(11)(22)(33)]
-- gtgtgt let g6 = creaGrafo [246] [(22)(44)(66)]
-- gtgtgt pp $ isomorfismos1 g5 g6
-- [[(1 2)(2 4)(3 6)][(1 4)(2 2)(3 6)]
-- [(1 6)(2 4)(3 2)][(1 4)(2 6)(3 2)]
-- [(1 6)(2 2)(3 4)][(1 2)(2 6)(3 4)]]
isomorfismos1 (Ord aOrd b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos1 g h =
[f | f lt- biyecciones vs1 vs2
conservaAdyacencia g h f
conservaAdyacencia h g (inversa f)]
where vs1 = vertices g
vs2 = vertices h
Definicioacuten 364 Dos grafos G y H se dicen isomorfos si existe alguacuten isomorfismo entreellos
La funcioacuten isomorfos1 g h se verifica si los grafos g y h son isomorfos
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfos1 g1 g2
-- True
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfos1 g3 g4
-- False
isomorfos1 (Ord aOrd b) =gt Grafo a -gt Grafo b -gt Bool
isomorfos1 g = not null isomorfismos1 g
Nota 361 Al tener Haskell una evaluacioacuten perezosa la funcioacuten (isomorfos g h)
no necesita generar todos los isomorfismos entre los grafos g y h
Definicioacuten 365 Sea G = (V A) un grafo Un invariante por isomorfismos de G esuna propiedad de G que tiene el mismo valor para todos los grafos que son isomorfos a eacutel
36 Morfismos de grafos 83
esInvariantePorIsomorfismos
Eq a =gt (Grafo Int -gt a) -gt Grafo Int -gt Grafo Int -gt Bool
esInvariantePorIsomorfismos p g h =
isomorfos g h --gt (p g == p h)
where (--gt) = (lt=)
Teorema 366 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un iso-morfismo Entonces se verifica que |V(G)| = |V(Gprime)| es decir el orden de un grafo es uninvariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos orden)
+++ OK passed 100 tests
Teorema 367 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces se verifica que |A(G)| = |A(Gprime)| es decir el tamantildeo de un grafo es uninvariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos tamantildeo)
+++ OK passed 100 tests
Teorema 368 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces tienen la misma secuencia de grados es decir la secuencia de grados de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos secuenciaGrados)
+++ OK passed 100 tests
A partir de las propiedades que hemos demostrado de los isomorfismos vamos adar otra definicioacuten equivalente de las funciones (isomorfismos1 g h) y (isomorfos1
g h)
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfismos2 g1 g2
-- [[(12)(24)(36)]]
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfismos2 g3 g4
-- []
-- gtgtgt let g5 = creaGrafo [123] [(11)(22)(33)]
84 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- gtgtgt let g6 = creaGrafo [246] [(22)(44)(66)]
-- gtgtgt pp $ isomorfismos2 g5 g6
-- [[(1 2)(2 4)(3 6)][(1 4)(2 2)(3 6)]
-- [(1 6)(2 4)(3 2)][(1 4)(2 6)(3 2)]
-- [(1 6)(2 2)(3 4)][(1 2)(2 6)(3 4)]]
isomorfismos2 (Ord a Ord b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos2 g h
| orden g = orden h = []
| tamantildeo g = tamantildeo h = []
| secuenciaGrados g = secuenciaGrados h = []
| otherwise = [f | f lt- biyecciones vs1 vs2
conservaAdyacencia g h f]
where vs1 = vertices g
vs2 = vertices h
-- | Ejemplos
-- gtgtgt let g1 = creaGrafo [123] [(11)(12)(23)]
-- gtgtgt let g2 = creaGrafo [246] [(22)(24)(46)]
-- gtgtgt isomorfos2 g1 g2
-- True
-- gtgtgt let g3 = creaGrafo [123] [(11)(12)(13)]
-- gtgtgt let g4 = creaGrafo [246] [(22)(44)(26)]
-- gtgtgt isomorfos2 g3 g4
-- False
isomorfos2 (Ord a Ord b) =gt Grafo a -gt Grafo b -gt Bool
isomorfos2 g =
not null isomorfismos2 g
isomorfismos3 (Ord a Ord b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos3 g h
| orden g = orden h = []
| tamantildeo g = tamantildeo h = []
| secuenciaGrados g = secuenciaGrados h = []
| otherwise = filter (conservaAdyacencia g h) (posibles g h)
verticesPorGrados g =
[filter (p n) (vertices g) | n lt- nub (secuenciaGrados g)]
where p m v = grado g v == m
aux1 [] _ = []
aux1 (xsxss) (ysyss) = (map (zip xs) (permutations ys))aux1 xss yss
aux2 [] = []
aux2 (xss[]) = xss
aux2 (xssyss[]) = [xs ++ ys | xs lt- xss ys lt- yss]
aux2 (xssyssxsss) =
aux2 ([xs ++ ys | xs lt- xss ys lt- yss]xsss)
36 Morfismos de grafos 85
posibles g h =
aux2 (aux1 (verticesPorGrados g) (verticesPorGrados h))
Vamos a comparar la eficiencia entre ambas definiciones
Nota 362 La nueva definicioacuten de (isomorfismos3 g h) es la maacutes eficiente con gra-fos poco regulares sin embargo cuando todos los veacutertices tienen el mismo grado(isomorfismos2 g h) sigue siendo mejor opcioacuten (aunque no hay mucha diferenciaen el coste computacional)ghcigt let n = 6 in (length (isomorfismos1 (completo n) (completo n)))
720
(018 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos2 (completo n) (completo n)))
720
(018 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos3 (completo n) (completo n)))
720
(018 secs 26123800 bytes)
ghcigt let n = 6 in (length (isomorfismos1 (grafoCiclo n) (grafoCiclo n)))
12
(004 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos2 (grafoCiclo n) (grafoCiclo n)))
12
(004 secs 0 bytes)
ghcigt let n = 6 in (length (isomorfismos3 (grafoCiclo n) (grafoCiclo n)))
12
(004 secs 0 bytes)
ghcigt length (isomorfismos1 (grafoCiclo 6) (completo 7))
0
(000 secs 0 bytes)
ghcigt length (isomorfismos2 (grafoCiclo 6) (completo 7))
0
(001 secs 0 bytes)
ghcigt length (isomorfismos3 (grafoCiclo 6) (completo 7))
0
(000 secs 0 bytes)
ghcigt isomorfos1 (completo 10) (grafoCiclo 10)
False
(5190 secs 12841861176 bytes)
ghcigt isomorfos2 (completo 10) (grafoCiclo 10)
False
(000 secs 0 bytes)
ghcigt isomorfos3 (completo 10) (grafoCiclo 10)
False
86 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
(000 secs 0 bytes)
ghcigt isomorfos1 (grafoCiclo 10) (grafoRueda 10)
False
(7390 secs 16433969976 bytes)
ghcigt isomorfos2 (grafoCiclo 100) (grafoRueda 100)
False
(000 secs 0 bytes)
ghcigt isomorfos3 (grafoCiclo 100) (grafoRueda 100)
False
(000 secs 0 bytes)
ghcigt length (isomorfismos2 (grafoRueda 10) (grafoRueda 10))
18
(10112 secs 23237139992 bytes)
ghcigt length (isomorfismos3 (grafoRueda 10) (grafoRueda 10))
18
(4467 secs 9021442440 bytes)
Nota 363 Cuando los grafos son isomorfos comprobar que tienen el mismo nuacuteme-ro de veacutertices el mismo nuacutemero de aristas y la misma secuencia graacutefica no requieremucho tiempo ni espacio dando lugar a costes muy similares entre los dos paresde definiciones Sin embargo cuando los grafos tienen el mismo nuacutemero de veacuterticesy fallan en alguna de las demaacutes propiedades el resultado es muy costoso para laprimera definicioacuten mientras que es inmediato con la segundaA partir de ahora utilizaremos la funcioacuten isomorfismos2 para calcular los isomor-fismos entre dos grafos y la funcioacuten isomorfos para determinar si dos grafos sonisomorfos de modo que las renombraremos por isomorfismos y isomorfismos res-pectivamente
isomorfismos (Ord aOrd b) =gt Grafo a -gt Grafo b -gt [Funcion a b]
isomorfismos = isomorfismos2
isomorfos (Ord aOrd b) =gt Grafo a -gt Grafo b -gt Bool
isomorfos = isomorfos2
364 Automorfismos
Definicioacuten 369 Dado un grafo simple G = (V A) un automorfismo de G es un iso-morfismo de G en siacute mismo
La funcioacuten (esAutomorfismo g f) se verifica si la aplicacioacuten f es un automorfismode g
-- | Ejemplos
-- gtgtgt let g = creaGrafo [123] [(12)(13)]
37 Caminos en grafos 87
-- gtgtgt esAutomorfismo g [(11)(23)(32)]
-- True
-- gtgtgt esAutomorfismo g [(12)(23)(31)]
-- False
esAutomorfismo Ord a =gt Grafo a -gt Funcion a a -gt Bool
esAutomorfismo g = esIsomorfismo g g
La funcioacuten (automorfismos g) devuelve la lista de todos los posibles automorfis-mos en g
-- | Ejemplo
-- gtgtgt automorfismos (creaGrafo [123] [(12)(13)])
-- [[(11)(22)(33)][(11)(23)(32)]]
automorfismos Ord a =gt Grafo a -gt [Funcion a a]
automorfismos g = isomorfismos1 g g
Nota 364 Cuando trabajamos con automorfismos es mejor utilizar en su defini-cioacuten la funcioacuten isomorfismos1 en vez de isomorfismos2 pues ser isomorfos es unarelacioacuten reflexiva es decir un grafo siempre es isomorfo a siacute mismo
37 Caminos en grafos
Una de las aplicaciones de la teoriacutea de grafos es la determinacioacuten de trayectos o re-corridos en una red de transporte o de distribucioacuten de productos Asiacute si cada veacuterticerepresenta un punto de intereacutes y cada arista representa una conexioacuten entre dos pun-tos usando grafos como modelos podemos simplificar el problema de encontrar laruta maacutes ventajosa en cada caso
371 Definicioacuten de camino
Definicioacuten 371 Sea G = (V A) un grafo simple y sean u v isin V dos veacutertices Uncamino entre u y v es una sucesioacuten de veacutertices de G u = v0 v1 v2 vkminus1 vk = vdonde foralli isin 0 kminus 1 (vi vi+1) isin A
La funcioacuten (esCamino g c) se verifica si la sucesioacuten de veacutertices c es un camino enel grafo g
-- | Ejemplo
-- gtgtgt grafoCiclo 5
-- G [12345] [(12)(15)(23)(34)(45)]
-- gtgtgt esCamino (grafoCiclo 5) [123451]
-- True
-- gtgtgt esCamino (grafoCiclo 5) [124531]
-- False
88 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
esCamino Ord a =gt Grafo a -gt [a] -gt Bool
esCamino g c = all (`aristaEn` g) (zip c (tail c))
La funcioacuten (aristasCamino c) devuelve la lista de las aristas recorridas en el ca-mino c
-- | Ejemplos
-- gtgtgt aristasCamino [123]
-- [(12)(23)]
-- gtgtgt aristasCamino [1231]
-- [(12)(23)(13)]
-- gtgtgt aristasCamino [1232]
-- [(12)(23)(23)]
aristasCamino Ord a =gt [a] -gt [(aa)]
aristasCamino c =
map parOrdenado (zip c (tail c))
where parOrdenado (uv) | u lt= v = (uv)
| otherwise = (vu)
La funcioacuten (verticesCamino c) devuelve la lista de las vertices recorridas en elcamino c
-- | Ejemplo
-- gtgtgt verticesCamino [1231]
-- [123]
verticesCamino Ord a =gt [a] -gt [a]
verticesCamino c = nub c
Definicioacuten 372 Se llama longitud de un camino al nuacutemero de veces que se atraviesa unaarista en dicho camino
La funcioacuten (longitudCamino c) devuelve la longitud del camino c
-- | Ejemplo
-- gtgtgt longitudCamino [427]
-- 2
longitudCamino [a] -gt Int
longitudCamino c = length c - 1
La funcioacuten (todosCaminos g u v k) devuelve todos los caminos entre los veacuterticesu y v en el grafo g que tienen longitud k
-- | Ejemplo
-- gtgtgt todosCaminos (creaGrafo [12] [(12)]) 1 2 3
-- [[1212]]
-- gtgtgt todosCaminos (bipartitoCompleto 2 3) 1 3 3
-- [[1313][1323][1413][1423][1513][1523]]
todosCaminos Ord a =gt Grafo a -gt a -gt a -gt Int -gt [[a]]
todosCaminos g u v 0 = if u == v ampamp elem u (vertices g)
37 Caminos en grafos 89
then [[u]]
else []
todosCaminos g u v 1 = if aristaEn (uv) g
then [[uv]]
else []
todosCaminos g u v k =
filter p [uvs | n lt- [1k-1] w lt- a u vs lt- tC w v n]
where p xs = longitudCamino xs == k
a = adyacentes g
tC = todosCaminos g
La funcioacuten (numeroCaminosDeLongitud g u v k) es el nuacutemero de caminos de lon-gitud k uniendo los veacutertices u y v en el grafo g
-- | Ejemplos
-- gtgtgt numeroCaminosDeLongitud (completo 7) 1 4 5
-- 1111
-- gtgtgt numeroCaminosDeLongitud grafoPetersen 1 4 3
-- 5
numeroCaminosDeLongitud Ord a =gt Grafo a -gt a -gt a -gt Int -gt Int
numeroCaminosDeLongitud g u v = length todosCaminos g u v
372 Recorridos
Definicioacuten 373 Sea G = (V A) un grafo y sean u v isin V Un camino entre u y v queno repite aristas (quizaacutes veacutertices) se llama recorrido
La funcioacuten (esRecorrido g c) se verifica si el camino c es un recorrido en el grafog
-- | Ejemplo
-- gtgtgt esRecorrido (grafoCiclo 4) [214]
-- True
-- gtgtgt esRecorrido (grafoCiclo 4) [2141]
-- False
-- gtgtgt esRecorrido (grafoCiclo 4) [213]
-- False
esRecorrido Ord a =gt Grafo a -gt [a] -gt Bool
esRecorrido g c =
esCamino g c ampamp sinRepetidos (aristasCamino c)
373 Caminos simples
Definicioacuten 374 Un camino que no repite veacutertices (y por tanto tampoco aristas) se llamacamino simple
90 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (esCaminoSimple g c) se verifica si el camino c es un camino simple enel grafo g
-- | Ejemplos
-- gtgtgt esCaminoSimple (creaGrafo [12] [(11)(12)]) [112]
-- False
-- gtgtgt esCaminoSimple (grafoCiclo 4) [214]
-- True
-- gtgtgt esCaminoSimple (grafoCiclo 4) [14321]
-- True
-- gtgtgt esCaminoSimple (grafoCiclo 4) [43212]
-- False
esCaminoSimple Ord a =gt Grafo a -gt [a] -gt Bool
esCaminoSimple g [] = True
esCaminoSimple g vs =
esRecorrido g vs ampamp noRepiteVertices vs
where noRepiteVertices (xxs)
| sinRepetidos (xxs) = True
| x == last xs ampamp sinRepetidos xs = True
| otherwise = False
La funcioacuten (todosArcosBP g u v) devuelve una lista con todos los caminos simplesposibles en el grafo g entre los veacutertices u y v utilizando una algoritmo de buacutesquedaen profundidad sobre el grafo g Este algoritmo recorre el grafo de izquierda a dere-cha y de forma al visitar un nodo explora todos los caminos que pueden continuarpor eacutel antes de pasar al siquiente
-- | Ejemplos
-- gtgtgt grafoCiclo 4
-- G [1234] [(12)(14)(23)(34)]
-- gtgtgt todosArcosBP (grafoCiclo 4) 1 4
-- [[14][1234]]
-- gtgtgt todosArcosBP (grafoCiclo 4) 4 1
-- [[4321][41]]
-- gtgtgt todosArcosBP (creaGrafo [14] [(12)(34)]) 1 4
-- []
-- gtgtgt todosArcosBP (creaGrafo [12] [(11)(12)]) 1 1
-- [[1]]
todosArcosBP Ord a =gt Grafo a -gt a -gt a -gt [[a]]
todosArcosBP g x y = aux [[y]]
where aux [] = []
aux ([]zss) = aux zss
aux ((zzs)zss)
| z == x = (zzs) aux zss
| otherwise =
aux ([vzzs | v lt- adyacentes g z zs] ++ zss)
g = eliminaLazos g
eliminaLazos h = creaGrafo (vertices h)
37 Caminos en grafos 91
[(xy) | (xy) lt- aristas h x = y]
La funcioacuten (todosArcosBA g u v) devuelve una lista con todos los caminos simplesposibles en el grafo g entre los veacutertices u y v utilizando una algoritmo de buacutesquedaen anchura sobre el grafo g Este algoritmo recorre el grafo por niveles de formaque el primer camino de la lista es de longitud miacutenima
-- | Ejemplos
-- gtgtgt grafoCiclo 4
-- G [1234] [(12)(14)(23)(34)]
-- gtgtgt todosArcosBA (grafoCiclo 4) 1 4
-- [[14][1234]]
-- gtgtgt todosArcosBA (grafoCiclo 4) 4 1
-- [[41][4321]]
-- gtgtgt todosArcosBA (creaGrafo [14] [(12)(34)]) 1 4
-- []
-- gtgtgt todosArcosBA (creaGrafo [12] [(11)(12)]) 1 1
-- [[1]]
todosArcosBA Ord a =gt Grafo a -gt a -gt a -gt [[a]]
todosArcosBA g x y = aux [[y]]
where aux [] = []
aux ([]zss) = aux zss
aux ((zzs)zss)
| z == x = (zzs) aux zss
| otherwise =
aux (zss ++ [vzzs | v lt- adyacentes g z zs])
g = eliminaLazos g
Vamos a comprobar con QuickCheck que el primer elemento de la lista que de-vuelve la funcioacuten (todosArcosBA g u v) es de longitud miacutenima Para ello vamos autilizar la funcioacuten (parDeVertices g) que es un generador de pares de veacutertices delgrafo no nulo g Por ejemplo
ghcigt sample (parDeVertices (creaGrafo [19] []))
(39)
(93)
(74)
(43)
(28)
(72)
(84)
(53)
(72)
(31)
(72)
92 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
parDeVertices Grafo Int -gt Gen (IntInt)
parDeVertices g = do
x lt- elements vs
y lt- elements vs
return (xy)
where vs = vertices g
La propiedad es
prop_todosArcosBA Grafo Int -gt Property
prop_todosArcosBA g =
not (esGrafoNulo g) ==gt
forAll (parDeVertices g)
((xy) -gt let zss = todosArcosBA g x y
in null zss || longitudCamino (head zss) ==
minimum (map longitudCamino zss))
La comprobacioacuten es
ghcigt quickCheck prop_todosArcosBA
+++ OK passed 100 tests
Veamos que la funcioacuten (todosArcosBP g u v) no verifica la propiedad
ghcigt quickCheck prop_todosArcosBP
Failed Falsifiable (after 6 tests)
G [12345] [(12)(14)(15)(22)(23)(24)(44)(45)(55)]
(52)
prop_todosArcosBP Grafo Int -gt Property
prop_todosArcosBP g =
not (esGrafoNulo g) ==gt
forAll (parDeVertices g)
((xy) -gt let zss = todosArcosBP g x y
in null zss || longitudCamino (head zss) ==
minimum (map longitudCamino zss))
La funcioacuten (numeroArcosDeLongitud g u v k) devuelve el nuacutemero de caminos en-tre los veacutertices u y v en el grafo g que tienen longitud k
-- | Ejemplos
-- gtgtgt numeroArcosDeLongitud (completo 6) 1 3 4
-- 24
-- gtgtgt numeroArcosDeLongitud grafoPetersen 1 3 4
-- 4
numeroArcosDeLongitud Ord a =gt Grafo a -gt a -gt a -gt Int -gt Int
numeroArcosDeLongitud g u v k =
length (filter p (todosArcosBA g u v))
where p vs = longitudCamino vs == k
37 Caminos en grafos 93
374 Conexioacuten
Definicioacuten 375 Dado un grafo G = (V A) sean u v isin V Si existe alguacuten camino entreu y v en el grafo G diremos que estaacuten conectados y lo denotamos por u v
La funcioacuten (estanConectados g u v) se verifica si los veacutertices u y v estaacuten conecta-dos en el grafo g
-- | Ejemplos
-- gtgtgt estanConectados (creaGrafo [14] [(12)(24)]) 1 4
-- True
-- gtgtgt estanConectados (creaGrafo [14] [(12)(34)]) 1 4
-- False
estanConectados Ord a =gt Grafo a -gt a -gt a -gt Bool
estanConectados g u v
| esGrafoNulo g = False
| otherwise = not (null (todosArcosBA g u v))
Nota 371 La funcioacuten (estanConectados g u v) no necesita calcular todos los ca-minos entre u y v Puesto que Haskell utiliza por defecto evaluacioacuten perezosa siexiste alguacuten camino entre los dos veacutertices basta calcular el primero para saber quela lista de todos los caminos no es vaciacutea
375 Distancia
Definicioacuten 376 Se define la distancia entre u y v en el grafo G como la longitud delcamino maacutes corto que los une Si u y v no estaacuten conectados decimos que la distancia esinfinita
La funcioacuten (distancia g u v) devuelve la distancia entre los veacutertices u y v en elgrafo g En caso de que los veacutertices no esteacuten conectados devuelve el valor Nothing
-- | Ejemplos
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 1
-- Just 0
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 2
-- Just 1
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 3
-- Just 2
-- gtgtgt distancia (creaGrafo [14] [(12)(23)]) 1 4
-- Nothing
distancia Ord a =gt Grafo a -gt a -gt a -gt Maybe Int
distancia g u v
| estanConectados g u v =
Just (longitudCamino (head (todosArcosBA g u v)))
| otherwise = Nothing
94 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Definicioacuten 377 Dado G = (V A) un grafo sean u v isin V Un camino entre u y v cuyalongitud coincide con la distancia entre los veacutertices se llama geodeacutesica entre u y v
La funcioacuten (esGeodesica g c) se verifica si el camino c es una geodeacutesica entre susextremos en el grafo g
-- | Ejemplos
-- gtgtgt let g = creaGrafo [14] [(12)(13)(23)(34)]
-- gtgtgt esGeodesica g [134]
-- True
-- gtgtgt esGeodesica g [1234]
-- False
esGeodesica Ord a =gt Grafo a -gt [a] -gt Bool
esGeodesica g c =
esCamino g c ampamp
longitudCamino c == fromJust (distancia g u v)
where u = head c
v = last c
Nota 372 No hace falta imponer en la definicioacuten de la funcioacuten que el camino seaun recorrido pues el camino de miacutenima longitud entre dos veacutertices es siempre unrecorrido
376 Caminos cerrados
Definicioacuten 378 Un camino en un grafo G se dice cerrado si sus extremos son igualesDiremos que un camino cerrado de longitud tres es un triaacutengulo
La funcioacuten (esCerrado g c) se verifica si el camino c es cerrado en el grafo g
-- | Ejemplos
-- gtgtgt let g = creaGrafo [14] [(12)(13)(23)(34)]
-- gtgtgt esCerrado g [1231]
-- True
-- gtgtgt esCerrado g [123]
-- False
-- gtgtgt esCerrado g [1241]
-- False
esCerrado (Ord a) =gt Grafo a -gt [a] -gt Bool
esCerrado _ [] = False
esCerrado g (vc) =
esCamino g c ampamp v == last c
La funcioacuten (triangulos g v) devuelve la lista de todos los triaacutengulos que pasanpor el veacutertice v en el grafo g
-- | Ejemplos
-- gtgtgt triangulos (completo 4) 3
37 Caminos en grafos 95
-- [[3123][3143][3213][3243][3413][3423]]
-- gtgtgt triangulos (grafoCiclo 6) 1
-- []
triangulos Ord a =gt Grafo a -gt a -gt [[a]]
triangulos g u = todosCaminos g u u 3
377 Circuitos
Definicioacuten 379 Un recorrido en un grafo G se dice circuito si sus extremos son iguales
La funcioacuten (esCircuito g c) se verifica si la sucesioacuten de veacutertices c es un circuitoen el grafo g
-- | Ejemplos
-- gtgtgt grafoCiclo 4
-- G [1234] [(12)(14)(23)(34)]
-- gtgtgt esCircuito (grafoCiclo 4) [12341]
-- True
-- gtgtgt esCircuito (grafoCiclo 4) [1234]
-- False
-- gtgtgt esCircuito (grafoCiclo 4) [1234141]
-- False
esCircuito (Ord a) =gt Grafo a -gt [a] -gt Bool
esCircuito g c =
esRecorrido g c ampamp esCerrado g c
378 Ciclos
Definicioacuten 3710 Un camino simple en un grafo G se dice que es un ciclo si sus extremosson iguales
La funcioacuten (esCiclo g c) se verifica si el camino c es un ciclo en el grafo g
-- | Ejemplos
-- gtgtgt esCiclo (grafoCiclo 4) [121]
-- False
-- gtgtgt esCiclo (grafoCiclo 4) [12341]
-- True
-- gtgtgt esCiclo (grafoCiclo 4) [1234]
-- False
-- gtgtgt esCiclo (grafoCiclo 4) [1234141]
-- False
esCiclo (Ord a) =gt Grafo a -gt [a] -gt Bool
esCiclo g c =
esCaminoSimple g c ampamp esCerrado g c
96 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
La funcioacuten (todosCiclos g v) devuelve todos los ciclos en el grafo g que pasan porel veacutertice v
-- | Ejemplos
-- gtgtgt todosCiclos (grafoCiclo 4) 3
-- [[34123][32143]]
-- gtgtgt todosCiclos (completo 3) 2
-- [[2312][2132]]
-- gtgtgt todosCiclos (creaGrafo [123] [(11)(12)(13)(23)]) 1
-- [[1][1321][1231]]
-- gtgtgt todosCiclos (creaGrafo [12] [(12)(22)(23)]) 2
-- [[2]]
todosCiclos Ord a =gt Grafo a -gt a -gt [[a]]
todosCiclos g x =
map f (filter p (concat [todosArcosBA g x u | u lt- a x]))
where p c = longitudCamino c = 1
f c | longitudCamino c == 0 = c
| otherwise = c ++ [x]
a = adyacentes g
Nota 373 El algoritmo utilizado en la definicioacuten de (todosCiclos g) es el de buacutes-queda en anchura Este algoritmo recorre el grafo por niveles de forma que el pri-mer camino de la lista es de longitud miacutenima
379 Grafos aciacuteclicos
Definicioacuten 3711 Diremos que un grafo G = (V A) es aciacuteclico si no contiene ninguacutenciclo es decir si forallv isin V no existe ninguacuten camino simple que comience y termine en v
La funcioacuten (esAciclico g) se verifica si el grafo g es aciacuteclico
-- | Ejemplo
-- gtgtgt esAciclico (creaGrafo [14] [(12)(24)])
-- True
-- gtgtgt esAciclico (grafoCiclo 5)
-- False
-- gtgtgt esAciclico (grafoEstrella 6)
-- True
esAciclico Ord a =gt Grafo a -gt Bool
esAciclico g =
and [null (todosCiclos g x) | x lt- vertices g]
38 Conectividad de los grafos 97
38 Conectividad de los grafos
381 Estar conectados por un camino
Teorema 381 Dado un grafo G la relacioacuten u sim v (estar conectados por un camino) es unarelacioacuten de equivalencia
La funcioacuten (estarConectadosCamino g) devuelve la relacioacuten entre los veacutertices delgrafo g de estar conectados por un camino en eacutel
-- | Ejemplo
-- gtgtgt estarConectadosCamino (creaGrafo [14] [(12)(24)])
-- [(11)(12)(14)(21)(22)(24)(33)(41)(42)(44)]
estarConectadosCamino Ord a =gt Grafo a -gt [(aa)]
estarConectadosCamino g =
[(uv) | u lt- vs v lt- vs estanConectados g u v]
where vs = vertices g
A continuacioacuten comprobaremos el resultado con QuickCheck
ghcigt quickCheck prop_conectadosRelEqui
+++ OK passed 100 tests
prop_conectadosRelEqui Grafo Int -gt Bool
prop_conectadosRelEqui g =
esRelacionEquivalencia (vertices g) (estarConectadosCamino g)
382 Componentes conexas de un grafo
Definicioacuten 382 Las clases de equivalencia obtenidas por la relacioacuten sim estar conectadospor un camino en un grafo G inducen subgrafos en G los veacutertices y todas las aristas de loscaminos que los conectan que reciben el nombre de componentes conexas por caminosde G
La funcioacuten (componentesConexas1 g) devuelve las componentes conexas por cami-nos del grafo g
-- | Ejemplos
-- gtgtgt componentesConexas (creaGrafo [15] [(12)(23)])
-- [[123][4][5]]
-- gtgtgt componentesConexas (creaGrafo [15] [(12)(23)(45)])
-- [[123][45]]
-- gtgtgt componentesConexas (creaGrafo [13] [(12)(23)])
-- [[123]]
componentesConexas1 Ord a =gt Grafo a -gt [[a]]
componentesConexas1 g =
clasesEquivalencia (vertices g) (estarConectadosCamino g)
98 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Vamos a definir dos nuevas funciones una que compruebe si el grafo es nulo o com-pleto pues en dichos casos las componentes seraacuten el conjunto vaciacuteo y el conjuntodel conjunto de veacutertices respectivamente y otra con un algoritmo algo maacutes comple-jo
componentesConexas2 Ord a =gt Grafo a -gt [[a]]
componentesConexas2 g
| esGrafoNulo g = []
| esCompleto g = [vertices g]
| otherwise =
clasesEquivalencia (vertices g) (estarConectadosCamino g)
componentesConexas3 Ord a =gt Grafo a -gt [[a]]
componentesConexas3 g = aux (vertices g) [] []
where aux [] [] [] = []
aux [] xs ys = [xs]
aux (vvs) [] [] =
aux (vs (a v)) (i v (a v)) (a v)
aux vs xs ys | null ((ug [a v | v lt- ys]) xs) =
xs aux vs [] []
| otherwise =
aux (vs ug [a v | v lt- ys])
(u xs (ug [a v | v lt- ys]))
(ug [a v | v lt- ys] ys)
a = adyacentes g
i = inserta
ug = unionGeneral
u = unionConjuntos
La comprobacioacuten con QuickCheck de la equivalencia de las definiciones es
ghcigt quickCheck prop_EquiComponentesConexas
+++ OK passed 100 tests
ghcigt quickCheck prop_EquiComponentesConexas2
+++ OK passed 100 tests
prop_EquiComponentesConexas Grafo Int -gt Bool
prop_EquiComponentesConexas g =
componentesConexas1 g == componentesConexas2 g
prop_EquiComponentesConexas2 Grafo Int -gt Bool
prop_EquiComponentesConexas2 g =
componentesConexas1 g == componentesConexas3 g
Comparemos ahora la eficiencia de las definiciones
ghcigt componentesConexas1 grafoNulo
[]
(003 secs 0 bytes)
38 Conectividad de los grafos 99
ghcigt componentesConexas2 grafoNulo
[]
(001 secs 0 bytes)
ghcigt componentesConexas3 grafoNulo
[]
(001 secs 0 bytes)
ghcigt length (componentesConexas1 (completo 50))
1
(023 secs 0 bytes)
ghcigt length (componentesConexas2 (completo 50))
1
(016 secs 0 bytes)
ghcigt length (componentesConexas3 (completo 50))
1
(008 secs 0 bytes)
ghcigt length (componentesConexas1 (completo 100))
1
(217 secs 205079912 bytes)
ghcigt length (componentesConexas2 (completo 100))
1
(285 secs 0 bytes)
ghcigt length (componentesConexas3 (completo 100))
1
(119 secs 0 bytes)
ghcigt length (componentesConexas1 (completo 150))
1
(1295 secs 742916792 bytes)
ghcigt length (componentesConexas2 (completo 150))
1
(2048 secs 0 bytes)
ghcigt length (componentesConexas3 (completo 150))
1
(964 secs 0 bytes)
Con grafos completos de gran tamantildeo Haskell tarda maacutes tiempo en comprobar quees completo que en calcular directamente sus clases de equivalencia y para grafosnulos apenas hay diferencia en el coste entre la primera y la segunda definicioacuten Porotra parte la tercera definicioacuten es la maacutes eficiente en todos los casos y seraacute por tantola que utilizaremos a lo largo del trabajo
componentesConexas Ord a =gt Grafo a -gt [[a]]
componentesConexas = componentesConexas3
La funcioacuten (numeroComponentes g) devuelve el nuacutemero de componentes conexasdel grafo g
-- Ejemplos
-- gtgtgt numeroComponentes (creaGrafo [15] [(12)(23)(45)])
100 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
-- 2
-- gtgtgt numeroComponentes (creaGrafo [14] [(12)(22)(34)])
-- 2
numeroComponentes Ord a =gt Grafo a -gt Int
numeroComponentes g
| null (aristas g) = orden g
| otherwise = length (componentesConexas g)
Nota 381 Hemos comprobado para la definicioacuten anterior que comprobar si un gra-fo es completo es muy costoso luego no conviene antildeadirlo como patroacuten
383 Grafos conexos
Definicioacuten 383 Dado un grafo diremos que es conexo si la relacioacuten tiene una uacutenica clasede equivalencia en eacutel es decir si el grafo tiene una uacutenica componente conexa
La funcioacuten (esConexo g) se verifica si el grafo g es conexo
-- Ejemplos
-- gtgtgt esConexo (creaGrafo [13] [(12)(23)])
-- True
-- gtgtgt esConexo (creaGrafo [15] [(12)(23)(45)])
-- False
esConexo Ord a =gt Grafo a -gt Bool
esConexo g = length (componentesConexas g) == 1
esConexo2 Ord a =gt Grafo a -gt Bool
esConexo2 g
| esGrafoNulo g = False
| esUnitario (vertices g) = True
| otherwise = aux (vertices g) [] []
where aux [] [] [] = False
aux [] xs _ = True
aux (vvs) [] [] | null vs = True
| null (a v) = False
| otherwise =
aux (vs a v) (i v (a v)) (a v)
aux vs xs ys | null ((ug [a v | v lt- xs]) xs) = False
| otherwise =
aux (vs (ug [a v | v lt- xs]))
(u (ug [a v | v lt- xs]) xs)
((ug [a v | v lt- xs]) xs)
a = adyacentes g
ug = unionGeneral
i = inserta
u = unionConjuntos
38 Conectividad de los grafos 101
La comprobacioacuten de la equivalencia de las definiciones con QuickCheck es
ghcigt quickCheck prop_EquiEsConexo
+++ OK passed 100 tests
prop_EquiEsConexo Grafo Int -gt Bool
prop_EquiEsConexo g =
esConexo g == esConexo2 g
Vamos a comparar ahora su eficiencia
ghcigt let g1 = grafoCiclo 100
(000 secs 0 bytes)
ghcigt let g = creaGrafo (vertices g1) (aristas g1 [(23)(9899)])
(000 secs 0 bytes)
ghcigt esConexo g
False
(117 secs 151632168 bytes)
ghcigt esConexo2 g
False
(001 secs 0 bytes)
ghcigt esConexo (grafoCiclo 500)
True
(7341 secs 10448270712 bytes)
ghcigt esConexo2 (grafoCiclo 500)
True
(18939 secs 18468849096 bytes)
ghcigt esConexo (grafoCiclo 500)
True
(7341 secs 10448270712 bytes)
ghcigt esConexo2 (grafoCiclo 500)
True
(18939 secs 18468849096 bytes)
En principio no nos proporciona ninguna ventaja la segunda definicioacuten asiacute que tra-bajaremos con la primera que hemos dado ya que es mucho maacutes sencilla
Teorema 384 Sea G un grafo G = (V A) es conexo si y solamente si forallu v isin V existe uncamino entre u y v
Vamos a comprobar el resultado con QuickCheck
ghcigt quickCheck prop_caracterizaGrafoConexo
+++ OK passed 100 tests
prop_caracterizaGrafoConexo Grafo Int -gt Property
prop_caracterizaGrafoConexo g =
not (esGrafoNulo g) ==gt
esConexo g == and [estanConectados g u v
| u lt- vertices g v lt- vertices g]
102 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
384 Excentricidad
Definicioacuten 385 Sean G = (V A) un grafo y v isin V Se define la excentricidad de v comoel maacuteximo de las distancias entre v y el resto de veacutertices de G La denotaremos por e(v)
La funcioacuten (excentricidad g v) devuelve la excentricidad del veacutertice v en el grafog
-- | Ejemplos
-- gtgtgt let g = creaGrafo [13] [(12)(23)(33)]
-- gtgtgt excentricidad g 1
-- Just 2
-- gtgtgt excentricidad g 2
-- Just 1
-- gtgtgt excentricidad (creaGrafo [13] [(12)(33)]) 1
-- Nothing
excentricidad Ord a =gt Grafo a -gt a -gt Maybe Int
excentricidad g u
| esGrafoNulo g = Nothing
| orden g == 1 = Just 0
| Nothing `elem` distancias = Nothing
| otherwise = maximum distancias
where distancias = [distancia g u v | v lt- vertices g [u]]
La funcioacuten (excentricidades g) devuelve la lista ordenada de las excentricidadesde los veacutertices del grafo g
-- | Ejemplos
-- gtgtgt excentricidades (creaGrafo [13] [(12)(23)(33)])
-- [Just 1Just 2Just 2]
-- gtgtgt excentricidades (creaGrafo [13] [(12)(33)])
-- [NothingNothingNothing]
excentricidades Ord a =gt Grafo a -gt [Maybe Int]
excentricidades g = sort (map (excentricidad g) (vertices g))
385 Diaacutemetro
Definicioacuten 386 Sea G = (V A) un grafo Se define el diaacutemetro de G como el maacuteximo delas distancias entre los veacutertices en V Lo denotaremos por d(G)
La funcioacuten (diametro g) devuelve el diaacutemetro del grafo g
-- | Ejemplos
-- gtgtgt diametro (creaGrafo [13] [(12)(23)(33)])
-- Just 2
-- gtgtgt diametro (creaGrafo [13] [(12)(33)])
-- Nothing
diametro Ord a =gt Grafo a -gt Maybe Int
38 Conectividad de los grafos 103
diametro g
| esGrafoNulo g = Nothing
| Nothing `elem` distancias = Nothing
| otherwise = maximum distancias
where vs = vertices g
distancias = [distancia g u v | u lt- vs v lt- vs u lt= v]
386 Radio
Definicioacuten 387 Sean G = (V A) un grafo y v isin V Se define el radio de G como elmiacutenimo de las excentricidades de sus veacutertices Lo denotaremos por r(G)
La funcioacuten (radio g) devuelve el radio del grafo g
-- | Ejemplos
-- gtgtgt radio (creaGrafo [13] [(12)(23)(33)])
-- Just 1
-- gtgtgt radio (creaGrafo [13] [(12)(33)])
-- Nothing
radio Ord a =gt Grafo a -gt Maybe Int
radio g
| esGrafoNulo g = Nothing
| Nothing `elem` ds = Nothing
| otherwise = minimum ds
where ds = [excentricidad g v | v lt- vertices g]
387 Centro
Definicioacuten 388 Sean G = (V A) un grafo Llamamos centro del grafo G al conjunto deveacutertices de excentricidad miacutenima A estos veacutertices se les denomina veacutertices centrales
La funcioacuten (centro g) devuelve el centro del grafo g Por ejemplo
-- | Ejemplos
-- gtgtgt centro (creaGrafo [13] [(12)(23)(33)])
-- [2]
-- gtgtgt centro (creaGrafo [13] [(12)(13)(23)])
-- [123]
-- gtgtgt centro (creaGrafo [13] [(12)(33)])
-- [123]
centro Ord a =gt Grafo a -gt [a]
centro g = [v | v lt- vertices g excentricidad g v == r]
where r = radio g
104 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
388 Grosor
Definicioacuten 389 Sean G = (V A) un grafo Se llama grosor o cintura del grafo G almiacutenimo de las longitudes de los ciclos de G Si el grafo no posee ciclos (es decir es un grafoaciacuteclico) se dice que su cintura es infinita
La funcioacuten (grosor g) devuelve el grosor del grafo g
-- | Ejemplos
-- gtgtgt grosor (creaGrafo [123] [(12)(23)])
-- Nothing
-- gtgtgt grosor (creaGrafo [123] [(11)(12)(23)(34)])
-- Just 0
-- gtgtgt grosor grafoPetersen
-- Just 5
-- gtgtgt grosor grafoMoebiusCantor
-- Just 6
-- gtgtgt grosor grafoHeawood
-- Just 6
-- gtgtgt grosor grafoMcGee
-- Just 7
-- gtgtgt grosor grafoTutteCoxeter
-- Just 8
grosor Ord a =gt Grafo a -gt Maybe Int
grosor g
| esAciclico g = Nothing
| otherwise = Just (minimum [longitudCamino (head yss)
| x lt- vertices g
let yss = todosCiclos g x
not (null yss)])
Propiedades del grosor de los grafos
Teorema 3810 El grosor del grafo ciclo de orden n Cn es infin si n lt 3 y 3 en caso contrario
La propiedad se expresa por
prop_grosor_grafoCiclo Int -gt Bool
prop_grosor_grafoCiclo n =
grosor (grafoCiclo n) == if n lt 3
then Nothing
else Just n
Su comprobacioacuten para n le 30 es
ghcigt all prop_grosor_grafoCiclo [130]
True
Teorema 3811 El grosor del grafo amistad de orden n es 3 para todo n
38 Conectividad de los grafos 105
prop_grosor_grafoAmistad Int -gt Bool
prop_grosor_grafoAmistad n =
grosor (grafoAmistad n) == Just 3
Su comprobacioacuten para n le 30 es
ghcigt all prop_grosor_grafoAmistad [130]
True
Teorema 3812 El grosor del grafo completo de orden n Kn es infin si n lt 3 y 3 en casocontrario
La propiedad se expresa por
prop_grosor_completo Int -gt Bool
prop_grosor_completo n =
grosor (completo n) == if n lt 3
then Nothing
else Just 3
Su comprobacioacuten para n le 30 es
ghcigt all prop_grosor_completo [130]
True
Teorema 3813 El grosor del grafo bipartito completo de orden Kmn es infin si m = 1 oacuten = 1 y es 4 en caso contrario y 3 en caso contrario
La propiedad se expresa por
prop_grosor_bipartitoCompleto Int -gt Int -gt Bool
prop_grosor_bipartitoCompleto m n =
grosor (bipartitoCompleto m n) == if m == 1 || n == 1
then Nothing
else Just 4
Su comprobacioacuten para 1 le m le n le 15 es
ghcigt and [prop_grosor_bipartitoCompleto m n | m lt- [115] n lt- [m15]]
True
Teorema 3814 El grosor del grafo rueda de orden n Wn es infin si n lt 3 y 3 en caso contrario
La propiedad se expresa por
prop_grosor_grafoRueda Int -gt Bool
prop_grosor_grafoRueda n =
grosor (grafoRueda n) == if n lt 3
then Nothing
else Just 3
106 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Su comprobacioacuten para 1 le n le 30 es
ghcigt all prop_grosor_grafoRueda [130]
True
389 Propiedades e invariantes por isomorfismos
Teorema 3815 Sean G = (V A) y Gprime = (Vprime Aprime) grafos isomorfos con φ V rarr Vprime unisomorfismo Entonces dados u v isin V u sim v si y solamente si φ(u) sim φ(v)
La comprobacioacuten del teorema con QuickCheck es
ghcigt quickCheck prop_ConexionIsomorfismo1
+++ OK passed 100 tests
prop_ConexionIsomorfismo1 Grafo Int -gt Grafo Int -gt Bool
prop_ConexionIsomorfismo1 g h =
not (isomorfos g h) ||
and [ec g u v == ec h (imagen phi u) (imagen phi v)
| u lt- vs
v lt- vs
phi lt- isomorfismos g h]
where vs = vertices g
ec = estanConectados
Teorema 3816 Sean G = (V A) y Gprime = (Vprime Aprime) grafos isomorfos con φ V rarr Vprime unisomorfismo Entonces φ lleva cada componente conexa de G en una componente conexa deGprime
La comprobacioacuten del teorema con QuickCheck es
ghcigt quickCheck prop_ConexionIsomorfismo2
+++ OK passed 100 tests
prop_ConexionIsomorfismo2 Grafo Int -gt Grafo Int -gt Bool
prop_ConexionIsomorfismo2 g h =
not(isomorfos g h) ||
and [conjuntosIguales cch (aux f) | f lt- isomorfismos g h]
where cch = componentesConexas h
ccg = componentesConexas g
aux f = map (sort imagenConjunto f) ccg
Teorema 3817 Sean G = (V A) y Gprime = (Vprime Aprime) grafos isomorfos con φ V rarr Vprime unisomorfismo Entonces G y Gprime tienen el mismo nuacutemero de componentes conexas
La comprobacioacuten del teorema con QuickCheck es
38 Conectividad de los grafos 107
ghcigt quickCheck prop_ConexionIsomorfismo3
+++ OK passed 100 tests
prop_ConexionIsomorfismo3 Grafo Int -gt Grafo Int -gt Bool
prop_ConexionIsomorfismo3 g h =
not (isomorfos g h) ||
numeroComponentes g == numeroComponentes h
Teorema 3818 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que el diaacutemetro de G es igual al diaacutemetro de Gprime es decir el diaacutemetrode un grafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos diametro)
+++ OK passed 100 tests
Teorema 3819 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces se verifica que el radio de G es igual al radio de Gprime es decir el radio de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos radio)
+++ OK passed 100 tests
Teorema 3820 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que el grosor de G es igual al grosor de Gprime es decir el grosor de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos grosor)
+++ OK passed 100 tests
Teorema 3821 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que el centro de G es igual al centro de Gprime es decir el centro de ungrafo es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos centro)
+++ OK passed 100 tests
Teorema 3822 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomor-fismo Entonces se verifica que el nuacutemero de componentes conexas de G es igual al nuacutemerode las de Gprime es decir el nuacutemero de componentes conexas de un grafo es un invariante porisomorfismos
108 Capiacutetulo 3 Introduccioacuten a la teoriacutea de grafos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos numeroComponentes)
+++ OK passed 100 tests
Teorema 3823 Sean G = (V A) y Gprime = (Vprime Aprime) dos grafos y φ V rarr Vprime un isomorfis-mo Entonces se verifica que los valores que toman las excentricidades de los veacutertices G esigual al de los veacutertices de Gprime es decir el conjunto de valores que toman las excentricidadesde los veacutertices es un invariante por isomorfismos
Vamos a comprobar el teorema anterior con QuickCheck
ghcigt quickCheck (esInvariantePorIsomorfismos excentricidades)
+++ OK passed 100 tests
Capiacutetulo 4
Matrices asociadas a grafos
En este capiacutetulo se definiraacuten algunas representaciones de grafos como matrices secomprobaraacuten sus propiedades y volveremos a definir algunos conceptos del capiacutetu-lo 3 ahora utilizando matricesPara elaborar el contenido del capiacutetulo utilizareacute el segundo tema del trabajo fin degrado de Fco Javier Franco Galviacuten Aspectos algebraicos en teoriacutea de grafos ([7]) En eltrabajo el autor introduce los conceptos de matriz de adyacencia matriz de incidenciay otras matrices asociadas a grafos
41 Generador de grafos simples
En esta seccioacuten presentaremos el generador de grafos que nos permitiraacute generargrafos simples como listas de aristas arbitrariamente y usarlos como ejemplos opara comprobar propiedades en la seccioacuten de matrices asociadas a grafos(grafoSimple) es un generador de grafos simples de hasta 10 veacutertices Por ejemplo
ghcigt sample grafoSimple
G [12345678] [(14)(15)(16)(17)(18)(23)
(24)(25)(27)(35)(37)(45)(46)(56)(67)]
G [123456789] [(14)(18)(23)(25)(29)
(34)(35)(36)(38)(39)(46)(48)(49)
(58)(59)(69)(78)]
G [123456] [(12)(13)(24)(25)(26)(35)(56)]
G [1234567] [(12)(13)(14)(24)(25)(26)
(36)(45)(46)(67)]
G [1234] [(13)(14)(23)(34)]
G [123] [(23)]
G [12] [(12)]
G [123456] [(16)(24)(26)(35)(36)(56)]
G [123456789] [(12)(14)(15)(16)(17)(24)
(34)(37)(38)(39)(45)(47)(49)(56)(57)
(58)(59)(67)(69)(78)(79)]
109
110 Capiacutetulo 4 Matrices asociadas a grafos
G [123456789] [(13)(14)(15)(16)(23)(24)
(29)(35)(39)(45)(47)(48)(49)(57)(58)
(59)(67)(68)(69)(79)]
G [1] []
grafoSimple Gen (Grafo Int)
grafoSimple = do
n lt- choose (010)
as lt- sublistOf [(xy) | x lt- [1n] y lt- [x+1n]]
return (creaGrafo [1n] as)
42 Matrices de adyacencia
421 Definicioacuten y propiedades
Usaremos la funcioacuten (imprimeMatriz p) para imprimir por pantalla la matriz p conuna fila por liacutenea
-- | Ejemplo
-- gtgtgt imprimeMatriz (fromLists [[134][357][479]])
-- [134]
-- [357]
-- [479]
imprimeMatriz Show a =gt Matrix a -gt IO ()
imprimeMatriz p =
mapM_ print (toLists p)
Definicioacuten 421 Sea G = (V A) un grafo simple con V = v1 vn Se define sumatriz de adyacencia como Antimesn = (aij) donde el elemento aij toma el valor 1 si existealguna arista en A uniendo los veacutertices vi y vj y 0 en caso contrario
Nota 421 La matriz de adyacencia depende del etiquetado del grafo
La funcioacuten (matrizAdyacencia g) es la matriz de adyacencia del grafo g
-- | Ejemplo
-- gtgtgt imprimeMatriz (matrizAdyacencia (grafoCiclo 4))
-- [0101]
-- [1010]
-- [0101]
-- [1010]
-- gtgtgt imprimeMatriz (matrizAdyacencia (completo 4))
-- [0111]
-- [1011]
-- [1101]
-- [1110]
42 Matrices de adyacencia 111
matrizAdyacencia Grafo Int -gt Matrix Int
matrizAdyacencia g = matrix n n f
where n = orden g
f (ij) | (ij) `aristaEn` g = 1
| otherwise = 0
422 Propiedades baacutesicas de las matrices
La funcioacuten (esSimetrica p) se verifica si la matriz p es simeacutetrica
-- ejemplo
-- gtgtgt esSimetrica (fromLists [[134][357][479]])
-- True
-- gtgtgt esSimetrica (fromLists [[134][357][497]])
-- False
esSimetrica Eq a =gt Matrix a -gt Bool
esSimetrica p =
transpose p == p
La funcioacuten (potencia p n) devuelvela potencia nndasheacutesima de la matriz cuadrada p
-- Ejemplo
-- gtgtgt potencia (fromLists [[134][357][479]]) 3
-- ( 408 735 975 )
-- ( 735 1323 1755 )
-- ( 975 1755 2328 )
potencia Num a =gt Matrix a -gt Int -gt Matrix a
potencia p 1 = p
potencia p n = if (odd n)
then (m p (potencia (m p p) (div (n-1) 2)))
else (potencia (m p p) (div (n-1) 2))
where m = multStd2
423 Propiedades de las matrices de adyacencia
Teorema 422 Para todo n la matriz de adyacencia del grafo ciclo de orden n Cn es simeacute-trica
ghcigt all prop_simetricaAdyacenciaCompleto [130]
True
prop_simetricaAdyacenciaCompleto Int -gt Bool
prop_simetricaAdyacenciaCompleto n =
esSimetrica (matrizAdyacencia (completo n))
La funcioacuten (tamantildeoM g) devuelve el tamantildeo del grafo simple g calculado usandosu matriz de adyacencia
112 Capiacutetulo 4 Matrices asociadas a grafos
-- | Ejemplos
-- gtgtgt tamantildeoM (grafoCiclo 4)
-- 4
-- gtgtgt tamantildeoM grafoPetersen
-- 15
tamantildeoM Grafo Int -gt Int
tamantildeoM g = sum (toList (matrizAdyacencia g)) `div` 2
Teorema 423 El tamantildeo de un grafo simple es la mitad de la suma de los elementos de sumatriz de adyacencia
La comprobacioacuten del teorema con QuickCheck es
ghcigt quickCheck prop_tamantildeoMatriz
+++ OK passed 100 tests
prop_tamantildeoMatriz Property
prop_tamantildeoMatriz =
forAll grafoSimple
(g -gt tamantildeo g == tamantildeoM g)
Teorema 424 Si un grafo G = (V A) tiene un veacutertice aislado vi tanto la fila como lacolumna indasheacutesima de su matriz de adyacencia estaraacuten formadas por ceros
esAisladoM Grafo Int -gt Int -gt Bool
esAisladoM g v = if (all (==0)
(((toLists (ma g)) (v-1))
++((toLists (t (ma g))) (v-1))))
then True
else False
where ma = matrizAdyacencia
t = transpose
La comprobacioacuten del teorema es
ghcigt quickCheck prop_esAisladoMatriz
+++ OK passed 100 tests
prop_esAisladoMatriz Property
prop_esAisladoMatriz =
forAll grafoSimple
(g -gt and [esAislado g v == esAisladoM g v
| v lt- vertices g])
Teorema 425 Sea un grafo G = (V A) simple no dirigido con V = v1 vn Lasuma de los elementos de la fila (o columna) indasheacutesima de su matriz de adyacencia coincide conel grado del veacutertice vi Es decir
42 Matrices de adyacencia 113
δ(vi) =n
sumj=1
aij =n
sumj=1
aji
gradoM Grafo Int -gt Int -gt Int
gradoM g v = sum ((toLists (ma g)) (v-1))
where ma = matrizAdyacencia
La comprobacioacuten del teorema es
ghcigt quickCheck prop_gradoMatriz
+++ OK passed 100 tests
prop_gradoMatriz Property
prop_gradoMatriz =
forAll grafoSimple
(g -gt and [grado g v == gradoM g v | v lt- vertices g])
Teorema 426 Sea G = (V A) un grafo bipartito de conjuntos de veacutertices disjuntosV1 = v1 vk y V2 = vk+1 vn tal que V = V1 cup V2 y soacutelo existen aristasque conectan veacutertices de V1 con veacutertices de V2 Entonces con este etiquetado de V la matrizde adyacencia de G tiene la forma
A =
(θ BBt θ
)
prop_BipartitoMatriz Grafo Int -gt Property
prop_BipartitoMatriz g =
esBipartito g ==gt
all (==0) [ getElem u v m | [uv] lt- (f (fromJust p))]
where f (xsys) = filter p (subsequences xs ++ subsequences ys)
where p zs = length zs == 2
p = conjuntosVerticesDisjuntos g
m = matrizAdyacencia g
424 Caminos y arcos
En esta seccioacuten se presentaraacute la informacioacuten que contiene la matriz de adyacenciade un grafo en relacioacuten a los caminos que se encuentran en eacutel
Teorema 427 Sea G = (V A) un grafo con V = v1 vn y matriz de adyacenciaA = (aij) Entonces forallk ge 0 el elemento (i j) de Ak que denotaremos por ak
ij es elnuacutemero de caminos de longitud k desde el veacutertice vi al veacutertice vj
114 Capiacutetulo 4 Matrices asociadas a grafos
numeroCaminosDeLongitudM Grafo Int -gt Int -gt Int -gt Int -gt Int
numeroCaminosDeLongitudM g u v k = getElem u v mk
where ma = matrizAdyacencia g
n = orden g
mk = foldr (multStd2) (identity n) (take k (repeat ma))
La comprobacioacuten del teorema para k le 6 es
ghcigt quickCheck prop_numeroCaminosMatriz
+++ OK passed 100 tests
prop_numeroCaminosMatriz Grafo Int -gt Gen Bool
prop_numeroCaminosMatriz g = do
k lt- choose (06)
let vs = vertices g
return (and [ numeroCaminosDeLongitud g u v k ==
numeroCaminosDeLongitudM g u v k
|(uv) lt- productoCartesiano vs vs u lt v])
De este teorema se deducen las siguientes propiedades
Teorema 428 Sea G un grafo simple Siguiendo la notacioacuten del teorema anterior se tieneque1 a(2)ii = δ(vi)
2 a(3)ii es el nuacutemero de triaacutengulos que contienen al veacutertice vi
gradoCaminosM Grafo Int -gt Int -gt Int
gradoCaminosM g v = getElem v v m2
where m = matrizAdyacencia g
m2 = multStd2 m m
numeroTriangulosM Grafo Int -gt Int -gt Int
numeroTriangulosM g v = getElem v v (potencia m 3)
where m = matrizAdyacencia g
La comprobacioacuten con QuickCheck es
ghcigt quickCheck prop_GradoCaminosMatriz
+++ OK passed 100 tests
ghcigt quickCheck prop_TriangulosMatriz
+++ OK passed 100 tests
prop_GradoCaminosMatriz Grafo Int -gt Bool
prop_GradoCaminosMatriz g =
and [ grado g v == gradoCaminosM g v | v lt- vertices g]
42 Matrices de adyacencia 115
prop_TriangulosMatriz Property
prop_TriangulosMatriz =
forAll grafoSimple
(g -gt and [length (triangulos g v) ==
numeroTriangulosM g v | v lt- vertices g])
116 Capiacutetulo 4 Matrices asociadas a grafos
Capiacutetulo 5
Apeacutendices
51 Sistemas utilizados
El desarrollo de mi Trabajo de Fin de Grado requeriacutea de una infraestructura teacutecnicaque he tenido que trabajar antes de comenzar a desarrollar el contenido A conti-nuacioacuten voy a nombrar y comentar los sistemas y paquetes que he utilizado a lolargo del proyectobull Ubuntu como sistema operativo El primer paso fue instalar Ubuntu en mi orde-
nador portaacutetil personal Para ello seguiacute las recomendaciones de mi compantildeeroEduardo Paluzo quien ya lo habiacutea hecho antesPrimero me descargueacute la imagen del sistema Ubuntu 1604 LTS (para procesadorde 64 bits) desde la paacutegina de descargas de Ubuntu 1 y tambieacuten la herramientaLinuxLive USB Creator 2 que transformariacutea mi pendrive en una unidad USB Boo-teable cargada con la imagen de Ubuntu Una vez tuve la unidad USB preparadaprocediacute a instalar el nuevo sistema apagueacute el dispositivo y al encenderlo entreacuteen el Boot Menu de la BIOS del portaacutetil para arrancar desde el Pendrive en vez dehacerlo desde el disco duro Automaacuteticamente comenzoacute la instalacioacuten de Ubuntuy solo tuve que seguir las instrucciones del asistente para montar Ubuntu mante-niendo ademaacutes Windows 10 que era el sistema operativo con el que habiacutea estadotrabajando hasta ese momentoEl resultado fue un poco agridulce pues la instalacioacuten de Ubuntu se habiacutea reali-zado con eacutexito sin embargo al intentar arrancar Windows desde la nueva GRUBme daba un error al cargar la imagen del sistema Despueacutes de buscar el error queme apareciacutea en varios foros encontreacute una solucioacuten a mi problema deshabiliteacute elSecurity Boot desde la BIOS y pude volver a arrancar Windows 10 con normali-dad
1httpwwwubuntucomdownloaddesktop2httpwwwlinuxliveusbcom
117
118 Capiacutetulo 5 Apeacutendices
bull LATEX como sistema de composicioacuten de textos La distribucioacuten de LATEXTex Livecomo la mayoriacutea de software que he utilizado la descargueacute utilizando el Gestorde Paquetes Synaptic Anteriormente soacutelo habiacutea utilizado TexMaker como editorde LATEX asiacute que fue el primero que descargueacute Maacutes tarde mi tutor Joseacute Antoniome sugirioacute que mejor descargara el paquete AUCTex pues me permitiriacutea trabajarcon archivos TEX desde el editor Emacs asiacute lo hice y es el que he utilizado pararedactar el trabajo Ademaacutes de los que me recomendaba el gestor solo he tenidoque descargarme el paquete spanish de babel para poder componer el trabajo puesel paquete Tikz que he utilizado para representar los grafos veniacutea incluido en lassugerencias de Synapticbull Haskell como lenguaje de programacioacuten Ya habiacutea trabajado anteriormente con
este lenguaje en el grado y sabiacutea que soacutelo teniacutea que descargarme la plataforma deHaskell y podriacutea trabajar con el editor Emacs Seguiacute las indicaciones que se dan alos estudiantes de primer curso en la paacutegina del Dpto de Ciencias de la Compu-tacioacuten e Inteligencia Artificial 3 y me descargueacute los paquetes haskell-platform yhaskell-mode desde el Gestor de Paquetes Synaptic La versioacuten de la plataforma deHaskell con la que he trabajado es la 2014200debian2 y la del compilador GHC la7103-7bull Dropbox como sistema de almacenamiento compartido Ya habiacutea trabajado con
Dropbox en el pasado asiacute que crear una carpeta compartida con mis tutores nofue ninguacuten problema sin embargo al estar Dropbox sujeto a software no libre nome resultoacute tan sencillo instalarlo en mi nuevo sistema En primer lugar intenteacutehacerlo directamente desde Ubuntu Software que intentoacute instalar Dropbox Nauti-lus y abrioacute dos instalaciones en paralelo Se quedoacute colgado el ordenador asiacute quemateacute los procesos de instalacioacuten activos reinicieacute el sistema y me descargueacute direc-tamente el paquete de instalacioacuten desde la paacutegina de descargas de Dropbox 4 y loejecuteacute desde la terminalbull Git como sistema remoto de control de versiones Era la primera vez que trabaja-
ba con Git y me costoacute bastante adaptarme Mi tutor Joseacute Antonio y mi compantildeeroEduardo Paluzo me ayudaron mucho e hicieron el proceso de adaptacioacuten muchomaacutes aacutegil El manual que Eduardo ha redactado y presenta en su Trabajo Fin deGrado me ha sido muy uacutetil es una pequentildea guiacutea que cualquier interesado en elempleo de Git puede utilizar como introduccioacuten La instalacioacuten no resultoacute com-plicada a traveacutes del Gestor de Paquetes Synaptic me descargueacute el paquete elpa-magity todos los demaacutes paquetes necesarios para trabajar con Git en mi portaacutetil usandoel editor Emacs Eduardo me ayudoacute a crear el repositorio MDenHaskell en la plata-forma GitHub y clonarlo en mi ordenador personal Dicho repositorio contiene el
3httpwwwcsuses~jalonsocursosi1m-15sistemasphp4httpswwwdropboxcomesinstallos=lnx
52 Mapa de decisiones de disentildeo en conjuntos 119
total del trabajo y se almacena de forma puacuteblica La versioacuten de Magit que utilizoes la 250-2
52 Mapa de decisiones de disentildeo en conjuntos
Una vez comenzado el trabajo y habiendo hecho ya varias secciones acerca de laTeoriacutea de Grafos se puso de manifiesto la conveniencia de crear nuevos capiacutetulosintroduciendo conceptos de la Teoriacutea de Conjuntos y las relaciones que se puedenpresentar entre sus elementosHaskell tiene una libreriacutea especiacutefica para conjuntos DataSet sin embargo no estan intuitiva ni tan eficiente como la de listas (DataList) A lo largo del proyecto hecreado un moacutedulo que permite trabajar con conjuntos utilizando tanto su represen-tacioacuten como listas ordenadas sin elementos repetidos como su representacioacuten comolistas sin elementos repetidos Dicho moacutedulo se llama Conjuntos y lo presento en elprimer capiacutetulo del Trabajo
53 Mapa de decisiones de disentildeo en grafos
Al comienzo del proyecto la idea era que las primeras representaciones con lasque trabajara fueran las de grafos como vectores de adyacencia y grafos como matricesde adyacencia que se utilizan en Informaacutetica en el primer curso del Grado con lasque ya habiacutea trabajado y estaba familiarizadaLas definiciones de Informaacutetica estaacuten pensadas para grafos ponderados (dirigidoso no seguacuten se eligiera) mientras que en Matemaacutetica Discreta apenas se usan grafosdirigidos o ponderados por tanto el primer cambio en la representacioacuten utilizadafue simplificar las definiciones de modo que solo trabajaacuteramos con grafos no diri-gidos y no ponderados pero manteniendo las estructuras vectorial y matricial quemanteniacutean la eficienciaLas representaciones que utilizan arrays en Haskell son muy restrictivas pues soloadmiten vectores y matrices que se puedan indexar lo que hace muy complicadostodos los algoritmos que impliquen alguacuten cambio en los veacutertices de los grafos yademaacutes no permite trabajar con todos los tipos de veacutertices que pudieacuteramos desearDecidimos volver a cambiar la representacioacuten y esta vez nos decantamos por larepresentacioacuten de grafos como listas de aristas perdiendo en eficiencia pero ganandomucho en flexibilidad de escrituraPor uacuteltimo mis tutores sugirieron dar una representacioacuten de los grafos mediantesus matrices de adyacencia y comprobar la equivalencia de las definiciones que yahabiacutea hecho en otros moacutedulos con las dadas para esta representacioacuten Para ello he
120 Capiacutetulo 5 Apeacutendices
trabajado con la libreriacutea DataMatrix de Haskell
Bibliografiacutea
[1] J Alonso Temas de programacioacuten funcional Technical report Univ de Sevilla2015
[2] P Burzyn Complejidad computacional en problemas de modificacioacuten de aris-tas en grafos Technical report Univ de Buenos Aires
[3] K Claessen and J Hughes QuickCheckA Lightweight Tool for Random Tes-ting of Haskell Programs Technical report Chalmers University of Technology2000
[4] M Caacuterdenas Matemaacutetica discreta Technical report Univ de Sevilla 2015
[5] D de Matemaacuteticas El regalo de Cantor Technical report IES Matarrantildea deValderrobres 2009
[6] D de Aacutelgebra Aacutelgebra Baacutesica tema 1 Conjuntos Technical report Univ deSevilla 2015
[7] F Franco Aspectos algebraicos en Teoriacutea de Grafos Technical report Univ deSevilla 2016
[8] F Rabhi and G Lapalme Algorithms A functional programming approachAddison-Wesley Longman Publishing Co Inc Boston MA USA 1st edition1999
[9] P Vasconcelos Property Testing using QuickCheck Technical report Univer-sidade do Porto 2016
[10] Wikipedia Set (mathematics) Technical report Wikipedia La Enciclopedialibre 2016
[11] Wikipedia AnexoGaleriacutea de grafos Technical report Wikipedia La Enciclo-pedia libre 2016
[12] Wikipedia Teoriacutea de la complejidad computacional Technical report Wikipe-dia La Enciclopedia libre 2017
121
Iacutendice alfabeacutetico
Grafo 18 52adyacentes 53antiImagenRelacion 38aristaEn 53aristasCamino 88aristas 53automorfismos 87bipartitoCompleto 58biyecciones 47cardinal 22 31centro 103clasesEquivalencia 43combinaciones 25 34complementario 22 31completo 58componentesConexas1 97componentesConexas2 98componentesConexas3 98conjuntosIguales 30conjuntosIguales 21conjuntosVerticesDisjuntos 59conservaAdyacencia 78creaGrafo 52diametro 102distancia 93dominio 38eliminaArista 74eliminaLazos 74eliminaVertice 74elimina 19 28entorno 69esAisladoM 112
esAislado 69esAntisimetrica 41esAutomorfismo 86esBipartito 60esCamino 87esCerrado 94esCircuito 95esCompleto 77esConexo 100esFuncional 39esFuncion 43esGeodesica 94esInyectiva 45esIsomorfismo 81esLazo 69esReflexiva 40esRegular 70esRelacionEquivalencia 42esRelacionHomogenea 39esRelacionOrden 43esRelacion 37esSimetrica 41 111esSimple 70esSobreyectiva 45 46esSubconjuntoPropio 21 30esSubconjunto 20 29esSubgrafoMax 72esSubgrafoPropio 72esSubgrafo 72esTransitiva 41esUnitario 23 32esVacio 18 27
122
Iacutendice alfabeacutetico 123
estaRelacionado 40estanConectados 93excentricidades 102excentricidad 102funciones 44generaGrafo 54gradoM 113 114grado 69grafoAmistad 57grafoCiclo 56grafoCirculante 61grafoComplementario 77grafoEstrella 60grafoHeawood 64grafoMcGee 64grafoMoebiusCantor 67grafoNulo 55grafoPetersenGen 62grafoPetersen 66grafoRueda 61grafoSimple 110grafoThomson 63grafoTutteCoxeter 65grosor 104imagenConjunto 45imagenInversa 47imagenRelacion 38imagen 44imprimeMatriz 110inserta 18 27interseccion 33interseccion 24inversa 47isomorfismos 82isomorfos 82longitudCamino 88matrizAdyacencia 110minimoElemento 19 28morfismos 79
numeroArcosDeLongitud 92numeroCaminosDeLongitud 89numeroCaminosDeLongitugM 113numeroComponentesConexas 99numeroTriangulosM 114orden 68parDeVertices 91pertenece 19 28potencia 111productoCartesiano 34productoCartesiano 25prop_HavelHakimi 73prop_LemaApretonDeManos 73prop_completos 76prop_BipartitoMatriz 113prop_ConectadosRelEqui 97prop_ConexionIsomorfismo1 106prop_ConexionIsomorfismo2 106prop_ConexionIsomorfismo3 107prop_GradoMatriz 114prop_TriangulosMatriz 114prop_esAisladoMatriz 112prop_gradoMatriz 113prop_numeroCaminosMatriz 114prop_simetricaAdyacenciaCompleto 111prop_tamantildeoMatriz 112prop_todosArcosBA 92radio 103rango 38secuenciaGrados 71secuenciaGrafica 71sinRepetidos 19 29sonIncidentes 68sumaArista 75sumaGrafos 76 77sumaVertice 75tamantildeoM 111tamantildeo 68todosArcosBA 91
124 Iacutendice alfabeacutetico
todosArcos 90todosCaminos 88todosCiclos 96triangulos 94unionConjuntos 23 32unionGeneral 24 33vacio 18 27valenciaMax 70valenciaMin 70variaciones 26 35verticesCamino 88vertices 53