Está en la página 1de 343

MD

Matematicas Discretas
Abdiel E. Caceres Gonzalez
abdielc@gmail.com

Mayo 7, 2013

-AbC

Preeliminares

-AbC

Porque estudiar Matem


aticas Discretas
Hay varias razones por las cuales un aspirante a trabajar en Ciencias Computacionales debe
aprender Matem
aticas Discretas, algunas de estas razones son las siguientes:
I Se desarrollan habilidades para entender y crear argumentos formales.
I La MD es la base para otras
areas de estudio como estructuras de datos, algoritmos,
teora de bases de datos, lenguajes formales y automatas, compiladores, sistemas
operativos, entre otros.
I Con el conocimiento de MD se tiene una base para resolver problemas en investigaci
on
operativa, en qumica, fsica, biologa, etc.

El enfoque particular de este curso es sin duda alguna la programacion. Estudiar MD,
programando ofrece varias ventajas (especialmente para los estudiantes de ciencias
computacionales):
I Se desarrollan las habilidades de abstracci
on.
I Se aprende un lenguaje de programaci
on no convencional, pero potente, flexible,
completo y adecuado (DrRacket).
I Los conceptos matem
aticos son parte del aprendizaje significativo y duradero.
I Mejora las habilidades de programaci
on en cualquier otro lenguaje.
I Se adquiere el concepto de c
alculo lambda (que es util para describir cualquier
problema computacional).
-AbC

Recomendaciones generales
1.
2.
3.
4.

Imprime este material y escribe tus notas sobre el documento.


Tomate un buen tiempo para leer y estudiar el material.
Practica en el lenguaje.
Cumple con tus tareas.

Las calificaciones quedan determinadas bajo el siguiente criterio:


1. La calificacion final del ordinario puede obtenerse de dos maneras:
1.1 Excentando. La calificaci
on debe ser mayor o igual a 6.0 en el promedio de las
calificaciones parciales.
1.2 Aplicando el examen ordinario en las fechas estabecidas. La calificacion de los parciales
no aplica.

Las calificaciones de cada parcial queda determinada bajo el siguiente criterio:


1. Las tareas entregadas a tiempo y bien hechas, tienen el valor del 60% de la calificacion
parcial.
1.1 Cada tarea entregada a tiempo y correctamente hecha, vale 1.
1.2 Cada tarea entregada parcialmente correcta, vale 0.5
1.3 Cada tarea no entregada o entregada pero incorrecta, vale 0.

2. Responder correctamente unos ejercicios en el examen parcial, corresponde al otro 40%

-AbC

Bibliografa y herramientas necesarias

Matem
atica Discreta. Kenneth H. Rosen.
5Ed. McGrawHill. Disponible (para
evaluacion personal) en formato PDF.

.
Ademas del libro de texto, es necesario una computadora con especificaciones comunes,
+2GbRAM, +50GbHD, SO(MacOSX.x,Ubuntu,Fedora,Linux,WinXp,Win7,Win8).
Instalar el lenguaje DrRacket, en la version mas actual (v5.3.5 al momento de hacer esta
diapositiva). DrRacket se puede adquirir gratuitamente desde
http://racket-lang.org/download/ para diferentes plataformas, mac, linux o windows.

-AbC

Primeros pasos en DrRacket

-AbC

DrRacket-Indroduccion

-AbC

Primeros pasos con DrRacket: Datos primitivos


En la parte de interacciones, DrRacket funciona como una calculadora, se introduce la
operacion que se desea, DrRacket la evalua y ofrece la respuesta inmediatamente al
terminar de evaluar.
DrRacket tiene algunos datos primitivos, es decir, aquella informacion que no requiere de
ninguna evaluacion (como los instintos primitivos en los seres vivos).
En DrRacket hay varios datos primitivos, como los numeros, las cadenas de texto, los
valores booloeanos, y todo aquellos que no queramos evaluar (anteponiendo un apostrofe):
> 50
50
> "hola mundo"
"hola mundo"
> #f
#f
> #t
#t
> Esto-no-se-evalua
Esto-no-se-evalua
>

-AbC

Primeros pasos con DrRacket: Funciones primitivas


En DrRacket, las funciones son ciudadanos de primera clase, lo que significa que todo gira
en torno a las funciones, y se tratan de igual modo que los datos, de hecho no hay
diferencia entre datos y funciones.
> +
#<procedure:+>
> #<procedure:->
> *
#<procedure:*>
> /
#<procedure:/>
>

El uso de las funciones es diferente a otros lenguajes de programacion en que en


DrRacket se utilizan encerrando entre parentesis tanto el operador como losoperandos en
forma prefija.

(+ 5 23)

-AbC

EJERCICIO
[Escritura en prefijo] Escribe en notacion prefija las siguientes expresiones matematicas:
I 34 28
I

34/28

34 (28/3)

34 (28/(302 ))

Ventajas de la notacion prefija


1. Se puede utilizar recursivamente en expresiones complejas.
2. Se pueden utilizar en operaciones con 0, 1, 2 o mas operadores.

-AbC

Evaluacion de una R-expresion (expresion en DrRacket)


Supongamos que se desea evaluar la expresion (2 + (4 6)) (3 + 5 + 7). Esta expresion
puede escribirse como R-exresion como:

(*

(+

(* 4 6))

(+ 3 5 7))

-AbC

Definiendo conceptos
Un aspecto muy importante de los lenguajes
de programacion es la manera que
proporcionan para nombrar a los objetos
computacionales.
Decimos que un nombre (una cadena de
caracteres) identifica un concepto, y ese
concepto tiene un significado.
Otro modo de entenderlo, es visualizar una
semejanza con el diccionario, pues en el
diccionario se encuentran enlistados los
conceptos y su significado.
En DrRacket, que es un dialecto de Scheme, que a su vez es un dialecto de Lisp, se definen
los conceptos por medio de define. Por ejemplo, al escribir
1

(define longitud-lado 20)

el interprete crea una nueva relacion entre el valor 20 con el nombre longitud-lado. Una
vez que esta relacion existe, es posible referirse al valor 20 por su nuevo nombre
longitud-lado:

-AbC

Practiquemos esto con las siguientes definiciones:


1
2

(define pi 3.14159)
(define radio 10)

Y en la seccion de interacciones
> (* pi (* radio radio))
31.4159
>

-AbC

Procedimientos y procedimientos compuestos


Ademas de poder utilizar los procedimientos primitivos con datos primitivos (hasta ahora
con numeros), es posible crear nuevas abstracciones para crear procedimientos a partir de
datos primitivos y procedimientos primitivos.
1

(define cuadrado ( (n) (* n n)))

Los espacios en blanco sirven para escribir mas claramente las definiciones
1
2
3

(define cuadrado ; Definimos el cuadrado


( (n)
; el procedimiento que requiere de un numero <n>
(* n n))) ; como el producto del numero <n> por si mismo

Una vez definido el concepto cuadrado ya se conoce su significado ( (n) (* n n)), y


se puede utilizar como si fuera cualquier funcion primitiva.
> (cuadrado
100
> (cuadrado
100
> (cuadrado
625
> (cuadrado
400
>

10)
(* 5 2))
(cuadrado 5))
longitud-lado)

-AbC

Con este nuevo conocimiento (el del cuadrado de un numero) podemos escribir nuevos
bloques de construccion. Por ejemplo, para programar la suma de cuadrados:
x2 + y 2
La suma de cuadrados es un objeto muy util en modelacion matematica, tiene aplicaciones
en muchas areas, por ejemplo, mediante teorema de Pitagoras sabemos que la suma de los
cuadrados de las longitudes de los lados catetos de un triangulo rectangulo, representa el
mismo valor que el cuadrado de la longitud del lado hipotenusa.
x 2 + y 2 = c2
As, la suma de cuadrados se puede expresar como:
(+ (cuadrado x) (cuadrado y))
1
2
3

(define suma-cuadrados
( (x y)
(+ (cuadrado x) (cuadrado y))))

En lenguaje natural podramos decir Definimos el concepto suma-cuadrados como el


procedimiento que requiere los argumentos x y y y esta definido como la suma del
cuadrado de x con el cuadrado de y.

-AbC

Cuando se adquiere nuevo conocimiento, este forma parte ya de la coleccion de elementos


constructivos, que sirven para generar procesos mas complejos, como una nueva funcion
que lleve a cabo algun procedimiento que involucre el conocimiento recien adquirido.

EJERCICIO
Utilizando las definiciones ya conocidas, escribe una definicion para definir el nuevo
concepto de una funcion f definida en terminos matematicos como:
f (x) = (x + 1)2 + (x 2)2

-AbC

Expresiones condicionales:if
La forma especial if sirve para evaluar una R-expresion en dependencia del valor de verdad
de un predicado (cierto o falso).
La estructura sintactica de la R-expresion

if

es como sigue:

(if <expresion-booleana> <expresion> <alternativa> )

