124
Matemática discreta en Haskell Facultad de Matemáticas Departamento de Ciencias de la Computación e Inteligencia Artificial Trabajo Fin de Grado María Dolores Valverde Rodríguez

MD en Haskell - idus.us.es

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 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

Page 2: MD en Haskell - idus.us.es

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

Page 3: MD en Haskell - idus.us.es

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

Page 4: MD en Haskell - idus.us.es

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

Page 5: MD en Haskell - idus.us.es

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

Page 6: MD en Haskell - idus.us.es

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

Page 7: MD en Haskell - idus.us.es

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

Page 8: MD en Haskell - idus.us.es

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

Page 9: MD en Haskell - idus.us.es

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

Page 10: MD en Haskell - idus.us.es

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

Page 11: MD en Haskell - idus.us.es

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

Page 12: MD en Haskell - idus.us.es
Page 13: MD en Haskell - idus.us.es
Page 14: MD en Haskell - idus.us.es
Page 15: MD en Haskell - idus.us.es
Page 16: MD en Haskell - idus.us.es
Page 17: MD en Haskell - idus.us.es
Page 18: MD en Haskell - idus.us.es
Page 19: MD en Haskell - idus.us.es
Page 20: MD en Haskell - idus.us.es
Page 21: MD en Haskell - idus.us.es
Page 22: MD en Haskell - idus.us.es
Page 23: MD en Haskell - idus.us.es
Page 24: MD en Haskell - idus.us.es
Page 25: MD en Haskell - idus.us.es
Page 26: MD en Haskell - idus.us.es
Page 27: MD en Haskell - idus.us.es
Page 28: MD en Haskell - idus.us.es
Page 29: MD en Haskell - idus.us.es
Page 30: MD en Haskell - idus.us.es
Page 31: MD en Haskell - idus.us.es
Page 32: MD en Haskell - idus.us.es
Page 33: MD en Haskell - idus.us.es
Page 34: MD en Haskell - idus.us.es
Page 35: MD en Haskell - idus.us.es
Page 36: MD en Haskell - idus.us.es
Page 37: MD en Haskell - idus.us.es
Page 38: MD en Haskell - idus.us.es
Page 39: MD en Haskell - idus.us.es
Page 40: MD en Haskell - idus.us.es
Page 41: MD en Haskell - idus.us.es
Page 42: MD en Haskell - idus.us.es
Page 43: MD en Haskell - idus.us.es
Page 44: MD en Haskell - idus.us.es
Page 45: MD en Haskell - idus.us.es
Page 46: MD en Haskell - idus.us.es
Page 47: MD en Haskell - idus.us.es
Page 48: MD en Haskell - idus.us.es
Page 49: MD en Haskell - idus.us.es
Page 50: MD en Haskell - idus.us.es
Page 51: MD en Haskell - idus.us.es
Page 52: MD en Haskell - idus.us.es
Page 53: MD en Haskell - idus.us.es
Page 54: MD en Haskell - idus.us.es
Page 55: MD en Haskell - idus.us.es
Page 56: MD en Haskell - idus.us.es
Page 57: MD en Haskell - idus.us.es
Page 58: MD en Haskell - idus.us.es
Page 59: MD en Haskell - idus.us.es
Page 60: MD en Haskell - idus.us.es
Page 61: MD en Haskell - idus.us.es
Page 62: MD en Haskell - idus.us.es
Page 63: MD en Haskell - idus.us.es
Page 64: MD en Haskell - idus.us.es
Page 65: MD en Haskell - idus.us.es
Page 66: MD en Haskell - idus.us.es
Page 67: MD en Haskell - idus.us.es
Page 68: MD en Haskell - idus.us.es
Page 69: MD en Haskell - idus.us.es
Page 70: MD en Haskell - idus.us.es
Page 71: MD en Haskell - idus.us.es
Page 72: MD en Haskell - idus.us.es
Page 73: MD en Haskell - idus.us.es
Page 74: MD en Haskell - idus.us.es
Page 75: MD en Haskell - idus.us.es
Page 76: MD en Haskell - idus.us.es
Page 77: MD en Haskell - idus.us.es
Page 78: MD en Haskell - idus.us.es
Page 79: MD en Haskell - idus.us.es
Page 80: MD en Haskell - idus.us.es
Page 81: MD en Haskell - idus.us.es
Page 82: MD en Haskell - idus.us.es
Page 83: MD en Haskell - idus.us.es
Page 84: MD en Haskell - idus.us.es
Page 85: MD en Haskell - idus.us.es
Page 86: MD en Haskell - idus.us.es
Page 87: MD en Haskell - idus.us.es
Page 88: MD en Haskell - idus.us.es
Page 89: MD en Haskell - idus.us.es
Page 90: MD en Haskell - idus.us.es
Page 91: MD en Haskell - idus.us.es
Page 92: MD en Haskell - idus.us.es
Page 93: MD en Haskell - idus.us.es
Page 94: MD en Haskell - idus.us.es
Page 95: MD en Haskell - idus.us.es
Page 96: MD en Haskell - idus.us.es
Page 97: MD en Haskell - idus.us.es
Page 98: MD en Haskell - idus.us.es
Page 99: MD en Haskell - idus.us.es
Page 100: MD en Haskell - idus.us.es
Page 101: MD en Haskell - idus.us.es
Page 102: MD en Haskell - idus.us.es
Page 103: MD en Haskell - idus.us.es
Page 104: MD en Haskell - idus.us.es
Page 105: MD en Haskell - idus.us.es
Page 106: MD en Haskell - idus.us.es
Page 107: MD en Haskell - idus.us.es
Page 108: MD en Haskell - idus.us.es
Page 109: MD en Haskell - idus.us.es
Page 110: MD en Haskell - idus.us.es
Page 111: MD en Haskell - idus.us.es
Page 112: MD en Haskell - idus.us.es
Page 113: MD en Haskell - idus.us.es
Page 114: MD en Haskell - idus.us.es
Page 115: MD en Haskell - idus.us.es
Page 116: MD en Haskell - idus.us.es
Page 117: MD en Haskell - idus.us.es
Page 118: MD en Haskell - idus.us.es
Page 119: MD en Haskell - idus.us.es
Page 120: MD en Haskell - idus.us.es
Page 121: MD en Haskell - idus.us.es
Page 122: MD en Haskell - idus.us.es
Page 123: MD en Haskell - idus.us.es
Page 124: MD en Haskell - idus.us.es