Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Índice
2 Producto Cartesiano 5
2.1 Producto cartesiano de dos conjuntos . . . . . . . . . . . . . . . . . . . . . . . 5
2.2 Cardinalidad del producto cartesiano . . . . . . . . . . . . . . . . . . . . . . . 6
2.3 Extensión del producto cartesiano . . . . . . . . . . . . . . . . . . . . . . . . . 6
3 Relaciones binarias 7
3.1 Representación de las relaciones . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.2 Dominio, codominio y rango . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.3 Imagen de una relación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.4 Relaciones n-arias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.5 Imagen de un elemento del dominio en relaciones n-arias . . . . . . . . . . . 11
Código de Honor
La UJAT espera que sus estudiantes muestren respeto por el orden, la moral y el
honor de sus compañeros, sus maestros y su persona. Por ello, se establece este
Código de Honor, con el propósito de guiar la vida escolar de los alumnos. Estos
lineamientos no permiten todo acto que deshonre los ámbitos académicos. Las
siguientes acciones son consideradas como violatorias al Código de Honor de:
Las sanciones podrán ser desde la reprobación con calificación 0 (cero) en la tarea
por evaluar, hasta una calificación reprobatoria de 0 (cero) en la materia.
1
Resumen
Esta lección continuarás con las operaciones de conjuntos, esta vex con opera-
ciones que involucran más de un conjunto, como la unión, intersección, entre otros.
También conocerś sobre familias de conjuntos y aprenderás a hacer cubrimientos y
particiones entre otras cosas.
PARTE UNO
Relaciones y Funciones
1. Tuplas
A diferencia de los conjuntos, las tuplas juegan un papel muy importante en las ma-
temáticas discretas. Sirven para modelar estructuras de datos, registros en una base de
datos, y en general objetos en donde se requiera tener diferentes valores guardados de
manera ordenada.
Definición 1 (n-Tupla). Una n-tupla es una colección ordenada de n elementos. Si n = 0
se tiene la tupla vacı́a ⟨⟩; si n > 0 se tiene una tupla no vacı́a ⟨α1 , . . . , αn ⟩; una tupla no
vacı́a también se puede representar en términos del primer elemento y el resto como en
⟨α0 ∣α′ ⟩.
Como anotación sobre los tipos, las letras griegas α, β, γ o las letras a, b, c, . . . sue-
len utilizarse para representar tuplas, mientras que los elementos generalmente tienen
subı́ndices. Pero no hay porqué preocuparse, siempre se hará una aclaración antes de
utilizar el sı́mbolo.
Ejemplo 1
En Python una tupla es una lista. Por lo que hacer operaciones con tuplas es hacer
operaciones con listas. Ahora definiremos un predicado que verifica que un objeto sea una
tupla, y luego el nuevo concepto de la tupla vacı́a como
1 def esTupla(t) -> bool:
2 """
3 # Verifica que un objeto sea una tupla
4 # esTupla(t) --> booleano
5 # t : cualquier
6 """
7 return isinstance(t, list)
2
1 def esTvacia(t:list)->bool:
2 """
3 Determina si una tupla es la tupla vacia
4 esTvacia(t) --> booleano
5 t : list
6 """
7 return t == tvacia
>>> esTvacia(4)
False
>>> esTvacia([2,3,4])
False
>>> esTvacia([])
True
>>>
tupla() → ⟨⟩
tupla(1, 2, 3, 4) → ⟨1, 2, 3, 4⟩
Es importante hacer notar que la aridad de esta función que genera tuplas es de al
menos 0 elementos, esto significa que se puede invocar la función con 0 o más parámetros.
Los siguientes ejemplos sirven para ilustrar el concepto de longitud en las tuplas.
La tupla ⟨⟩ es de longitud 0.
La tupla ⟨g⟩ es de longitud 1, una tupla unitaria.
La tupla ⟨g, o, w⟩ es de longitud 3.
La tupla ⟨g, g, o, w, o, w, w⟩ es de longitud 7.
3
1.5. Anexar tuplas
Cero o mas tuplas pueden ser anexadas para crear una tupla con el contenido de
ambas, del siguiente modo. Supongamos, para el caso de dos tuplas, que α = ⟨α1 ⋯αn ⟩ y
β = ⟨β1 ⋯βm ⟩, al anexar β a α se tiene:
tanexa(α, β) = ⟨α1 ⋯αn ⟩ ● ⟨β1 ⋯βm ⟩
= ⟨α1 , . . . , αn , β1 , . . . , βm ⟩
Recuerda que la tupla anexada se agrega por la derecha de otra tupla. En este caso
se tiene como base a la tupla α y se le anexa β.
En general, si α1 , . . . , αn , n ≥ 0 son tuplas,
tanexa(α1 , . . . , α¯n ) = ⟨α11 . . . α1k ⟩ ● . . . ● ⟨αn1 . . . α1m ⟩
generando una tupla de longitud igual a la suma de la longitud de cada tupla que participa
como argumento.
n
tlong(tanexa(α1 , . . . , αn )) = ∑ tlong(αi )
i=1
Nota el uso de una función primitiva append (consulta el manual de Python para
averiguar para qué sirve esta función y cómo debe ser utilizada).
>>> tanexa()
[]
>>> tanexa([1,2,3])
[1, 2, 3]
>>> tanexa([1,2,3], [4,5])
[1, 2, 3, 4, 5]
>>> tanexa([1,2,3], [4,5], [6,7,8])
[1, 2, 3, 4, 5, 6, 7, 8]
>>>
4
>>> tescribe([], ’x’)
[’x’]
>>> tescribe([’x’], ’y’)
[’x’, ’y’]
>>> tescribe([’x’, ’y’], ’z’)
[’x’, ’y’, ’z’]
>>>
>>> tescribeEnPos(’e’,3,[1,2])
False
>>> tescribeEnPos(’e’,-3,[1,2,3,4,5,6])
False
>>> tescribeEnPos(’e’,3,[1,2,3,4,5,6,7])
[1, 2, 3, ’e’, 5, 6, 7]
>>>
2. Producto Cartesiano
2.1. Producto cartesiano de dos conjuntos
Definición 2 (Producto Cartesiano). Si A y B son conjuntos, el producto cartesiano
de los conjuntos A y B se escribe A × B, y es el conjunto
A × B se lee “El producto cartesiano de A con B”, o bien “A cruz B”, pero nunca se
debe leer “A por B”, esto debido a que se puede generar una confusión porque la palabra
((por)) está dedicada a la multiplicación aritmética.
Como recordarás ⟨a, b⟩ representa una tupla, donde a es el primer elemento de la tupla
y b el segundo, en ese orden. De modo que A × B es un conjunto de tuplas, donde cada
tupla se construye con su primer elemento tomado del conjunto A y el segundo es tomado
del conjunto B.
Ejemplo 3
5
2.2. Cardinalidad del producto cartesiano
El producto cartesiano se puede apreciar mediante una tabla, donde los renglones son
identificados con cada elemento del primer conjunto y las columnas se identifican con los
elementos del otro conjunto.
A×B b1 b2 ... bm
a1 ⟨a1 , b1 ⟩ ⟨a1 , b2 ⟩ ... ⟨a1 , bm ⟩
a2 ⟨a2 , b1 ⟩ ⟨a2 , b2 ⟩ ... ⟨a2 , bm ⟩
⋮ ⋮ ⋮ ... ⋮
an ⟨an , b1 ⟩ ⟨an , b2 ⟩ ... ⟨an , bm ⟩
En la tabla anterior podemos observar que si ∣A∣ = n y ∣B∣ = m, se forman m pares por
cada uno de los n elementos de A, esto significa que
∣A × B∣ = ∣A∣ ⋅ ∣B∣ = nm
Claramente no siempre A×B = B ×A, esto es porque len A×B, los primeros elementos
pertenecen al conjunto A y los segundos elementos pertenecen a B; en B × A los primeros
elementos pertenecen a B mientras que los segundos elementos pertenecen a A.
Eso si, ∣A × B∣ = ∣B × A∣, porque ahora solamente consideramos el producto natural de
las cardinalidades ∣A × B∣ = ∣A∣ ⋅ ∣B∣ = ∣B∣ ⋅ ∣A∣ = ∣B × A∣
Ejemplo 4
El producto cartesiano de un conjunto A con sigo mismo, se puede escribir A×A claro,
pero también se escribe A2 . Esta notación exponencial es frecuentemente utilizada cuando
se representa el plano cartesiano bidimensional Z2 . También se usa con el conjunto de
números reales R, donde el plano cartesiano se escribe como R2 lo que significa R × R.
6
2. Si solamente hay un único conjunto, el producto cartesiano será el conjunto de
tuplas unitarias, formadas con los elementos de ese único conjunto.
3. Si hay más de un conjunto, digamos que hay n conjuntos, el producto cartesiano es:
n
∏ Ai = A1 × A2 × ⋅ ⋅ ⋅ × An
i=1
= {⟨a1 , a2 , . . . , an ⟩∣a1 ∈ A1 ∧ a2 ∈ A2 ∧ ⋯ ∧ an ∈ An }
Ejemplo 6
Ejemplo 7
Del ejemplo anterior nos podemos dar cuenta de que ∣A1 × A2 × ⋅ ⋅ ⋅ × An ∣ se obtiene del
producto ∣A1 ∣ ⋅ ∣A2 ∣ ⋅ ... ⋅ ∣An ∣.
3. Relaciones binarias
Definición 3 (Relación binaria). Siendo A y B dos conjuntos no vacı́os, una relación
binaria R de A a B se escribe R ∶ A → B y es definido como
R ∶ A → B ⊆ {⟨a, b⟩∣a ∈ A ∧ b ∈ B}
7
Ejemplo 8
La relación “es hijo de” establece una relación binaria entre dos conjuntos de per-
sonas. Si A = {pedro, juana, maricela, antonio} y B = {gustavo, brenda, pablo}, la
relación R que representa la relación “a es hijo de b” es definida [arbitrariamente]
como
{⟨pedro, gustavo⟩, ⟨maricela, pablo⟩, ⟨juana, brenda⟩}
Establece que por ejemplo, pedro es hijo de gustavo [y no que gustavo es hijo de
pedro].
Sean A = {1, 2, 3, 4} y B = {True, False}, y R = {⟨1, True⟩, ⟨2, True⟩, ⟨4, False⟩}
una relación de A a B.
{⟨1, a⟩, ⟨1, b⟩, ⟨1, d⟩, ⟨2, b⟩, ⟨2, d⟩, ⟨3, a⟩, ⟨4, a⟩, ⟨4, b⟩}
2. En forma de matriz de pertenencia. En esta manera se crea una matriz donde cada
entrada representa un elemento de la relación, y se coloca un 1 si el par pertenece
a la relación y un 0 [o a veces nada, o un punto] si el par no pertenece a la relación.
a b c d
1 ⎛1 1 ⋅ 1⎞
2 ⎜⋅ 1 ⋅ 1⎟
R= ⎜ ⎟
3 ⎜1 ⋅ ⋅ ⋅⎟
4 ⎝1 1 ⋅ ⋅⎠
8
4. En forma de listas de relaciones. Aquı́ se crea una lista de listas. Cada lista interior
contiene en primer lugar un elemento del dominio, y en seguida todos los elementos
del rango de la relación con los que el primer elemento está definido. Esto se hace
para cada elemento del dominio.
[[1, ’a’, ’b’, ’d’], [2, ’b’, ’d’], [3, ’a’], [4, ’a’, ’b’]]
Este formato es bastante útil, porque se puede escribir un archivo de texto sin
formato [desde un editor de texto sin formato, como Geany, WordPad, etc.] y escribir
en cada lı́nea una de estas listas, por ejemplo la relación R del ejemplo que hemos
estado utilizando se escribirı́a en un archivo de texto llamado R.dat:
R.dat
1 a b d
2 b d
3 a
4 a b
Luego hacer un programa [ejercicio 9] que tome el archivo R.dat, lo convierta a una
lista de listas y luego a una lista de pares, lista para ser utilizada.
R.datÐ→ [[1, ’a’, ’b’, ’d’], [2, ’b’, ’d’], [3, ’a’], [4, ’a’, ’b’]]
Ð→ [[1, ’a’], [1, ’b’], [1, ’d’], [2, ’b’], [2, ’d’], [3, ’a’],
[4, ’a’], [4, ’b’]]
cod(R) = B
En una relación dada de forma extensional, es decir, enlistando todos y cada uno de
los pares de la relación, el dominio de la relación es el conjunto que contiene a todos los
primeros elementos de cada par; y el rango es el conjunto de los segundos elementos de
cada par.
9
Ejemplo 10
Sean A = {1, 2, 3, 4}, B = {a, b, c, d} y una relación R ∶ A → B = {⟨1, a⟩, ⟨1, b⟩,
⟨1, d⟩, ⟨2, b⟩, ⟨2, d⟩, ⟨3, a⟩, ⟨4, a⟩, ⟨4, b⟩}
dom(R) = {1, 2, 3, 4}
cod(R) = {a, b, c, d}
ran(R) = {a, b, d}
im(R, a) = {b ∈ ran(R)∣⟨a, b⟩ ∈ R}
im(R, 1) = {a, b, d}
im(R, 3) = {a}
im(R, 5) = {}.
k
= ⋃ im(R, dj )
j=1
10
Definición 9 (Relación n-aria). Sean A1 , A2 , . . . , An conjuntos no vacı́os con n ≥ 2. Una
relación n-aria sobre estos conjuntos es definida como
{⟨a1 , a2 , . . . , an ⟩ ∈ A1 × A2 × . . . × An ∣a1 ∈ A1 ∧ a2 ∈ A2 ∧ . . . an ∈ An }
⟨⟨a1 , a2 , . . . , an−1 ⟩, an ⟩
⟨a1 , a2 , . . . , an−1 , an ⟩
Considerando solamente que la tupla ⟨a1 , a2 , . . . , an−1 ⟩ está relacionada con el elemento
an ∈ An . Es necesario entonces revisar las definiciones de imagen de un elemento del
dominio.
11
Ejercicios
Criterio de evaluación
Para que seas conciente de cómo se evalúan y califican estos ejercicios,
considera el siguiente criterio que otorga cierto número de puntos por
cada ejercicio:
4: La respuesta es correcta. El programa ofrece las respuestas correc-
tas ante cualquier tipo de entrada válida. Usa algoritmos eficientes.
3: Hay pocos errores metodológicos que pueden ser pasados por al-
to. La mayor parte no tiene errores metodológicos. El programa
funciona correctamente ante casi todas las entradas válidas.
1. Crea una función en Python que se llame tupla, la cual debe recibir un númeno no
determinado de parámetros y debe generar una n-tupla con ellos:
>>> tupla()
[]
>>> tupla(1,’a’,3,False)
[1, ’a’, 3, False]
>>>
2. Escribe en una hoja de papel una definición matemática recursiva para el concepto
de tlong, que calcula la longitud de una tupla t. Recuerda que cuando t = ⟨⟩, se
tiene que tlong(t) = 0.
3. Escribe una función recursiva de cola que se llame tlongr que sirve para calcular
recursivamente la longitud de una palabra a que es pasada como argumento. Observa
que la definición incluye un parámetro opcional. Al final, la función tlongr debe
devolver un número entero no negativo, que representa la cantidad de elementos
que tiene la tupla.
>>> tlongr([])
0
>>> tlongr([1,’a’,3,False,3,’a’])
6
>>>
4. Modifica la función tescribe para que siga los lineamientos del siguiente contrato:
# escribe por la derecha un elemento a una tupla
# tescribe(t, e) --> tupla
# t : tupla o cualquier <== aquı́ está la diferencia
# e : cualquier
12
>>> tescribe(3,4)
[3, 4]
>>> tescribe([3],4)
[3, 4]
>>>
6. Escribe una función que se llame tIguales que servirá para verificar que dos tuplas
sean iguales. Guı́ate de la definición de igualdad de tuplas para escribir la función.
Este predicado debe recibir dos tuplas a y b, el resultado debe ser True si la tupla
a es igual a la tupla b, por otro lado debe devolver False si no son iguales.
7. Escribe una función en Python que se llame pCart y que tome como entrada dos
conjuntos no vacı́os A y B, como salida el programa debe devolver la lista de todos
los pares ordenados que conforman el producto cartesiano de A con B.
>>> pCart([1,2,3],[5,6,7,8])
[[1, 5], [1, 6], [1, 7], [1, 8], [2, 5], [2, 6], [2, 7], [2, 8], [3, 5], [3, 6], [3, 7], [3, 8]]
>>> pCart([],[1,2,3])
[]
>>> pCart([1,2,3],[])
[]
>>>
8. Escribe una función en Python que se llame PCart y que tome una lista no determi-
nada de conjuntos no vacı́os LC y calcule el producto cartesiano extendido de todos
los conjuntos en la lista.
>>> PCart([1,2,3])
[[1], [2], [3]]
>>> PCart([1,2,3], [5,6])
[[1, 5], [1, 6], [2, 5], [2, 6], [3, 5], [3, 6]]
>>> PCart([1,2,3], [5,6], [7,8,9])
[[1, 5, 7], [1, 5, 8], [1, 5, 9], [1, 6, 7], [1, 6, 8], [1, 6, 9], [2, 5, 7], [2, 5, 8],
[2, 5, 9], [2, 6, 7], [2, 6, 8], [2, 6, 9], [3, 5, 7], [3, 5, 8], [3, 5, 9], [3, 6, 7],
[3, 6, 8], [3, 6, 9]]
>>> PCart([1,2,3], [5,6], [7,8])
[[1, 5, 7], [1, 5, 8], [1, 6, 7], [1, 6, 8], [2, 5, 7], [2, 5, 8], [2, 6, 7], [2, 6, 8],
[3, 5, 7], [3, 5, 8], [3, 6, 7], [3, 6, 8]]
>>>
9. Escribe una función en Python que se llame txt2rel y que reciba un string filename
que indica el nombre de un archivo de texto sin formato que contenga la descripción
de una relación en forma de lista de listas. El programa debe devolver una lista de
pares si el archivo ha sido leı́do sin problema y False si hubo algo que haya impedido
la lectura correcta.
>>> txt2rel("rel.txt")
[[1, ’a’], [1, ’b’], [1, ’c’], [2, ’c’], [3, ’b’], [3, ’c’]]
>>>
10. Escribe una función que se llame im que reciba como entrada una relación en forma
de lista de pares R y un elemento a. El programa debe devolver la imagen de a bajo
la relación R.
13
>>> im([[1, ’a’], [1, ’b’], [1, ’c’], [2, ’c’], [3, ’b’], [3, ’c’]], 1)
[’a’, ’b’, ’c’]
>>> im([[1, ’a’], [1, ’b’], [1, ’c’], [2, ’c’], [3, ’b’], [3, ’c’]], 2)
[’c’]
>>> im([[1, ’a’], [1, ’b’], [1, ’c’], [2, ’c’], [3, ’b’], [3, ’c’]], 3)
[’b’, ’c’]
>>> im([[1, ’a’], [1, ’b’], [1, ’c’], [2, ’c’], [3, ’b’], [3, ’c’]], 5)
[]
>>>
11. Escribe una función que se llame Im que reciba como entrada una relación en forma
de lista de pares R y un conjunto D. El programa debe devolver la imagen extendida
de D bajo la relación R.
>>> Im([[1, ’a’], [1, ’b’], [1, ’c’], [2, ’c’], [3, ’b’], [3, ’c’]], [1,2])
[’b’, ’a’, ’c’]
>>> Im([[1, ’a’], [1, ’b’], [1, ’c’], [2, ’c’], [3, ’b’], [3, ’c’]], [2,3])
[’b’, ’c’]
>>> Im([[1, ’a’], [1, ’b’], [1, ’c’], [2, ’c’], [3, ’b’], [3, ’c’]], [5,1])
[’a’, ’b’, ’c’]
>>>
14