EJERCICIO
1. Traduce a DrRacket, la expresion Si x es mayor que 10, entonces suma 30 con 50;
de otro modo suma 30 con 60.
2. Cual es el resultado de evaluar la R-expresion (if #t (+ 45 10) (- 45 10))
3. Cual es el resultado de evaluar la R-expresion (if #f (+ 45 10) (- 45 10))
-AbC

Expresiones condicionales:cond
Frecuentemente tendremos la necesidad de decidir entre mas de dos alternativas, para estos
casos se ha creado la forma especial cond, cuya sintaxis es:
(cond (<expresion-booleana1> <expresion1>)
(<expresion-booleana2> <expresion2>)
:
:
[(else <expresion>)])

-AbC

Un procedimiento que calcule el valor absluto de un numero, probando si es posiivo,


negativo, o cero y tomando diferentes acciones de cuerdo al caso que se presente, siguiendo
la regla:

x si x > 0;
0 si x = 0;
|x| =

x si x < 0;
Construcciones como la anterior se llaman an
alisis de casos, y en Racket hay una forma
especial de escribir estos analisis de casos. En Racket se utiliza cond (de condicional), y se
utiliza como sigue:
1
2
3
4
5

(define valor-absoluto
( (x)
(cond ((> x 0) x)
((= x 0) 0)
((< x 0) (- x)))))

-AbC

TAREA
1. x + 2x + 6x2 + 4x3 . Solamente se require la traduccion, no la evaluacion.
2. Comprueba la traduccion hecha en el punto anterior, haciendo x = 7, has la evaluacion
de la expresion y verifica que el resultado sea 1687.
3. En la pagina 14 se encuentra la definicion del cuadrado de un numero. Utiliza ahora
esa definicion (si no lo hiciste ya) para traducir la misma expresion x + 2x + 6x2 + 4x3 ,
y verifica que el resultado sea el mismo cuando x = 7.
4. Define ahora el concepto cubo, recordando que definimos el cubo de un numero como el
producto de un numero por s mismo tres veces.
5. Define el volumen-esfera como el producto del area de una circunferencia de radio r, por
un tercio del valor del mismo radio r. Para lograr esta definicion, primero debes definir
2
area-circunferencia, como el producto r , claro que para esta definici
on se requiere
conocer el valor de , como se definio en la pagina 13.
6. Define un procedimiento para determinar la raz positiva de una ecuacion de segundo
grado ax2 + bx + c, recuerda que la raz positiva se puede calcular mediante:

b + b2 4ac
x=
,
2a
sin embargo debes considerar los siguientes casos:
6.1 si a = 0, entonces la raz no esta definida, en este caso
debes devolver
b2 4ac
6.2 si a 6= 0 entonces si puedes utilizar la expresion b+ 2a
.

ERR-NoDef;

Es importante que cada definici


on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)
-AbC

Logica proposicional

-AbC

La logica proposicional es un sistema formal que permite obtener conclusiones acerca de


proposiciones inicialmente establecidas.
En este captulo se estudiaran las proposiciones, los principales operadores entre las
proposiciones, las equivalencias logicas entre proposiciones, cuantificadores que permiten
hacer proposiciones generales o especficas; y a medida que se avanza en el estudio, se
proporcionan definiciones en DrRacket que permiten una mayor comprension de los
conceptos. Tambien estudiaremos las bases de la teora de conjuntos.
La teora de conjuntos es particularmente util en muchas areas de las ciencias
computacionales, por ejemplo, se requieren estos conocimientos para determinar que tipo
de problemas se pueden resolver mediante algoritmos (el conjunto de los problemas
Turing-computables); para determinar la complejidad algortmica de las soluciones
propuestas mediante unprograma de computadora se utilizan conjuntos, cuando se habla de
que un algoritmo es de complejidad O(n2 ) significa que el desempeno del algoritmo se
puede representar mediante una funcion que pertenece al conjunto de funciones que crecen
(en el tiempo) por debajo de una funcion de orden n2 .
La teora de conjuntos y la logica proposicional forman la base de todas las construcciones
realizadas en este curso.

-AbC

Proposiciones
Una proposici
on l
ogica, o simplemente proposici
on, es una sentencia de la cual se puede
decir que es verdadera o falsa, pero no ambas; los valores verdadero y falso se conocen
como valores de verdad; de modo que las proposiciones son aquellas sentencias que
tienen alguno de los valores de verdad: verdadero o falso; y la logica proposicional se refiere
al sistema formal que nos permite deducir proposiciones basadas en los valores de verdad de
otras proposiciones con valor de verdad ya conocido.
En DrRacket los valores de verdad falso y verdadero se representan por los smbolos
para el valor falso y #t para el valor verdadero (true en inges).

#f

Los valores #f y #t son datos primitivos en el lenguaje, de modo que el resultado de su


evaluacion es ellos mismos, como se aprecia en el siguiente ejemplo de interaccion con
DrRacket.
>#f
#f
>#t
#t
>

-AbC

En el lenguaje natural espanol, es posible construir proposiciones, como ejemplos podemos


escribir los siguientes:
I

El viernes empiezan las vacaciones.

Los domingos son das de la semana.

Siempre llueve en vacaciones.

Una taza es una medida de capacidad.

Un litro equivale a un metro.

Podemos traducir estas expresiones en R-expresiones, definiendo un concepto nuevo y


asignando un significado, por ejemplo en la primera expresion
1

(define El-viernes-empiezan-las-vacaciones #t)

y cuando interactuamos
> El-viernes-empiezan-las-vacaciones
#t
>

-AbC

En DrRacket se utilizan smbolos para representar todos los objetos computacionales,


incluyendo las proposiciones. En DrRacket cualquier secuencia de letras y smbolos
especiales (menos el espacio) pueden ser considerados como simbolos.
Trabajemos con la proposicion 14 + 16 = 20, que efectivamente es una proposicion porque
tiene un valor de verdad falso, ya que 14 + 16 es 30 y no 20 como se declara.
Hagamos que el smbolo 14+16=20 represente la proposicion 14 + 16 = 20. De modo que en
adelante, al menos hasta que se diga algo diferente, el smbolo 14+16=20 tendra un valor de
verdad #f, puesto que 14 + 16 = 20 es falso.
1

(define 14+16=20 (= (+ 14 16) 20))

Al interactuar con DrRacket, se puede consultar el valor del smbolo

14+16=20.

> 14+16=20
#f
>

-AbC

Predicados
Un predicado es una proposicion que adquiere su valor de verdad en dependencia del valor
de verdad de una o mas variables. Frecuentementese utilizan variables para declarar valores
que pueden ser modificados, o que en el momento son desconocidos.
Los siguientes son ejemplos de predicados:
1. 2x + 10 > 20, es un predicado pues el valor de verdad depende del valor asignado a la
variable x, que aunque no se ha declarado se supone que debe ser un numero (esta
aclaracion es importante para los programadores).
2. 10x2 + 7y = z, es un predicado, pues en el momento no se puede determinar su valor
de verdad, a menos que se sepa el valor de verdad de las variables x, y y z
En breve, la diferencia entre una proposicion y un predicado es que en la primera s se
conoce el valor de verdad, mientras que en la segunda, el valor de verdad depende de una o
mas variables.
En este curso trataremos de manera indistinta a las proposiciones logicas y a los predicados
y a ambas les llamaremos proposiciones.

-AbC

TAREA
[Proposiciones]
1. Cuales de las siguientes sentencias son predicados? Marca el cuadro si la sentencia es
un predicado, y dejalo en blanco si no lo es. En cada caso menciona la razon de tu
decision.














2+3=5
Nuestro sistema solar tiene 8 planetas.
3x=5
Que idiomas hablas?
Haga una caminata diaria de 30 minutos.
La temperatura en la superficie del sol es de 6 106 C.
El sol sale por el oriente
20 45
25 + 35 = 50 + 10
Si hoy es lunes, entonces trabajo el doble.
Todos los martes hay promociones en las pizzas.
En a
nos biciestos febrero tiene 29 das, y 2056 es un a
no biciesto.
2
2x + 3x 16 = 0

Es importante que cada definici


on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

Operadores logicos
En la programacion de software para computadoras, es muy frecuente el uso de
proposiciones, por ejemplo, en la elaboracion de ciclos, se debe determinar cuando se
termina de hacer la tarea repetitiva, esto se realiza al verificar cierta condicion de paro dada
en forma de una proposicion; o como otro ejemplo en bases de datos, es posible seleccionar
o modificar algunos de los registros almacenados, y la seleccion se hace mediante una
proposicion.
Estas proposiciones pueden ser simples como las que hemos visto hasta ahora, o bien
pueden ser combinaciones de proposiciones, que generan a su vez nuevas proposiciones mas
complejas. Las proposiciones se pueden combinar haciendo uso de los operadores logicos.
Frecuentemente se crean predicados en base a proposiciones, estos predicados son muy
utiles en programacion, pues pueden determinar el fin de un ciclo, seleccionar aquellos
registros en la base de datos que deben ser modificados, y en general, pueden establecer los
valores de un computo en diferentes casos.
En las siguientes secciones estudiaremos los principales operadores logicos que permiten
generar combinaciones y hacer deducciones logicas.

-AbC

La negacion
El operador logico negaci
on, o brevemente la negaci
on es un rpedicado que adquiere el
valor de verdad contrario a la proposicion que es pasada como su unico argumento.

Definicion (La negacion)


Si p es una proposicion, la negacion de p es un predicado basado en el valor de p y se
denotada frecuentemente por p. El valor de p es verdadero si p es falso, y es falso si p
es verdadero.
En otras palabras, p tiene el valor de verdad diferente a la proposicion p.
Una implementacion del procedimiento que cambia el valor de verdad de una proposicion en
DrRacket es como sigue:
1
2
3

(define neg ; Se define la negaci


on
( (p) ; como un predicado <p> cuyo valor de verdad
(if p #f #t))) ; es #f si <p> es #t, y es #t si <p> es #f.

Debido a la diferencia entre la notacion matematica y la notacion DrRacket, puede haber


confusion, sin embargo ambas notaciones: p y (not p) son equivalentes y se pueden
utilizar indistintamente, siempre que se mantenga un mismo criterio.

-AbC

En el cuadro se muestra una comparacion entre la escritura del concepto de la negacion en


espanol en la columna izquierda y en DrRacket, en la columna derecha.
Espanol
Sea neg el predicado que recibe
una proposicion llamada p (de
proposicion) de tal modo que si
el valor de verdad de p es verdadero, la evaluacion resultante es
#f, y en caso contrario, la evaluacion que resulta es #t

DrRacket
(define neg
( (p)
(if p #f #t)))

-AbC

La interaccion con DrRacket permite verificar que el procedimiento recien creado tenga el
comportamiento esperado.
> (neg #t)
#f
>

En el ejemplo (neg #t), se solicita la evaluacion del predicado neg, cuando la variable p queda
ligada (o relacionada) al valor #t, lo que en adelante denotaremos como p #t. En el
ambito de la definicion de neg, el valor de p se ajusta al valor #t, por lo que al evaluar la
forma if se devuelve #f.
> (neg #f)
#t
>

Cuando hablamos (usando el lenguaje natural), frecuentemente hacemos uso de


proposiciones como el plomo flota en el agua, es posible crear una frase en lenguaje
natural que signifique lo mismo que la negacion de esa proposicion. Para crear una primera
aproximacion a una negacion en lenguaje natural, basta anteponer la frase no es verdad
que a la frase que se desea negar, en este ejemplo escribiramos
no es verdad que el plomo flota en el agua,
claro que una frase mas natural puede ser el plomo no flota en el agua.

-AbC

Tablas de verdad
Para tener un panorama general del comportamiento de los predicados logicos, es util
mostrar tanto los valores de verdad alcanzados junto con los argumentos que originaron
tales resultados. A esta manera de presentar el comportamiento de los operadores logicos
se le conoce como tabla de verdad.
As, la tabla de verdad para el predicado

neg

es la que se muestra en el cuadro

Valor de la proposicion
p
#t
#f

Valor de verdad
(neg p)
#f
#t

En el lenguaje formal de matematicas, el predicado de negacion tiene varios smbolos, as, si


p es una proposicion, se puede encontrar generalmente como p, o con una barra sobre el
smbolo, como en p, o incluso como p.

-AbC

La conjuncion
Definicion (La conjuncion logica)
Si p y q son dos proposiciones, el predicado (y p q) es verdadero si ambas proposiciones
son verdaderas, y (y p q) es falso en cualquier otro caso.

En smbolos matematicos la conjuncion de dos proposiciones p y q se denota por p q.


La conjuncion de dos proposiciones determina que el nuevo valor de verdad es verdadero
unicamente en el caso en que ambas proposiciones sean verdaderas. Cualquier otro caso es
suficiente para determinar un valor de verdad falso, as, formalmente escribimos:
1
2
3

(define y
( (p q)
(if p q #f)))

El nueva definicion y puede leerse como: Definamos y como el predicado que recibe dos
parametros, llamados p y q, de tal modo que si el valor de verdad de la proposicion p es
verdadero, se devolvera el valor de verdad de la proposicion q, y de otro modo se devolvera
el valor de verdad #f.

-AbC

1
2
3

(define y
( (p q)
(if p q #f)))

Aunque parezca complicado, en realidad no lo es tanto, pero s se requiere una lectura


cuidadosa. La tabla de verdad mostrada en el cuadro, nos ayudara a comprender mejor el
comportamiento de la proposicion y.
p
#t
#t
#f
#f
> (y
#t
> (y
#f
> (y
#f
> (y
#f
>

q (y p q)
#t
#t
#f
#f
#t
#f
#f
#f

#t #t)
#t #f)
#f #t)
#f #f)

-AbC

Hasta ahora tenemos unicamente dos definiciones en nuestro nuevo lenguaje de MD. Para
mantener bien informado a los usuarios de este lenguaje, se deben agregar algunos
comentarios.
1
2
3
4
5
6
7
8
9
10

; Def #001
; objetivo: Modelar el operador logico de negacion
; formato: neg: <Booleano> -> <Booleano>
; ejemplos:
;> (neg #t)
;#f
;>
(define neg
( (p)
(if p #f #t)))

11
12
13
14
15
16
17
18
19
20
21
22
23

; Def #002
; objetivo: Modelar el operador logico de conjuncion
; formato: y: <Booleano> <Booleano> -> <Booleano>
; ejemplos:
;> (y #t #t)
;#t
;> (y #f #t)
;#f
;>
(define y
( (p q)
(if p q #f)))

-AbC

La disyuncion
Definicion (La disyuncion)
Si p y q son proposiciones, la disyuncion es el predicado que devuelve verdadero si alguna
proposicion p o q o ambas, son veraderas, y devuelve falso en caso contrario.
En matematicas se escribe p q para representar la disyuncion de las proposiciones p y q.
La tabla de verdad de la disyuncion ofrece un panorama completo del comportamiento en
cada uno de los posibles casos de las proposiciones de entrada.
p
#t
#t
#f
#f

q (o p q)
#t
#t
#f
#t
#t
#t
#f
#f

-AbC

Es de notable que el caso cuando ambas proposiciones son verdaderas, unicamente se


requiere evaluar la primera proposicion, ya que eso basta para que el resultado de la
evaluacion sea verdadero.
Las interacciones son las siguientes:
> (o
#t
> (o
#t
> (o
#t
> (o
#f
>

#t #t)
#t #f)
#f #t)
#f #f)

Veamos otras interacciones utilizando ejemplos numericos.


> (define p (= 30 (+ 10 10 10)))
> (define q (= 40 (* 2 30)))
> p
#t
> q
#f
> (o p q)
#t
>

-AbC

La disyuncion exclusiva
Definicion (Disyuncion exclusiva)
Si p y q son proposiciones logicas, la disyuncion exclusiva de p y q, denotada por (ox p q) es
verdadero cuando p es verdadero, o bien cuando q es verdadero; y devuelve falso cuando
ambas proposiciones son verdaderas o cuando ambas proposiciones son falsas.
En matematicas, la disyuncion exclusiva usualmente se denota mediante el smbolo ,
donde p q significa la disyuncion exclusiva de p y q. La tabla de verdad de la disyuncion
exclusiva es como se muestra:
p
#t
#t
#f
#f

q (ox p q)
#t
#f
#f
#t
#t
#t
#f
#f

-AbC

El concepto de la disyuncion exclusiva puede ampliarse hasta su uso en el lenguaje natural,


y es que en el lenguaje natural, frecuentemente se confunde la disyuncion con la disyuncion
exclusiva, por ejemplo, la frase:
A las 5:00 pm, Roberto1 siempre esta en casa o en el deportivo
Esta frase se puede separar en dos:
1. A las 5:00 pm, Roberto siempre esta en casa y
2. A las 5:00 pm, Roberto siempre esta en el deportivo.
Como ambas frases estan unidas por una disyuncion, la frase completa puede ser verdadera
cuando a las 5:00 pm, Joaqun esta en casa y tambien a esa misma hora Joaqun esta en el
deportivo, como es claro que Joaqun no puede estar en ambos lugares al mismo tiempo
(suponiendo que la casa de Joaqun no es el deportivo), entonces deberamos concluir de
que en realidad no es una disyuncion, sino una disyuncion exclusiva.

Generalmente se utilizan los nombres de Alicia y Roberto (Alice y Bob, en ingles) como nombres
genericos, particularmente en textos de criptografa y de fsica. Nosotros aprovechamos esto para elegir
el nombre.
-AbC

Aunque el lenguaje natural permite estas abuguedades, es mejor no provocarlas, as que una
solucion podra ser decir algo como
A las 5:00 pm, Roberto siempre esta en o casa o en el deportivo,
cuando se trate de situaciones que se asemejan mas a una disyuncion exclusiva.

EJERCICIO
En las siguientes proposiciones, decubre cual es una disyuncion exclusiva y cual no lo es.
Marca solamente aquellas casillas que s son disyunciones exclusivas.
 asd

-AbC

S\

TAREA
1. Escribe una definicion en DrRacket, para la disyuncion. Debes definir el concepto
siguiendo el formato: o : <Booleano> <Booleano> -> <Booleano>. De modo
que puedas probar la definicion con cada una de las combinaciones dadas en la tabla
de verdad para la disyuncion, por ejemplo
> (o #t #f)
#t
>

2. Escribe una definicion en DrRacket, para la disyuncion. Debes definir el concepto


siguiendo el formato: ox : <Booleano> <Booleano> -> <Booleano>. De modo
que puedas probar la definicion con cada una de las combinaciones dadas en la tabla
de verdad para la disyuncion, por ejemplo
> (ox #t #f)
#t
>
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

La implicacion
Definition (La implicacion)
Sean p y q dos proposiciones. La implicacion de p y q, escrita como p q, o en codigo
fuente como (-> p q), es un predicado con valor falso cuando p es verdadera y q es falsa, y en
cualquier otro caso la implicacion es verdadera.
En la implicacion, el primer operando se llama antecedente (tambien se puede llamar
hipotesis) y el segundo operando se llama consecuente (tambien se puede llamar tesis, o
conclusion). En ocasiones se llama a la implicacion como condicional. En la tabla se
muestra su tabla de verdad.
p
#t
#t
#f
#f

q (-> p q)
#t
#t
#f
#f
#t
#t
#f
#t

-AbC

Notemos en la tabla de verdad (y como dice la definicion), que el unico caso en que la
implicacion es falsa, es cuando su antecedente p es verdadera y el consecuente q es falso.
Cuando se describen procedimientos matematicos, o bien cuando se describen conceptos
matematicos, frecuentemente se generan expresiones que se pueden modelar con la
implicacion logica. En particular en expresiones como Si p, entonces q; p implica q, p
solo si q y muchas parecidas.
Todos los lenguajes de programacion de proposito general, utilizan una forma parecida a la
implicacion. Sin embargo el principio que subyace es el mismo. Ya hemos utilizado la forma
especial if. En programacion la clausula IF se utiliza como una condicional, pero en lugar
de devolver falso o verdadero, en caso de que el antecendente sea verdadero se realizan las
acciones consecuentes.
1
2
3
4
5
6
7
8

// Java
void applyBrakes() {
if (isMoving) {
currentSpeed--;
} else {
System.err.println("The bicycle has already stopped!");
}
}

-AbC

1
2
3
4
5
6
7
8
9
10

1
2
3
4
5

1
2
3
4
5
6
7
8

// C#
bool flagCheck = true;
if (flagCheck == true)
{
Console.WriteLine("The flag is set to true.");
}
else
{
Console.WriteLine("The flag is set to false.");
}
{* Pascal *}
if color = red then
writeln(You have chosen a red car)
else
writeln(Please choose a color for your car);
# Python
var1 = 100
if var1:
print "1 - Got a true expression value"
print var1
else:
print "1 - Got a false expression value"
print var1

-AbC

p
#t
#t
#f
#f

q (-> p q)
#t
#t
#f
#f
#t
#t
#f
#t

Analicemos los cuatro casos de la implicacion con ejemplos de interacciones en DrRacket:


El primer ejemplo es determinar p q, cuando p es 30 = (15 2) y q es 4 = (2 + 2),
notamos que de manera separada, p es verdadero y q tambien es verdadero. De modo que
de acuerdo a la tabla de verdad, la implicacion 30 = (15 2) 4 = (2 + 2), tambien es
verdadera.
> (= 30 (* 15 2))
#t
> (= 4 (+ 2 2))
#t
> (-> (= 30 (* 15 2)) (= 4 (+ 2 2)))
#t

-AbC

p
#t
#t
#f
#f

q (-> p q)
#t
#t
#f
#f
#t
#t
#f
#t

El segundo ejemplo, es cuando el consecuente es una proposicion falsa, mientras que el


antecedente es verdadero. El siguiente ejemplo ilustra el caso.
> (= 4 (+ 2 3))
#f
> (-> (= 30 (* 15 2))
(= 4 (+ 2 3)))
#f
>

-AbC

p
#t
#t
#f
#f

q (-> p q)
#t
#t
#f
#f
#t
#t
#f
#t

El tercer caso es cuando el primer operando de la implicacion es falso y el segundo


operando es verdadero, por ejemplo:
> (= 30 (* 15 3))
#f
> (= 4 (+ 2 2))
#t
> (-> (= 30 (* 15 3))
(= 4 (+ 2 2)))
#t
>

-AbC

p
#t
#t
#f
#f

q (-> p q)
#t
#t
#f
#f
#t
#t
#f
#t

Finalmente, cuando ambas proposiciones son falsas, la proposicion resultante de la


implicacion es verdadera.
> (= 4 (+ 2 3))
#f
> (-> (= 30 (* 15 3))
(= 4 (+ 2 3)))
#t
>

" XEFPE ZIVHEH 4V


X X
X
X J
"

-AbC

La implicacion funciona como una promesa, donde el antecedente es la condicion que se


debe cumplir para obtener lo que se ha prometido que es el consecuente, por ejemplo:
Si es tu cumpleanos, hay fiesta
Analicemos en que casos, el festejado pordra sentirse defraudado al no tener su fiesta de
cumpleanos prometida:
Para hacer mas personal el ejemplo, supongamos que la persona se llama Alicia2 :
1. Supongamos que NO es el cumpleanos de Alicia, y NO hay fiesta. Alicia no tiene
porque sentirse defraudada y tendra una reaccion positiva, esto corresponde al caso
(-> #f #f)#t.
2. Supongamos ahora que SI es el cumpleanos de Alicia, y que SI hay fiesta. Por
supuesto que Alicia no se sentira defraudada, pues la promesa se cumplio y tendra
una reaccion positiva, esto corresponde al caso (-> #t #t)#t.
3. Supongamos que NO es el cumpleanos de Alicia y SI hay fiesta. Claramente tampoco
se sentira defraudada Alicia, es mas, hasta se sentira contenta y tendra una reaccion
positiva, porque le gusta asistir a una fiesta de cumpleanos, aunque no sea su
cumpleanos; esto corresponde al caso (-> #f #t)#t.
4. Por ultimo, supongamos que Alicia SI cumple anos y NO hay fiesta. En este ultimo
caso Alicia se sentira defraudada al notar que no se cumplio la promesa y causara en
ella una reaccion negativa. Esto corresponde al caso (-> #t #f)#f.

Compa
nera de Roberto (vease la nota al pie de la pagina 39)
-AbC

La implicacion en programacion
En programacion de computadoras se utiliza frecuentemente las condicionales en la forma
de una sentencia if, en el lenguaje , por ejemplo, existe una instruccion condicional que
permite realizar una accion consecuente si un predicado es verdadero; o bien realizar
laaccion alternativa en caso de que el predicado fuera evaluado como falso:
; Ejemplo en C estandar
#include <stdio.h>
int main (void){
int x=10;
x>20 ? printf("consecuente") : printf("alternativa");
return (0);
}

En este ejemplo, el predicado a ser evaluado es x > 20, que es falso, considerando el valor
inicial de x = 10. En los lenguajes de programacion que siguen el mismo paradigma de C, al
ser verdadero el predicado, se deben ejecutar la secuencia de ordenes que se colocan en la
parte del consecuente; mientras que cuando el predicado es falso, se deben ejecutar las
ordenes colocadas en la parte de la alternativa. En el codigo ejemplo se imprime en el
monitor la leyenda alternativa, pues x > 20 es falso.
En los lenguajes funcionales, la evaluacion del predicado no decide el flujo de operaciones,
sino que decide que expresion debe ser evaluada.

-AbC

El siguiente ejemplo esta escrito en PROLOG y tiene una lectura diferente, pero se basa en
el mismo principio:
1
2
3
4

padre(javier,eduardo).
padre(javier,ramon).
padre(mariano,javier).
padre(gustavo,mariano).

5
6
7
8

antecesor(A, B) :- padre(A, B).


antecesor(A, B) :- padre(A, C),
antecesor(C, B).

En la primera parte (lneas 1 - 4) se declaran las proposiciones verdaderas (no hay


proposiciones falsas), y la segunda parte (lneas 6 - 8) se declaran las reglas, estas reglas
son predicados condicionales, cuyo antecedente se encuentra a la derecha del smbolo :-,
mientras que el consecuente se encuentra a la izquierda del smbolo :-.
La lectura de la primera regla (lnea 6) es: A es antecesor de B es verdadero cuando A es
padre de B. Algo similar la siguiente regla, considerando que la coma es una conjuncion.

-AbC

La doble implicacion
Definicion (La doble implicacion)
Si p y q son proposiciones logicas, la doble implicacion o bicondicional, es un predicado que
es verdadero cuando tanto p como q son o ambas verdaderas, o ambas falsas, y es falsa en
los otros casos.
p
#t
#t
#f
#f

q (<-> p q)
#t
#t
#f
#f
#t
#f
#f
#t

De la tabla de verdad nos damos cuenta de que cuando p es verdadero, el valor de la doble
implicacion es el mismo que el valor que actualmente tiene la proposicion q; mientras que
cuando la proposicion p es falsa, la doble implicacion tiene valores diferentes que q, de
hecho es la propia negacion de q.

-AbC

TAREA
1. Escribe una definicion en DrRacket, para la implicacion. Debes definir el concepto
siguiendo el formato: -> : <Booleano> <Booleano> --> <Booleano>. De modo
que puedas probar la definicion con cada una de las combinaciones dadas en la tabla
de verdad para la implicacion, por ejemplo
> (-> #t #f)
#f
>

2. Escribe una definicion en DrRacket, para la doble implicacion. Debes definir el


concepto siguiendo el formato: <-> : <Booleano> <Booleano> -> <Booleano>.
De modo que puedas probar la definicion con cada una de las combinaciones dadas en
la tabla de verdad para la doble implicacion, por ejemplo
> (<-> #t #f)
#f
>
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

Equivalencias logicas
En la practica cotidiana de la programacion y de las matematicas, es util sustituir
expresiones por otras menos complejas pero que conserven los mismos valores logicos y
numericos.

Definicion (Equivalencia logica)


Cuando dos predicados p1 y p2 son l
ogicamente equivalentes lo denotamos como
p1 p2 , y es una proposicion verdadera si ambas proposiciones tienen el mismo valor ante
los mismos valores de sus argumentos.

EJEMPLO
Sea p1 el predicado (a b) y p2 el predicado (a b). Calculemos ahora la tabla de
verdad de cada predicado
a
#t
#t
#f
#f

b
#t
#f
#t
#f

(-> a b) (neg a) (o (neg a) b)


#t
#f
#t
#f
#f
#f
#t
#t
#t
#t
#t
#t

Las columnas marcadas con flechas son iguales, notemos que se debe preservar el orden en
los valores de los argumentos de los predicados (las proposiciones a y b. Como las
expresiones marcadas con flechas, ocasionan el mismo comportamiento, podemos decir que
(-> a b) y (o (neg a) b) son logicamente equivalentes.
-AbC

" XEFPE ZIVHEH


S EF
X X
X
X J
J
" XEFPE ZIVHEH
S EF
X X
X
X J
J
"

"EF
J X
X
S RIK E F
J X
X

Contradiccion
Definicion (Contradiccion)
Si a es una expresion proposicional cuyo valor de verdad es falso sin importar el valor de
verdad de las proposiciones que la constituyen, entonces decimos que a es una
contradicci
on.

EJEMPLO
Este es un ejemplo para demostrar una contradiccion.
Si (define a (y p ( p))) es una expresion proposicional, el valor de verdad de a para cada
valor de las proposiciones que la constituyen se muestra en la siguiente tabla de verdad:
p ( p) (y p ( p)) a
#t
#f
(y #t #f)
#f
#f
#t
(y #f #t)
#f
Como el valor de verdad de p es #f sin importar el valor de verdad de sus componentes,
entonces podemos afirmar que (o p ( p)) es una contradiccion.


-AbC

Contingencia
Definicion (Contingencia)
Si el valor de verdad de una expresion proposicional a puede ser verdadera o falso, entonces
es una contingencia.
En programacion, las expresiones proposicionales por lo general son contingencias, pues el
valor de verdad de sus componentes es asignado a variables cuyo valor se determina en
tiempo de ejecucion.
Un ejemplo de contingencia es la proposicion (o p q), o bien (y p q), cuyo valor de verdad
depende de los valores de verdad de las proposiciones p y q.

-AbC

Introduccion - conjuntos

-AbC

Nocion de elemento y conjunto


Tanto elemento como conjunto son dos conceptos que no tienen una definicion formal, y se
considera que el significado es obvio y claro, a pesar de no tener una definicion formal para
esos terminos. Sin embargo, el diccionario del espanol s da definiciones, veamos:
Elemento: 9. m. Mat. Cada uno de los componentes de un conjunto.
Conjunto: 10. m. Mat. Totalidad de los entes matematicos que tienen una propiedad
comun. El conjunto de los numeros primos.
La teora de conjuntos se desarrollo gracias a los trabajos de Georg Cantor3 . Cantor entre
otras cosas creo la nocion de infinito, y de los conjuntos bien ordenados.

Georg Ferdinand Ludwig Philipp Cantor


(1845 1918) Fue un notable matematico
aleman que es conocido por ser el creador
de la teora de conjuntos.

Fuente: http://www.math.uni-hamburg.de/home/grothkopf/fotos/math-ges/
-AbC

De estas definiciones se muestra que para definir elemento, se requiere conocer que es un
conjunto, y para definir un conjunto hace falta conocer que es un ente matematico
(sinonimo de elemento), ademas de que en realidad los elementos agrupados en un
conjunto pueden compartir la unica propiedad de estar en el mismo conjunto, una
propiedad bastante arbitraria, pero completamente valida.

EJEMPLO
Algunos ejemplos de conjuntos:
I El conjunto de las vocales en el espa
nol.
I El conjunto de las consonantes en el espa
nol.
I El conjunto de los n
umeros enteros pares.
I El conjunto con los elementos 1, 3, 5, 7, 8 y 10.

-AbC

En general hay dos maneras de describir un conjunto, una de ellas es enunciando la


propiedad que hace que un ente matematico sea incluido en el conjunto; y la otra forma es
mencionar cada elemento que debe ser parte del conjunto.
En matematicas se puede reconocer un conjunto porque la descripcion del conjunto se
encuentra delimitada por llaves { y }, por ejemplo:

EJEMPLO
Algunos ejemplos de conjuntos:
I El conjunto de las vocales en el espa
nol: {w|w es una vocal}
I El conjunto de las consonantes en el espa
nol: {b,c,d,f,g,h,j,k,,m,n,n,p,q,r,s,t,v,w,x,y,z}
I El conjunto de los n
umeros enteros pares: {x|x mod 2 = 0}
I El conjunto con los elementos {1, 3, 5, 7, 8, 10}.

-AbC

Hay dos observaciones importantes acerca de los conjuntos:


1. Los elementos de un conjunto no se repiten. Es suficiente nombrar solamente
una vez cada elemento, nombrarlos dos o mas veces es redundate. Sin embargo hay
conjuntos especiales donde s se permiten las repeticiones, aunque estrctamente se
habla de la primera ocurrencia de un elemento, la segunda ocurrencia, etc.
2. El orden en que aparecen los elementos del conjunto no es importante. Dado
que lo importante en el conjunto es precisamente que ocurran, no importa el lugar que
ocupen.

-AbC

Listas en DrRacket
Las lista son los ciudadanos de primera clase en DrRacket, a menos de que sean
expresiones primitivas, todas las combinaciones y formas especiales se escriben con listas.
Ahora vamos a introducir el concepto de lista, para poder implementar los conjuntos.

Definition (Lista)
Un objeto L es una lista si cumple alguna de las siguientes dos condiciones:
1. L es de la forma ()
2. Si L NO ES de la forma (), deben identificarse los dos siguientes elementos:
2.1 El
2.2 El

car
cdr

de la lista, que es el primer elemento, aquel situado mas a la izquierda.


de la lista, que es una lista que contiene a el resto de los elementos.

-AbC

Conjuntos como listas


A diferencia de los conjuntos que son agrupaciones sin orden preferente de sus elementos,
las listas son secuencias ordenadas de elementos, esto es que si la lista tiene elementos, hay
un primer elemento (el car de la lista), puede haber un segundo, un tercero y as.
Otra diferencia importante entre los conjuntos y las listas, es que en los conjuntos no se
permiten las repeticiones de elementos, mientras que en las listas si pueden haber elementos
repetidos, recordemos que lo irrepetible son los ndices de las posiciones de los elementos.
Considerando estas diferencias vamos a modelar los conjuntos mediante listas (aunque
DrRacket tiene un tipo de dato especial para conjuntos). Para modelar conjuntos vamos a
hacer lo siguiente:
1. el conjunto vaco corresponde a la lista vaca (), como se haba anotado
anteriormente.
2. como los conjuntos son desordenados, el orden que se establece en las listas no es
importante, as que esa caracterstica se puede pasar por alto.
3. al menos por ahora, supondremos que una lista sin elementos repetidos es un conjunto.
Mas adelante haremos un procedimiento para verificar que una lista no tiene elementos
repetidos.
Nota sobre la notacion: Si A es un conjunto, si A tiene 1 o mas elementos, A se puede
escribir como (a0 A0 ), donde a0 es el car de A y A0 es el cdr de A.

-AbC

TAREA
1. Marca las casillas de las expresiones que SI son listas.






()
a b c
((a b) (c d) e)
(((a) (b)) ((c) ((d e)))
(a b ((c) (d)))

2. Cuenta el numero de elementos de cada una de las listas (de las que s son listas).
(hola mundo como te va)
(+ 30 (* 10 20))
((a b) (x (z) e))
(((a) (b)) ((c) ((d e))))
(a b ((c) (d)))

3. ?Cual es el

car

de cada una de las siguientes listas?

()
((a b) (c d) e)
((((3 8)) ((9 3))) ((p) (((8) 9))))
((((2 s)) (j)) ((w) (k f s i)))

4. Subraya el

cdr

de cada una de las siguientes listas

()
((a b) (c d) e)
((((3 8)) ((9 3))) ((p) (((8) 9))))
((((2 s)) (j)) ((w) (k f s i)))
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)
-AbC

Como se menciono anteriormente, hay dos maneras de definir un conjunto4 :


intensional cuando se describe una regla o condicion que permite decidir si un elemento
debe pertenecer o no al conjunto;
extensional donde se define elconjunto mencionando explcitamente cada uno de los
elementos del conjunto.

EJEMPLO
Sea A el conjunto de los numeros 6, 7, 8, 9, 10, 11, 12, 13, 14.
> (define A (6 7 8 9 10 11 12 13 14))
> A
(6 7 8 9 10 11 12 13 14)
>

EJEMPLO
Sea A el conjunto de los numeros enteros mayores que 5 y menores que 15. Lo que se
puede escribir como A , {x|(x > 5) (x < 15)}
> (define A (filter ( (x) (y (> x 5) (< x 15)))
(build-list 100 values)))
> A
(6 7 8 9 10 11 12 13 14)
>

En este curso, todas las definiciones de conjuntos se van a hacer de manera extensional.
-AbC

TAREA
Traduce las siguientes sentencias en lenguaje DrRacket
1. Sea A1 , {q, e, t, y, z}
2. Sea A2 el conjunto de las personas adrian, esteban, karla e isidoro.
3. Sea A3 el conjunto de los numeros enteros positivos menores que 20, que sean
divisibles por 4.
4. Sea A4 el conjunto de las palabras de 3 letras donde la letra de enmedio es una vocal,
y las otras dos letras son las consonantes f o g.
5. Si A5 , {a, b, e, t, i, s, k} y A6 , {a, e, i, k, m, c, p, q}, define el conjunto A6 que
contiene los elementos de A5 que no aparecen en A6 .
6. Supongamos que , {0, 1}, escribe en DrRacket, el conjunto A6 que es definido
como el conjunto de las palabras de 6 letras en que empiezan con un 0 y no tienen
dos 1s seguidos.
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

Conjunto vaco
Definicion (Conjunto vaco)
El conjunto vaco es el conjunto que no tiene elementos. En matematicas se denota como
{}, o bien como ; en DrRacket el conjunto vaco se denota como ().
Para implementar el conjunto vaco en DrRacket, podemos crear una definicion como esta:
> (define vacio ())
> vacio
()
>

El lenguaje DrRacket ofrece un predicado que determina si un identificador esta asociado


con el conjunto vaco.
> (empty? vacio)
#t
>

En DrRacket existen varios predicados que determinan si un identificador esta asociado


con cierto tipo de elementos, un predicado se puede identificar por el ultimo caracter del
identificador del predicado, nos referimos al smbolo ?. Este smbolo no es restrictivo para
definir nuevos predicados,es solamente una convencion que puede guiar la interpretacion del
programa por parte de los programadores. Es recomendable que al definir nuevos predicados
se terminen con un smbolo ?, a menos de que sea completamente claro el significado.

-AbC

La cardinalidad
Definicion (Cardinalidad)
Si A es un conjunto, la cardinalidad del conjunto A es la cantidad de elementos que
contiene. En matematicas la cardinalidad del conjunto A se denota como |A|, y si |A| = n,
n debe ser un numero entero no negativo. Si A , , entonces |A| = 0, y si A 6= ,
entonces |A| > 0.
Es posible dar una definicion efectiva (en DrRacket) para determinar la cardinalidad de un
conjunto. La idea fundamental de la cardinalidad es contar los elementos del conjunto.
El caso mas simple es cuando el conjunto no tiene elementos, la cardinalidad es 0.
Cuando el conjunto no esta vaco, lo que conocemos del conjunto es que tiene un primer
elemento (el car del conjunto) y el resto del conjunto (el cdr) que no sabemos cuantos
elementos tiene.
As que el numero de elementos de un conjunto A esta dado por la expresion de casos:

Si A =
entonces 0
|A| ,
0
Si A = (a0 A ) entonces 1 + |A0 |

-AbC

Es notable que cuando A 6= que podemos escribirlo como (A0 |A0 ), entonces A tiene un
primer elemento A0 , y una lista con el resto de los elementos A0 .
Cuando esto sucede (A 6= ), la cardinalidad del conjunto es apenas 1 mas la cardinalidad
del resto de los elementos.
La definicion efectiva luce como el siguiente codigo:
1
2
3
4
5

(define card-v1 ; la version 1 de la cardinalidad


( (A) ; un conjunto en forma de lista, como (a b c d e f)
(if (empty? A)
0
(+ 1 (card-v1 (cdr A))))))

Este codigo es un ejemplo de codigo bello, este codigo es legible, es tan claro que se podra
escribir y leer desde su definicion formal en matematicas. Sin embargo no es muy elegante.
La elegancia en el codigo tiene que ver con diversos factores de eficiencia como optimizar la
memoria, mantener la correctitud de la solucion y minimizar el tiempo de ejecucion.

-AbC

1
2
3
4
5

(define card-v1 ; la version 1 de la cardinalidad


( (A) ; un conjunto en forma de lista, como (a b c d e f)
(if (empty? A)
0
(+ 1 (card-v1 (cdr A))))))

EJEMPLO
Cual es la cardinalidad del conjunto A , {w, r, q, p}?

-AbC

Recursion de cola
Veamos esta otra implementacion. Esta version 2 de la cardinalidad, tiene dos argumentos,
en lugar de solamente uno de la primera version:
1
2
3
4
5

(define card-v2 ; la segunda version de la cardinalidad


( (A res) ; un conjunto de la forma (a b c d e f)
(if (empty? A)
res
(card-v2 (cdr A) (+ res 1)))))

Comparemos lado a lado las dos implementaciones (encuentra las diferencias):


1
2
3
4
5

(define card-v1
( (A)
(if (empty? A)
0
(+ 1 (card-v1 (cdr A))))))

1
2
3
4
5

(define card-v2
( (A res)
(if (empty? A)
res
(card-v2 (cdr A) (+ res 1)))))

-AbC

1
2
3
4
5

(define card-v2 ; la segunda version de la cardinalidad


( (A res) ; un conjunto de la forma (a b c d e f)
(if (empty? A)
res
(card-v2 (cdr A) (+ res 1)))))

Ahora estudiemos el comportamiento con la misma entrada A , {w, r, q, p}. Nos interesa
observar cuantas llamadas a la misma funcion se tienen que invocar para lograr el resultado.
Otra cosa que hay que onservar es en donde se realizan los calculos:

EJEMPLO
Cual es la cardinalidad del conjunto A , {w, r, q, p}?
HIRI GEVH Z
S % % IW YR GSRNYRXS
MJ IW ZEGMS# %
GEVH Z

GHV %

HIRI GEVH Z
S % VIW % IW YR GSRNYRXS
MJ IW ZEGMS# %
VIW
GEVH Z
GHV %
VIW

-AbC

Para lograr esta lectura tenemos que agregar una nueva definicion que invoque la funcion
de cardinalidad:
1

(define card ( (A) (card-v2 A 0)))

Ahora si, la lectura es como se desea. El objetivo de esta funcion es calcular la


cardinadlidad de un conjunto, y eso lo hace delegando la responsabilidad a la funcion
mediante la invocacion (card-v2 A 0).
1
2
3
4
5
6
7
8
9
10
11
12
13
14

; objetivo: Determinar el numero de elementos de un conjunto


; formato: cardinalidad: <conjunto> --> <numero>
; ejemplos:
; > (cardinalidad (3 8 2 9))
; 4
; >
HIRI GEVH
(define cardinalidad
S % ?VIW A % IW
( (A)
MJ IW ZEGMS# %
(define card-v2
( (A res)
VIW
(if (empty? A)
GEVH GHV %
res
(card-v2 (cdr A) (+ res 1)))))
(card-v2 A 0)))

card-v2

YR GSRNYRXS

VIW

-AbC

Hay conjuntos que tienen tantos elementos que no pueden enlistarse, como el conjunto de
los numeros pares, este tipo de conjuntos tiene una cardinalidad infinita.
El infinito no es un n
umero sino es una manera de decir que siempre se puede encontrar
un numero que esta despues del que supusimos es el ultimo.
El smbolo que se ha asociado a este termino en matematicas es . En DrRacket hay un
par de smbolos que tienen el significado de infinito.
El infinito positivo
tipo number?.

+inf.0

y el infinito negativo

-inf.0.

En DrRacket, estos smbolos son de

> (> +inf.0 99999999999999999999999999999999999999999999999999999)


#t
> (< -inf.0 -9999999999999999999999999999999999999999999999999999)
#t
>

A pesar de que un conjunto tenga un numero infinito de elementos, es posible enumerarlos,


si los elementos de ese conjunto se pueden poner en correspondencia 1 a 1 con los numeros
naturales (Z). Este tipo de conjuntos se llaman conjuntos numerables. Otros conjuntos
no son numerables, como el conjunto de los numeros reales (R). En este curso estudiaremos
unicamente los conjuntos finitos y numerables, definidos de manera extensional.

-AbC

> (number? 4)
#t
> (number? +inf.0)
#t
> (number? -inf.0)
#t
> (- +inf.0 +inf.0)
+nan.0
> (+ -inf.0 +inf.0)
+nan.0
> (* +inf.0 2)
+inf.0
> (/ +inf.0 +inf.0)
+nan.0
> (* +inf.0 0)
0
>

-AbC

TAREA
1. Compara el numero de evaluaciones hechas cuando se invoca (card-v1 (e o p j k s
con el numero de evaluaciones hechas cuando se invoca (card-v2 (e o p j k s w)):

w)),

1.1 Escribe cada evaluaci


on detalladamente, llamada por llamada. Has esto para cada
invocacion.
1.2 Cuenta cuantas llamadas al mismo procedimiento se hacen en cada caso.

2. Escribe una definicion recursiva-de-cola que calcule el numero factorial de un numero


entero. La defincion matematica del factorial de un numero n entero positivo es:

1
cuando n = 1;
n! =
n(n 1)! cuando n > 1;
Esta definicion debe llamarse

fact,

y tiene el formato

fact: <numero> --> <numero>.

Es importante que cada definici


on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

Pertenencia
Es muy util poder determinar si un elemento pertenece a un conjunto, en particular cuando
los conjuntos se han definido de manera intencional. La pertenencia es un predicado, de
modo que es un valor verdadero o falso, dependiendo de que el elemento buscado este o no
entre los miembros del conjunto.
Como los conjuntos que estudiaremos en este curso son definidos extensionalmente, una
manera de determinar si un elemento pertenece al conjunto es buscarlo en la lista de
elementos. As se puede enunciar un algoritmo para determinar si un elemento pertenece a
un conjunto.
En matematicas la pertenencia de un elemento a a un conjunto A es un predicado que se
denota por a A, cuyo valor de verdad es #t, si a ocurre en la lista de elementos del
conjunto A; y es #f, si el elemento a no ocurre en la lista de elementos del conjunto A.
Cuando a A es falso, el predicado a 6 A es verdadero y cuando a A es verdadero, el
predicado a 6 A es falso.

-AbC

Modelando la pertenencia en DrRacket


Este problema requiere un elemento e y un conjunto C, la respuesta debe ser #t si e C,
y debe ser #f si e 6 C.
La idea general es seguir los siguientes pasos:
1. Si C = , entonces e C #f
2. Si C 6= c0 = e, entonces e C #t; cuando C = (c0 C 0 )
3. e C 0 ; en otro caso.

-AbC

Para implementar el predicado pertenece?, hay que considerar que los elementos enlistados en
el conjunto no tienen algun orden en particular, de modo que es necesario comparar el
elemento buscado con cada uno de los elementos del conjunto, y detener la busqueda
cuando se determine mediante la igualdad, que el elemento buscado s pertenece al
conjunto.
1
2
3
4
5

(define pertenece?
( (a A)
(cond ((empty? A)
#f)
((equal? a (car A)) #t)
(else
(pertenece? a (cdr A))))))

Probemos el codigo con algunos ejemplos:


> (pertenece? 3 (2 4 6 8 10))
#f
> (pertenece? 10 (2 4 6 8 10))
#t
> (pertenece? 3 ())
#f
>

-AbC

TAREA
1. Escribe una definicion para el concepto conjunto? que reciba como entrada una lista, y
que devuelva verdadero si la lista no tiene elementos repetidos, y devuelva falso si la
lista tiene elementos repetidos. El conjunto vaco s debe devolver verdadero.
El formato es conjunto? : <lista> --> <Booleano>.
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

> (conjunto? (a b c d e f))


#t
> (conjunto? ())
#t
> (conjunto? (a b c a d e f))
#f
>

-AbC

Diagramas de Venn
Los diagramas de Venn son representaciones graficas que permiten observar los elementos
de un conjunto,ya que se reserva un espacio bien delimitado que encierra a los elementos
del conjunto.

EJEMPLO
Sean A y B dos conjuntos. A , {2, 4, 6, 8, 10} y B , {a, e, i, o, u}. Representa los
conjuntos A y B mediante un diagrama de Venn.
Las interacciones se pueden escribir formalmente como:

3 6 {2, 4, 6, 8, 10}
I 10 {2, 4, 6, 8, 10}
I 3 6
Los diagramas de Venn son particularmente utiles cuando se consideran conjuntos
pequenos, o bien para ilustrar cuando dos o mas conjuntos tienen elementos en comun.
I

-AbC

Conjuntos iguales
Definicion (Conjuntos iguales)
Si A y B son conjuntos, decimos que A es igual al conjunto B cuando ambos conjuntos
tienen exactamente los mismos elementos. Si A y B no tienen exactamente los mismos
elementos, entonces decimos que A es diferente a B, y lo escribimos como A 6= B.
La definicion anterior dice que para que los conjuntos A y B sean iguales, los elementos del
conjunto A deben pertenecer al conjunto B, pero eso no es todo, desde la perspectiva del
conjunto B debe suceder algo similar, todos los elementos del conjunto B deben pertenecer
al conjunto A.

-AbC

Subconjuntos
Definicion (Subconjunto)
Si A y B son conjuntos, decimos que A es un subconjunto de B, escribiendolo como
A B, cuando todos los elementos de A pertenecen tambien al conjunto B. Si A no es un
subconjunto de B, se escribe como A 6 B.
Si A B recprocamente podemos decir que el conjunto B es un superconjunto del
conjunto A; esto significa que el conjunto B puede tener elementos que no pertenecen al
conjunto A, dicho de otro modo, la cardinalidad del conjunto B puede ser mayor que la
cardinalidad del conjunto A.

-AbC

Implementacion del concepto

subconjunto?

Como se estudio, si A y B son sonjuntos, A B es un predicado, de modo que el


problema queda resuelto al proporcionar un valor de verdad.
Se procede deacuerdo al siguiente algoritmo:
1. Si A = , entonces A B #t: El conjunto vaco es subconjunto de cualquier
conjunto.
2. Si A 6= a0 B, entonces A0 B; cuando A = (a0 A0 ).
3. en otro caso, entonces A B #f;

EJERCICIO
1. Describe formalmente la frase en otro caso.

-AbC

TAREA
Escribe una definicion en DrRacket para el concepto subconjunto? de acuerdo con los tres
casos de la implementacion; con el formato subconjunto?: <conjunto> <conjunto> --> <Booleano>,
para probar tu definicion puedes seguir los siguientes ejemplos.
> (subconjunto? () (a b c d e f))
#t
> (subconjunto? (a b) (a b c d e f))
#t
> (subconjunto? (a b c e f g) (a b c d e f))
#f ; g 6 {a, b, c, d, e, f }
>
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

Subconjunto propio
Definicion (Subconjunto propio)
Si A y B son conjuntos, decimos que B es un subconjunto propio de A, y lo denotamos
como B A, cuando A B y A 6= B.

-AbC

TAREA
Escribe una definicion en DrRacket que implemente el concepto de
dos conjuntos pasados como listas, siguiendo el formato:

subconjunto-propio?

de

subconjunto-propio?: <conjunto> <conjunto> --> <Booleano>

Es importante que cada definicion tenga los comentarios adecuados (de otro modo la tarea
esta incompleta).
Las siguientes interacciones te deben servir de gua para determinar si tu programa es
correcto.
> (subconjunto-propio?
#t
> (subconjunto-propio?
#t
> (subconjunto-propio?
#f ; son iguales
> (subconjunto-propio?
#f ; no es subconjunto

() (a b c d e f))
(a b) (a b c d e f))
(a b c e f g) (e f b c g a))
(a b c e f g) (a b c d e f))

Es importante que cada definici


on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

Cuantificadores

-AbC

Cuantificadores
Un tema importante sobre logica matematica son los cuantificadores. Los cuantificadores
representan predicados que permiten establecer un valor de verdad de una sentencia sobre
un conjunto de valores. En esta seccion estudiaremos dos cuantificadores, el llamado
cuantificador universal y el cuantificador existencial.
En la practica cotidiana del desarrollo de sofware, cuando se hacen los requerimientos del
sistema es posible encontrar frases como las siguientes:
I

Si todos los miembros del equipo estan de acuerdo, podemos empezar el proyecto
inmediatamente.
Si hay algun miembro del equipo que no este de acuerdo, el proyecto se pospone.

Estas frases son solamente ejemplos y se puede hacer un modelo computacional que
permita incluir condiciones sin confusiones. Cuando un predicado se debe aplicar a un
conjunto de valores, se deben utilizar cuantificadores, el primer caso muestra un tpico
ejemplo de un cuantificador universal, mientras que el segundo es un ejemplo tpico de
un cuantificador existencial.

-AbC

Cuantificador universal
Para estudiar el cuantificador universal, recuperamos el primer ejemplo mostrado en la
seccion anterior:
Si todos los miembros del equipo estan de acuerdo, podemos empezar el
proyecto inmediatamente
A primera vista se puede ver como una forma de implicacion, donde se puede separar esta
frase en dos:
p: todos los miembros del equipo estan de acuerdo
q: podemos empezar el proyecto inmediatamente
Pero una lectura mas detallada indica que una doble implicacion se acerca mas a la
intencion de la expresion, ya que el proyecto no debe empezar si hay alguien que no este de
acuerdo. En una implicacion no importara que el predicado p fuera falso, siempre que q
fuera verdadero.
De modo que se debe hacer

(<-> p q),

para determinar la veracidad o falsedad del predicado.

-AbC

Claro que para saber si todos los miembros del equipo estan de acuerdo, habra que
preguntarle a cada integrante del equipo, y una vez que se le haya preguntado acada uno y
que ninguno haya respondido que no esta de acuerdo, entonces el predicado p, tendra un
valor verdadero, de otro modo el predicado sera falso.
Para modelar esta situacion es util considerar un predicado que sea verdadero si una
proposicion es verdadera para todos los elementos de un conjunto, y sea el predicado sea
falso si al menos un elemento del conjunto ocasiona que la proposicion sea falsa.

Definicion (Cuantificador universal)


Si P es un predicado y A es un conjunto, el cuantificador universal se denota por
x A : P (x)
es un predicado que es verdadero si P aplicado a todos y cada uno de los elementos de A
es verdadero, y es falso si el predicado P no es verdadero en alguno de los elementos del
conjunto A.
En la notacion del cuantificador universal x A : P (x), el conjunto A recibe el nombre de
dominio, que es el conjunto de elementos sobre los cuales de debe verificar el predicado P .
El predicado P es una expresion que adquiere un valor falso o verdadero en dependencia del
valor de la variable o variables que fungen como argumentos de la expresion.

-AbC

EJEMPLO
Cual esel valor del siguiente predicado?
x {0, 1, 2, 3, 4} : (x 3)
El valor del predicado resulta al aplica y verificar el valor de la aplicacion del predicado a
cada miembro del dominio. Esto es equivalente a calcular:
(0 3) (1 3) (2 3) (3 3) (4 3)
#t #t #t #t #f
#f

-AbC

El predicado puede tener nombre o ser anonimo, esto es, un predicado anonimo requiere el
uso de un smbolo para determinar su calidad de predicado anonimo, mientras que para
hacer referencia a un predicado con nombre, simplemente se escribe su identificador,
veamos el segmento de codigo siguiente:
(define P ((p q) (if p q #t))

Una definicion tpica en DrRacket, como la anterior, se compone de tres elementos,


formando una expresion encerrada entre parentesis:
1. la palabra reservada define, sirve para indicar que se va a efectuar una asociacion entre
un identificador y una expresion. Internamente se reserva memoria y se relaciona el
contenido de esa memoria con el identificador5
2. Un identificador, es una secuencia de smbolos sin el espacio en blanco; en este
ejemplo se ha utilizado el smbolo P. Es equivalente a definir un nuevo concepto, el
nombre del concepto es el identificador.
3. Una expresion. Es el significado del concepto que se esta definiendo. EN el ejemplo la
expresion es ((p q) (if p q #t)). El significado es la evaluacion de la expresion,
as el nuevo concepto P, significa o #t, o #f.

Aunque internamente la computadora hace mas cosas, lo interesante es que se hace una
asociaci
on entre el contenido de la memoria y in identificador.
-AbC

As, cuando se requiera el uso del concepto ya definido, puede utilizarse bien su nombre, o
su significado:
Una implementacion del cuantificador universal se puede hacer verificando el valor de
verdad de un predicado sobre cada elemento de un conjunto dominio, considerando que si el
dominio s vaco, entonces el valor de verdad del cuantificador es verdadero.
1
2
3
4
5

(define paraTodo
( (P A)
(cond ((empty? A) #t)
((P (car A)) (paraTodo P (cdr A)))
(else #f))))
> (para-todo ( (x) (> x 0)) (2 4 6 8 10))
#t
>

-AbC

Cuantificador existencial
El cuantificador existencial es un predicado similar al cuantificador universal, en el sentido
que se debe verificar el valor de verdad de un predicado sobre un conjunto de elementos, el
dominio del cuantificador.

Definition (Cuantificador existencial)


Si P es un predicado y A es un conjunto, el cuantificador existencial se denota por
x A : P (x)
es un predicado que es verdadero existe al menos un elemento x en el dominio A de tal
modo que P (x) es verdadero, y es falso en otro caso.
Otro modo de entender el cuantificador existencial, es que solamente se requiere que un
elemento del dominio ocasione que el predicado probado sea verdadero, para que todo el
predicado sea verdadero, aunque haya mas elementos que tambien hagan verdadero el
predicado.

-AbC

En esta ocasion, es necesario verificar la vercidad del predicado para el primer elemento del
conjunto, o para el segundo elemento, y as sucesivamente hasta encontrar el primer
elemento que ocasione el valor #t del predicado probado, veamos el siguiente ejemplo.

EJEMPLO
Determina el valor de la expresion x {0, 1, 2, 3, 4} : (x > 2)
(0 > 2) (1 > 2) (2 > 2) (3 > 2) (4 > 2)
#f #f #f #t #f
#t

-AbC

En cuanto a la implementacion, podemos observar que una vez que se ha determinado la


veracidad del predicado el algun miembro del dominio, es innecesaria la verificacion para el
resto, pues sin importar el valor del resto de las verificaciones, el resultado final sera
verdadero.
1
2
3
4
5

(define existeUn
( (P A)
(cond ((empty? A) #f)
((P (car A)) #t)
(else (existeUn P (cdr A))))))
> (existeUn
#t
> (existeUn
#f
> (existeUn
#t
> (existeUn
#f
>

( (x) (> x 3)) (0 1 2 3 4 5))


( (x) (> x 5)) (0 1 2 3 4 5))
( (x) (> x -1)) (0 1 2 3 4 5))
( (x) (> x 3)) ())

> (existeUn ( (x) (> x 3)) (0 1 2 3 4 5))


(( (x) (> x 3)) 0) (existeUn ( (x) (> x 3)) (1
(( (x) (> x 3)) 1) (existeUn ( (x) (> x 3)) (2
(( (x) (> x 3)) 2) (existeUn ( (x) (> x 3)) (3
(( (x) (> x 3)) 3) (existeUn ( (x) (> x 3)) (4
(( (x) (> x 3)) 4) (> 4 3) #t
#t
>
-- Y ya no es necesario verificar el
ultimo elemento

2 3 4 5))
3 4 5))
4 5))
5))

(5).

-AbC

La negacion universal
La negacion del cuantificador universal es una nueva proposicion que toma valor verdadero
cuando el cuantificador universal resulta falso, y falso cuando su valorresultante es
verdadero. La negacion del cuantificador existencial se escribe
x A : P (x)
En palabras se puede establecer lo siguiente: No es verdad que para todo elemento x en su
dominio A, se cumple P .
No muchas ocasiones tendremos oportunidad de decir algo as. En el lenguaje natural las
expresiones pueden ser mas sutiles, de modo que una manera de expresar la frase anterior, y
que se parece mas a una expresion natural es: En el conjunto A, existe al menos un
elemento x que no cumple P .
Esto es, que hace falta unicamente que uno de los elementos del dominio no cumpla el
predicado P , para que todo el cuantificador no se cumpla. De modo que la negacion del
cuantificador existencial se puede escribir equivalentemente como cualquiera de las
expresiones:
1. x A : P (x)
2. x A : P (x)

-AbC

La implementacion del cuantificador universal se puede hacer en cualquiera de las dos


maneras equivalentes, sin embargo la segunda, puede ser mas eficiente que la primera, pues
se en el momento que un elemento x no cumpla el predicado P , se termina la evaluacion,
sin tener que revisar todos los elemetos, como sucedera en la primera forma equivalente.
Aqu ponemos las dos versiones:
Negacion universal - 1
1
2
3

(define noParaTodo1
( (P A)
(neg (paraTodo P A))))

Negacion universal - 2
1
2
3

(define noParaTodo2
( (P A)
(existeUn ( (x) (neg (P x))) A)))

-AbC

La negacion existencial
De manera simiar, la negacion del cuantificador existencial tiene una interpretacion en el
lenguaje natural. De manera formal la negacion del cuantificador existencial se escribe
como:
x A : P (x)
Que ledo literalmente puede expresar algo como:
No es verdad que exista al menos un elemento x en su dominio A, se cumple P .
La frase anterior significa que todos los elementos en el dominio del cuantificador
existencial no cumplen el predicado. Esto nos da una pista sobre una manera equivalente de
expresar la negacion del cuantificador existencial.
Todos los elementos x en el dominio A, No cumplen el predicado P .
O tambien de manera mas coloquial: Ningun elemento x en el dominio A cumple P .
Observemos que la anterior construccion gramatical sugiere el uso de un cuantificador
universal:
x A : P (x)

-AbC

Podemos implementar las dos versiones


Negacion universal - 1
1
2
3

(define noExisteUn1
( (P A)
(neg (existeUn P A))))

Negacion universal - 2
1
2
3

(define noExisteUn2
( (P A)
(paraTodo ( (x) (neg (P x))) A)))

En terminos de eficiencia podemos decir que la implementacion que utiliza un cuantificador


existencial es una mejos solucion, aunque ambas soluciones tienen el mismo grado de
complejidad; y la razon es porque el cuantificador universal requiere recorrer toda la lista de
miembros del conjunto dominio antes de emitir una evaluacion, mientras que un
cuantificador existencial detiene las evaluaciones apenas se encuentre el primer miembro del
conjunto dominio que cumple con el predicado.

-AbC

Cuantificadores multivariable
Hasta ahora, los ejemplos que se han tratado con los cuantificadores han involucrado
solamente una variable, pero en muchos casos debemos tratar con mas de una.
Supongamos la siguiente frase coloquial: Todos los empleados estan certificados en todos
los programas de software. Esta frase involucra dos dominios, los empleados y los
programas de software. Para cada dominio debe existir una variable que se instancie con
cada miembro del conjunto dominio.
Si A es el dominio de los empleados, y B es el dominio de los programas de software,
formalmente podemos establecer:
x A : (y B : P (x, y))
Esta expresion significa que para cada valor instanciado de x, la variable y debera tomar
todos sus posible valores; una vez que y ha tomado todos los posibles valores, x puede
cambiar de valor. Esto continua hasta que y haya agotado sus posibilidades y x tambien.

-AbC

EJEMPLO
calcula el valor de predicado Todos los empleados estan certificados en todos los
programas de software, cuando los empleados son {ana, fer, cam}, mientras que las
oficinas son {sw1, sw2}.
x {ana, fer, cam} : (y {of1, of2} : P (x, y))
Est
a-certificado(ana, sw1)
Est
a-certificado(ana, sw2)
Est
a-certificado(f er, sw1)
Est
a-certificado(f er, sw2)
Est
a-certificado(cam, sw1)
Est
a-certificado(cam, sw2)
El valor de verdad resultante depende del valor de verdad de cada predicado instanciado.

-AbC

Mapeos
Computacionalmente hay una gran ventaja en el uso de los cuantificadores, en particular de
los elementos en los dominios de los cuantificadores, que aunque son conjuntos, pueden ser
vistos como listas.
La extension que describiremos se llama mapeo y va en el sentido de que el resultado de la
evaluacion no es una proposicion, sino que se evalua una expresion. Esto en realidad no es
nuevo en computacion, pues la implementacion de expresiones como if ejecuta/evalua una
expresion si el predicado es verdadero, en lugar de simplemente resolver #t y ejecuta/evalua
otra expresion si el predicado es falso, en lugar de simplemente reolver #f.
Cuando se desea modelar computacionalmente frases como: Todos los asistentes deben
registrarse, el resultado esperado es la evaluacion del procedimiento aplicado a cada
elemento del dominio, y eso reside en una nueva lista.
Es claro que cada uno de los miembros del dominio Asistentes debe realizar un
procedimiento. Aqu el cuantificador no es propiamente un predicado, sino que sirve como
control de un procedimiento iterativo que se lleva a cabo sobre todos los elementos del
conjunto dominio. Veamos el siguiente ejemplo:

-AbC

EJEMPLO
Si A es el conjunto de asistentes definido como A , {ana, sue, cam}, modele el mapeo
Todos los asistentes deben registrarse.
x A : (se-registra x)
(se-registra ana)
(se-registra sue)
(se-registra cam)
(ok err1 ok)

El resultado (ok err1 ok) esta estrechamente relacionado con el dominio (ana sue cam),
significa que el procedimiento (se-registra ana) genero el valor ok; (se-registra sue) genero el
valor err1 y (se-registra cam) genero el valor ok.

-AbC

Implementacion de los mapeos


En el lenguaje DrRacket, existe una expresion primitiva llamada
mapeos. La manera de escribir un mapeo es como sigue:

map,

que realiza los

(map <procedimiento> <dominio> ...)

donde:
1. map: es una palabra reservada, que indica que se debe realizar un mapeo utilizando el
procedimiento definido en cada elemento del dominio.
2. <procedimiento>: Es una expresion que debe ser evaluada, este procedimiento debe ser
expresado yasea mediante un identificador o descrito de manera anonima. Es
importante que la aridad6 del procedimiento concuerde con la cantidad de dominios.
3. <dominio> ...: Signfica uno o mas dominios. Todos los dominios debe tener la misma
cardinalidad, y el numero de dominios debe coincidir con la aridad del procedimiento.

La aridad de un procedimiento es la cantidad de argumentos que requiere, as


por ejemplo, el
predicado (neg p), requiere solamente 1 argumento, de modo que tiene aridad 1. La conjuncion (y p q)
requiere dos argumentos, de modo que tiene aridad 2.
-AbC

EJEMPLO
Supongamos que la siguiente es una lista de personas, especificando para cada persona el
porcentaje de satisfaccion sobre cierto producto: ((sue 70) (cam 50) (ana 90)), y el siguiente
procedimiento anonimo: ( (par) (porcentaje-en par)), que indica que para cada par, se debe
obtener el porcentaje. As, hacemos:
> (map
( (par) (porcentaje-en par))
((sue 70) (cam 50) (ana 90)))
>> (porcentaje-en (sue 70)) 70
>> (porcentaje-en (cam 50)) 50
>> (porcentaje-en (ana 90)) 90
(70 50 90)
>

-AbC

Mapeos uno a uno multivariable


La extension de utilizar procedimientos en los cuantificadores, en lugar de devolver un valor
de verdad, tambien se puede utilizar con mas de una variable anonima, en el siguiente
ejemplo se utilizan dos variables, y se desea generar una lista con la aplicacion de un
procedimiento a cada par de instancias.

-AbC

EJEMPLO
Cada elemento x del conjunto A, {1, 2, 3, 4}, debe estar asociado con un elemento del
conjunto B, {a, b, c, d}, de manera ordenada de acuerdo a la posicion en la que aparecen,
el 1 con a, el 2 con b, y as en adelante.
Mapeo uno a uno
1
2
3

(define mapeo1-1
( (P A B)
(map ( (x y) (P x y)) A B)))

> (mapeo1-1 list (1 2 3 4) (a b c d))


((1 a) (2 b) (3 c) (4 d))
>

En los mapeos uno a uno multivariable, se debe aplicar un procedimiento a una lista de
variables, el numero de variables indica el numero de dominios, todos los dominios deben
ser del mismo numero de elementos.
-AbC

Mapeos anidados multivariable


La version de mapeos multivariable anidados, como en la version uno a uno, se aplica un
procedimiento a una lista de variables, pero a diferencia de la version uno a uno, en la
version anidada no se requiere que cada dominio sea de la misma longitud. La aplicacion
del procedimiento se hace para todos los elementos de primer dominio, con todos los
elementos del segundo dominio, y as para cada dominio.

-AbC

EJEMPLO
Mapeo multivariable anidado
1
2
3

(define mapeo-anidado
( (P A B)
(map ( (x) (map ( (y) (P x y)) A)) B)))
> (mapeo-anidado list (1 2) (a b c))
(((a 1) (a 2)) ((b 1) (b 2)) ((c 1) (c 2)))
>

Figure: Mapeo multivariable anidado donde se aplica el procedimiento P a cada par de elementos,
el primero del primer dominio, con cada uno del segundo, y as hasta terminar con todos los
dominios; luego el segundo del primer dominio con cada uno del segundo y as hasta terminar los
dominios; y as hasta terminar.

-AbC

La cantidad de mapeos que se hacen en un mapeo multivariable anidado, esta en funcion


del numero de elementos de cada dominio.
Si A1 , A2 , . . . , Am son m dominios en un mapeo multivariable de m variables, y |A1 | = n1
es la cardinalidad del dominio A1 , |A2 | = n2 , y as en adelante hasta |Am | = nm , entonces
resultan n1 n2 nm aplicaciones del procedimiento.
El siguiente captulo se trata sobe hacer operaciones con conjuntos, crear procedimientos
que modifiquen conjuntos, o bien que generen conjuntos a partir de otros.

-AbC

Operaciones con conjuntos

-AbC

Agregar elementos a un conjunto


El primer modificador de conjuntos que necesitamos es una manera de agregar un elemento
a un conjunto.
Si A es un conjunto y e un elemento cualquiera, agregar el elemento e al conjunto A,
significa que e:
1. cumplira con las condiciones que hacen que un elemento pertenezca a un conjunto, si
el conjunto esta definido de manera implcita,
2. debera estar enlistado entre los elementos del conjunto, si el conjunto esta definido de
manera explcita.

EJEMPLO
Elemento Antes de agregar Despues de agregar
5
{1, 2, 3, 4}
{5, 1, 2, 3, 4}

-AbC

Agregar
Formalmente podemos definir la operacion de agregar como

Definicion (Agregar)
La operacion de agregar un elemento a un conjunto es un procedimiento que requiere un
elemento e y un conjunto C, y el resultado es un nuevo conjunto denotado por 1 (e, C),
que es el conjunto que reune a todos los elementos de A junto con el nuevo elemento e.
Se observa que | 1 (e, C)| = 1 + |C|; y que | 1 (e, C)| = 1 cuando C = .
Agregar un elemento a un conjunto
1
2
3
4
5
6
7
8
9
10
11
12
13
14

;; Formato:: agregar: <elemento> <conjunto> --> <conjunto>


;; Objetivo:: crear un conjunto con los elementos del conjunto dado junto con el nuevo elemento
;; Ejemplos:
;; > (agregar 3 (2 4 6 8 10))
;; (3 2 4 6 8 10)
;; > (agregar 3 ())
;; (3)
;; > (agregar () ())
;; (())
(define agregar
( (e C)
(if (pertenece? e C)
C
(cons e C))))

-AbC

Union de conjuntos
Definicion (Union de conjuntos)
Sean A y B dos conjuntos. La union de los conjuntos A y B es un nuevo conjunto
denotado por A B, cuyos miembros los conforman todos los miembros que pertenecen al
conjunto A o al conjunto B.

-AbC

Union (efectiva)
Definicion (Union de conjuntos)
Sean A y B dos conjuntos. La union de los conjuntos A y B es un nuevo conjunto
denotado por A B definido recursivamente como:

B
si A =
AB ,
0
A 1 (a0 , B) si A = (a0 A0 ) a0 B

Union de conjuntos
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

;; Formato: agregar : conjunto x conjunto -> conjunto


;; Proposito: construir un conjunto, haciendo la union de ellos
;; Ejemplos y casos de prueba:
;; > (union () (2 4 6 8 10))
;; (2 4 6 8 10)
;; > (union (5) (2 4 6 8 10))
;; (5 2 4 6 8 10)
;; > (union 3 ())
;; (3)
;; > (union () ())
;; ()
(define union
( (A B)
(if (empty? A)
B
(union (cdr A) (agregar (car A) B)))))

-AbC

EJEMPLO
Determina la union del conjunto A , {2, 4, 6, 8, 10} con el conjunto B , {1, 2, 3, 4, 5, 6, 7}
" YRMSR
"

-AbC

Interseccion
Definicion (Interseccion)
Si A y B son conjuntos, la interseccion de A con B es el conjunto denotado por A B
definido por los elementos que pertenecen al conjunto A y al conjunto B simultaneamente.
Efectivamente, la interseccion de los conjuntos A y B se logra definiendo una funcion
auxiliar que podemos llamar intrseccion auxiliar, que considera ademas, un conjunto auxiliar
C inicialmente vaco; esta interseccion auxiliar esta definida por

si B =

C
si A =

(A,
B, C) ,
0

(A
,
B,
1
(a
,
C))
si
a0 B

0
(A , B, C)
si a0 6 B
Hay varias cosas interesantes que comentar con esta definicion

-AbC

Hay varias cosas interesantes que comentar con esta definicion

1:
si

2:
C
si

(A,
B, C) ,
0

3: (A
, B, 1 (a0 , C)) si

4: (A , B, C)
si

B=
A=
a0 B
a0 6 B

i La notacion normal infija se ha modificado a una notacion tpica en las funciones,


dejando los argumentos encerrados entre parentesis.
ii Se trata de una definicion recursiva que contiene dos casos de salida y dos casos de
recursion.
iii A diferencia de las definiciones matematicas de multiples casos, las definiciones efectivas
de multiples casos se evaluan una por una de arriba hacia abajo.
iv Dado que la definicion formal de la interseccion no incluye un conjunto auxiliar C, se
requiere una definicion mas apropiada.

(A, B) , (A,
B, )

-AbC

TAREA
Escribe las definiciones en DrRacket de la interseccion auxiliar.
1. La funcion de interseccion auxiliar tiene un formato:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

;; <conjunto> <conjunto> <conjunto> <conjunto>


;;
;; Proposito: Construir un conjunto, haciendo la intersccion
;;
de los primeros dos conjuntos
;;
;; Ejemplos y casos de prueba:
HIRI MRXIVWIGGMSR EY\MPMEV
;; > (interseccion-auxiliar () (2 4 6 8 10) ())
;; ()
S %&'
;; > (interseccion-auxiliar (2 4 6 8 10) (11 12 13 14 15) ())
GSRH
&SSPIER " )\TVIWMSR "
;; ()
&SSPIER " )\TVIWMSR "
;; > (interseccion-auxiliar (2 4 6 8 10) (2 3 4 5) ())
&SSPIER " )\TVIWMSR "
;; (4 2)
&SSPIER " )\TVIWMSR "
(define interseccion-auxiliar
( (A B C)....)
;; > (interseccion (2 4 6 8 10) (2 3 4 5))
HIRI MRXIVWIGGMSR
;; (4 2)
S %&
(define interseccion
MRXIVWIGGMSR EY\MPMEV % & GSRNYRXS ZEGMS
( (A B)
(interseccion-auxiliar A B vacio)))

Es importante que cada definici


on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

Diferencia
Definicion (Diferencia)
Si A y B son conjuntos, la diferencia del conjunto A respecto del conjunto B es el
conjunto denotado por A \ B, que se compone de los elementos que pertenecen a A pero
que no pertenecen a B.

-AbC

Diferencia-efectiva
La diferencia del conjunto A respecto del conjunto B se puede definir efectivamente al
considerar un conjunto auxiliar C originalmente vaco, como

si A =
C
\(A0 , B, C)
\(A, B, C) ,
si a0 B
0
\(A , B, 1 (a0 , C)) si a0 6 B
Y al igual que la interseccion, esta definicion efectiva se complementa con

\(A, B) , \(A,
B, )

-AbC

TAREA
Escribe las definiciones en DrRacket de la diferencia de dos conjuntos.
1. La funcion de diferencia-auxiliar tiene un formato:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

;; <conjunto> <conjunto> <conjunto> <conjunto>


;;
;; Proposito: Construir un conjunto, haciendo la diferencia entre
;;
los primeros dos conjuntos
;;
;; Ejemplos y casos de prueba:
;; > (diferencia-auxiliar (1 2 3 4) (a b c) ())
;; (4 3 2 1)
;; > (diferencia-auxiliar () (a b c) ())
;; ()
;; > (diferencia-auxiliar (1 2 3 4) () ())
;; (4 3 2 1)
;; > (diferencia-auxiliar (1 2 3 4) (a b c 2 4) ())
;; (3 1)
;; >
(define diferencia-auxiliar
( (A B C)....)
;; > (diferencia (1 2 3 4) (a b c 2 4) ())
;; (3 1)
(define diferencia
( (A B)
(diferencia-auxiliar A B vacio)))

Es importante que cada definici


on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

Diferencia simetrica
Definicion (Diferencia simetrica)
La diferencia simetrica de dos conjuntos A y B, es un conjunto denotado por A 4 B, de
manera equivalente se puede denotar en forma de aplicacion de una funcion como 4(A, B)
y representa al conjunto de todos los elementos que pertenecen a A pero nno pertenecen a
B, junto con los elementos de B que no pertenecen al conjunto A.
diferencia-simetrica
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

;; <conjunto> <conjunto> <conjunto>


;;
;; Proposito: Construir un conjunto, haciendo la diferencia simetrica entre
;;
dos conjuntos
;;
;; Ejemplos y casos de prueba:
;; > (diferenciaSimetrica (1 2 3 4) (a b c 2 4))
;; (1 3 c b a)
;; > (diferenciaSimetrica (a b c 2 4) (1 2 3 4))
;; (a b c 3 1)
;; > (diferenciaSimetrica (a b c 2 4) ())
;; (a b c 2 4)
;; > (diferenciaSimetrica (1 2 3 4) ())
;; (1 2 3 4)
;; > (diferenciaSimetrica () ())
;; ()
;; >
(define diferencia-simetrica
( (A B)
(union (diferencia A B)
(diferencia B A))))

-AbC

EJERCICIO
Utiliza DrRacket para resolver los siguientes ejercicios. Escribe una R-expresion y escribe
el resultado.
I Si A , {a, b, c, d, e, f }, B , {a, d, f, y, u} y C , {x, y, z, q, a}, define:
i A
ii B
iii C

(define A (a b c d e f))

II Con A, B y C anteriores, calcula:


i
ii
iii
iv

A B (union A
AB
ABC
(A 4 C) B

B)(a b c d e f y u)

III Marca las expresiones verdaderas


i
ii
iii
iv
v







A B (subconjunto? A B)#f
f B
x 6 B
(A 4 C) (B 4 A)
(A \ C) (B 4 A) C (A C)

-AbC

TAREA
Considera el conjunto A como el conjunto de alumnos que cursan el cuarto ciclo en la
universidad, y B el conjunto de alumnos que toman el curso de Matematicas Discretas.
Considera que ya existen definiciones en DrRacket de estos conjuntos:
1
2

(define A (20 16 1 31 5 7 25 22 38 11 22 27 21 10 24 19 23 3 22 25))


(define B (15 32 21 10 16 14 29 30 9 18 7 8 20 24 27 17 18 22 5 36))

Una respuesta correcta tiene la forma:


1

(define X (diferencia (union A B) (interseccion B A)))

i Escribe la definicion en DrRacket de un conjunto C compuesto por los alumnos de


cuarto ciclo que se han matriculado en Matematicas Discretas.
ii Escribe la definicion en DrRacket de un conjunto D compuesto por los alumnos de
cuarto ciclo que no cursan Matematicas Discretas.
iii Escribe la definicion en DrRacket de un conjunto E compuesto por los alumnos que o
bien cursan el cuarto ciclo o que se han matriculado en Matematicas Discretas.
iv Escribe la definicion en DrRacket de un conjunto F compuesto por los alumnos que o
no cursan el cuarto ciclo o no se han matriculado en Matematicas Discretas.
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

TAREA
i Escribe un procedimiento en DrRacket llamado tu-numero que tome como entrada
tres conjuntos A, B y C; y devuelva como salida un numero entero entre 0 y 5 de
acuerdo a los siguientes casos:

1 si (A B) (A B C);

2 si (A B C) (A B);

3 si (A \ B) \ C A \ C;
tu-numero(A, B, C)
4 si (A \ C) (C \ B) = ;

5 si (B \ A) (C \ A) = (B C) \ A;

0 en otro caso .
ii El grado de similitud entre dos conjuntos esta determinado por una funcion llamada
similitud-conjuntos que toma como entrada dos conjuntos A y B, y devuelve como
salida un numero real entre 0 y 1, lo que se puede expresar con el formato
<conjunto> <conjunto> --> <real>:
similitud-conjuntos(A, B)

|A B|
;
|A B|

Escribe una definicion en DrRacket que calcule la similitud entre dos conjuntos dados.
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

Generalizaciones de la union
La union es una operacion binaria, esto significa que la union funciona con dos operandos, y
el resultado es un nuevo conjunto.
Es posible generalizar la operacion de union para que funcione con una lista de conjuntos.
Si A0 , A1 , A2 , . . . , An1 son conjuntos, la union generalizada es la union de todos los n
conjuntos:
n1
[

Ai = (A0 , A1 , A2 , . . . , An1 ) = (. . . ((A0 A1 ) A2 ) An1 )

i=0

El formato de la union generalizada se construye al considerar una lista de conjuntos como


entrada y un conjunto como salida:
<listaDe/conjunto> --> <conjunto>

-AbC

Efectivamente podemos definir la union generalizada con la ayuda de una funcion auxiliar
como:

B
si A =

(A, B) ,
0

(A , (A0 , B)) si A = (A0 A0 )


Que se complementa con
(A) , (A, )

TAREA
Escribe una definicion en DrRacket con el siguiente formato:
union-generalizada-auxiliar: <listaDe/conjunto> --> <conjunto>
1
2

(define union-generalizada-auxiliar
( (A B) ...))

de modo que se resuelva el problema de la union generalizada, de acuerdo a la definicion de


. Una vez hecha la definicion de la union-generalizada-auxiliar, agrega la siguiente definicion:
1
2
3
4
5
6
7
8

;; casos de prueba:
;; > (union-generalizada ((1 2 5 6) (3 6 9) (2 4 6) (9 7 5)))
;; (7 4 9 3 6 5 2 1)
;; > (union-generalizada ((1) () (2) (1 2 3 9 7 5)))
;; (5 7 9 3 2 1)
;; >
(define union-generalizada
( (A) (union-generalizada-auxiliar A vacio)))
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

Generalizaciones de la interseccion
Al igual que la union, la interseccion puede generalizarse para trabajar con una lista de
conjuntos. De modo que si A0 , A1 , A2 , . . . , An1 son conjuntos, la interseccion generalizada
se puede enterder como:
n1
\

Ai = (A0 , A1 , A2 , . . . , An1 ) = (. . . ((A0 A1 ) A2 ) An1 )

i=0

El formato de la interseccion generalizada se construye al considerar una lista de conjuntos


como entrada y un conjunto como salida:
<listaDe/conjunto> --> <conjunto>

-AbC

Efectivamente podemos definir la interseccion generalizada con la ayuda de una funcion


auxiliar como:

B
si A =

(A, B) ,
0

(A , (A0 , B)) si A = (A0 A0 )


Que se complementa con


si A =

(A) ,

(A, A0 ) si A = (A0 A0 )

TAREA
Escribe una definicion en DrRacket con el siguiente formato:
interseccion-generalizada-auxiliar: <listaDe/conjunto> --> <conjunto>
1
2

(define interseccion-generalizada-auxiliar
( (A B) ...))

de modo que se resuelva el problema de la union generalizada, de acuerdo a la definicion de


. Una vez hecha la definicion de la union-generalizada-auxiliar, agrega la siguiente definicion:
1
2
3
4
5
6
7
8
9
10
11

;; casos de prueba:
;; > (interseccion-generalizada ((1 2) (2 4 1 3) (8 1 9 2 6)))
;; (2 1)
;; > (interseccion-generalizada ((1 2) (2 4 1 3) (8 9 6)))
;; ()
;; >
(define interseccion-generalizada
( (A)
(if (empty? A)
()
(interseccion-generalizada-auxiliar A (car A)))))
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)
-AbC

TAREA
i Escribe una funcion en DrRacket llamada LConjuntos con las siguientes
especificaciones:
LConjuntos: <entero> --> <listaDe/conjunto>
; recibe un numero entero no negativo
; devuelve una lista de conjuntos

La lista que devuelve obedece la siguiente regla:


LConjuntos(n : Z0 ) {Ai |Ai , {0, . . . , i}, i = 0, . . . , n};
Ejemplos de entradas y salidas:
Entrada Llamada
Salida
0
LConjuntos(0) {{0}}
1
LConjuntos(1) {{0}, {0, 1}}
2
LConjuntos(2) {{0}, {0, 1}, {0, 1, 2}}
3
LConjuntos(3) {{0}, {0, 1}, {0, 1, 2}, {0, 1, 2, 3}}
> (LConjuntos 0)
((0))
> (LConjuntos 1)
((0) (0 1))
> (LConjuntos 2)
((0) (0 1) (0 1 2))
> (LConjuntos 3)
((0) (0 1) (0 1 2) (0 1 2 3))
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)
-AbC

Conjunto potencia
Uno de los conjuntos mas importantes que se deben estudiar es el conjunto conocido como
el Conjunto potencia, que es el conjunto de todos los subconjuntos de un conjunto.
Si A es un conjunto, el conjunto potencia suele representarse por el smbolo P(A), o
tambien por 2A , en este curso se utilizara la primera.
El conjunto potencia es importante porque ofrece un panorama general de todas las
posibles agrupaciones con sus elementos, por ejemplo, en el problema de encontrar cual es
el mejor equipo de trabajo de un grupo de colaboradores, cuando se debe asignar un equipo
de trabajo a una tarea.

EJEMPLO
Si A , {antonio, briana, claudia}, el conjunto potencia del conjunto A es
{{}, {antonio}, {briana}, {briana, antonio}, {claudia},
{claudia, antonio}, {claudia, briana}, {claudia, briana, antonio}}

-AbC

Cuando A es un conjunto y |A| = n, se tiene que |P(A)| = 1 cuando n = 0 y |P(A)| = 2n


cuando n > 0.
La razon se puede analizar recursivamente:
Caso base: Cuando A = , el unico subconjunto es , y P(A) = {{}}, que tiene un unico
elemento, el conjunto vaco.
Caso recursivo: Cuando |A| > 0, esto es, cuando A = (a0 A0 ), el conjunto potencia de A,
se obtiene al hacer:
P(A) , [P(A0 )] [ c P(A0 ) :1 (a0 , c)]

-AbC

TAREA
Escribe las definiciones necesarias en DrRacket para calcular el conjunto potencia de un
conjunto. La funcion del conjunto potencia debe tener el siguiente formato:
1
2
3
4
5

; conjunto-potencia: <conjunto> --> <listaDe/conjunto>


; recibe un conjunto en forma de lista, como (a b c)
; devuelve una lista de conjuntos, como ((c b a) (c b) (c a) (c) (b a) (b) (a) ())
(define conjunto-potencia
( (A) ... ))

He aqu unos ejemplos para que te sirvan de gua.


> (conjunto-potencia (a b c))
((c b a) (c b) (c a) (c) (b a) (b) (a) ())
> (conjunto-potencia (a b))
((b a) (b) (a) ())
> (conjunto-potencia (a))
((a) ())
> (conjunto-potencia ())
(())
>

HIRI EKVIKEV IR GEHE


S 0' I
0' IW YRE PMWXE HI GSRNYRXSW GSQS
QET S WYFGSRNYRXS GSRW I WYFGSRNYRXS 0'

HIRI GSRN TSXIRGME


S %
MJ IW ZEGMS# %

Es importante que cada definici


on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)
PIX GT ERX GSRN TSXIRGME GHV %
ETTIRH GT ERX
EKVIKEV IR GEHE GT ERX
GEV %

-AbC

Cubrimientos y particiones
Definicion (Cubrimiento)
Si A es un conjunto, y A1 , A2 , . . . , An son n subconjuntos de A, decimos que
{A1 , A2 , . . . , An } P(A) forman un cubrimiento de A si satisface la condicion
n
[

Ai = A

i=1

-AbC

Definicion (Particion)
Si A es un conjunto y A1 , A2 , . . . , An son n subconjuntos de A, decimos que
{A1 , A2 , . . . , An } P(A) forman una particion de A si
i A1 , A2 , . . . , An forma un cubrimiento y
ii Ai Aj = , con 1 i, j n y i 6= j

-AbC

TAREA
1. Escribe las definiciones necesarias para determinar si un subconjunto de conjuntos
forma un cubrimiento, de acuerdo al siguiente formato:
1
2
3
4
5
6

; cubrimiento?: <listaDe/conjunto> <conjunto>--> <Booleano>


; recibe una lista de conjuntos LC, como ((c) (b a) (b) (a)) y un conjunto A
; devuelve #t si la lista de conjuntos LC es un cubrimiento para el conjunto A dado
; o #f si no es un cubrimiento
(define cubrimiento?
( (LC A) ... ))
> (cubrimiento? ((a b) (c d) (a d)) (a b c d))
#t
> (cubrimiento? ((a b) (c d) (a d)) (a b c d e))
#f
>

2. Escribe las definiciones necesarias para determinar si un subconjunto de conjuntos


forma una particion, de acuerdo al siguiente formato:
1
2
3
4
5
6

; particion?: <listaDe/conjunto> <conjunto>--> <Booleano>


; recibe una lista de conjuntos LC, como ((c) (b a) (b) (a)) y un conjunto A
; devuelve #t si la lista de conjuntos LC es una particion para el conjunto A dado
; o #f si no es una particion
(define particion?
( (LC A) ... ))
> > (particion? ((a b) (c d)) (a b c d))
#t
> (particion? ((a b) (c d) (a d)) (a b c d))
#f
>

Es importante que cada definici


on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)
-AbC

Par
Definicion (Par)
Si a y b son dos elementos cualesquiera, el par ha, bi es un objeto matematico que agrupa
los elementos a y b en ese orden. En la terminologa DrRacket, escribiremos (a b) para
denotar el par ha, bi.
Podemos construir algunos procedimientos para construir pares y para manipular los
elementos de un par.
Crear un par con dos elementos dados
1
2
3
4
5
6
7
8
9
10
11
12
13

;; Formato:: crear-par: <elemento> <elemento> --> <par>


;; Objetivo:: crear un par con los elementos dados
;; Ejemplos:
;; > (par 2 3)
;; (2 3)
;; > (par 3 2)
;; (3 2)
;; >
(define crear-par
( (a b)
(if (pair? b)
(cons a b)
(cons a (list b)))))
> (crear-par 2 3)
(2 3)
> (pair? (crear-par 2 3))
#t
>

HIRI GVIEV TEV


S EF
GSRW E MJ IW TEV# F F PMWX F
" GVIEV TEV E F G
EFG

-AbC

Es necesario tambien tener manera de obtener el primer elemento (y el segundo elemento)


de un par, esto es con el fin de poder manipular los datos.
Obtener el primer/segundo elemento de un par
1
2
3
4
5
6
7
8
9
10
11

;; Formato:: primero-de-par: <par> --> <elemento>


;; Objetivo:: Obtener la primera entrada de un par
;; Ejemplos:
;; > (primero-de-par (crear-par 2 3))
;; 2
;; > (primero-de-par (3 2))
;; 3
:: >
(define primero-de-par
( (p)
(car p)))

12
13
14
15
16
17
18
19
20
21
22
23

;; Formato:: segundo-de-par: <par> --> <elemento>


;; Objetivo:: Obtener la segunda entrada de un par
;; Ejemplos:
;; > (segundo-de-par (crear-par 2 3))
;; 3
;; > (segundo-de-par (3 2))
;; 2
:: >
(define segundo-de-par
( (p)
(car (cdr p))))

-AbC

Producto cartesiano
Definicion (Producto cartesiano)
Sean A y B dos conjuntos. El prodcuto cartesiano del conjunto A con el conjunto B se
escribe como A B, y es el conjunto de todos los pares que se pueden formar con los
elementos del conjunto A en primer lugar, y los elementos del conjunto B en segundo lugar.
A B , {(a, b)|a A b B}

EJEMPLO
Supongamos que A , {1, 2, 3} y B , {a, b, c}. EL producto cartesiano A B es
{h1, ai, h1, bi, h1, ci, h2, ai, h2, bi, h2, ci, h3, ai, h3, bi, h3, ci}

HIRI TVSHYGXS GEVXIWMERS


S %&
ETTIRH TEVE XSHS S E

TEVE XSHS

S F

GVIEV TEV E F

&

-AbC

Producto cartesiano - generalizacion


EJEMPLO
Calcular el producto cartesiano del conjunto A , {a, b, c}.
En este caso, el resultado es el conjunto de todas las tuplas tales que el primer elemento
pertenece al conjunto A.
(A) {hai, hbi, hci}

En general, si A1 , A2 , . . . , An es una lista de conjuntos, el producto generalizado de los


conjuntos A1 , A2 , . . . , An se escribe como (A1 , A2 , . . . , An ) y se puede calcular
recursivamente7 como


si C = ;

(C) ,
(C0 , (C 0 )) si C = (C0 C 0 ).

Pero esta definici


on genera procesos recursivos.
-AbC

TAREA
Escribe las definiciones en DrRacket necesarias para calcular el producto cartesiano
generalizado de una lista de conjuntos, de acuerdo con el siguiente formato:
producto-cartesiano*: <listaDe/conjunto> --> <listaDe/tuplas>
; recibe una lista de conjuntos
; devuelve una lista de tuplas
(producto-cartesiano*
( LC ;<---- nota que no va entre parentesis, son argumentos tipo rest
...))

Estos ejemplos te deben servir de guia:


> (producto-cartesiano*)
()
> (producto-cartesiano* (1 2 3))
((1) (2) (3))
> (producto-cartesiano* (1 2 3) (x y z))
((3 z) (3 y) (3 x) (2 z) (2 y) (2 x) (1 z) (1 y) (1 x))
> (producto-cartesiano* (1 2 3) (x y z) (a b))
((3 x a) (3 x b) (3 y a) (3 y b) (3 z a) (3 z b) (2 x a) (2 x b) (2 y a) (2 y b) (2 z a) (2 z b)
(1 x a) (1 x b) (1 y a) (1 y b) (1 z a) (1 z b))
>
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

Relaciones

-AbC

Relaciones
Una relacion es una regla que asocia elementos de un conjunto con elementos de otro
conjunto. Formalmente podemos establecer la siguiente

Definicion (Relacion)
Si A y B son conjuntos, una relacion R es el conjunto llamado R : A B
R : A B , {ha, bi A B|a A b B}
Observamos que (R : A B) A B. Por comodidad, solamente escribimos R cuando
ya es clara la referencia a los conjuntos A y B. As
RAB

Las relaciones son importantes en computacion porque modelan maquinas que transforman
datos de entrada con informacion de salida.
-AbC

Relaciones explcitas
En este curso utilizaremos frecuentemente relaciones descritas explcitamente, esto es,
enlistando cada par que pertenece a la relacion.

EJEMPLO
20
Esta es una relacion implcitamente definida. R , {(a, b)|a Z20
0 b Z0 : a = 2b}

EJEMPLO
Esta es la misma relacion del ejemplo anterior, pero definida de manera explcita.
R , {h0, 0i, h2, 1i, h4, 2i, h6, 3i, h8, 4i, h10, 5i, h12, 6i, h14, 7i, h16, 8i, h18, 9i, h20, 10i}
> (filter-not ( (x) (equal? x #f))
(append*
(map ( (a) (map ( (b) (if (= a (* 2 b))
(crear-tupla a b)
#f))
(build-list 21 values)))
(build-list 21 values))))
((0 0) (2 1) (4 2) (6 3) (8 4) (10 5) (12 6) (14 7) (16 8) (18 9) (20 10))
>

-AbC

Definicion (Dominio)
El dominio de una relacion R : A B se escribe como Dom(R : A B) y es
Dom(R : A B) , {a A|b B : (a, b) R}
Cuando es claro que R : A B y no hay lugar a dudas respecto de quienes son los
conjuntos A y B, se puede escribir simplemente R para establecer la relacion, y as
podemos escribir el Dom(R).
Cuando A = Dom(R : A B), entonces decimos que la relacion esta completamente
definida. Y cuando Dom(R : A B) A, entonces la relacion R : A B es una
relacion parcialmente definida.

-AbC

TAREA
Escribe una funcion para obtener el dominio de una relacion definida de manera explcita.
El formato es el siguiente.
; dominio: <listaDe/tuplas> <conjunto> <conjunto> --> <conjunto>
; recibe la relaci\on como una lista de tuplas,
;
el <conjunto> dominio y el <conjunto> codominio
; devuelve un <conjunto> de los elementos del dominio
;
que tienen relacion con algun elemento del codominio.
(define dominio
( (R A B) ; se da la lista de pares, el conjunto dominio y el cod.
...))

Los siguientes ejemplos te deben servir de guia.


> (dominio
(1 2 3 4)
> (dominio
(1 2 3)
> (dominio
(1 2 3)
> (dominio
()
>

((1 2) (2 3) (3 4) (4 1)) (1 2 3 4) (1 2 3 4))


((1 2) (2 3) (3 4) ) (1 2 3 4) (1 2 3 4))
((1 2) (2 3) (3 4) (4 1)) (1 2 3) (1 2 3 4))
((1 2) (2 3) (3 4) (4 1)) (1 2 3 4) ())

Es importante que cada definici


on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

Definicion (Codominio)
Si A y B son conjuntos, y R : A B es una relacion, el conjunto B es conocido como el
codominio de la relacion. El codominio de una relacion puede escribirse como
Cod(R : A B), y nuevamente, cuando los conjuntos A y B son conocidos y claramente
reconocidos, pueden omitirse de la notacion, para escribir Cod(R).
Cod(R : A B) , B.

El codominio son todos los valores con los que algun elemento del dominio podra estar
relacionado.

-AbC

TAREA
Escribe una funcion para obtener el codominio de una relacion definida de manera
explcita. El formato es el siguiente.
; codominio: <listaDe/tuplas> <conjunto> <conjunto> --> <conjunto>
; recibe la relaci\on como una lista de tuplas,
;
el <conjunto> dominio y el <conjunto> codominio
; devuelve un <conjunto> de los elementos del codominio
(define codominio
( (R A B) ; se da la lista de pares, el conjunto dominio y el cod.
...))

Los siguientes ejemplos te deben servir de guia.


> (codominio ((1 2) (2 3) (3 4) (4 1)) (1 2 3 4) (1 2 3 4))
(1 2 3 4)
> (codominio ((1 2) (2 3) (3 4) ) (1 2 3 4) (1 2 3 4))
(1 2 3 4)
> (codominio ((1 2) (2 3) (3 4) (4 1)) (1 2 3 4) ())
()
>
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

Definicion (Rango)
Si R : A B es una relacion tal que Dom(R : A B) = A y Cod(R : A B) = B, el
rango de la relacion se escribe como Ran(R : A B), y
Ran(R : A B) , {b B|a A : (a, b) R}.
El rango de una relacion y la im
agen de la relaci
on son conceptos sinonimos, sin
embargo, el termino imagen se utilizara con otro fin.

-AbC

TAREA
Escribe una funcion para obtener el rango de una relacion definida de manera explcita. El
formato es el siguiente.
; rango: <listaDe/tuplas> <conjunto> <conjunto> --> <conjunto>
; recibe la relaci\on como una lista de tuplas,
;
el <conjunto> dominio y el <conjunto> codominio
; devuelve un <conjunto> de los elementos que foman el rango de la relacion
(define rango
( (R A B) ; se da la lista de pares, el conjunto dominio y el cod.
...))

Los siguientes ejemplos te deben servir de guia.


> (rango
(1 3 2)
> (rango
(3 2)
> (rango
(5 3 2)
> (rango
()
> (rango
(3 2)
> (rango
()
>

((1 2) (1 3) (4 1) (4 2)) (1 2 3 4) (1 2 3 4 5 6))


((1 2) (1 3)) (1 2 3) (1 2 3 4 5 6))
((1 2) (1 3) (2 5)) (1 2 3) (1 2 3 4 5 6))
((1 2) (1 3) (2 5)) (1 2 3) (1))
((1 2) (1 3) (2 5)) (1) (1 2 3 4 5 6))
((1 2) (1 3) (2 5)) (4) (1 2 3 4 5 6))

Es importante que cada definici


on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

Aplicacion de las relaciones


Supongamos que R : A B es una relacion (con dominio en A y codominio en B). Si
a A y existe un elemento b B (pueden haber mas de uno), de tal forma que (a, b) R,
decimos que a esta relacionados con b, y lo podemos denotar de varias formas:
I aRb: a est
a relacionado con b por medio de R, (lo contrario es a 6 Rb)
I (a, b) R: a est
a relacionado con b en la relacion R, (lo contrario es (a, b) 6 R)
I b = R(a) : b es la imagen de a bajo R.
I R(a) = b : la imagen de a bajo la relaci
on R es b.
I ImR (a): b es la imagen de a bajo R.

-AbC

En las relaciones, es posible que un elemento a Dom(R : A B) este relacionado con


uno o mas elementos del Cod(R : A B), veamos el siguiente ejemplo.

EJEMPLO
En la relacion R , {h1, 2i, h2, 3i, h2, 1i, h3, 4i}, con dominio en A , {1, 2, 3, 4} y
codominio en {1, 2, 3, 4}, cual es la imagen de 2?

-AbC

Definicion (Imagen de un elemento del dominio)


Sea R : A B una relacion y a Dom(R). La imagen de a bajo R se escribe como
ImR (a) y es el conjunto
ImR (a) , {b B|(a, b) R}

-AbC

TAREA
Escribe una definicion en DrRacket que dada una relacion, permita obtener la imagen de
un elemento del dominio, de acuerdo con el siguiente formato.
; imagen: <elemento> <listaDe/tuplas> <conjunto> <conjunto> --> <conjunto>
; recibe: a) un <elemento> en el dominio de la relacion
;
b) una relacion, con forma de lista de tuplas. p.ej. ((1 2) (2 1))
;
c) El conjunto dominio de la relacion
;
d) El conjunto codominio de la relacion
; devuelve: un <conjunto> de los elementos que foman la imagen del <elemento> en la <relacion>
(define imagen
( (a R A B)
...))

Los siguientes ejemplos te deben servir de guia.


> (imagen 5 ((1 2) (2 3) (3 4) (4 3) (5 2) (2 5) (5 5) (5 4)) (1 2 3 4 5) (1 2 3 4 5))
(2 4 5)
> (imagen 8 ((1 2) (2 3) (3 4) (4 3) (5 2) (2 5) (5 5) (5 4)) (1 2 3 4 5) (1 2 3 4 5))
()
> (imagen 2 ((1 2) (2 3) (3 4) (4 3) (5 2) (2 5) (5 5) (5 4)) (1 2 3 4 5) (1 2 3 4 5))
(3 5)
>
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

Definicion (Imagen de un subconjunto del dominio)


Sea R : A B una relacion y A0 A. La imagen de A0 bajo R se escribe como ImR (A) y
es el conjunto
[
ImR (a)
ImR (A0 ) ,
aA0

-AbC

TAREA
Escribe una definicion en DrRacket que dada una relacion, permita obtener la imagen de
un subconjunto del dominio, de acuerdo con el siguiente formato.
; imagen*: <conjunto> <listaDe/tuplas> <conjunto> <conjunto> --> <conjunto>
; recibe: a) un <subconjunto> del dominio de la relacion
;
b) una relacion, con forma de lista de tuplas. p.ej. ((1 2) (2 1))
;
c) El conjunto dominio de la relacion
;
d) El conjunto codominio de la relacion
; devuelve: un <conjunto> de los elementos que foman la imagen del <conjunto> que es
;
subconjunto en el dominio de la <relacion>
(define imagen*
( (C R A B)
...))

Los siguientes ejemplos te deben servir de guia.


> (imagen* (5 2) ((1 2) (2 3) (3 4) (4 3) (5 2) (2 5) (5 5) (5 4)) (1 2 3 4 5) (1 2 3 4 5))
(3 5 4 2)
> (imagen* () ((1 2) (2 3) (3 4) (4 3) (5 2) (2 5) (5 5) (5 4)) (1 2 3 4 5) (1 2 3 4 5))
()
> (imagen* (1 2 3 4 5) ((1 2) (2 3) (3 4) (4 3) (5 2) (2 5) (5 5) (5 4)) (1 2 3 4 5) (1 2 3 4 5))
(4 5 3 2)
>
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

Representacion de las relaciones


Hay varias manera de representar relaciones, algunas de estas vamos a estudiar.
Tabla de una relaci
on
La tabla de una relacion es un arreglo bidimensional que permite saber que elementos estan
relacionados con cuales elementos. Si R : A B es una relacion, donde |A| = m y
|B| = n, la tabla de R es una matriz de orden m n, con cada elemento de A encabezando
las filas y cada elemento de B encabezando las columnas. Una entrada en la tabla ri,j = 1
si el elemento ai del dominio, esta relacionado con el elemento bj del codominio.
b1 b2 . . .

bj . . .

bm

a1
a2
..
.
ai
..
.
an

-AbC

EJEMPLO
Escribe la tabla de la relacion R , {h1, 2i, h2, 3i, h2, 1i, h3, 4i}, con dominio en
A , {1, 2, 3, 4} y codominio en {1, 2, 3, 4}.

-AbC

Diagrama sagital
Un diagrama sagital es frecuentemente utilizado para representar las relaciones binarias. Se
hace primero agrupando en un ovalo a la izquierda, los elementos del dominio y a la
derecha los elementos del codominio, y entonces unir con flechas de izquierda a derecha,
para cada elemento del dominio una flecha hacia el elemento del codominio que esta siendo
relacionado.

EJEMPLO
Dibuja el diagrama sagital de la relacion R , {h1, 2i, h2, 3i, h2, 1i, h3, 4i}, con dominio en
A , {1, 2, 3, 4} y codominio en {1, 2, 3, 4}.

Otra representacion es mediante grafos, pero ese tema se tratara posteriormente.

-AbC

Propiedades de las relaciones


En computacion, muchas veces tendremos la necesidad de utilizar relaciones donde el
dominio y codominio de la relacion es el mismo conjunto. Cuando sucede que R : A A,
decimos que la relacion esta definida sobre el conjunto A (en lugar de decir del conjunto A
al conjunto B).

-AbC

Definicion (Reflexion)
Sea R : A A una relacion. Decimos que R es reflexiva si se cumple que
a Dom(R) : ha, ai R
Para modelar una funcion que determine si una relacion es reflexiva, seguiremos el siguiente
formato:
; reflexiva?: <listaDe/tuplas> <conjunto> <conjunto> --> <booleano>
; recibe: a) una relacion, con forma de lista de tuplas. p.ej. ((1 2) (2 1))
;
b) El conjunto dominio de la relacion
;
c) El conjunto codominio de la relacion
; devuelve: un <booleano> es un valor de verdad. #t si la relacion es reflexiva, #f de otro modo
(define reflexiva?
( (R A B)
...))

Determina si una relacion es reflexiva


1
2
3
4
5
6
7
8
9

; reflexiva?: <listaDe/tuplas> <conjunto> <conjunto> --> <booleano>


; recibe: a) una relacion, con forma de lista de tuplas. p.ej. ((1 2) (2 1))
;
b) El conjunto dominio de la relacion
;
c) El conjunto codominio de la relacion
; devuelve: un <booleano> es un valor de verdad. #t si la relacion es reflexiva, #f de otro modo
(define reflexiva?
( (R A B)
(andmap ( (a) (pertenece? (crear-tupla a a) R))
(dominio R A B))))

-AbC

Determina si una relacion es reflexiva


1
2
3
4
5
6
7
8
9

; reflexiva?: <listaDe/tuplas> <conjunto> <conjunto> --> <booleano>


; recibe: a) una relacion, con forma de lista de tuplas. p.ej. ((1 2) (2 1))
;
b) El conjunto dominio de la relacion
;
c) El conjunto codominio de la relacion
; devuelve: un <booleano> es un valor de verdad. #t si la relacion es reflexiva, #f de otro modo
(define reflexiva?
( (R A B)
(andmap ( (a) (pertenece? (crear-tupla a a) R))
(dominio R A B))))
> (reflexiva? ((1
#f
> (reflexiva? ((1
(1 2
(1 2
#t
>

2) (2 3) (3 4) (4 3) (5 2) (2 5) (5 5) (5 4)) (1 2 3 4 5) (1 2 3 4 5))
1) (2 2) (3 3) (4 4) (5 5) (1 2) (2 3) (3 4) (4 3) (5 2) (2 5) (5 4))
3 4 5)
3 4 5))

-AbC

Propiedades de las relaciones


Definicion (Irreflexion)
Sea R : A A una relacion. Decimos que R es irreflexiva si se cumple que
a Dom(R) : ha, ai 6 R

-AbC

TAREA
Escribe una definicion en DrRacket que dada una relacion, decida si es irreflexiva o no lo
es de acuerdo con el siguiente formato.
; irreflexiva?: <listaDe/tuplas> <conjunto> <conjunto> --> <booleano>
; recibe: a) una relacion, con forma de lista de tuplas. p.ej. ((1 2) (2 1))
;
b) El conjunto dominio de la relacion
;
c) El conjunto codominio de la relacion
; devuelve: un <booleano> es un valor de verdad. #t si la relacion es irreflexiva, #f de otro modo
(define irreflexiva?
( (R A B)
...))

Los siguientes ejemplos te deben servir de guia.


> (irreflexiva? ((1 2)
(1 2 3 4
(1 2 3 4
#f
> (irreflexiva? ((1 2)
(1 2 3 4
(1 2 3 4
#t
> (irreflexiva? ((1 1)
(1 2 3 4
(1 2 3 4
#f
>

(2 3) (3 4) (4 3) (5 2) (2 5) (5 5) (5 4))
5)
5))
(2 3) (3 4) (4 3) (5 2) (2 5) (5 4))
5)
5))
(2 2) (3 3) (4 4) (5 5) (1 2) (2 3) (3 4) (4 3) (5 2) (2 5) (5 4))
5)
5))

Es importante que cada definici


on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

Propiedades de las relaciones


Definicion (Simetra)
Sea R : A A una relacion. Decimos que R es sim
etrica si se cumple que
a1 Dom(R) :
a2 Dom(R) : ha1 , a2 i R ha2 , a1 i R

-AbC

TAREA
Escribe una definicion en DrRacket que dada una relacion, decida si es simetrica o no lo
es, de acuerdo con el siguiente formato.
; simetrica?: <listaDe/tuplas> <conjunto> <conjunto> --> <booleano>
; recibe: a) una relacion, con forma de lista de tuplas. p.ej. ((1 2) (2 1))
;
b) El conjunto dominio de la relacion
;
c) El conjunto codominio de la relacion
; devuelve: un <booleano> es un valor de verdad. #t si la relacion es simetrica, #f de otro modo
(define simetrica?
( (R A B)
...))

Los siguientes ejemplos te deben servir de guia.


> (simetrica? ((1 2) (1 1) (2 2) (3 1) (3 3)) (1 2 3) (1 2 3))
#f
> (simetrica? ((1 2) (1 3) (1 1) (2 2) (2 1) (3 1) (3 3)) (1 2 3) (1 2 3))
#t
>
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

Propiedades de las relaciones


Definicion (Asimetra)
Sea R : A A una relacion. Decimos que R es asim
etrica si se cumple que
a1 Dom(R) :
a2 Dom(R) : ha1 , a2 i R ha2 , a1 i 6 R

-AbC

TAREA
Escribe una definicion en DrRacket que dada una relacion, decida si es asimetrica o no lo
es, de acuerdo con el siguiente formato.
; asimetrica?: <listaDe/tuplas> <conjunto> <conjunto> --> <booleano>
; recibe: a) una relacion, con forma de lista de tuplas. p.ej. ((1 2) (2 1))
;
b) El conjunto dominio de la relacion
;
c) El conjunto codominio de la relacion
; devuelve: un <booleano> es un valor de verdad. #t si la relacion es asimetrica, #f de otro modo
(define asimetrica?
( (R A B)
...))

Los siguientes ejemplos te deben servir de guia.


> (asimetrica? ((1 2) (1 3) (1 1) (2 2) (2 1) (3 1) (3 3)) (1 2 3) (1 2 3))
#f
> (asimetrica? ((1 2) (1 3) (3 2)) (1 2 3) (1 2 3))
#t
> (asimetrica? ((1 2) (1 3) (3 2) (2 3)) (1 2 3) (1 2 3))
#f
>
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

Propiedades de las relaciones


Definicion (Antisimetra)
Sea R : A A una relacion. Decimos que R es antisim
etrica si se cumple que
a1 Dom(R) :
a2 Dom(R) : ha1 , a2 i R ha2 , a1 i R a1 = a2

-AbC

TAREA
Escribe una definicion en DrRacket que dada una relacion, decida si es antisimetrica o no
lo es, de acuerdo con el siguiente formato.
; antisimetrica?: <listaDe/tuplas> <conjunto> <conjunto> --> <booleano>
; recibe: a) una relacion, con forma de lista de tuplas. p.ej. ((1 2) (2 1))
;
b) El conjunto dominio de la relacion
;
c) El conjunto codominio de la relacion
; devuelve: un <booleano> es un valor de verdad. #t si la relacion es antisimetrica, #f de otro modo
(define antisimetrica?
( (R A B)
...))

Los siguientes ejemplos te deben servir de guia.


> (antisimetrica? ((1 1)) (1 2 3) (1 2 3))
#t
> (antisimetrica? ((1 1) (2 2) (3 3)) (1 2 3) (1 2 3))
#t
> (antisimetrica? ((1 1) (2 2) (3 3) (1 2) (2 1)) (1 2 3) (1 2 3))
#f
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

Propiedades de las relaciones


Definicion (Transitividad)
Sea R : A A una relacion. Decimos que R es transitiva si se cumple que
a1 Dom(R) :
a2 Dom(R) :
a3 Dom(R) : ha1 , a2 i R ha2 , a3 i R ha1 , a3 i R

-AbC

TAREA
Escribe una definicion en DrRacket que dada una relacion, decida si es transitiva o no lo
es, de acuerdo con el siguiente formato.
; transitiva?: <listaDe/tuplas> <conjunto> <conjunto> --> <booleano>
; recibe: a) una relacion, con forma de lista de tuplas. p.ej. ((1 2) (2 1))
;
b) El conjunto dominio de la relacion
;
c) El conjunto codominio de la relacion
; devuelve: un <booleano> es un valor de verdad. #t si la relacion es transitiva, #f de otro modo
(define transitiva?
( (R A B)
...))

Los siguientes ejemplos te deben servir de guia.


> (transitiva?
#f
> (transitiva?
#f
> (transitiva?
#f
> (transitiva?
#f
> (transitiva?
#t
>

((1 2) (2 3) (1 3) (3 1) (1 1)) (1 2 3) (1 2 3))


((1 2) (2 3) (1 3) (3 1) (2 1) (1 1)) (1 2 3) (1 2 3))
((1 2) (2 3) (1 3) (3 1) (2 1) (1 1) (2 2)) (1 2 3) (1 2 3))
((1 2) (2 3) (1 3) (3 1) (2 1) (1 1) (2 2) (3 3)) (1 2 3) (1 2 3))
((1 2) (2 3) (3 2) (1 3) (3 1) (2 1) (1 1) (2 2) (3 3)) (1 2 3) (1 2 3))

Es importante que cada definici


on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

Definicion (Equivalencia)
Sea R : A A una relacion. Decimos que R es una relaci
on de equivalencia si se
cumple que
i R es reflexiva, y
ii R es simetrica, y
iii R es transitiva

-AbC

La definicion en DrRacket que determina si una relacion es una relacion de equivalencia


resulta simple, cuando ya se han realizado las definiciones para determinar reflexion,
simetra y transitividad:
Determina si una relacion es reflexiva
1
2
3
4
5
6
7
8
9
10
11

; equivalencia?: <listaDe/tuplas> <conjunto> <conjunto> --> <booleano>


; recibe: a) una relacion, con forma de lista de tuplas. p.ej. ((1 2) (2 1))
;
b) El conjunto dominio de la relacion
;
c) El conjunto codominio de la relacion
; devuelve: un <booleano> es un valor de verdad. #t si la relacion es una relacion de equivalencia,
;
#f de otro modo
(define equivalencia?
( (R A B)
(and (reflexiva? R A B)
(simetrica? R A B)
(transitiva? R A B))))

EJEMPLO
Sea R : A A definida como R , {h1, 1i, h2, 2i, h3, 3i, h2, 3i, h3, 2i} y el dominio (igual
que el codominio) es el conjunto A , {1, 2, 3}, determina si R es una relacion de
equivalencia.
> (equivalencia? ((1 1) (2 2) (3 3) (2 3) (3 2)) (1 2 3) (1 2 3))
#t

-AbC

Definicion (Clase de equivalencia)


Sea R es una relacion sobre A (Es una relacion con formato R : A A). Si a A,
entonces
[a] , {x A|hx, ai R}
decimos que [a] define la clase de equivalencia del elemento a, y contiene a todos los
elementos de A que se relacionan con a.

-AbC

TAREA
Escribe una definicion en DrRacket que dado un elemento en el dominio de la relacion, y
una relacion con su dominio y codominio, calcule la clase de equivalencia del elemento
dado, de acuerdo con el siguiente formato.
; clase-equivalencia?: <elemento> <listaDe/tuplas> <conjunto> <conjunto> --> <conjunto>
; recibe: a) un elemento en el dominio de la relacion
;
b) una relacion, con forma de lista de tuplas. p.ej. ((1 2) (2 1))
;
c) El conjunto dominio de la relacion
;
d) El conjunto codominio de la relacion
; devuelve: un <conjunto> de elementos, que conforman la clase de equivalencia del <elemento> dado.
(define clase-equivalencia?
( (a R A B)
...))

Los siguientes ejemplos te deben servir de guia.


> (dominio ((1 1) (2
(1 2 3)
> (clase-equivalencia
(2 3)
> (clase-equivalencia
(1)
> (clase-equivalencia
(2 3)
>

2) (3 3) (2 3) (3 2)) (1 2 3) (1 2 3))
2 ((1 1) (2 2) (3 3) (2 3) (3 2)) (1 2 3) (1 2 3))
1 ((1 1) (2 2) (3 3) (2 3) (3 2)) (1 2 3) (1 2 3))
3 ((1 1) (2 2) (3 3) (2 3) (3 2)) (1 2 3) (1 2 3))

Es importante que cada definici


on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

Manipulacion de las relaciones


Debido a que las relaciones son en escencia conjuntos, es posible hacer las operaciones de
conjuntos con las relaciones, sinembargo, es necesario tener especial cuidado para distinguir
cual sera el dominio y contradominio que resulten una vez que la operacion se realice.

Definicion (Complemento de una relacion)


Sea R : A B una relacion, donde el dominio y codominio no necesariamente deben ser
y se le puede llamar la relaci
iguales. El complemento de R se escribe como R
on
complementaria, y esta definida
, {ha, bi A B|ha, bi 6 R}
R

-AbC

La relacion complemento se puede modelar utilizando el siguiente formato:


; relacion-complemento: <listaDe/tuplas> <conjunto> <conjunto> --> <conjunto>
; recibe: a) una relacion, con forma de lista de tuplas. p.ej. ((1 2) (2 1))
;
b) El conjunto dominio de la relacion
;
c) El conjunto codominio de la relacion
; devuelve: una tupla con tres elementos: 1) <listaDe/tuplas> de elementos del producto cartesiano,
;
que no pertenecen a la relacion
;
2) <conjunto> el dominio de la relacion complemento
;
3) <conjunto> el codominio de la relacion complemento
(define relacion-complemento
( (R A B)
...))

Relacion complemento
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

; relacion-complemento: <listaDe/tuplas> <conjunto> <conjunto> --> <conjunto>


; recibe: a) una relacion, con forma de lista de tuplas. p.ej. ((1 2) (2 1))
;
b) El conjunto dominio de la relacion
;
c) El conjunto codominio de la relacion
; devuelve: una tupla con tres elementos: 1) <listaDe/tuplas> de elementos del producto cartesiano,
;
que no pertenecen a la relacion
;
2) <conjunto> el dominio de la relacion complemento
;
3) <conjunto> el codominio de la relacion complemento
(define relacion-complemento
( (R A B)
(list
(filter-not ( (p) (pertenece? p R))
(producto-cartesiano A B))
A ; --- el dominio
B))) ;--- el codominio

-AbC

EJEMPLO
1. Utiliza DrRacket para calcular la relacion complemento de la relacion
R , {h1, ai, h2, ai, h3, bi, h2, ci, h3, ai}, con dominio en el conjunto A , {1, 2, 3} y
codominio en B , {a, b, c}
> (relacion-complemento ((1 a) (2 a) (3 b) (2 c) (3 a)) (1 2 3) (a b c))
(((3 c) (2 b) (1 c) (1 b)) (1 2 3) (a b c))

2. Ahora escribe la relacion R en una tabla, identificando tambien los elementos de R.

-AbC

Definicion (Inversa de una relacion)


Sea R : A B una relacion, donde el dominio y codominio no necesariamente deben ser
iguales. La relacion inversa de R se escribe como R1 , y esta definida
R1 , {hb, ai B A|ha, bi R}

-AbC

TAREA
Escribe una definicion en DrRacket que dado un elemento en el dominio de la relacion, y
una relacion con su dominio y codominio, calcule la relacion inversa de la relacion dada, de
acuerdo con el siguiente formato.
; relacion-inversa: <listaDe/tuplas> <conjunto> <conjunto> --> <listaDe/tuplas> <conjunto> <conjunto>
; recibe: a) una relacion, con forma de lista de tuplas. p.ej. ((1 2) (2 1))
;
b) El conjunto dominio de la relacion
;
c) El conjunto codominio de la relacion
; devuelve: una tupla con tres elementos: 1) <listaDe/tuplas> de elementos del producto cartesiano,
;
que no pertenecen a la relacion
;
2) <conjunto> el dominio de la relacion complemento
;
3) <conjunto> el codominio de la relacion complemento
(define relacion-inversa
( (R A B)
...))

Los siguientes ejemplos te deben servir de guia.


> (relacion-inversa ((1 a) (2 a) (3 b) (2 c) (3 a)) (1 2 3) (a b c))
(((c 2) (b 3) (a 3) (a 2) (a 1)) (a b c) (1 2 3))
> (relacion-inversa ((1 3)) (1 2 3) (1 2 3))
(((3 1)) (1 2 3) (1 2 3))
> (relacion-inversa ((1 3) (2 2) (2 1)) (1 2 3) (1 2 3))
(((3 1) (2 2) (1 2)) (1 2 3) (1 2 3))
>
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

Definicion (Composicion)
Sean R : A B y S : B C dos relaciones. La composicion de R con S se escribe como
R S y es una nueva relacion con dominio en A y codominio en C , los pares que
pertenecen a la relacion composicion estan determinados por la expresion
R S , {(a, c) A C|b B : (a, b) R (b, c) S}

-AbC

TAREA
Escribe una definicion en DrRacket que dadas dos relaciones, cada una con su dominio y
codominio, calcule la relacion composicion, de acuerdo con el siguiente formato.
; relacion-composicion: <listaDe/tuplas> <conjunto> <conjunto>
;
<listaDe/tuplas> <conjunto> <conjunto> --> <listaDe/tuplas> <conjunto> <conjunto>
; recibe: a) una relacion R, con forma de lista de tuplas. p.ej. ((1 2) (2 1))
;
b) El conjunto dominio de la relacion R
;
c) El conjunto codominio de la relacio R
;
d) una relacion S, con forma de lista de tuplas. p.ej. ((1 2) (2 1))
;
e) El conjunto dominio de la relacion S
;
f) El conjunto codominio de la relacion S
; devuelve: una lista con los tres elementos de la nueva relacion composicion
;
1) La lista de pares que conforman la composicion
;
2) El dominio
;
3) El codominio
(define relacion-composicion
( (a R A B)
...))

Los siguientes ejemplos te deben servir de guia.


> (relacion-composicion ((1 a) (2 b) (2 a) (3 c)) (1 2 3) (a b c) ((a x) (c y)) (c b a) (x y z))
(((3 y) (2 x) (1 x)) (1 2 3) (x y z))
>

Es importante que cada definici


on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)
-AbC

Funciones

-AbC

Funciones (mapeos o transformaciones)


Un caso particular entre las relaciones ocurre cuando se cumple la siguiente propiedad para
una relacion R : A B.
a Dom(R) : |ImR (a)| = 1

EJEMPLO
Representa la relacion f , {h1, 1i, h2, 4i, h3, 9i, h4, 16i, h5, 25i} con dominio en
{1, 2, 3, 4, 5} y codominio en {1, 4, 9, 16, 25}.

EJEMPLO
Representa la relacion R , {h1, 1i, h2, 4i, h2, 9i, h3, 9i, h4, 16i, h5, 25i} con dominio en
{1, 2, 3, 4, 5} y codominio en {1, 4, 9, 16, 25}.

-AbC

Notemos que en el ejemplo anterior en la relacion f , cada elemento del dominio tiene una
imagen unitaria, esto es |Imf (a)| = 1, por ejemplo Imf (5) = {25}.
Si Imf (a) = {b} para alguna b Cod(f ), entonces se puede representar como f (a) = b,
porque esto no causa confusion y ya es una costumbre hacerlo para las funciones. As para
el ejemplo anterior f (1) = 1, f (2) = 4, y de manera similar para todos los demas elementos
del dominio.
Determina si una relacion es una funcion
1
2
3
4
5
6
7
8
9
10

; es-funcion?: <listaDe/tuplas> <conjunto> <conjunto> --> <booleano>


; recibe: a) una relacion, con forma de lista de tuplas. p.ej. ((1 2) (2 1))
;
b) El conjunto dominio de la relacion
;
c) El conjunto codominio de la relacion
; devuelve: Un valor de verdad. #t si la relaci\on dada es una funcion, y #f si no lo es
(define es-funcion?
( (R A B)
(andmap
( (a) (= 1 (card (imagen a R A B))))
(dominio R A B))))
> (es-funcion? ((1 2) (2 3) (3 1)) (1 2 3 4) (1 2 3 4))
#t
> (es-funcion? ((1 2) (2 3) (3 1) (1 4)) (1 2 3 4) (1 2 3 4))
#f
>

-AbC

Tipos de funciones
Existen diferentes tipos de funciones que se han catalogado de manera particular, en los
siguientes items se considera que f : A B es una funcion con dominio en A y codominio
en B.
i Si a A : f (a) = , entonces f es una funcion completamente definida.
ii Si a A : f (a) = , entonces f es una funcion parcialmente definida.

-AbC

TAREA
Escribe una definicion en DrRacket que dada una relacion, con su dominio y codominio,
determine si esta completamente definida o es parcialmente definida, de acuerdo con el
siguiente formato.
; funcion-definida: <listaDe/tuplas> <conjunto> <conjunto> --> <entero>
; recibe: a) una funcion f, con forma de lista de tuplas. p.ej. ((1 2) (2 1))
;
b) El conjunto dominio de la relacion f
;
c) El conjunto codominio de la relacio f
; devuelve: un numero entre 0, 1 o 2 de acuerdo con los siguientes casos
;
0 si la relacion no es una funcion
;
1 si la funcion esta completamente definida
;
2 si la funcion es parcialmente definida
(define funcion-definida
( (f A B)
...))

Los siguientes ejemplos te deben servir de guia.


> (funcion-definida ((1 2) (2 3) (3 3) (3 1)) (1 2 3 4) (1 2 3 4))
0
> (funcion-definida ((1 2) (2 3) (3 3) (4 1)) (1 2 3 4) (1 2 3 4))
1
> (funcion-definida ((1 2) (2 3) (3 3)) (1 2 3 4) (1 2 3 4))
2
>

Es importante que cada definici


on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)
-AbC

Al considerar el codominio de una duncion f : A B con dominio en A y codominio en


B., tambien se tienen diferentes tipos:
i Si Ran(f ) = B, entonces f es una funcion sobreyectiva, o simplemente sobre.
ii Si a A : (a0 A : f (a) = f (a0 ) a = a0 ), entonces f es una funcion inyectiva, o
simplemente 1-1.

-AbC

TAREA
Escribe una definicion en DrRacket que dada una relacion, con su dominio y codominio,
determine si lafuncion es sobreyectiva, de acuerdo con el siguiente formato.
; funcion-sobre?: <listaDe/tuplas> <conjunto> <conjunto> --> <entero>
; recibe: a) una funcion f, con forma de lista de tuplas. p.ej. ((1 2) (2 1))
;
b) El conjunto dominio de la relacion f
;
c) El conjunto codominio de la relacio f
; devuelve: un valor de verdad. #t si la funci\on es sobreyectiva y #f si no loes
(define funcion-sobre?
( (f A B)
...))

Los siguientes ejemplos te deben servir de guia.


> (funcion-sobre? ((1 2) (2 3) (3 3) (4 1)) (1 2 3 4) (1 2 3 4))
#f
> (funcion-sobre? ((1 2) (2 3) (3 1) (4 4)) (1 2 3 4) (1 2 3 4))
#t
>

Es importante que cada definici


on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)
-AbC

TAREA
Escribe una definicion en DrRacket que dada una relacion, con su dominio y codominio,
determine si la funcion es inyectiva, de acuerdo con el siguiente formato.
; funcion-1a1?: <listaDe/tuplas> <conjunto> <conjunto> --> <entero>
; recibe: a) una funcion f, con forma de lista de tuplas. p.ej. ((1 2) (2 1))
;
b) El conjunto dominio de la relacion f
;
c) El conjunto codominio de la relacio f
; devuelve: un valor de verdad. #t si la funci\on es sobreyectiva y #f si no loes
(define funcion-1a1?
( (f A B)
...))

Los siguientes ejemplos te deben servir de guia.


> (funcion-1a1? ((1 2) (2 3) (3 3) (4 4)) (1 2 3 4) (1 2 3 4))
#f
> (funcion-1a1? ((1 2) (2 3) (3 1) (4 4)) (1 2 3 4) (1 2 3 4))
#t
>

Es importante que cada definici


on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)
-AbC

Definicion (Funciones biyectivas)


Una defincion f : A B es una funcion biyectiva cuando cumple:
i f es sobreyectiva
ii f es inyectiva
Determina si una funcion es biyectiva
1
2
3
4
5
6
7
8
9

; funcion-biyectiva?: <listaDe/tuplas> <conjunto> <conjunto> --> <booleano>


; recibe: a) una relacion, con forma de lista de tuplas. p.ej. ((1 2) (2 1))
;
b) El conjunto dominio de la relacion
;
c) El conjunto codominio de la relacion
; devuelve: Un valor de verdad. #t si la relaci\on dada es una funcion biyectiva, y #f si no lo es
(define funcion-biyectiva?
( (R A B)
(y (funcion-sobre? R A B)
(funcion-1a1? R A B))))

-AbC

EJEMPLO
Supongamos que f : P(A) Z es una funcion que asocia un subconjunto de un conjunto
A, con un numero entero. Por ejemplo, si A , {c, b, a}, se establece el mapeo:
Subconjunto
{}
{a}
{b}
{b, a}
{c}
{c, a}
{c, b}
{a, b, c}

c
c
c
c
c

b
b
b
b
b

a Binario Z
000
0
a
001
1
010
2
a
011
3
100
4
a
101
5
110
6
a
111
7

La funcion f es una biyeccion y P(A) es un conjunto contable, porque a cada elemento se


le puede asociar con un numero entero

-AbC

TAREA
Escribe una definicion en DrRacket que dado un subconjunto de un conjunto, devuelva el
numero entero que le corresponde, de acuerdo con el siguiente formato.
; subconjunto->decimal: <conjunto> <conjunto> --> <entero>
; recibe: a) un subconjunto, dado como una lista de la forma (b a)
;
b) El conjunto del cual se toman los subconjuntos, como (a b c)
; devuelve: un numero entero que le corresponde al subconjunto dado
(define subconjunto->decimal
( (S A)
...))

Los siguientes ejemplos te deben servir de guia.


>
0
>
1
>
2
>
3
>
4
>
5
>
6
>
7
>

(subconjunto->decimal () (c b a))
(subconjunto->decimal (a) (c b a))
(subconjunto->decimal (b) (c b a))
(subconjunto->decimal (b a) (c b a))
(subconjunto->decimal (c) (c b a))
(subconjunto->decimal (c a) (c b a))
(subconjunto->decimal (c b) (c b a))
(subconjunto->decimal (c b a) (c b a))

-AbC

Combinaciones de r elementos tomados de un conjunto de n elementos


Consideremos un conjunto A, donde |A| = n elementos. Una combinacion de 0 r n
elementos se obtiene al seleccionar r elementos del conjunto A.

-AbC

Funciones invertibles
Definicion (Funcion invertible)
Decimos que una funcion f : A B es invertible, denotada por f 1 , cuando la relacion
inversa de f es una funcion No todas las funciones son invertibles, como en el siguiente ejemplo:

EJEMPLO
Considera la siguiente funcion f : A B, donde f , {h1, 2i, h2, 2i, h3, 1i, h4, 3i}, donde
el dominio es {1, 2, 3, 4} y el codominio es {1, 2, 3, 4}.
1. verifica que f es una funcion.
2. determina la relacion inversa f .
3. determina si la relacion inversa de f es una funcion.

-AbC

TAREA
Escribe una definicion en DrRacket que dada una funcion con su dominio y codominio,
devuelva verdadero si es una funcion invertible o falso si no lo es, de acuerdo con el
siguiente formato.
; funcion-1a1?: <listaDe/tuplas> <conjunto> <conjunto> --> <booleano>
; recibe: a) una funcion f, con forma de lista de tuplas. p.ej. ((1 2) (2 1))
;
b) El conjunto dominio de la relacion f
;
c) El conjunto codominio de la relacio f
; devuelve: un valor de verdad. #t si la funci\on es invertible y #f si no lo es
(define funcion-invertible?
( (f A B)
...))

Los siguientes ejemplos te deben servir de guia.


> (funcion-invertible? ((1 2) (2 1) (3 3)) (1 2 3) (1 2 3))
#t
> (funcion-invertible? ((1 2) (2 1) (3 2)) (1 2 3) (1 2 3))
#f
>
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

EJERCICIO
Determina las propiedades de cada funcion
funci
on
f , (h1, 1ih2, 3ih3, 4ih4, 2i)
f , (h1, aih2, aih3, ci)
f , (h 12 , xih 14 , yih 31 , 4i)
f , (h1.1, pih7, qih0.006, pi)

dominio
{1, 2, 3, 4}
{1, 2, 3}
{ 12 , 13 , 14 }
{1.1, 7, 0.006}

codominio
{1, 2, 3, 4}
{a, , c, d}
{x, y, z, w}
{p, q}

sobre

1a1

biyectiva

invertible

-AbC

Funciones de permutacion
Este tipo de funciones son biyecciones de un conjunto a s mismo, esto significa que la
funcion asocia a cada elemento del dominio, un elemento del codominio, y que el dominio y
codominio es el mismo conjunto. As las funciones de permutacion tienen el formato
f : A A donde f es una funcion biyectiva.

Definicion (Permutacion)
Una permutacion es una funcion biyectiva de un domino a s mismo.
Determina si una funcion es una permutacion
1
2
3
4
5
6
7
8
9

; funcion-permutacion?: <listaDe/tuplas> <conjunto> <conjunto> --> <booleano>


; recibe: a) una relacion, con forma de lista de tuplas. p.ej. ((1 2) (2 1))
;
b) El conjunto dominio de la funcion
;
c) El conjunto codominio de la funcion
; devuelve: Un valor de verdad. #t si la funcion dada es una permutacion, y #f si no lo es
(define funcion-permutacion?
( (f A B)
(and (funcion-biyectiva? f A B)
(conjuntos-iguales? A B))))

-AbC

Las permutaciones son funciones muy utiles en ciencias computacionales, entre otras
razones, porque con ellas se pueden modelar muchos problemas combinatorios.
Consideremos el siguiente ejemplo:

EJEMPLO
Una empresa requiere asignar claves de acceso a su edificio, y para ello desea hacer claves
de 6 letras con las letras {4, 8, 2, x, y, z}. Una pregunta importante es Cuantas claves
diferentes puede lograr?, y si ese numero es suficiente, es posible hacer una funcion que
muestre todas las posibles claves que se puedan lograr?

El numero de permutaciones de un conjunto

-AbC

El conjunto de permutaciones de un conjunto


Para crear un programa que genere todas las permutaciones de un conjunto, en primer
lugar empecemos con el conjunto vaco y agregaremos elementos para entender com se
determina el conjunto de las permutaciones de un conjunto.
Permutaciones
Conjunto
()
(())
(a)
((a))
(b a)
((b a) (a b))
(c b a)
((c b a) (a c b) (a b c) (c b a) (a c b) (a b c))
(d c b a)

-AbC

Las permutaciones de r elementos tomados de un conjunto de n elementos


Ahora consideremos el conjunto A , {1, 2, 3, 4} y supongamos que las claves, deben tener
exactamente 3 letras, la pregunta sigue siendo la misma: Cuantas claves diferentes puede
lograr?
Esta pregunta se responde contando todas las permutaciones por cada subconjunto de 3
letras que se puedan hacer con el conjunto de 4 letras dado.

-AbC

Calculo del factorial


Definicion (Factorial)
El factorial de un numero entero positivo se denota por n! y se calcula mediante la expresion

1
si n = 0;
n!
n (n 1)! si n > 0.
Que tiene una traduccion directa a DrRacket:
Factorial-version preeliminar 1
1
2
3
4
5
6

; recibe un <numero> entero no negativo


(define !
( (n)
(if (= n 0)
1
(* n (! (- n 1))))))

-AbC

Una mejor version para calcular el factorial, utiliza recursion de cola, auxiliandose de una
funcion que lleva el resultado a cuestas, mismo que es entregado al terminar el calculo:
Factorial-version preeliminar 2
1
2
3
4
5
6

; recibe un <numero> entero no negativo


(define !-aux
( (n res)
(if (= n 0)
res
(!-aux (- n 1) (* n res)))))

-AbC

As el numero de permutaciones de tamano r tomadas de un conjunto de n elementos esta


dado por
n!
P (n, r) =
(n r)!
Esta expresion se puede reescribir como
P (n, r) =

(n)(n 1)(n 2) (n r + 1)(n r)(n r 1) (2)(1)


(n r)(n r + 1) (2)(1)

= (n)(n 1)(n 2) (n r + 1)
=

r+1
Y

ni

i=0

Factorial-version preeliminar 3
1
2
3
4
5
6

; recibe un <numero> entero no negativo


(define !-aux
( (n r res)
(if (= r 0)
res
(!-aux (- n 1) (- r 1) (* n res)))))

7
8
9
10

(define !
( (n [r n])
(!-aux n r 1)))

-AbC

Finalmente la version mas adecuada para el calculo del factorial es


Factorial
1
2
3
4
5
6
7
8
9
10
11
12
13

; !:<entero-no-negativo> --> <entero-no-negativo>


; recibe: <n> un numero entero no negativo y
;
opcionalmente r, un numero entero no negativo.
;
si no se proporciona <r>, su valor es <n>
; devuelve: el factorial de los ultimos <r> numeros (empezando desde 1)
(define !
( (n [r n])
(define !-aux
( (n r res)
(if (= r 0)
res
(!-aux (- n 1) (- r 1) (* n res)))))
(!-aux n r 1)))
> (* 10 9 8 7 6 5 4 3 2 1)
3628800
> (! 10)
3628800
> (* 10 9 8 7)
5040
> (! 10 4)
5040
>

-AbC

TAREA
1. Escribe una funcion. Recibe un numero que represente la cardinalidad de un conjunto
y otro numero que representa la cantidad de elementos en cada permutacion; y que
devuelva el numero de permutaciones, de acuerdo con el siguiente formato:
; P: <entero-positivo> <entero-positivo> --> <entero-positivo>
; recibe: a) Un numero entero positivo, que representa la cardinalidad del conjunto
;
b) Un numero entero que representa el numero de elementos en cada permutacion
; devuelve: Un numero entero positivo que significa la cantidad de permutaciones
(define P
( (n r)
...))
> (P 4 4)
24
> (P 3 2)
6
>

2. Escribe una funcion que reciba un conjunto; y que devuelva el conjunto de todas las
permutaciones del conjunto, de acuerdo con el siguiente formato:
; Permutaciones: <conjunto> --> <listaDe/permutaciones>
; recibe: a) Un conjunto A
; devuelve: Un conjunto de todas las permutaciones del conjunto dado
(define Permutaciones
( (A)
...))
> (Permutaciones (1 2 3))
((3 2 1) (2 3 1) (2 1 3) (3 1 2) (1 3 2) (1 2 3))
>
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)
-AbC

El numero de combinaciones
Retomemos el tema de las combinaciones de r elementos tomados de un conjunto de n
elementos.

EJEMPLO
Si A , {1, 2, 3, 4}, cuales son todas las combinaciones de 3 elementos?
> (rCombinaciones (1 2 3 4) 3)
((4 3 2) (1 4 3) (1 4 2) (1 3 2))
>

-AbC

As el numero de combinaciones de tamano r tomadas de un conjunto de n elementos esta


dado por
n!
C(n, r) =
r!(n r)!

-AbC

Funciones binarias
Definicion (Funcion binaria)
Sean A B y C conjuntos no vacos. Una funcion que tiene dominio en A B y codominio
en C se llama funcion binaria, y su formato es F : A B C.
Los elementos de la funcion se describen mediante un conjunto
F , {ha, b, ci A B C|F (a, b) = c}
Para que F se considere una funcion, se aplica la misma regla que para las funciones unarias
(de una variable): Para cada elemento de A B le corresponde un unico elemento de C.

EJEMPLO
Sea F : A B C la funcion F , {h1, a, xi, h1, b, yi, h2, b, zi, h2, a, xi}, con A , {1, 2},
B , {a, b} y C , {x, y, z}

-AbC

Tambien es posible definir funciones mediante un predicado

EJEMPLO
F , {ha, b, di A B D|a2 + b2 = d}, restringido a los conjuntos A = B , {0, 1, 2, 3}
y D , {n Z|0 n 18}
(define A (1 2 3))
(define B (1 2 3))
(define D (filter ( (x) (and (>= x 0) (>= 18 x))) (build-list 1000 values)))
(define F
(filter ( (t)
(let ((a (list-ref t 0))
(b (list-ref t 1))
(d (list-ref t 2)))
(= (+ (expt a 2) (expt b 2))
d)))
(producto-cartesiano* A B D)))
> F
((3 1 10) (3 2 13) (3 3 18) (2 1 5) (2 2 8) (2 3 13) (1 1 2) (1 2 5) (1 3 10))
>

-AbC

Tablas de multiplicar en funciones binarias


Una manera de representar una funcion binaria es utilizando una tabla de multiplicar
(aunque lo de multiplicar es solamente una referencia, no tiene que ver exclusivamente
con la operacion aritmetica). consideremos el ultimo ejemplo:
> F
((3 1 10) (3 2 13) (3 3 18) (2 1 5) (2 2 8) (2 3 13) (1 1 2) (1 2 5) (1 3 10))
>

-AbC

Funciones de orden superior


Las funciones que hasta ahora hemos considerado se conocen como funciones de primer
orden, y tienen la caracterstica de que siempre, en todos los casos, el dominio o codominio
son conjuntos de elementos simples (incluso el producto cartesiano o el conjunto potencia
se consideran simples).
Las funciones de orden superior, tienen como dominio o codominio a los conjuntos de
funciones junto con los conjuntos convencionales, esto significa cualquiera de las siguientes
opciones:
i uno o mas argumentos de la funcion, son funciones.
ii uno o mas de los elementos asociados (que pertenecen al codominio), son funciones.
iii las dos anteriores.

-AbC

EJEMPLO
Crearemos una funcion que reciba una funcion y devuelva la aplicacion de la funcion
pasada como argumento.
; fsup: (<listaDe/numero> --> <numero>) <listaDe/numero> --> <numero>
(define fsup
( (f x)
(apply f x)))
> (fsup
13
> (fsup
-9
> (fsup
60
> (fsup
32
> (fsup
brenda
>

+ (2 5 6))
- (2 5 6))
* (2 5 6))
( (x) (expt 2 x)) (5))
car ((brenda carlos antonio)))

-AbC

EJEMPLO
En este otro ejemplo haremos una funcion que devuelve una funcion.
; fsup: <numero> <numero> <numero> --> (<numero> --> <numero>)
(define fsup
( (a b c)
( (x) (+ (* a (expt x 2))
(* b (expt x 1))
(* c (expt x 0))))))
> (fsup 1 2 3)
#<procedure:...s-curso2013b.rkt:608:4>
> ((fsup 1 2 3) 4)
27
> ((fsup 1 2 3) 1)
6
>

-AbC

-calculo
Una de las primeras cosas que hay que notar en este tipo de funciones, es el uso del smbolo
. El smbolo lo introdujo Alonzo Church (en la figura) para describir una manera de
hacer computaciones (procesos computacionales, para obtener resultados).
El se puede leer como el computo
que require... y se utiliza cuando no se
necesita especificar un identificador para
un procedimiento.

EJEMPLO
(define mi-suma
( (a b)
(+ a b)))
> (mi-suma 2 3)
5
> (( (a b) (+ a b)) 2 3)
5
>

-AbC

Funcion Despachar
La funcion (de orden superior) despachar, toma como entrada dos funciones f : A B y
g : A C, y genera una nueva funcion con formato : A B C, del siguiente modo:
Des(f, g) , (x) : hf (x), g(x)i;

-AbC

Funcion Aplicacion paralela


La funcion (de orden superior) aplicaci
on paralela, toma como entrada dos funciones
f : A B y g : C D, y genera una nueva funcion con formato
: (A C) (B D), del siguiente modo:
Par(f, g) , (x, y) : hf (x), g(y)i

-AbC

TAREA
1. Escribe una funcion en DrRacket para despachar aplicaciones de una funcion:
; despachar: ((<conjunto> --> <conjunto>) (<conjunto> --> <conjunto>)) -->
;
(<conjunto> --> (<conjunto> <conjunto>))
; recibe: a) una funcion f:A-->B
;
b) Una funcion g:A-->C
; devuelve una funcion :A-->BxC
(define despachar
( (f g)
...))
> (define F (despachar ( (x) (* x 10)) ( (x) (* x 2))))
> F
#<procedure:...s-curso2013b.rkt:1259:4>
> (F 10)
(100 20)

2. Escribe una funcion en DrRacket para aplicar en paralelo aplicaciones de una funcion:
; aplicacion-paralela: ((<conjunto> --> <conjunto>) (<conjunto> --> <conjunto>)) -->
;
((<conjunto> <conjunto>) --> (<conjunto> <conjunto>))
; recibe: a) una funcion f:A-->B
;
b) Una funcion g:A-->C
; devuelve una funcion :A-->BxC
(define aplicacion-paralela
( (f g)
...))
> (define G (aplicacion-paralela ( (x) (* x 10)) ( (x) (* x 2))))
> G
#<procedure:...s-curso2013b.rkt:1259:4>
> (G 5 10)
(50 20)
>
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

Grafos

-AbC

Grafos-introduccion
Definicion (Grafo)
Un grafo es una tupla hN, Ai, donde N 6= y A N N .
El conjunto N se llama nodos (vertices), mientras que el conjunto A se llama aristas.
Si G , hN, Ai es un grafo, NG se refiere a los nodos (vertices) del grafo G, y de manera
similar, AG son las aristas del grafo G. Los grafos sirven para representar relaciones sobre
un conjunto.

-AbC

EJEMPLO
Cual es el grafo de la relacion
R , {h1, 1i, h1, 1i, h1, 2i, h2, 1i, h2, 2i, h2, 3i, h2, 4i, h3, 4i, h4, 1i} sobre el conjunto
N , {1, 2, 3, 4}

Se define el grafo
g01 , hN, Ri

-AbC

Estructuras de datos en DrRacket


Para dar soporte a la estructura de los grafos, vamos a necesitar una estructura en
DrRacket. Una manera simple de utilizar estructuras en DrRacket, es mediante el
constructor de estructuras struct

Estructura de datos basica para los nodos


Podemos definir una estructura para crear nodos, que contenga simplemente la informacion
del nodo
(struct nodo& (info) #:mutable)

-AbC

Es necesario crear ademas algunos procedimientos accesores y modificadores


Manipulacion basica de los nodos
1
2
3
4

; se crea un nodo inicialmente no explorado


(define crear-nodo
( (inf)
(nodo& inf)))

5
6
7
8
9

; Para crear un nodo se require la info


(define crear-nodo*
( (inf)
(nodo& inf)))

10
11
12
13
14
15
16

;; As mismo escribimos metodos accesores


(define nodo-info
( (nodo)
(if (nodo&? nodo)
(nodo&-info nodo)
ERR-NoNodo)))

17
18
19
20
21
22

; Siempre es necesario poder determinar si dos nodos son iguales


; los nodos son iguales si su info es la misma.
(define nodos-iguales?
( (na nb)
(equal? (nodo-info na) (nodo-info nb))))

-AbC

Maniulacion basica para las aristas


Manipulacion basica de las aristas
1
2
3
4

(struct arista& (ni nf) #:mutable)


(define crear-arista
( (nodoi nodof)
(arista& nodoi nodof)))

TAREA
Escribe los procedimientos accesores para acceder a cada parte de la arista, de acuerdo al
siguiente formato:
arista-nodo-inicial: <arista&> --> <nodo&>
recibe: una estrura de datos arista&
devuelve: una estructura de datos nodo&
arista-nodo-final: <arista&> --> <nodo&>
recibe: una estrura de datos arista&
devuelve: una estructura de datos nodo&
> (define n1 (crear-nodo 1))
> (define n2 (crear-nodo 2))
> (define a1 (crear-arista n1 n2))
> (arista-nodo-inicial a1)
#<nodo&>
> (nodo-info (arista-nodo-inicial a1))
1
> (nodo-info (arista-nodo-final a1))
2
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

Al igual que con los nodos, es necesario determinar cuando dos aristas son en realidad la
misma arista.

Definicion (Aristas iguales)


Si G , hN, Ai es un grafo, donde a1 y a2 son aristas en AG , decimos que las aristas a1 y
a2 son iguales, y lo denotamos de la manera habitual a1 = a2 , cuando:
i El nodo inicial de a1 es el mismo nodo inicial que en a2 , y
ii El nodo final de a1 es el mismo nodo final que en a2
Igualdad en las aristas
1
2
3
4
5
6
7
8
9
10
11

; aristas-iguales?:<arista&> <arista&> --> <booleano>


; determina si dos aristas son iguales.
; recibe: a) una arista
;
b) una arista
; devuele falso o verdadero.
(define aristas-iguales?
( (aristaA aristaB)
(and (equal? (nodo-info (arista-nodo-inicial aristaA))
(nodo-info (arista-nodo-inicial aristaB)))
(equal? (nodo-info (arista-nodo-final aristaA))
(nodo-info (arista-nodo-final aristaB))))))

-AbC

Creacion de grafos
Con los procedimientos de nodos y aristas ya podemos definir los procedimientos para los
grafos, de acuerdo con su definicion.
Manipulacion basica de los grafos
1
2
3
4

(struct grafo& (N A) #:mutable)


(define crear-grafo
( (conjunto-Nodos conjunto-Aristas)
(grafo& conjunto-Nodos conjunto-Aristas)))

TAREA
Escribe los procedimientos accesores para acceder a cada parte del grafo, de acuerdo al
siguiente formato:
grafo-nodos: <grafo&> --> <listaDe/nodo&>
recibe: una estructura de datos grafo&
devuelve: un conjunto de nodo&
grafo-aristas: <grafo&> --> <listaDe/arista&>
recibe: una estructura de datos grafo&
devuelve: un conjunto de arista&
> (define n1 (crear-nodo 1))
> (define n2 (crear-nodo 2))
> (define a1 (crear-arista n1 n2))
> (define Gr01 (crear-grafo (list n1 n2) (list a1)))
> (grafo-nodos Gr01)
(#<nodo&> #<nodo&>)
> (grafo-aristas Gr01)
(#<arista&>)
>
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)
-AbC

EJERCICIO
El diagrama siguiente muestra un grafo que llamaremos Gr02. Escribe las definiciones
adecuadas para modelarlo en DrRacket.
; Definimos los nodos
(define n1 (crear-nodo 1))
(define n2 (crear-nodo 2))
(define n3 (crear-nodo 3))
(define n4 (crear-nodo 4))
; y el conjunto de nodos
(define N (list n1 n2 n3 n4))
; creamos las aristas
(define a1 (crear-arista n1 n1))
(define a2 (crear-arista n1 n3))
(define a3 (crear-arista n2 n3))
(define a4 (crear-arista n3 n2))
(define a5 (crear-arista n3 n3))
(define a6 (crear-arista n4 n3))
; y el conjunto de aristas
(define A (list a1 a2 a3 a4 a5 a6))
; Ahora creamos el grafo
(define Gr02 (crear-grafo N A))

-AbC

Representacion de los grafos - 1


Ademas de la representacion grafica (la de crculos y flechas), vamos a considerar otras tres
representaciones: La de lista de pares, en forma de matriz y en forma de lista (muy al estilo
de DrRacket).

Lista de pares Consideremos G , hN, Ai un grafo, La representacion consiste


simplemente de enlistar cada uno de los pares que conforman la relacion del grafo.

EJEMPLO
Supongamos el grafo mostrado en la
figura. La representacion consiste de dos
elementos:
1. El conjunto de nodos
2. El conjunto de aristas

-AbC

TAREA
Escribe un procedimiento que permita escribir el contenido de un grafo; su conjunto de
nodos y su conjunto de aristas en forma de pares ordenados.
; grafo-describir: <grafo&> --> <listaDe <listaDe/nodos> <listaDe/aristas>>
; recibe: una estructura de datos de tipo <grafo&>
; devuelve: una lista que contiene el conjunto de nodos (no son estructuras de datos)
;
y una lista de pares ordenados, sus aristas (no son Est. Dat.)
(define grafo-describir
( (G)
... ))
> (grafo-describir (leer-grafo "g03.dat"))
((1 2 3 4 5 6)
((1 1) (1 2) (2 1) (2 5) (3 2) (4 3) (4 6) (5 4) (5 6) (6 2) (6 5)))
>
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

Representacion de los grafos - 2


Matrices de adyacencia Consideremos G , hN, Ai un grafo, donde n = |NG |.
Arbitrariamente asignemos un orden a los nodos NG = hv1 , v2 . . . vn i. La matriz de
adyacencia del grafo G se puede escribir como AG , y es una matriz booleana cuadrada de
orden n, y AG , [aij ], donde aij = 1 si hai , aj i AG , y aij = 0 si hai , aj i 6 AG

-AbC

Representacion de los grafos - 3


Listas de adyacencia Esta es una representacion que es muy frecuentemente utilizada
cuando se desea leer de un archivo de texto, una configuracion de un grafo, o bien escribirla
en un archivo de texto.
Una lista de adyacencias especifica los nodos que son adyacentes al primer nodo de la lista.
La lista de adyacencias tiene tantos renglones como nodos hay en el grafo, cada renglon se
inicia con un nodo diferente, y enseguida se enlistan todos los nodos que son adyacentes al
primer nodo en el renglon.

-AbC

TAREA
Escribe un procedimiento para leer desde un archivo de texto una configuracion de un
grafo, y que se traduzca en una estructura de datos de tipo grafo.
; leer-archivo: <string> --> <grafo&>
; recibe: un string con el nombre del archivo de texto plano
; devuelve: una estructura de datos <grafo&>
(define leer-archivo
( (nomArch)
... ))

Nombre de archivo: g03.dat


1
2
3
4
5
6

1
1
2
3
4
2

2
5

1
2
3

6
6
5

4
5
6

> (leer-grafo "g03.dat")


#<grafo&>
> (grafo-describir (leer-grafo "g03.dat"))
((1 2 3 4 5 6)
((1 1) (1 2) (2 1) (2 5) (3 2) (4 3) (4 6) (5 4) (5 6) (6 2) (6 5)))
>
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

Isomorfismos en grafos
En ocasiones podemos encontrar un par de grafos que estan dibujados de manera diferente
y en donde los nodos de cada grafo estan etiquetados de manera diferente. Aunque estas
diferencias ocurran, no significa que los grafos sean del todo diferentes, por eso hablamos
de un isomorfismo (de la misma forma).

Definicion (Isomorfismo en grafos)


Si G , hN, Ai y H , hM, Bi son dos grafos, decimos que G y H son isomorfos si hay una
funcion f : N M dentro del conjunto de biyecciones de NG MH denotado por
BN M , tal que para cada arista a AG , se cumple que hf (na ), f (nb )i BH , es decir:
f BN M : a AG : hf (1de(a)), f (2de(a))i BH ;
donde: 1de : A N y 2de : A N son funciones que toman una arista y obtienen el
primer nodo de una tupla y el segundo nodo de una tupla respectivamente.

-AbC

EJEMPLO
Demostrar que los grafos en las figuras son isomorfos.

-AbC

Caractersticas reconocibles en los grafos


Sobre los nodos
Nodo adyacente Si e = hni , nf i es una arista, el nodo nf es un nodo adyacente (vecino)
del nodo ni . En terminos generales, un nodo nf es adyacente a otro nodo ni ,
si existe una arista e AG tal que e = hni , nf i. En smbolos podemos
escribirlo como:

#t si e AG : (e = hei , ef i);
ady?G (ni , nf ) ,
#f e.o.c
Incluso es posible escribir una definicion en DrRacket que determine si un nodo es
adyacente a otro nodo en un grafo:
Determina si un nodo es adyacente a otro nodo en un grafo
1
2
3
4
5
6
7
8

; nodo-adyacente?: <nodo&> <nodo&> <grafo&> --> <booleano>


; Requiere: a) un nodo, supuestamente el inicial
;
b) un nodo, supuestamente el final.
;
c) un grafo
; Devuelve: #t si el nodo inicial es adyacente al nodo final propuesto. #f en otro caso
(define nodo-adyacente?
( (ni nf G)
(ormap ( (e) (aristas-iguales? e (crear-arista ni nf))) (grafo-aristas G))))

-AbC

Sin embargo nos sera muy util saber que nodos son los nodos adyacentes a un nodo dado
en un grafo determinado:
adyG (ni ) , {nf NG |ady?G (ni , nf )}
El conjunto de nodos adyacentes a otro nodo
1
2
3
4
5
6
7

; nodos-adyacentes: <grafo&> <nodo&> --> <listaDe/nodo&>


; Requiere: a) el nodo inicial
;
b) un grafo
; Devuelve: la lista de nodos que son adyacentes al nodo propuesto
(define nodos-adyacentes
( (ni G)
(filter ( (nf) (nodo-adyacente? G ni nf)) (grafo-nodos G))))

-AbC

Definicion (Grado de salida)


Si G , hN, Ai es un grafo, y n NG . El grado de salida del nodo n es la cardinalidad de
su conjunto de nodos adyacentes.

Definicion (Grado de entrada)


Si G , hN, Ai es un grafo, y n NG . El grado de entrada del nodo n es la cantidad de
nodos ni NG tales que n es adyacente a ni .

Definicion (Grado de un nodo)


Si G , hN, Ai es un grafo, y n NG . El grado del nodo n es la suma de su grado de
entrada y de su grado de salida.

-AbC

TAREA
Escribe las definiciones adecuadas para modelar las tres definiciones relacionadas con los
grados de un nodo:
1. El grado de entrada de un nodo:
;nodo-grado-entrada: <nodo&> <grafo&> --> <entero>
;recibe: a) un nodo
;
b) una estructura de datos grafo&
;devuelve: un numero. El grado de entrada del nodo en el grafo
(define nodo-grado-entrada
( (G n)
...))

2. El grado de salida de un nodo:


;nodo-grado-entrada: <nodo&> <grafo&> --> <entero>
;recibe: a) un nodo
;
b) una estructura de datos grafo&
;devuelve: un numero. El grado de salida del nodo en el grafo
(define nodo-grado-salida
( (G n)
...))

3. El grado de un nodo:
;nodo-grado-entrada: <nodo&> <grafo&> --> <entero>
;recibe: a) un nodo
;
b) una estructura de datos grafo&
;devuelve: un numero. El grado del nodo en el grafo
(define nodo-grado
( (G n)
...))
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)
-AbC

Subgrafos
Definicion (Nodos inducidos)
Si G , hN, Ai es un grafo, y A0 AG es una seleccion
de las aristas del grafo G, los nodos inducidos por A0 es el
conjunto de nodos denotado por N ind(A0 ):
N indG (A0 ) , {n NG |a A0 : n = 1de(a)n = 2de(a)}

Definicion (Aristas inducidas)


Si G , hN, Ai es un grafo, y N 0 NG es una seleccion
de los nodos del grafo G, las aristas inducidas por N 0 es
el conjunto de aristas denotado por Aind(N 0 ):
AindG (N 0 ) , {a AG |ni , nf N 0 : a = hni , nf i}

-AbC

Definicion (Subgrafo)
Si G1 , hN1 , A1 i y G2 , hN2 , A2 i son dos grafos, decimos que G1 es un subgrafo de G2 , y
lo denotamos como G1 G2 , cuando se cumple una de las siguientes condiciones:
i N1 N2 A1 = AindG2 (N1 )
ii A1 A2 N1 = N indG2 (A1 )

-AbC

Como los grafos son escncialmente conjuntos (de aristas que inducen nodos, o de nodos
que inducen aristas), es posible utilizar los operadores de conjuntos.

Definicion (Union de grafos)


Si G1 , hN1 , A1 i y G2 , hN2 , A2 i son dos grafos, la union de los grafos G1 y G2 es una
operacion binaria de la que resulta un nuevo grafo.
G1 G2 , hN1 N2 , A1 A2 i

-AbC

Familias de grafos
Vamos a introducir algunas clases de grafos que usualmente se utilizan para modelar y
resolver problemas reales.

Definicion (Grafo completo)


Un grafo completo de n nodos se escribe Kn , es el
grafo simplea que contiene exactamente una arista
entre cada par de nodos distintos.

Definicion (Grafo ciclo)


Un grafo ciclo Cn consta de n nodos v1 , v2 , . . . , vn y
aristas hv1 , v2 i, hv2 , v3 i, . . . , hvn1 , vn i, hvn , v1 i

Definicion (Grafo rueda)


Un grafo rueda se obtiene al agregar un nodo a un
grafo ciclo de tamano n 3, de tal forma que el
grafo agregado tiene como nodos adyacentes a cada
uno de los n nodos del grafo ciclo.
a

sin dobles aristas, ni autociclos.

-AbC

TAREA
Escribe un procedimiento en DrRacket para determinar si un grafo es un grafo completo.
;grafo-completo?: <grafo&> --> <booleano>
;recibe: a) una estructura de datos grafo&
;devuelve: un #t si el grafo es completo y #f si no es completo
(define grafo-completo?
( (G n)
...))

Como gua, puedes considerar los siguientes grafos:


Hint: Estudia las
propiedades de la
relacion de un grafo
completo.

> (grafo-completo? K5)


#t
> (grafo-completo? K5b)
#f
>
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

Grafos bipartitas
En varias aplicaciones es necesario dividir una poblacion en dos grupos, considerando que
los elementos de un grupo se relacionen explusivamente con los elementos del otro grupo,
por ejemplo al hacer competencias entre dos equipos, y los eventos competitivos se realizan
a pares (como el juego de 100 mexicanos dijeron) y se desea modelar formalmente el
juego, se debe utilizar un grafo bipartita.

Definicion (Gafo bipartita)


Un grafo G , hN, Ai es un grafo bipartita si cumple que
i {N1 , N2 } es una particion de NG
ii a AG : 1de(a) N1 2de(a) N2

-AbC

EJEMPLO
Demuestra que el grafo mostrado en la imagen es un grafo bipartita?

-AbC

EJERCICIO
Demuestra que el grafo mostrado en la imagen es un grafo bipartita. Recuerda que si las
aristas no tienen flecha, entonces significa que tienen ambos sentidos.
Nombre de archivo: g07.dat
1 8 5 9
2 3 10
3 8 2
4 8 5
5 1 4 6
6 5 9 11 12
7 11 12
8 1 3 4
9 1 6
10 2 11 12
11 6 7 10
12 6 7 10

1
2
3
4
5
6
7
8
9
10
11
12

-AbC

Paseos
En las siguientes definiciones consideraremos un grafo G , hN, Ai.

Definicion (Paseo)
Un paseo (walk) en G es una secuencia finita y no vaca W = hv0 e1 v1 e2 . . . ek vk i donde sus
componentes son alternativamente nodos y aristas, de tal manera que para 1 i k, los
extremos de una arista ei son los nodos vi1 y vi . Decimos que W es un paseo desde v0
hasta vk , o un hvo , vk i paseo.
El conjunto de todos los paseos de longitud finita sera denotado por , y es un conjunto
que utilizaremos frecuentemente.
El paseo mas corto que puede haber, iniciando de un nodo v0 , es la secuencia hv0 i que
tiene longitud 0.

Definicion (Paseo unitario)


Un paseo unitario es un paseo que consta de un unico nodo, el nodo inicial/final.
W(1) (v) , hvi.

-AbC

TAREA
i Una funcion que cree un paseo unitario a partir de un nodo inicial v0 en un grafo G.
; objetivo; construir un paseo unitario con el nodo inicial <v0> en un grafo <G>
; grafo-paseo-unitario : <nodo&> <grafo&>--> <listaDe/nodo&>
; Recibe; a) Un nodo, el nodo inicial <v0>
;
b) Un grafo <G>
; devuelve: la lista initaria (<v0>).
(define grafo-paseo-unitario
( (v0 G)
...))
> (define w0 (paseo-unitario (buscar-nodo 6 (grafo-nodos g07)) g07))
> w0
(#<nodo&>)
> (describir-nodos w0)
(6)
>
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

Debido a que la secuencia hv0 , a1 , v1 , . . . , ak , vk i induce la secuencia de aristas a1 , . . . , ak , el


paseo w se puede especificar al dar unicamente la secuencia de sus nodos hv0 , . . . , vk i, o
bien unicamente la lista de aristas ha1 , . . . , ak i. Se puede verificar recursivamente que una
lista de nodos es un paseo con el siguiente procedimiento:

#f
si W =

#t
si W = (W0 W 0 ) W 0 =
paseoN ?(W, G) ,
paseoN ?(W 0 , G) si W = (W0 W 0 ) ady?G (N0 , 1de(W 0 ))

#f
en cualquier otro caso

-AbC

De manera similar, se puede verificar recursivamente que una lista de aristas es un paseo
con el siguiente procedimiento:

#f
si E =

#t
si E = (E0 E 0 ) E 0 =
paseoA ?(E, G) ,
paseoA ?(E 0 , G) si E = (E0 E 0 ) 2de(E0 ) = 1de(E00 ); E 0 = (E00 E 00 )

#f
en cualquier otro caso

Generalmente un paseo se especifca por una secuencia de nodos, en lugar de una secuencia
de aristas. Esto es porque una secuencia de aristas de una sola arista, implica un viaje a un
segundo nodo, mientras que en la secuencia de nodos, un paseo unitario no implica tal
viaje.

-AbC

TAREA
i Una funcion que determina si una secuencia de nodos es un paseo en un grafo G.
; objetivo: Determinar si una lista de nodos es un paseo en un grafo dado
; formato: paseo-por-nodos? : <listaDe/nodo&> <grafo&>--> <booleano>
; recibe; a) Una secuencia de nodos <W>
;
b) Un grafo <G>
; devuelve: #t si la lista de nodos dada es un paseo; #f en otro caso
(define paseo-por-nodos?
( (W G)
...))

ii Una funcion que determina si una secuencia de aristas es un paseo en un grafo G.


; objetivo: Determinar si una lista de aristas es un paseo en un grafo dado
; formato: paseo-por-aristas? : <listaDe/nodo&> <grafo&>--> <booleano>
; recibe; a) Una secuencia de Aristas <E>
;
b) Un grafo <G>
; devuelve: #t si la lista de aristas dada es un paseo; #f en otro caso
(define paseo-por-nodos?
( (W G)
...))
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

El inicio de un paseo W , hv0 , . . . , vk i es el nodo v0 , y respectivamente, el fin del paseo es


el nodo vk . La longitud del paseo es simplemente el numero k, porque no se cuenta el nodo
inicial, sino que el paseo empieza a contar desde el primer nodo por visitar.

paseo0 (W, G) , v0

paseof (W, G) , vk

Inicio y Fin de un paseo


1
2
3
4
5
6
7
8
9

; objetivo: Determina el nodo que es el inicio de un paseo


; formato
; paseo-inicio : <listaDe/nodo&> <grafo&> --> <nodo&>
; ejemplos
(define paseo-inicio
( (W G)
(if (paseo-por-nodos? W G)
(car W)
NoDef)))

10
11
12
13
14
15
16
17
18
19

; objetivo: Determina el nodo que es el final de un paseo


; formato
; paseo-inicio : <listaDe/nodo&> <grafo&> --> <nodo&>
; ejemplos
(define paseo-final
( (W G)
(if (paseo-por-nodos? W G)
(last W)
NoDef)))

Si W es un paseo de longitud k, entonces W (6) , en general, (k) representa al


conjunto de todos los paseos de longitud k 0.

-AbC

Definicion (Paseo ciclo)


Un paseo W es un ciclo si paseo0 (W, G) = paseof (W, G).

Definicion (Paseo inverso)


Si W , hv0 , v1 . . . , vk1 , vk i es un paseo, el paseo inverso se denota como W 1 y es un
paseo que contiene la secuencia inversa de W , esto es que la secuencia hvk , vk1 . . . , v1 , v0 i
es un paseo en G.

-AbC

Definicion (Anexar paseos)


Si W , hv0 , v1 . . . , vk1 , vk i y W 0 , hvk+1 , vk+2 . . . , vk+l1 , vk+l i son dos paseos en el
mismo grafo G, se puede anexar el camino W 0 al camino W si se verifica que
ady?G (vk , vk+1 ), con lo que resulta el nuevo paseo hv0 , . . . , vk , vk+1 , . . . , vk+l i.

./G (W, W 0 ) = hv0 , . . . , vk i ./G hvk+1 , . . . , vk+l i


, hv0 , . . . , vk , vk+1 , . . . , vk+l i

-AbC

TAREA
i Una funcion que determina si un paseo W es un ciclo en un grafo G.
; OBJETIVO: Anexar dos paseos
; FORMATO:
; paseo-ciclo? : <listaDe/nodo&> <grafo&> --> <booleano>
; Recibe: Un paseo <W> y El grafo <G> que es la base de los paseos
; Devuelve: #t si <W> es un ciclo, y #f si <W> no es un ciclo.
(define paseo-ciclo?
( (W G)
...))

ii Una funcion que calcula el paseo inverso de un paseo W en un grafo G.


; objetivo: Calcular el paseo inverso un paseo en un grafo dado
; formato: paseo-inverso : <listaDe/nodo&> <grafo&> --> <listaDe/nodo&>
; recibe; Un paseo en forma de una secuencia de nodos <W> y Un grafo <G>
; devuelve: Un paseo en forma de una secuencia de nodos <W-inverso>
(define paseo-inverso
( (W G)
...))

iii Una funcion que anexa por la derecha un paseo W2 a un paseo W1 en un grafo G.
; OBJETIVO: Anexar dos paseos
; FORMATO:
; grafo-anexar-paseos : <listaDe/nodo&> <listaDe/nodo&> <grafo&> --> <listaDe/nodo&>
; Recibe: Un paseo <W1>, Un paseo <W2> y El grafo <G> que es la base de los paseos
; Devuelve: Un nuevo paseo que empieza en el inicio del paseo A
; y termina en el final del paseo B <w10,w11,..,w1k,w20,w21,...,w2l>
(define grafo-anexar-paseos
( (W1 W2 G)
...))
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)
-AbC

Paseos: Uso de funciones auxiliares


Un prodecimiento bastante util es determinar todos los posibles paseos de cierta longitud,
la idea es que al proporcionar una longitud fija como un numero entero no negativo k, se
obtenga una coleccion de todos los diferentes paseos de longitud k.
El procedimiento se realiza con el uso de procedimientos auxiliares, que tienen la mision de
realizar parte del trabajo. Un procedimiento fundamental ya se ha definido, y es el
procedimiento que recibe un nodo x de un grafo G y se calcula el conjunto de nodos
adyacentes a x. EL procedimiento se llama ady.

-AbC

Paseos: Paseo 1-extendido


Otro procedimieno auxiliar para determinar los k-paseos es aquel que recibe un paseo W , y
devuelve l nuevos paseos, donde l 0 es la cardinalidad del conjunto de nodos adyacentes
al nodo final del paseo dado como entrada L. Cada uno de los l paseos inicia con el paseo
W y termina en uno de los nodos de L.
paseo+1 (W, G) , w ady(paseof (W, G)) :./G (W, W(1) (w))

-AbC

Paseos: Coleccion de paseos 1-extendidos


Un ultimo procedimiento auxiliar para obtener los paseos de longitud k de un grafo G,
iniciando de un nodo V0 , es aquel que nos permite extender un nodo a una lista de paseos.
paseos+1 (W , G) , W : paseo+1 (W, G)

-AbC

Paseos: Todos los paseos de longitud k


Finalmente el procedimiento para obtener todos los paseos de longitud k que inician en el
nodod v de un grafo G es
(k)
si k = 0
v
kPaseos(k, v, G, (k)
)
,
v

(k)
kPaseos(k 1, v, G, paseos+1 (v , G)) si k > 0
(k)

Cuando v = hW(1) (v)i al inicio.

> (define g08 (leer-archivo "g08.dat"))


> (define 4-paseos (grafo-k-paseos 4 (buscar-nodo 1 (grafo-nodos g08)) g08))
> (map ( (W) (describir-nodos W)) 4-paseos)
((1 2 6 7 6) (1 2 6 7 8) (1 3 6 7 6) (1 3 6 7 8) (1 4 7 6 7) (1 4 7 6 8))
>

-AbC

TAREA
Escribe los procedimientos necesarios para calcular la familia kPaseos(v, G).
; OBJETIVO: Anexar todos los nodos adyacentes a un paseo, generando una coleccion de paseos
; FORMATO: grafo-paseo+1 : <listaDe/nodo&> <grafo&> --> <listaDe/ <listaDe/nodo&>>
; Recibe: a) Un paseo en forma de una lista de nodos (W)
;
b) Un grafo, que es la base de los paseos (G)
; Devueve: Una lista de todos los paseos, iniciando con el paseo dado y terminando
; en cada uno de los nodos adyacentes al final del paseo original
(define grafo-paseo+1
( (W G)...))

> (define g08 (leer-archivo "g08.dat"))


> (define w (generar-secuencia-nodos (1 3 6) g08))
> w
(#<nodo&> #<nodo&> #<nodo&>)
> (describir-nodos w)
(1 3 6)
> (grafo-paseo+1 w g08)
((#<nodo&> #<nodo&> #<nodo&> #<nodo&>) (#<nodo&> #<nodo&> #<nodo&> #<nodo&>))
> (map ( (W) (describir-nodos W)) (grafo-paseo+1 w g08))
((1 3 6 7) (1 3 6 8))
>
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)
-AbC

TAREA
(cont...) Escribe los procedimientos necesarios para calcular la familia kPaseos(v, G).
; Objetivo: Anexar todos los nodos adyacentes a una familia de paseos.
; Formato: grafo-paseos+1 : <listaDe/paseo> <grafo&> --> <listaDe/paseo>
; Recibe: a) Una lista paseos, en laforma de lista de listas de nodos (W*)
;
b) El grafo base (G)
; Devuelve: Una lista de paseos, generando para cada paseo, una lista de paseos
;
al anexar un nodo ms.
(define grafo-paseos+1
( (W* G)...))

> (define g08 (leer-archivo "g08.dat"))


> (define w1 (generar-secuencia-nodos (1 3) g08))
> (define w2 (generar-secuencia-nodos (1 4) g08))
> (grafo-paseos+1 (list w1 w2) g08)
((#<nodo&> #<nodo&> #<nodo&>) (#<nodo&> #<nodo&> #<nodo&>))
> (map ( (W) (describir-nodos W)) (grafo-paseos+1 (list w1 w2) g08))
((1 3 6) (1 4 7))
>
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

TAREA
(cont...) Escribe los procedimientos necesarios para calcular la familia kPaseos(v, G).
; Objetivo: Calcular los paseos de longitud k, de un grafo G
; Formato: grafo-k-paseos : <numero> <grafo&> --> <listaDe <listaDe/nodo&>>
; Recibe: a) Un numero entero no negativo <k>
;
b) El nodo inicial <n>
;
c) Un grafo <G>
; Devuelve: una lista de paseos, todos ellos de longitud <k>
(define grafo-k-paseos
( (k v G)..)); Hint: Aqui puedes usar una funcion auxiliar que haga la
; recursion de cola

> (define v6-3paseos (grafo-k-paseos 3 (buscar-nodo 6 (grafo-nodos g09)) g09))


> (map ( (W) (describir-nodos W)) v6-3paseos)
((6 4 3 5) (6 4 7 4) (6 5 2 3) (6 5 2 5) (6 5 6 4) (6 5 6 5) (6 5 6 7)
(6 7 4 3) (6 7 4 7))
> (define v5-4paseos (grafo-k-paseos 4 (buscar-nodo 5 (grafo-nodos g09)) g09))
> (map ( (W) (describir-nodos W)) v5-4paseos)
((5 2 3 5 2) (5 2 3 5 6) (5 2 5 2 3)
(5 2 5 2 5) (5 2 5 6 4) (5 2 5 6 5)
(5 2 5 6 7) (5 6 4 3 5) (5 6 4 7 4)
(5 6 5 2 3) (5 6 5 2 5) (5 6 5 6 4)
(5 6 5 6 5) (5 6 5 6 7) (5 6 7 4 3)
(5 6 7 4 7))
>
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

Definicion (camino)
Considerando un grafo G , hN, Ai, un camino es una secuencia W , hv0 , v1 , . . . , vk i de
nodos en NG de tal forma que todos los k nodos en la secuencia son diferentes.
Es posible verificar si una secuencia de nodos W es un camino, haciendo:
camino?(W, G) , paseo?(W, G) sin-repetidos?(W )

Definicion (kCamino)
Es un camino de longitud k.
As, el conjunto de todos los kCaminos con inicio en el nodo v del grafo G es:
kCaminos(k, v, G) , {W (k)
v |camino?(W, G)}

-AbC

El conjunto de los kCaminos


1
2
3
4
5
6
7
8
9
10
11

; objetivo: Determina el conjunto de los k-caminos con inicio en un nodo <v>


;
de un grafo <G>
; formato
; grafo-k-caminos : <numero> <nodo&> <grafo&> --> <listaDe/ <listaDe/nodo&>>
; recibe; a) un numero entero no negativo, <k> que es la longitud de los caminos
;
b) el nodo inicial <v>
;
c) el grafo base <G>
; devuelve: una lista de caminos < W1 W2 ... >
(define grafo-k-caminos
( (k v G)
(filter ( (W) (camino? W G)) (grafo-k-paseos k v G))))
> (define g09 (leer-archivo "g09.dat"))
> (define v1-6caminos (grafo-k-caminos 6 (buscar-nodo 1 (grafo-nodos g09)) g09))
> (map ( (C) (describir-nodos C)) v1-6caminos)
((1 2 3 5 6 4 7) (1 2 3 5 6 7 4) (1 2 5 6 7 4 3))
>

-AbC

Caminos y ciclos hamiltonianos


Definicion (Camino hamiltoniano)
Un camino hamiltoniano sobre un grafo G , hN, Ai que inicia en el nodo v, es denotado
por h(v, G); y es el conjunto de caminos en G, cuyo nodo inicial es v y tiene longitud
k = |NG | 1.
As, el conjunto de todos los caminos hamiltonianos de un grafo G es
[
h (G) , v NG :
h(v, G)
v

Definicion (Ciclo hamiltoniano)


Un ciclo hamiltoniano para un grafo G , hN, Ai que inicia en el nodo v se denota como
hc (v, G) y es un conjunto de ciclos definido como
hc (v, G) , {W +1 paseo+1 (W, G)|W h(v, G)}

-AbC

-AbC

TAREA
i Una funcion que calcula los caminos hamiltonianos de un grafo G.
; OBJETIVO: Obtener una lista con todos los caminos hamiltonianos de un grafo <G>
; FORMATO:
; grafo-caminos-hamiltonianos : <grafo&> --> <listaDe/ <listaDe/nodo&>>
; Recibe: El grafo <G> que es la base de los paseos
; Devuelve: una lista de caminos hamiltonianos <W1... > .
(define grafo-caminos-hamiltonianos
( (G)..))

ii Una funcion que calcula el paseo inverso de un paseo W en un grafo G.


; objetivo: Calcular los ciclos hamiltonianos en un grafo <G> dado
; formato: grafo-ciclos-hamiltonianos : <grafo&> --> <listaDe/ <listaDe/nodo&>>
; recibe; Un grafo <G>
; devuelve: una lista de ciclos hamiltonianos <W1... >
(define grafo-ciclos-hamiltonianos
( (G) ..))
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

EJERCICIO
Y una vez que conocemos que es un ciclo hamiltoniano, podemos calcular todos los ciclos
hamiltonianos de un grafo G.

> (define g11 (leer-archivo "g11.dat"))


> (define hCiclos (grafo-ciclos-hamiltonianos g11))
> (describir-ciclos hCiclos)
((1 2 5 4 3 1) (1 2 3 4 5 1))
> hCiclos
((#<nodo&> #<nodo&> #<nodo&> #<nodo&> #<nodo&> #<nodo&>)
(#<nodo&> #<nodo&> #<nodo&> #<nodo&> #<nodo&> #<nodo&>))
>

-AbC

Recorridos en grafos
Considerando un grafo G , hN, Ai, recorrer el grafo significa generar una secuencia de
todos los nodos hv1 , . . . , vn i en NG , agregando los nodos de acuerdo a un criterio
preestablecido.
Aqu consideraremos dos criterios para agregar nodos a la secuencia:
1. BFS (Breadth First Search) Busqueda primero en amplitud.
2. DFS (Deep First Search) Busqueda primero en profundidad.
Para esto tenemos que agregar el campo booleano explorado a la estructura de datos de
nodo&.
Nueva estructura de datos para nodo
1
2
3

; info : numero
; expl : booleano;
(struct nodo& (info expl) #:mutable)

Claro, tambien se requieren las funciones accesores y modificadores.

-AbC

BFS: Ejemplo

-AbC

BFS: Algoritmo
El recorrido primero en amplitud (BFS), requiere un grafo G , hN, Ai y un nodo inicial
v0 NG , luego se enlistaran todos los demas nodos en orden BFS, el algoritmo es:
; objetivo: Enlista los nodos del grafo en orden BFS
; formato: bfs-aux: <grafo&> <nodo&> <lista/De/nodo&> <lista/De/nodo&> --> <listaDe/nodo&>
; recibe; Un grafo <G>; el nodo inicial <v0>; una cola <Q>; y la lista de nodos en <BFS>
; devuelve: una lista de los nodos e orden BFS <v0,...vn-1>
(define bfs-aux
( (G v1 Q BFS)
--Se supone que todos los nodos han sido inicializados con visitado=#f
--Al inicio, la cola Q es inicializada con el nodo inicial
--Al inicio, el resultado BFS es inicializado con vacio
casos:
Si Q es vacio, devolver el orden BFS
Si front(Q) ha sido explorado, hacer bfs-aux con el resto de Q
de otro modo, i) marcar como explorado el front(Q)
ii) agregar los nodos adyacentes a la cola Q
iii) agregar por derecha el nodo front(Q) a la lista BFS
iv) hacer bfs-aux con los parametros Q y BFS ya modificados
))
(define bfs
( (G v1)
(bfs-aux G v1 (list v1) ())))

-AbC

TAREA
Escribe la definicion en DrRacket para el procedimiento auxiliar bfs-aux, de acuerdo al
formato
(define bfs-aux
( (G v1 Q BFS)..))

Considera estos ejemplos, que fueron obtenidos del grafo g10


> (bfs g10 (buscar-nodo 1 g10))
(#<nodo&> #<nodo&> #<nodo&> #<nodo&> #<nodo&> #<nodo&> #<nodo&>)
> (describir-nodos (bfs g10 (buscar-nodo 1 g10)))
(1 2 5 7 3 6 4)
> (describir-nodos (bfs g10 (buscar-nodo 3 g10)))
(3 5 2 6 4 7 1)
> (describir-nodos (bfs g10 (buscar-nodo 6 g10)))
(6 4 5 7 3 2 1)
>
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

DFS
Un recorrido con un criterio primero en profundidad, se logra explorando los nodos
adyacentes en orden, tomando el primero de los nodos adyacentes y a su vez tomando el
primero de sus nodos adyacentes y as hasta agotar las posibilidades, luego continuar con el
siguiente nodo adyacente y proceder con el mismo criterio.

-AbC

DFS: Algoritmo
El recorrido primero en profundidad (DFS), requiere un grafo G , hN, Ai y un nodo inicial
v0 NG , luego se enlistaran todos los demas nodos en orden DFS, el algoritmo es:
; objetivo: Enlista los nodos del grafo en orden BFS
; formato: dfs-aux: <grafo&> <nodo&> <lista/De/nodo&> <lista/De/nodo&> --> <listaDe/nodo&>
; recibe; Un grafo <G>; el nodo inicial <v0>; una cola <S>; y la lista de nodos en <DFS>
; devuelve: una lista de los nodos e orden DFS <v0,...vn-1>
(define dfs-aux
( (G v1 S DFS)
--Se supone que todos los nodos han sido inicializados con visitado=#f
--Al inicio, la pila S es inicializada con el nodo inicial
--Al inicio, el resultado DFS es inicializado con vacio
casos:
Si S es vacio, devolver el orden DFS
Si top(Q) ha sido explorado, hacer bfs-aux con el resto de S
de otro modo, i) marcar como explorado el top(S)
ii) agregar los nodos adyacentes a la pila S
iii) agregar por derecha el nodo top(S) a la lista DFS
iv) hacer dfs-aux con los parametros S y DFS ya modificados
))
(define dfs
( (G v1)
(dfs-aux G v1 (list v1) ())))

-AbC

TAREA
Escribe la definicion en DrRacket para el procedimiento auxiliar dfs-aux, de acuerdo al
formato
(define dfs-aux
( (G v1 S DFS)..))

Considera estos ejemplos, que fueron obtenidos del grafo g10


> (dfs g10 (buscar-nodo 1 g10))
(#<nodo&> #<nodo&> #<nodo&> #<nodo&> #<nodo&> #<nodo&> #<nodo&>)
> (describir-nodos (dfs g10 (buscar-nodo 1 g10)))
(1 2 3 5 6 4 7)
> (describir-nodos (dfs g10 (buscar-nodo 3 g10)))
(3 5 2 6 4 7 1)
> (describir-nodos (dfs g10 (buscar-nodo 6 g10)))
(6 4 3 5 2 7 1)
>
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

Conexion en grafos
Aqu una serie de definiciones que nos permitiran determinar caractersticas de conectividad
en los grafos.

Definicion (Nodos conectados)


Considerando un grafo G , hN, Ai, y un par de nodos va , vb NG , decimos que el nodo va
esta conectado al nodo vb , y lo denotamos como va
vb , si existe un paseo
hva , . . . , vb i con nodo inicial en va y nodo final en vb .

-AbC

Definicion (Nodos fuertemente conectados)


Considerando un grafo G , hN, Ai, y un par de nodos va , vb NG , decimos que el nodo va
esta fuertemente conectado al nodo vb , si va
vb y vb
va . La condicion de conexion
fuerte sera denotada como va ! vb .

-AbC

Definicion (Grafo debilmente conexo)


Si G , hN, Ai es un grafo, decimos que G es debilmente conexo si cumple
va VG : vb VG : va

vb .

-AbC

Definicion (Grafo fuertemente conexo)


Si G , hN, Ai es un grafo, decimos que G es fuertemente conexo si cumple
va VG : vb VG : va ! vb .

-AbC

Definicion (Componente fuertemente conexa)


En un grafo GhN, Ai, una componente fuertemente conexa es un subgrafo maximal
G0 G que es fuertemente conexo.
Un subgrafo fuertemente conexo G0 G es maximal cuando no exite subgrafo H G0 que
sea fuermente conexo.

-AbC

Equivalencia de la conectividad
Cuando el grafo es simetrico (no dirigido), es posible utilizar bfs para encontrar las
componentes fuertemente conexas.
Cuando se trata de un grafo simetrico(no dirigido), la conectividad es una relacion de
equivalencia:
i v NG : v ! v: Se verifica al proporcionar el paseo unitario hvi para cada nodo.
ii va NG : vb NG : va ! vb vb ! va . Se verifica utilizando el paseo inverso.
iii va NG : vb NG : vc NG : (va ! vb vb ! vc ) va ! vc . Se verifica
utilizando la concatenacion de paseos.

-AbC

EJEMPLO
Encuentra las componentes conexas del grafo que se dibuja a continuacion

> (grafo-componentes-nd g17)


((#<nodo&> #<nodo&>) (#<nodo&> #<nodo&> #<nodo&>) (#<nodo&> #<nodo&> #<nodo&> #<nodo&> #<nodo&>))
> (describir-sec-nodos (grafo-componentes-nd g17))
((2 4) (10 6 8) (1 3 5 7 9))
>

-AbC

Componentes conexas en un grafo no dirigido


Para encontrar las componentes conexas en un grafo no dirigido (aqu todas las
componentes son fuertemente conexas, por la condicion de equivalencia), realizamos el
procedimiento que se describe enseguida:
; objetivo: Enlistar las componentes conexas de un grafo no dirigido
; formato: gcomp-aux: <grafo&> <listaDe/nodo&> <lista/De/nodo&> --> <listaDe/ <listaDe/nodo&>>
; recibe; Un grafo <G>; la lista de nodos en el grafo <N>;
;
y la lista de las componentes conectadas <c-conexas> inicialmente vacia.
; devuelve: una lista con las componentes conexas del grafo <<va...> <vb....> ....>
(define gcomp-aux
( (G N c-conexas)
--Se supone que todos los nodos han sido inicializados con visitado=#f
--Al inicio, la lista decomponentes <c-conexas> es inicializada con vacio
casos:
Si N es vacio, devolver el las componentes conexas <c-conexas>
de otro modo, i) hacer c<-(bfs G (nodo-inicial N))
ii) hacer gcomp-aux con los parametros N<-(N\c) y c-conexas<-(agregar c c-conexas)
))
(define grafo-componentes-nd
( (G)
(if (grafo-nodirigido? G)
(gcomp-aux G (grafo-nodos G) ())
Err.NoDet)))

-AbC

TAREA
Escribe la definicion del procedimiento gcomp-aux de acuerdo al formato establecido.
(define gcomp-aux
( (G N c-conexas)..)

Puedes tomar como referencia el siguiente grafo y sus componentes

> (grafo-componentes-nd g17)


((#<nodo&> #<nodo&>) (#<nodo&> #<nodo&> #<nodo&>) (#<nodo&> #<nodo&> #<nodo&> #<nodo&> #<nodo&>))
> (grafo-componentes-nd g18)
((#<nodo&>)
(#<nodo&> #<nodo&> #<nodo&>)
(#<nodo&> #<nodo&> #<nodo&> #<nodo&> #<nodo&>)
(#<nodo&> #<nodo&> #<nodo&> #<nodo&>))
> (describir-sec-nodos (grafo-componentes-nd g18))
((4) (2 8 9) (13 10 11 12 5) (1 3 6 7))
>
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

Distancia entre nodos


Si consideramos un criterio de distancia como la longitud del camino mas corto, podemos
utilizar el algoritmo BFS para establecer la distancia, esto gracias a que el BFS actua
haciendo expansion de nodos en capas, desde la capa mas cercana a un origen, hasta la
capa mas alejada, que contiene a los nodos con mayor distancia. Cuando dos nodos no
estan conectados, la distancia es +, mientras que la distancia de un nodo a s mismo es 0.

Para esto tenemos que agregar el campo numerico distancia a la estructura de datos de
nodo&. Claro, tambien se requieren las funciones accesores y modificadores.
Nueva estructura de datos para nodo
1
2
3
4

; info : numero
; expl : booleano;
; dist ; numero, se debe inicializar con +inf.0
(struct nodo& (info expl dist) #:mutable)
-AbC

TAREA
Modifica el algoritmo bfs para escribir la definicion del procedimiento dis-bfs-aux de
acuerdo al formato establecido.
; objetivo: Calcular la distancia entre dos nodos de un grafo
; formato: dis-bfs-aux: <grafo&> <nodo&> <listaDe/nodo&> <numero> --> <numero>
; recibe; Un grafo <G>;
;
el nodo final <nf>
;
una cola <Q> inicialmente con el nodo inicial;
;
y la distancia que se ira aumentando <d> inicialmente en 0.
; devuelve: un numero no negativo que es la distancia de un nodo a otro,
;
de acuerdo con la longitud del camino mas corto
(define dis-bfs-aux
( (G nf Q d) ..))
(define dis-bfs
( (G ni nf)
(inicializar-grafo G)
(nodo-dist! ni 0)
(dis-bfs-aux G nf (list ni) 0)))
>
0
>
1
>
4
>

(dis-bfs g19 (buscar-nodo 3 g19) (buscar-nodo 3 g19))


(dis-bfs g19 (buscar-nodo 3 g19) (buscar-nodo 7 g19))
(dis-bfs g19 (buscar-nodo 3 g19) (buscar-nodo 8 g19))

(describir-nodos (filter ( (n) (= 4 (dis-bfs g19 (buscar-nodo 3 g19) n)))


(grafo-nodos g19)))
(5 8 9)
> (describir-nodos (filter ( (n) (= 3 (dis-bfs g19 (buscar-nodo 3 g19) n)))
(grafo-nodos g19)))
(1 2)
>
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

Componentes fuertemente conexas (SCCss) en digrafos


El caso de los grafos dirigidos (digrafos, grafos no simetricos) encontrar las componentes
fuertemente conexas es ligeramente mas complicado que en los grafos no dirigidos. Sin
embargo, el problema se resuelve al encontrar las clases de equivalencia de la relacion
subyacente del grafo.

-AbC

Algoritmo Kosaraju para encontrar todas las SCC de un digrafo


El algoritmo es asombrosamente sencillo, consta
solo de tres pasos:
1. Sea G1 el grafo inverso de G.
2. Correr dfs-completo sobre G1
3. Correr dfs-completo sobre G

Figure: Sambasiva Rao Kosaraju

-AbC

dfs-completo
En ocasiones el grafo no es conexo a partir del nodo inicial, por lo que se necesita correr
varias veces el dfs desde diferentes nodos para explorar todos los nodos.
; objetivo: Obtener la familia de nodos alcanzables de todo el grafo
; formato: dfs-completo: <grafo&> [OP<listaDe/nodo&>] --> <listaDe/<listaDe/nodo&>>
; recibe; Un grafo <G>;
;
opcionalmente una lista de nodos, ubicados en unorden arbitrario <N>
; devuelve: una lista de listas de nodos, cada sublista con los nodos accesibles desde
;
un nodo tomado como lider.
(define dfs-completo
( (G #:Nodos [N (grafo-nodos G)])
(define dfs-interno
( (N dfs-orden) ...))
(inicializar-grafo G)
(dfs-interno N ())))
> (dfs-completo g20)
((#<nodo&> #<nodo&> #<nodo&> #<nodo&> #<nodo&> #<nodo&> #<nodo&>)
(#<nodo&> #<nodo&> #<nodo&> #<nodo&>))
> (describir-sec-nodos (dfs-completo g20))
((1 4 5 2 3 8 9) (6 10 7 11))
>

-AbC

dfs-completo hace uso de la funcion local dfs-interno que es la que iterativamente


explora los nodos en el orden dado en el parametro opcional. Se requieren modificaciones a
DFS (tiempo de finalizacion), y la estructura de nodos. El algoritmo es el siguiente:
; objetivo: Explorar los nodos de una lista en orden dfs
; formato: dfs-interno: <listaDe/nodo&> <listaDe/<listaDe/nodo&>> --> <listaDe/<listaDe/nodo&>>
; recibe; (**) Un grafo <G> (heredado en el ambito superior)
;
Una lista de nodos <N>, colocados en un orden arbitrario
;
Una familia de listas de nodos <ds-orden>, inicialmente vacia
; devuelve: una familia de listas de nodos, cada sublista con los nodos accesibles desde
;
un nodo tomado como lider.
(define dfs-interno
( (N dfs-orden)
; -----------------------------------------------------------------------;
casos:
;
1) si <N> es vacio, devolver la lista <dfs-orden>
;
2) si <N> no es vacio: hagamos <comp> el dfs del grafo <G> iniciando en el ;primer
;
nodo de <N>, sin reiniciar atributos de
;
los nodos, y estableciendo un tiempo
;
de finalizacion inicial igual a la
;
longitud de la lista-plana <dfs-orden>
;
hacer <dfs-interno> con N\comp
;
y <agregar> comp a dfs-orden
;-----------------------------------------------------------------------))

-AbC

Algoritmo dfs-kusaraju
Algoritmo Kosaraju
1
2
3
4
5
6
7
8
9
10

; obtener las componentes fuertemente conexas de un grafo dirigido


; scc-kosaraju : <grafo&> --> <listaDe <listaDe nodo&>>
; recibe un grafo <G>
; devuelve una lista con las componentes fuertemente conexas del grafo G
(define scc-kosaraju
( (G)
(let* ((Grev (grafo-inverso G))
(LN1 (apply append (dfs-completo Grev)))
(LN2 (sort LN1 ( (x y) (> (nodo-f x) (nodo-f y))))))
(dfs-completo G #:Nodos LN2))))

> (scc-kosaraju g20)


((#<nodo&> #<nodo&> #<nodo&>) (#<nodo&>) (#<nodo&> #<nodo&> #<nodo&> #<nodo&>) (#<nodo&> #<nodo&> #<nodo&>))
> (describir-sec-nodos (scc-kosaraju g20))
((2 3 8) (5) (11 10 7 6) (1 4 9))
>

-AbC

TAREA
Escribe las definiciones adecuadas para:
1. Modificar la estructura de los nodos, para agregar el atributo f (tiempo de
finalizacion).
2. Modificar la funcion dfs para que anexe a cada nodo su tiempo de finalizacion.
3. Terminar la funcion dfs-completo para que devuelva los nodos accesibles desde cada
nodo lider. Para esto debes terminar la funcion dfs-interno.
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

Grafos ponderados
Muy frecuentemente nos enfrentaremosa modelos computacionales que incluyen grafos,
donde las aristas tienen un significado particular, y eso hace una diferencia en elegir una u
otra arista para viajar de un nodo a otro. Cuando un grafo debe incluir valores en sus
aristas, este grafo es un grafo ponderado.
En un grafo ponderado, la representacion grafica es la usual (crculos para los nodos, y una
flecha que une nodos), pero agregando sobre las aristas, el valor que le corresponde:
Representacion en listas de adyacencias:
Nombre de archivo: gp01.dat

1 2 10 3 17
2 1 15 3 5
3

1
2
3

-AbC

Uno de los principales problemas que se desean resolver con grafos ponderados, es encontrar
un camino de longitud mnima (optima), que une dos nodos cualesquiera en el grafo.

Definicion (Longitud de un camino)


Sea G , hN, Ai un grafo, y W , ha1 , . . . , ak i un paseo sobre G dado por sus aristas. La
longitud del paseo (camino) W esta dada por
i=k
X

val(ai )

i=0

Aqu, val(ai ) significa, el valor asignado a la arista ai . Notemos que es posble tambien
tener un paseo definido por los nodos que se visitan, pero en ese caso se debe construir la
secuencia de aristas para obtener de ella sus valores.

-AbC

Algoritmo para calcular caminos de longitud mnima


Aunque hay varios algoritmos para calcular los caminos de longitud mnima, aqu
estudiaremos el algoritmo de Edsger W. Dijkstra.

Figure: Edsger Wybe Dijkstra en 1940 y 2002 (resp)

-AbC

Algoritmo Dijkstra para caminos de longitud mnima


Hay unas suposiciones que deben de considerarse:
i Cada nodo v NG tiene un atributo d donde se registra la distancia desde el nodo
inicial ni hasta el nodo v; y otro atributo c para conservar el camino desde el nodo
inicial hasta cada uno de los demas nodos.
ii El grafo es conexo, esto es, que para cualquier par de nodos v y w, v
w. Esto es por
comodidad solamente.
iii Los valores asignados a las aristas deben ser no-negativos. Obligatorio.
dijkstra:

<grafo&> <nodo&> --> <grafo&>

dijkstra(<G>, <n0>)
1. Inicializacion
1.1 v NG : dv , +; cv , hi; explv , #f.
1.2 dvi , 0

2. Utilizar una version modificada de bfs que llamaremos djk-aux(Gr,Q), para calcular
las distancias, para esto se requiere el grafo en cuestion Gr y una cola Q. Lo se
devuelve el mismo grafo Gr, pero con la informacion de los nodos modificada con la
distancia al nodo base y el camino desde el nodo inicial.

-AbC

djk-aux(<Gr>, <Q>)
; objetivo: Calcular la distancia Dijkstra al nodo inicial, para cada nodo
; formato: djk-aux: <grafo&> <<listaDe/nodo&> --> <grafo&>
; recibe; Un grafo <Gr> (heredado en el ambito superior)
;
Una lista de nodos <Q>, inicializada con el nodo base <n0>
; devuelve: un grafo, con los valores de dn y cn actualizados para cada nodo
;(define djk-aux
; ( (Gr Q)
; -----------------------------------------------------------------------;
casos:
;
1) Si Q = hi, entonces devolver Gr como el resultado.
;
2) si Q = (Q0 Q0 ) :
;
i) Marcar como explorado el nodo al frente Q0
;
ii) Sea Ani , {a AG |nia = Q0 }
;
a) Para cada a = hai , af i Ani :
;
a.1) si dai + va < daf
;
daf dai + va
;
caf 1 (af , cai )
;
b) Hacer recursivamente djk-aux con los parametros:
;
Gr Gr
;
Q ./Gr (Q0 , adyGr (Q0 )
;-----------------------------------------------------------------------; ))

-AbC

Algoritmo Dijkstra para calcular caminos de longitud mnima


1
2
3
4
5
6
7
8
9
10
11
12

;; Actualiza la distancia mas corta desde un nodo a todos los dems. se debe tener un grafo
;; etiquetado, porque se consideran las etiquetas como referente para las distancias
;; FORMATO: (dijkstra #<grafo&> #<nodo-inicial&>) -> #<grafo&>
(define dijkstra
( (G ni)
;------------------------(define djk-aux
( (Gr Q)...))
;------------------------(inicializar-grafo G)
(nodo-dist! ni 0)
(djk-aux G (list ni))))

-AbC

TAREA
Hacer la definicion en DrRacket de djk-aux. E integrarla a la funcion dijkstra
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

> (describir-nodos* (grafo-nodos (dijkstra gp04 (buscar-nodo 1 gp04))))


((1 #t 0 ())
(2 #t 2 (2))
(3 #t 3 (3))
(4 #t 4 (4 3))
(5 #t 7 (5 4 3))
(6 #t 6 (6 4 3))
(7 #t 12 (7 5 4 3)))
>

-AbC

TAREA
1. Escribe una funcion que permita conocer unicamente la longitud mnima de un camino
entre el nodo base n0 y cualquier otro nodo, de acuerdo con el siguiente formato:
; objetivo: Conocer la distancia Dijkstra de un nodo inicial a cualquier otro nodo.
; formato: dist-dijkstra: <grafo&> <nodo&> <nodo&> --> <numero>
; recibe; Un grafo <Gr>
;
El nodo base <n0>
;
El nodo objetivo <nf>
; devuelve: un numero, la longitud del camino m\as corto de <n0> a <nf>
(define dist-dijkstra
( (G n0 nf)... ))

2. Escribe una funcion que permita conocer el camino mas corto entre el nodo n0 al nodo
final nf , de acuerdo al siguiente formato:
; objetivo: Conocer el camino mas corto de un nodo inicial a cualquier otro nodo.
; formato: dist-dijkstra: <grafo&> <nodo&> <nodo&> --> <listaDe/nodo&>
; recibe; Un grafo <Gr>
;
El nodo base <n0>
;
El nodo objetivo <nf>
; devuelve: el camino m\as corto de <n0> a <nf> como una secuencia de nodos
(define camino-dijkstra
( (G ni nf) ..))
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

Definicion (bosque)
Sea G , {N, A} un grafo. Si G no tiene ciclos entonces G se conoce como bosque.

-AbC


Arboles
y bosques

Definicion (Arbol)
Sea G , {N, A} un grafo sin ciclos (un bosque), cada componente conectada de G es un
arbol.

-AbC

Dos tipos de arboles


En general, podemos clasificar los arboles en dos clases:

1. Arboles
sin raz

2. Arboles
con raz.
En este curso estudiaremos unicamente los arboles con raz, y en adelante cuando se lea la
palabra arbol, se refiere a un arbol con raz.

-AbC


Definicion (Arbol
mario)
Un arbol A , hG, ri es un arbol mario, si m es la cardinalidad maxima de los nodos
adyacentes de cualquiera de los nodos del grafo del arbol G. A es mario completo si
todos los nodos excepto las hojas, tienen m nodos adyacentes. En particular, si A es
2ario, (m = 2), el arbol se llama arbol binario.

-AbC

Definicion (Subarbol)
B , hG0 , r0 i es un subarbol de un arbol A , hG, ri y se denota como B A, si G0 G y
G0 es un arbol con raz en r0 .

Es posible crear un subarbol a partir de un arbol, dando unicamente la raz.

-AbC

Partes de un arbol
Un arbol esta consituido escencialmente por un grafo con uno de sus nodos marcados como
raz, de modo que podemos definir una estructura de datos que tenga precisamente estos
elementos para construir un arbol:
Estructura de datos para un arbol
1
2
3
4

; definimos una estructura de tipo grafo& <G r>


; con un nodo raiz y un grafo antisimetrico, irreflexivo, y sin ciclos
; conectado desde la raiz.
(struct arbol& (G r) #:mutable)

5
6
7
8
9

;; Devuelve el grafo asociadoa un arbol <A&>


(define arbol-grafo
( (A)
(arbol&-G A)))

10
11
12
13
14

;; Devuelve la raiz del arbol <A&>


(define arbol-raiz
( (A)
(arbol&-r A)))

15
16
17
18
19

;; Establece un nuevo grafo para el arbol <A&>


(define arbol-G!
( (A val)
(set-arbol&-G! A val)))

20
21
22
23
24

;; Escablece una nueva raiz para el arbol <A&>


(define arbol-r!
( (A val)
(set-arbol&-r! A val)))

-AbC

Sin embargo no cualquier grafo califica para ser arbol. De acuerdo con las definiciones
anteriores (de bosque y arbol), se requiere un grafo que no tenga ciclos y que este
conectado desde la raz.
Como una nueva aplicacion del algoritmo DFS, utilizaremos una variante para determinar si
en un grafo hay ciclos, o no los hay, por lo que se requiere un procedimiento que tome
como entrada un grafo y un nodo, y determine si encuentra ciclos a partir de ese nodo,
siguiendo un recorrido primero en profundidad.

-AbC

TAREA
Modifica el algoritmo dfs para crear un procedimiento que se llame grafo-sin-ciclos,
que reciba un grafo y un nodo inicial, y determine si el grafo no tiene ciclos iniciando del
nodo dado, de aceurdo con el siguiente formato
; determina si en un grafo hay o no hay ciclos a partir de un nodo dado
; grafo-sin-ciclos? : <grafo&> <nodo&> --> <booleano>
; recibe un grafo <G>, y un nodo inicial <nr>
; devuelve #t si el grafo no tiene ciclos, o #f si el grafo si tiene ciclos
(define grafo-sin-ciclos?
( (G nr)...))
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

> (define gar04 (leer-archivo "ar04a.dat" #:arbol #f))


> (grafo-sin-ciclos? gar04 (nodo 1 gar04))
#f
>

-AbC

Para determinar si el grafo es conectado o no lo es, tambien podemos emplear uno de los
dos algoritmos, el bfs o su similar dfs, puesto que al finalizar alguno de estos recorridos, si
el conjunto de nodos que corresponde al recorrido es igual al conjunto de nodos del grafo,
entonces diremos que el grafo es conectado y se devuelve un #t, de otro modo se devuelve
un #f.
Determina si un grafo es conexo desde un nodo dado
1
2
3
4
5
6
7
8
9

;objetivo: Determinar si un grafo es conexo desde un nodo


; grafo-conexo? : <grafo&> <nodo&> --> <booleano>
; recibe un grafo <G> y un nodo inicial <n>
; devuelve #t si el grafo es conexo desde el nodo inicial
; y #f si el grafo no es conexo desde el nodo inicial
(define grafo-conexo?
( (G ni)
(conjuntos-iguales? (grafo-nodos G)
(bfs-ni G ni))))

-AbC

TAREA
Escribe una funcion que permita determinar si un grafo G y un nodo n pueden formar un
arbol, de acuerdo con el siguiente formato
; determina si un grafo y un nodo pueden ser un arbol
; arbol? <grafo&> <nodo&> --> <booleano>
; recibe un grafo <G> y un nodo-raiz <nr>
; devuelve #t si se puede crear un arbol y #f si no se puede
(define arbol?
( (G nr) ... ))

> (define gar05 (leer-archivo "ar05.dat" #:arbol #f))


> gar05
#<grafo&>
> (arbol? gar05 (nodo 1 gar05))
#t
> (grafo-describir gar05)
((1 2 3 4 5 6 7 8 9 10 11 12 13)
((1 2)
(1 3)
(1 4)
(2 5)
(4 6)
(4 7)
(4 8)
(5 9)
(5 10)
(6 11)
(8 12)
(8 13)))
>
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

TAREA
i Escribe una funcion que permita crear un arbol a partir de un grafo y un nodo-raz, si
fuera posible. De acuerdo con el siguiente formato
; Crea un arbol dando un grafo y un nodo raiz.
; Se construye el arbol si el grafo cumple las condiciones de arbol
; crear-arbol : <grafo&> <nodo&> --> <arbol&> | ERR
; recibe un grafo <G> y un nodo-raiz <nr>
; devuelve un <arbol&> si se cumplen las condiciones de arbol, o bien
;
un ERR si no se cumplen las condiciones
(define crear-arbol
( (G nr)...))
> (define n1 (crear-nodo 10))
> (define G1 (crear-grafo (list n1) ()))
> (crear-arbol G1 n1)
#<arbol&>
> (dibujar-arbol (crear-arbol G1 n1) "ar-trivial")

>

ii (optativa, pero altamente sugerida) Modifica la funcion de leer-archivo, para que


tambien se pueda leer un archivo que genere un arbol, en lugar de solamente un grafo.
>
>
>
>

(define gp04c (leer-archivo "gp04.dat" #:pond #t)) <-- para un grafo ponderado
(define g20a (leer-archivo "g20.dat" #:pond #f)) <-- para un grafo no ponderado
(define ar03a (leer-archivo "ar03.dat" #:pond #f #:arbol #t)) <-- para un arbol no ponderado
(dibujar-arbol ar03a "ar03a")

Es importante que cada definici


on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)
-AbC

Definicion (Raz)
Dado un arbol A , hG, ri, la raz del arbol es un nodo r N.G.A que es conexo a todos
los demas nodos del arbol.
En un arbol, solamente hay un unico nodo que puede ser la raz del arbol.

Definicion (Hojas)
Considerando un arbol A , hG, ri, donde G , hN, Ai es el grafo subyacente, las hojas del
arbol es un subconjunto de nodos
L , {v N.G.A|adyG.A (v) = }

-AbC

Definicion (Vertices internos)


Considerando un arbol A , hG, ri, donde G , hN, Ai es el grafo subyacente, los vertices
internos son un subconjunto de vertices
I , {v N.G.A|adyG.A (v) 6= }

-AbC

Definicion (Rama)
Considerando un arbol A , hG, ri, y un vertice hoja v L, una rama es un camino
hr, . . . , vi.

-AbC

El nivel de un vertice v en el arbol con raz en r, es la longitud del camino hr, vi. La altura
del arbol es la longitud maxima de una rama del arbol.

EJEMPLO
Cual es el nivel del nodo 8 en el siguiente arbol?

-AbC

TAREA
i Escribe un procedimiento para obtener el nivel de un nodo en un arbol, de acuerdo con
el siguiente formato.
; Determina el nivel de un nodo en un arbol
; nivel : <nodo&> <arbol&> --> <numero>
; recibe un nodo <n> y un arbol <A>
; devuelve un numero mayor o igual que 0
(define nivel
( (n A) ... ))

ii Escribe un procedimiento para obtener la altura de un arbol, de acuerdo con el siguiente


formato.
; Determina la altura de un arbol
; altura : <arbol&> --> <numero>
; recibe un arbol <A>
; decuelve un numero entero no negativo
(define altura
( (A) ... ))
> (nivel (nodo 4 ar05) ar05)
1
> (map ( (v) (nivel (nodo v ar05) ar05)) (1 2 3 4 5 6 7 8 9 10 11 12 13))
(0 1 1 1 2 2 2 2 3 3 3 3 3)
> (altura ar05)
3
>
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC

Recorridos en arboles
Al igual que en el caso de los grafos, en ocasiones es necesario recorrer todos los nodos
siguiendo un criterio que permita conocer y/o modificar la informacion de todos los nodos
en el arbol, sin que falte alguno.
Por su naturaleza de grafos, lo arboles pueden recorrerse en bfs o en dfs. Adicionalmente
es posible recorrerlos en tres maneras:
i En preorden: primero la raz, luego los subarboles
ii En postorden: primero los subarboles y luego la raz
iii En entreorden: La raz en medio (lo mas que se pueda) de los subarboles.

-AbC

-AbC

-AbC

-AbC

TAREA
i Escribe un procedimiento para recorrer un arbol en preorden, con el siguiente formato:
; Enlistar los nodos de un arbol en preorden
; FORMATO: arbol-preorden : <arbol&> --> <listaDe/<nodo&>>
; entrada un arbol <A>; salida una lista de nodos, los mismos nodos del arbol, en preorden
(define arbol-preorden
( (A) ..))
> (arbol-preorden ar06)
(#<nodo&> #<nodo&> #<nodo&> #<nodo&> #<nodo&> #<nodo&> #<nodo&> #<nodo&> #<nodo&> #<nodo&>
#<nodo&> #<nodo&> #<nodo&> #<nodo&> #<nodo&> #<nodo&> #<nodo&> #<nodo&> #<nodo&>)
> (describir-nodos (arbol-preorden ar06))
(1 2 5 9 10 3 4 6 11 7 8 12 13 14 15 18 19 16 17)

ii Escribe un procedimiento para recorrer un arbol en postorden, con el siguiente formato:


; Enlistar los nodos de un arbol en postorden
; FORMATO: arbol-postorden : <arbol&> --> <listaDe/<nodo&>>
; entrada un arbol <A>; salida una lista de nodos, los mismos nodos del arbol, en postorden
(define arbol-preorden
( (A) ..))
> (describir-nodos (arbol-postorden ar06))
(9 10 5 2 3 11 6 7 12 13 8 18 19 15 16 17 14 4 1)

iii Escribe un procedimiento para recorrer un arbol en entreorden, con el siguiente formato:
; Enlistar los nodos de un arbol en entreorden
; FORMATO: arbol-entreorden : <arbol&> --> <listaDe/<nodo&>>
; entrada un arbol <A>; salida una lista de nodos, los mismos nodos del arbol, en entreorden
(define arbol-entreorden
( (A) ..))
> (describir-nodos (arbol-entreorden ar06))
(2 9 5 10 1 3 6 11 7 4 12 8 13 18 15 19 14 16 17)
Es importante que cada definici
on tenga los comentarios adecuados (de otro modo la tarea est
a incompleta.)

-AbC


Arboles
binarios de busqueda

-AbC

ABB
Los arboles binarios de busqueda (abb) son estructuras de datos (datos compuestos de
otros tipos de datos) que estan relacionados en forma de arbol binario, pero donde se deben
cumplir algunas condiciones adicionales a los arboles binarios:
1. No hay nodos (info) repetidos. Esto es porque se supone que se almacenan los ndices
de los registros, y si hubiera un par de ndices repetidos, eso significara que se trata
del mismo registro.
2. El hijo izquierdo de un nodo es menor que el padre.
3. El hijo derecho de un nodo es mayor que el padre.

-AbC

Con un ABB es posible hacer varias operaciones para acceder a la informacion de los nodos
(en adelante, cuando se hable de nodos, claramente nos referimos a la informacion de los
nodos).
De modo que en los ABB podemos Buscar un elemento en el arbol, determinar que
registro es el Minimo, y que registro es el Maximo, y si tenemos un registro nos gustara
saber cual es el Anterior y el Siguiente, claro, no pueden faltar la manera de
Insertar y de Borrar un registro.

-AbC

-AbC

-AbC

-AbC

-AbC

-AbC

-AbC

-AbC

-AbC

-AbC

-AbC